import React, { useState, useEffect } from "react"; import AuthenticatedLayout from "@/layouts/authenticated-layout"; import { Head, router } from "@inertiajs/react"; import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Checkbox } from "@/components/ui/checkbox"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectTrigger, SelectContent, SelectItem, SelectValue, } from "@/components/ui/select"; import { Tooltip, TooltipTrigger, TooltipContent, } from "@/components/ui/tooltip"; import { ChevronLeft, Printer, FileDown, CircleHelp, Upload, ArrowUpRight, Save, } from "lucide-react"; // import { Inertia } from "@inertiajs/inertia"; /* ---------------------------------- Contoh komponen modal upload -------------------------------------*/ function ModalUploadUmum({ isOpen, onClose, onUpload, rowCode, title, }: { isOpen: boolean; onClose: () => void; onUpload: () => void; rowCode: string; title: string; }) { if (!isOpen) return null; return (

Laporan Pengelolaan Air Limbah - {rowCode}. {title}

Silahkan unggah dokumen Anda dengan drag & drop atau klik pada kotak ini. Ukuran file tidak boleh melebihi 20 MB.

Drop file atau klik di sini
); } /* ---------------------------------- Contoh komponen modal khusus A10 -------------------------------------*/ function ModalUploadA10({ isOpen, onClose, onUpload, rowCode, title, }: { isOpen: boolean; onClose: () => void; onUpload: () => void; rowCode: string; title: string; }) { if (!isOpen) return null; return (

Laporan Pengelolaan Air Limbah - {rowCode}. {title}

Drop file atau klik di sini
{/* Contoh form data sertifikat */}
{/* Tabel list sertifikat */}
{/* Contoh: kosong */}
Nomor Sertifikat Nama Pemilik Tanggal Terbit Masa Berlaku Nama Jabatan
Tidak ada data di tabel
); } /* ---------------------------------- Struktur data baris table -------------------------------------*/ interface TableRow { code: string; // A1, A2, ... name: string; // Nama komponen tooltip: string; // Keterangan tooltip hasLampiran: boolean; // Apakah baris ini punya tombol upload? lampiranLabel?: string; // Text di kolom lampiran ("Data...", "Lampiran...") dropdownValue: "Ada" | "Tidak Ada"; // Default "Tidak Ada" value: number; // 0 atau 100 isDisabled: boolean; // Dropdown disable? verification?: string; // Kosong jika belum diverifikasi } /* ---------------------------------- Halaman utama -------------------------------------*/ export default function PelaporanALForm() { // Modal states const [modalRowCode, setModalRowCode] = useState(null); // untuk row umum const [modalA10Open, setModalA10Open] = useState(false); // khusus A10 // Data baris A1 - A5 (tidak ada lampiran) const [rowsNoLampiran, setRowsNoLampiran] = useState([ { code: "A1", name: "Instalasi pengolah air limbah", tooltip: "Foto kondisi terkini instalasi pengolahan air limbah pada masa periode pelaporan (ditandai dengan cap waktu)", hasLampiran: false, dropdownValue: "Tidak Ada", value: 0, isDisabled: false, }, { code: "A2", name: "Flowmeter", tooltip: "Foto kondisi terkini flowmeter pada masa periode pelaporan (ditandai dengan cap waktu)", hasLampiran: false, dropdownValue: "Tidak Ada", value: 0, isDisabled: false, }, { code: "A3", name: "Titik pengambilan sampel", tooltip: "Foto kondisi terkini titik pengambilan sampel air limbah yang telah dilengkapi dengan penandaan dan koordinat pada masa periode pelaporan (ditandai dengan cap waktu)", hasLampiran: false, dropdownValue: "Tidak Ada", value: 0, isDisabled: false, }, { code: "A4", name: "Saluran air limbah & air hujan terpisah", tooltip: "Foto kondisi terkini saluran air limbah & air hujan yang terpisah pada masa periode pelaporan (ditandai dengan cap waktu)", hasLampiran: false, dropdownValue: "Tidak Ada", value: 0, isDisabled: false, }, { code: "A5", name: "Izin pembuangan air limbah", tooltip: "Izin pembuangan air limbah yang masih berlaku atau Persetujuan Teknis Pemenuhan Baku Mutu Air Limbah yang telah dimiliki", hasLampiran: false, dropdownValue: "Tidak Ada", value: 0, isDisabled: false, }, ]); // Data baris A6 - A10 (beberapa ada lampiran) const [rowsWithLampiran, setRowsWithLampiran] = useState([ { code: "A6", name: "Pengujian air limbah", tooltip: "Data pengujian, parameter, dll. (nanti dijelaskan detail)", hasLampiran: true, lampiranLabel: "Data...", dropdownValue: "Tidak Ada", value: 0, isDisabled: true, // Baru aktif setelah upload }, { code: "A7", name: "Pemenuhan baku mutu air limbah", tooltip: "Nilai otomatis dari sistem. Tidak ada lampiran.", hasLampiran: false, dropdownValue: "Tidak Ada", value: 0, isDisabled: false, }, { code: "A8", name: "Pelaksanaan dan pemutusan wewenang", tooltip: "Hasil pencatatan swapantau harian parameter debit dan pH.", hasLampiran: true, lampiranLabel: "Lampiran...", dropdownValue: "Tidak Ada", value: 0, isDisabled: true, }, { code: "A9", name: "Pembuatan neraca air", tooltip: "Neraca air bersih senyatanya selama periode pelaporan (3 bulan).", hasLampiran: true, lampiranLabel: "Lampiran...", dropdownValue: "Tidak Ada", value: 0, isDisabled: true, }, { code: "A10", name: "Sertifikasi kompetensi", tooltip: "Sertifikat kompetensi personil (BNSP) yang masih berlaku, dsb.", hasLampiran: true, lampiranLabel: "Lampiran...", dropdownValue: "Tidak Ada", value: 0, isDisabled: true, }, ]); // Total I (IKLl) dari A1–A10 const [totalIKLl, setTotalIKLl] = useState(0); // Total II (SPBMAL) => mengikuti A6 const [totalSPBMAL, setTotalSPBMAL] = useState(0); // Hitung total I setiap ada perubahan data useEffect(() => { const sumNoLampiran = rowsNoLampiran.reduce( (acc, row) => acc + row.value, 0 ); const sumWithLampiran = rowsWithLampiran.reduce( (acc, row) => acc + row.value, 0 ); const total = sumNoLampiran + sumWithLampiran; // total 10 komponen const average = total / 10; // misalnya kita mau rata-ratakan setTotalIKLl(average); }, [rowsNoLampiran, rowsWithLampiran]); // Hitung total II berdasarkan A6 (Jika "Ada" => 100, jika "Tidak Ada" => 0) useEffect(() => { const rowA6 = rowsWithLampiran.find((r) => r.code === "A6"); if (rowA6) { setTotalSPBMAL(rowA6.dropdownValue === "Ada" ? 100 : 0); } }, [rowsWithLampiran]); // Ubah dropdown value const handleDropdownChange = ( code: string, newVal: "Ada" | "Tidak Ada", isNoLampiran: boolean ) => { if (isNoLampiran) { const updated = rowsNoLampiran.map((row) => { if (row.code === code) { return { ...row, dropdownValue: newVal, value: newVal === "Ada" ? 100 : 0, }; } return row; }); setRowsNoLampiran(updated); } else { const updated = rowsWithLampiran.map((row) => { if (row.code === code) { return { ...row, dropdownValue: newVal, value: newVal === "Ada" ? 100 : 0, }; } return row; }); setRowsWithLampiran(updated); } }; // Ketika user klik tombol upload di kolom lampiran const handleOpenUploadModal = (row: TableRow) => { // Jika baris A6 diklik, arahkan ke route "admin.pelaporan.indexIpal" // atau path "/admin/pelaporan/al/ipal" if (row.code === "A6") { // Contoh menggunakan nama route inertia // Inertia.visit(route("admin.pelaporan.indexIpal")); // Atau langsung path router.visit("/admin/pelaporan/al/ipal"); return; } // Jika A10, buka modal khusus if (row.code === "A10") { setModalA10Open(true); } else { // A8, A9 pakai modal umum setModalRowCode(row.code); } }; // Setelah upload berhasil, dropdown diaktifkan const handleUploadSuccess = (code: string) => { setRowsWithLampiran((prev) => prev.map((row) => { if (row.code === code) { return { ...row, isDisabled: false, // dropdown baru bisa dipilih // lampiranLabel tidak berubah -> tetap "Data..." atau "Lampiran..." }; } return row; }) ); }; // Render baris table tanpa lampiran (A1-A5, A7) const renderRowNoLampiran = (row: TableRow) => { return ( {row.code}
{row.name}

{row.name}

{row.tooltip}

{/* Hasil */} {row.value} {/* Tidak ada kolom lampiran di sini */} {row.verification || ""} ); }; // Render baris table dengan lampiran (A6, A8, A9, A10) const renderRowWithLampiran = (row: TableRow) => { return ( {row.code}
{row.name}

