From 7325f53fe225226a933abe645f99c62adfb40499 Mon Sep 17 00:00:00 2001 From: Gabriel Brand Date: Thu, 3 Jul 2025 22:11:40 +0200 Subject: [PATCH] custom fields: hide or show move up or down actions depending on the items' index - When only one custom field is present no move actions are displayed - When two fields are added only move down for the first or move up for the last is displayed - When there are three or more items both actions are displayed for fields between the first and the last --- .../addedit/VaultAddEditAdditionalOptions.kt | 10 +++-- .../addedit/VaultAddEditCustomField.kt | 38 ++++++++++++------- .../feature/addedit/VaultAddEditViewModel.kt | 6 --- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditAdditionalOptions.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditAdditionalOptions.kt index 80a6d6232ad..1df0090af30 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditAdditionalOptions.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditAdditionalOptions.kt @@ -6,7 +6,7 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyListScope -import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource @@ -110,10 +110,10 @@ fun LazyListScope.vaultAddEditAdditionalOptions( } } - items( + itemsIndexed( items = commonState.customFieldData, - key = { "customField_${it.itemId}" }, - ) { customItem -> + key = { _, customItem -> "customField_${customItem.itemId}" }, + ) { index, customItem -> Column( modifier = Modifier .animateItem() @@ -125,6 +125,8 @@ fun LazyListScope.vaultAddEditAdditionalOptions( customField = customItem, onCustomFieldValueChange = commonTypeHandlers.onCustomFieldValueChange, onCustomFieldAction = commonTypeHandlers.onCustomFieldActionSelect, + showMoveUpAction = index > 0, + showMoveDownAction = index < commonState.customFieldData.lastIndex, onHiddenVisibilityChanged = commonTypeHandlers.onHiddenFieldVisibilityChange, supportedLinkedTypes = itemType.vaultLinkedFieldTypes, cardStyle = CardStyle.Full, diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCustomField.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCustomField.kt index 33805e314d8..54632d71a7f 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCustomField.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditCustomField.kt @@ -34,6 +34,8 @@ import kotlinx.collections.immutable.toImmutableList * @param customField The field that is to be displayed. * @param onCustomFieldValueChange Invoked when the user changes the value. * @param onCustomFieldAction Invoked when the user chooses an action. + * @param showMoveUpAction Whether the [CustomFieldAction.MOVE_UP] is displayed in the action dialog. + * @param showMoveDownAction Whether the [CustomFieldAction.MOVE_DOWN] is displayed in the action dialog. * @param onHiddenVisibilityChanged Emits when the visibility of a hidden custom field changes. * @param cardStyle Indicates the type of card style to be applied. * @param modifier Modifier for the UI elements. @@ -45,6 +47,8 @@ fun VaultAddEditCustomField( customField: VaultAddEditState.Custom, onCustomFieldValueChange: (VaultAddEditState.Custom) -> Unit, onCustomFieldAction: (CustomFieldAction, VaultAddEditState.Custom) -> Unit, + showMoveUpAction: Boolean, + showMoveDownAction: Boolean, onHiddenVisibilityChanged: (Boolean) -> Unit, cardStyle: CardStyle, modifier: Modifier = Modifier, @@ -55,6 +59,13 @@ fun VaultAddEditCustomField( if (shouldShowChooserDialog) { CustomFieldActionDialog( + customFieldActions = CustomFieldAction.entries.filter { action -> + when (action) { + CustomFieldAction.MOVE_UP -> showMoveUpAction + CustomFieldAction.MOVE_DOWN -> showMoveDownAction + else -> true + } + }, onCustomFieldAction = { action -> shouldShowChooserDialog = false onCustomFieldAction(action, customField) @@ -281,6 +292,7 @@ private fun CustomFieldLinkedField( */ @Composable private fun CustomFieldActionDialog( + customFieldActions: List = CustomFieldAction.entries, onCustomFieldAction: (CustomFieldAction) -> Unit, onEditAction: () -> Unit, onDismissRequest: () -> Unit, @@ -289,20 +301,18 @@ private fun CustomFieldActionDialog( title = stringResource(id = R.string.options), onDismissRequest = onDismissRequest, ) { - CustomFieldAction - .entries - .forEach { action -> - BitwardenBasicDialogRow( - text = action.actionText.invoke(), - onClick = { - if (action == CustomFieldAction.EDIT) { - onEditAction() - } else { - onCustomFieldAction(action) - } - }, - ) - } + customFieldActions.forEach { action -> + BitwardenBasicDialogRow( + text = action.actionText.invoke(), + onClick = { + if (action == CustomFieldAction.EDIT) { + onEditAction() + } else { + onCustomFieldAction(action) + } + }, + ) + } } } diff --git a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt index a1c2d4d6b7c..15d80175b59 100644 --- a/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt +++ b/app/src/main/kotlin/com/x8bit/bitwarden/ui/vault/feature/addedit/VaultAddEditViewModel.kt @@ -854,9 +854,6 @@ class VaultAddEditViewModel @Inject constructor( .toMutableList() val index = items.lastIndexOf(action.customField) - if (index == 0) { - return - } Collections.swap(items, index, index - 1) @@ -875,9 +872,6 @@ class VaultAddEditViewModel @Inject constructor( .toMutableList() val index = items.indexOf(action.customField) - if (index == items.lastIndex) { - return - } Collections.swap(items, index, index + 1)