Skip to content

FormDatetime

Calendar/clock date-time picker dengan 8 mode (date, range, multi-pick, time), keyboard navigation penuh, dan typeable input.

Bagian dari: vue-saform · Family: Notch

FormDatetime menutupi 8 bentuk picker sekaligus lewat satu mode prop: tanggal tunggal, rentang tanggal, multi-pick tanggal, tanggal+jam (single/rentang), dan jam saja (single/rentang). Grid kalender/clock-nya full keyboard-navigable — arrow key geser cursor dengan rollover otomatis ke bulan/tahun/dekade berikutnya di tepi grid, Escape selalu menutup panel tanpa keyboard trap. Mode date/dateTime juga bisa diketik langsung (urutan segmen diatur dateOrder), tidak cuma klik kalender. Sama seperti FormSelect, panelnya bisa inline atau detached jadi modal, dengan breakpoint responsif via detach="small".


Import

ts
import { FormDatetime } from '@bpmlib/vue-saform';

Instalasi: lihat Installation & Setup di halaman utama.


Usage

vue
<script setup lang="ts">
import { ref } from 'vue';
import { FormDatetime, required } from '@bpmlib/vue-saform';

const birthDate = ref<Date | null>(null);
</script>

<template>
  <FormDatetime id="birth-date" v-model="birthDate" label="Tanggal Lahir" mode="date" :validation="required()" />
</template>

API Reference

NOTE

Keyboard grid-cursor, typing-guard, dan floating position dibangun di atas composable internal (useDateGridCursor, useDateTyping, useFloatingPosition), tidak diekspos secara publik. Lihat Core Concepts di halaman utama untuk arsitektur detach.

FormDatetime

Cara Penggunaan:

mode menentukan bentuk picker dan shape modelValue. Mode 'date'/'dateTime' mendukung ketik langsung di input (dateOrder mengatur urutan segmen) — mode lain calendar/clock-only.

Accessibility:

Component ini sudah include built-in accessibility features:

  • Keyboard navigation: Arrow key menggeser cursor grid (dengan rollover ke bulan/tahun/dekade berikutnya di tepi grid), Space memilih tanpa submit, Enter submit (mode 'date''s day grid saja)
  • Escape: Selalu menutup panel, bahkan saat mid-typing — tidak ada keyboard trap

Props

NameTypeDefaultDescription
idstring-Id input, juga dipakai sebagai name. Wajib.
labelstring-Teks floating label
placeholderstring-
disabledbooleanfalse
readonlybooleanfalseNative readonly — juga mencegah membuka calendar (sama seperti disabled)
requiredbooleanfalseBuilt-in rule required(), dijalankan terhadap modelValue
hasErrorbooleanfalsePaksa visual error state terlepas dari internal validation state
titlestring-Native title attribute
modeDatetimeMode'date'Bentuk picker yang di-render/dikembalikan
maxPicksnumberUnlimitedmode="datePicks" saja — batas maksimum tanggal yang bisa dipilih
withSecondbooleanfalseTampilkan field detik di clock UI (mode dateTime/dateTimeRange/time/timeRange)
withWeekNumberbooleanfalseTampilkan kolom nomor minggu ISO di day grid
minDateDate | string-Batas bawah inklusif — tanggal sebelum ini disabled
maxDateDate | string-Batas atas inklusif — tanggal setelah ini disabled
returnStringDatebooleanfalseEmit string YYYY-MM-DD HH:mm:ss alih-alih Date object (mode date/dateTime-shaped saja — mode time/timeRange sudah emit string)
dateOrder'dmy' | 'mdy' | 'ymd''dmy'Urutan segmen untuk parsing teks yang diketik, mode 'date'/'dateTime' saja
detachboolean | 'small'falseDetach panel ke Teleport+backdrop modal Lihat selengkapnya
validationValidationInput<unknown>-Custom validation rule(s), jalan bersama built-in required
messagesValidationMessages-Override pesan validasi default, di-shallow-merge
hideValidationbooleanfalseSkip seluruh perhitungan pesan validasi internal

NOTE

detach di FormDatetime bersifat presentation-only — tidak ada konsep staged-commit seperti FormSelect. Setiap mode sudah hanya commit lewat Confirm button eksplisit, Enter (mode 'date'), atau dblclick, terlepas dari detach.

DatetimeMode

Values:

ts
type DatetimeMode =
  | 'date'            // Satu tanggal
  | 'dateRange'        // Rentang tanggal (start-end)
  | 'dateRangeAll'      // Rentang tanggal, semua hari di antaranya ikut terpilih
  | 'datePicks'         // Multi-pick tanggal individual (lihat maxPicks)
  | 'dateTime'          // Tanggal + jam
  | 'dateTimeRange'      // Rentang tanggal + jam
  | 'time'             // Jam saja
  | 'timeRange';        // Rentang jam

Model

NameTypeDefaultDescription
v-modelstring | number | Date | Array<string | number | Date> | nullnullShape tergantung mode — single value untuk date/dateTime/time, array untuk mode range/multi-pick

Events

NamePayloadDescription
change-Fired bersamaan dengan update:modelValue saat value ter-commit

Slots

NamePropsDescription
description-Baris deskripsi di bawah field
errors-Baris pesan error custom, menggantikan pesan validasi bawaan

Exposed

NameTypeDescription
validate()() => Promise<boolean>Jalankan validasi, return true jika valid
open()() => voidBuka panel calendar secara programmatic Lihat selengkapnya
open()

Membuka panel calendar secara programmatic (mis. dari tombol eksternal). No-op jika disabled/readonly.

Signature:

ts
open: () => void

Contoh:

vue
<script setup lang="ts">
const dtRef = ref();
</script>

<template>
  <FormDatetime ref="dtRef" id="date" v-model="date" />
  <button @click="dtRef.open()">Buka Kalender</button>
</template>

Contoh:

vue
<FormDatetime
  id="range"
  v-model="range"
  label="Periode"
  mode="dateRange"
  :min-date="new Date()"
  detach="small"
/>

Examples

1. Date + Time dengan Detik

vue
<FormDatetime id="schedule" v-model="schedule" label="Jadwal" mode="dateTime" with-second />

2. Multi-Pick dengan Batas

vue
<FormDatetime id="event-dates" v-model="eventDates" label="Tanggal Event" mode="datePicks" :max-picks="5" />

3. Typeable Input dengan Urutan Segmen

vue
<FormDatetime id="dob" v-model="dob" label="Tanggal Lahir" mode="date" date-order="ymd" />
<!-- User bisa ketik langsung "2024-03-15", bukan hanya klik kalender -->

4. Rentang Waktu dengan Nomor Minggu

vue
<FormDatetime id="working-hours" v-model="hours" label="Jam Kerja" mode="timeRange" with-week-number />

Styling

Styling sepenuhnya self-contained — lihat Import CSS di halaman utama. Component akan tampil fully styled langsung setelah import, tanpa setup tambahan.

CSS Variables

VariableDefaultDescription
--sa-fm-panel-z40 (inline) / 50 (detached)z-index panel calendar/modal. Sama seperti FormSelect
--sa-fm-error-list-styledisclist-style-type untuk error list. Sama seperti FormInput

Bagian dari family Notch:

  • FormInput — text/number/email/password/currency input
  • FormTextarea — versi <textarea>
  • FormSelect — single/multi-select, berbagi konsep detach yang sama