Pantrix UI

Time Text Field

Günün bir saati için bir metin alanı: saat rakamlarla yazılır ya da kutunun sonundaki bir düğmenin açtığı bir saat seçiciden seçilir.

import com.pantrixui.components.date.timetextfield.PantrixTimeTextField

Örnekler

Toplantı başlangıcı, çeyrek saatlerle

Bir toplantının başlangıcı, çeyrek saatlerle: seçicinin dakikaları on beşer dakika arayla gelir. Yazarken aradaki bir dakika da alınır. Saat tamamlanınca altta yazılır.

var start by remember { mutableStateOf<PantrixTime?>(null) }
val strings = PantrixTheme.strings
Column(verticalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm)) {
    PantrixTimeTextField(
        value = start,
        onValueChange = { start = it },
        label = "Toplantı başlangıcı",
        minuteStep = QUARTER,
        showClearButton = true,
        tagKey = "meeting_start"
    )
    PantrixText(
        text = start?.let { "Başlangıç: ${strings.time(it.hour, it.minute, is24Hour = true)}" }
            ?: "Henüz bir saat yok",
        style = PantrixTheme.typography.body
    )
}

private const val QUARTER = 15

Çalışma saatleri içinde

Çalışma saatleri içinde bir arama: 09:00'dan önce ya da 18:00'den sonra yazılan bir saat alınmaz ve alan iki ucu söyler. Seçicide aralık dışındaki saatler soluktur ve basılmaz.

var call by remember { mutableStateOf<PantrixTime?>(null) }
PantrixTimeTextField(
    value = call,
    onValueChange = { call = it },
    label = "Arama saati",
    supportingText = "Hafta içi 09:00 ile 18:00 arası",
    minTime = PantrixTime(OPENS, 0),
    maxTime = PantrixTime(CLOSES, 0),
    tagKey = "call"
)

private const val OPENS = 9

private const val CLOSES = 18

12 saatlik saat

12 saatlik bir saat: saatler 01–12 yazılır, günün yarısı kutuda rakamların yanında durur. Ona basmak ÖÖ ile ÖS arasında çevirir; seçicide de üçüncü bir sütun olarak gelir.

var alarm by remember { mutableStateOf<PantrixTime?>(PantrixTime(7, 30)) }
val strings = PantrixTheme.strings
Column(verticalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm)) {
    PantrixTimeTextField(
        value = alarm,
        onValueChange = { alarm = it },
        label = "Alarm",
        is24Hour = false,
        tagKey = "alarm"
    )
    PantrixText(
        text = alarm?.let { "Alarm: ${strings.time(it.hour, it.minute, is24Hour = false)}" } ?: "Alarm kapalı",
        style = PantrixTheme.typography.body
    )
}

Seçici bir sheet'te ya da dialog'da

Seçici bir sheet'te açılır: telefonda parmağa yakın, ekranın genişliğinde. presentation = Dialog onu pencerenin ortasında bir dialog'da açar. Sheet her basışta açık kalır; dışarı basmak ya da geri onu kapatır.

var pickup by remember { mutableStateOf<PantrixTime?>(null) }
var presentation by remember { mutableStateOf(DatePickerPresentation.Sheet) }
Column(verticalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm)) {
    PantrixSegmentButton(
        options = listOf(
            SegmentOption(DatePickerPresentation.Popover, "Popover", tagKey = "popover"),
            SegmentOption(DatePickerPresentation.Sheet, "Sheet", tagKey = "sheet"),
            SegmentOption(DatePickerPresentation.Dialog, "Dialog", tagKey = "dialog")
        ),
        selected = presentation,
        onSelect = { presentation = it },
        fullWidth = false,
        tagKey = "presentation"
    )
    PantrixTimeTextField(
        value = pickup,
        onValueChange = { pickup = it },
        label = "Teslim alma saati",
        minuteStep = FIVE_MINUTES,
        presentation = presentation,
        tagKey = "pickup"
    )
}

private const val FIVE_MINUTES = 5

Uygulamanın hatası ve devre dışı

Uygulamanın kendi hatası alanınkinden önce gelir: dolu bir saat error ve supportingText ile söylenir. Altındaki alan devre dışıdır: odak almaz, seçicisi açılmaz.

