From 778fd7b84c43c5cf46f036c41e380d304ea49911 Mon Sep 17 00:00:00 2001
From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com>
Date: Mon, 14 Oct 2024 18:48:37 -0500
Subject: [PATCH] Move buttons and menu to thumbnail footer
---
web/src/components/card/SearchThumbnail.tsx | 85 +------------
.../components/card/SearchThumbnailFooter.tsx | 116 ++++++++++++++++++
web/src/views/search/SearchView.tsx | 10 +-
3 files changed, 123 insertions(+), 88 deletions(-)
create mode 100644 web/src/components/card/SearchThumbnailFooter.tsx
diff --git a/web/src/components/card/SearchThumbnail.tsx b/web/src/components/card/SearchThumbnail.tsx
index f696bc447..8b65ad22f 100644
--- a/web/src/components/card/SearchThumbnail.tsx
+++ b/web/src/components/card/SearchThumbnail.tsx
@@ -1,35 +1,17 @@
import { useCallback, useMemo, useState } from "react";
import { useApiHost } from "@/api";
import { getIconForLabel } from "@/utils/iconUtil";
-import TimeAgo from "../dynamic/TimeAgo";
import useSWR from "swr";
import { FrigateConfig } from "@/types/frigateConfig";
import { isIOS, isSafari } from "react-device-detect";
import Chip from "@/components/indicators/Chip";
-import { useFormattedTimestamp } from "@/hooks/use-date-utils";
import useImageLoaded from "@/hooks/use-image-loaded";
import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip";
import ImageLoadingIndicator from "../indicators/ImageLoadingIndicator";
-import ActivityIndicator from "../indicators/activity-indicator";
import { capitalizeFirstLetter } from "@/utils/stringUtil";
import { SearchResult } from "@/types/search";
import { cn } from "@/lib/utils";
import { TooltipPortal } from "@radix-ui/react-tooltip";
-import {
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuTrigger,
-} from "@/components/ui/dropdown-menu";
-import {
- LuActivity,
- LuCamera,
- LuDownload,
- LuMoreVertical,
- LuSearch,
- LuTrash2,
-} from "react-icons/lu";
-import FrigatePlusIcon from "@/components/icons/FrigatePlusIcon";
import { FrigatePlusDialog } from "../overlay/dialog/FrigatePlusDialog";
import { Event } from "@/types/event";
@@ -74,14 +56,6 @@ export default function SearchThumbnail({
return `${searchResult.label}-verified`;
}, [config, searchResult]);
- // date
-
- const formattedDate = useFormattedTimestamp(
- searchResult.start_time,
- config?.ui.time_format == "24hour" ? "%b %-d, %H:%M" : "%b %-d, %I:%M %p",
- config?.ui.timezone,
- );
-
return (
-
-
-
- {searchResult.end_time ? (
-
- ) : (
-
- )}
- {formattedDate}
-
-
- {config?.plus?.enabled && searchResult.end_time && (
-
-
- setShowFrigatePlus(true)}
- />
-
- Submit to Frigate+
-
- )}
-
-
-
-
-
- Find similar
-
-
-
-
-
-
-
-
-
- Download video
-
-
-
- Download snapshot
-
-
-
- View object lifecycle
-
-
-
- Delete
-
-
-
-
-
-
+
);
diff --git a/web/src/components/card/SearchThumbnailFooter.tsx b/web/src/components/card/SearchThumbnailFooter.tsx
new file mode 100644
index 000000000..c09d2424a
--- /dev/null
+++ b/web/src/components/card/SearchThumbnailFooter.tsx
@@ -0,0 +1,116 @@
+import { useState } from "react";
+import TimeAgo from "../dynamic/TimeAgo";
+import useSWR from "swr";
+import { FrigateConfig } from "@/types/frigateConfig";
+import { useFormattedTimestamp } from "@/hooks/use-date-utils";
+import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip";
+import ActivityIndicator from "../indicators/activity-indicator";
+import { SearchResult } from "@/types/search";
+import {
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+} from "@/components/ui/dropdown-menu";
+import {
+ LuActivity,
+ LuCamera,
+ LuDownload,
+ LuMoreVertical,
+ LuSearch,
+ LuTrash2,
+} from "react-icons/lu";
+import FrigatePlusIcon from "@/components/icons/FrigatePlusIcon";
+import { FrigatePlusDialog } from "../overlay/dialog/FrigatePlusDialog";
+import { Event } from "@/types/event";
+
+type SearchThumbnailProps = {
+ searchResult: SearchResult;
+};
+
+export default function SearchThumbnailFooter({
+ searchResult,
+}: SearchThumbnailProps) {
+ const { data: config } = useSWR("config");
+
+ // interactions
+
+ const [showFrigatePlus, setShowFrigatePlus] = useState(false);
+
+ // date
+
+ const formattedDate = useFormattedTimestamp(
+ searchResult.start_time,
+ config?.ui.time_format == "24hour" ? "%b %-d, %H:%M" : "%b %-d, %I:%M %p",
+ config?.ui.timezone,
+ );
+
+ return (
+ <>
+ setShowFrigatePlus(false)}
+ onEventUploaded={() => {}}
+ />
+
+
+ {searchResult.end_time ? (
+
+ ) : (
+
+ )}
+ {formattedDate}
+
+
+ {config?.plus?.enabled &&
+ searchResult.has_snapshot &&
+ searchResult.end_time && (
+
+
+ setShowFrigatePlus(true)}
+ />
+
+ Submit to Frigate+
+
+ )}
+
+
+
+
+
+ Find similar
+
+
+
+
+
+
+
+
+
+ Download video
+
+
+
+ Download snapshot
+
+
+
+ View object lifecycle
+
+
+
+ Delete
+
+
+
+
+ >
+ );
+}
diff --git a/web/src/views/search/SearchView.tsx b/web/src/views/search/SearchView.tsx
index 0e08a887d..fe4cdf71a 100644
--- a/web/src/views/search/SearchView.tsx
+++ b/web/src/views/search/SearchView.tsx
@@ -33,6 +33,7 @@ import {
PopoverTrigger,
} from "@/components/ui/popover";
import { usePersistence } from "@/hooks/use-persistence";
+import SearchThumbnailFooter from "@/components/card/SearchThumbnailFooter";
type SearchViewProps = {
search: string;
@@ -76,8 +77,6 @@ export default function SearchView({
"sm:grid-cols-4": effectiveColumnCount === 4,
"sm:grid-cols-5": effectiveColumnCount === 5,
"sm:grid-cols-6": effectiveColumnCount === 6,
- "sm:grid-cols-7": effectiveColumnCount === 7,
- "sm:grid-cols-8": effectiveColumnCount >= 8,
});
// suggestions values
@@ -392,7 +391,7 @@ export default function SearchView({
>
);
})}
@@ -466,7 +468,7 @@ export default function SearchView({
setColumnCount(value)}
- max={8}
+ max={6}
min={2}
step={1}
className="flex-grow"