From 05c6cc457a1666fa63d504d7cec5f8848a9c2208 Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Wed, 17 Jul 2024 14:31:12 +0530 Subject: [PATCH 01/12] Add `NavigationBar` component --- .../designsystem/component/NavigationBar.kt | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBar.kt diff --git a/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBar.kt b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBar.kt new file mode 100644 index 000000000..7555eeaa0 --- /dev/null +++ b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBar.kt @@ -0,0 +1,110 @@ +package org.hisp.dhis.mobile.ui.designsystem.component + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.offset +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.NavigationBarItemColors +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.unit.dp +import org.hisp.dhis.mobile.ui.designsystem.theme.Outline +import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor +import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor + +@Composable +fun NavigationBar( + modifier: Modifier = Modifier, + items: List, + selectedItemIndex: Int? = null, + onItemClick: (Int) -> Unit, +) { + Column( + modifier = modifier.testTag("NAVIGATION_BAR_CONTAINER"), + ) { + HorizontalDivider( + modifier = Modifier.testTag("NAVIGATION_BAR_BORDER"), + thickness = 0.6.dp, + color = Outline.Light, + ) + androidx.compose.material3.NavigationBar( + modifier = Modifier.testTag("NAVIGATION_BAR"), + containerColor = SurfaceColor.ContainerLowest, + ) { + items.forEachIndexed { index, item -> + val selected = selectedItemIndex == index + NavigationBarItem( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_${item.label}"), + colors = navigationBarItemColors(), + icon = { + NavigationBarItemIcon(item = item, selected = selected) + }, + label = { + Text( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_LABEL_${item.label}"), + text = item.label, + ) + }, + enabled = item.enabled, + selected = selected, + onClick = { + onItemClick(index) + }, + ) + } + } + } +} + +@Composable +fun NavigationBarItemIcon(item: NavigationBarItem, selected: Boolean) { + Box { + if (selected) { + item.selectedIcon() + } else { + item.defaultIcon() + } + if (item.showBadge) { + val badgeXOffset = if (!item.badgeText.isNullOrEmpty()) { + 4.dp * item.badgeText.length + } else { + 0.dp + } + val badgeYOffset = if (!item.badgeText.isNullOrEmpty()) (-4).dp else 0.dp + + ErrorBadge( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_BADGE_${item.label}") + .align(Alignment.TopEnd) + .offset( + x = badgeXOffset, + y = badgeYOffset, + ), + text = item.badgeText, + ) + } + } +} + +@Composable +fun navigationBarItemColors() = NavigationBarItemColors( + selectedIconColor = SurfaceColor.Primary, + selectedTextColor = TextColor.OnSurfaceVariant, + selectedIndicatorColor = SurfaceColor.Container, + unselectedIconColor = TextColor.OnSurfaceVariant, + unselectedTextColor = TextColor.OnSurfaceVariant, + disabledIconColor = TextColor.OnDisabledSurface, + disabledTextColor = TextColor.OnDisabledSurface, +) + +data class NavigationBarItem( + val defaultIcon: @Composable () -> Unit, + val selectedIcon: @Composable () -> Unit, + val label: String, + val enabled: Boolean = true, + val showBadge: Boolean = false, + val badgeText: String? = null, +) From ab191a39d53121cb3840d2fb98a278ca7d20789f Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Wed, 17 Jul 2024 14:31:26 +0530 Subject: [PATCH 02/12] Add `NavigationBarTest` --- .../component/NavigationBarTest.kt | 203 ++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 designsystem/src/desktopTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBarTest.kt diff --git a/designsystem/src/desktopTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBarTest.kt b/designsystem/src/desktopTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBarTest.kt new file mode 100644 index 000000000..ba9c9e17f --- /dev/null +++ b/designsystem/src/desktopTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBarTest.kt @@ -0,0 +1,203 @@ +package org.hisp.dhis.mobile.ui.designsystem.component + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.BarChart +import androidx.compose.material.icons.filled.Description +import androidx.compose.material.icons.outlined.BarChart +import androidx.compose.material.icons.outlined.Description +import androidx.compose.material3.Icon +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.performClick +import org.junit.Rule +import org.junit.Test + +class NavigationBarTest { + + @get:Rule + val rule = createComposeRule() + + @Test + fun shouldDisplayNavigationBarCorrectly() { + rule.setContent { + val items = listOf( + NavigationBarItem( + defaultIcon = { + Icon( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Description"), + imageVector = Icons.Outlined.Description, + contentDescription = null, + ) + }, + selectedIcon = { + Icon( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Description"), + imageVector = Icons.Filled.Description, + contentDescription = null, + ) + }, + label = "Description", + ), + NavigationBarItem( + defaultIcon = { + Icon( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Charts"), + imageVector = Icons.Outlined.BarChart, + contentDescription = null, + ) + }, + selectedIcon = { + Icon( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Charts"), + imageVector = Icons.Filled.BarChart, + contentDescription = null, + ) + }, + label = "Charts", + showBadge = true, + ), + ) + NavigationBar( + items = items, + selectedItemIndex = null, + ) { + } + } + + rule.onNodeWithTag("NAVIGATION_BAR_CONTAINER").assertExists() + rule.onNodeWithTag("NAVIGATION_BAR_BORDER").assertExists() + rule.onNodeWithTag("NAVIGATION_BAR").assertExists() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_Description", true).assertExists() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_LABEL_Description", true).assertExists() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Description", true).assertExists() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Description", true).assertDoesNotExist() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_BADGE_Description", true).assertDoesNotExist() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_Charts", true).assertExists() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_LABEL_Charts", true).assertExists() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Charts", true).assertExists() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Charts", true).assertDoesNotExist() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_BADGE_Charts", true).assertExists() + } + + @Test + fun shouldUpdateNavigationBarIconCorrectlyOnSelection() { + rule.setContent { + val items = listOf( + NavigationBarItem( + defaultIcon = { + Icon( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Description"), + imageVector = Icons.Outlined.Description, + contentDescription = null, + ) + }, + selectedIcon = { + Icon( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Description"), + imageVector = Icons.Filled.Description, + contentDescription = null, + ) + }, + label = "Description", + ), + NavigationBarItem( + defaultIcon = { + Icon( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Charts"), + imageVector = Icons.Outlined.BarChart, + contentDescription = null, + ) + }, + selectedIcon = { + Icon( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Charts"), + imageVector = Icons.Filled.BarChart, + contentDescription = null, + ) + }, + label = "Charts", + showBadge = true, + ), + ) + var selectedItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = items, + selectedItemIndex = selectedItemIndex, + ) { + selectedItemIndex = it + } + } + + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Description", true).assertExists() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Description", true).assertDoesNotExist() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_Description", true).performClick() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Description", true).assertDoesNotExist() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Description", true).assertExists() + } + + @Test + fun shouldResetSelectedIconToDefaultWhenNewItemIsClicked() { + rule.setContent { + val items = listOf( + NavigationBarItem( + defaultIcon = { + Icon( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Description"), + imageVector = Icons.Outlined.Description, + contentDescription = null, + ) + }, + selectedIcon = { + Icon( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Description"), + imageVector = Icons.Filled.Description, + contentDescription = null, + ) + }, + label = "Description", + ), + NavigationBarItem( + defaultIcon = { + Icon( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Charts"), + imageVector = Icons.Outlined.BarChart, + contentDescription = null, + ) + }, + selectedIcon = { + Icon( + modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Charts"), + imageVector = Icons.Filled.BarChart, + contentDescription = null, + ) + }, + label = "Charts", + showBadge = true, + ), + ) + var selectedItemIndex by remember { mutableStateOf(0) } + NavigationBar( + items = items, + selectedItemIndex = selectedItemIndex, + ) { + selectedItemIndex = it + } + } + + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Description", true).assertDoesNotExist() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Description", true).assertExists() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Charts", true).assertExists() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Charts", true).assertDoesNotExist() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_Charts", true).performClick() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Description", true).assertExists() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Description", true).assertDoesNotExist() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Charts", true).assertDoesNotExist() + rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Charts", true).assertExists() + } +} From 80406d0119908bff627d8db0ab1e727818cfb85a Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Wed, 17 Jul 2024 14:31:46 +0530 Subject: [PATCH 03/12] Add `NavigationBarScreen` --- .../screens/others/NavigationBarScreen.kt | 207 ++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 common/src/commonMain/kotlin/org/hisp/dhis/common/screens/others/NavigationBarScreen.kt diff --git a/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/others/NavigationBarScreen.kt b/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/others/NavigationBarScreen.kt new file mode 100644 index 000000000..04b2112fe --- /dev/null +++ b/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/others/NavigationBarScreen.kt @@ -0,0 +1,207 @@ +package org.hisp.dhis.common.screens.others + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.Assignment +import androidx.compose.material.icons.automirrored.filled.List +import androidx.compose.material.icons.automirrored.filled.StickyNote2 +import androidx.compose.material.icons.automirrored.outlined.Assignment +import androidx.compose.material.icons.automirrored.outlined.List +import androidx.compose.material.icons.automirrored.outlined.StickyNote2 +import androidx.compose.material.icons.filled.BarChart +import androidx.compose.material.icons.filled.Description +import androidx.compose.material.icons.filled.Hub +import androidx.compose.material.icons.filled.Map +import androidx.compose.material.icons.outlined.BarChart +import androidx.compose.material.icons.outlined.Description +import androidx.compose.material.icons.outlined.Hub +import androidx.compose.material.icons.outlined.Map +import androidx.compose.material3.Icon +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import org.hisp.dhis.mobile.ui.designsystem.component.ColumnComponentContainer +import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBar +import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarItem +import org.hisp.dhis.mobile.ui.designsystem.component.SubTitle +import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing +import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor + +@Composable +fun NavigationBarScreen() { + val homeItems = listOf( + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.Description, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.Description, contentDescription = null) + }, + label = "Description", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.BarChart, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.BarChart, contentDescription = null) + }, + label = "Charts", + showBadge = true, + ), + ) + + val programItems = listOf( + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.AutoMirrored.Outlined.List, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.AutoMirrored.Filled.List, contentDescription = null) + }, + label = "List", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.Map, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.Map, contentDescription = null) + }, + label = "Maps", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.BarChart, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.BarChart, contentDescription = null) + }, + label = "Charts", + showBadge = true, + badgeText = "32", + ), + ) + + val enrollmentItems = listOf( + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.AutoMirrored.Outlined.Assignment, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.AutoMirrored.Filled.Assignment, contentDescription = null) + }, + label = "Details", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.BarChart, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.BarChart, contentDescription = null) + }, + label = "Charts", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.Hub, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.Hub, contentDescription = null) + }, + label = "Relationships", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.AutoMirrored.Outlined.StickyNote2, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.AutoMirrored.Filled.StickyNote2, contentDescription = null) + }, + label = "Notes", + showBadge = true, + ), + ) + + val formItems = listOf( + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.Description, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.Description, contentDescription = null) + }, + label = "Description", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.BarChart, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.BarChart, contentDescription = null) + }, + label = "Charts", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.AutoMirrored.Outlined.StickyNote2, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.AutoMirrored.Filled.StickyNote2, contentDescription = null) + }, + label = "Notes", + showBadge = true, + badgeText = "3", + ), + ) + + ColumnComponentContainer( + title = "Navigation Bar", + modifier = Modifier + .background(SurfaceColor.Container), + ) { + SubTitle("Home") + var selectedHomeItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = homeItems, + selectedItemIndex = selectedHomeItemIndex, + ) { + selectedHomeItemIndex = it + } + + Spacer(modifier = Modifier.height(Spacing.Spacing24)) + SubTitle("Program dashboard") + var selectedProgramItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = programItems, + selectedItemIndex = selectedProgramItemIndex, + ) { + selectedProgramItemIndex = it + } + + Spacer(modifier = Modifier.height(Spacing.Spacing24)) + SubTitle("Enrollment dashboard") + var selectedEnrollmentItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = enrollmentItems, + selectedItemIndex = selectedEnrollmentItemIndex, + ) { + selectedEnrollmentItemIndex = it + } + + Spacer(modifier = Modifier.height(Spacing.Spacing24)) + SubTitle("Form") + var selectedFormItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = formItems, + selectedItemIndex = selectedFormItemIndex, + ) { + selectedFormItemIndex = it + } + } +} From 64ae09d61859d03b1836aba99cb86e4532c09c59 Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Wed, 17 Jul 2024 14:32:00 +0530 Subject: [PATCH 04/12] Add Snapshot test for `NavigationBar` --- .../designsystem/NavigationBarSnapShotTest.kt | 215 ++++++++++++++++++ ...ionBarSnapShotTest_launchNavigationBar.png | Bin 0 -> 38459 bytes 2 files changed, 215 insertions(+) create mode 100644 designsystem/src/androidUnitTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/NavigationBarSnapShotTest.kt create mode 100644 designsystem/src/test/snapshots/images/org.hisp.dhis.mobile.ui.designsystem_NavigationBarSnapShotTest_launchNavigationBar.png diff --git a/designsystem/src/androidUnitTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/NavigationBarSnapShotTest.kt b/designsystem/src/androidUnitTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/NavigationBarSnapShotTest.kt new file mode 100644 index 000000000..2ddbc4848 --- /dev/null +++ b/designsystem/src/androidUnitTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/NavigationBarSnapShotTest.kt @@ -0,0 +1,215 @@ +package org.hisp.dhis.mobile.ui.designsystem + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.Assignment +import androidx.compose.material.icons.automirrored.filled.List +import androidx.compose.material.icons.automirrored.filled.StickyNote2 +import androidx.compose.material.icons.automirrored.outlined.Assignment +import androidx.compose.material.icons.automirrored.outlined.List +import androidx.compose.material.icons.automirrored.outlined.StickyNote2 +import androidx.compose.material.icons.filled.BarChart +import androidx.compose.material.icons.filled.Description +import androidx.compose.material.icons.filled.Hub +import androidx.compose.material.icons.filled.Map +import androidx.compose.material.icons.outlined.BarChart +import androidx.compose.material.icons.outlined.Description +import androidx.compose.material.icons.outlined.Hub +import androidx.compose.material.icons.outlined.Map +import androidx.compose.material3.Icon +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import org.hisp.dhis.mobile.ui.designsystem.component.ColumnComponentContainer +import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBar +import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarItem +import org.hisp.dhis.mobile.ui.designsystem.component.SubTitle +import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing +import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor +import org.junit.Rule +import org.junit.Test + +class NavigationBarSnapShotTest { + @get:Rule + val paparazzi = paparazzi() + + @Test + fun launchNavigationBar() { + paparazzi.snapshot { + val homeItems = listOf( + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.Description, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.Description, contentDescription = null) + }, + label = "Description", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.BarChart, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.BarChart, contentDescription = null) + }, + label = "Charts", + showBadge = true, + ), + ) + + val programItems = listOf( + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.AutoMirrored.Outlined.List, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.AutoMirrored.Filled.List, contentDescription = null) + }, + label = "List", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.Map, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.Map, contentDescription = null) + }, + label = "Maps", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.BarChart, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.BarChart, contentDescription = null) + }, + label = "Charts", + showBadge = true, + badgeText = "32", + ), + ) + + val enrollmentItems = listOf( + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.AutoMirrored.Outlined.Assignment, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.AutoMirrored.Filled.Assignment, contentDescription = null) + }, + label = "Details", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.BarChart, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.BarChart, contentDescription = null) + }, + label = "Charts", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.Hub, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.Hub, contentDescription = null) + }, + label = "Relationships", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.AutoMirrored.Outlined.StickyNote2, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.AutoMirrored.Filled.StickyNote2, contentDescription = null) + }, + label = "Notes", + showBadge = true, + ), + ) + + val formItems = listOf( + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.Description, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.Description, contentDescription = null) + }, + label = "Description", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.Outlined.BarChart, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.Filled.BarChart, contentDescription = null) + }, + label = "Charts", + ), + NavigationBarItem( + defaultIcon = { + Icon(imageVector = Icons.AutoMirrored.Outlined.StickyNote2, contentDescription = null) + }, + selectedIcon = { + Icon(imageVector = Icons.AutoMirrored.Filled.StickyNote2, contentDescription = null) + }, + label = "Notes", + showBadge = true, + badgeText = "3", + ), + ) + + ColumnComponentContainer( + title = "Navigation Bar", + modifier = Modifier + .background(SurfaceColor.Container), + ) { + SubTitle("Home") + var selectedHomeItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = homeItems, + selectedItemIndex = selectedHomeItemIndex, + ) { + selectedHomeItemIndex = it + } + + Spacer(modifier = Modifier.height(Spacing.Spacing24)) + SubTitle("Program dashboard") + var selectedProgramItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = programItems, + selectedItemIndex = selectedProgramItemIndex, + ) { + selectedProgramItemIndex = it + } + + Spacer(modifier = Modifier.height(Spacing.Spacing24)) + SubTitle("Enrollment dashboard") + var selectedEnrollmentItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = enrollmentItems, + selectedItemIndex = selectedEnrollmentItemIndex, + ) { + selectedEnrollmentItemIndex = it + } + + Spacer(modifier = Modifier.height(Spacing.Spacing24)) + SubTitle("Form") + var selectedFormItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = formItems, + selectedItemIndex = selectedFormItemIndex, + ) { + selectedFormItemIndex = it + } + } + } + } +} diff --git a/designsystem/src/test/snapshots/images/org.hisp.dhis.mobile.ui.designsystem_NavigationBarSnapShotTest_launchNavigationBar.png b/designsystem/src/test/snapshots/images/org.hisp.dhis.mobile.ui.designsystem_NavigationBarSnapShotTest_launchNavigationBar.png new file mode 100644 index 0000000000000000000000000000000000000000..45d8345a0a1f35676439e10dbc5e904d7707a627 GIT binary patch literal 38459 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 literal 0 HcmV?d00001 From ab7c31f3508eaee48756b47b9a9c916cf8769404 Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Wed, 17 Jul 2024 14:32:39 +0530 Subject: [PATCH 05/12] Add `NavigationBar` screen to app components list --- common/src/commonMain/kotlin/org/hisp/dhis/common/App.kt | 2 ++ .../commonMain/kotlin/org/hisp/dhis/common/screens/Groups.kt | 1 + 2 files changed, 3 insertions(+) diff --git a/common/src/commonMain/kotlin/org/hisp/dhis/common/App.kt b/common/src/commonMain/kotlin/org/hisp/dhis/common/App.kt index 36503acb9..dcca4ba45 100644 --- a/common/src/commonMain/kotlin/org/hisp/dhis/common/App.kt +++ b/common/src/commonMain/kotlin/org/hisp/dhis/common/App.kt @@ -24,6 +24,7 @@ import org.hisp.dhis.common.screens.others.ChipsScreen import org.hisp.dhis.common.screens.others.IndicatorScreen import org.hisp.dhis.common.screens.others.LegendScreen import org.hisp.dhis.common.screens.others.MetadataAvatarScreen +import org.hisp.dhis.common.screens.others.NavigationBarScreen import org.hisp.dhis.common.screens.others.ProgressScreen import org.hisp.dhis.common.screens.others.SearchBarScreen import org.hisp.dhis.common.screens.others.SectionScreen @@ -97,6 +98,7 @@ fun Main( Groups.TOGGLEABLE_INPUTS -> ToggleableInputsScreen(imageBitmapLoader) Groups.TAGS -> TagsScreen() Groups.SEARCH_BAR -> SearchBarScreen() + Groups.NAVIGATION_BAR -> NavigationBarScreen() Groups.NO_GROUP_SELECTED -> NoComponentSelectedScreen() } } else { diff --git a/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/Groups.kt b/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/Groups.kt index 8c73b26df..3d4eaefd1 100644 --- a/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/Groups.kt +++ b/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/Groups.kt @@ -18,4 +18,5 @@ enum class Groups(val label: String) { INDICATOR("Indicators"), PARAMETER_SELECTOR("Parameter selector"), NO_GROUP_SELECTED("No group selected"), + NAVIGATION_BAR("Navigation Bar"), } From 251fc6402ee9983e5498ef35ea2c31309964b4c9 Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Wed, 17 Jul 2024 17:14:23 +0530 Subject: [PATCH 06/12] Move Test tags to separate constants --- .../designsystem/component/NavigationBar.kt | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBar.kt b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBar.kt index 7555eeaa0..968c05a29 100644 --- a/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBar.kt +++ b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBar.kt @@ -12,10 +12,25 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.unit.dp +import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarTestTags.NAVIGATION_BAR +import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarTestTags.NAVIGATION_BAR_BORDER +import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarTestTags.NAVIGATION_BAR_CONTAINER +import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarTestTags.NAVIGATION_BAR_ITEM_BADGE_PREFIX +import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarTestTags.NAVIGATION_BAR_ITEM_LABEL_PREFIX +import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarTestTags.NAVIGATION_BAR_ITEM_PREFIX import org.hisp.dhis.mobile.ui.designsystem.theme.Outline import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor +object NavigationBarTestTags { + const val NAVIGATION_BAR_CONTAINER = "NAVIGATION_BAR_CONTAINER" + const val NAVIGATION_BAR_BORDER = "NAVIGATION_BAR_BORDER" + const val NAVIGATION_BAR = "NAVIGATION_BAR" + const val NAVIGATION_BAR_ITEM_PREFIX = "NAVIGATION_BAR_ITEM_" + const val NAVIGATION_BAR_ITEM_LABEL_PREFIX = "NAVIGATION_BAR_ITEM_LABEL_" + const val NAVIGATION_BAR_ITEM_BADGE_PREFIX = "NAVIGATION_BAR_ITEM_BADGE_" +} + @Composable fun NavigationBar( modifier: Modifier = Modifier, @@ -24,28 +39,28 @@ fun NavigationBar( onItemClick: (Int) -> Unit, ) { Column( - modifier = modifier.testTag("NAVIGATION_BAR_CONTAINER"), + modifier = modifier.testTag(NAVIGATION_BAR_CONTAINER), ) { HorizontalDivider( - modifier = Modifier.testTag("NAVIGATION_BAR_BORDER"), + modifier = Modifier.testTag(NAVIGATION_BAR_BORDER), thickness = 0.6.dp, color = Outline.Light, ) androidx.compose.material3.NavigationBar( - modifier = Modifier.testTag("NAVIGATION_BAR"), + modifier = Modifier.testTag(NAVIGATION_BAR), containerColor = SurfaceColor.ContainerLowest, ) { items.forEachIndexed { index, item -> val selected = selectedItemIndex == index NavigationBarItem( - modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_${item.label}"), + modifier = Modifier.testTag("$NAVIGATION_BAR_ITEM_PREFIX${item.label}"), colors = navigationBarItemColors(), icon = { NavigationBarItemIcon(item = item, selected = selected) }, label = { Text( - modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_LABEL_${item.label}"), + modifier = Modifier.testTag("$NAVIGATION_BAR_ITEM_LABEL_PREFIX${item.label}"), text = item.label, ) }, @@ -77,7 +92,7 @@ fun NavigationBarItemIcon(item: NavigationBarItem, selected: Boolean) { val badgeYOffset = if (!item.badgeText.isNullOrEmpty()) (-4).dp else 0.dp ErrorBadge( - modifier = Modifier.testTag("NAVIGATION_BAR_ITEM_BADGE_${item.label}") + modifier = Modifier.testTag("$NAVIGATION_BAR_ITEM_BADGE_PREFIX${item.label}") .align(Alignment.TopEnd) .offset( x = badgeXOffset, From 7d4adfc0e43eaff7a9db395504a6263751f670f5 Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Thu, 18 Jul 2024 12:23:02 +0530 Subject: [PATCH 07/12] Move data class and test object to separate files --- .../screens/others/NavigationBarScreen.kt | 4 +-- .../designsystem/NavigationBarSnapShotTest.kt | 4 +-- .../{ => navigationBar}/NavigationBar.kt | 33 +++++-------------- .../navigationBar/NavigationBarItem.kt | 12 +++++++ .../navigationBar/NavigationBarTestTags.kt | 10 ++++++ .../component/NavigationBarTest.kt | 30 ++++++++++------- 6 files changed, 53 insertions(+), 40 deletions(-) rename designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/{ => navigationBar}/NavigationBar.kt (72%) create mode 100644 designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBarItem.kt create mode 100644 designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBarTestTags.kt diff --git a/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/others/NavigationBarScreen.kt b/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/others/NavigationBarScreen.kt index 04b2112fe..657180dd5 100644 --- a/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/others/NavigationBarScreen.kt +++ b/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/others/NavigationBarScreen.kt @@ -26,9 +26,9 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import org.hisp.dhis.mobile.ui.designsystem.component.ColumnComponentContainer -import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBar -import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarItem import org.hisp.dhis.mobile.ui.designsystem.component.SubTitle +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor diff --git a/designsystem/src/androidUnitTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/NavigationBarSnapShotTest.kt b/designsystem/src/androidUnitTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/NavigationBarSnapShotTest.kt index 2ddbc4848..b4a2c1583 100644 --- a/designsystem/src/androidUnitTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/NavigationBarSnapShotTest.kt +++ b/designsystem/src/androidUnitTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/NavigationBarSnapShotTest.kt @@ -25,9 +25,9 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import org.hisp.dhis.mobile.ui.designsystem.component.ColumnComponentContainer -import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBar -import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarItem import org.hisp.dhis.mobile.ui.designsystem.component.SubTitle +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.junit.Rule diff --git a/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBar.kt b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt similarity index 72% rename from designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBar.kt rename to designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt index 968c05a29..667bf2f6e 100644 --- a/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBar.kt +++ b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt @@ -1,4 +1,4 @@ -package org.hisp.dhis.mobile.ui.designsystem.component +package org.hisp.dhis.mobile.ui.designsystem.component.navigationBar import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -12,25 +12,17 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.unit.dp -import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarTestTags.NAVIGATION_BAR -import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarTestTags.NAVIGATION_BAR_BORDER -import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarTestTags.NAVIGATION_BAR_CONTAINER -import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarTestTags.NAVIGATION_BAR_ITEM_BADGE_PREFIX -import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarTestTags.NAVIGATION_BAR_ITEM_LABEL_PREFIX -import org.hisp.dhis.mobile.ui.designsystem.component.NavigationBarTestTags.NAVIGATION_BAR_ITEM_PREFIX +import org.hisp.dhis.mobile.ui.designsystem.component.ErrorBadge +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR_BORDER +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR_CONTAINER +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR_ITEM_BADGE_PREFIX +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR_ITEM_LABEL_PREFIX +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR_ITEM_PREFIX import org.hisp.dhis.mobile.ui.designsystem.theme.Outline import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor -object NavigationBarTestTags { - const val NAVIGATION_BAR_CONTAINER = "NAVIGATION_BAR_CONTAINER" - const val NAVIGATION_BAR_BORDER = "NAVIGATION_BAR_BORDER" - const val NAVIGATION_BAR = "NAVIGATION_BAR" - const val NAVIGATION_BAR_ITEM_PREFIX = "NAVIGATION_BAR_ITEM_" - const val NAVIGATION_BAR_ITEM_LABEL_PREFIX = "NAVIGATION_BAR_ITEM_LABEL_" - const val NAVIGATION_BAR_ITEM_BADGE_PREFIX = "NAVIGATION_BAR_ITEM_BADGE_" -} - @Composable fun NavigationBar( modifier: Modifier = Modifier, @@ -114,12 +106,3 @@ fun navigationBarItemColors() = NavigationBarItemColors( disabledIconColor = TextColor.OnDisabledSurface, disabledTextColor = TextColor.OnDisabledSurface, ) - -data class NavigationBarItem( - val defaultIcon: @Composable () -> Unit, - val selectedIcon: @Composable () -> Unit, - val label: String, - val enabled: Boolean = true, - val showBadge: Boolean = false, - val badgeText: String? = null, -) diff --git a/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBarItem.kt b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBarItem.kt new file mode 100644 index 000000000..d47e24ebb --- /dev/null +++ b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBarItem.kt @@ -0,0 +1,12 @@ +package org.hisp.dhis.mobile.ui.designsystem.component.navigationBar + +import androidx.compose.runtime.Composable + +data class NavigationBarItem( + val defaultIcon: @Composable () -> Unit, + val selectedIcon: @Composable () -> Unit, + val label: String, + val enabled: Boolean = true, + val showBadge: Boolean = false, + val badgeText: String? = null, +) diff --git a/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBarTestTags.kt b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBarTestTags.kt new file mode 100644 index 000000000..51972d3f6 --- /dev/null +++ b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBarTestTags.kt @@ -0,0 +1,10 @@ +package org.hisp.dhis.mobile.ui.designsystem.component.navigationBar + +object NavigationBarTestTags { + const val NAVIGATION_BAR_CONTAINER = "NAVIGATION_BAR_CONTAINER" + const val NAVIGATION_BAR_BORDER = "NAVIGATION_BAR_BORDER" + const val NAVIGATION_BAR = "NAVIGATION_BAR" + const val NAVIGATION_BAR_ITEM_PREFIX = "NAVIGATION_BAR_ITEM_" + const val NAVIGATION_BAR_ITEM_LABEL_PREFIX = "NAVIGATION_BAR_ITEM_LABEL_" + const val NAVIGATION_BAR_ITEM_BADGE_PREFIX = "NAVIGATION_BAR_ITEM_BADGE_" +} diff --git a/designsystem/src/desktopTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBarTest.kt b/designsystem/src/desktopTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBarTest.kt index ba9c9e17f..f9c2d922b 100644 --- a/designsystem/src/desktopTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBarTest.kt +++ b/designsystem/src/desktopTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/NavigationBarTest.kt @@ -15,6 +15,14 @@ import androidx.compose.ui.platform.testTag import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.test.performClick +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR_BORDER +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR_CONTAINER +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR_ITEM_BADGE_PREFIX +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR_ITEM_LABEL_PREFIX +import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR_ITEM_PREFIX import org.junit.Rule import org.junit.Test @@ -70,19 +78,19 @@ class NavigationBarTest { } } - rule.onNodeWithTag("NAVIGATION_BAR_CONTAINER").assertExists() - rule.onNodeWithTag("NAVIGATION_BAR_BORDER").assertExists() - rule.onNodeWithTag("NAVIGATION_BAR").assertExists() - rule.onNodeWithTag("NAVIGATION_BAR_ITEM_Description", true).assertExists() - rule.onNodeWithTag("NAVIGATION_BAR_ITEM_LABEL_Description", true).assertExists() + rule.onNodeWithTag(NAVIGATION_BAR_CONTAINER).assertExists() + rule.onNodeWithTag(NAVIGATION_BAR_BORDER).assertExists() + rule.onNodeWithTag(NAVIGATION_BAR).assertExists() + rule.onNodeWithTag("${NAVIGATION_BAR_ITEM_PREFIX}Description", true).assertExists() + rule.onNodeWithTag("${NAVIGATION_BAR_ITEM_LABEL_PREFIX}Description", true).assertExists() rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Description", true).assertExists() rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Description", true).assertDoesNotExist() - rule.onNodeWithTag("NAVIGATION_BAR_ITEM_BADGE_Description", true).assertDoesNotExist() - rule.onNodeWithTag("NAVIGATION_BAR_ITEM_Charts", true).assertExists() - rule.onNodeWithTag("NAVIGATION_BAR_ITEM_LABEL_Charts", true).assertExists() + rule.onNodeWithTag("${NAVIGATION_BAR_ITEM_BADGE_PREFIX}Description", true).assertDoesNotExist() + rule.onNodeWithTag("${NAVIGATION_BAR_ITEM_PREFIX}Charts", true).assertExists() + rule.onNodeWithTag("${NAVIGATION_BAR_ITEM_LABEL_PREFIX}Charts", true).assertExists() rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Charts", true).assertExists() rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Charts", true).assertDoesNotExist() - rule.onNodeWithTag("NAVIGATION_BAR_ITEM_BADGE_Charts", true).assertExists() + rule.onNodeWithTag("${NAVIGATION_BAR_ITEM_BADGE_PREFIX}Charts", true).assertExists() } @Test @@ -136,7 +144,7 @@ class NavigationBarTest { rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Description", true).assertExists() rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Description", true).assertDoesNotExist() - rule.onNodeWithTag("NAVIGATION_BAR_ITEM_Description", true).performClick() + rule.onNodeWithTag("${NAVIGATION_BAR_ITEM_PREFIX}Description", true).performClick() rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Description", true).assertDoesNotExist() rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Description", true).assertExists() } @@ -194,7 +202,7 @@ class NavigationBarTest { rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Description", true).assertExists() rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Charts", true).assertExists() rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Charts", true).assertDoesNotExist() - rule.onNodeWithTag("NAVIGATION_BAR_ITEM_Charts", true).performClick() + rule.onNodeWithTag("${NAVIGATION_BAR_ITEM_PREFIX}Charts", true).performClick() rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Description", true).assertExists() rule.onNodeWithTag("NAVIGATION_BAR_ITEM_SELECTED_ICON_Description", true).assertDoesNotExist() rule.onNodeWithTag("NAVIGATION_BAR_ITEM_DEFAULT_ICON_Charts", true).assertDoesNotExist() From 446899e4e5671ba4e6bc274cece7fca2dfb374ff Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Thu, 25 Jul 2024 14:28:20 +0530 Subject: [PATCH 08/12] Truncate text when not fit on the screen --- .../ui/designsystem/component/navigationBar/NavigationBar.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt index 667bf2f6e..4c79081f1 100644 --- a/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt +++ b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt @@ -11,6 +11,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import org.hisp.dhis.mobile.ui.designsystem.component.ErrorBadge import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR @@ -54,6 +55,8 @@ fun NavigationBar( Text( modifier = Modifier.testTag("$NAVIGATION_BAR_ITEM_LABEL_PREFIX${item.label}"), text = item.label, + maxLines = 1, + overflow = TextOverflow.Ellipsis, ) }, enabled = item.enabled, From f23d6a238b8d5f235e9fdcdc5e6b9f6044c89a12 Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Thu, 1 Aug 2024 14:43:06 +0530 Subject: [PATCH 09/12] Fix item text colour and font family on selection --- .../component/navigationBar/NavigationBar.kt | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt index 4c79081f1..3e204ac96 100644 --- a/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt +++ b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt @@ -4,13 +4,15 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.offset import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.MaterialTheme import androidx.compose.material3.NavigationBarItem -import androidx.compose.material3.NavigationBarItemColors +import androidx.compose.material3.NavigationBarItemDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import org.hisp.dhis.mobile.ui.designsystem.component.ErrorBadge @@ -53,6 +55,18 @@ fun NavigationBar( }, label = { Text( + style = MaterialTheme.typography.labelMedium.copy( + fontWeight = if (selected) { + FontWeight.SemiBold + } else { + FontWeight.Medium + }, + ), + color = if (selected) { + TextColor.OnSurface + } else { + TextColor.OnSurfaceVariant + }, modifier = Modifier.testTag("$NAVIGATION_BAR_ITEM_LABEL_PREFIX${item.label}"), text = item.label, maxLines = 1, @@ -100,12 +114,10 @@ fun NavigationBarItemIcon(item: NavigationBarItem, selected: Boolean) { } @Composable -fun navigationBarItemColors() = NavigationBarItemColors( +fun navigationBarItemColors() = NavigationBarItemDefaults.colors( selectedIconColor = SurfaceColor.Primary, - selectedTextColor = TextColor.OnSurfaceVariant, - selectedIndicatorColor = SurfaceColor.Container, + indicatorColor = SurfaceColor.Container, unselectedIconColor = TextColor.OnSurfaceVariant, - unselectedTextColor = TextColor.OnSurfaceVariant, disabledIconColor = TextColor.OnDisabledSurface, disabledTextColor = TextColor.OnDisabledSurface, ) From 82af02489fbff6f781e7d2fdafb77ab6782b61f1 Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Thu, 8 Aug 2024 14:10:50 +0530 Subject: [PATCH 10/12] Fix text style on selection --- .../component/navigationBar/NavigationBar.kt | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt index 3e204ac96..edfb4dda3 100644 --- a/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt +++ b/designsystem/src/commonMain/kotlin/org/hisp/dhis/mobile/ui/designsystem/component/navigationBar/NavigationBar.kt @@ -22,6 +22,7 @@ import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBa import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR_ITEM_BADGE_PREFIX import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR_ITEM_LABEL_PREFIX import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarTestTags.NAVIGATION_BAR_ITEM_PREFIX +import org.hisp.dhis.mobile.ui.designsystem.resource.provideFontResource import org.hisp.dhis.mobile.ui.designsystem.theme.Outline import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.hisp.dhis.mobile.ui.designsystem.theme.TextColor @@ -55,17 +56,15 @@ fun NavigationBar( }, label = { Text( - style = MaterialTheme.typography.labelMedium.copy( - fontWeight = if (selected) { - FontWeight.SemiBold - } else { - FontWeight.Medium - }, - ), - color = if (selected) { - TextColor.OnSurface + style = if (selected) { + MaterialTheme.typography.labelMedium.copy( + fontFamily = provideFontResource("roboto_bold"), + fontWeight = FontWeight.Bold, + ) } else { - TextColor.OnSurfaceVariant + MaterialTheme.typography.labelMedium.copy( + color = TextColor.OnSurfaceVariant, + ) }, modifier = Modifier.testTag("$NAVIGATION_BAR_ITEM_LABEL_PREFIX${item.label}"), text = item.label, From a752b047e98c44730b120c2a54ce30d3916379d5 Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Fri, 9 Aug 2024 15:41:20 +0530 Subject: [PATCH 11/12] Fix merge errors --- .../org/hisp/dhis/common/screens/Groups.kt | 2 +- .../screens/others/NavigationBarScreen.kt | 79 +++++++++---------- 2 files changed, 37 insertions(+), 44 deletions(-) diff --git a/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/Groups.kt b/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/Groups.kt index 3d4eaefd1..403da1712 100644 --- a/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/Groups.kt +++ b/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/Groups.kt @@ -17,6 +17,6 @@ enum class Groups(val label: String) { METADATA_AVATAR("Metadata Avatar"), INDICATOR("Indicators"), PARAMETER_SELECTOR("Parameter selector"), - NO_GROUP_SELECTED("No group selected"), NAVIGATION_BAR("Navigation Bar"), + NO_GROUP_SELECTED("No group selected"), } diff --git a/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/others/NavigationBarScreen.kt b/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/others/NavigationBarScreen.kt index 657180dd5..2feaf8f9f 100644 --- a/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/others/NavigationBarScreen.kt +++ b/common/src/commonMain/kotlin/org/hisp/dhis/common/screens/others/NavigationBarScreen.kt @@ -1,8 +1,5 @@ package org.hisp.dhis.common.screens.others -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.Assignment import androidx.compose.material.icons.automirrored.filled.List @@ -24,13 +21,11 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier +import org.hisp.dhis.common.screens.Groups import org.hisp.dhis.mobile.ui.designsystem.component.ColumnComponentContainer -import org.hisp.dhis.mobile.ui.designsystem.component.SubTitle +import org.hisp.dhis.mobile.ui.designsystem.component.ColumnScreenContainer import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem -import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor @Composable fun NavigationBarScreen() { @@ -160,48 +155,46 @@ fun NavigationBarScreen() { ), ) - ColumnComponentContainer( - title = "Navigation Bar", - modifier = Modifier - .background(SurfaceColor.Container), + ColumnScreenContainer( + title = Groups.NAVIGATION_BAR.label, ) { - SubTitle("Home") - var selectedHomeItemIndex by remember { mutableStateOf(null) } - NavigationBar( - items = homeItems, - selectedItemIndex = selectedHomeItemIndex, - ) { - selectedHomeItemIndex = it + ColumnComponentContainer("Home") { + var selectedHomeItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = homeItems, + selectedItemIndex = selectedHomeItemIndex, + ) { + selectedHomeItemIndex = it + } } - - Spacer(modifier = Modifier.height(Spacing.Spacing24)) - SubTitle("Program dashboard") - var selectedProgramItemIndex by remember { mutableStateOf(null) } - NavigationBar( - items = programItems, - selectedItemIndex = selectedProgramItemIndex, - ) { - selectedProgramItemIndex = it + ColumnComponentContainer("Program dashboard") { + var selectedProgramItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = programItems, + selectedItemIndex = selectedProgramItemIndex, + ) { + selectedProgramItemIndex = it + } } - Spacer(modifier = Modifier.height(Spacing.Spacing24)) - SubTitle("Enrollment dashboard") - var selectedEnrollmentItemIndex by remember { mutableStateOf(null) } - NavigationBar( - items = enrollmentItems, - selectedItemIndex = selectedEnrollmentItemIndex, - ) { - selectedEnrollmentItemIndex = it + ColumnComponentContainer("Enrollment dashboard") { + var selectedEnrollmentItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = enrollmentItems, + selectedItemIndex = selectedEnrollmentItemIndex, + ) { + selectedEnrollmentItemIndex = it + } } - Spacer(modifier = Modifier.height(Spacing.Spacing24)) - SubTitle("Form") - var selectedFormItemIndex by remember { mutableStateOf(null) } - NavigationBar( - items = formItems, - selectedItemIndex = selectedFormItemIndex, - ) { - selectedFormItemIndex = it + ColumnComponentContainer("Form") { + var selectedFormItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = formItems, + selectedItemIndex = selectedFormItemIndex, + ) { + selectedFormItemIndex = it + } } } } From 9799470af8aa7e7db0e202bc5a341e28ff5f4fb3 Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Fri, 9 Aug 2024 15:49:48 +0530 Subject: [PATCH 12/12] Fix snapshot test --- .../designsystem/NavigationBarSnapShotTest.kt | 76 ++++++++---------- ...ionBarSnapShotTest_launchNavigationBar.png | Bin 38459 -> 34021 bytes 2 files changed, 34 insertions(+), 42 deletions(-) diff --git a/designsystem/src/androidUnitTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/NavigationBarSnapShotTest.kt b/designsystem/src/androidUnitTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/NavigationBarSnapShotTest.kt index b4a2c1583..0774d7da7 100644 --- a/designsystem/src/androidUnitTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/NavigationBarSnapShotTest.kt +++ b/designsystem/src/androidUnitTest/kotlin/org/hisp/dhis/mobile/ui/designsystem/NavigationBarSnapShotTest.kt @@ -1,8 +1,5 @@ package org.hisp.dhis.mobile.ui.designsystem -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.height import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.Assignment import androidx.compose.material.icons.automirrored.filled.List @@ -23,13 +20,10 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.Modifier import org.hisp.dhis.mobile.ui.designsystem.component.ColumnComponentContainer -import org.hisp.dhis.mobile.ui.designsystem.component.SubTitle +import org.hisp.dhis.mobile.ui.designsystem.component.ColumnScreenContainer import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBar import org.hisp.dhis.mobile.ui.designsystem.component.navigationBar.NavigationBarItem -import org.hisp.dhis.mobile.ui.designsystem.theme.Spacing -import org.hisp.dhis.mobile.ui.designsystem.theme.SurfaceColor import org.junit.Rule import org.junit.Test @@ -166,48 +160,46 @@ class NavigationBarSnapShotTest { ), ) - ColumnComponentContainer( + ColumnScreenContainer( title = "Navigation Bar", - modifier = Modifier - .background(SurfaceColor.Container), ) { - SubTitle("Home") - var selectedHomeItemIndex by remember { mutableStateOf(null) } - NavigationBar( - items = homeItems, - selectedItemIndex = selectedHomeItemIndex, - ) { - selectedHomeItemIndex = it + ColumnComponentContainer("Home") { + var selectedHomeItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = homeItems, + selectedItemIndex = selectedHomeItemIndex, + ) { + selectedHomeItemIndex = it + } } - - Spacer(modifier = Modifier.height(Spacing.Spacing24)) - SubTitle("Program dashboard") - var selectedProgramItemIndex by remember { mutableStateOf(null) } - NavigationBar( - items = programItems, - selectedItemIndex = selectedProgramItemIndex, - ) { - selectedProgramItemIndex = it + ColumnComponentContainer("Program dashboard") { + var selectedProgramItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = programItems, + selectedItemIndex = selectedProgramItemIndex, + ) { + selectedProgramItemIndex = it + } } - Spacer(modifier = Modifier.height(Spacing.Spacing24)) - SubTitle("Enrollment dashboard") - var selectedEnrollmentItemIndex by remember { mutableStateOf(null) } - NavigationBar( - items = enrollmentItems, - selectedItemIndex = selectedEnrollmentItemIndex, - ) { - selectedEnrollmentItemIndex = it + ColumnComponentContainer("Enrollment dashboard") { + var selectedEnrollmentItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = enrollmentItems, + selectedItemIndex = selectedEnrollmentItemIndex, + ) { + selectedEnrollmentItemIndex = it + } } - Spacer(modifier = Modifier.height(Spacing.Spacing24)) - SubTitle("Form") - var selectedFormItemIndex by remember { mutableStateOf(null) } - NavigationBar( - items = formItems, - selectedItemIndex = selectedFormItemIndex, - ) { - selectedFormItemIndex = it + ColumnComponentContainer("Form") { + var selectedFormItemIndex by remember { mutableStateOf(null) } + NavigationBar( + items = formItems, + selectedItemIndex = selectedFormItemIndex, + ) { + selectedFormItemIndex = it + } } } } diff --git a/designsystem/src/test/snapshots/images/org.hisp.dhis.mobile.ui.designsystem_NavigationBarSnapShotTest_launchNavigationBar.png b/designsystem/src/test/snapshots/images/org.hisp.dhis.mobile.ui.designsystem_NavigationBarSnapShotTest_launchNavigationBar.png index 45d8345a0a1f35676439e10dbc5e904d7707a627..48fb470baa536c75b2326ad8385c78d59bcac6cd 100644 GIT binary patch literal 34021 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 +P6%dP${>|1?FY> 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 RZ&bjcrKb0!TIG4f{{^+-e3$?L literal 38459 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