From 0a8a026b942dd3b81d52c7a40b2f5274061f5352 Mon Sep 17 00:00:00 2001 From: nico Date: Tue, 3 Mar 2026 10:56:30 +0800 Subject: [PATCH] fix(apbdes): integrate new APBDes API with admin UI - Update API schema to support name, deskripsi, and jumlah fields - Enhance state management with additional form fields - Add input fields for name, description, and total amount in create/edit pages - Display description and total amount in detail page - Fix APBDes component order in landing page - Update TypeScript types and Prisma schema integration API Changes: - POST /api/landingpage/apbdes/create: Added optional fields (name, deskripsi, jumlah) - PUT /api/landingpage/apbdes/:id: Added optional fields (name, deskripsi, jumlah) Admin UI Changes: - create/page.tsx: Add TextInput for name, deskripsi, and jumlah - edit/page.tsx: Add TextInput for name, deskripsi, and jumlah; improve reset functionality - [id]/page.tsx: Display deskripsi and jumlah if available - page.tsx: Minor formatting fix - _state/apbdes.ts: Update Zod schema and default form with new fields Landing Page: - Move Apbdes component to top of stack for better visibility Co-authored-by: Qwen-Coder --- .../(dashboard)/_state/landing-page/apbdes.ts | 9 ++++ .../landing-page/apbdes/[id]/edit/page.tsx | 47 +++++++++++++++++-- .../landing-page/apbdes/[id]/page.tsx | 20 +++++++- .../landing-page/apbdes/create/page.tsx | 25 +++++++++- .../(dashboard)/landing-page/apbdes/page.tsx | 2 +- .../_lib/landing_page/apbdes/create.ts | 7 ++- .../_lib/landing_page/apbdes/findMany.ts | 8 +++- .../_lib/landing_page/apbdes/findUnique.ts | 9 ++-- .../_lib/landing_page/apbdes/index.ts | 6 +++ .../_lib/landing_page/apbdes/updt.ts | 6 +++ src/app/darmasaba/page.tsx | 2 +- 11 files changed, 127 insertions(+), 14 deletions(-) diff --git a/src/app/admin/(dashboard)/_state/landing-page/apbdes.ts b/src/app/admin/(dashboard)/_state/landing-page/apbdes.ts index 9b5cb438..6575d16d 100644 --- a/src/app/admin/(dashboard)/_state/landing-page/apbdes.ts +++ b/src/app/admin/(dashboard)/_state/landing-page/apbdes.ts @@ -19,6 +19,9 @@ const ApbdesItemSchema = z.object({ const ApbdesFormSchema = z.object({ tahun: z.number().int().min(2000, "Tahun tidak valid"), + name: z.string().optional(), + deskripsi: z.string().optional(), + jumlah: z.string().optional(), imageId: z.string().min(1, "Gambar wajib diunggah"), fileId: z.string().min(1, "File wajib diunggah"), items: z.array(ApbdesItemSchema).min(1, "Minimal ada 1 item"), @@ -27,6 +30,9 @@ const ApbdesFormSchema = z.object({ // --- Default Form --- const defaultApbdesForm = { tahun: new Date().getFullYear(), + name: "", + deskripsi: "", + jumlah: "", imageId: "", fileId: "", items: [] as z.infer[], @@ -244,6 +250,9 @@ const apbdes = proxy({ this.id = data.id; this.form = { tahun: data.tahun || new Date().getFullYear(), + name: data.name || "", + deskripsi: data.deskripsi || "", + jumlah: data.jumlah || "", imageId: data.imageId || "", fileId: data.fileId || "", items: (data.items || []).map((item: any) => ({ diff --git a/src/app/admin/(dashboard)/landing-page/apbdes/[id]/edit/page.tsx b/src/app/admin/(dashboard)/landing-page/apbdes/[id]/edit/page.tsx index 2c84dda3..96bbf4b2 100644 --- a/src/app/admin/(dashboard)/landing-page/apbdes/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/apbdes/[id]/edit/page.tsx @@ -79,6 +79,9 @@ function EditAPBDes() { // Simpan data original untuk reset form const [originalData, setOriginalData] = useState({ tahun: 0, + name: '', + deskripsi: '', + jumlah: '', imageId: '', fileId: '', imageUrl: '', @@ -103,6 +106,9 @@ function EditAPBDes() { // Simpan data original untuk reset setOriginalData({ tahun: data.tahun || new Date().getFullYear(), + name: data.name || '', + deskripsi: data.deskripsi || '', + jumlah: data.jumlah || '', imageId: data.imageId || '', fileId: data.fileId || '', imageUrl: data.image?.link || '', @@ -112,6 +118,9 @@ function EditAPBDes() { // Set form dengan data lama (termasuk imageId dan fileId) apbdesState.edit.form = { tahun: data.tahun || new Date().getFullYear(), + name: data.name || '', + deskripsi: data.deskripsi || '', + jumlah: data.jumlah || '', imageId: data.imageId || '', fileId: data.fileId || '', items: (data.items || []).map((item: any) => ({ @@ -238,9 +247,12 @@ function EditAPBDes() { }; const handleReset = () => { - // Reset ke data original (tahun, imageId, fileId) + // Reset ke data original (tahun, name, deskripsi, jumlah, imageId, fileId) apbdesState.edit.form = { tahun: originalData.tahun, + name: originalData.name, + deskripsi: originalData.deskripsi, + jumlah: originalData.jumlah, imageId: originalData.imageId, fileId: originalData.fileId, items: [...apbdesState.edit.form.items], // keep existing items @@ -249,11 +261,11 @@ function EditAPBDes() { // Reset preview ke data original setPreviewImage(originalData.imageUrl || null); setPreviewDoc(originalData.fileUrl || null); - + // Reset file uploads setImageFile(null); setDocFile(null); - + // Reset new item form setNewItem({ kode: '', @@ -263,7 +275,7 @@ function EditAPBDes() { level: 1, tipe: 'pendapatan', }); - + toast.info('Form dikembalikan ke data awal'); }; @@ -288,6 +300,33 @@ function EditAPBDes() { > {/* Header Form */} + + (apbdesState.edit.form.name = e.target.value) + } + description="Opsional - akan diisi otomatis jika kosong" + /> + + (apbdesState.edit.form.deskripsi = e.target.value) + } + description="Opsional" + /> + + (apbdesState.edit.form.jumlah = e.target.value) + } + description="Opsional - total keseluruhan anggaran" + /> Nama APBDes - {data.name || '-'} + {data.name || `APBDes Tahun ${data.tahun}`} @@ -105,6 +105,24 @@ function DetailAPBDes() { + {data.deskripsi && ( + + Deskripsi + + {data.deskripsi} + + + )} + + {data.jumlah && ( + + Jumlah Total + + {data.jumlah} + + + )} + Gambar {data.image?.link ? ( diff --git a/src/app/admin/(dashboard)/landing-page/apbdes/create/page.tsx b/src/app/admin/(dashboard)/landing-page/apbdes/create/page.tsx index 1ac3945a..0e00b5b5 100644 --- a/src/app/admin/(dashboard)/landing-page/apbdes/create/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/apbdes/create/page.tsx @@ -117,9 +117,9 @@ function CreateAPBDes() { toast.success("Berhasil menambahkan APBDes"); resetForm(); router.push("/admin/landing-page/apbdes"); - } catch (error) { + } catch (error: any) { console.error("Gagal submit:", error); - toast.error("Gagal menyimpan data"); + toast.error(error?.message || "Gagal menyimpan data"); } finally { setIsSubmitting(false); } @@ -334,6 +334,27 @@ function CreateAPBDes() { {/* Form Header */} + (stateAPBDes.create.form.name = e.target.value)} + description="Opsional - akan diisi otomatis jika kosong" + /> + (stateAPBDes.create.form.deskripsi = e.target.value)} + description="Opsional" + /> + (stateAPBDes.create.form.jumlah = e.target.value)} + description="Opsional - total keseluruhan anggaran" + /> + -