mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-02-01 16:55:21 +03:00
keyboard navigation
This commit is contained in:
parent
486e3bebdb
commit
0ba8574d8b
@ -93,7 +93,6 @@ const Calender = ({ onChange, calenderRef, close }) => {
|
|||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// setState((prev) => ({ ...prev, selectedDay: todayTimestamp, monthDetails: monthArray }));
|
|
||||||
return monthArray;
|
return monthArray;
|
||||||
},
|
},
|
||||||
[getNumberOfDays, getDayDetails]
|
[getNumberOfDays, getDayDetails]
|
||||||
@ -108,6 +107,9 @@ const Calender = ({ onChange, calenderRef, close }) => {
|
|||||||
if (state.monthDetails) {
|
if (state.monthDetails) {
|
||||||
keyRef.current = keyRef.current.slice(0, state.monthDetails.length);
|
keyRef.current = keyRef.current.slice(0, state.monthDetails.length);
|
||||||
}
|
}
|
||||||
|
// set today date in focus for keyboard navigation
|
||||||
|
const todayDate = new Date(todayTimestamp).getDate();
|
||||||
|
keyRef.current.find((t) => t.tabIndex === todayDate)?.focus();
|
||||||
}, [state.monthDetails]);
|
}, [state.monthDetails]);
|
||||||
|
|
||||||
const isCurrentDay = (day) => day.timestamp === todayTimestamp;
|
const isCurrentDay = (day) => day.timestamp === todayTimestamp;
|
||||||
@ -216,7 +218,8 @@ const Calender = ({ onChange, calenderRef, close }) => {
|
|||||||
|
|
||||||
const handleKeydown = (e, day, index) => {
|
const handleKeydown = (e, day, index) => {
|
||||||
if ((keyRef.current && e.key === 'Enter') || e.keyCode === 32) {
|
if ((keyRef.current && e.key === 'Enter') || e.keyCode === 32) {
|
||||||
onDateClick(day);
|
e.preventDefault();
|
||||||
|
day.month === 0 && onDateClick(day);
|
||||||
}
|
}
|
||||||
if (e.key === 'ArrowLeft') {
|
if (e.key === 'ArrowLeft') {
|
||||||
index > 0 && keyRef.current[index - 1].focus();
|
index > 0 && keyRef.current[index - 1].focus();
|
||||||
@ -246,8 +249,7 @@ const Calender = ({ onChange, calenderRef, close }) => {
|
|||||||
onClick={() => onDateClick(day)}
|
onClick={() => onDateClick(day)}
|
||||||
onkeydown={(e) => handleKeydown(e, day, idx)}
|
onkeydown={(e) => handleKeydown(e, day, idx)}
|
||||||
ref={(ref) => (keyRef.current[idx] = ref)}
|
ref={(ref) => (keyRef.current[idx] = ref)}
|
||||||
autoFocus={isCurrentDay(day)}
|
tabIndex={day.month === 0 ? day.date : null}
|
||||||
tabIndex={idx}
|
|
||||||
className={`h-12 w-12 float-left flex flex-shrink justify-center items-center cursor-pointer ${
|
className={`h-12 w-12 float-left flex flex-shrink justify-center items-center cursor-pointer ${
|
||||||
day.month !== 0 ? ' opacity-50 bg-gray-700 dark:bg-gray-700 pointer-events-none' : ''
|
day.month !== 0 ? ' opacity-50 bg-gray-700 dark:bg-gray-700 pointer-events-none' : ''
|
||||||
}
|
}
|
||||||
@ -284,6 +286,7 @@ const Calender = ({ onChange, calenderRef, close }) => {
|
|||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
<div className="w-1/6 relative flex justify-around">
|
<div className="w-1/6 relative flex justify-around">
|
||||||
<div
|
<div
|
||||||
|
tabIndex={100}
|
||||||
className="flex justify-center items-center cursor-pointer absolute -mt-4 text-center rounded-full w-10 h-10 bg-gray-500 hover:bg-gray-200 dark:hover:bg-gray-800"
|
className="flex justify-center items-center cursor-pointer absolute -mt-4 text-center rounded-full w-10 h-10 bg-gray-500 hover:bg-gray-200 dark:hover:bg-gray-800"
|
||||||
onClick={() => setYear(-1)}
|
onClick={() => setYear(-1)}
|
||||||
>
|
>
|
||||||
@ -292,6 +295,7 @@ const Calender = ({ onChange, calenderRef, close }) => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="w-1/6 relative flex justify-around ">
|
<div className="w-1/6 relative flex justify-around ">
|
||||||
<div
|
<div
|
||||||
|
tabIndex={101}
|
||||||
className="flex justify-center items-center cursor-pointer absolute -mt-4 text-center rounded-full w-10 h-10 bg-gray-500 hover:bg-gray-200 dark:hover:bg-gray-800"
|
className="flex justify-center items-center cursor-pointer absolute -mt-4 text-center rounded-full w-10 h-10 bg-gray-500 hover:bg-gray-200 dark:hover:bg-gray-800"
|
||||||
onClick={() => setMonth(-1)}
|
onClick={() => setMonth(-1)}
|
||||||
>
|
>
|
||||||
@ -304,13 +308,14 @@ const Calender = ({ onChange, calenderRef, close }) => {
|
|||||||
</div>
|
</div>
|
||||||
<div className="w-1/6 relative flex justify-around ">
|
<div className="w-1/6 relative flex justify-around ">
|
||||||
<div
|
<div
|
||||||
|
tabIndex={102}
|
||||||
className="flex justify-center items-center cursor-pointer absolute -mt-4 text-center rounded-full w-10 h-10 bg-gray-500 hover:bg-gray-200 dark:hover:bg-gray-800"
|
className="flex justify-center items-center cursor-pointer absolute -mt-4 text-center rounded-full w-10 h-10 bg-gray-500 hover:bg-gray-200 dark:hover:bg-gray-800"
|
||||||
onClick={() => setMonth(1)}
|
onClick={() => setMonth(1)}
|
||||||
>
|
>
|
||||||
<ArrowRight className="h-2/6" />
|
<ArrowRight className="h-2/6" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="w-1/6 relative flex justify-around " onClick={() => setYear(1)}>
|
<div className="w-1/6 relative flex justify-around " tabIndex={104} onClick={() => setYear(1)}>
|
||||||
<div className="flex justify-center items-center cursor-pointer absolute -mt-4 text-center rounded-full w-10 h-10 bg-gray-500 hover:bg-gray-200 dark:hover:bg-gray-800">
|
<div className="flex justify-center items-center cursor-pointer absolute -mt-4 text-center rounded-full w-10 h-10 bg-gray-500 hover:bg-gray-200 dark:hover:bg-gray-800">
|
||||||
<ArrowRightDouble className="h-2/6" />
|
<ArrowRightDouble className="h-2/6" />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -71,7 +71,7 @@ export default function Select({
|
|||||||
}, [type, options, inputOptions, propSelected, setSelected]);
|
}, [type, options, inputOptions, propSelected, setSelected]);
|
||||||
|
|
||||||
const [focused, setFocused] = useState(null);
|
const [focused, setFocused] = useState(null);
|
||||||
const [showDatePicker, setShowDatePicker] = useState(false);
|
const [showCalender, setShowCalender] = useState(false);
|
||||||
const calenderRef = useRef(null);
|
const calenderRef = useRef(null);
|
||||||
const ref = useRef(null);
|
const ref = useRef(null);
|
||||||
|
|
||||||
@ -81,7 +81,7 @@ export default function Select({
|
|||||||
setShowMenu(false);
|
setShowMenu(false);
|
||||||
|
|
||||||
//show calender date range picker
|
//show calender date range picker
|
||||||
if (value === 'custom_range') return setShowDatePicker(true);
|
if (value === 'custom_range') return setShowCalender(true);
|
||||||
onChange && onChange(value);
|
onChange && onChange(value);
|
||||||
},
|
},
|
||||||
[onChange, options, propSelected, setSelected]
|
[onChange, options, propSelected, setSelected]
|
||||||
@ -110,7 +110,7 @@ export default function Select({
|
|||||||
setSelected(focused);
|
setSelected(focused);
|
||||||
if (options[focused].value === 'custom_range') {
|
if (options[focused].value === 'custom_range') {
|
||||||
setShowMenu(false);
|
setShowMenu(false);
|
||||||
return setShowDatePicker(true);
|
return setShowCalender(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
onChange && onChange(options[focused].value);
|
onChange && onChange(options[focused].value);
|
||||||
@ -184,8 +184,8 @@ export default function Select({
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const addBackDrop = (e) => {
|
const addBackDrop = (e) => {
|
||||||
if (showDatePicker && !findDOMNodes(calenderRef.current).contains(e.target)) {
|
if (showCalender && !findDOMNodes(calenderRef.current).contains(e.target)) {
|
||||||
setShowDatePicker(false);
|
setShowCalender(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
window.addEventListener('click', addBackDrop);
|
window.addEventListener('click', addBackDrop);
|
||||||
@ -193,7 +193,7 @@ export default function Select({
|
|||||||
return function cleanup() {
|
return function cleanup() {
|
||||||
window.removeEventListener('click', addBackDrop);
|
window.removeEventListener('click', addBackDrop);
|
||||||
};
|
};
|
||||||
}, [showDatePicker]);
|
}, [showCalender]);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'datepicker':
|
case 'datepicker':
|
||||||
@ -208,9 +208,9 @@ export default function Select({
|
|||||||
trailingIcon={showMenu ? ArrowDropup : ArrowDropdown}
|
trailingIcon={showMenu ? ArrowDropup : ArrowDropdown}
|
||||||
value={datePickerValue}
|
value={datePickerValue}
|
||||||
/>
|
/>
|
||||||
{showDatePicker && (
|
{showCalender && (
|
||||||
<Menu className="rounded-t-none" onDismiss={handleDismiss} relativeTo={ref}>
|
<Menu className="rounded-t-none" onDismiss={handleDismiss} relativeTo={ref}>
|
||||||
<Calender onChange={handleDateRange} calenderRef={calenderRef} close={() => setShowDatePicker(false)} />
|
<Calender onChange={handleDateRange} calenderRef={calenderRef} close={() => setShowCalender(false)} />
|
||||||
</Menu>
|
</Menu>
|
||||||
)}
|
)}
|
||||||
{showMenu ? (
|
{showMenu ? (
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user