import React from "react"; import { Button } from "@/components/ui/button"; import { Tooltip, TooltipTrigger, TooltipContent, } from "@/components/ui/tooltip"; import { CircleHelp } from "lucide-react"; import { Select, SelectTrigger, SelectContent, SelectItem, SelectValue, } from "@/components/ui/select"; interface KomponenData { id: number; nama: string; kode: string; nilai: number; hasil?: { id: number; nama: string; nilai: number; }[]; nama_refhasil?: string; verifikasi?: boolean; keterangan?: string; lampiran?: boolean; } interface JenisData { nama: string; komponen: Record; } interface ALTableProps { dataTable: Record; nilaiKomponen: Record; nilaiSyaratTeknis: Record; nilai_A6: number; nilai_A7: number; idmcpelaporan: number; idrefpelaporan: number; rowspan_1: number; spl: number; spl_2: number; editable: boolean; onUpdateNilai: (kode: string, nilai: number) => void; onOpenLampiranModal: (kode: string, idrefkomponen: number) => void; onOpenSplModal: () => void; } const ALTable: React.FC = ({ dataTable, nilaiKomponen, nilaiSyaratTeknis, nilai_A6, nilai_A7, idmcpelaporan, idrefpelaporan, rowspan_1, spl, spl_2, editable, onUpdateNilai, onOpenLampiranModal, onOpenSplModal, }) => { const [sklNilai, setSklNilai] = React.useState(0); const komponenHide = ["A1", "A2", "A3", "A4", "A5"]; const daftarNilai = React.useRef>({}); React.useEffect(() => { // Initialize daftarNilai const nilai: Record = {}; Object.entries(dataTable).forEach(([_noJenis, jenis]) => { Object.entries(jenis.komponen).forEach( ([kodeKomponen, komponen]) => { if (kodeKomponen !== "SK") { if (komponenHide.includes(kodeKomponen)) { nilai[kodeKomponen.toLowerCase()] = parseFloat( nilaiSyaratTeknis[kodeKomponen].toFixed(2) ); } else if (kodeKomponen === "A6") { nilai[kodeKomponen.toLowerCase()] = parseFloat( nilai_A6.toFixed(2) ); } else if (kodeKomponen === "A7") { nilai[kodeKomponen.toLowerCase()] = parseFloat( nilai_A7.toFixed(2) ); } else { const val = nilaiKomponen[kodeKomponen]; nilai[kodeKomponen.toLowerCase()] = val ? parseFloat(val.nilai) : 0; } } } ); }); daftarNilai.current = nilai; calculateSklNilai(); }, [dataTable, nilaiKomponen, nilaiSyaratTeknis, nilai_A6, nilai_A7]); const calculateSklNilai = () => { const kelompok1 = ["a1", "a2", "a3", "a4"]; const kelompok2 = ["a5"]; const kelompok3 = ["a6", "a7", "a8", "a9", "a10"]; let total1 = 0; let total2 = 0; let total3 = 0; for (const [key, value] of Object.entries(daftarNilai.current)) { if (typeof value === "number") { if (kelompok1.includes(key)) { total1 += value; } else if (kelompok2.includes(key)) { total2 += value; } else if (kelompok3.includes(key)) { total3 += value; } } } const newSklNilai = (15 * (total1 / kelompok1.length)) / 100 + (15 * (total2 / kelompok2.length)) / 100 + (70 * (total3 / kelompok3.length)) / 100; setSklNilai(parseFloat(newSklNilai.toFixed(2))); }; const handleHasilChange = (komponen: KomponenData, hasilId: number) => { if (!editable) return; const hasil = komponen.hasil?.find( (h) => h.id === parseInt(hasilId.toString()) ); if (hasil) { daftarNilai.current[komponen.kode.toLowerCase()] = hasil.nilai; onUpdateNilai(komponen.kode, hasil.nilai); calculateSklNilai(); } }; return ( {Object.entries(dataTable).map(([noJenis, jenis]) => ( {noJenis && ( )} {Object.entries(jenis.komponen).map( ([kodeKomponen, komponen]) => kodeKomponen !== "SK" && ( {/* Kolom Hasil */} {/* Kolom Nilai */} {/* Kolom Lampiran */} {/* Kolom Verifikasi */} {/* Kolom Keterangan */} ) )} ))}
No Komponen Hasil Nilai Lampiran Verifikasi Keterangan
I Nilai tingkat ketaatan pengelolaan air limbah (SKL AL) (%) {sklNilai}
{noJenis}. {jenis.nama}
{kodeKomponen}. {komponen.nama} {komponen.hasil && !komponenHide.includes( kodeKomponen ) ? ( ) : null} {komponenHide.includes(kodeKomponen) ? parseFloat( ( nilaiSyaratTeknis[ kodeKomponen ] || 0 ).toFixed(2) ) : kodeKomponen === "A6" ? parseFloat( nilai_A6.toFixed(2) ) : kodeKomponen === "A7" ? parseFloat( nilai_A7.toFixed(2) ) : nilaiKomponen[kodeKomponen] ? nilaiKomponen[kodeKomponen] .nilai : 0} {komponen.lampiran && !komponenHide.includes( kodeKomponen ) && ( )} {!komponenHide.includes( kodeKomponen ) && nilaiKomponen[kodeKomponen] ?.verifikasi !== undefined && (nilaiKomponen[kodeKomponen] ?.verifikasi ? ( Approved ) : ( Not Approved ))} {!komponenHide.includes( kodeKomponen ) && nilaiKomponen[kodeKomponen] ?.keterangan}
II Nilai tingkat pemenuhan baku mutu air limbah{" "} * (SPBMAL) (%) {parseFloat(spl.toString())}
); }; export default ALTable;