diff --git a/feature/collectionSheet/build.gradle.kts b/feature/collectionSheet/build.gradle.kts index 8f7c9bf5993..818cf861299 100644 --- a/feature/collectionSheet/build.gradle.kts +++ b/feature/collectionSheet/build.gradle.kts @@ -25,6 +25,7 @@ kotlin { implementation(compose.ui) implementation(projects.core.domain) implementation(libs.kotlinx.serialization.json) + implementation(compose.components.uiToolingPreview) implementation(libs.coil.core) implementation(libs.coil.kt) @@ -32,4 +33,8 @@ kotlin { } } +} + +dependencies { + debugImplementation(compose.uiTooling) } \ No newline at end of file diff --git a/feature/collectionSheet/src/commonMain/composeResources/values/strings.xml b/feature/collectionSheet/src/commonMain/composeResources/values/strings.xml index c9661223da9..446d7badd56 100644 --- a/feature/collectionSheet/src/commonMain/composeResources/values/strings.xml +++ b/feature/collectionSheet/src/commonMain/composeResources/values/strings.xml @@ -63,5 +63,4 @@ Productive Collection Sheet Productive Sheet Submitted Successfully Collection Sheet Submitted Successfully - \ No newline at end of file diff --git a/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/individualCollectionSheet/IndividualCollectionSheetScreen.kt b/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/individualCollectionSheet/IndividualCollectionSheetScreen.kt index 74b23639ab0..7d14e73d2c9 100644 --- a/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/individualCollectionSheet/IndividualCollectionSheetScreen.kt +++ b/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/individualCollectionSheet/IndividualCollectionSheetScreen.kt @@ -25,16 +25,16 @@ import androidx.compose.ui.Modifier import com.mifos.core.designsystem.component.MifosScaffold import com.mifos.core.designsystem.component.MifosTabRow import com.mifos.core.designsystem.utility.TabContent -import com.mifos.core.ui.util.DevicePreview import com.mifos.feature.individualCollectionSheet.newIndividualCollectionSheet.NewIndividualCollectionSheetScreen import com.mifos.feature.individualCollectionSheet.savedIndividualCollectionSheet.SavedIndividualCollectionSheetCompose import com.mifos.room.entities.collectionsheet.IndividualCollectionSheet import org.jetbrains.compose.resources.stringResource +import org.jetbrains.compose.ui.tooling.preview.Preview @Composable internal fun IndividualCollectionSheetScreen( onBackPressed: () -> Unit, - onDetail: (String, IndividualCollectionSheet) -> Unit, + onDetail: (IndividualCollectionSheet) -> Unit, ) { val snackbarHostState = remember { SnackbarHostState() } @@ -69,8 +69,8 @@ enum class IndividualCollectionSheetScreenContents { SAVED, } -@DevicePreview +@Preview @Composable private fun IndividualCollectionSheetScreenPreview() { - IndividualCollectionSheetScreen(onBackPressed = {}, onDetail = { _, _ -> }) + IndividualCollectionSheetScreen(onBackPressed = {}, onDetail = { _ -> }) } diff --git a/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/individualCollectionSheetDetails/IndividualCollectionSheetDetailsScreen.kt b/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/individualCollectionSheetDetails/IndividualCollectionSheetDetailsScreen.kt index c2194d573b8..6739789baa2 100644 --- a/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/individualCollectionSheetDetails/IndividualCollectionSheetDetailsScreen.kt +++ b/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/individualCollectionSheetDetails/IndividualCollectionSheetDetailsScreen.kt @@ -30,6 +30,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.Icon @@ -58,14 +59,15 @@ import com.mifos.core.designsystem.component.MifosSweetError import com.mifos.core.designsystem.icon.MifosIcons import com.mifos.core.model.objects.account.loan.PaymentTypeOptions import com.mifos.core.model.objects.collectionsheets.LoanAndClientName +import com.mifos.core.model.objects.collectionsheets.LoanCollectionSheet import com.mifos.core.network.model.IndividualCollectionSheetPayload -import com.mifos.core.ui.util.DevicePreview import com.mifos.room.entities.collectionsheet.ClientCollectionSheet import com.mifos.room.entities.collectionsheet.IndividualCollectionSheet import com.mifos.room.entities.noncore.BulkRepaymentTransactions import kotlinx.coroutines.launch import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource +import org.jetbrains.compose.ui.tooling.preview.Preview import org.koin.compose.viewmodel.koinViewModel @Composable @@ -178,17 +180,17 @@ internal fun IndividualCollectionSheetDetailsScreen( } else { LazyColumn { sheet.clients?.toList()?.let { - itemsIndexed(it) { index, client -> + itemsIndexed(it.zip(loansAndClientNames)) { index,(client, loanAndClientName) -> IndividualCollectionSheetItem( client = client, - index = index, + loan = loanAndClientName.loan, onClick = { sheet.paymentTypeOptions?.let { paymentTypeOptions -> submit( index, payload, - paymentTypeOptions.map { paymentTypeOption -> paymentTypeOption.name.toString() }, - loansAndClientNames[index], + paymentTypeOptions.map { it.name.toString() }, + loanAndClientName, paymentTypeOptions.toList(), client.clientId, ) @@ -206,10 +208,11 @@ internal fun IndividualCollectionSheetDetailsScreen( @Composable private fun IndividualCollectionSheetItem( client: ClientCollectionSheet, - index: Int, + loan: LoanCollectionSheet?, modifier: Modifier = Modifier, onClick: () -> Unit, ) { + OutlinedCard( modifier = modifier .padding(6.dp) @@ -246,18 +249,16 @@ private fun IndividualCollectionSheetItem( Text( text = it, style = MaterialTheme.typography.bodyLarge, - ) } Row { Text( text = stringResource(Res.string.feature_collection_sheet_total_due), style = MaterialTheme.typography.bodyMedium, - ) Spacer(modifier = Modifier.width(16.dp)) Text( - text = client.loans?.get(index)?.totalDue.toString(), + text = (loan?.totalDue ?: 0.0).toString(), style = MaterialTheme.typography.bodyMedium, ) } @@ -268,18 +269,16 @@ private fun IndividualCollectionSheetItem( ) Spacer(modifier = Modifier.width(16.dp)) Text( - text = client.loans?.get(index)?.chargesDue.toString(), + text = (loan?.chargesDue ?: 0.0).toString(), + style = MaterialTheme.typography.bodyMedium, + ) + } + if (loan?.productShortName != null) { + Text( + text = "${loan.productShortName} (#${loan.productShortName})", style = MaterialTheme.typography.bodyMedium, ) } - Text( - text = "${client.loans?.get(index)?.productShortName} (#${ - client.loans?.get( - index, - )?.productShortName - })", - style = MaterialTheme.typography.bodyMedium, - ) } Icon( imageVector = MifosIcons.ArrowForward, @@ -289,7 +288,7 @@ private fun IndividualCollectionSheetItem( } } -@DevicePreview +@Preview @Composable private fun IndividualCollectionSheetDetailsScreenEmptyPreview() { IndividualCollectionSheetDetailsScreen( @@ -303,7 +302,7 @@ private fun IndividualCollectionSheetDetailsScreenEmptyPreview() { ) } -@DevicePreview +@Preview @Composable private fun IndividualCollectionSheetDetailsScreenErrorPreview() { IndividualCollectionSheetDetailsScreen( @@ -317,7 +316,7 @@ private fun IndividualCollectionSheetDetailsScreenErrorPreview() { ) } -@DevicePreview +@Preview @Composable private fun IndividualCollectionSheetDetailsScreenLoadingPreview() { IndividualCollectionSheetDetailsScreen( @@ -331,7 +330,7 @@ private fun IndividualCollectionSheetDetailsScreenLoadingPreview() { ) } -@DevicePreview +@Preview @Composable private fun IndividualCollectionSheetDetailsScreenSuccessPreview() { IndividualCollectionSheetDetailsScreen( diff --git a/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/individualCollectionSheetDetails/IndividualCollectionSheetDetailsViewModel.kt b/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/individualCollectionSheetDetails/IndividualCollectionSheetDetailsViewModel.kt index 53e45085d8b..98acb5d141e 100644 --- a/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/individualCollectionSheetDetails/IndividualCollectionSheetDetailsViewModel.kt +++ b/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/individualCollectionSheetDetails/IndividualCollectionSheetDetailsViewModel.kt @@ -14,6 +14,7 @@ import androidclient.feature.collectionsheet.generated.resources.feature_collect import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import co.touchlab.kermit.Logger import com.mifos.core.common.utils.Constants import com.mifos.core.common.utils.DataState import com.mifos.core.domain.useCases.SaveIndividualCollectionSheetUseCase @@ -40,6 +41,12 @@ class IndividualCollectionSheetDetailsViewModel( IndividualCollectionSheet() } + init { + Logger.e("Revanth"){ + sheet.toString() + } + } + @Suppress("ktlint:standard:property-naming") private val uiStateInternal = MutableStateFlow( IndividualCollectionSheetDetailsUiState.Empty, diff --git a/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/navigation/CollectionSheetNavigation.kt b/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/navigation/CollectionSheetNavigation.kt index 905534f332a..1329eb91436 100644 --- a/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/navigation/CollectionSheetNavigation.kt +++ b/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/navigation/CollectionSheetNavigation.kt @@ -25,7 +25,6 @@ import com.mifos.feature.individualCollectionSheet.individualCollectionSheetDeta import com.mifos.feature.individualCollectionSheet.paymentDetails.PaymentDetailsScreenRoute import com.mifos.room.entities.collectionsheet.IndividualCollectionSheet import kotlinx.serialization.Serializable -import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json fun NavGraphBuilder.individualCollectionSheetNavGraph( @@ -38,7 +37,7 @@ fun NavGraphBuilder.individualCollectionSheetNavGraph( ) { individualCollectionSheetScreen( onBackPressed = onBackPressed, - onDetail = { _, sheet -> + onDetail = { sheet -> navController.navigateToIndividualCollectionSheetDetailScreen(sheet) }, @@ -55,7 +54,7 @@ fun NavGraphBuilder.individualCollectionSheetNavGraph( private fun NavGraphBuilder.individualCollectionSheetScreen( onBackPressed: () -> Unit, - onDetail: (String, IndividualCollectionSheet) -> Unit, + onDetail: (IndividualCollectionSheet) -> Unit, ) { composable( route = CollectionSheetScreens.IndividualCollectionSheetScreen.route, diff --git a/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/newIndividualCollectionSheet/NewIndividualCollectionSheetScreen.kt b/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/newIndividualCollectionSheet/NewIndividualCollectionSheetScreen.kt index 7ff2500e443..19eeb21b721 100644 --- a/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/newIndividualCollectionSheet/NewIndividualCollectionSheetScreen.kt +++ b/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/newIndividualCollectionSheet/NewIndividualCollectionSheetScreen.kt @@ -58,6 +58,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.mifos.core.common.utils.Constants import com.mifos.core.common.utils.DateHelper import com.mifos.core.designsystem.component.MifosBottomSheet import com.mifos.core.designsystem.component.MifosButton @@ -66,18 +67,20 @@ import com.mifos.core.designsystem.component.MifosDatePickerTextField import com.mifos.core.designsystem.component.MifosScaffold import com.mifos.core.designsystem.component.MifosTextFieldDropdown import com.mifos.core.network.model.RequestCollectionSheetPayload -import com.mifos.core.ui.util.DevicePreview import com.mifos.room.entities.collectionsheet.IndividualCollectionSheet import com.mifos.room.entities.organisation.OfficeEntity import com.mifos.room.entities.organisation.StaffEntity import kotlinx.datetime.Clock import org.jetbrains.compose.resources.stringResource +import org.jetbrains.compose.ui.tooling.preview.Preview +import org.jetbrains.compose.ui.tooling.preview.PreviewParameter +import org.jetbrains.compose.ui.tooling.preview.PreviewParameterProvider import org.koin.compose.viewmodel.koinViewModel @Composable internal fun NewIndividualCollectionSheetScreen( viewModel: NewIndividualCollectionSheetViewModel = koinViewModel(), - onDetail: (String, IndividualCollectionSheet) -> Unit, + onDetail: (IndividualCollectionSheet) -> Unit, ) { val state = viewModel.newIndividualCollectionSheetUiState.collectAsStateWithLifecycle().value @@ -92,8 +95,8 @@ internal fun NewIndividualCollectionSheetScreen( officeId = id transactionDate = date staffId = idStaff - locale = "en" - dateFormat = "dd-MM-yyyy" + locale = Constants.LOCALE_EN + dateFormat = DateHelper.SHORT_MONTH }, ) }, @@ -107,7 +110,7 @@ internal fun NewIndividualCollectionSheetScreen( getStaffList: (Int) -> Unit, generateCollection: (Int, Int, String) -> Unit, modifier: Modifier = Modifier, - onDetail: (String, IndividualCollectionSheet) -> Unit, + onDetail: (IndividualCollectionSheet) -> Unit, ) { val keyboardController = LocalSoftwareKeyboardController.current @@ -120,12 +123,16 @@ internal fun NewIndividualCollectionSheetScreen( var showCollectionSheetDialog by rememberSaveable { mutableStateOf(false) } var showDatePicker by rememberSaveable { mutableStateOf(false) } - var repaymentDate by rememberSaveable { mutableLongStateOf(Clock.System.now().toEpochMilliseconds()) } + var repaymentDate by rememberSaveable { + mutableLongStateOf( + Clock.System.now().toEpochMilliseconds(), + ) + } val datePickerState = rememberDatePickerState( initialSelectedDateMillis = repaymentDate, selectableDates = object : SelectableDates { override fun isSelectableDate(utcTimeMillis: Long): Boolean { - return utcTimeMillis >= Clock.System.now().toEpochMilliseconds() + return utcTimeMillis <= Clock.System.now().toEpochMilliseconds() } }, ) @@ -188,7 +195,6 @@ internal fun NewIndividualCollectionSheetScreen( showCollectionSheetDialog = false individualCollectionSheet?.let { onDetail( - DateHelper.getDateAsStringFromLong(repaymentDate), it, ) } @@ -229,15 +235,19 @@ internal fun NewIndividualCollectionSheetScreen( selectedStaff = "" }, onOptionSelected = { index, value -> - state.officeList[index].id.let { - getStaffList(it) - officeId = it + state.officeList.getOrNull(index)?.let { selectedOfficeEntity -> + selectedOfficeEntity.id.let { + getStaffList(it) + officeId = it + } + selectedOffice = selectedOfficeEntity.name.toString() + selectedStaff = "" } - selectedOffice = value - selectedStaff = "" + }, label = stringResource(Res.string.feature_collection_sheet_office), options = state.officeList.map { it.name.toString() }, + readOnly = true ) Spacer(modifier = Modifier.height(8.dp)) MifosDatePickerTextField( @@ -254,13 +264,15 @@ internal fun NewIndividualCollectionSheetScreen( selectedStaff = it }, onOptionSelected = { index, value -> - state.staffList[index].id?.let { + val selectedStaffEntity = state.staffList[index] + selectedStaffEntity.id?.let { staffId = it } selectedStaff = value }, label = stringResource(Res.string.feature_collection_sheet_staff), options = state.staffList.map { it.displayName.toString() }, + readOnly = true ) Row( modifier = Modifier @@ -388,46 +400,32 @@ private fun CollectionSheetDialogContent( ) } -@DevicePreview -@Composable -private fun NewIndividualCollectionSheetPreview() { - Column { - NewIndividualCollectionSheetScreen( - state = NewIndividualCollectionSheetUiState(staffList = sampleStaffList), - getStaffList = {}, - generateCollection = { _, _, _ -> - }, - onDetail = { _, _ -> }, - ) - NewIndividualCollectionSheetScreen( - state = NewIndividualCollectionSheetUiState(officeList = sampleOfficeList), - getStaffList = {}, - generateCollection = { _, _, _ -> - }, - onDetail = { _, _ -> }, - ) - NewIndividualCollectionSheetScreen( - state = NewIndividualCollectionSheetUiState(error = "Error Occurred"), - getStaffList = {}, - generateCollection = { _, _, _ -> - }, - onDetail = { _, _ -> }, - ) - NewIndividualCollectionSheetScreen( - state = NewIndividualCollectionSheetUiState(isLoading = true), - getStaffList = {}, - generateCollection = { _, _, _ -> - }, - onDetail = { _, _ -> }, - ) - NewIndividualCollectionSheetScreen( - state = NewIndividualCollectionSheetUiState(individualCollectionSheet = IndividualCollectionSheet()), - getStaffList = {}, - generateCollection = { _, _, _ -> - }, - onDetail = { _, _ -> }, +class NewIndividualCollectionSheetUiStateProvider : + PreviewParameterProvider { + + override val values: Sequence + get() = sequenceOf( + NewIndividualCollectionSheetUiState(staffList = sampleStaffList), + NewIndividualCollectionSheetUiState(officeList = sampleOfficeList), + NewIndividualCollectionSheetUiState(error = "Error Occurred"), + NewIndividualCollectionSheetUiState(isLoading = true), + NewIndividualCollectionSheetUiState(individualCollectionSheet = IndividualCollectionSheet()), ) - } +} + +@Preview +@Composable +private fun NewIndividualCollectionSheetPreview( + @PreviewParameter(NewIndividualCollectionSheetUiStateProvider::class) + newIndividualCollectionSheetUiState: NewIndividualCollectionSheetUiState, +) { + NewIndividualCollectionSheetScreen( + state = newIndividualCollectionSheetUiState, + getStaffList = {}, + generateCollection = { _, _, _ -> + }, + onDetail = { _ -> }, + ) } val sampleStaffList = List(10) { @@ -438,7 +436,7 @@ val sampleOfficeList = List(10) { OfficeEntity(id = it, name = "Name") } -@DevicePreview +@Preview @Composable private fun CollectionSheetDialogContentPreview() { CollectionSheetDialogContent(date = "19 June 2024", member = "5", fillNow = {}, onDismiss = {}) diff --git a/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/savedIndividualCollectionSheet/SavedIndividualCollectionSheetCompose.kt b/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/savedIndividualCollectionSheet/SavedIndividualCollectionSheetCompose.kt index b9fa65b409d..9e23bd9715f 100644 --- a/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/savedIndividualCollectionSheet/SavedIndividualCollectionSheetCompose.kt +++ b/feature/collectionSheet/src/commonMain/kotlin/com/mifos/feature/individualCollectionSheet/savedIndividualCollectionSheet/SavedIndividualCollectionSheetCompose.kt @@ -24,8 +24,8 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.sp -import com.mifos.core.ui.util.DevicePreview import org.jetbrains.compose.resources.stringResource +import org.jetbrains.compose.ui.tooling.preview.Preview @Composable internal fun SavedIndividualCollectionSheetCompose( @@ -55,7 +55,7 @@ internal fun SavedIndividualCollectionSheetCompose( } } -@DevicePreview +@Preview @Composable private fun SavedIndividualCollectionSheetComposePreview() { SavedIndividualCollectionSheetCompose()