Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
ece84d3
Implemented a Export Dialog Box in Transaction Screen
gurnoorpannu Feb 10, 2026
c7cb0e4
made requested changes
gurnoorpannu Feb 16, 2026
9ff6a57
Button name changed
gurnoorpannu Feb 16, 2026
611a621
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Feb 17, 2026
8aebbad
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Feb 20, 2026
756a212
Made code changes that the dialog now shows error message if ToDate i…
gurnoorpannu Feb 20, 2026
676cadf
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Feb 20, 2026
e7a2111
coderabbit suggestions
gurnoorpannu Feb 20, 2026
67510db
Merge remote-tracking branch 'origin/feature/loan-transactions-export…
gurnoorpannu Feb 20, 2026
8c7f816
coderabbit suggestions
gurnoorpannu Feb 20, 2026
ca47642
Moved DatePicker Composable to core/ui module
gurnoorpannu Feb 21, 2026
8a6741b
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Feb 22, 2026
784edcc
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Feb 23, 2026
e2a575d
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Feb 23, 2026
946dbe6
Fixing merge conflicts
gurnoorpannu Feb 23, 2026
d2c466a
Merge branch 'development' into feature/loan-transactions-export-dialog
niyajali Feb 24, 2026
504b741
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Feb 24, 2026
a2b174a
Solved Merge Conflicts
gurnoorpannu Feb 25, 2026
9536c25
Solved Merge Conflicts
gurnoorpannu Feb 25, 2026
088bd03
removed duplicate string resources
gurnoorpannu Feb 26, 2026
c2803cb
Applied Changes requested
gurnoorpannu Feb 26, 2026
f19505f
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Feb 26, 2026
d694f30
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Feb 27, 2026
87ec06e
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Mar 2, 2026
e749911
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Mar 3, 2026
aa1cacf
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Mar 4, 2026
f74a6d9
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Mar 6, 2026
83e02e9
Implemented requested changes
gurnoorpannu Mar 6, 2026
a313552
Merge remote-tracking branch 'origin/feature/loan-transactions-export…
gurnoorpannu Mar 6, 2026
14a8267
Implemneted chanegs requested
gurnoorpannu Mar 7, 2026
f2bc4b9
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Mar 19, 2026
5da5271
changing the implementation architecture
gurnoorpannu Mar 20, 2026
f134387
spotless fix
gurnoorpannu Mar 20, 2026
7de8dea
fixed the overall structure
gurnoorpannu Mar 20, 2026
36a4011
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Apr 8, 2026
ae3e454
corrected architecture overall
gurnoorpannu Apr 8, 2026
75f2f78
Merge branch 'development' into feature/loan-transactions-export-dialog
gurnoorpannu Apr 10, 2026
14affea
Fixed static analysis check
gurnoorpannu Apr 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions core/ui/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ kotlin{
}
commonMain.dependencies {
api(projects.core.designsystem)
api(projects.core.common)
api(libs.kotlinx.datetime)
implementation(libs.jb.composeViewmodel)
implementation(libs.jb.lifecycle.compose)
Expand Down
2 changes: 1 addition & 1 deletion core/ui/src/commonMain/composeResources/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
<string name="core_ui_no_data">No Data</string>
<string name="core_ui_something_went_wrong">Something went wrong</string>
<string name="core_ui_core_common_working">Core Common Working</string>
<string name="core_ui_click_to_add_new">Click to add new</string>

<!-- Mifos Client Fee -->
<string name="core_ui_name">Name</string>
Expand Down Expand Up @@ -73,6 +72,7 @@

<string name="core_ui_click_here_to_view_filled_state">Click Here To View Filled State.</string>
<string name="core_ui_no_item_found">No Item Found</string>
<string name="core_ui_click_to_add_new">Click To Add New</string>

<!-- Action Names -->
<string name="core_ui_view_account">View Account</string>
Expand Down
10 changes: 7 additions & 3 deletions feature/loan/src/commonMain/composeResources/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@
<string name="feature_loan_application">Loan Application</string>
<string name="feature_loan_account_created_successfully">Loan account created successfully</string>
<string name="feature_error_network_not_available">Network is not Available</string>


<string name="feature_loan_product">Loan Product</string>
<string name="feature_loan_purpose">Loan Purpose</string>
<string name="feature_loan_officer">Loan Officer</string>
Expand All @@ -22,7 +20,6 @@
<string name="feature_loan_disbursed_date">Disbursed Date</string>
<string name="feature_loan_select">Select</string>
<string name="feature_loan_cancel">Cancel</string>

<string name="feature_loan_external_id">External ID</string>
<string name="feature_loan_principal">Principal</string>
<string name="feature_loan_number_of_repayments">Number of Repayments*</string>
Expand Down Expand Up @@ -388,6 +385,13 @@

<!-- Amount Transfer-->
<string name="field_empty">This field cannot be empty</string>

<!-- Export Loan Transactions -->
<string name="feature_loan_export_transactions">Export</string>
<string name="feature_loan_from_date">From Date*</string>
<string name="feature_loan_to_date">To Date*</string>
<string name="feature_loan_generate_report">Generate</string>
<string name="feature_loan_invalid_date_range">To Date cannot be earlier than From Date</string>
<string name="feature_loan_applicant_name">Applicant name</string>
<string name="feature_loan_from_account">From Account</string>
<string name="feature_loan_loan_account_type">From Account Type</string>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
/*
* Copyright 2025 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*
* See https://github.com/openMF/mifos-x-field-officer-app/blob/master/LICENSE.md
*/
package com.mifos.feature.loan.loanTransaction

import androidclient.feature.loan.generated.resources.Res
import androidclient.feature.loan.generated.resources.feature_loan_cancel
import androidclient.feature.loan.generated.resources.feature_loan_export_transactions
import androidclient.feature.loan.generated.resources.feature_loan_from_date
import androidclient.feature.loan.generated.resources.feature_loan_generate_report
import androidclient.feature.loan.generated.resources.feature_loan_invalid_date_range
import androidclient.feature.loan.generated.resources.feature_loan_select
import androidclient.feature.loan.generated.resources.feature_loan_to_date
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.material3.DatePicker
import androidx.compose.material3.DatePickerDialog
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.SelectableDates
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.material3.rememberDatePickerState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import com.mifos.core.common.utils.DateHelper
import com.mifos.core.designsystem.component.MifosButton
import com.mifos.core.designsystem.component.MifosCustomDialog
import com.mifos.core.designsystem.component.MifosDatePickerTextField
import com.mifos.core.designsystem.component.MifosOutlinedButton
import org.jetbrains.compose.resources.stringResource
import template.core.base.designsystem.theme.KptTheme
import kotlin.time.Clock
import kotlin.time.ExperimentalTime

@OptIn(ExperimentalMaterial3Api::class, ExperimentalTime::class)
@Composable
internal fun ExportTransactionsDialog(
state: ExportDialogState,
onDismiss: () -> Unit,
onFromDateSelected: (Long) -> Unit,
onToDateSelected: (Long) -> Unit,
onShowFromDatePicker: (Boolean) -> Unit,
onShowToDatePicker: (Boolean) -> Unit,
onGenerateReport: () -> Unit,
) {
val fromDatePickerState = rememberDatePickerState(
initialSelectedDateMillis = state.fromDate ?: Clock.System.now().toEpochMilliseconds(),
selectableDates = object : SelectableDates {
override fun isSelectableDate(utcTimeMillis: Long): Boolean {
return utcTimeMillis <= Clock.System.now().toEpochMilliseconds()
}
},
)

val toDatePickerState = rememberDatePickerState(
initialSelectedDateMillis = state.toDate ?: Clock.System.now().toEpochMilliseconds(),
selectableDates = object : SelectableDates {
override fun isSelectableDate(utcTimeMillis: Long): Boolean {
return utcTimeMillis <= Clock.System.now().toEpochMilliseconds()
}
},
)

if (state.showFromDatePicker) {
DatePickerDialog(
onDismissRequest = { onShowFromDatePicker(false) },
confirmButton = {
TextButton(
onClick = {
onShowFromDatePicker(false)
fromDatePickerState.selectedDateMillis?.let { onFromDateSelected(it) }
},
) { Text(stringResource(Res.string.feature_loan_select)) }
},
dismissButton = {
TextButton(
onClick = { onShowFromDatePicker(false) },
) { Text(stringResource(Res.string.feature_loan_cancel)) }
},
) {
DatePicker(state = fromDatePickerState)
}
}

if (state.showToDatePicker) {
DatePickerDialog(
onDismissRequest = { onShowToDatePicker(false) },
confirmButton = {
TextButton(
onClick = {
onShowToDatePicker(false)
toDatePickerState.selectedDateMillis?.let { onToDateSelected(it) }
},
) { Text(stringResource(Res.string.feature_loan_select)) }
},
dismissButton = {
TextButton(
onClick = { onShowToDatePicker(false) },
) { Text(stringResource(Res.string.feature_loan_cancel)) }
},
) {
DatePicker(state = toDatePickerState)
}
}

MifosCustomDialog(
onDismiss = onDismiss,
) {
Surface(
shape = KptTheme.shapes.medium,
color = KptTheme.colorScheme.surface,
modifier = Modifier.fillMaxWidth(0.95f),
) {
Column(modifier = Modifier.padding(KptTheme.spacing.lg)) {
Text(
text = stringResource(Res.string.feature_loan_export_transactions),
style = KptTheme.typography.titleLarge,
modifier = Modifier.fillMaxWidth(),
)

Spacer(modifier = Modifier.height(KptTheme.spacing.md))

MifosDatePickerTextField(
value = state.fromDate?.let { DateHelper.getDateAsStringFromLong(it) }.orEmpty(),
label = stringResource(Res.string.feature_loan_from_date),
openDatePicker = { onShowFromDatePicker(true) },
)

Spacer(modifier = Modifier.height(KptTheme.spacing.sm))

MifosDatePickerTextField(
value = state.toDate?.let { DateHelper.getDateAsStringFromLong(it) }.orEmpty(),
label = stringResource(Res.string.feature_loan_to_date),
errorMessage = if (state.isInvalidDateRange) {
stringResource(Res.string.feature_loan_invalid_date_range)
} else {
null
},
openDatePicker = { onShowToDatePicker(true) },
)

Spacer(modifier = Modifier.height(KptTheme.spacing.md))

Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween,
) {
MifosOutlinedButton(
onClick = onDismiss,
modifier = Modifier.weight(1f),
) {
Text(
text = stringResource(Res.string.feature_loan_cancel),
style = KptTheme.typography.labelLarge,
maxLines = 1,
)
}

Spacer(modifier = Modifier.width(KptTheme.spacing.md))

MifosButton(
onClick = onGenerateReport,
enabled = state.isValidDateRange,
modifier = Modifier.weight(1f),
) {
Text(
text = stringResource(Res.string.feature_loan_generate_report),
style = KptTheme.typography.labelLarge,
maxLines = 1,
)
}
}
}
}
}
}
Loading
Loading