Skip to content
17 changes: 17 additions & 0 deletions core/ui/src/commonMain/composeResources/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,21 @@
<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>

<!-- Action Names -->
<string name="core_ui_view_account">View Account</string>
<string name="core_ui_edit_note">Edit Note</string>
<string name="core_ui_delete_note">Delete Note</string>
<string name="core_ui_approve_account">Approve Account</string>
<string name="core_ui_make_repayment">Make Repayment</string>
<string name="core_ui_view_document">View Document</string>
<string name="core_ui_upload_again">Upload Again</string>
<string name="core_ui_delete_document">Delete Document</string>

<!-- Mifos Note -->
<string name="core_ui_note_createdBy">Created By:</string>
<string name="core_ui_note_date">Date</string>
<string name="core_ui_note_note">Note</string>



</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,25 @@ package com.mifos.core.ui.components
import androidclient.core.ui.generated.resources.Res
import androidclient.core.ui.generated.resources.core_ui_account_no
import androidclient.core.ui.generated.resources.core_ui_amount_paid
import androidclient.core.ui.generated.resources.core_ui_approve_account
import androidclient.core.ui.generated.resources.core_ui_balance
import androidclient.core.ui.generated.resources.core_ui_delete_document
import androidclient.core.ui.generated.resources.core_ui_delete_note
import androidclient.core.ui.generated.resources.core_ui_description
import androidclient.core.ui.generated.resources.core_ui_document_id
import androidclient.core.ui.generated.resources.core_ui_document_key
import androidclient.core.ui.generated.resources.core_ui_due
import androidclient.core.ui.generated.resources.core_ui_due_as_of
import androidclient.core.ui.generated.resources.core_ui_edit_note
import androidclient.core.ui.generated.resources.core_ui_identify_documents
import androidclient.core.ui.generated.resources.core_ui_last_active
import androidclient.core.ui.generated.resources.core_ui_loan_balance
import androidclient.core.ui.generated.resources.core_ui_loan_product
import androidclient.core.ui.generated.resources.core_ui_make_repayment
import androidclient.core.ui.generated.resources.core_ui_name
import androidclient.core.ui.generated.resources.core_ui_note_createdBy
import androidclient.core.ui.generated.resources.core_ui_note_date
import androidclient.core.ui.generated.resources.core_ui_note_note
import androidclient.core.ui.generated.resources.core_ui_original_loan
import androidclient.core.ui.generated.resources.core_ui_outstanding
import androidclient.core.ui.generated.resources.core_ui_paid
Expand All @@ -31,6 +39,9 @@ import androidclient.core.ui.generated.resources.core_ui_status
import androidclient.core.ui.generated.resources.core_ui_total_collateral_value
import androidclient.core.ui.generated.resources.core_ui_total_value
import androidclient.core.ui.generated.resources.core_ui_type
import androidclient.core.ui.generated.resources.core_ui_upload_again
import androidclient.core.ui.generated.resources.core_ui_view_account
import androidclient.core.ui.generated.resources.core_ui_view_document
import androidclient.core.ui.generated.resources.core_ui_waived
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.expandVertically
Expand All @@ -49,6 +60,7 @@ 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.size
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
Expand All @@ -61,6 +73,7 @@ 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.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalDensity
Expand All @@ -70,22 +83,31 @@ import com.mifos.core.designsystem.theme.AppColors
import com.mifos.core.designsystem.theme.DesignToken
import com.mifos.core.designsystem.theme.MifosTypography
import com.mifos.core.designsystem.utils.onClick
import org.jetbrains.compose.resources.StringResource
import org.jetbrains.compose.resources.stringResource
import org.jetbrains.compose.ui.tooling.preview.Preview

@Composable
fun MifosActionsListingComponentOutline(
bottomRounded: Boolean = false,
topRounded: Boolean = false,
modifier: Modifier = Modifier,
content: @Composable () -> Unit,
) {
val shape = if (bottomRounded) {
DesignToken.shapes.bottomMedium
} else if (topRounded) {
DesignToken.shapes.topMedium
} else {
DesignToken.shapes.medium
}

Box(
modifier = modifier
.fillMaxWidth()
.border(
width = 1.dp,
shape = DesignToken.shapes.medium,
color = MaterialTheme.colorScheme.secondaryContainer,
),
modifier = modifier.fillMaxWidth().border(
width = 1.dp,
shape = shape,
color = MaterialTheme.colorScheme.secondaryContainer,
),
) {
content()
}
Expand Down Expand Up @@ -579,13 +601,123 @@ fun MifosActionsClientFeeListingComponent(
}
}

