XPrivate ยท admin-MVP-1 ยท Wireframes โ€” Schedule Detail + Calendar ALIGNED aligned 2026-05-31
Index โ†’ admin-mvp-1-ia-handover.html ยท Stack: React 19 + TanStack Start (SPA) ยท shadcn amber b1MJ9vRwY6 ยท light-mode iter-1

Schedule Detail + Calendar โ€” Wireframes v2

WF3: 4 tab elaborated (clickable) ยท WF4: week + month view, conflict UX options, NO drag-reschedule (ganti explicit โ€” cegah accidental drag) ยท light mode ยท Indonesian ยท WIB

Wireframe 3 / 10 ยท v2

Detail Sesi โ€” 4 Tab Elaborated

Route: /schedule/:id ยท klik tab buat liat tiap isian ยท Role: ADMIN, OPS
Jadwal/Semua Sesi/Sesi #1042

Sesi #1042 โ€” Bahasa Mandarin ยท HSK 2

APPROVED
Budi Santoso โ†’ Andi Rahman ยท 28 Mei 2026, 19:00 WIB ยท Rumah siswa
Aksi (status Disetujui):
Detail
Materi
Pembatalan
Riwayat
Peserta
BS
Budi Santoso Tutor ยท GOL_2
+62 812-3456-7890 ยท 12.4 km
AR
Andi Rahman Siswa ยท SMP 8
Ortu: Ibu Sinta ยท +62 813-xxxx ยท Reguler+
Jadwal & Lokasi
Tanggal & jam28 Mei 2026, 19:00 WIB
Durasi90 menit
ModeOffline โ€” rumah siswa
AlamatJl. Cikini Raya 5 ยท ๐Ÿ“ peta
Harga (snapshot) ๐Ÿ”’ dikunci saat disetujui
Tagihan siswaRp 200.000
Honor tutor (khusus admin)Rp 140.000
TransportRp 10.000
MarginRp 50.000
Kebijakan pembatalan (snapshot)
Config v3 dikunci saat sesi disetujui. Denda berjenjang 100/50/25% sesuai sisa waktu ke sesi. Rincian di tab Pembatalan.
Kehadiran
โœ“ Siswa hadirโœ“ Tutor hadir
Jika salah satu tidak hadir, alur no-show berlaku (no-show siswa: tagih penuh / no-show tutor: eskalasi ke pembatalan).
Materi pembelajaran diisi tutor (admin dapat mengubah)
Foto laporan (R2)
๐Ÿ“ท buku.jpg
๐Ÿ“ท papan.jpg
+ Tambah foto
Diunggah oleh Budi Santoso (tutor) ยท 28 Mei 2026, 20:35 WIB ยท upload via presigned URL R2
โš  Simulasi: jika dibatalkan sekarang
Sisa waktu ke sesi3 jam 12 menit sebelum mulai
Jenjang denda berlakuโ‰ค 4 jam โ†’ 25%
Tagihan siswa (25% ร— Rp 200.000)Rp 50.000
Honor tutor (25% ร— Rp 140.000)Rp 35.000
TransportRp 0 (tutor tidak berangkat)
Penanggung denda ditentukan inisiatorSiswa / Tutor / Admin / Force majeure
Jenjang denda (snapshot) โ€” pembatalan oleh siswa
Sisa waktuTagihan siswaHonor tutor
< 1 jam100%100%
< 2 jam50%50%
< 4 jam โ† berlaku25%25%
โ‰ฅ 4 jam00
Override (khusus admin) wajib disertai alasan dan tercatat di audit. Tombol Batalkan sesi di action bar atas membuka wizard pembatalan (sheet): inisiator โ†’ sisa waktu otomatis โ†’ pratinjau denda โ†’ override โ†’ alasan.
Riwayat sesi (audit โ€” hanya tambah)
28 Mei 2026, 14:02
Disetujui โ€” slot dikunci, harga + kebijakan di-snapshot. oleh Fahrul A. ยท IP 103.xx
28 Mei 2026, 13:48
Menunggu โ€” sesi dibuat (langsung oleh admin). oleh Fahrul A.
28 Mei 2026, 13:48
Snapshot harga: tagihan Rp 200.000, honor Rp 140.000, transport Rp 10.000 (matrix v2026/2027). sistem
Setiap perubahan status dan edit tercatat. Retensi 7 tahun. Buka audit log lengkap (A1) untuk penanganan sengketa.

Isian per Tab (elaborated)

Tab Detail

