diff --git a/web/src/components/settings/wizard/Step1NameCamera.tsx b/web/src/components/settings/wizard/Step1NameCamera.tsx index 6eeb2f91c..8895f82f6 100644 --- a/web/src/components/settings/wizard/Step1NameCamera.tsx +++ b/web/src/components/settings/wizard/Step1NameCamera.tsx @@ -385,7 +385,7 @@ export default function Step1NameCamera({ @@ -495,7 +495,7 @@ export default function Step1NameCamera({
diff --git a/web/src/components/timeline/DetailStream.tsx b/web/src/components/timeline/DetailStream.tsx index 706c6c5b4..4b152aadb 100644 --- a/web/src/components/timeline/DetailStream.tsx +++ b/web/src/components/timeline/DetailStream.tsx @@ -458,6 +458,7 @@ function ReviewGroup({ void; @@ -499,6 +501,7 @@ type EventListProps = { }; function EventList({ event, + review, effectiveTime, annotationOffset, onSeek, @@ -617,6 +620,7 @@ function EventList({
void; effectiveTime?: number; @@ -780,13 +786,27 @@ function ObjectTimeline({ endTime?: number; }) { const { t } = useTranslation("views/events"); - const { data: timeline, isValidating } = useSWR([ + const { data: fullTimeline, isValidating } = useSWR< + TrackingDetailsSequence[] + >([ "timeline", { source_id: eventId, }, ]); + const timeline = useMemo(() => { + if (!fullTimeline) { + return fullTimeline; + } + + return fullTimeline.filter( + (t) => + t.timestamp >= review.start_time && + (review.end_time == undefined || t.timestamp <= review.end_time), + ); + }, [fullTimeline, review]); + if (isValidating && (!timeline || timeline.length === 0)) { return ; } diff --git a/web/src/pages/Settings.tsx b/web/src/pages/Settings.tsx index 844329fc7..19fd63f5c 100644 --- a/web/src/pages/Settings.tsx +++ b/web/src/pages/Settings.tsx @@ -157,9 +157,11 @@ function MobileMenuItem({ const { t } = useTranslation(["views/settings"]); return ( - +
); } @@ -273,6 +275,9 @@ export default function Settings() { } else { setPageToggle(page as SettingsType); } + if (isMobile) { + setContentMobileOpen(true); + } } // don't clear url params if we're creating a new object mask return !(searchParams.has("object_mask") || searchParams.has("event_id")); @@ -282,6 +287,9 @@ export default function Settings() { const cameraNames = cameras.map((c) => c.name); if (cameraNames.includes(camera)) { setSelectedCamera(camera); + if (isMobile) { + setContentMobileOpen(true); + } } // don't clear url params if we're creating a new object mask or trigger return !(searchParams.has("object_mask") || searchParams.has("event_id")); diff --git a/web/src/views/recording/RecordingView.tsx b/web/src/views/recording/RecordingView.tsx index 00e46411e..149237b63 100644 --- a/web/src/views/recording/RecordingView.tsx +++ b/web/src/views/recording/RecordingView.tsx @@ -970,7 +970,6 @@ function Timeline({ "relative overflow-hidden", isDesktop ? cn( - "no-scrollbar overflow-y-auto", timelineType == "timeline" ? "w-[100px] flex-shrink-0" : timelineType == "detail" diff --git a/web/src/views/settings/CameraSettingsView.tsx b/web/src/views/settings/CameraSettingsView.tsx index f42ec84fe..dae7c3365 100644 --- a/web/src/views/settings/CameraSettingsView.tsx +++ b/web/src/views/settings/CameraSettingsView.tsx @@ -717,11 +717,11 @@ export default function CameraSettingsView({