diff --git a/build-logic/convention/src/main/kotlin/CMPFeatureConventionPlugin.kt b/build-logic/convention/src/main/kotlin/CMPFeatureConventionPlugin.kt index f5f1eb5c95..ee63c710bf 100644 --- a/build-logic/convention/src/main/kotlin/CMPFeatureConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/CMPFeatureConventionPlugin.kt @@ -17,8 +17,8 @@ class CMPFeatureConventionPlugin : Plugin { dependencies { add("commonMainImplementation", project(":core:ui")) add("commonMainImplementation", project(":core:designsystem")) - add("commonMainImplementation", project(":core:testing")) - add("commonMainImplementation", project(":core:data")) +// add("commonMainImplementation", project(":core:testing")) +// add("commonMainImplementation", project(":core:data")) add("commonMainImplementation", libs.findLibrary("koin.compose").get()) add("commonMainImplementation", libs.findLibrary("koin.compose.viewmodel").get()) diff --git a/core/designsystem/src/commonMain/kotlin/com/mifos/core/designsystem/component/MifosTextFieldDropdown.kt b/core/designsystem/src/commonMain/kotlin/com/mifos/core/designsystem/component/MifosTextFieldDropdown.kt index 4b6e416193..930b5cc016 100644 --- a/core/designsystem/src/commonMain/kotlin/com/mifos/core/designsystem/component/MifosTextFieldDropdown.kt +++ b/core/designsystem/src/commonMain/kotlin/com/mifos/core/designsystem/component/MifosTextFieldDropdown.kt @@ -42,7 +42,6 @@ fun MifosTextFieldDropdown( modifier: Modifier = Modifier .fillMaxWidth() .padding(start = 16.dp, end = 16.dp), - label: Int? = null, labelString: String? = null, readOnly: Boolean = false, ) { diff --git a/core/designsystem/src/commonMain/kotlin/com/mifos/core/designsystem/icon/MifosIcons.kt b/core/designsystem/src/commonMain/kotlin/com/mifos/core/designsystem/icon/MifosIcons.kt index afe6358275..c50cbb5f57 100644 --- a/core/designsystem/src/commonMain/kotlin/com/mifos/core/designsystem/icon/MifosIcons.kt +++ b/core/designsystem/src/commonMain/kotlin/com/mifos/core/designsystem/icon/MifosIcons.kt @@ -53,7 +53,10 @@ import androidx.compose.material.icons.outlined.DateRange import androidx.compose.material.icons.outlined.EventRepeat import androidx.compose.material.icons.outlined.Group import androidx.compose.material.icons.outlined.Home +import androidx.compose.material.icons.outlined.HomeWork import androidx.compose.material.icons.outlined.Mail +import androidx.compose.material.icons.outlined.Numbers +import androidx.compose.material.icons.outlined.PersonOutline import androidx.compose.material.icons.outlined.Visibility import androidx.compose.material.icons.outlined.VisibilityOff import androidx.compose.material.icons.outlined.Wallet @@ -152,5 +155,8 @@ object MifosIcons { val FlashOff = Icons.Default.FlashOff val Error2 = Icons.Filled.Error val Notifications = Icons.Filled.Notifications + val Numbers = Icons.Outlined.Numbers + val Homework = Icons.Outlined.HomeWork + val PersonOutline = Icons.Outlined.PersonOutline val NavigationDrawer = Icons.Default.Menu } diff --git a/feature/groups/build.gradle.kts b/feature/groups/build.gradle.kts index 8488698a39..036ce644f4 100644 --- a/feature/groups/build.gradle.kts +++ b/feature/groups/build.gradle.kts @@ -8,34 +8,51 @@ * See https://github.com/openMF/android-client/blob/master/LICENSE.md */ plugins { - alias(libs.plugins.mifos.android.feature) - alias(libs.plugins.mifos.android.library.compose) - alias(libs.plugins.mifos.android.library.jacoco) -} + alias(libs.plugins.mifos.cmp.feature) + alias(libs.plugins.mifos.kmp.koin) +// alias(libs.plugins.mifos.android.library.compose) +// alias(libs.plugins.mifos.android.library.jacoco) +} android { namespace = "com.mifos.feature.groups" } -dependencies { - implementation(projects.core.domain) - - // swipe refresh - implementation(libs.accompanist.swiperefresh) - - // paging 3 - implementation(libs.androidx.paging.runtime.ktx) - implementation(libs.androidx.paging.compose) - - //DBFlow dependencies - implementation(libs.dbflow) - - androidTestImplementation(libs.androidx.compose.ui.test) - debugApi(libs.androidx.compose.ui.test.manifest) - - testImplementation(libs.hilt.android.testing) - testImplementation(projects.core.testing) +kotlin{ + sourceSets{ + commonMain.dependencies { +// implementation(projects.core.domain) + implementation(compose.material3) + implementation(compose.components.resources) + implementation(compose.ui) + implementation(projects.core.model) +// implementation(projects.core.data) + implementation(projects.core.database) + implementation(projects.core.designsystem) + + } + } +} - androidTestImplementation(projects.core.testing) -} \ No newline at end of file +//dependencies { +// implementation(projects.core.domain) +// +// // swipe refresh +// implementation(libs.accompanist.swiperefresh) +// +// // paging 3 +// implementation(libs.androidx.paging.runtime.ktx) +// implementation(libs.androidx.paging.compose) +// +// //DBFlow dependencies +// implementation(libs.dbflow) +// +// androidTestImplementation(libs.androidx.compose.ui.test) +// debugApi(libs.androidx.compose.ui.test.manifest) +// +// testImplementation(libs.hilt.android.testing) +// testImplementation(projects.core.testing) +// +// androidTestImplementation(projects.core.testing) +//} \ No newline at end of file diff --git a/feature/groups/src/main/res/values/strings.xml b/feature/groups/src/commonMain/composeResources/values/strings.xml similarity index 100% rename from feature/groups/src/main/res/values/strings.xml rename to feature/groups/src/commonMain/composeResources/values/strings.xml diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/createNewGroup/CreateNewGroupScreen.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/createNewGroup/CreateNewGroupScreen.kt similarity index 83% rename from feature/groups/src/main/java/com/mifos/feature/groups/createNewGroup/CreateNewGroupScreen.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/createNewGroup/CreateNewGroupScreen.kt index 19a0de6040..1b992e2d8c 100644 --- a/feature/groups/src/main/java/com/mifos/feature/groups/createNewGroup/CreateNewGroupScreen.kt +++ b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/createNewGroup/CreateNewGroupScreen.kt @@ -9,8 +9,18 @@ */ package com.mifos.feature.groups.createNewGroup -import android.content.Context -import android.widget.Toast + +import androidclient.feature.groups.generated.resources.Res +import androidclient.feature.groups.generated.resources.feature_groups_activation_date +import androidclient.feature.groups.generated.resources.feature_groups_active +import androidclient.feature.groups.generated.resources.feature_groups_create_new_group +import androidclient.feature.groups.generated.resources.feature_groups_dismiss +import androidclient.feature.groups.generated.resources.feature_groups_external_id +import androidclient.feature.groups.generated.resources.feature_groups_groups +import androidclient.feature.groups.generated.resources.feature_groups_name +import androidclient.feature.groups.generated.resources.feature_groups_office_name_mandatory +import androidclient.feature.groups.generated.resources.feature_groups_select_date +import androidclient.feature.groups.generated.resources.feature_groups_submit import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.expandVertically import androidx.compose.animation.fadeIn @@ -50,12 +60,8 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import androidx.compose.ui.text.intl.Locale import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.mifos.core.designsystem.component.MifosCircularProgress @@ -65,12 +71,10 @@ import com.mifos.core.designsystem.component.MifosScaffold import com.mifos.core.designsystem.component.MifosSweetError import com.mifos.core.designsystem.component.MifosTextFieldDropdown import com.mifos.core.model.objects.responses.SaveResponse -import com.mifos.feature.groups.R import com.mifos.room.entities.group.GroupPayloadEntity import com.mifos.room.entities.organisation.OfficeEntity -import org.koin.androidx.compose.koinViewModel -import java.text.SimpleDateFormat -import java.util.Locale +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.viewmodel.koinViewModel /** * Created by Pronay Sarker on 30/06/2024 (7:53 AM) @@ -113,7 +117,7 @@ internal fun CreateNewGroupScreen( MifosScaffold( modifier = modifier, - title = stringResource(id = R.string.feature_groups_create_new_group), + title = stringResource(Res.string.feature_groups_create_new_group), onBackPressed = {}, snackbarHostState = snackbarHostState, ) { paddingValues -> @@ -125,7 +129,7 @@ internal fun CreateNewGroupScreen( when (uiState) { is CreateNewGroupUiState.ShowFetchingError -> { MifosSweetError( - message = uiState.message, + message = stringResource(uiState.message), onclick = { onRetry.invoke() }, ) } @@ -181,6 +185,7 @@ private fun CreateNewGroupContent( val density = LocalDensity.current val scrollState = rememberScrollState() var officeId by rememberSaveable { mutableIntStateOf(0) } + //todo var activationDate by rememberSaveable { mutableLongStateOf(System.currentTimeMillis()) } var submittedOnDate by rememberSaveable { mutableLongStateOf(System.currentTimeMillis()) } @@ -222,7 +227,7 @@ private fun CreateNewGroupContent( submitDatePicker = false activationDatePicker = false }, - ) { Text(stringResource(id = R.string.feature_groups_select_date)) } + ) { Text(stringResource(androidclient.feature.groups.generated.resources.Res.string.feature_groups_select_date)) } }, dismissButton = { TextButton( @@ -230,7 +235,7 @@ private fun CreateNewGroupContent( activationDatePicker = false submitDatePicker = false }, - ) { Text(stringResource(id = R.string.feature_groups_dismiss)) } + ) { Text(stringResource(Res.string.feature_groups_dismiss)) } }, ) { DatePicker(state = if (submitDatePicker) sumittedDatePickerState else activateDatePickerState) @@ -247,7 +252,7 @@ private fun CreateNewGroupContent( MifosOutlinedTextField( value = groupName, onValueChange = { groupName = it }, - label = stringResource(id = R.string.feature_groups_name), + label = stringResource(Res.string.feature_groups_name), error = null, ) @@ -264,13 +269,14 @@ private fun CreateNewGroupContent( officeId = it } }, - label = R.string.feature_groups_office_name_mandatory, + labelString = stringResource(Res.string.feature_groups_office_name_mandatory), options = officeList.map { it.name.toString() }, readOnly = true, ) Spacer(modifier = Modifier.height(16.dp)) + //todo use kotlin MifosDatePickerTextField( value = SimpleDateFormat("dd MMMM yyyy", Locale.getDefault()).format( submittedOnDate, @@ -286,7 +292,7 @@ private fun CreateNewGroupContent( MifosOutlinedTextField( value = externalId, onValueChange = { externalId = it }, - label = stringResource(id = R.string.feature_groups_external_id), + label = stringResource(Res.string.feature_groups_external_id), error = null, ) @@ -303,7 +309,7 @@ private fun CreateNewGroupContent( checked = isActive, onCheckedChange = { isActive = !isActive }, ) - Text(text = stringResource(id = R.string.feature_groups_active)) + Text(text = stringResource(Res.string.feature_groups_active)) } AnimatedVisibility( @@ -323,7 +329,8 @@ private fun CreateNewGroupContent( value = SimpleDateFormat("dd MMMM yyyy", Locale.getDefault()).format( activationDate, ), - label = stringResource(R.string.feature_groups_activation_date), + + label = stringResource(Res.string.feature_groups_activation_date), openDatePicker = { activationDatePicker = true }, @@ -384,11 +391,11 @@ private fun CreateNewGroupContent( // } }, ) { - Text(text = stringResource(id = R.string.feature_groups_submit)) + Text(text = stringResource(Res.string.feature_groups_submit)) } } } - +// todo move into viewmodels private fun validateFields(groupName: String, officeName: String, context: Context): Boolean { return when { groupName.isEmpty() -> { @@ -431,27 +438,27 @@ private fun validateFields(groupName: String, officeName: String, context: Conte } } -private class CreateNewGroupScreenPreviewProvider : PreviewParameterProvider { - override val values: Sequence - get() = sequenceOf( - CreateNewGroupUiState.ShowProgressbar, - CreateNewGroupUiState.ShowOffices(listOf()), - CreateNewGroupUiState.ShowFetchingError("Failed to fetch Offices"), - CreateNewGroupUiState.ShowGroupCreatedSuccessfully(saveResponse = SaveResponse()), - ) -} - -@Composable -@Preview(showSystemUi = true) -private fun PreviewCreateNewGroupScreen( - @PreviewParameter(CreateNewGroupScreenPreviewProvider::class) createNewGroupUiState: CreateNewGroupUiState, -) { - CreateNewGroupScreen( - uiState = createNewGroupUiState, - onRetry = {}, - invokeGroupCreation = {}, - onGroupCreated = { _ -> - }, - getResponse = { "" }, - ) -} +//private class CreateNewGroupScreenPreviewProvider : PreviewParameterProvider { +// override val values: Sequence +// get() = sequenceOf( +// CreateNewGroupUiState.ShowProgressbar, +// CreateNewGroupUiState.ShowOffices(listOf()), +// CreateNewGroupUiState.ShowFetchingError("Failed to fetch Offices"), +// CreateNewGroupUiState.ShowGroupCreatedSuccessfully(saveResponse = SaveResponse()), +// ) +//} +// +//@Composable +//@Preview(showSystemUi = true) +//private fun PreviewCreateNewGroupScreen( +// @PreviewParameter(CreateNewGroupScreenPreviewProvider::class) createNewGroupUiState: CreateNewGroupUiState, +//) { +// CreateNewGroupScreen( +// uiState = createNewGroupUiState, +// onRetry = {}, +// invokeGroupCreation = {}, +// onGroupCreated = { _ -> +// }, +// getResponse = { "" }, +// ) +//} diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/createNewGroup/CreateNewGroupUiState.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/createNewGroup/CreateNewGroupUiState.kt similarity index 85% rename from feature/groups/src/main/java/com/mifos/feature/groups/createNewGroup/CreateNewGroupUiState.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/createNewGroup/CreateNewGroupUiState.kt index 28b0026fbd..f856c69174 100644 --- a/feature/groups/src/main/java/com/mifos/feature/groups/createNewGroup/CreateNewGroupUiState.kt +++ b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/createNewGroup/CreateNewGroupUiState.kt @@ -11,6 +11,7 @@ package com.mifos.feature.groups.createNewGroup import com.mifos.core.model.objects.responses.SaveResponse import com.mifos.room.entities.organisation.OfficeEntity +import org.jetbrains.compose.resources.StringResource /** * Created by Aditya Gupta on 10/08/23. @@ -19,7 +20,7 @@ sealed class CreateNewGroupUiState { data object ShowProgressbar : CreateNewGroupUiState() - data class ShowFetchingError(val message: String) : CreateNewGroupUiState() + data class ShowFetchingError(val message: StringResource) : CreateNewGroupUiState() data class ShowOffices(val offices: List) : CreateNewGroupUiState() diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/createNewGroup/CreateNewGroupViewModel.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/createNewGroup/CreateNewGroupViewModel.kt similarity index 100% rename from feature/groups/src/main/java/com/mifos/feature/groups/createNewGroup/CreateNewGroupViewModel.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/createNewGroup/CreateNewGroupViewModel.kt diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/di/GroupsModule.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/di/GroupsModule.kt similarity index 100% rename from feature/groups/src/main/java/com/mifos/feature/groups/di/GroupsModule.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/di/GroupsModule.kt diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/groupDetails/GroupDetailsScreen.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/groupDetails/GroupDetailsScreen.kt similarity index 87% rename from feature/groups/src/main/java/com/mifos/feature/groups/groupDetails/GroupDetailsScreen.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/groupDetails/GroupDetailsScreen.kt index 8f4c7d38fa..5298a36153 100644 --- a/feature/groups/src/main/java/com/mifos/feature/groups/groupDetails/GroupDetailsScreen.kt +++ b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/groupDetails/GroupDetailsScreen.kt @@ -9,6 +9,22 @@ */ package com.mifos.feature.groups.groupDetails +import androidclient.feature.groups.generated.resources.Res +import androidclient.feature.groups.generated.resources.feature_groups_accounts +import androidclient.feature.groups.generated.resources.feature_groups_activate_group +import androidclient.feature.groups.generated.resources.feature_groups_activation_date +import androidclient.feature.groups.generated.resources.feature_groups_add_loan_account +import androidclient.feature.groups.generated.resources.feature_groups_add_savings_account +import androidclient.feature.groups.generated.resources.feature_groups_documents +import androidclient.feature.groups.generated.resources.feature_groups_external_id +import androidclient.feature.groups.generated.resources.feature_groups_group +import androidclient.feature.groups.generated.resources.feature_groups_group_clients +import androidclient.feature.groups.generated.resources.feature_groups_loan_account +import androidclient.feature.groups.generated.resources.feature_groups_more_group_info +import androidclient.feature.groups.generated.resources.feature_groups_notes +import androidclient.feature.groups.generated.resources.feature_groups_office +import androidclient.feature.groups.generated.resources.feature_groups_savings_account +import androidclient.feature.groups.generated.resources.feature_groups_staff import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.LinearOutSlowInEasing import androidx.compose.animation.core.animateFloatAsState @@ -31,9 +47,6 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.KeyboardArrowDown import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.outlined.DateRange -import androidx.compose.material.icons.outlined.HomeWork -import androidx.compose.material.icons.outlined.Numbers -import androidx.compose.material.icons.outlined.PersonOutline import androidx.compose.material3.Button import androidx.compose.material3.Card import androidx.compose.material3.CardDefaults @@ -57,14 +70,10 @@ import androidx.compose.ui.graphics.Color.Companion.Black import androidx.compose.ui.graphics.Color.Companion.DarkGray import androidx.compose.ui.graphics.Color.Companion.White import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.tooling.preview.PreviewParameter -import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -74,13 +83,15 @@ import com.mifos.core.designsystem.component.MifosCircularProgress import com.mifos.core.designsystem.component.MifosMenuDropDownItem import com.mifos.core.designsystem.component.MifosScaffold import com.mifos.core.designsystem.component.MifosSweetError -import com.mifos.feature.groups.R +import com.mifos.core.designsystem.icon.MifosIcons +import com.mifos.core.ui.components.MifosIcon import com.mifos.room.entities.accounts.loans.LoanAccountEntity import com.mifos.room.entities.accounts.savings.SavingAccountDepositTypeEntity import com.mifos.room.entities.accounts.savings.SavingsAccountEntity import com.mifos.room.entities.client.ClientEntity import com.mifos.room.entities.group.GroupEntity -import org.koin.androidx.compose.koinViewModel +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.viewmodel.koinViewModel @Composable internal fun GroupDetailsScreen( @@ -156,7 +167,7 @@ internal fun GroupDetailsScreen( MifosScaffold( modifier = modifier, - title = stringResource(id = R.string.feature_groups_group), + title = stringResource(Res.string.feature_groups_group), onBackPressed = onBackPressed, actions = { IconButton(onClick = { showMenu = showMenu.not() }) { @@ -168,42 +179,42 @@ internal fun GroupDetailsScreen( onDismissRequest = { showMenu = false }, ) { MifosMenuDropDownItem( - option = stringResource(id = R.string.feature_groups_add_loan_account), + option = stringResource(Res.string.feature_groups_add_loan_account), onClick = { onMenuClick(MenuItems.ADD_LOAN_ACCOUNT) showMenu = false }, ) MifosMenuDropDownItem( - option = stringResource(id = R.string.feature_groups_add_savings_account), + option = stringResource(Res.string.feature_groups_add_savings_account), onClick = { onMenuClick(MenuItems.ADD_SAVINGS_ACCOUNT) showMenu = false }, ) MifosMenuDropDownItem( - option = stringResource(id = R.string.feature_groups_documents), + option = stringResource(Res.string.feature_groups_documents), onClick = { onMenuClick(MenuItems.DOCUMENTS) showMenu = false }, ) MifosMenuDropDownItem( - option = stringResource(id = R.string.feature_groups_group_clients), + option = stringResource(Res.string.feature_groups_group_clients), onClick = { onMenuClick(MenuItems.GROUP_CLIENTS) showMenu = false }, ) MifosMenuDropDownItem( - option = stringResource(id = R.string.feature_groups_more_group_info), + option = stringResource(Res.string.feature_groups_more_group_info), onClick = { onMenuClick(MenuItems.MORE_GROUP_INFO) showMenu = false }, ) MifosMenuDropDownItem( - option = stringResource(id = R.string.feature_groups_notes), + option = stringResource(Res.string.feature_groups_notes), onClick = { onMenuClick(MenuItems.NOTES) showMenu = false @@ -225,7 +236,7 @@ internal fun GroupDetailsScreen( // ), ) { Text( - text = stringResource(id = R.string.feature_groups_activate_group), + text = stringResource(Res.string.feature_groups_activate_group), fontSize = 16.sp, ) } @@ -234,7 +245,7 @@ internal fun GroupDetailsScreen( ) { paddingValue -> Column(modifier = Modifier.padding(paddingValue)) { when (state) { - is GroupDetailsUiState.Error -> MifosSweetError(message = stringResource(id = state.message)) { + is GroupDetailsUiState.Error -> MifosSweetError(message = stringResource(state.message)) { } is GroupDetailsUiState.Loading -> MifosCircularProgress() @@ -286,27 +297,27 @@ fun GroupDetailsContent( } group.externalId?.let { MifosCenterDetailsText( - icon = Icons.Outlined.Numbers, - field = stringResource(id = R.string.feature_groups_external_id), + icon = MifosIcons.Numbers, + field = stringResource(Res.string.feature_groups_external_id), value = it, ) } MifosCenterDetailsText( icon = Icons.Outlined.DateRange, - field = stringResource(id = R.string.feature_groups_activation_date), + field = stringResource(Res.string.feature_groups_activation_date), value = Utils.getStringOfDate(group.activationDate), ) group.officeName?.let { MifosCenterDetailsText( - icon = Icons.Outlined.HomeWork, - field = stringResource(id = R.string.feature_groups_office), + icon = MifosIcons.Homework, + field = stringResource(Res.string.feature_groups_office), value = it, ) } group.staffName?.let { MifosCenterDetailsText( - icon = Icons.Outlined.PersonOutline, - field = stringResource(id = R.string.feature_groups_staff), + icon = MifosIcons.PersonOutline, + field = stringResource(Res.string.feature_groups_staff), value = it, ) } @@ -314,7 +325,7 @@ fun GroupDetailsContent( if (loanAccounts.isNotEmpty() || savingsAccounts.isNotEmpty()) { Text( modifier = Modifier.padding(start = 16.dp), - text = stringResource(id = R.string.feature_groups_accounts), + text = stringResource(Res.string.feature_groups_accounts), style = TextStyle( fontSize = 21.sp, fontWeight = FontWeight.Medium, @@ -327,14 +338,14 @@ fun GroupDetailsContent( } if (loanAccounts.isNotEmpty()) { MifosLoanAccountExpendableCard( - stringResource(id = R.string.feature_groups_loan_account), + stringResource(Res.string.feature_groups_loan_account), loanAccounts, loanAccountSelected = loanAccountSelected, ) } if (savingsAccounts.isNotEmpty()) { MifosSavingsAccountExpendableCard( - stringResource(id = R.string.feature_groups_savings_account), + stringResource(Res.string.feature_groups_savings_account), savingsAccounts, savingsAccountSelected = savingsAccountSelected, ) @@ -748,34 +759,34 @@ private fun MifosSavingsAccountsLazyColumn( } } -private class GroupDetailsUiStateProvider : PreviewParameterProvider { - - override val values: Sequence - get() = sequenceOf( - GroupDetailsUiState.Loading, - GroupDetailsUiState.Error(R.string.feature_groups_failed_to_fetch_group_and_account), - GroupDetailsUiState.ShowGroup(group = GroupEntity(name = "Group", active = true)), - GroupDetailsUiState.ShowGroup(group = GroupEntity(name = "Group", active = false)), - ) -} - -@Preview -@Composable -private fun GroupDetailsScreenPreview( - @PreviewParameter(GroupDetailsUiStateProvider::class) state: GroupDetailsUiState, -) { - GroupDetailsScreen( - state = state, - onBackPressed = {}, - onMenuClick = {}, - loanAccounts = sampleLoanAccountList, - savingsAccounts = sampleSavingAccountList, - loanAccountSelected = {}, - savingsAccountSelected = { _, _ -> - }, - activateGroup = {}, - ) -} +//private class GroupDetailsUiStateProvider : PreviewParameterProvider { +// +// override val values: Sequence +// get() = sequenceOf( +// GroupDetailsUiState.Loading, +// GroupDetailsUiState.Error(R.string.feature_groups_failed_to_fetch_group_and_account), +// GroupDetailsUiState.ShowGroup(group = GroupEntity(name = "Group", active = true)), +// GroupDetailsUiState.ShowGroup(group = GroupEntity(name = "Group", active = false)), +// ) +//} +// +//@Preview +//@Composable +//private fun GroupDetailsScreenPreview( +// @PreviewParameter(GroupDetailsUiStateProvider::class) state: GroupDetailsUiState, +//) { +// GroupDetailsScreen( +// state = state, +// onBackPressed = {}, +// onMenuClick = {}, +// loanAccounts = sampleLoanAccountList, +// savingsAccounts = sampleSavingAccountList, +// loanAccountSelected = {}, +// savingsAccountSelected = { _, _ -> +// }, +// activateGroup = {}, +// ) +//} enum class MenuItems { ADD_LOAN_ACCOUNT, diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/groupDetails/GroupDetailsUiState.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/groupDetails/GroupDetailsUiState.kt similarity index 83% rename from feature/groups/src/main/java/com/mifos/feature/groups/groupDetails/GroupDetailsUiState.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/groupDetails/GroupDetailsUiState.kt index f52af0d347..5830f0dff6 100644 --- a/feature/groups/src/main/java/com/mifos/feature/groups/groupDetails/GroupDetailsUiState.kt +++ b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/groupDetails/GroupDetailsUiState.kt @@ -10,6 +10,7 @@ package com.mifos.feature.groups.groupDetails import com.mifos.room.entities.group.GroupEntity +import org.jetbrains.compose.resources.StringResource /** * Created by Aditya Gupta on 06/08/23. @@ -18,7 +19,7 @@ sealed class GroupDetailsUiState { data object Loading : GroupDetailsUiState() - data class Error(val message: Int) : GroupDetailsUiState() + data class Error(val message: StringResource) : GroupDetailsUiState() data class ShowGroup(val group: GroupEntity) : GroupDetailsUiState() } diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/groupDetails/GroupDetailsViewModel.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/groupDetails/GroupDetailsViewModel.kt similarity index 100% rename from feature/groups/src/main/java/com/mifos/feature/groups/groupDetails/GroupDetailsViewModel.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/groupDetails/GroupDetailsViewModel.kt diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/groupList/GroupsListScreen.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/groupList/GroupsListScreen.kt similarity index 97% rename from feature/groups/src/main/java/com/mifos/feature/groups/groupList/GroupsListScreen.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/groupList/GroupsListScreen.kt index 96c028313f..16f2dabc65 100644 --- a/feature/groups/src/main/java/com/mifos/feature/groups/groupList/GroupsListScreen.kt +++ b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/groupList/GroupsListScreen.kt @@ -9,6 +9,8 @@ */ package com.mifos.feature.groups.groupList +import androidclient.feature.groups.generated.resources.Res +import androidclient.feature.groups.generated.resources.feature_groups_sync import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.tween @@ -77,7 +79,9 @@ import com.mifos.core.ui.components.SelectionModeTopAppBar import com.mifos.feature.groups.R import com.mifos.feature.groups.syncGroupDialog.SyncGroupDialogScreen import com.mifos.room.entities.group.GroupEntity +import org.jetbrains.compose.resources.stringResource import org.koin.androidx.compose.koinViewModel +import org.koin.compose.viewmodel.koinViewModel @Composable internal fun GroupsListRoute( @@ -178,7 +182,7 @@ fun GroupsListScreen( imageVector = MifosIcons.Sync, contentDescription = "Sync Items", ) - Text(text = stringResource(id = R.string.feature_groups_sync)) + Text(text = stringResource(Res.string.feature_groups_sync)) } }, ) diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/groupList/GroupsListViewModel.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/groupList/GroupsListViewModel.kt similarity index 100% rename from feature/groups/src/main/java/com/mifos/feature/groups/groupList/GroupsListViewModel.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/groupList/GroupsListViewModel.kt diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/navigation/GroupNavGraph.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/navigation/GroupNavGraph.kt similarity index 100% rename from feature/groups/src/main/java/com/mifos/feature/groups/navigation/GroupNavGraph.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/navigation/GroupNavGraph.kt diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/navigation/GroupScreen.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/navigation/GroupScreen.kt similarity index 100% rename from feature/groups/src/main/java/com/mifos/feature/groups/navigation/GroupScreen.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/navigation/GroupScreen.kt diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/syncGroupDialog/SyncGroupDialogScreen.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/syncGroupDialog/SyncGroupDialogScreen.kt similarity index 68% rename from feature/groups/src/main/java/com/mifos/feature/groups/syncGroupDialog/SyncGroupDialogScreen.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/syncGroupDialog/SyncGroupDialogScreen.kt index 4581eb4c80..39f97c154f 100644 --- a/feature/groups/src/main/java/com/mifos/feature/groups/syncGroupDialog/SyncGroupDialogScreen.kt +++ b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/syncGroupDialog/SyncGroupDialogScreen.kt @@ -9,6 +9,21 @@ */ package com.mifos.feature.groups.syncGroupDialog +import androidclient.feature.groups.generated.resources.Res +import androidclient.feature.groups.generated.resources.feature_groups_cancel +import androidclient.feature.groups.generated.resources.feature_groups_dialog_action_ok +import androidclient.feature.groups.generated.resources.feature_groups_failed_sync +import androidclient.feature.groups.generated.resources.feature_groups_groups +import androidclient.feature.groups.generated.resources.feature_groups_hide +import androidclient.feature.groups.generated.resources.feature_groups_name +import androidclient.feature.groups.generated.resources.feature_groups_slash +import androidclient.feature.groups.generated.resources.feature_groups_something_went_wrong +import androidclient.feature.groups.generated.resources.feature_groups_space +import androidclient.feature.groups.generated.resources.feature_groups_sync_groups_full_information +import androidclient.feature.groups.generated.resources.feature_groups_syncing_client +import androidclient.feature.groups.generated.resources.feature_groups_syncing_group +import androidclient.feature.groups.generated.resources.feature_groups_total +import androidclient.feature.groups.generated.resources.feature_groups_total_sync_progress import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -30,15 +45,13 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.mifos.core.designsystem.component.MifosCircularProgress -import com.mifos.feature.groups.R -import org.koin.androidx.compose.koinViewModel +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.viewmodel.koinViewModel @Composable internal fun SyncGroupDialogScreen( @@ -87,7 +100,7 @@ internal fun SyncGroupDialogScreen( is SyncGroupsDialogUiState.Error -> { val message = uiState.message ?: uiState.messageResId?.let { stringResource(uiState.messageResId) } - ?: stringResource(id = R.string.feature_groups_something_went_wrong) + ?: stringResource(Res.string.feature_groups_something_went_wrong) LaunchedEffect(key1 = message) { snackBarHostState.showSnackbar(message = message) } @@ -115,25 +128,27 @@ private fun SyncGroupDialogContent( Text( modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, - text = stringResource(id = R.string.feature_groups_sync_groups_full_information), + text = stringResource(Res.string.feature_groups_sync_groups_full_information), ) GroupPayloadField( - label = stringResource(id = R.string.feature_groups_name), + label = stringResource(Res.string.feature_groups_name), value = uiData.groupName, ) Spacer(modifier = Modifier.height(12.dp)) GroupPayloadField( - label = stringResource(id = R.string.feature_groups_total), - value = uiData.groupList.size.toString() + stringResource(R.string.feature_groups_space) + stringResource(R.string.feature_groups_groups), + label = stringResource(Res.string.feature_groups_total), + value = uiData.groupList.size.toString() + stringResource(Res.string.feature_groups_space) + stringResource( + Res.string.feature_groups_groups, + ), ) Spacer(modifier = Modifier.height(12.dp)) GroupPayloadField( - label = stringResource(id = R.string.feature_groups_syncing_group), + label = stringResource(Res.string.feature_groups_syncing_group), value = uiData.groupName, ) @@ -144,7 +159,7 @@ private fun SyncGroupDialogContent( Spacer(modifier = Modifier.height(12.dp)) GroupPayloadField( - label = stringResource(id = R.string.feature_groups_syncing_client), + label = stringResource(Res.string.feature_groups_syncing_client), value = "syncing_client", ) @@ -155,8 +170,9 @@ private fun SyncGroupDialogContent( Spacer(modifier = Modifier.height(12.dp)) GroupPayloadField( - label = stringResource(id = R.string.feature_groups_total_sync_progress), - value = stringResource(R.string.feature_groups_space) + uiData.totalSyncCount + stringResource(id = R.string.feature_groups_slash) + uiData.groupList.size, + label = stringResource(Res.string.feature_groups_total_sync_progress), + value = stringResource(Res.string.feature_groups_space) + uiData.totalSyncCount + + stringResource(Res.string.feature_groups_slash) + uiData.groupList.size, ) LinearProgressIndicator( @@ -166,7 +182,7 @@ private fun SyncGroupDialogContent( Spacer(modifier = Modifier.height(12.dp)) GroupPayloadField( - label = stringResource(id = R.string.feature_groups_failed_sync), + label = stringResource(Res.string.feature_groups_failed_sync), value = uiData.failedSyncGroupCount.toString(), ) @@ -180,14 +196,14 @@ private fun SyncGroupDialogContent( onClick = { okClicked() }, modifier = Modifier.weight(1f), ) { - Text(text = stringResource(id = R.string.feature_groups_dialog_action_ok)) + Text(text = stringResource(Res.string.feature_groups_dialog_action_ok)) } } else { FilledTonalButton( onClick = { cancelClicked() }, modifier = Modifier.weight(1f), ) { - Text(text = stringResource(id = R.string.feature_groups_cancel)) + Text(text = stringResource(Res.string.feature_groups_cancel)) } Spacer(modifier = Modifier.width(10.dp)) @@ -196,7 +212,7 @@ private fun SyncGroupDialogContent( onClick = { hideClicked() }, modifier = Modifier.weight(1f), ) { - Text(text = stringResource(id = R.string.feature_groups_hide)) + Text(text = stringResource(Res.string.feature_groups_hide)) } } } @@ -227,14 +243,14 @@ private fun GroupPayloadField( ) } } - -@Preview(showBackground = true, backgroundColor = 0xFFFFFFFF) -@Composable -private fun SyncGroupDialogScreenPreview() { - SyncGroupDialogScreen( - dismiss = { }, - uiState = SyncGroupsDialogUiState.Success, - uiData = SyncGroupDialogData(), - hide = { }, - ) -} +// +//@Preview(showBackground = true, backgroundColor = 0xFFFFFFFF) +//@Composable +//private fun SyncGroupDialogScreenPreview() { +// SyncGroupDialogScreen( +// dismiss = { }, +// uiState = SyncGroupsDialogUiState.Success, +// uiData = SyncGroupDialogData(), +// hide = { }, +// ) +//} diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/syncGroupDialog/SyncGroupsDialogUiState.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/syncGroupDialog/SyncGroupsDialogUiState.kt similarity index 91% rename from feature/groups/src/main/java/com/mifos/feature/groups/syncGroupDialog/SyncGroupsDialogUiState.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/syncGroupDialog/SyncGroupsDialogUiState.kt index d315c2941f..72f586596b 100644 --- a/feature/groups/src/main/java/com/mifos/feature/groups/syncGroupDialog/SyncGroupsDialogUiState.kt +++ b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/syncGroupDialog/SyncGroupsDialogUiState.kt @@ -11,6 +11,7 @@ package com.mifos.feature.groups.syncGroupDialog import androidx.compose.ui.graphics.vector.ImageVector import com.mifos.room.entities.group.GroupEntity +import org.jetbrains.compose.resources.StringResource /** * Created by Aditya Gupta on 16/08/23. @@ -19,7 +20,7 @@ sealed class SyncGroupsDialogUiState { data object Loading : SyncGroupsDialogUiState() data object Success : SyncGroupsDialogUiState() data class Error( - val messageResId: Int? = null, + val messageResId: StringResource? = null, val imageVector: ImageVector? = null, val message: String? = null, ) : SyncGroupsDialogUiState() diff --git a/feature/groups/src/main/java/com/mifos/feature/groups/syncGroupDialog/SyncGroupsDialogViewModel.kt b/feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/syncGroupDialog/SyncGroupsDialogViewModel.kt similarity index 100% rename from feature/groups/src/main/java/com/mifos/feature/groups/syncGroupDialog/SyncGroupsDialogViewModel.kt rename to feature/groups/src/commonMain/kotlin/com/mifos/feature/groups/syncGroupDialog/SyncGroupsDialogViewModel.kt