{row.name}

{row.tooltip}

{/* Hasil */} {row.value} {/* Lampiran */} {row.verification || ""} ); }; // Render return (
Nama Perusahaan
Laporan Pengelolaan Air Limbah

Tahun 2025 - Periode Triwulan 1 (Januari - Maret)

{/* Main Table */}
{/* A1-A5 tidak punya lampiran, tapi kolom ini tetap ada untuk A6, A8, A9, A10. Nanti baris A1-A5 isinya kosong. */} {/* Baris I (Nilai IKLl) */} {/* Section 1: Persyaratan Teknis => A1-A4 */} {rowsNoLampiran .slice(0, 4) .map((row) => renderRowNoLampiran(row))} {/* Section 2: Perijinan => A5 */} {renderRowNoLampiran(rowsNoLampiran[4])} {/* Section 3: Pelaksanaan => A6 - A10 */} {rowsWithLampiran.map((row) => { // A7 tidak punya lampiran => treat like no-lampiran row if (row.code === "A7") { return renderRowNoLampiran(row); } // A6, A8, A9, A10 => with lampiran return renderRowWithLampiran(row); })} {/* Baris II (Nilai SPBMAL) */}
No Komponen Hasil Nilai Lampiran Verifikasi Keterangan
I Nilai tingkat ketaatan pengelolaan air limbah (IKLl) (%) {totalIKLl}
1. Persyaratan Teknis
2. Perijinan
3. Pelaksanaan
II Nilai tingkat pemenuhan baku mutu air limbah * (SPBMAL) (%) {totalSPBMAL}
{/* Notes Section */}

Catatan