Papan Kanban Drag & Drop
Membangun papan kanban seperti Trello: seret kartu antar kolom Todo, Doing, Done.
Kenapa Kanban?
Papan kanban (Trello, Jira, Notion) adalah alat manajemen proyek paling populer. Membangunnya mengajarkan HTML5 Drag and Drop API: salah satu API browser yang terlihat rumit tapi sebenarnya hanya 4 event.
Langkah Membangun
HTML: Tiga kolom (<div class="kolom">): "Todo", "Doing", "Done". Tiap kolom berisi kartu-kartu (<div class="kartu" draggable="true">) dan tombol "+ Tambah kartu".
CSS: Kolom dengan background abu terang dan min-height agar bisa di-drop meski kosong. Kartu yang sedang diseret menjadi transparan (opacity: 0.4). Kolom target disorot saat kartu melayang di atasnya.
JS: Empat event drag and drop:
dragstartpada kartu: simpan id kartu yang diseret, tambah class visual.dragoverpada kolom: WAJIBpreventDefault()agar drop diizinkan (tanpa ini drop tidak akan pernah terjadi).dragenter/dragleave: sorot kolom target.drop: pindahkan kartu ke kolom, update data (array per kolom), simpan ke localStorage.
Data disimpan sebagai object { todo: [...], doing: [...], done: [...] } agar status selalu sinkron dengan tampilan.
Kenapa preventDefault di dragover?
Secara default browser MELARANG drop. Ini keputusan keamanan lama. Memanggil preventDefault memberi tahu browser "saya mengizinkan drop di sini". Lupa satu baris ini adalah bug nomor satu pemula.
Kesalahan Umum
- Lupa preventDefault di dragover sehingga drop tidak pernah terpanggil.
- Data tidak ikut pindah (hanya DOM dipindah) sehingga refresh mengembalikan posisi lama.
- Tidak ada feedback visual saat drag sehingga pengguna bingung kartu bisa diseret (tambah cursor: grab).
export default function App(): JSX.Element { return <h1>Hello world</h1> }
Tantangan
Tantangan: Hapus dengan Seret
Tambahkan area "๐๏ธ Seret ke sini untuk hapus" di bawah papan. Kartu yang di-drop ke sana terhapus permanen (dengan konfirmasi).