From 0beab4d2dfd4bb95eaca6d81c44bb6fc98550f50 Mon Sep 17 00:00:00 2001 From: abdout Date: Mon, 25 May 2026 04:17:23 +0300 Subject: [PATCH] feat(dashboard): wire 4 home-grid TODO tiles + dock notifications (E11.S01) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Six tap targets on the iOS-style home grid + dock + search were stubbed with /* TODO */ placeholders. Pilot Seat 1 (King Fahad parent persona) needs at minimum the Notifications + Events + Exams tap-throughs because the school is already publishing announcements + schedule on those surfaces. Threads three new lambdas through the dashboard chain (dashboard-nav-graph -> DashboardScreen -> HomeScreen -> buildHomeTiles): - onNavigateToNotifications -> Notifications route - onNavigateToExams -> Exams route - onNavigateToEvents -> EventsList route Wires four of the six TODOs: - Notifications tile (home-tile-spec.kt:114) -> Notifications - Notifications dock item (dashboard-screen.kt:96) -> Notifications - Exams tile (home-tile-spec.kt:122) -> Exams - Events tile (home-tile-spec.kt:147) -> EventsList The remaining two TODOs are replaced with explicit deferred comments naming the blocking work: - Universal search pill — E11.S02 (Phase 3 polish); no-op so the pill keeps its grid slot. - Assignments tile — no feature/assignments module exists; folds into E14 grading/exams alongside teacher grade entry. Atomic chain stays intact: HomeTileSpec (data) -> HomeTile (composable) -> BadgedAppIcon (atom). No atom changes; the wiring just plumbs the existing navigation lambdas into the same shape as Grades, Fees, Stream etc. Closes #12 Co-Authored-By: Claude Opus 4.7 (1M context) --- .../android/navigation/hogwarts-nav-host.kt | 7 ++++++- .../dashboard/navigation/dashboard-nav-graph.kt | 10 ++++++++-- .../dashboard/ui/components/home-tile-spec.kt | 17 ++++++++++++----- .../feature/dashboard/ui/dashboard-screen.kt | 12 ++++++++++-- .../android/feature/dashboard/ui/home-screen.kt | 8 +++++++- 5 files changed, 43 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/hogwarts/android/navigation/hogwarts-nav-host.kt b/app/src/main/java/org/hogwarts/android/navigation/hogwarts-nav-host.kt index 17c1da6..31cc943 100644 --- a/app/src/main/java/org/hogwarts/android/navigation/hogwarts-nav-host.kt +++ b/app/src/main/java/org/hogwarts/android/navigation/hogwarts-nav-host.kt @@ -28,6 +28,7 @@ import org.hogwarts.android.feature.announcements.navigation.announcementsScreen import org.hogwarts.android.feature.exams.navigation.ExamCertificate import org.hogwarts.android.feature.exams.navigation.ExamDetail import org.hogwarts.android.feature.exams.navigation.ExamResults +import org.hogwarts.android.feature.exams.navigation.Exams import org.hogwarts.android.feature.exams.navigation.examDetailScreen import org.hogwarts.android.feature.exams.navigation.examsScreen import org.hogwarts.android.feature.exams.navigation.quizScreen @@ -84,6 +85,7 @@ import org.hogwarts.android.feature.admission.navigation.admissionFormEditScreen import org.hogwarts.android.feature.admission.navigation.admissionStatusScreen import org.hogwarts.android.feature.events.navigation.EventCalendar import org.hogwarts.android.feature.events.navigation.EventDetail +import org.hogwarts.android.feature.events.navigation.EventsList import org.hogwarts.android.feature.events.navigation.eventsListScreen import org.hogwarts.android.feature.events.navigation.eventDetailScreen as eventsDetailScreen import org.hogwarts.android.feature.events.navigation.eventCalendarScreen @@ -255,7 +257,10 @@ fun HogwartsNavHost( onNavigateToAtomStudio = { navController.navigate(AtomStudioRoute) }, onNavigateToAnnouncements = { navController.navigate(Announcements) }, onNavigateToLibrary = { navController.navigate(LibraryCatalog) }, - onNavigateToProfile = { navController.navigate(Profile) } + onNavigateToProfile = { navController.navigate(Profile) }, + onNavigateToNotifications = { navController.navigate(Notifications) }, + onNavigateToExams = { navController.navigate(Exams) }, + onNavigateToEvents = { navController.navigate(EventsList) } ) atomStudioScreen( diff --git a/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/navigation/dashboard-nav-graph.kt b/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/navigation/dashboard-nav-graph.kt index 03fde1b..629475d 100644 --- a/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/navigation/dashboard-nav-graph.kt +++ b/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/navigation/dashboard-nav-graph.kt @@ -28,7 +28,10 @@ fun NavGraphBuilder.dashboardScreen( onNavigateToAtomStudio: () -> Unit, onNavigateToAnnouncements: () -> Unit, onNavigateToLibrary: () -> Unit, - onNavigateToProfile: () -> Unit + onNavigateToProfile: () -> Unit, + onNavigateToNotifications: () -> Unit, + onNavigateToExams: () -> Unit, + onNavigateToEvents: () -> Unit ) { composable { DashboardScreen( @@ -44,7 +47,10 @@ fun NavGraphBuilder.dashboardScreen( onNavigateToAtomStudio = onNavigateToAtomStudio, onNavigateToAnnouncements = onNavigateToAnnouncements, onNavigateToLibrary = onNavigateToLibrary, - onNavigateToProfile = onNavigateToProfile + onNavigateToProfile = onNavigateToProfile, + onNavigateToNotifications = onNavigateToNotifications, + onNavigateToExams = onNavigateToExams, + onNavigateToEvents = onNavigateToEvents ) } } diff --git a/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/ui/components/home-tile-spec.kt b/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/ui/components/home-tile-spec.kt index 7584d21..7334afe 100644 --- a/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/ui/components/home-tile-spec.kt +++ b/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/ui/components/home-tile-spec.kt @@ -59,7 +59,10 @@ fun buildHomeTiles( onNavigateToAtomStudio: () -> Unit, onNavigateToAnnouncements: () -> Unit, onNavigateToLibrary: () -> Unit, - onNavigateToProfile: () -> Unit + onNavigateToProfile: () -> Unit, + onNavigateToNotifications: () -> Unit, + onNavigateToExams: () -> Unit, + onNavigateToEvents: () -> Unit ): List = listOf( // --- Top-right 2x2 cluster (next to widget) --- HomeTileSpec( @@ -111,7 +114,7 @@ fun buildHomeTiles( labelRes = R.string.home_action_notifications, icon = HogwartsIcons.Notifications, background = AppleRed, - onClick = { /* TODO: notifications screen */ }, + onClick = onNavigateToNotifications, badgeCount = state.unreadNotifications, iconRes = R.drawable.ic_tile_notifications ), @@ -119,7 +122,7 @@ fun buildHomeTiles( labelRes = R.string.home_action_exams, icon = HogwartsIcons.Exams, background = AppleIndigo, - onClick = { /* TODO: exams screen */ }, + onClick = onNavigateToExams, badgeCount = state.upcomingExams, iconRes = R.drawable.ic_tile_exams ), @@ -129,7 +132,11 @@ fun buildHomeTiles( labelRes = R.string.home_action_assignments, icon = HogwartsIcons.Document, background = AppleOrange, - onClick = { /* TODO: assignments screen */ }, + // No `feature/assignments` module exists yet — surface deferred to its + // own epic (folds into E14 grading/exams alongside teacher grade entry). + // Until then the tile is visually present but a no-op so the grid stays + // intact for Figma parity. + onClick = {}, badgeCount = state.pendingAssignments, iconRes = R.drawable.ic_tile_assignments ), @@ -144,7 +151,7 @@ fun buildHomeTiles( labelRes = R.string.home_action_events, icon = HogwartsIcons.Star, background = ApplePink, - onClick = { /* TODO: events screen */ }, + onClick = onNavigateToEvents, iconRes = R.drawable.ic_tile_events ), HomeTileSpec( diff --git a/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/ui/dashboard-screen.kt b/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/ui/dashboard-screen.kt index d1b4885..dfa0f77 100644 --- a/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/ui/dashboard-screen.kt +++ b/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/ui/dashboard-screen.kt @@ -48,6 +48,9 @@ fun DashboardScreen( onNavigateToAnnouncements: () -> Unit, onNavigateToLibrary: () -> Unit, onNavigateToProfile: () -> Unit, + onNavigateToNotifications: () -> Unit, + onNavigateToExams: () -> Unit, + onNavigateToEvents: () -> Unit, viewModel: DashboardViewModel = hiltViewModel(), modifier: Modifier = Modifier ) { @@ -70,7 +73,9 @@ fun DashboardScreen( ) { HomeSearchPill( label = stringResource(R.string.home_search_hint), - onClick = { /* TODO: universal search screen */ } + // Universal search is E11.S02 (Phase 3 polish). Tap is a + // no-op for now so the pill keeps its layout slot. + onClick = {} ) } HomeDock( @@ -93,7 +98,7 @@ fun DashboardScreen( icon = HogwartsIcons.Notifications, background = AppleRed, contentDescription = stringResource(R.string.dashboard_tab_alerts), - onClick = { /* TODO: notifications screen */ }, + onClick = onNavigateToNotifications, iconRes = R.drawable.ic_tile_alerts ), HomeDockItem( @@ -133,6 +138,9 @@ fun DashboardScreen( onNavigateToAnnouncements = onNavigateToAnnouncements, onNavigateToLibrary = onNavigateToLibrary, onNavigateToProfile = onNavigateToProfile, + onNavigateToNotifications = onNavigateToNotifications, + onNavigateToExams = onNavigateToExams, + onNavigateToEvents = onNavigateToEvents, modifier = Modifier.padding(innerPadding) ) } diff --git a/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/ui/home-screen.kt b/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/ui/home-screen.kt index 2102e8f..cbd17d9 100644 --- a/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/ui/home-screen.kt +++ b/feature/dashboard/src/main/java/org/hogwarts/android/feature/dashboard/ui/home-screen.kt @@ -28,6 +28,9 @@ fun HomeScreen( onNavigateToAnnouncements: () -> Unit, onNavigateToLibrary: () -> Unit, onNavigateToProfile: () -> Unit, + onNavigateToNotifications: () -> Unit, + onNavigateToExams: () -> Unit, + onNavigateToEvents: () -> Unit, modifier: Modifier = Modifier ) { val tiles = buildHomeTiles( @@ -44,7 +47,10 @@ fun HomeScreen( onNavigateToAtomStudio = onNavigateToAtomStudio, onNavigateToAnnouncements = onNavigateToAnnouncements, onNavigateToLibrary = onNavigateToLibrary, - onNavigateToProfile = onNavigateToProfile + onNavigateToProfile = onNavigateToProfile, + onNavigateToNotifications = onNavigateToNotifications, + onNavigateToExams = onNavigateToExams, + onNavigateToEvents = onNavigateToEvents ) HomeGrid(