From e0739a786cadeb7931c1943955d00bf0b05ec1b1 Mon Sep 17 00:00:00 2001 From: Felipe Cardoso Date: Thu, 1 Jan 2026 17:25:32 +0100 Subject: [PATCH] fix(frontend): move dashboard to /dashboard route MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The dashboard page was created at (authenticated)/page.tsx which would serve the same route as [locale]/page.tsx (the public landing page). Next.js doesn't allow route groups to override parent pages. Changes: - Move dashboard page to (authenticated)/dashboard/page.tsx - Update Header nav links to point to /dashboard - Update AppBreadcrumbs home link to /dashboard - Update E2E tests to navigate to /dashboard Now authenticated users should navigate to /dashboard for their homepage, while /en serves the public landing page for unauthenticated users. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- frontend/e2e/main-dashboard.spec.ts | 13 +++++++++++++ frontend/e2e/projects-list.spec.ts | 1 + .../(authenticated)/{ => dashboard}/page.tsx | 0 frontend/src/components/layout/AppBreadcrumbs.tsx | 2 +- frontend/src/components/layout/Header.tsx | 4 ++-- 5 files changed, 17 insertions(+), 3 deletions(-) rename frontend/src/app/[locale]/(authenticated)/{ => dashboard}/page.tsx (100%) diff --git a/frontend/e2e/main-dashboard.spec.ts b/frontend/e2e/main-dashboard.spec.ts index 3c5be59..c1c27b9 100644 --- a/frontend/e2e/main-dashboard.spec.ts +++ b/frontend/e2e/main-dashboard.spec.ts @@ -23,6 +23,7 @@ test.describe('Main Dashboard Page', () => { test('should display welcome header with user name', async ({ page }) => { await loginViaUI(page); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); // Check for welcome message @@ -32,6 +33,7 @@ test.describe('Main Dashboard Page', () => { test('should display quick stats cards', async ({ page }) => { await loginViaUI(page); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); // Check for stats cards @@ -43,6 +45,7 @@ test.describe('Main Dashboard Page', () => { test('should display recent projects section', async ({ page }) => { await loginViaUI(page); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); // Check recent projects heading @@ -56,6 +59,7 @@ test.describe('Main Dashboard Page', () => { test('should navigate to projects page when clicking View all', async ({ page }) => { await loginViaUI(page); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); // Click view all link @@ -68,6 +72,7 @@ test.describe('Main Dashboard Page', () => { test('should have Create Project button', async ({ page }) => { await loginViaUI(page); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); // Check for create project button @@ -77,6 +82,7 @@ test.describe('Main Dashboard Page', () => { test('should display pending approvals when they exist', async ({ page }) => { await loginViaUI(page); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); // Check for pending approvals section @@ -87,6 +93,7 @@ test.describe('Main Dashboard Page', () => { test('should have accessible heading hierarchy', async ({ page }) => { await loginViaUI(page); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); // Check for h1 (welcome message) @@ -100,6 +107,7 @@ test.describe('Main Dashboard Page', () => { test('should be keyboard navigable', async ({ page }) => { await loginViaUI(page); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); // Tab through the page elements @@ -115,6 +123,7 @@ test.describe('Main Dashboard Page', () => { await page.setViewportSize({ width: 375, height: 667 }); await loginViaUI(page); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); // Page should still be functional on mobile @@ -127,6 +136,7 @@ test.describe('Main Dashboard Page', () => { // Measure navigation timing const start = Date.now(); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); const duration = Date.now() - start; @@ -144,6 +154,7 @@ test.describe('Main Dashboard Empty State', () => { // This tests the empty state path - in demo mode we have mock data // so we check for the empty state component being available await loginViaUI(page); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); // In demo mode we always have projects, but the empty state exists @@ -160,6 +171,7 @@ test.describe('Main Dashboard Stats Interaction', () => { test('should display stats with numeric values', async ({ page }) => { await loginViaUI(page); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); // Stats should show numbers @@ -169,6 +181,7 @@ test.describe('Main Dashboard Stats Interaction', () => { test('should make stats cards clickable where appropriate', async ({ page }) => { await loginViaUI(page); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); // Active Projects stat should link to projects diff --git a/frontend/e2e/projects-list.spec.ts b/frontend/e2e/projects-list.spec.ts index a5c7bd0..45a353e 100644 --- a/frontend/e2e/projects-list.spec.ts +++ b/frontend/e2e/projects-list.spec.ts @@ -125,6 +125,7 @@ test.describe('Projects List Page', () => { test('should be accessible from dashboard', async ({ page }) => { await loginViaUI(page); + await page.goto('/en/dashboard'); await page.waitForLoadState('networkidle'); // Click "View all" link from dashboard diff --git a/frontend/src/app/[locale]/(authenticated)/page.tsx b/frontend/src/app/[locale]/(authenticated)/dashboard/page.tsx similarity index 100% rename from frontend/src/app/[locale]/(authenticated)/page.tsx rename to frontend/src/app/[locale]/(authenticated)/dashboard/page.tsx diff --git a/frontend/src/components/layout/AppBreadcrumbs.tsx b/frontend/src/components/layout/AppBreadcrumbs.tsx index 82f2e83..23c03c0 100644 --- a/frontend/src/components/layout/AppBreadcrumbs.tsx +++ b/frontend/src/components/layout/AppBreadcrumbs.tsx @@ -96,7 +96,7 @@ export function AppBreadcrumbs({ items, showHome = true, className }: AppBreadcr {showHome && (
  • {/* Logo */}
    - + Syndarix Logo - + {t('home')} {user?.is_superuser && {t('admin')}}