From 47031a80cd94b2ed025258237e1f2689c65c0bb7 Mon Sep 17 00:00:00 2001 From: kimjaehyeon0101 <47347352-kimjaehyeon0101@users.noreply.replit.com> Date: Tue, 14 Oct 2025 07:14:21 +0000 Subject: [PATCH] Add interactive progress bar with slide preview to reports Implement a slider component for report navigation, enabling direct seeking and hover-based slide previews, replacing previous/next buttons. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 9a264234-c5d7-4dcc-adf3-a954b149b30d Replit-Commit-Checkpoint-Type: intermediate_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/3df548ff-50ae-432f-9be4-25d34eccc983/9a264234-c5d7-4dcc-adf3-a954b149b30d/VGhYqEL --- client/src/pages/Report.tsx | 119 ++++++++++++++++++++++++++++++------ 1 file changed, 99 insertions(+), 20 deletions(-) diff --git a/client/src/pages/Report.tsx b/client/src/pages/Report.tsx index 8fbb574..0514e0c 100644 --- a/client/src/pages/Report.tsx +++ b/client/src/pages/Report.tsx @@ -5,6 +5,7 @@ import { Card, CardContent } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; +import { Slider } from "@/components/ui/slider"; import { useQuery } from "@tanstack/react-query"; import { useAuth } from "@/hooks/useAuth"; import { useState, useEffect, useRef, useMemo } from "react"; @@ -35,6 +36,8 @@ function MohamedSalahSlides() { const [currentSlide, setCurrentSlide] = useState(1); const [numPages, setNumPages] = useState(0); const [isLoading, setIsLoading] = useState(true); + const [hoverSlide, setHoverSlide] = useState(null); + const [hoverPosition, setHoverPosition] = useState({ x: 0, y: 0 }); const onDocumentLoadSuccess = ({ numPages }: { numPages: number }) => { setNumPages(numPages); @@ -47,6 +50,28 @@ function MohamedSalahSlides() { cMapPacked: true, }), []); + const handleSliderChange = (value: number[]) => { + if (numPages > 0) { + setCurrentSlide(value[0]); + } + }; + + const handleSliderHover = (e: React.MouseEvent) => { + if (numPages === 0) return; + + const rect = e.currentTarget.getBoundingClientRect(); + const x = e.clientX - rect.left; + const percentage = x / rect.width; + const slideNumber = Math.max(1, Math.min(numPages, Math.round(percentage * numPages))); + + setHoverSlide(slideNumber); + setHoverPosition({ x: e.clientX, y: rect.top - 60 }); + }; + + const handleSliderLeave = () => { + setHoverSlide(null); + }; + return (
@@ -77,26 +102,80 @@ function MohamedSalahSlides() {
-
- - - Slide {currentSlide} of {numPages} - - +
+ {/* Progress Bar */} +
+
+ + {/* Slide markers */} +
+
+ {numPages > 0 && Array.from({ length: numPages }).map((_, i) => ( +
+ ))} +
+
+
+ + {/* Hover tooltip */} + {hoverSlide !== null && ( +
+ Slide {hoverSlide} +
+ )} +
+ + {/* Control buttons */} +
+ + + Slide {currentSlide} of {numPages} + + +
);