From 06023d1061427c858e57f1eb3eca38417f9d91b5 Mon Sep 17 00:00:00 2001 From: manu Date: Thu, 27 Jun 2024 14:00:49 +0200 Subject: [PATCH] fix: [ANDROAPP-6104] do not allow future dates in date fields --- .../searchTrackEntity/SearchTEActivity.java | 3 +- .../java/org/dhis2/form/ui/FormViewModel.kt | 3 +- .../org/dhis2/form/ui/intent/FormIntent.kt | 2 +- .../ui/provider/inputfield/AgeProvider.kt | 43 ++++++++++++------- .../ui/provider/inputfield/DateProvider.kt | 2 +- 5 files changed, 34 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.java b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.java index 579cd99d6a..4969166fcf 100644 --- a/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.java +++ b/app/src/main/java/org/dhis2/usescases/searchTrackEntity/SearchTEActivity.java @@ -363,7 +363,8 @@ private void initSearchParameters() { uid, selectedOrgUnit, ValueType.ORGANISATION_UNIT, - null + null, + true ) ); return Unit.INSTANCE; diff --git a/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt b/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt index e3fd22ad59..9ad92580d3 100644 --- a/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt +++ b/form/src/main/java/org/dhis2/form/ui/FormViewModel.kt @@ -420,6 +420,7 @@ class FormViewModel( intent.valueType, intent.value, intent.fieldMask, + intent.allowFutureDates, ) createRowAction( @@ -608,7 +609,7 @@ class FormViewModel( try { val date = LocalDate.parse(dateString, formatter) if (allowFutureDates == false && date.isAfter(LocalDate.now())) { - return Result.Failure(DateFailure.ParseException) + return Result.Failure(Throwable()) } return valueType.validator.validate(dateString) } catch (e: DateTimeParseException) { diff --git a/form/src/main/java/org/dhis2/form/ui/intent/FormIntent.kt b/form/src/main/java/org/dhis2/form/ui/intent/FormIntent.kt index b6a7863825..1f37d3b459 100644 --- a/form/src/main/java/org/dhis2/form/ui/intent/FormIntent.kt +++ b/form/src/main/java/org/dhis2/form/ui/intent/FormIntent.kt @@ -24,6 +24,7 @@ sealed class FormIntent { val value: String?, val valueType: ValueType?, val fieldMask: String? = null, + val allowFutureDates: Boolean? = false, ) : FormIntent() data class OnQrCodeScanned( @@ -42,7 +43,6 @@ sealed class FormIntent { val uid: String, val value: String?, val valueType: ValueType?, - val allowFutureDates: Boolean? = false, ) : FormIntent() data class ClearValue( diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt index 78d23930f2..a013ab1125 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/AgeProvider.kt @@ -102,13 +102,17 @@ fun ProvideInputAge( } is AgeInputType.DateOfBirth -> { - saveValue( - intentHandler, - fieldUiModel.uid, - formatUIDateToStored(type.value.text), - fieldUiModel.valueType, - fieldUiModel.allowFutureDates, - ) + formatUIDateToStored(type.value.text) + .takeIf { it != fieldUiModel.value } + ?.let { + saveValue( + intentHandler, + fieldUiModel.uid, + it, + fieldUiModel.valueType, + fieldUiModel.allowFutureDates, + ) + } } AgeInputType.None -> { @@ -135,14 +139,23 @@ private fun saveValue( valueType: ValueType?, allowFutureDates: Boolean?, ) { - intentHandler.invoke( - FormIntent.OnTextChange( - uid, - value, - valueType, - allowFutureDates ?: false, - ), - ) + when (value?.length) { + null, 10 -> intentHandler.invoke( + FormIntent.OnSave( + uid, + value, + valueType, + allowFutureDates = allowFutureDates, + ), + ) + else -> intentHandler.invoke( + FormIntent.OnTextChange( + uid, + value, + valueType, + ), + ) + } } private fun formatStoredDateToUI(inputDateString: String): String { diff --git a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/DateProvider.kt b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/DateProvider.kt index dee4b5a5fb..839ddd09b3 100644 --- a/form/src/main/java/org/dhis2/form/ui/provider/inputfield/DateProvider.kt +++ b/form/src/main/java/org/dhis2/form/ui/provider/inputfield/DateProvider.kt @@ -78,13 +78,13 @@ fun ProvideInputDate( uid = fieldUiModel.uid, value = formatUIDateToStored(it?.text, fieldUiModel.valueType), valueType = fieldUiModel.valueType, + allowFutureDates = fieldUiModel.allowFutureDates, ) } else { FormIntent.OnTextChange( uid = fieldUiModel.uid, value = formatUIDateToStored(it?.text, fieldUiModel.valueType), valueType = fieldUiModel.valueType, - allowFutureDates = fieldUiModel.allowFutureDates ?: true, ) } intentHandler.invoke(formIntent)