From 36ac9d6f83790701d3759ca6bd17763b33196981 Mon Sep 17 00:00:00 2001 From: Pauline Auvray Date: Fri, 2 Dec 2022 16:50:40 +0100 Subject: [PATCH] [#349] Add overflow menu composable in the library --- .../com/orange/ods/demo/ui/MainTopAppBar.kt | 57 ++++-------- .../appbars/top/ComponentTopAppBar.kt | 2 +- docs/components/AppBarsTop.md | 31 +++++++ .../images/app_bar_top_overflow_menu_dark.png | Bin 0 -> 22014 bytes .../app_bar_top_overflow_menu_light.png | Bin 0 -> 21398 bytes .../component/appbar/top/OdsTopAppBar.kt | 53 +++++++++++ .../compose/component/menu/OdsDropdownMenu.kt | 86 ++++++++++++++++++ 7 files changed, 187 insertions(+), 42 deletions(-) create mode 100644 docs/components/images/app_bar_top_overflow_menu_dark.png create mode 100644 docs/components/images/app_bar_top_overflow_menu_light.png create mode 100644 lib/src/main/java/com/orange/ods/compose/component/menu/OdsDropdownMenu.kt diff --git a/demo/src/main/java/com/orange/ods/demo/ui/MainTopAppBar.kt b/demo/src/main/java/com/orange/ods/demo/ui/MainTopAppBar.kt index a714a444c..70ac3ba8a 100644 --- a/demo/src/main/java/com/orange/ods/demo/ui/MainTopAppBar.kt +++ b/demo/src/main/java/com/orange/ods/demo/ui/MainTopAppBar.kt @@ -12,26 +12,18 @@ package com.orange.ods.demo.ui import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import androidx.compose.foundation.layout.Box -import androidx.compose.material.DropdownMenu -import androidx.compose.material.DropdownMenuItem import androidx.compose.material.Icon import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material.icons.filled.MoreVert 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.graphics.vector.rememberVectorPainter import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import com.orange.ods.compose.component.appbar.top.OdsTopAppBar import com.orange.ods.compose.component.appbar.top.OdsTopAppBarActionButton -import com.orange.ods.compose.text.OdsTextBody1 +import com.orange.ods.compose.component.appbar.top.OdsTopAppBarOverFlowMenuBox +import com.orange.ods.compose.component.menu.OdsMenuItem import com.orange.ods.demo.R import com.orange.ods.demo.ui.components.utilities.clickOnElement import com.orange.ods.demo.ui.utilities.extension.isDarkModeEnabled @@ -79,46 +71,29 @@ fun MainTopAppBar( } } if (state.isOverflowMenuEnabled) { - OverflowMenu() + OdsTopAppBarOverFlowMenuBox( + overflowIconContentDescription = stringResource(id = R.string.component_app_bars_top_element_overflow_menu), + overflowMenuItems = listOf( + OdsMenuItem( + text = stringResource(id = R.string.component_app_bars_top_action_account), + onClick = { clickOnElement(context, context.getString(R.string.component_app_bars_top_action_account)) } + ), + OdsMenuItem( + text = stringResource(id = R.string.component_app_bars_top_action_settings), + onClick = { clickOnElement(context, context.getString(R.string.component_app_bars_top_action_settings)) } + ) + ) + ) } }, elevated = false // elevation is managed in [MainScreen] cause of tabs ) } -@Composable -private fun OverflowMenu() { - var showMenu by remember { mutableStateOf(false) } - val context = LocalContext.current - - Box { - OdsTopAppBarActionButton( - onClick = { showMenu = !showMenu }, - painter = rememberVectorPainter(image = Icons.Filled.MoreVert), - contentDescription = stringResource(id = R.string.component_app_bars_top_element_overflow_menu) - ) - DropdownMenu( - expanded = showMenu, - onDismissRequest = { showMenu = false } - ) { - topAppBarDemoOverflowActions.forEach { - DropdownMenuItem(onClick = { clickOnElement(context, context.getString(it.titleRes)) }) { - OdsTextBody1(text = stringResource(id = it.titleRes)) - } - } - } - } - -} - private val topAppBarDemoActions = listOf( TopAppBarAction(R.drawable.ic_heart, R.string.component_app_bars_top_action_favourites), TopAppBarAction(R.drawable.ic_alert, R.string.component_app_bars_top_action_alerts), ) -private val topAppBarDemoOverflowActions = listOf( - TopAppBarAction(R.drawable.ic_account, R.string.component_app_bars_top_action_account), - TopAppBarAction(R.drawable.ic_settings, R.string.component_app_bars_top_action_settings) -) +private data class TopAppBarAction(@DrawableRes val iconRes: Int, @StringRes val titleRes: Int) -private data class TopAppBarAction(@DrawableRes val iconRes: Int, @StringRes val titleRes: Int) \ No newline at end of file diff --git a/demo/src/main/java/com/orange/ods/demo/ui/components/appbars/top/ComponentTopAppBar.kt b/demo/src/main/java/com/orange/ods/demo/ui/components/appbars/top/ComponentTopAppBar.kt index fb2a87e8e..c6e4c6f18 100644 --- a/demo/src/main/java/com/orange/ods/demo/ui/components/appbars/top/ComponentTopAppBar.kt +++ b/demo/src/main/java/com/orange/ods/demo/ui/components/appbars/top/ComponentTopAppBar.kt @@ -57,6 +57,6 @@ fun ComponentTopAppBar() { ) }) { - // Nothing to display in screen + // Nothing to display in screen (see MainTopAppBar.kt) } } \ No newline at end of file diff --git a/docs/components/AppBarsTop.md b/docs/components/AppBarsTop.md index 37c2492a7..de9ef8aed 100644 --- a/docs/components/AppBarsTop.md +++ b/docs/components/AppBarsTop.md @@ -11,6 +11,8 @@ description: Top app bars display information and actions relating to the curren * [Specifications references](#specifications-references) * [Accessibility](#accessibility) * [Implementation](#implementation) +* [Extras](#extras) + * [Overflow menu](#overflow-menu) * [Component specific tokens](#component-specific-tokens) --- @@ -236,6 +238,35 @@ If you need to have a top app bar with some elevation you can set the `@style/Wi ``` +## Extras + +### Overflow menu + +![Overflow menu light](images/app_bar_top_overflow_menu_light.png) +![Overflow menu dark](images/app_bar_top_overflow_menu_dark.png) + +You can easily add an overflow menu to your top app bar by using the `OdsTopAppBarOverFlowMenuBox` composable as follow: + +```kotlin +OdsTopAppBarOverFlowMenuBox( + overflowIconContentDescription = "more actions", + overflowMenuItems = listOf( + OdsMenuItem( + text = "Account", + onClick = { + // do something + } + ), + OdsMenuItem( + text = "Settings", + onClick = { + // do something + } + ) + ) +) +``` + ## Component specific tokens _Soon available_ diff --git a/docs/components/images/app_bar_top_overflow_menu_dark.png b/docs/components/images/app_bar_top_overflow_menu_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..60322543e1db8e799d7ae5081378d5faa9f4aa0a GIT binary patch literal 22014 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 bxzMt$IJOGq^s6sU1{}_0H^)kQzl47QvAe(| literal 0 HcmV?d00001 diff --git a/docs/components/images/app_bar_top_overflow_menu_light.png b/docs/components/images/app_bar_top_overflow_menu_light.png new file mode 100644 index 0000000000000000000000000000000000000000..2e3bd9056ce83bee32dba5f9d9d0f48a5c488bf1 GIT binary patch literal 21398 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 = emptyList() +) { + var showMenu by remember { mutableStateOf(false) } + + Box { + OdsTopAppBarActionButton( + onClick = { showMenu = !showMenu }, + painter = rememberVectorPainter(image = Icons.Filled.MoreVert), + contentDescription = overflowIconContentDescription + ) + OdsDropdownMenu( + expanded = showMenu, + onDismissRequest = { showMenu = false }, + menuItems = overflowMenuItems + ) + } +} + @UiModePreviews.Default @Composable private fun PreviewOdsTopAppBar() = Preview { @@ -114,6 +160,13 @@ private fun PreviewOdsTopAppBar() = Preview { painter = painterResource(id = android.R.drawable.ic_dialog_info), contentDescription = "Info" ) + OdsTopAppBarOverFlowMenuBox( + overflowIconContentDescription = "more options", + overflowMenuItems = listOf( + OdsMenuItem(text = "settings", {}), + OdsMenuItem(text = "account", {}) + ) + ) } ) } diff --git a/lib/src/main/java/com/orange/ods/compose/component/menu/OdsDropdownMenu.kt b/lib/src/main/java/com/orange/ods/compose/component/menu/OdsDropdownMenu.kt new file mode 100644 index 000000000..8ef0693c0 --- /dev/null +++ b/lib/src/main/java/com/orange/ods/compose/component/menu/OdsDropdownMenu.kt @@ -0,0 +1,86 @@ +/* + * + * Copyright 2021 Orange + * + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + * / + */ + +package com.orange.ods.compose.component.menu + +import androidx.compose.foundation.background +import androidx.compose.material.DropdownMenu +import androidx.compose.material.DropdownMenuItem +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.DpOffset +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.PopupProperties +import com.orange.ods.compose.theme.OdsTheme + +/** + * ODS menus. + * + * @see androidx.compose.material.DropdownMenu + * + * @param expanded Whether the menu is currently open and visible to the user + * @param onDismissRequest Called when the user requests to dismiss the menu, such as by + * tapping outside the menu's bounds + * @param offset [DpOffset] to be added to the position of the menu + */ +@Composable +fun OdsDropdownMenu( + expanded: Boolean, + onDismissRequest: () -> Unit, + modifier: Modifier = Modifier, + offset: DpOffset = DpOffset(0.dp, 0.dp), + properties: PopupProperties = PopupProperties(focusable = true), + menuItems: List = emptyList() +) { + DropdownMenu( + expanded = expanded, + onDismissRequest = onDismissRequest, + modifier = modifier.background(OdsTheme.colors.surface), + offset = offset, + properties = properties + ) { + menuItems.forEach { item -> + OdsDropdownMenuItem(text = item.text, onClick = item.onClick, enabled = item.enabled) + } + } +} + +/** + * @see androidx.compose.material.DropdownMenuItem + * + * @param text The text of the menu item + * @param onClick Called when the menu item was clicked + * @param modifier The modifier to be applied to the menu item + * @param enabled Controls the enabled state of the menu item - when `false`, the menu item + * will not be clickable and [onClick] will not be invoked + */ +@Composable +private fun OdsDropdownMenuItem( + text: String, + onClick: () -> Unit, + enabled: Boolean = true +) { + DropdownMenuItem( + onClick = onClick, + enabled = enabled + ) { + Text(text = text, style = OdsTheme.typography.body1, color = OdsTheme.colors.onSurface) + } +} + +/** + * An item displayed in a menu + * + * @property text The text of the menu item + * @property onClick Action executed when the menu item was clicked + * @property enabled Determines the enabled state of the menu item + */ +data class OdsMenuItem(val text: String, val onClick: () -> Unit, val enabled: Boolean = true) \ No newline at end of file