diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsx index 840a4376e..95921bc52 100644 --- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsx +++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam/route.tsx @@ -644,6 +644,7 @@ function TasksTreeView({ const [showDurations, setShowDurations] = useState(true); const [showQueueTime, setShowQueueTime] = useState(false); const [scale, setScale] = useState(0); + const [hoveredNodeId, setHoveredNodeId] = useState(null); const parentRef = useRef(null); const treeScrollRef = useRef(null); const timelineScrollRef = useRef(null); @@ -769,19 +770,27 @@ function TasksTreeView({ getNodeProps={getNodeProps} getTreeProps={getTreeProps} parentClassName="pl-3" - renderNode={({ node, state, index }) => ( - <> -
{ - selectNode(node.id); - }} - > + renderNode={({ node, state, index }) => { + const isHovered = hoveredNodeId === node.id; + return ( + <> +
{ + selectNode(node.id); + }} + onMouseEnter={() => setHoveredNodeId(node.id)} + onMouseLeave={() => setHoveredNodeId(null)} + >
{Array.from({ length: node.level }).map((_, index) => (
- )} + ); + }} onScroll={(scrollTop) => { //sync the scroll to the tree if (timelineScrollRef.current) { @@ -870,6 +880,8 @@ function TasksTreeView({ treeScrollRef={treeScrollRef} virtualizer={virtualizer} toggleNodeSelection={toggleNodeSelection} + hoveredNodeId={hoveredNodeId} + setHoveredNodeId={setHoveredNodeId} /> @@ -935,6 +947,8 @@ type TimelineViewProps = Pick< toggleNodeSelection: UseTreeStateOutput["toggleNodeSelection"]; showDurations: boolean; treeScrollRef: React.RefObject; + hoveredNodeId: string | null; + setHoveredNodeId: (nodeId: string | null) => void; }; const tickCount = 5; @@ -954,6 +968,8 @@ function TimelineView({ showDurations, treeScrollRef, queuedDuration, + hoveredNodeId, + setHoveredNodeId, }: TimelineViewProps) { const timelineContainerRef = useRef(null); const initialTimelineDimensions = useInitialDimensions(timelineContainerRef); @@ -1098,6 +1114,7 @@ function TimelineView({ parentClassName="h-full scrollbar-hide" renderNode={({ node, state, index, virtualizer, virtualItem }) => { const isTopSpan = node.id === events[0]?.id; + const isHovered = hoveredNodeId === node.id; return ( console.log(`hover ${index}`)} onClick={(e) => { toggleNodeSelection(node.id); }} + onMouseEnter={() => setHoveredNodeId(node.id)} + onMouseLeave={() => setHoveredNodeId(null)} > {node.data.level === "TRACE" ? ( <>