var slot by remember { mutableStateOf<PantrixTime?>(PantrixTime(BOOKED, 0)) }
val taken = slot == PantrixTime(BOOKED, 0)
PantrixTimeTextField(
    value = slot,
    onValueChange = { slot = it },
    label = "Randevu saati",
    supportingText = if (taken) "Bu saat dolu, başka bir saat seçin" else "Yarım saatlik bir randevu",
    error = taken,
    tagKey = "slot"
)
PantrixTimeTextField(
    value = PantrixTime(OPENS, 0),
    onValueChange = {},
    enabled = false,
    label = "Açılış saati",
    tagKey = "opening"
)

private const val OPENS = 9

private const val BOOKED = 14

Salt okunur: yalnız seçiciden

Salt okunur bir alan yazılmaz: saat yalnız seçiciden seçilir. Kutuya basmak, Enter ya da Boşluk seçiciyi açar. Saatin bir listeden seçilmesi gereken yerler için.

var departure by remember { mutableStateOf<PantrixTime?>(null) }
PantrixTimeTextField(
    value = departure,
    onValueChange = { departure = it },
    readOnly = true,
    label = "Kalkış saati",
    placeholder = "Seçiciden seçin",
    minuteStep = QUARTER,
    tagKey = "departure"
)

private const val QUARTER = 15

Forma bağlı

Bir formun alanına bağlı: saat boşken "Kaydet" hatayı gösterir ve odağı alana gönderir. Hata alandan çıkınca da görünür; seçiciye geçmek alandan çıkmak sayılmaz. Saat olmayan rakamlar değeri null bırakır, kural onu yakalar.

val form = rememberFormState()
val scope = rememberCoroutineScope()
val report = LocalExampleEvents.current
val start = form.field<PantrixTime?>("shift_start", initial = null, Rules.required("Vardiyanın başlangıcını yazın"))
PantrixTimeTextField(
    field = start,
    modifier = Modifier.fillMaxWidth(),
    form = form,
    label = "Vardiya başlangıcı",
    minuteStep = QUARTER
)
PantrixButton(
    text = "Kaydet",
    onClick = { scope.launch { form.submit { report("Kaydedildi") } } },
    form = form,
    tagKey = "save_shift"
)

private const val QUARTER = 15

Bir durumla

Bir durumla: state.time alanın saati, state.text yazılan rakamlar. İkisi birlikte boş alanı yarım yazılmış alandan ayırır. Düğme durumun saatini değiştirir; alan onu kendisi yazar, 12 saatte günün yarısıyla birlikte.

val state = rememberTimeTextFieldState()
Column(verticalArrangement = Arrangement.spacedBy(PantrixTheme.spacing.sm)) {
    PantrixTimeTextField(
        state = state,
        label = "Hatırlatma",
        is24Hour = false,
        tagKey = "reminder"
    )
    PantrixText(
        text = when {
            state.time != null -> "Saat: ${state.time}"
            state.text.isEmpty() -> "Alan boş"
            else -> "Yarım: ${state.text}"
        },
        style = PantrixTheme.typography.body
    )
    PantrixButton(
        text = "Şimdiyi yaz",
        onClick = { state.time = PantrixTime.now() },
        variant = ButtonVariant.Outline,
        tagKey = "write_now"
    )
}

API

value

Günün bir saati için bir metin alanı: saat rakamlarla yazılır ya da kutunun sonundaki bir düğmenin açtığı bir saat seçiciden seçilir.

