# Audit Combobox / Select — Hasil & Standar

**Tanggal:** 2026-08-14 · **Kebijakan:** *Relasi dengan banyak data WAJIB memakai `x-combobox` (searchable). Select statis hanya untuk pilihan kecil tetap (status, jenis enum).*

---

## 1. Hasil Audit (30 file dengan `<select>`)

### ✅ Sudah `x-combobox` (searchable) — form
| File / Form | Kolom yang diubah |
|---|---|
| `payroll/cashpayment-form` (BKK) | Pos Biaya, Pegawai (pilot) |
| `transaksi/create` (9 modul transaksi) | Semua header select (gudang/relasi) + **items Material** (+ hook `itemChanged`) |
| `transfer/mt-form` (Material Transfer) | SPB source, Dari Gudang, Ke Gudang |
| `pembelian/po-form` (PO) | PR source, Supplier, Pos Biaya, **items Material** (+ hook) |
| `gudang/opname-form` (Opname) | Gudang |
| `material/form` (Material Edit) | Merk, Jenis, Grup, Ukuran, Satuan (Jual/Beli/Stok/Pack), Supplier |
| `master/form` (MasterCrud — semua modul) | Semua field select (termasuk relasi besar: PIC Employee, Kota) |

### ✅ Select statis — dibiarkan (pilihan kecil/tetap)
| File | Alasan |
|---|---|
| Index/filter (material, transaksi, transfer, solar, dsb) | Filter dropdown: pilihan terbatas (status/jenis/gudang ±60) — opsional combobox di masa depan |
| `users-form`, `employee-form`, `attendances`, `payroll-generate` | Status/type/period — pilihan sedikit |
| `inventory-items` (filter) | Filter status/jenis (kecil) |

---

## 2. Standar Penggunaan `x-combobox`

```blade
<x-combobox
    :options="$items->map(fn ($i) => ['value' => $i->id, 'label' => $i->code . ' — ' . $i->name])->values()->all()"
    :value="$row['inventory_item_id'] ?? ''"
    :label="$items->firstWhere('id', $row['inventory_item_id'] ?? null) ? $items->firstWhere('id', $row['inventory_item_id'])->code . ' — ' . $items->firstWhere('id', $row['inventory_item_id'])->name : ''"
    name="items.{{ $i }}.inventory_item_id"
    placeholder="Cari material"
    required
/>
```

Aturan:
1. **`label` WAJIB dari server** (`firstWhere(...)->name`) — bukan dihitung JS (agar selalu tampil saat edit).
2. `options` urut A→Z, batasi ±500 (pakai `orderBy('name')`).
3. `name` = path Livewire persis (termasuk indeks baris).
4. Hook tambahan (mis. isi otomatis satuan/harga setelah pilih material): pasang listener di elemen baris:
   ```blade
   <td x-on:combobox-selected.window="if ($event.detail.name === 'items.{{ $i }}.inventory_item_id') $wire.itemChanged({{ $i }})">
   ```
   (combobox mengirim event `combobox-selected` berisi `detail.name` setelah pilih/clear)
5. Dilarang `<select>` untuk relasi: material, pegawai, supplier, proyek, gudang, unit, kota, PIC.

## 3. Status Penerapan
- Fase A (selesai): form transaksi & master & material — ✅
- Fase B (selesai): filter index besar → combobox (material index type/group, laporan transfer gudang asal/tujuan)
- Sisa select statis: filter status/jenis kecil (opsional diperbarui bertahap)
- Acuan komponen: `resources/views/components/combobox.blade.php` (v3 — label server, dropdown fixed)
- Dokumen terkait: `docs/STANDAR-INPUT-DETAIL.md`
