Android overhaul: the §9.6 text and date limits in :core:design's Limits.kt

DESCRIPTION_MAX (S-7 and S-19 each had 100), NOTES_MAX (S-7's 1000 and NotesField's private copy), FIRST_DATE and
DAYS_AHEAD_MAX (the S-7 and S-9 date pickers each spelled 2000-01-01 and 365). Values unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B
This commit is contained in:
2026-10-18 23:09:39 +02:00
parent e08aaf099b
commit 0714242954
6 changed files with 34 additions and 21 deletions
@@ -55,7 +55,6 @@ import kotlinx.datetime.DateTimeUnit
import kotlinx.datetime.LocalDate
import kotlinx.datetime.plus
import se.hagstedt.kvitt.design.KvittTheme
import se.hagstedt.kvitt.core.design.R as DesignR
import se.hagstedt.kvitt.design.component.AccountPicker
import se.hagstedt.kvitt.design.component.AmountDisplay
import se.hagstedt.kvitt.design.component.AmountKeypad
@@ -90,6 +89,10 @@ import se.hagstedt.kvitt.design.component.splitOption
import se.hagstedt.kvitt.design.component.viewerPercentOf
import se.hagstedt.kvitt.design.format.AmountInput
import se.hagstedt.kvitt.design.format.AmountKey
import se.hagstedt.kvitt.design.format.DAYS_AHEAD_MAX
import se.hagstedt.kvitt.design.format.DESCRIPTION_MAX
import se.hagstedt.kvitt.design.format.FIRST_DATE
import se.hagstedt.kvitt.design.format.NOTES_MAX
import se.hagstedt.kvitt.design.icon.KvittIcon
import se.hagstedt.kvitt.model.AccountId
import se.hagstedt.kvitt.model.CategoryId
@@ -97,6 +100,7 @@ import se.hagstedt.kvitt.model.ExpenseId
import se.hagstedt.kvitt.model.FieldError
import se.hagstedt.kvitt.model.SplitMode
import se.hagstedt.kvitt.model.UserId
import se.hagstedt.kvitt.core.design.R as DesignR
/** What S-7 can ask its state holder to do; [ExpenseEditorViewModel] implements it. */
interface ExpenseEditorActions {
@@ -400,8 +404,8 @@ private fun EditorDatePicker(date: String, today: String, actions: ExpenseEditor
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun LocalizedDatePicker(date: String, today: String, actions: ExpenseEditorActions, inline: Boolean) {
val first = remember { LocalDate(FIRST_YEAR, 1, 1).toEpochDays() * DAY_MILLIS }
val last = remember(today) { LocalDate.parse(today).plus(MAX_DAYS_AHEAD, DateTimeUnit.DAY).toEpochDays() * DAY_MILLIS }
val first = remember { FIRST_DATE.toEpochDays() * DAY_MILLIS }
val last = remember(today) { LocalDate.parse(today).plus(DAYS_AHEAD_MAX, DateTimeUnit.DAY).toEpochDays() * DAY_MILLIS }
val picker = rememberDatePickerState(
initialSelectedDateMillis = LocalDate.parse(date).toEpochDays() * DAY_MILLIS,
selectableDates = object : SelectableDates {
@@ -479,9 +483,9 @@ internal fun errorText(errors: List<FieldError>, field: String): String? {
}
ExpenseEditorViewModel.FIELD_DESCRIPTION -> when (error.error) {
ExpenseEditorViewModel.REQUIRED -> stringResource(DesignR.string.error_description_required)
else -> pluralStringResource(DesignR.plurals.error_too_long, MAX_DESCRIPTION, MAX_DESCRIPTION)
else -> pluralStringResource(DesignR.plurals.error_too_long, DESCRIPTION_MAX, DESCRIPTION_MAX)
}
ExpenseEditorViewModel.FIELD_NOTES -> pluralStringResource(DesignR.plurals.error_too_long, MAX_NOTES, MAX_NOTES)
ExpenseEditorViewModel.FIELD_NOTES -> pluralStringResource(DesignR.plurals.error_too_long, NOTES_MAX, NOTES_MAX)
ExpenseEditorViewModel.FIELD_DATE -> stringResource(DesignR.string.error_date_out_of_range)
ExpenseEditorViewModel.FIELD_SPLIT -> when (error.error) {
"exact_sum_mismatch", "exact_negative" -> stringResource(DesignR.string.error_exact_share_too_large)
@@ -495,8 +499,4 @@ internal fun errorText(errors: List<FieldError>, field: String): String? {
private const val PERCENT_HUNDREDTHS = 100L
private const val HALF = 50
private const val MIN_AMOUNT_ORE = 1L
private const val MAX_DESCRIPTION = 100
private const val MAX_NOTES = 1000
private const val FIRST_YEAR = 2000
private const val MAX_DAYS_AHEAD = 365
private const val DAY_MILLIS = 86_400_000L