ParametreTürVarsayılanNe olduğu
valuePantrixTime?alanın gösterdiği saat ya da null.
onValueChange(PantrixTime?) -> Unitkullanıcı alanın saatini her değiştirdiğinde söylenir: bir saat, ya da hiçbiri için null.
modifierModifierModifierbütün alanın modifier'ı: etiketi, kutusu ve altındakiler.
enabledBooleantruealanın kullanılıp kullanılamayacağı. Kullanılamayan bir alan odak almaz ve seçici açmaz.
readOnlyBooleanfalsesaatin yazılmayıp yalnız seçiciden seçilip seçilemeyeceği.
labelString?nullalanın ne için olduğu, kutunun üstüne yazılır: ekran okuyucu için alanın ve seçicisinin adı.
placeholderString?nullkutu boşken, alanın kendisinin gösterdiği düzenin yerinde gösterilir.
supportingTextString?nullkutunun altındaki yardım. error ile neyin düzeltileceğini söyleyen mesajdır; onsuz, alanın kendi hatası varken onun yerini alır.
errorBooleanfalseçağıranın saati yanlış bulup bulmadığı, önceden alınmış bir saat gibi: alan hatalı çizilir ve mesaj supportingText'tir.
leadingIcon(@Composable () -> Unit)?nullmetnin önünde duran. Bir yuva içine konanı boyutlandırmaz.
showClearButtonBooleanfalsealan yazılabilirken ve boş değilken onu boşaltan bir düğme gösterir.
minTimePantrixTime?nullalanın aldığı ilk saat ya da ilk olmaması için null. maxTime'dan sonraysa saatler bir gecenin saatleri gibi gece yarısını geçer.
maxTimePantrixTime?nullalanın aldığı son saat ya da son olmaması için null.
minuteStepInt1seçicinin dakikalarının kaç dakika arayla geldiği, 1 ile 60 arası. Aralarında yazılan bir dakika alınır.
is24HourBooleantruealanın ve seçicisinin bir günün saatlerini, 00 ile 23 arasını mı, yoksa 12 saatlik bir saatle mi saydığı.
presentationDatePickerPresentationDatePickerPresentation.Adaptiveseçicinin neyde açıldığı: varsayılan dar bir pencerede bir sheet, daha geniş pencerede kutunun altında bir popover, açılırken seçilir; ya da her zaman bir popover, bir sheet ya da bir dialog.
styleTextFieldStyle?nullalanın bu çağrıya ait stili: kapsayan her stilin üstünde, yoğunluğun altında.
colorsTextFieldColors?nullbu çağrının alanın kendi renkleri, temanın rollerinin yerine.
pickerStyleTimePickerStyle?nullbu çağrının kendi seçici stili.
pickerColorsTimePickerColors?nullbu çağrının kendi seçici renkleri.
contentDescriptionString?nulllabel'ı olmayan alan için ekran okuyucunun söylediği.
tagKeyString?nullalanın otomasyon anahtarı: alan TimeTextField_<tagKey>, düğmesi TimeTextFieldClock_<tagKey>, günün yarısı TimeTextFieldPeriod_<tagKey>, temizleme düğmesi TimeTextFieldClear_<tagKey> ve seçicisi TimePicker_<tagKey>'dır. Alan seçicinin açıldığını ve onda bir değer seçildiğini bildirir, saati hiçbir zaman bildirmez.
interactionSourceMutableInteractionSource?nullalanın etkileşimleri, dışarı taşınmış: odağı, üstündeki işaretçi ve basışları.

state

Çağıranın tuttuğu bir state üzerinde bir saat alanı; başka her bakımdan bir değerin PantrixTimeTextField'ı gibidir: durumun time'ı alanın saatidir, onu yazmak saati alana koyar, text'i de yarım yazılmış bir alanı boş bir alandan ayırır.

