From f7e1ff690bcf0b2aeb913b756ce36629510dbd1b Mon Sep 17 00:00:00 2001 From: Josh Hawkins <32435876+hawkeye217@users.noreply.github.com> Date: Sat, 30 May 2026 19:24:35 -0500 Subject: [PATCH] add motion search to history actions menu and mobile drawer --- .../components/overlay/ActionsDropdown.tsx | 14 ++++++++++++- .../overlay/MobileReviewSettingsDrawer.tsx | 20 ++++++++++++++++++- web/src/pages/Events.tsx | 12 ++++++----- web/src/views/recording/RecordingView.tsx | 8 ++++++++ 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/web/src/components/overlay/ActionsDropdown.tsx b/web/src/components/overlay/ActionsDropdown.tsx index 1bc750dd78..7f501a2067 100644 --- a/web/src/components/overlay/ActionsDropdown.tsx +++ b/web/src/components/overlay/ActionsDropdown.tsx @@ -12,14 +12,21 @@ type ActionsDropdownProps = { onDebugReplayClick?: () => void; onExportClick: () => void; onShareTimestampClick: () => void; + onMotionSearchClick?: () => void; }; export default function ActionsDropdown({ onDebugReplayClick, onExportClick, onShareTimestampClick, + onMotionSearchClick, }: Readonly) { - const { t } = useTranslation(["components/dialog", "views/replay", "common"]); + const { t } = useTranslation([ + "components/dialog", + "views/replay", + "views/events", + "common", + ]); return ( @@ -42,6 +49,11 @@ export default function ActionsDropdown({ {t("recording.shareTimestamp.label", { ns: "components/dialog" })} + {onMotionSearchClick && ( + + {t("motionSearch.menuItem", { ns: "views/events" })} + + )} {onDebugReplayClick && ( {t("title", { ns: "views/replay" })} diff --git a/web/src/components/overlay/MobileReviewSettingsDrawer.tsx b/web/src/components/overlay/MobileReviewSettingsDrawer.tsx index c2daf6d051..0d10e78810 100644 --- a/web/src/components/overlay/MobileReviewSettingsDrawer.tsx +++ b/web/src/components/overlay/MobileReviewSettingsDrawer.tsx @@ -3,7 +3,7 @@ import { baseUrl } from "@/api/baseUrl"; import { Drawer, DrawerContent, DrawerTrigger } from "../ui/drawer"; import { Button } from "../ui/button"; import { FaArrowDown, FaCalendarAlt, FaCog, FaFilter } from "react-icons/fa"; -import { LuBug, LuShare2 } from "react-icons/lu"; +import { LuBug, LuSearch, LuShare2 } from "react-icons/lu"; import { TimeRange } from "@/types/timeline"; import { ExportContent, ExportPreviewDialog, ExportTab } from "./ExportDialog"; import { @@ -46,6 +46,7 @@ const DRAWER_FEATURES = [ "filter", "debug-replay", "share-timestamp", + "motion-search", ] as const; export type DrawerFeatures = (typeof DRAWER_FEATURES)[number]; const DEFAULT_DRAWER_FEATURES: DrawerFeatures[] = [ @@ -54,6 +55,7 @@ const DEFAULT_DRAWER_FEATURES: DrawerFeatures[] = [ "filter", "debug-replay", "share-timestamp", + "motion-search", ]; type MobileReviewSettingsDrawerProps = { @@ -75,6 +77,7 @@ type MobileReviewSettingsDrawerProps = { setDebugReplayMode?: (mode: ExportMode) => void; setDebugReplayRange?: (range: TimeRange | undefined) => void; onShareTimestamp?: (timestamp: number) => void; + onMotionSearch?: () => void; onUpdateFilter: (filter: ReviewFilter) => void; setRange: (range: TimeRange | undefined) => void; setMode: (mode: ExportMode) => void; @@ -99,6 +102,7 @@ export default function MobileReviewSettingsDrawer({ setDebugReplayMode = () => {}, setDebugReplayRange = () => {}, onShareTimestamp = () => {}, + onMotionSearch, onUpdateFilter, setRange, setMode, @@ -108,6 +112,7 @@ export default function MobileReviewSettingsDrawer({ "views/recording", "components/dialog", "views/replay", + "views/events", "common", ]); const isAdmin = useIsAdmin(); @@ -364,6 +369,19 @@ export default function MobileReviewSettingsDrawer({ })} )} + {features.includes("motion-search") && onMotionSearch && ( + + )} {features.includes("calendar") && (