Merancang Resource Filament yang Enak Dipakai Staf Non-Teknis
Sebagai orang yang cukup lama membangun sistem internal untuk fasilitas kesehatan, saya belajar satu hal yang sering diremehkan developer: resource admin yang "berfungsi" secara teknis belum tentu bisa dipakai oleh staf yang bukan orang IT. Filament memudahkan kita membangun CRUD dengan cepat, tapi kemudahan itu bisa berbalik jadi masalah kalau kita cuma menempel field ke kolom database tanpa mikir siapa yang akan mengisinya tiap hari. Staf pendaftaran, admin gudang, atau petugas rekam medis biasanya tidak peduli soal arsitektur di baliknya — mereka cuma mau isi form, klik simpan, dan lanjut kerja. Kalau form itu bikin bingung atau bikin takut salah klik, yang rugi bukan cuma produktivitas, tapi juga kualitas data yang akhirnya kita olah lagi belakangan.
Label yang Bicara Bahasa Pengguna, Bukan Bahasa Database
Godaan paling umum di Filament adalah membiarkan label otomatis dari nama kolom, misalnya tgl_lahir jadi "Tgl Lahir" atau is_active jadi "Is Active". Itu masuk akal buat developer, tapi asing buat pengguna. Saya selalu eksplisit menulis label yang sesuai istilah yang dipakai staf sehari-hari.
TextInput::make('nama_lengkap')
->label('Nama Lengkap Pasien')
->placeholder('Sesuai KTP/kartu identitas'),
Toggle::make('is_active')
->label('Masih Aktif Berobat?')
Placeholder dan helper text juga saya manfaatkan untuk menjelaskan konteks singkat, bukan cuma dekorasi. Kalau ada istilah yang berpotensi ambigu antar unit kerja, saya tambahkan ->helperText() satu kalimat pendek daripada berharap staf bertanya ke IT setiap kali bingung.
Default Value yang Mengurangi Beban Berpikir
Setiap field yang nilainya bisa ditebak dari konteks sebaiknya sudah terisi otomatis. Ini bukan soal malas, tapi soal mengurangi jumlah keputusan yang harus dibuat pengguna di form yang panjang. Tanggal input misalnya, hampir selalu masuk akal default-nya hari ini.
DatePicker::make('tanggal_input')
->default(now())
->native(false),
Select::make('status')
->options([
'draft' => 'Draft',
'selesai' => 'Selesai',
])
->default('draft')
Prinsip yang saya pegang: default value harus mewakili kasus paling umum, bukan kasus paling aman secara sistem. Sebagai ilustrasi, kalau mayoritas entri form memang berstatus draft saat pertama dibuat, jadikan itu default — jangan biarkan kolom kosong lalu memaksa pengguna memilih dari opsi yang sebenarnya sudah jelas jawabannya.
Validasi yang Menuntun, Bukan Menyalahkan
Ini bagian yang paling sering luput. Validasi Filament secara default sudah cukup bagus, tapi pesan errornya sering terlalu teknis atau terlalu generik seperti "The field is required." Saya selalu menimpanya dengan pesan yang menjelaskan apa yang harus dilakukan pengguna, bukan sekadar bilang ada yang salah.
TextInput::make('nomor_telepon')
->required()
->numeric()
->validationMessages([
'required' => 'Nomor telepon wajib diisi untuk konfirmasi.',
'numeric' => 'Isi nomor telepon tanpa spasi atau tanda baca.',
])
Saya juga menghindari validasi yang terlalu ketat di awal — misalnya format nomor yang sangat kaku — kalau data sebenarnya bisa dinormalisasi di sisi server. Lebih baik terima input yang sedikit longgar lalu dibersihkan lewat dehydrateStateUsing(), daripada membuat staf frustrasi karena form terus menolak input yang menurut mereka sudah benar. Validasi yang baik terasa seperti rekan kerja yang mengingatkan, bukan satpam yang menahan pintu.
Takeaway
Resource Filament yang enak dipakai staf non-teknis bukan soal fitur canggih, tapi soal empati kecil yang konsisten: label yang jujur ke bahasa pengguna, default yang menebak kebutuhan paling umum, dan validasi yang menjelaskan cara memperbaiki, bukan sekadar menolak. Kalau ada waktu, coba duduk sebentar di samping staf yang akan pakai form itu — biasanya lima menit observasi langsung lebih membuka mata daripada berjam-jam menebak dari kursi developer.