Skip to content

Commit a762133

Browse files
authored
Connect saving account item list to saving account detail Page (#2536)
1 parent da5da5e commit a762133

File tree

8 files changed

+88
-29
lines changed

8 files changed

+88
-29
lines changed

core/ui/src/commonMain/kotlin/com/mifos/core/ui/components/MifosActionsListingCardComponent.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -732,17 +732,19 @@ fun MifosActionsSavingsListingComponent(
732732
savingsProductName: String,
733733
lastActive: String,
734734
balance: String,
735+
isExpanded: Boolean,
736+
onExpandToggle: () -> Unit,
735737
menuList: List<Actions>,
736738
onActionClicked: (Actions) -> Unit,
737739
) {
738-
var isExpanded by rememberSaveable { mutableStateOf(false) }
739-
740740
Column {
741741
MifosActionsListingComponentOutline(
742742
isExpanded = isExpanded,
743743
) {
744744
Column(
745-
modifier = Modifier.padding(DesignToken.padding.large),
745+
modifier = Modifier.padding(DesignToken.padding.large).onClick {
746+
onExpandToggle()
747+
},
746748
) {
747749
MifosListingRowItemHeader(
748750
text = accountNo,
@@ -771,7 +773,7 @@ fun MifosActionsSavingsListingComponent(
771773
}
772774
}
773775

774-
if (isExpanded) {
776+
AnimatedVisibility(isExpanded) {
775777
Surface(
776778
modifier = Modifier.fillMaxWidth(),
777779
shape = RoundedCornerShape(
@@ -1137,6 +1139,8 @@ private fun PreviewMifosActionsSavingsListingComponent() {
11371139
else -> println("Action not Handled")
11381140
}
11391141
},
1142+
isExpanded = true,
1143+
onExpandToggle = {},
11401144
)
11411145
}
11421146
}

core/ui/src/commonMain/kotlin/com/mifos/core/ui/components/MifosAllUiComponentsPreview.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ private fun PreviewMifosActionsSavingsListingComponent() {
167167
else -> println("Action not Handled")
168168
}
169169
},
170+
isExpanded = true,
171+
onExpandToggle = {},
170172
)
171173
}
172174
}

feature/client/src/commonMain/kotlin/com/mifos/feature/client/fixedDepositAccount/FixedDepositAccountScreen.kt

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,18 @@ import androidx.compose.foundation.layout.padding
3030
import androidx.compose.foundation.layout.width
3131
import androidx.compose.foundation.layout.wrapContentHeight
3232
import androidx.compose.foundation.lazy.LazyColumn
33-
import androidx.compose.foundation.lazy.items
33+
import androidx.compose.foundation.lazy.itemsIndexed
3434
import androidx.compose.material3.AlertDialog
3535
import androidx.compose.material3.ExperimentalMaterial3Api
3636
import androidx.compose.material3.Icon
3737
import androidx.compose.material3.Text
3838
import androidx.compose.material3.TextButton
3939
import androidx.compose.runtime.Composable
4040
import androidx.compose.runtime.getValue
41+
import androidx.compose.runtime.mutableStateOf
4142
import androidx.compose.runtime.remember
43+
import androidx.compose.runtime.saveable.rememberSaveable
44+
import androidx.compose.runtime.setValue
4245
import androidx.compose.ui.Modifier
4346
import androidx.lifecycle.compose.collectAsStateWithLifecycle
4447
import androidx.navigation.NavController
@@ -130,6 +133,8 @@ fun FixedDepositAccountScaffold(
130133
modifier: Modifier = Modifier,
131134
onAction: (FixedDepositAccountAction) -> Unit,
132135
) {
136+
var expandedIndex by rememberSaveable { mutableStateOf(-1) }
137+
133138
MifosScaffold(
134139
onBackPressed = {
135140
onAction(FixedDepositAccountAction.NavigateBack)
@@ -187,7 +192,7 @@ fun FixedDepositAccountScaffold(
187192
MifosEmptyCard(msg = stringResource(Res.string.client_empty_card_message))
188193
} else {
189194
LazyColumn {
190-
items(state.fixedDepositAccount) { fixedDepositAccount ->
195+
itemsIndexed(state.fixedDepositAccount) { index, fixedDepositAccount ->
191196
MifosActionsSavingsListingComponent(
192197
accountNo = fixedDepositAccount.accountNo ?: notAvailableText,
193198
savingsProduct = stringResource(Res.string.client_product_fixed_deposit_account),
@@ -205,6 +210,10 @@ fun FixedDepositAccountScaffold(
205210
} else {
206211
notAvailableText
207212
},
213+
isExpanded = expandedIndex == index,
214+
onExpandToggle = {
215+
expandedIndex = if (expandedIndex == index) -1 else index
216+
},
208217
menuList = if (fixedDepositAccount.status?.submittedAndPendingApproval == true) {
209218
listOf(
210219
Actions.ViewAccount(MifosIcons.ShielOutlined),

feature/client/src/commonMain/kotlin/com/mifos/feature/client/navigation/ClientNavigation.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ import com.mifos.feature.note.notes.navigateToNoteScreen
9595
import com.mifos.feature.recurringDeposit.newRecurringDepositAccount.navigateToRecurringAccountRoute
9696
import com.mifos.feature.recurringDeposit.newRecurringDepositAccount.recurringAccountDestination
9797
import com.mifos.feature.savings.navigation.navigateToAddSavingsAccount
98+
import com.mifos.feature.savings.navigation.navigateToSavingsAccountApproval
9899
import com.mifos.feature.savings.navigation.navigateToSavingsAccountSummaryScreen
99100
import com.mifos.feature.savings.navigation.savingsDestination
100101
import com.mifos.feature.savings.savingsAccountv2.navigateToSavingsAccountRoute
@@ -298,8 +299,10 @@ fun NavGraphBuilder.clientNavGraph(
298299
)
299300
savingsAccountsDestination(
300301
navigateBack = navController::popBackStack,
301-
navigateToViewAccount = { },
302+
navigateToViewAccount = navController::navigateToSavingsAccountSummaryScreen,
302303
navController = navController,
304+
navigateToApproveAccount = navController::navigateToSavingsAccountApproval,
305+
303306
)
304307
clientCollateralDestination(
305308
onNavigateBack = navController::popBackStack,

feature/client/src/commonMain/kotlin/com/mifos/feature/client/recurringDepositAccount/RecurringDepositAccountScreen.kt

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,18 @@ import androidx.compose.foundation.layout.padding
3030
import androidx.compose.foundation.layout.width
3131
import androidx.compose.foundation.layout.wrapContentHeight
3232
import androidx.compose.foundation.lazy.LazyColumn
33-
import androidx.compose.foundation.lazy.items
33+
import androidx.compose.foundation.lazy.itemsIndexed
3434
import androidx.compose.material3.AlertDialog
3535
import androidx.compose.material3.ExperimentalMaterial3Api
3636
import androidx.compose.material3.Icon
3737
import androidx.compose.material3.Text
3838
import androidx.compose.material3.TextButton
3939
import androidx.compose.runtime.Composable
4040
import androidx.compose.runtime.getValue
41+
import androidx.compose.runtime.mutableStateOf
4142
import androidx.compose.runtime.remember
43+
import androidx.compose.runtime.saveable.rememberSaveable
44+
import androidx.compose.runtime.setValue
4245
import androidx.compose.ui.Modifier
4346
import androidx.lifecycle.compose.collectAsStateWithLifecycle
4447
import androidx.navigation.NavController
@@ -130,6 +133,8 @@ internal fun RecurringDepositAccountScaffold(
130133
modifier: Modifier = Modifier,
131134
onAction: (RecurringDepositAccountAction) -> Unit,
132135
) {
136+
var expandedIndex by rememberSaveable { mutableStateOf(-1) }
137+
133138
MifosScaffold(
134139
onBackPressed = {
135140
onAction(RecurringDepositAccountAction.NavigateBack)
@@ -187,7 +192,7 @@ internal fun RecurringDepositAccountScaffold(
187192
MifosEmptyCard(msg = stringResource(Res.string.client_empty_card_message))
188193
} else {
189194
LazyColumn {
190-
items(state.recurringDepositAccounts) { recurringDeposit ->
195+
itemsIndexed(state.recurringDepositAccounts) { index, recurringDeposit ->
191196
MifosActionsSavingsListingComponent(
192197
accountNo = recurringDeposit.accountNo ?: notAvailableText,
193198
savingsProduct = stringResource(Res.string.client_product_recurring_deposit_account),
@@ -205,6 +210,10 @@ internal fun RecurringDepositAccountScaffold(
205210
} else {
206211
notAvailableText
207212
},
213+
isExpanded = expandedIndex == index,
214+
onExpandToggle = {
215+
expandedIndex = if (expandedIndex == index) -1 else index
216+
},
208217
menuList = if (recurringDeposit.status?.submittedAndPendingApproval == true) {
209218
listOf(
210219
Actions.ViewAccount(MifosIcons.Calendar),
@@ -225,10 +234,8 @@ internal fun RecurringDepositAccountScaffold(
225234
)
226235
}
227236
is Actions.ApproveAccount -> {
228-
onAction(
229-
RecurringDepositAccountAction.ApproveAccount(
230-
recurringDeposit.accountNo ?: "",
231-
),
237+
RecurringDepositAccountAction.ApproveAccount(
238+
recurringDeposit.accountNo ?: "",
232239
)
233240
}
234241
else -> null

feature/client/src/commonMain/kotlin/com/mifos/feature/client/savingsAccounts/SavingsAccounts.kt

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import androidx.compose.foundation.layout.fillMaxWidth
2828
import androidx.compose.foundation.layout.height
2929
import androidx.compose.foundation.layout.padding
3030
import androidx.compose.foundation.lazy.LazyColumn
31-
import androidx.compose.foundation.lazy.items
31+
import androidx.compose.foundation.lazy.itemsIndexed
3232
import androidx.compose.material3.AlertDialog
3333
import androidx.compose.material3.ExperimentalMaterial3Api
3434
import androidx.compose.material3.Icon
@@ -38,7 +38,10 @@ import androidx.compose.material3.Text
3838
import androidx.compose.material3.TextButton
3939
import androidx.compose.runtime.Composable
4040
import androidx.compose.runtime.getValue
41+
import androidx.compose.runtime.mutableStateOf
4142
import androidx.compose.runtime.remember
43+
import androidx.compose.runtime.saveable.rememberSaveable
44+
import androidx.compose.runtime.setValue
4245
import androidx.compose.ui.Modifier
4346
import androidx.compose.ui.unit.dp
4447
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -54,6 +57,7 @@ import com.mifos.core.ui.components.MifosBreadcrumbNavBar
5457
import com.mifos.core.ui.components.MifosProgressIndicator
5558
import com.mifos.core.ui.components.MifosSearchBar
5659
import com.mifos.core.ui.util.EventsEffect
60+
import com.mifos.room.entities.accounts.savings.SavingAccountDepositTypeEntity
5761
import org.jetbrains.compose.resources.painterResource
5862
import org.jetbrains.compose.resources.stringResource
5963
import org.koin.compose.viewmodel.koinViewModel
@@ -63,27 +67,32 @@ internal fun SavingsAccountsScreenRoute(
6367
navigateBack: () -> Unit,
6468
navController: NavController,
6569
viewModel: SavingsAccountsViewModel = koinViewModel(),
66-
navigateToViewAccount: (Int) -> Unit,
70+
navigateToViewAccount: (Int, SavingAccountDepositTypeEntity) -> Unit,
71+
navigateToApproveAccount: (Int) -> Unit,
6772
) {
6873
val state by viewModel.stateFlow.collectAsStateWithLifecycle()
6974

7075
EventsEffect(viewModel.eventFlow) { event ->
7176
when (event) {
7277
SavingsAccountEvent.NavigateBack -> navigateBack()
73-
is SavingsAccountEvent.ViewAccount -> navigateToViewAccount(2)
74-
SavingsAccountEvent.ApproveAccount -> {}
78+
is SavingsAccountEvent.ViewAccount -> navigateToViewAccount(
79+
event.accountId,
80+
event.accountType,
81+
)
82+
83+
is SavingsAccountEvent.ApproveAccount -> navigateToApproveAccount(event.accountId)
7584
}
7685
}
7786

78-
SavingsAccountsDialog(
87+
SavingsAccountsScreen(
7988
state = state,
8089
onAction = remember(viewModel) { { viewModel.trySendAction(it) } },
90+
navController = navController,
8191
)
8292

83-
SavingsAccountsScreen(
93+
SavingsAccountsDialog(
8494
state = state,
8595
onAction = remember(viewModel) { { viewModel.trySendAction(it) } },
86-
navController = navController,
8796
)
8897
}
8998

@@ -93,6 +102,8 @@ fun SavingsAccountsScreen(
93102
state: SavingsAccountState,
94103
navController: NavController,
95104
) {
105+
var expandedIndex by rememberSaveable { mutableStateOf(-1) }
106+
96107
MifosScaffold(
97108
title = stringResource(Res.string.update_default_account_title),
98109
onBackPressed = { onAction(SavingsAccountAction.NavigateBack) },
@@ -122,7 +133,13 @@ fun SavingsAccountsScreen(
122133
if (state.isSearchBarActive) {
123134
MifosSearchBar(
124135
query = state.searchText,
125-
onQueryChange = { onAction.invoke(SavingsAccountAction.UpdateSearchValue(it)) },
136+
onQueryChange = {
137+
onAction.invoke(
138+
SavingsAccountAction.UpdateSearchValue(
139+
it,
140+
),
141+
)
142+
},
126143
onSearchClick = { onAction.invoke(SavingsAccountAction.OnSearchClick) },
127144
onBackClick = { onAction.invoke(SavingsAccountAction.ToggleSearch) },
128145
)
@@ -134,7 +151,7 @@ fun SavingsAccountsScreen(
134151
EmptySavingsCard()
135152
} else {
136153
LazyColumn {
137-
items(state.savingsAccounts) { savings ->
154+
itemsIndexed(state.savingsAccounts) { index, savings ->
138155
MifosActionsSavingsListingComponent(
139156
accountNo = savings.accountNo.toString(),
140157
savingsProduct = stringResource(Res.string.client_product_saving_account),
@@ -159,7 +176,9 @@ fun SavingsAccountsScreen(
159176
when (actions) {
160177
is Actions.ViewAccount -> onAction.invoke(
161178
SavingsAccountAction.ViewAccount(
162-
state.clientId,
179+
savings.id ?: 0,
180+
savings.depositType
181+
?: SavingAccountDepositTypeEntity(),
163182
),
164183
)
165184

@@ -179,6 +198,11 @@ fun SavingsAccountsScreen(
179198
} else {
180199
stringResource(Res.string.client_savings_not_avilable)
181200
},
201+
isExpanded = expandedIndex == index,
202+
onExpandToggle = {
203+
expandedIndex =
204+
if (expandedIndex == index) -1 else index
205+
},
182206
)
183207

184208
Spacer(modifier = Modifier.height(DesignToken.spacing.small))

feature/client/src/commonMain/kotlin/com/mifos/feature/client/savingsAccounts/SavingsAccountsRoute.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ package com.mifos.feature.client.savingsAccounts
1212
import androidx.navigation.NavController
1313
import androidx.navigation.NavGraphBuilder
1414
import androidx.navigation.compose.composable
15+
import com.mifos.room.entities.accounts.savings.SavingAccountDepositTypeEntity
1516
import kotlinx.serialization.Serializable
1617

1718
@Serializable
@@ -22,12 +23,14 @@ data class SavingsAccountsRoute(
2223
fun NavGraphBuilder.savingsAccountsDestination(
2324
navigateBack: () -> Unit,
2425
navController: NavController,
25-
navigateToViewAccount: (Int) -> Unit,
26+
navigateToViewAccount: (Int, SavingAccountDepositTypeEntity) -> Unit,
27+
navigateToApproveAccount: (Int) -> Unit,
2628
) {
2729
composable<SavingsAccountsRoute> {
2830
SavingsAccountsScreenRoute(
2931
navigateBack = navigateBack,
3032
navigateToViewAccount = navigateToViewAccount,
33+
navigateToApproveAccount = navigateToApproveAccount,
3134
navController = navController,
3235
)
3336
}

feature/client/src/commonMain/kotlin/com/mifos/feature/client/savingsAccounts/SavingsAccountsViewModel.kt

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,11 @@ internal class SavingsAccountsViewModel(
2929

3030
override fun handleAction(action: SavingsAccountAction) {
3131
when (action) {
32-
is SavingsAccountAction.ApproveAccount -> sendEvent(SavingsAccountEvent.ApproveAccount)
32+
is SavingsAccountAction.ApproveAccount -> sendEvent(
33+
SavingsAccountEvent.ApproveAccount(
34+
action.accountId,
35+
),
36+
)
3337

3438
SavingsAccountAction.ToggleFilter -> {
3539
mutableStateFlow.update {
@@ -44,7 +48,7 @@ internal class SavingsAccountsViewModel(
4448
}
4549

4650
is SavingsAccountAction.ViewAccount -> {
47-
sendEvent(SavingsAccountEvent.ViewAccount(state.clientId))
51+
sendEvent(SavingsAccountEvent.ViewAccount(action.accountId, action.accountType))
4852
}
4953

5054
SavingsAccountAction.Refresh -> {
@@ -127,8 +131,9 @@ data class SavingsAccountState(
127131

128132
sealed interface SavingsAccountEvent {
129133
data object NavigateBack : SavingsAccountEvent
130-
data object ApproveAccount : SavingsAccountEvent
131-
data class ViewAccount(val id: Int) : SavingsAccountEvent
134+
data class ApproveAccount(val accountId: Int) : SavingsAccountEvent
135+
data class ViewAccount(val accountId: Int, val accountType: SavingAccountDepositTypeEntity) :
136+
SavingsAccountEvent
132137
}
133138

134139
sealed interface SavingsAccountAction {
@@ -137,7 +142,9 @@ sealed interface SavingsAccountAction {
137142
data object ToggleFilter : SavingsAccountAction
138143
data object Refresh : SavingsAccountAction
139144
data class ApproveAccount(val accountId: Int) : SavingsAccountAction
140-
data class ViewAccount(val accountId: Int) : SavingsAccountAction
145+
data class ViewAccount(val accountId: Int, val accountType: SavingAccountDepositTypeEntity) :
146+
SavingsAccountAction
147+
141148
data class UpdateSearchValue(val query: String) : SavingsAccountAction
142149
data object OnSearchClick : SavingsAccountAction
143150
data object CloseDialog : SavingsAccountAction

0 commit comments

Comments
 (0)