This commit is contained in:
Bernt Christian Egeland 2021-07-17 11:12:17 +02:00
parent 8495bc7a2d
commit ddfd2b5f6c
4 changed files with 92 additions and 58 deletions

View File

@ -173,7 +173,7 @@ const Calender = ({ onChange, calenderRef }) => {
// setDateToInput(day.timestamp); // setDateToInput(day.timestamp);
if (onChange) { if (onChange) {
onChange([{ before: range.selectedRange.before, after: range.selectedRange.after }]); onChange({ before: range.selectedRange.before, after: range.selectedRange.after });
} }
}; };

View File

@ -8,58 +8,48 @@ export const DateFilterOptions = [
}, },
{ {
label: 'Today', label: 'Today',
value: [ value: {
{
//Before //Before
before: new Date().setHours(24, 0, 0, 0) / 1000, before: new Date().setHours(24, 0, 0, 0) / 1000,
//After //After
after: new Date().setHours(0, 0, 0, 0) / 1000, after: new Date().setHours(0, 0, 0, 0) / 1000,
}, },
],
}, },
{ {
label: 'Yesterday', label: 'Yesterday',
value: [ value: {
{
//Before //Before
before: new Date(new Date().setDate(new Date().getDate() - 1)).setHours(24, 0, 0, 0) / 1000, before: new Date(new Date().setDate(new Date().getDate() - 1)).setHours(24, 0, 0, 0) / 1000,
//After //After
after: new Date(new Date().setDate(new Date().getDate() - 1)).setHours(0, 0, 0, 0) / 1000, after: new Date(new Date().setDate(new Date().getDate() - 1)).setHours(0, 0, 0, 0) / 1000,
}, },
],
}, },
{ {
label: 'Last 7 Days', label: 'Last 7 Days',
value: [ value: {
{
//Before //Before
before: new Date().setHours(24, 0, 0, 0) / 1000, before: new Date().setHours(24, 0, 0, 0) / 1000,
//After //After
after: new Date(new Date().setDate(new Date().getDate() - 7)).setHours(0, 0, 0, 0) / 1000, after: new Date(new Date().setDate(new Date().getDate() - 7)).setHours(0, 0, 0, 0) / 1000,
}, },
],
}, },
{ {
label: 'This Month', label: 'This Month',
value: [ value: {
{
//Before //Before
before: new Date().setHours(24, 0, 0, 0) / 1000, before: new Date().setHours(24, 0, 0, 0) / 1000,
//After //After
after: new Date(new Date().getFullYear(), new Date().getMonth(), 1).getTime() / 1000, after: new Date(new Date().getFullYear(), new Date().getMonth(), 1).getTime() / 1000,
}, },
],
}, },
{ {
label: 'Last Month', label: 'Last Month',
value: [ value: {
{
//Before //Before
before: new Date(new Date().getFullYear(), new Date().getMonth(), 1).getTime() / 1000, before: new Date(new Date().getFullYear(), new Date().getMonth(), 1).getTime() / 1000,
//After //After
after: new Date(new Date().getFullYear(), new Date().getMonth() - 1, 1).getTime() / 1000, after: new Date(new Date().getFullYear(), new Date().getMonth() - 1, 1).getTime() / 1000,
}, },
],
}, },
{ {
label: 'Custom Range', label: 'Custom Range',
@ -176,6 +166,7 @@ export default function DatePicker({
onInput={handleChange} onInput={handleChange}
tabIndex="0" tabIndex="0"
onClick={onClick} onClick={onClick}
value={propValue}
/> />
<div <div
className={`absolute top-3 transition transform text-gray-600 dark:text-gray-400 ${ className={`absolute top-3 transition transform text-gray-600 dark:text-gray-400 ${

View File

@ -23,15 +23,35 @@ export default function Select({
const [showMenu, setShowMenu] = useState(false); const [showMenu, setShowMenu] = useState(false);
const [selected, setSelected] = useState(); const [selected, setSelected] = useState();
const [datePickerValue, setDatePickerValue] = useState();
useEffect(() => { useEffect(() => {
if (type === 'datepicker' && 'after' && 'before' in propSelected) {
for (let i = 0; i < inputOptions.length; i++) {
if (
inputOptions[i].value &&
Object.entries(inputOptions[i].value).sort().toString() === Object.entries(propSelected).sort().toString()
) {
setDatePickerValue(inputOptions[i]?.label);
break;
} else {
setDatePickerValue(
`${new Date(propSelected.after * 1000).toLocaleDateString()} -> ${new Date(
propSelected.before * 1000 - 1
).toLocaleDateString()}`
);
}
}
}
if (type === 'dropdown') {
setSelected( setSelected(
Math.max( Math.max(
options.findIndex(({ value }) => propSelected.includes(value)), options.findIndex(({ value }) => Object.values(propSelected).includes(value)),
0 0
) )
); );
}, [options, propSelected]); }
}, [inputOptions, propSelected, setSelected]);
const [focused, setFocused] = useState(null); const [focused, setFocused] = useState(null);
const [showDatePicker, setShowDatePicker] = useState(false); const [showDatePicker, setShowDatePicker] = useState(false);
@ -141,8 +161,8 @@ export default function Select({
onclick={handleClick} onclick={handleClick}
onkeydown={handleKeydown} onkeydown={handleKeydown}
trailingIcon={showMenu ? ArrowDropup : ArrowDropdown} trailingIcon={showMenu ? ArrowDropup : ArrowDropdown}
value={options[selected]} value={datePickerValue}
></DatePicker> />
{showDatePicker && ( {showDatePicker && (
<Menu className="rounded-t-none" onDismiss={handleDismiss} relativeTo={ref}> <Menu className="rounded-t-none" onDismiss={handleDismiss} relativeTo={ref}>
<Calender onChange={handleDateRange} calenderRef={calenderRef} /> <Calender onChange={handleDateRange} calenderRef={calenderRef} />
@ -178,7 +198,7 @@ export default function Select({
label={label} label={label}
focus={focused === i} focus={focused === i}
onSelect={handleSelect} onSelect={handleSelect}
value={[{ [paramName]: value }]} value={{ [paramName]: value }}
/> />
))} ))}
</Menu> </Menu>

View File

@ -261,6 +261,30 @@ function Filters({ onChange, searchParams }) {
label="Camera" label="Camera"
searchParams={searchParams} searchParams={searchParams}
/> />
<Filter
type="dropdown"
onChange={onChange}
options={zones}
paramName={['zone']}
label="Zone"
searchParams={searchParams}
/>
<Filter
type="dropdown"
onChange={onChange}
options={labels}
paramName={['label']}
label="Label"
searchParams={searchParams}
/>
<Filter
type="datepicker"
onChange={onChange}
options={DateFilterOptions}
paramName={['before', 'after']}
label="DatePicker"
searchParams={searchParams}
/>
</div> </div>
</Fragment> </Fragment>
); );
@ -270,11 +294,9 @@ function Filter({ onChange, searchParams, paramName, options, type, ...rest }) {
const handleSelect = useCallback( const handleSelect = useCallback(
(key) => { (key) => {
const newParams = new URLSearchParams(searchParams.toString()); const newParams = new URLSearchParams(searchParams.toString());
key.map((queryArray) => { Object.keys(key).map((entries) => {
if (queryArray[paramName] !== 'all') { if (key[entries] !== 'all') {
for (let query in queryArray) { newParams.set(entries, key[entries]);
newParams.set(query, queryArray[query]);
}
} else { } else {
paramName.map((p) => newParams.delete(p)); paramName.map((p) => newParams.delete(p));
} }
@ -286,13 +308,14 @@ function Filter({ onChange, searchParams, paramName, options, type, ...rest }) {
); );
const selectOptions = useMemo(() => ['all', ...options], [options]); const selectOptions = useMemo(() => ['all', ...options], [options]);
const selected = useMemo(() => paramName.map((p) => searchParams.get(p) || 'all')); let obj = {};
paramName.map((p) => Object.assign(obj, { [p]: searchParams.get(p) }), [searchParams]);
return ( return (
<Select <Select
onChange={handleSelect} onChange={handleSelect}
options={selectOptions} options={selectOptions}
selected={selected} selected={obj}
paramName={paramName} paramName={paramName}
type={type} type={type}
{...rest} {...rest}