From 7e30d04df31c44458cda169e15a8dd70efe2a92a Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Sun, 15 Mar 2026 11:47:52 +0100 Subject: [PATCH] feat: redesign top paths as breadcrumb cards with icons --- app/sites/[id]/journeys/page.tsx | 10 ++++ components/journeys/TopPathsTable.tsx | 86 ++++++++++++++++----------- 2 files changed, 61 insertions(+), 35 deletions(-) diff --git a/app/sites/[id]/journeys/page.tsx b/app/sites/[id]/journeys/page.tsx index 6d0af17..30e5660 100644 --- a/app/sites/[id]/journeys/page.tsx +++ b/app/sites/[id]/journeys/page.tsx @@ -5,10 +5,12 @@ import { useParams } from 'next/navigation' import { getDateRange, formatDate } from '@ciphera-net/ui' import { Select, DatePicker } from '@ciphera-net/ui' import SankeyDiagram from '@/components/journeys/SankeyDiagram' +import TopPathsTable from '@/components/journeys/TopPathsTable' import { JourneysSkeleton, useMinimumLoading, useSkeletonFade } from '@/components/skeletons' import { useDashboard, useJourneyTransitions, + useJourneyTopPaths, useJourneyEntryPoints, } from '@/lib/swr/dashboard' @@ -44,6 +46,9 @@ export default function JourneysPage() { const { data: transitionsData, isLoading: transitionsLoading } = useJourneyTransitions( siteId, dateRange.start, dateRange.end, depth, 1, entryPath || undefined ) + const { data: topPaths, isLoading: topPathsLoading } = useJourneyTopPaths( + siteId, dateRange.start, dateRange.end, 20, 1, entryPath || undefined + ) const { data: entryPoints } = useJourneyEntryPoints(siteId, dateRange.start, dateRange.end) const { data: dashboard } = useDashboard(siteId, dateRange.start, dateRange.end) @@ -185,6 +190,11 @@ export default function JourneysPage() { )} + {/* Top Paths */} +
+ +
+ {/* Date Picker Modal */} 0 return (
-
+

Top Paths

-

+

Most common navigation paths across sessions

{loading ? ( ) : hasData ? ( -
- {/* Header */} -
- # - Path - Sessions - Dur. -
- - {/* Rows */} -
- {paths.map((path, i) => ( -
- - {i + 1} - - - {path.page_sequence.join(' → ')} - - - {path.session_count.toLocaleString()} - - - {formatDuration(path.avg_duration)} +
+ {paths.map((path, i) => ( +
+
+ + #{i + 1} +
+ + + {path.session_count.toLocaleString()} + + {path.avg_duration > 0 && ( + + + {formatDuration(path.avg_duration)} + + )} +
- ))} -
+
+ {path.page_sequence.map((page, j) => ( +
+ {j > 0 && ( + + )} + + {smartLabel(page)} + +
+ ))} +
+
+ ))}
) : (