From d0bf3590d1abbaa254bd0c1e86ff1e889aab4490 Mon Sep 17 00:00:00 2001 From: b-mob-deck Date: Mon, 13 Jul 2026 08:10:19 +0000 Subject: [PATCH] =?UTF-8?q?feat(deck):=20=D0=B1=D1=8B=D1=81=D1=82=D1=80?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=BE=D0=BF=D1=86=D0=B8=D0=B8=20=D1=81=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0=20(=D0=A1=D0=B5=D0=B3=D0=BE=D0=B4=D0=BD?= =?UTF-8?q?=D1=8F/=D0=97=D0=B0=D0=B2=D1=82=D1=80=D0=B0/=D0=92=D1=8B=D1=85?= =?UTF-8?q?=D0=BE=D0=B4=D0=BD=D1=8B=D0=B5/=D0=9D=D0=B5=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D1=8F)=20=D0=B2=20=D0=BA=D0=B0=D1=80=D1=82=D0=BE=D1=87=D0=BA?= =?UTF-8?q?=D0=B5=20(P1=20diff)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DeckDueChip + deckQuickDueIso (полночь UTC, как пикер). Green compile+detekt (без новых замечаний). --- .../f7cloud/feature/deck/DeckCardSheet.kt | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/feature/deck/src/main/java/ru/forbion/f7cloud/feature/deck/DeckCardSheet.kt b/feature/deck/src/main/java/ru/forbion/f7cloud/feature/deck/DeckCardSheet.kt index 0f487dd..0307354 100644 --- a/feature/deck/src/main/java/ru/forbion/f7cloud/feature/deck/DeckCardSheet.kt +++ b/feature/deck/src/main/java/ru/forbion/f7cloud/feature/deck/DeckCardSheet.kt @@ -43,9 +43,13 @@ import ru.forbion.f7cloud.core.designsystem.F7Colors import ru.forbion.f7cloud.core.designsystem.F7OutlinedField import ru.forbion.f7cloud.core.designsystem.F7PrimaryButton import ru.forbion.f7cloud.core.designsystem.F7SecondaryButton +import java.time.DayOfWeek import java.time.Instant +import java.time.LocalDate import java.time.ZoneId +import java.time.ZoneOffset import java.time.format.DateTimeFormatter +import java.time.temporal.TemporalAdjusters @OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) @Composable @@ -120,6 +124,17 @@ fun DeckCardSheet( Text("Сбросить", color = F7Colors.Primary, style = MaterialTheme.typography.bodyMedium, modifier = Modifier.clickable { duedate = null }) } } + if (canEdit) { + FlowRow( + horizontalArrangement = Arrangement.spacedBy(6.dp), + verticalArrangement = Arrangement.spacedBy(6.dp), + ) { + DeckDueChip("Сегодня") { duedate = deckQuickDueIso(0) } + DeckDueChip("Завтра") { duedate = deckQuickDueIso(1) } + DeckDueChip("Выходные") { duedate = deckQuickDueIso(0, toWeekend = true) } + DeckDueChip("Неделя") { duedate = deckQuickDueIso(7) } + } + } // Метки доски if (boardLabels.isNotEmpty()) { @@ -291,6 +306,29 @@ fun DeckConfirmDialog( } } +@Composable +private fun DeckDueChip(text: String, onClick: () -> Unit) { + Box( + modifier = Modifier + .clip(RoundedCornerShape(100.dp)) + .background(F7Colors.SurfaceMuted) + .clickable(onClick = onClick) + .padding(horizontal = 10.dp, vertical = 4.dp), + ) { + Text(text, style = MaterialTheme.typography.bodyMedium, color = F7Colors.TextPrimary) + } +} + +/** ISO-срок для быстрых опций: сегодня/через N дней/ближайшая суббота (полночь UTC — как пикер). */ +private fun deckQuickDueIso(daysAhead: Long, toWeekend: Boolean = false): String { + val date = if (toWeekend) { + LocalDate.now().with(TemporalAdjusters.nextOrSame(DayOfWeek.SATURDAY)) + } else { + LocalDate.now().plusDays(daysAhead) + } + return DateTimeFormatter.ISO_INSTANT.format(date.atStartOfDay(ZoneOffset.UTC).toInstant()) +} + /** Парсит ISO-строку срока Deck в миллисекунды (для инициализации пикера). */ internal fun parseDeckDueMillis(iso: String): Long? = runCatching { Instant.parse(iso).toEpochMilli()