# Panduan Gaya Kode Dokumen ini mencatat konvensi penulisan kode di proyek ini, supaya kontributor (termasuk AI assistant) mengikuti pola yang sama dan tidak menulis ulang solusi yang sudah ada dengan cara berbeda-beda di tiap file. Setiap bagian punya status: - ✅ **Selesai** — sudah diterapkan di seluruh kode yang relevan. - 🚧 **Sebagian** — sudah ada polanya, tapi belum diterapkan di semua tempat. - 📝 **Rencana** — baru berupa kesepakatan, belum diterapkan. --- ## 1. Enum ✅ **Aturan:** setiap backed enum (`enum X: string`) wajib pakai trait `App\Enums\Concerns\HasValues`. Jangan pernah menulis `array_values(X::cases())` atau `array_column(X::cases(), 'value')` secara manual — pakai `X::values()` (atau `X::options()` kalau butuh label untuk dropdown/select). ```php // app/Enums/Concerns/HasValues.php trait HasValues { public static function values(): array // ['male', 'female'] public static function options(): array // [{value: 'male', label: 'Laki-laki'}, ...] } ``` Struktur enum standar: ```php enum Gender: string { use HasValues; case Male = 'male'; case Female = 'female'; public function label(): string { return match ($this) { self::Male => 'Laki-laki', self::Female => 'Perempuan', }; } } ``` **Sebelum → Sesudah** ```php // ❌ Jangan 'gender' => ['required', 'string', Rule::in(array_values(Gender::cases()))], 'type' => ['required', 'string', Rule::in(array_column(FeedbackType::cases(), 'value'))], // ✅ Pakai 'gender' => ['required', 'string', Rule::in(Gender::values())], 'type' => ['required', 'string', Rule::in(FeedbackType::values())], ``` Untuk data yang dikirim ke frontend (mis. isi `` di form fitur *lain* (mis. `DepartmentService::getAllForSelect()` dipakai di form Course/Lecturer/Student, bukan di halaman Department sendiri). - **Nama sesuai domain** — kalau daftar itu justru jadi listing utama halaman itu sendiri (bukan sumber dropdown fitur lain) dan memang tidak butuh paginasi, pakai nama yang menjelaskan isinya, mis. `ScheduleService::all()` (listing halaman jadwal) atau `AttendanceService::sessions()` (listing sesi presensi). Jangan pernah menulis `getAll()` polos — nama itu ambigu antara dua kasus di atas. Urutan method standar dalam satu Service: `getAllForSelect()` (kalau ada) → `paginated()` → `create()` → `update()` → `delete()` → helper `private` di paling bawah. --- ## 6. Wayfinder ✅ Selalu jalankan generate dengan flag form variant, supaya `
` tidak error saat runtime: ```bash php artisan wayfinder:generate --with-form ``` `vite.config.ts` sudah diset `wayfinder({ formVariants: true })` sehingga dev-server otomatis benar. Flag `--with-form` hanya wajib diingat kalau generate manual lewat CLI.