diff --git a/core/common/src/main/java/com/mifos/core/common/utils/Constants.kt b/core/common/src/main/java/com/mifos/core/common/utils/Constants.kt index 8a72a668f0b..01eedf617ca 100644 --- a/core/common/src/main/java/com/mifos/core/common/utils/Constants.kt +++ b/core/common/src/main/java/com/mifos/core/common/utils/Constants.kt @@ -211,4 +211,8 @@ object Constants { const val PASSCODE = "preferences_mifos_passcode_string" const val THEME = "theme" const val LANGUAGE = "language_type" + + // Compose Navigation KEY + const val REPORT_TYPE_ITEM = "report_type_item" + const val REPORT_PARAMETER_RESPONSE = "report_parameter_response" } \ No newline at end of file diff --git a/feature/report/src/main/java/com/mifos/feature/report/navigation/ReportNavigation.kt b/feature/report/src/main/java/com/mifos/feature/report/navigation/ReportNavigation.kt new file mode 100644 index 00000000000..f2cced09125 --- /dev/null +++ b/feature/report/src/main/java/com/mifos/feature/report/navigation/ReportNavigation.kt @@ -0,0 +1,88 @@ +package com.mifos.feature.report.navigation + +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavType +import androidx.navigation.compose.composable +import androidx.navigation.navArgument +import androidx.navigation.navigation +import com.google.gson.Gson +import com.mifos.core.common.utils.Constants +import com.mifos.core.objects.runreports.FullParameterListResponse +import com.mifos.core.objects.runreports.client.ClientReportTypeItem +import com.mifos.feature.report.report.ReportScreen +import com.mifos.feature.report.report_detail.ReportDetailScreen +import com.mifos.feature.report.run_report.RunReportScreen + +fun NavGraphBuilder.reportNavGraph( + navController: NavController +) { + navigation( + startDestination = ReportScreens.RunReportScreen.route, + route = "run_report_route" + ) { + runReportScreenRoute( + onBackPressed = navController::popBackStack, + onReportSelected = navController::navigateReportDetailsScreen + ) + reportDetailsScreenRoute( + onBackPressed = navController::popBackStack, + runReport = navController::navigateReportScreens + ) + reportScreenRoute( + onBackPressed = navController::popBackStack + ) + } +} + +fun NavGraphBuilder.runReportScreenRoute( + onBackPressed: () -> Unit, + onReportSelected: (ClientReportTypeItem) -> Unit +) { + composable( + route = ReportScreens.RunReportScreen.route + ) { + RunReportScreen( + onBackPressed = onBackPressed, + onReportClick = onReportSelected + ) + } +} + +fun NavGraphBuilder.reportDetailsScreenRoute( + onBackPressed: () -> Unit, + runReport: (FullParameterListResponse) -> Unit +) { + composable( + route = ReportScreens.ReportDetailScreen.route, + arguments = listOf(navArgument(Constants.REPORT_TYPE_ITEM, builder = {type = NavType.StringType})) + ) { + ReportDetailScreen( + onBackPressed = onBackPressed, + runReport = runReport + ) + } +} + +fun NavGraphBuilder.reportScreenRoute( + onBackPressed: () -> Unit +) { + composable( + route = ReportScreens.ReportScreen.route, + arguments = listOf(navArgument(Constants.REPORT_PARAMETER_RESPONSE, builder = {type = NavType.StringType})) + ) { + ReportScreen( + onBackPressed = onBackPressed + ) + } +} + +fun NavController.navigateReportDetailsScreen(clientReportTypeItem: ClientReportTypeItem) { + val arg = Gson().toJson(clientReportTypeItem) + navigate(ReportScreens.ReportDetailScreen.argument(arg)) +} + +fun NavController.navigateReportScreens(fullParameterListResponse: FullParameterListResponse) { + val arg = Gson().toJson(fullParameterListResponse) + navigate(ReportScreens.ReportScreen.argument(arg)) +} \ No newline at end of file diff --git a/feature/report/src/main/java/com/mifos/feature/report/navigation/ReportScreens.kt b/feature/report/src/main/java/com/mifos/feature/report/navigation/ReportScreens.kt new file mode 100644 index 00000000000..a231ed1bdcb --- /dev/null +++ b/feature/report/src/main/java/com/mifos/feature/report/navigation/ReportScreens.kt @@ -0,0 +1,18 @@ +package com.mifos.feature.report.navigation + +import com.mifos.core.common.utils.Constants + +sealed class ReportScreens(val route: String) { + + data object RunReportScreen : ReportScreens(route = "run_report_screen") + + data object ReportDetailScreen : + ReportScreens(route = "report_detail_screen/{${Constants.REPORT_TYPE_ITEM}}") { + fun argument(reportTypeItem: String) = "report_detail_screen/${reportTypeItem}" + } + + data object ReportScreen : + ReportScreens(route = "report_screen/{${Constants.REPORT_PARAMETER_RESPONSE}}") { + fun argument(reportParameter: String) = "report_screen/${reportParameter}" + } +} \ No newline at end of file diff --git a/feature/report/src/main/java/com/mifos/feature/report/navigation/RunReportsNavigation.kt b/feature/report/src/main/java/com/mifos/feature/report/navigation/RunReportsNavigation.kt deleted file mode 100644 index 59434bd2aa0..00000000000 --- a/feature/report/src/main/java/com/mifos/feature/report/navigation/RunReportsNavigation.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.mifos.feature.report.navigation - -import androidx.navigation.NavController -import androidx.navigation.NavGraphBuilder -import androidx.navigation.compose.composable -import com.mifos.feature.report.run_report.RunReportScreen - -/** - * Created by Pronay Sarker on 10/08/2024 (7:32 AM) - */ -const val RUN_REPORTS_SCREEN_ROUTE = "run_reports_route" - -fun NavController.navigateToRunReports() { - this.navigate(RUN_REPORTS_SCREEN_ROUTE) -} - -fun NavGraphBuilder.runReportsScreen( - onReportClick: () -> Unit, - onBackPressed: () -> Unit -) { - composable(RUN_REPORTS_SCREEN_ROUTE) { - RunReportScreen( - onBackPressed = {}, - onReportClick = {} - ) - } -} \ No newline at end of file diff --git a/feature/report/src/main/java/com/mifos/feature/report/report/ReportScreen.kt b/feature/report/src/main/java/com/mifos/feature/report/report/ReportScreen.kt index 6255a4e233a..86a83e762e5 100644 --- a/feature/report/src/main/java/com/mifos/feature/report/report/ReportScreen.kt +++ b/feature/report/src/main/java/com/mifos/feature/report/report/ReportScreen.kt @@ -44,11 +44,11 @@ import kotlinx.coroutines.launch @Composable fun ReportScreen( - report: FullParameterListResponse, onBackPressed: () -> Unit ) { val viewModel: ReportViewModel = hiltViewModel() + val report = viewModel.report val state by viewModel.reportUiState.collectAsStateWithLifecycle() val context = LocalContext.current @@ -147,7 +147,7 @@ fun ReportScreen( ) ) report.data.map { it.row }.forEach { - Text(text = it[index] ?: "-", modifier = Modifier.padding(8.dp)) + Text(text = it[index], modifier = Modifier.padding(8.dp)) } } } diff --git a/feature/report/src/main/java/com/mifos/feature/report/report/ReportViewModel.kt b/feature/report/src/main/java/com/mifos/feature/report/report/ReportViewModel.kt index 37dfa344f98..5a8633b214c 100644 --- a/feature/report/src/main/java/com/mifos/feature/report/report/ReportViewModel.kt +++ b/feature/report/src/main/java/com/mifos/feature/report/report/ReportViewModel.kt @@ -1,7 +1,10 @@ package com.mifos.feature.report.report +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.google.gson.Gson +import com.mifos.core.common.utils.Constants import com.mifos.core.objects.runreports.FullParameterListResponse import com.mifos.feature.report.R import dagger.hilt.android.lifecycle.HiltViewModel @@ -14,7 +17,14 @@ import java.io.FileWriter import javax.inject.Inject @HiltViewModel -class ReportViewModel @Inject constructor() : ViewModel() { +class ReportViewModel @Inject constructor( + private val savedStateHandle: SavedStateHandle +) : ViewModel() { + + private val reportParameterString = + savedStateHandle.getStateFlow(key = Constants.REPORT_PARAMETER_RESPONSE, initialValue = "") + val report: FullParameterListResponse = + Gson().fromJson(reportParameterString.value, FullParameterListResponse::class.java) private val _reportUiState = MutableStateFlow(ReportUiState.Initial) val reportUiState = _reportUiState.asStateFlow() diff --git a/feature/report/src/main/java/com/mifos/feature/report/report_detail/ReportDetailScreen.kt b/feature/report/src/main/java/com/mifos/feature/report/report_detail/ReportDetailScreen.kt index 629e40efbdb..fdb043f4840 100644 --- a/feature/report/src/main/java/com/mifos/feature/report/report_detail/ReportDetailScreen.kt +++ b/feature/report/src/main/java/com/mifos/feature/report/report_detail/ReportDetailScreen.kt @@ -57,12 +57,12 @@ import com.mifos.feature.report.R @Composable fun ReportDetailScreen( - reportItem: ClientReportTypeItem, onBackPressed: () -> Unit, runReport: (FullParameterListResponse) -> Unit ) { val viewModel: ReportDetailViewModel = hiltViewModel() + val reportItem = viewModel.reportItem val state by viewModel.reportDetailUiState.collectAsStateWithLifecycle() val reportParameterList by viewModel.reportParameterList.collectAsStateWithLifecycle() val reportDetail by viewModel.reportDetail.collectAsStateWithLifecycle() diff --git a/feature/report/src/main/java/com/mifos/feature/report/report_detail/ReportDetailViewModel.kt b/feature/report/src/main/java/com/mifos/feature/report/report_detail/ReportDetailViewModel.kt index 69eae542606..d6da2d759c7 100644 --- a/feature/report/src/main/java/com/mifos/feature/report/report_detail/ReportDetailViewModel.kt +++ b/feature/report/src/main/java/com/mifos/feature/report/report_detail/ReportDetailViewModel.kt @@ -1,7 +1,10 @@ package com.mifos.feature.report.report_detail +import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.google.gson.Gson +import com.mifos.core.common.utils.Constants import com.mifos.core.common.utils.Resource import com.mifos.core.domain.use_cases.GetReportFullParameterListUseCase import com.mifos.core.domain.use_cases.GetReportParameterDetailsUseCase @@ -10,6 +13,7 @@ import com.mifos.core.domain.use_cases.GetRunReportProductUseCase import com.mifos.core.domain.use_cases.GetRunReportWithQueryUseCase import com.mifos.core.objects.runreports.DataRow import com.mifos.core.objects.runreports.FullParameterListResponse +import com.mifos.core.objects.runreports.client.ClientReportTypeItem import com.mifos.feature.report.R import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers @@ -24,9 +28,15 @@ class ReportDetailViewModel @Inject constructor( private val getReportParameterDetailsUseCase: GetReportParameterDetailsUseCase, private val getRunReportProductUseCase: GetRunReportProductUseCase, private val getRunReportWithQueryUseCase: GetRunReportWithQueryUseCase, - private val getRunReportOfficesUseCase: GetRunReportOfficesUseCase + private val getRunReportOfficesUseCase: GetRunReportOfficesUseCase, + private val savedStateHandle: SavedStateHandle ) : ViewModel() { + private val reportName = + savedStateHandle.getStateFlow(key = Constants.REPORT_TYPE_ITEM, initialValue = "") + val reportItem: ClientReportTypeItem = + Gson().fromJson(reportName.value, ClientReportTypeItem::class.java) + private val _reportDetailUiState = MutableStateFlow(ReportDetailUiState.Loading) val reportDetailUiState = _reportDetailUiState.asStateFlow() diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/HomeDestinationsScreen.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/HomeDestinationsScreen.kt index ce8d8438528..e81055f2d80 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/HomeDestinationsScreen.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/HomeDestinationsScreen.kt @@ -19,7 +19,6 @@ import com.mifos.feature.groups.navigation.GROUP_LIST_SCREEN_ROUTE import com.mifos.feature.individual_collection_sheet.navigation.GENERATE_COLLECTION_SHEET_SCREEN_ROUTE import com.mifos.feature.individual_collection_sheet.navigation.INDIVIDUAL_COLLECTION_SHEET_SCREEN_ROUTE import com.mifos.feature.path_tracking.navigation.PATH_TRACKING_SCREEN_ROUTE -import com.mifos.feature.report.navigation.RUN_REPORTS_SCREEN_ROUTE import com.mifos.feature.search.Navigation.SEARCH_SCREEN_ROUTE import com.mifos.feature.settings.navigation.SETTINGS_SCREEN_ROUTE @@ -72,7 +71,7 @@ sealed class HomeDestinationsScreen( data object RunReportsScreen : HomeDestinationsScreen( title = "Run Reports", - route = RUN_REPORTS_SCREEN_ROUTE, + route = "run_report_screen", icon = Icons.Rounded.Task ) diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/components/Navigation.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/components/Navigation.kt index 6abb98d4e9a..22c7520c1a7 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/components/Navigation.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/components/Navigation.kt @@ -14,7 +14,7 @@ import com.mifos.feature.groups.navigation.groupListScreen import com.mifos.feature.individual_collection_sheet.navigation.generateCollectionSheetScreen import com.mifos.feature.individual_collection_sheet.navigation.individualCollectionSheetScreen import com.mifos.feature.path_tracking.navigation.pathTrackingScreen -import com.mifos.feature.report.navigation.runReportsScreen +import com.mifos.feature.report.navigation.reportNavGraph import com.mifos.feature.search.Navigation.SEARCH_SCREEN_ROUTE import com.mifos.feature.search.Navigation.searchScreen import com.mifos.feature.settings.navigation.settingsScreen @@ -58,6 +58,10 @@ fun Navigation( addSavingsAccount = { } ) + reportNavGraph( + navController = navController + ) + groupListScreen( paddingValues = padding, onAddGroupClick = {}, @@ -84,11 +88,6 @@ fun Navigation( onBackPressed = { navController.popBackStack() } ) - runReportsScreen( - onBackPressed = { navController.popBackStack() }, - onReportClick = { } - ) - pathTrackingScreen( onBackPressed = { navController.popBackStack() } ) diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportFragment.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportFragment.kt index 46ce12e8c94..ccc4f5a8670 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportFragment.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/report/ReportFragment.kt @@ -30,7 +30,7 @@ class ReportFragment : MifosBaseFragment() { report = arg.respose return ComposeView(requireContext()).apply { setContent { - ReportScreen(report = report, onBackPressed = { + ReportScreen(onBackPressed = { findNavController().popBackStack() }) } diff --git a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailFragment.kt b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailFragment.kt index 6c6c431d614..040b5a480c1 100644 --- a/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailFragment.kt +++ b/mifosng-android/src/main/java/com/mifos/mifosxdroid/online/runreports/reportdetail/ReportDetailFragment.kt @@ -33,7 +33,6 @@ class ReportDetailFragment : MifosBaseFragment() { setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed) setContent { ReportDetailScreen( - reportItem = reportItem, onBackPressed = { findNavController().popBackStack() },