From 92efc4a3dcc2762b02d30a63d8e8798eb0e4d8c5 Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Tue, 22 Oct 2024 08:13:59 -0500 Subject: [PATCH] context menu for explore summary thumbnail images --- web/src/views/explore/ExploreView.tsx | 119 ++++++++++++++++++-------- web/src/views/search/SearchView.tsx | 2 + 2 files changed, 83 insertions(+), 38 deletions(-) diff --git a/web/src/views/explore/ExploreView.tsx b/web/src/views/explore/ExploreView.tsx index 3a0b9cc7b..00ed19ab2 100644 --- a/web/src/views/explore/ExploreView.tsx +++ b/web/src/views/explore/ExploreView.tsx @@ -18,15 +18,22 @@ import ActivityIndicator from "@/components/indicators/activity-indicator"; import { useEventUpdate } from "@/api/ws"; import { isEqual } from "lodash"; import TimeAgo from "@/components/dynamic/TimeAgo"; +import SearchResultActions from "@/components/menu/SearchResultActions"; +import { SearchTab } from "@/components/overlay/detail/SearchDetailDialog"; +import { FrigateConfig } from "@/types/frigateConfig"; type ExploreViewProps = { searchDetail: SearchResult | undefined; setSearchDetail: (search: SearchResult | undefined) => void; + setSimilaritySearch: (search: SearchResult) => void; + onSelectSearch: (item: SearchResult, index: number, page?: SearchTab) => void; }; export default function ExploreView({ searchDetail, setSearchDetail, + setSimilaritySearch, + onSelectSearch, }: ExploreViewProps) { // title @@ -102,6 +109,9 @@ export default function ExploreView({ isValidating={isValidating} objectType={label} setSearchDetail={setSearchDetail} + mutate={mutate} + setSimilaritySearch={setSimilaritySearch} + onSelectSearch={onSelectSearch} /> ))} @@ -113,6 +123,9 @@ type ThumbnailRowType = { searchResults?: SearchResult[]; isValidating: boolean; setSearchDetail: (search: SearchResult | undefined) => void; + mutate: () => void; + setSimilaritySearch: (search: SearchResult) => void; + onSelectSearch: (item: SearchResult, index: number, page?: SearchTab) => void; }; function ThumbnailRow({ @@ -120,6 +133,9 @@ function ThumbnailRow({ searchResults, isValidating, setSearchDetail, + mutate, + setSimilaritySearch, + onSelectSearch, }: ThumbnailRowType) { const navigate = useNavigate(); @@ -155,6 +171,9 @@ function ThumbnailRow({ ))} @@ -184,54 +203,78 @@ function ThumbnailRow({ type ExploreThumbnailImageProps = { event: SearchResult; setSearchDetail: (search: SearchResult | undefined) => void; + mutate: () => void; + setSimilaritySearch: (search: SearchResult) => void; + onSelectSearch: (item: SearchResult, index: number, page?: SearchTab) => void; }; function ExploreThumbnailImage({ event, setSearchDetail, + mutate, + setSimilaritySearch, + onSelectSearch, }: ExploreThumbnailImageProps) { const apiHost = useApiHost(); + const { data: config } = useSWR("config"); const [imgRef, imgLoaded, onImgLoad] = useImageLoaded(); - return ( - <> - + const handleFindSimilar = () => { + if (config?.semantic_search.enabled) { + setSimilaritySearch(event); + } + }; - setSearchDetail(event)} - onLoad={() => { - onImgLoad(); - }} - /> - {isDesktop && ( -
- {event.end_time ? ( - - ) : ( -
- -
+ const handleShowObjectLifecycle = () => { + onSelectSearch(event, 0, "object lifecycle"); + }; + + return ( + +
+ + - )} - + style={ + isIOS + ? { + WebkitUserSelect: "none", + WebkitTouchCallout: "none", + } + : undefined + } + loading={isSafari ? "eager" : "lazy"} + draggable={false} + src={`${apiHost}api/events/${event.id}/thumbnail.jpg`} + onClick={() => setSearchDetail(event)} + onLoad={onImgLoad} + alt={`${event.label} thumbnail`} + /> + {isDesktop && ( +
+ {event.end_time ? ( + + ) : ( +
+ +
+ )} +
+ )} +
+
); } diff --git a/web/src/views/search/SearchView.tsx b/web/src/views/search/SearchView.tsx index 4b84d0ac5..5fd6c98fa 100644 --- a/web/src/views/search/SearchView.tsx +++ b/web/src/views/search/SearchView.tsx @@ -489,6 +489,8 @@ export default function SearchView({
)}