Peserta (tutor+siswa, kontak, jarak, WA) ยท Jadwal & lokasi (datetime, durasi, mode, alamat+peta) ยท Harga snapshot (tagihan/honor/transport/margin, ๐Ÿ”’) ยท Kebijakan pembatalan snapshot.

Tab Materi

Kehadiran (siswa/tutor checkbox โ†’ no-show flow) ยท Materi (topik utama, sub-topik, halaman buku, PR/tugas, target sesi berikutnya) ยท Foto report (R2 presigned) ยท meta "diisi tutor kapan". Admin bisa edit kalo tutor lupa.

Tab Pembatalan (cancel calc preview)

Simulasi "jika dibatalkan sekarang" โ€” lead-time live + bracket berlaku + charge siswa/honor tutor/transport. Bracket config snapshot table. Operator liat impact SEBELUM commit. Override ADMIN + alasan.

Tab Riwayat (audit)

Timeline insert-only semua transisi state + edit (who/when/IP/before-after). Lazy-load. Retensi 7thn. Drill ke A1 full audit buat dispute.

Open Knobs

  • Tab Materi edit-by-admin: full edit atau view + "minta tutor lengkapi" nudge? Strawman = admin full edit (proxy iter-1).
  • Tab Pembatalan: simulasi real-time (recompute lead-time tiap buka) โ€” confirm.
  • Foto report: max berapa foto/sesi? Strawman = 5, masing-masing max 5MB.
Wireframe 4 / 10 ยท v2

Kalender โ€” Week + Month, Conflict UX, NO Drag

Route: /schedule/calendar ยท klik toggle Minggu/Bulan ยท reschedule = explicit (klik event โ†’ detail โ†’ tombol), BUKAN drag
Jadwal/Kalender
โš Jadwal bentrok โ€” perlu diselesaikanยท semua konflik mendatang (lintas-minggu)2
Budi Santoso terjadwal ganda Rab 28 Mei ยท 19:00 ยท minggu ini
Sesi #1042Budi โ†’ Andi ยท Mandarin HSK2 Disetujui โšก
BENTROK
Sesi #1051Budi โ†’ Rina ยท Mandarin Menunggu
Sari Maharani terjadwal ganda Sel 10 Jun ยท 16:00 ยท 2 minggu lagi
Sesi #1098Sari โ†’ Putri ยท Piano G3 Disetujui โšก
BENTROK
Sesi #1103Sari โ†’ Dimas ยท Piano Menunggu
26 โ€“ 31 Mei 2026
Cakupan: Global โ–พTutor: Semua โ–พ
Sen 26
Sel 27
Rab 28
Kam 29
Jum 30
Sab 31
15:00
Sari โ†’ Putri
Piano ยท SD 5
16:00
Sari โ†’ Putri
Piano ยท menunggu
17:00
Dedi โ†’ Reza
CPNS ยท selesai
18:00
19:00
โš  2 sesi bentrok
Budi โ†’ Andi
Mandarin
Budi โ†’ Rina
Mandarin
20:00
Maya โ†’ Tono
Bio ยท berlangsung
Klik slot kosong untuk buat sesi cepat. Klik event untuk buka detail (tombol Jadwal ulang / Batalkan ada di sana). Tidak ada drag โ€” mencegah jadwal ulang tidak sengaja.
MenungguDisetujuiBerlangsungSelesaiโš  konflik

Conflict Detection โ€” Current Approach + UX Options (elaborated)

