Unselect table rows using esc key or click outside (#1420)

* unselect table rows by esc or clickoutside of tablebody

* exclude action-bar

* exclude context-menu

* added enums, handled touch listener
This commit is contained in:
Matthew
2023-09-05 03:56:07 -04:00
committed by GitHub
parent 732b5a5ddf
commit 7bced2b49b
5 changed files with 59 additions and 14 deletions

View File

@ -76,38 +76,57 @@ export function useListenClickOutside<T extends Element>({
};
}, [refs, callback, mode]);
}
export const useListenClickOutsideByClassName = ({
className,
classNames,
excludeClassNames,
callback,
}: {
className: string;
classNames: string[];
excludeClassNames?: string[];
callback: () => void;
}) => {
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
const handleClickOutside = (event: MouseEvent | TouchEvent) => {
if (!(event.target instanceof Node)) return;
const clickedElement = event.target as HTMLElement;
let isClickedInside = false;
let isClickedOnExcluded = false;
let currentElement: HTMLElement | null = clickedElement;
// Check if the clicked element or any of its parent elements have the specified class
while (currentElement) {
if (currentElement.classList.contains(className)) {
isClickedInside = true;
const currentClassList = currentElement.classList;
isClickedInside = classNames.some((className) =>
currentClassList.contains(className),
);
isClickedOnExcluded =
excludeClassNames?.some((className) =>
currentClassList.contains(className),
) ?? false;
if (isClickedInside || isClickedOnExcluded) {
break;
}
currentElement = currentElement.parentElement;
}
if (!isClickedInside) {
if (!isClickedInside && !isClickedOnExcluded) {
callback();
}
};
document.addEventListener('mousedown', handleClickOutside);
document.addEventListener('touchend', handleClickOutside, {
capture: true,
});
return () => {
document.removeEventListener('mousedown', handleClickOutside);
document.removeEventListener('touchend', handleClickOutside, {
capture: true,
});
};
}, [callback, className]);
}, [callback, classNames, excludeClassNames]);
};