From dca79df0562bd58362d87a2dda0ad85ed8bfb2b3 Mon Sep 17 00:00:00 2001 From: Achmad Setyabudi Susilo Date: Sun, 28 Jun 2026 21:30:32 +0700 Subject: [PATCH] fix(#24): format user-visible dates as dd MMM yyyy --- .../main/java/dev/achmad/ledgerr/ui/components/DateField.kt | 4 ++-- .../java/dev/achmad/ledgerr/ui/components/ExportAction.kt | 3 ++- .../achmad/ledgerr/ui/screens/expenses/ExpenseListScreen.kt | 6 +++--- .../java/dev/achmad/ledgerr/ui/screens/home/HomeScreen.kt | 4 ++-- app/src/main/java/dev/achmad/ledgerr/ui/util/StringUtil.kt | 4 ++++ 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/dev/achmad/ledgerr/ui/components/DateField.kt b/app/src/main/java/dev/achmad/ledgerr/ui/components/DateField.kt index d5e7d2f..606a4f7 100644 --- a/app/src/main/java/dev/achmad/ledgerr/ui/components/DateField.kt +++ b/app/src/main/java/dev/achmad/ledgerr/ui/components/DateField.kt @@ -21,10 +21,10 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import dev.achmad.ledgerr.R +import dev.achmad.ledgerr.ui.util.dateFormatter import java.time.Instant import java.time.LocalDate import java.time.ZoneId -import java.time.format.DateTimeFormatter @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -37,7 +37,7 @@ fun DateField( var showPicker by remember { mutableStateOf(false) } OutlinedTextField( - value = date.format(DateTimeFormatter.ISO_LOCAL_DATE), + value = date.format(dateFormatter()), onValueChange = {}, label = { Text(label) }, readOnly = true, diff --git a/app/src/main/java/dev/achmad/ledgerr/ui/components/ExportAction.kt b/app/src/main/java/dev/achmad/ledgerr/ui/components/ExportAction.kt index 614ed9a..80427a2 100644 --- a/app/src/main/java/dev/achmad/ledgerr/ui/components/ExportAction.kt +++ b/app/src/main/java/dev/achmad/ledgerr/ui/components/ExportAction.kt @@ -32,6 +32,7 @@ import androidx.compose.ui.unit.dp import dev.achmad.ledgerr.R import dev.achmad.ledgerr.domain.expense.model.DateRange import dev.achmad.ledgerr.ui.components.preference.widget.TextPreferenceWidget +import dev.achmad.ledgerr.ui.util.dateFormatter import java.time.Instant import java.time.LocalDate import java.time.ZoneId @@ -172,7 +173,7 @@ private fun DateField( var showPicker by remember { mutableStateOf(false) } OutlinedTextField( - value = date.format(DateTimeFormatter.ISO_LOCAL_DATE), + value = date.format(dateFormatter()), onValueChange = {}, label = { Text(label) }, readOnly = true, diff --git a/app/src/main/java/dev/achmad/ledgerr/ui/screens/expenses/ExpenseListScreen.kt b/app/src/main/java/dev/achmad/ledgerr/ui/screens/expenses/ExpenseListScreen.kt index 0e592e6..d0e09c5 100644 --- a/app/src/main/java/dev/achmad/ledgerr/ui/screens/expenses/ExpenseListScreen.kt +++ b/app/src/main/java/dev/achmad/ledgerr/ui/screens/expenses/ExpenseListScreen.kt @@ -70,8 +70,8 @@ import dev.achmad.ledgerr.ui.components.SingleSelectFilterChipGroup import dev.achmad.ledgerr.ui.screens.add_edit_expense.AddEditExpenseScreen import dev.achmad.ledgerr.ui.screens.add_edit_recurring.AddEditRecurringScreen import dev.achmad.ledgerr.ui.screens.import_bank_statement.ImportBankStatementScreen +import dev.achmad.ledgerr.ui.util.dateFormatter import kotlinx.coroutines.launch -import java.time.format.DateTimeFormatter object ExpenseListScreen : Screen { @@ -365,7 +365,7 @@ private fun ExpenseRow( ) } Text( - text = item.expense.date.format(DateTimeFormatter.ISO_LOCAL_DATE), + text = item.expense.date.format(dateFormatter()), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) @@ -412,7 +412,7 @@ private fun RecurringRow( RecurringInterval.YEARLY -> stringResource(R.string.add_edit_recurring_interval_yearly) } Text( - text = "$intervalText · ${item.recurring.nextDueDate.format(DateTimeFormatter.ISO_LOCAL_DATE)}", + text = "$intervalText · ${item.recurring.nextDueDate.format(dateFormatter())}", style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) diff --git a/app/src/main/java/dev/achmad/ledgerr/ui/screens/home/HomeScreen.kt b/app/src/main/java/dev/achmad/ledgerr/ui/screens/home/HomeScreen.kt index 5eae084..fe2a210 100644 --- a/app/src/main/java/dev/achmad/ledgerr/ui/screens/home/HomeScreen.kt +++ b/app/src/main/java/dev/achmad/ledgerr/ui/screens/home/HomeScreen.kt @@ -77,8 +77,8 @@ import dev.achmad.ledgerr.ui.screens.add_edit_expense.AddEditExpenseScreen import dev.achmad.ledgerr.ui.screens.expenses.ExpenseListScreen import dev.achmad.ledgerr.ui.screens.import_bank_statement.ImportBankStatementScreen import dev.achmad.ledgerr.ui.screens.settings.SettingsScreen +import dev.achmad.ledgerr.ui.util.dateFormatter import kotlinx.coroutines.launch -import java.time.format.DateTimeFormatter object HomeScreen : Screen { @@ -443,7 +443,7 @@ private fun ExpenseRow(item: ExpenseWithCategory) { ) } Text( - text = item.expense.date.format(DateTimeFormatter.ISO_LOCAL_DATE), + text = item.expense.date.format(dateFormatter()), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) diff --git a/app/src/main/java/dev/achmad/ledgerr/ui/util/StringUtil.kt b/app/src/main/java/dev/achmad/ledgerr/ui/util/StringUtil.kt index 05f75da..de323d6 100644 --- a/app/src/main/java/dev/achmad/ledgerr/ui/util/StringUtil.kt +++ b/app/src/main/java/dev/achmad/ledgerr/ui/util/StringUtil.kt @@ -1,6 +1,7 @@ package dev.achmad.ledgerr.ui.util import java.time.format.DateTimeFormatter +import java.util.Locale fun timeFormatter(is24Hour: Boolean): DateTimeFormatter { return if (is24Hour) { @@ -10,6 +11,9 @@ fun timeFormatter(is24Hour: Boolean): DateTimeFormatter { } } +fun dateFormatter(): DateTimeFormatter = + DateTimeFormatter.ofPattern("dd MMM yyyy", Locale.getDefault()) + fun String.toTitleCase(): String { return this.lowercase().split(" ").joinToString(" ") { word -> word.replaceFirstChar { it.uppercase() }