diff --git a/app/src/main/java/at/techbee/jtx/ui/reusable/dialogs/DatePickerDialog.kt b/app/src/main/java/at/techbee/jtx/ui/reusable/dialogs/DatePickerDialog.kt index 78ffc4007..85e2b249b 100644 --- a/app/src/main/java/at/techbee/jtx/ui/reusable/dialogs/DatePickerDialog.kt +++ b/app/src/main/java/at/techbee/jtx/ui/reusable/dialogs/DatePickerDialog.kt @@ -9,16 +9,40 @@ package at.techbee.jtx.ui.reusable.dialogs import androidx.compose.animation.AnimatedVisibility -import androidx.compose.foundation.layout.* +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.requiredWidth +import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.MoreTime import androidx.compose.material.icons.outlined.Today import androidx.compose.material.icons.outlined.TravelExplore -import androidx.compose.material3.* -import androidx.compose.runtime.* +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Checkbox +import androidx.compose.material3.DatePicker +import androidx.compose.material3.DisplayMode +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.SecondaryTabRow +import androidx.compose.material3.Tab +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TimePicker +import androidx.compose.material3.rememberDatePickerState +import androidx.compose.material3.rememberTimePickerState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember 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.platform.LocalInspectionMode @@ -35,7 +59,7 @@ import at.techbee.jtx.util.DateTimeUtils import java.time.Instant import java.time.ZoneId import java.time.ZonedDateTime -import java.util.* +import java.util.TimeZone import kotlin.collections.contains @@ -57,8 +81,8 @@ fun DatePickerDialog( val tabIndexTimezone = 2 var selectedTab by remember { mutableIntStateOf(0) } + /* fun isValidDate(date: Long): Boolean { - /* val zonedDate = ZonedDateTime.ofInstant(Instant.ofEpochMilli(date), ZoneId.of("UTC")).withHour(0).withMinute(0).withSecond(0).withNano(0).withZoneSameLocal(DateTimeUtils.requireTzId(timezone)) val zonedMinDate = minDate?.withZoneSameLocal(DateTimeUtils.requireTzId(timezone)) val zonedMaxDate = maxDate?.withZoneSameLocal(DateTimeUtils.requireTzId(timezone)) @@ -66,19 +90,21 @@ fun DatePickerDialog( zonedDate.year*zonedDate.dayOfYear in (zonedMinDate?.year?:0)*(zonedMinDate?.dayOfYear?:0) until (zonedMaxDate?.year?:3000)*(zonedMaxDate?.dayOfYear?:367) else zonedDate.year*zonedDate.dayOfYear in (zonedMinDate?.year?:0)*(zonedMinDate?.dayOfYear?:0) .. (zonedMaxDate?.year?:3000)*(zonedMaxDate?.dayOfYear?:367) - */ return true } + */ val initialZonedDateTime = datetime ?.let { ZonedDateTime.ofInstant(Instant.ofEpochMilli(it), DateTimeUtils.requireTzId(timezone)) } ?: minDate val datePickerState = rememberDatePickerState( - initialSelectedDateMillis = initialZonedDateTime?.toInstant()?.toEpochMilli()?.plus(initialZonedDateTime.offset.totalSeconds*1000), + initialSelectedDateMillis = initialZonedDateTime?.toInstant()?.toEpochMilli()?.plus(initialZonedDateTime.offset.totalSeconds*1000) + /* selectableDates = object: SelectableDates { override fun isSelectableDate(utcTimeMillis: Long) = isValidDate((utcTimeMillis)) } + */ ) val timePickerState = rememberTimePickerState(initialZonedDateTime?.hour?:0, initialZonedDateTime?.minute?:0) @@ -113,6 +139,7 @@ fun DatePickerDialog( checked = datePickerState.selectedDateMillis != null, onCheckedChange = { datePickerState.selectedDateMillis = if (it) defaultDateTime.withZoneSameLocal(ZoneId.of("UTC")).toInstant().toEpochMilli() else null + datePickerState.displayMode = DisplayMode.Picker newTimezone = if (it) TZ_ALLDAY else null selectedTab = tabIndexDate }, @@ -183,7 +210,7 @@ fun DatePickerDialog( } } - AnimatedVisibility(selectedTab == tabIndexDate && datePickerState.selectedDateMillis == null) { + AnimatedVisibility(selectedTab == tabIndexDate && datePickerState.selectedDateMillis == null && datePickerState.displayMode != DisplayMode.Input) { Text( stringResource(id = R.string.not_set2), fontStyle = FontStyle.Italic, @@ -194,7 +221,7 @@ fun DatePickerDialog( ) } - AnimatedVisibility(selectedTab == tabIndexDate && datePickerState.selectedDateMillis != null) { + AnimatedVisibility(selectedTab == tabIndexDate && (datePickerState.selectedDateMillis != null || datePickerState.displayMode == DisplayMode.Input)) { Column(modifier = Modifier.verticalScroll(rememberScrollState())) { DatePicker( state = datePickerState, @@ -250,7 +277,7 @@ fun DatePickerDialog( TextButton( - enabled = datePickerState.selectedDateMillis?.let { isValidDate(it) } ?: true, + //enabled = datePickerState.selectedDateMillis?.let { isValidDate(it) } ?: true, onClick = { if (newTimezone != null && newTimezone != TZ_ALLDAY && !TimeZone.getAvailableIDs() .contains(newTimezone)