mirror of
https://github.com/blakeblackshear/frigate.git
synced 2024-11-26 19:06:11 +01:00
162 lines
4.0 KiB
React
162 lines
4.0 KiB
React
|
import { h } from 'preact';
|
||
|
import { useCallback, useEffect, useState } from 'preact/hooks';
|
||
|
|
||
|
export const DateFilterOptions = [
|
||
|
{
|
||
|
label: 'All',
|
||
|
value: ['all'],
|
||
|
},
|
||
|
{
|
||
|
label: 'Today',
|
||
|
value: {
|
||
|
//Before
|
||
|
before: new Date().setHours(24, 0, 0, 0) / 1000,
|
||
|
//After
|
||
|
after: new Date().setHours(0, 0, 0, 0) / 1000,
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
label: 'Yesterday',
|
||
|
value: {
|
||
|
//Before
|
||
|
before: new Date(new Date().setDate(new Date().getDate() - 1)).setHours(24, 0, 0, 0) / 1000,
|
||
|
//After
|
||
|
after: new Date(new Date().setDate(new Date().getDate() - 1)).setHours(0, 0, 0, 0) / 1000,
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
label: 'Last 7 Days',
|
||
|
value: {
|
||
|
//Before
|
||
|
before: new Date().setHours(24, 0, 0, 0) / 1000,
|
||
|
//After
|
||
|
after: new Date(new Date().setDate(new Date().getDate() - 7)).setHours(0, 0, 0, 0) / 1000,
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
label: 'This Month',
|
||
|
value: {
|
||
|
//Before
|
||
|
before: new Date().setHours(24, 0, 0, 0) / 1000,
|
||
|
//After
|
||
|
after: new Date(new Date().getFullYear(), new Date().getMonth(), 1).getTime() / 1000,
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
label: 'Last Month',
|
||
|
value: {
|
||
|
//Before
|
||
|
before: new Date(new Date().getFullYear(), new Date().getMonth(), 1).getTime() / 1000,
|
||
|
//After
|
||
|
after: new Date(new Date().getFullYear(), new Date().getMonth() - 1, 1).getTime() / 1000,
|
||
|
},
|
||
|
},
|
||
|
{
|
||
|
label: 'Custom Range',
|
||
|
value: 'custom_range',
|
||
|
},
|
||
|
];
|
||
|
|
||
|
export default function DatePicker({
|
||
|
helpText,
|
||
|
keyboardType = 'text',
|
||
|
inputRef,
|
||
|
label,
|
||
|
leadingIcon: LeadingIcon,
|
||
|
onBlur,
|
||
|
onChangeText,
|
||
|
onFocus,
|
||
|
trailingIcon: TrailingIcon,
|
||
|
value: propValue = '',
|
||
|
...props
|
||
|
}) {
|
||
|
const [isFocused, setFocused] = useState(false);
|
||
|
const [value, setValue] = useState(propValue);
|
||
|
|
||
|
useEffect(() => {
|
||
|
if (propValue !== value) {
|
||
|
setValue(propValue);
|
||
|
}
|
||
|
}, [propValue, setValue, value]);
|
||
|
|
||
|
const handleFocus = useCallback(
|
||
|
(event) => {
|
||
|
setFocused(true);
|
||
|
onFocus && onFocus(event);
|
||
|
},
|
||
|
[onFocus]
|
||
|
);
|
||
|
|
||
|
const handleBlur = useCallback(
|
||
|
(event) => {
|
||
|
setFocused(false);
|
||
|
onBlur && onBlur(event);
|
||
|
},
|
||
|
[onBlur]
|
||
|
);
|
||
|
|
||
|
const handleChange = useCallback(
|
||
|
(event) => {
|
||
|
const { value } = event.target;
|
||
|
setValue(value);
|
||
|
onChangeText && onChangeText(value);
|
||
|
},
|
||
|
[onChangeText, setValue]
|
||
|
);
|
||
|
|
||
|
const onClick = (e) => {
|
||
|
props.onclick(e);
|
||
|
};
|
||
|
const labelMoved = isFocused || value !== '';
|
||
|
|
||
|
return (
|
||
|
<div className="w-full">
|
||
|
{props.children}
|
||
|
<div
|
||
|
className={`bg-gray-100 dark:bg-gray-700 rounded rounded-b-none border-gray-400 border-b p-1 pl-4 pr-3 ${
|
||
|
isFocused ? 'border-blue-500 dark:border-blue-500' : ''
|
||
|
}`}
|
||
|
ref={inputRef}
|
||
|
>
|
||
|
<label
|
||
|
className="flex space-x-2 items-center"
|
||
|
data-testid={`label-${label.toLowerCase().replace(/[^\w]+/g, '_')}`}
|
||
|
>
|
||
|
{LeadingIcon ? (
|
||
|
<div className="w-10 h-full">
|
||
|
<LeadingIcon />
|
||
|
</div>
|
||
|
) : null}
|
||
|
<div className="relative w-full">
|
||
|
<input
|
||
|
className="h-6 mt-6 w-full bg-transparent focus:outline-none focus:ring-0"
|
||
|
type={keyboardType}
|
||
|
readOnly
|
||
|
onBlur={handleBlur}
|
||
|
onFocus={handleFocus}
|
||
|
onInput={handleChange}
|
||
|
tabIndex="0"
|
||
|
onClick={onClick}
|
||
|
value={propValue}
|
||
|
{...props}
|
||
|
/>
|
||
|
<div
|
||
|
className={`absolute top-3 transition transform text-gray-600 dark:text-gray-400 ${
|
||
|
labelMoved ? 'text-xs -translate-y-2' : ''
|
||
|
} ${isFocused ? 'text-blue-500 dark:text-blue-500' : ''}`}
|
||
|
>
|
||
|
<p>{label}</p>
|
||
|
</div>
|
||
|
</div>
|
||
|
{TrailingIcon ? (
|
||
|
<div className="w-10 h-10">
|
||
|
<TrailingIcon />
|
||
|
</div>
|
||
|
) : null}
|
||
|
</label>
|
||
|
</div>
|
||
|
{helpText ? <div className="text-xs pl-3 pt-1">{helpText}</div> : null}
|
||
|
</div>
|
||
|
);
|
||
|
}
|