Belum masuk. Progresmu tidak tersimpan.

Masuk
Ruang Materi
Daftar

Pengelola Tugas

Bangun sendiri dari brief di bawah. Semua pemeriksaan lolos berarti proyekmu selesai, salah satu syarat sertifikat JavaScript.

Brief

Bangun Pengelola Tugas: sebuah class DaftarTugas untuk mencatat to-do harianmu, lengkap dengan prioritas, filter, ringkasan, simpan-muat JSON, dan penyimpanan asynchronous. Kodenya murni logika JavaScript: tanpa DOM, tanpa fetch, tanpa console.log wajib.

Pakai fitur ES6+ yang sudah kamu pelajari: class, private field #berikutnyaId, default parameter, destructuring di parameter, spread, ??, dan async/await.

Bentuk satu tugas

{ id: 1, judul: "Kerjakan PR matematika", prioritas: "tinggi", selesai: false, tenggat: "2026-11-01" }

tenggat hanya ada bila diberikan. Prioritas yang dikenal: "tinggi", "sedang", "rendah" (sudah ada di konstanta URUTAN).

Method wajib

MethodTugas
constructor(tugas = [])Simpan salinan data di this.tugas. #berikutnyaId lanjut dari id terbesar + 1 (mulai 1 bila kosong). Satu-satunya properti publik instance adalah tugas.
tambah(judul, { prioritas = "sedang", tenggat } = {})Rapikan judul dengan trim(). Judul kosong: throw new Error("Judul wajib diisi"). Prioritas di luar tiga pilihan: throw new Error("Prioritas tidak dikenal"). Simpan dan kembalikan tugas baru dengan selesai: false.
selesaikan(id)Tandai selesai: true; true bila tugasnya ada, false bila tidak.
hapus(id)Buang tugas; true bila ada yang terhapus, false bila tidak.
filter({ selesai, prioritas } = {})Array tugas yang cocok. Kriteria yang tidak diisi diabaikan, jadi filter() mengembalikan semua.
urutkan()Array baru: tinggi > sedang > rendah, prioritas sama diurutkan id kecil dulu. this.tugas tidak berubah.
ringkasan(){ total, selesai, sisa }
toJSON()Data yang ditulis JSON.stringify(daftar): array salinan tugas.
static dariJSON(teks)JSON.parse di dalam try/catch. Teks rusak atau hasil yang bukan array: throw new Error("JSON tidak valid"). Kembalikan new DaftarTugas(data).
async simpan(storage)await storage.setItem("tugas", JSON.stringify(this)), lalu kembalikan jumlah tugas.

Contoh hasil

const d = new DaftarTugas();
d.tambah("Kerjakan PR matematika", { prioritas: "tinggi", tenggat: "2026-11-01" });
// { id: 1, judul: "Kerjakan PR matematika", prioritas: "tinggi", selesai: false, tenggat: "2026-11-01" }
d.tambah("Cuci sepatu", { prioritas: "rendah" });   // id 2
d.tambah("  Baca bab 5  ");                         // id 3, judul "Baca bab 5", prioritas "sedang"
d.tambah("Bayar kos", { prioritas: "tinggi" });     // id 4

d.selesaikan(2);                 // true
d.selesaikan(99);                // false
d.ringkasan();                   // { total: 4, selesai: 1, sisa: 3 }
d.filter({ prioritas: "tinggi" }).map((t) => t.id);   // [1, 4]
d.urutkan().map((t) => t.id);    // [1, 4, 3, 2]

const teks = JSON.stringify(d);
const salinan = DaftarTugas.dariJSON(teks);
salinan.tambah("Tugas baru").id; // 5, id lanjut dari data lama
DaftarTugas.dariJSON("{rusak");  // Error: JSON tidak valid

await d.simpan(storage);         // 4, storage.data.tugas berisi teks JSON

Pemeriksa sudah menyiapkan contoh() (empat tugas di atas, sebelum selesaikan), buatStorage() (storage palsu dengan async setItem), dan gagal(fn) (pesan error dari fn).

Latihan kode: Pengelola Tugas

Lengkapi class DaftarTugas agar bisa menambah tugas dengan prioritas dan tenggat, menandai selesai, menghapus, menyaring, mengurutkan berdasarkan prioritas, merangkum jumlah tugas, menyimpan dan memuat ulang data lewat JSON dengan penanganan error, serta menyimpan ke storage asynchronous dengan async/await.