ParametreTürVarsayılanNe olduğu
stateTimeTextFieldStateyazılan rakamlar ve onların ettiği saat. rememberTimeTextFieldState() ile oluşturun.
modifierModifierModifierbütün alanın modifier'ı: etiketi, kutusu ve altındakiler.
enabledBooleantruealanın kullanılıp kullanılamayacağı. Kullanılamayan bir alan odak almaz ve seçici açmaz.
readOnlyBooleanfalsesaatin yazılmayıp yalnız seçiciden seçilip seçilemeyeceği.
labelString?nullalanın ne için olduğu, kutunun üstüne yazılır: ekran okuyucu için alanın ve seçicisinin adı.
placeholderString?nullkutu boşken, alanın kendisinin gösterdiği düzenin yerinde gösterilir.
supportingTextString?nullkutunun altındaki yardım. error ile mesajdır; onsuz, alanın kendi hatası varken onun yerini alır.
errorBooleanfalseçağıranın saati yanlış bulup bulmadığı: alan hatalı çizilir ve mesaj supportingText'tir.
leadingIcon(@Composable () -> Unit)?nullmetnin önünde duran.
showClearButtonBooleanfalsealan yazılabilirken ve boş değilken onu boşaltan bir düğme gösterir.
minTimePantrixTime?nullalanın aldığı ilk saat ya da ilk olmaması için null; maxTime'dan sonraysa saatler gece yarısını geçer.
maxTimePantrixTime?nullalanın aldığı son saat ya da son olmaması için null.
minuteStepInt1seçicinin dakikalarının kaç dakika arayla geldiği, 1 ile 60 arası.
is24HourBooleantruealanın ve seçicisinin bir günün saatlerini mi, yoksa 12 saatlik bir saatle mi saydığı.
presentationDatePickerPresentationDatePickerPresentation.Adaptiveseçicinin neyde açıldığı: varsayılan dar bir pencerede bir sheet, daha geniş pencerede kutunun altında bir popover, açılırken seçilir; ya da her zaman bir popover, bir sheet ya da bir dialog.
styleTextFieldStyle?nullbu çağrının alanın kendi stili.
colorsTextFieldColors?nullbu çağrının alanın kendi renkleri.
pickerStyleTimePickerStyle?nullbu çağrının kendi seçici stili.
pickerColorsTimePickerColors?nullbu çağrının kendi seçici renkleri.
contentDescriptionString?nulllabel'ı olmayan alan için ekran okuyucunun söylediği.
tagKeyString?nullalanın otomasyon anahtarı; bir değerin PantrixTimeTextField'ı onu nasıl alıyorsa öyle.
interactionSourceMutableInteractionSource?nullalanın etkileşimleri, dışarı taşınmış.

field

Bir formun alanına bağlı bir saat alanı: saati, hatası ve adı field'dan gelir.

ParametreTürVarsayılanNe olduğu
fieldFormField<PantrixTime?>saat alanının gösterdiği ve değiştirdiği formun alanı.
modifierModifierModifierbütün alanın modifier'ı.
formFormState?nullverilirse klavyenin eylem tuşu formu ona kayıtlı düğme üzerinden gönderir.
enabledBooleantruealanın kullanılıp kullanılamayacağı.
readOnlyBooleanfalsesaatin yalnız seçiciden seçilip seçilemeyeceği.
labelString?nullalanın ne için olduğu, kutunun üstünde yazılı.
placeholderString?nullkutu boşken, düzenin yerinde gösterilir.
supportingTextString?nullkutunun altındaki yardım, alanın orada gösterecek bir hatası yokken.
leadingIcon(@Composable () -> Unit)?nullmetnin önünde duran.
showClearButtonBooleanfalsealan yazılabilirken ve boş değilken onu boşaltan bir düğme gösterir.
minTimePantrixTime?nullalanın aldığı ilk saat ya da ilk olmaması için null; maxTime'dan sonraysa saatler gece yarısını geçer.
maxTimePantrixTime?nullalanın aldığı son saat ya da son olmaması için null.
minuteStepInt1seçicinin dakikalarının kaç dakika arayla geldiği, 1 ile 60 arası.
is24HourBooleantruealanın ve seçicisinin bir günün saatlerini mi, yoksa 12 saatlik bir saatle mi saydığı.
presentationDatePickerPresentationDatePickerPresentation.Adaptiveseçicinin neyde açıldığı: varsayılan dar bir pencerede bir sheet, daha geniş pencerede kutunun altında bir popover, açılırken seçilir; ya da her zaman bir popover, bir sheet ya da bir dialog.
styleTextFieldStyle?nullbu çağrının alanın kendi stili.
colorsTextFieldColors?nullbu çağrının alanın kendi renkleri.
pickerStyleTimePickerStyle?nullbu çağrının kendi seçici stili.
pickerColorsTimePickerColors?nullbu çağrının kendi seçici renkleri.
contentDescriptionString?nulllabel'ı olmayan alan için ekran okuyucunun söylediği.
interactionSourceMutableInteractionSource?nullalanın etkileşimleri, dışarı taşınmış.

TextFieldStyle