enum class Actions(val icon: ImageVector) {
ViewAccount(MifosIcons.ViewAccount),
ApproveAccount(MifosIcons.ApproveAccount),
MakeRepayment(MifosIcons.MakeRepayment),
ViewDocument(MifosIcons.ViewDocument),
UploadAgain(MifosIcons.UploadAgain),
DeleteDocument(MifosIcons.DeleteDocument),
@Composable
fun MifosActionsNoteListingComponent(
createdBy: String,
date: String,
notes: String,
menuList: List<Actions>,
onExpand: () -> Unit,
isExpanded: Boolean,
onActionClicked: (Actions) -> Unit,
) {
Column {
MifosActionsListingComponentOutline(
topRounded = isExpanded,
modifier = Modifier
.clip(if (isExpanded) DesignToken.shapes.topMedium else DesignToken.shapes.medium)
.clickable {
onExpand()
},
) {
Column(
modifier = Modifier.padding(DesignToken.padding.large),
) {
MifosListingRowItemHeader(
text = stringResource(Res.string.core_ui_note_createdBy) + " " + createdBy,
keyStyle = MifosTypography.titleSmallEmphasized,
)

Spacer(Modifier.height(DesignToken.padding.large))

MifosListingColumnItem(
key = stringResource(Res.string.core_ui_note_date),
value = date,
)

Spacer(Modifier.height(DesignToken.padding.medium))

MifosListingColumnItem(
key = stringResource(Res.string.core_ui_note_note),
value = notes,
)
}
}

AnimatedVisibility(isExpanded) {
Surface(
modifier = Modifier.fillMaxWidth(),
shape = DesignToken.shapes.bottomMedium,
color = MaterialTheme.colorScheme.surfaceContainer,
) {
Column(
modifier = Modifier.padding(vertical = DesignToken.spacing.large),
verticalArrangement = Arrangement.spacedBy(DesignToken.spacing.medium),
) {
menuList.map { menuItem ->
Row(
modifier = Modifier.fillMaxWidth().padding(
horizontal = DesignToken.padding.large,
).clickable {
onActionClicked(menuItem)
},
horizontalArrangement = Arrangement.spacedBy(
DesignToken.spacing.medium,
),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
imageVector = menuItem.icon,
contentDescription = null,
modifier = Modifier.size(DesignToken.sizes.iconMedium),
)
Text(
text = stringResource(menuItem.iconName),
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onSurface,
)
}
}
}
}
}
}
}

enum class Actions(val icon: ImageVector, val iconName: StringResource) {
ViewAccount(MifosIcons.ViewAccount, Res.string.core_ui_view_account),
ApproveAccount(MifosIcons.ApproveAccount, Res.string.core_ui_approve_account),
MakeRepayment(MifosIcons.MakeRepayment, Res.string.core_ui_make_repayment),
ViewDocument(MifosIcons.ViewDocument, Res.string.core_ui_view_document),
UploadAgain(MifosIcons.UploadAgain, Res.string.core_ui_upload_again),
DeleteDocument(MifosIcons.DeleteDocument, Res.string.core_ui_delete_document),
Edit(MifosIcons.Edit, Res.string.core_ui_edit_note),
Delete(MifosIcons.Delete, Res.string.core_ui_delete_note),
}

@Preview
@Composable
private fun PreviewMifosActionsNoteListingComponent() {
MaterialTheme {
MifosActionsNoteListingComponent(
createdBy = "John Doe",
date = "02 September 2025",
notes = "This is a note",
menuList = listOf(
Actions.Edit,
Actions.Delete,
),
onExpand = {},
isExpanded = true,
onActionClicked = { action ->
when (action) {
Actions.Edit -> println(Actions.ViewAccount.name)
Actions.Delete -> println(Actions.ApproveAccount.name)
else -> println("Action not Handled")
}
},
)
}
}

@Preview
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,48 @@ fun MifosListingRowItem(
}
}

@Composable
fun MifosListingColumnItem(
keyContent: @Composable () -> Unit,
valueContent: @Composable () -> Unit,
) {
Column(
modifier = Modifier.fillMaxWidth(),
) {
keyContent()
valueContent()
}
}

@Composable
fun MifosListingColumnItem(
key: String,
value: String,
keyStyle: TextStyle = MifosTypography.labelSmall,
keyColor: Color = MaterialTheme.colorScheme.secondary,
valueStyle: TextStyle = MifosTypography.bodySmall,
valueColor: Color = MaterialTheme.colorScheme.onSurface,
) {
MifosListingColumnItem(
keyContent = {
Text(
text = key,
style = keyStyle.copy(color = keyColor),
maxLines = 1,
overflow = TextOverflow.Clip,
)
},
valueContent = {
Text(
text = value,
style = valueStyle.copy(color = valueColor),
overflow = TextOverflow.Clip,
maxLines = 1,
)
},
)
}

@Composable
fun MifosListingRowItem(
key: String,
Expand Down
5 changes: 0 additions & 5 deletions feature/note/src/commonMain/composeResources/values/res.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,6 @@
<string name="feature_note_add_item">Click on "+" Button to add an Item</string>
<string name="feature_note_failed_to_fetch_notes">Failed to fetch notes</string>
<string name="feature_note_internet_not_connected">No Internet</string>
<string name="feature_note_createdBy">Created By:</string>
<string name="feature_note_date">Date</string>
<string name="feature_note_note">Note</string>
<string name="feature_note_edit_note">Edit Note</string>
<string name="feature_note_delete_note">Delete Note</string>
<string name="feature_note_delete">Delete</string>
Expand All @@ -31,8 +28,6 @@
<string name="feature_note_button_add">Add</string>
<string name="feature_note_button_update">Update</string>
<string name="feature_note_button_back">Back</string>
<string name="feature_note_edit_success">Note Updated Successfully</string>
<string name="feature_note_add_success">Note Added Successfully</string>
<string name="feature_note_button_confirm">Confirm</string>
<string name="feature_note_dialog_warning">Warning</string>
<string name="feature_note_dialog_warning_message">Discard changes? Unsaved data will be lost.</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,13 @@ data class AddEditNoteRoute(
fun NavGraphBuilder.addEditNoteRoute(
onBackPressed: () -> Unit,
onNavigateWithUpdatedList: (Int, String?) -> Unit,
navController: NavController,
) {
composable<AddEditNoteRoute> {
AddEditNoteScreen(
onBackPressed = onBackPressed,
onNavigateWithUpdatedList = onNavigateWithUpdatedList,
navController = navController,
)
}
}
Expand Down
Loading