Konflik = double-book (tutor sama, slot overlap). Akar: legacy gak ada DB constraint โ†’ race condition. v2 = GIST exclusion (DB-level prevention) + visual layer. Berikut opsi visual layer:
REKOMENDASI #1Prevention-first: block di create/approve time
Cegah konflik SEBELUM kejadian. Saat create/approve sesi โ†’ live check (debounced) โ†’ kalo overlap, inline error "Budi sudah ada sesi 19:00-20:30" + block submit. GIST constraint DB-level sebagai backstop (race-safe).
โœ“ Konflik gak pernah masuk. Best UX (Nielsen #5 error prevention). Race-safe.
โœ— Perlu live-check di form (debounce query). Gak bantu konflik yang udah terlanjur ada (legacy import).
REKOMENDASI #2Conflict banner + jump (top of calendar)
Banner merah di atas kalender: "1 konflik minggu ini โ€” [Lihat โ†’]". Klik โ†’ scroll/highlight ke konflik. Agregat, gak ke-miss walau scroll. (Lihat banner di mockup atas.)
โœ“ Visible walau event ke-scroll. Aggregate count. Actionable jump.
โœ— Butuh scan konflik per load. Reactive (udah terlanjur).
CURRENTInline red border + โš  pada event card
Event card yang overlap = border merah + โš  (lihat Rab 28 19:00 di mockup). Immediate context di lokasi konflik.
โœ“ Konteks tepat di lokasi. Langsung keliatan pas mandang slot itu.
โœ— Ke-miss kalo slot ke-scroll keluar viewport. Gak ada aggregate count.
ALTConflict badge di day header
Hari yang ada konflik โ†’ badge โš  di header kolom hari (week) / pojok day cell (month โ€” lihat 28 + 13 di month view). Glanceable per-hari.
โœ“ Glanceable per-hari. Bagus di month view (density tinggi).
โœ— Gak nunjuk slot persis. Perlu drill.
ALTDedicated conflict panel / "Resolusi Konflik"
Panel/tab terpisah list semua konflik + aksi resolve (reschedule salah satu / cari pengganti / cancel). Buat ops yang sering handle konflik.
โœ“ Satu tempat resolve semua. Workflow-oriented.
โœ— Over-engineered iter-1 kalo konflik jarang. Extra surface.
Rekomendasi REVISI iter-1 (per feedback: konflik harus UNMISSABLE): Subtle in-grid border kurang ke-notice โ€” jadi ELEVATE konflik ke high-salience:
  1. #1 Prevention (block di create/approve + GIST) โ€” konflik BARU gak pernah lolos. PRIMARY defense.
  2. Conflict Resolver card (prominent, atas kalender) โ€” buat konflik EXISTING: merah, listed, pasangan sesi + aksi resolve 1-klik (reschedule/cari pengganti/tolak). Ini element unmissable utama (revisi: gue tadinya bilang panel over-engineered โ€” feedback lu bener, ini WAJIB buat noticeability).
  3. Toolbar conflict pill "โš  1 Konflik" (merah, selalu visible) โ€” persistent reminder walau resolver di-dismiss.
  4. Strong cell + day treatment โ€” slot bentrok = bg merah + label "โš  Bentrok 2 sesi". Month day = bg merah + day-number merah.
4 layer reinforcing: prevention (gak lolos) + resolver (actionable) + pill (persistent) + grid (kontekstual). Gak mungkin ke-miss.
Scope resolver = GLOBAL future conflicts (lintas-minggu), bukan cuma view aktif. Konflik 2 minggu lagi tetap muncul walau lu lagi liat minggu ini โ€” gak ilang pas navigate. Past conflict (sesi udah lewat) โ†’ gak di resolver (gak bisa fix), flag di audit/report. Toolbar pill = global count. Banyak konflik (rare, prevention block mayoritas) โ†’ card list top + "lihat semua" kalo >N.

Komponen Kunci

NO drag-reschedule (founder concern)

Buang drag โ€” cegah accidental reschedule (mis-schedule = sesi salah jadwal = fatal). Reschedule = explicit: klik event โ†’ detail sheet โ†’ tombol "Reschedule" โ†’ wizard pick datetime + confirm. Deliberate, gak accidental.

Conflict = prevention-first

GIST exclusion DB + live-check di create/approve. Block sebelum kejadian. Visual (banner+border+badge) buat existing.

Week + Month view

Week = time-grid detail (slot-level). Month = density overview (pill count per hari + status warna + konflik badge). Klik hari month โ†’ drill week.

Quick-create on slot

Klik slot kosong (week) / hari (month) โ†’ quick-create sheet pre-fill datetime + smart-default tutor.

Components

Custom grid (Tailwind). ToggleGroup (week/month). Sheet (event detail + reschedule wizard). Popover (hover preview). Alert (conflict banner). NO drag lib.

Status color + text (a11y)

Warna status BUKAN satu-satunya signal โ€” ada label teks ("req"/"done"/"IN PROG"). Color-blind safe. WCAG.

Open Knobs

  • Conflict approach final: rekomendasi #1+#2+inline. Confirm? Atau tambah panel (#5)?
  • Month pill: count-only ("3 sesi") atau show nama? Strawman = count + warna dominan (hemat space), hover/klik detail.
  • Week jam range: dynamic collapse jam kosong atau fixed 15:00-21:00? Strawman = dynamic.
  • Quick-create on empty slot: confirm include iter-1 (smart-default tutor).
4 / 10 wireframes (v2 schedule) โ€” tabs elaborated ยท month view ยท conflict UX options ยท no-drag.
Sisa: Audit Log ยท Tutup Periode Wizard ยท Pembatalan Sheet ยท Cron Jobs ยท Dashboard ยท โŒ˜K Palette.