PantrixTextField'ın kutusu: şekli, en az yüksekliği ve genişliği, metninin çevresindeki boşluk, ikonları ve kenarlığı.

ParametreTürVarsayılanNe olduğu
shapeShapeSpecShapeSpec.UnspecifiedKutunun şekli. Tam yuvarlak bir şekil, ShapeRole.Full, yalnızca alan tek satır tutarken bir haptır: birkaç satırlı bir alan onun yerine ShapeRole.Large alır, çünkü bir kapsülün eğrisi metninin ilk satırına girer.
heightDpDp.UnspecifiedKutunun en az yüksekliği.
minWidthDpDp.UnspecifiedKutunun en az genişliği: boş bir alanın, kullanıcı içine yazdıkça genişlemesini önler.
horizontalPaddingDpDp.Unspecifiedİkon olmayan yerde, kutunun kenarı ile metni arasındaki boşluk.
verticalPaddingDpDp.UnspecifiedMetnin ilk satırının üstündeki ve son satırının altındaki boşluk.
iconPaddingDpDp.UnspecifiedYuvasındaki bir ikonun çevresindeki boşluk.
iconSizeDpDp.UnspecifiedYuvadaki bir ikonun alması gereken boyut. Yuva, içine konanı boyutlandırmaz.
borderWidthDpDp.UnspecifiedKutunun kenarlığının kalınlığı.
focusedBorderWidthDpDp.UnspecifiedAlan odaktayken kenarlığın kalınlığı: odağı gösteren kenarlıktır.
textRoleTypeRole?nullMetnin yazıldığı, yer tutucunun da yazıldığı yazı ölçeği rolü: Android'de ve iOS'ta body, 16sp, Material 3'ün ve iOS'un bir alana yazdığı gibi; masaüstünde ve web'de label, 14sp, işaretçiyle kullanılan bir sayfadaki gibi. Bir select'in kutusu ve bu stille kurulan alanlar da onu alır.

TextFieldColors

Temanın renklerini almayan bir alan için PantrixTextField'ın boyandığı renkler: verilen renk kullanılır, verilmeyen temadaki rolünde kalır. Bir ürün yalnızca değiştirdiği renkleri verir, başkasını vermez:

ParametreTürVarsayılanNe olduğu
containerColorColor.UnspecifiedKutunun dolgusu. Temanın surface rengi.
borderColorColor.UnspecifiedDinlenirken kutunun kenarlığı. Temanın border rengi.
hoveredBorderColorColor.UnspecifiedFare üstündeyken kenarlık. Temanın borderHover rengi: border'dan bir basamak güçlüsü.
focusedBorderColorColor.UnspecifiedAlan odaktayken kenarlık. Temanın primary rengi.
errorColorColor.UnspecifiedMetnin yanlış olduğunu söyleyenler: kenarlık, etiket, kutunun altındaki mesaj, imleç ve sınırını aştığında sayaç. Temanın danger rengi.
textColorColor.UnspecifiedYazılan metin. Temanın textPrimary rengi.
labelColorColor.UnspecifiedKutunun üstündeki etiket. Verilmezse, alanın durduğu yerde herhangi bir metin nasıl çiziliyorsa öyle çizilir, çünkü etiket kutunun dışında, alan neyin üstüne konmuşsa onun üstündedir: temanın kendi zemininde textPrimary ile, bir dolgunun üstünde o dolgunun içerik rengiyle.
placeholderColorColor.UnspecifiedYer tutucu. Temanın textSecondary rengi.
supportingTextColorColor.UnspecifiedKutunun altındaki yardım metni ve sayaç. Temanın textSecondary rengi.
iconColorColor.UnspecifiedYuvadaki bir ikonun, kendi rengini vermedikçe çizildiği renk ve temizleme düğmesinin çarpısı. Temanın textSecondary rengi.
cursorColorColor.Unspecifiedİmleç ve onunla birlikte bir seçimin tutamaçları ile zemini. Temanın primary rengi.
scrollBarColorColor.UnspecifiedBirkaç satırlı bir kutunun metninin ne kadar kaydığını gösteren çubuk. Temanın borderStrong'u: metnin yanında bir işarettir ve kutunun yumuşak kenarı orada görünmezdi.