From 96a8caa9b241f5cc0b4e0424ee6853b8b4d6265e Mon Sep 17 00:00:00 2001
From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>
Date: Mon, 2 Dec 2024 08:34:13 -0600
Subject: [PATCH] search action group
---
.../components/filter/SearchActionGroup.tsx | 131 ++++++++++++++++++
1 file changed, 131 insertions(+)
create mode 100644 web/src/components/filter/SearchActionGroup.tsx
diff --git a/web/src/components/filter/SearchActionGroup.tsx b/web/src/components/filter/SearchActionGroup.tsx
new file mode 100644
index 000000000..1b6d45b2a
--- /dev/null
+++ b/web/src/components/filter/SearchActionGroup.tsx
@@ -0,0 +1,131 @@
+import { useCallback, useState } from "react";
+import axios from "axios";
+import { Button, buttonVariants } from "../ui/button";
+import { isDesktop } from "react-device-detect";
+import { HiTrash } from "react-icons/hi";
+import {
+ AlertDialog,
+ AlertDialogAction,
+ AlertDialogCancel,
+ AlertDialogContent,
+ AlertDialogDescription,
+ AlertDialogFooter,
+ AlertDialogHeader,
+ AlertDialogTitle,
+} from "../ui/alert-dialog";
+import useKeyboardListener from "@/hooks/use-keyboard-listener";
+import { toast } from "sonner";
+
+type SearchActionGroupProps = {
+ selectedObjects: string[];
+ setSelectedObjects: (ids: string[]) => void;
+ pullLatestData: () => void;
+};
+export default function SearchActionGroup({
+ selectedObjects,
+ setSelectedObjects,
+ pullLatestData,
+}: SearchActionGroupProps) {
+ const onClearSelected = useCallback(() => {
+ setSelectedObjects([]);
+ }, [setSelectedObjects]);
+
+ const onDelete = useCallback(async () => {
+ await axios
+ // TODO: fix for multiple event deletion
+ .delete(`events/${selectedObjects.id}`)
+ .then((resp) => {
+ if (resp.status == 200) {
+ toast.success("Tracked objects deleted successfully.", {
+ position: "top-center",
+ });
+ setSelectedObjects([]);
+ pullLatestData();
+ }
+ })
+ .catch(() => {
+ toast.error("Failed to delete tracked objects.", {
+ position: "top-center",
+ });
+ });
+ }, [selectedObjects, setSelectedObjects, pullLatestData]);
+
+ const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
+ const [bypassDialog, setBypassDialog] = useState(false);
+
+ useKeyboardListener(["Shift"], (_, modifiers) => {
+ setBypassDialog(modifiers.shift);
+ });
+
+ const handleDelete = useCallback(() => {
+ if (bypassDialog) {
+ onDelete();
+ } else {
+ setDeleteDialogOpen(true);
+ }
+ }, [bypassDialog, onDelete]);
+
+ return (
+ <>
+
+
+ Are you sure you want to proceed?
+
+
+ Hold the Shift key to bypass this dialog in the future.
+