'use client' import React, { useEffect, useState } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, } from "recharts"; import { AlertTriangle, CheckCircle, CalendarDays } from "lucide-react"; // Elegant RDM/RDB Dashboard — PLTU Tanjung Jadi B // Combines predictive alert, KPI metrics, and calendar popup for RDM/RDB view. const MOCK_RDM = (() => { const today = new Date(); return Array.from({ length: 14 }).map((_, i) => { const d = new Date(today); d.setDate(today.getDate() + i); const failed = today.getDate() + i == today.getDate() + 6; return { date: d.toISOString().slice(0, 10), daya_mw: Math.round(280 + 15 * Math.sin(i / 2) + Math.random() * 6), failed, note: failed ? "Gagal mencapai RDM (perbaikan unit)" : "Rencana tercapai", }; }); })(); const MOCK_RDB = (() => { const today = new Date(); return Array.from({ length: 8 }).map((_, i) => { const d = new Date(today); d.setDate(today.getDate() + i * 7); const failed = (today.getDate() + i) * 7 == (today.getDate() + 6) * 7; return { week: i + 1, startDate: d.toISOString().slice(0, 10), daya_mw: Math.round(285 + 10 * Math.cos(i / 2) + Math.random() * 8), failed, note: failed ? "RDB tidak tercapai (maintenance)" : "RDB tercapai", }; }); })(); const MOCK_ALERT = { exists: true, type: "Predictive Failure", component: "Boiler Feed Pump 2", days_to_failure: 7, severity: "High", recommended_actions: [ "Jadwalkan maintenance 2 hari ke depan", "Siapkan spare part dan inspeksi getaran", "Pantau tekanan sistem harian hingga perbaikan", ], }; export default function DashboardRdmRdbElegant() { const [mode, setMode] = useState("rdm"); // 'rdm' or 'rdb' const [rdmData, setRdmData] = useState(MOCK_RDM); const [rdbData, setRdbData] = useState(MOCK_RDB); const [alert, setAlert] = useState(MOCK_ALERT); const [showCalendar, setShowCalendar] = useState(false); const [selectedItem, setSelectedItem] = useState(null); const data = mode === "rdm" ? rdmData : rdbData; const maxDaya = Math.max(...data.map((d) => d.daya_mw)); const avgDaya = Math.round( data.reduce((sum, d) => sum + d.daya_mw, 0) / data.length ); const successRate = Math.round( (data.filter((d) => !d.failed).length / data.length) * 100 ); return (
{/* HEADER */}

Dashboard Daya Mampu — PLTU Tanjung Jati B

Prediksi Thermodinamika & HHV Batubara

{/* ALERT PANEL */} {alert && alert.exists && (

Prediksi Kerusakan — {alert.component}

Keparahan: {alert.severity}

    {alert.recommended_actions.map((a, i) =>
  • {a}
  • )}

{alert.days_to_failure} hari

hingga estimasi kegagalan

)} {/* GRAFIK */}

Grafik Daya Mampu — {mode.toUpperCase()}

Maksimum: {maxDaya} MW
`${value} MW`} />
{/* KPI METRICS */}
Kapasitas Terpasang
320 MW
Rata-rata Daya
{avgDaya} MW
Tingkat Keberhasilan
{successRate}%
Terakhir Sinkronisasi
{new Date().toLocaleString()}
{/* POPUP CALENDAR MODAL */} {showCalendar && (

{mode === "rdm" ? "Rencana Daya Mampu (2 Minggu)" : "Rencana Daya Bulanan (8 Minggu)"}

{data.map((d, i) => (
setSelectedItem(d)} className={`p-3 rounded border text-center cursor-pointer transition-all hover:shadow-md ${d.failed ? "bg-rose-50 border-rose-300" : "bg-emerald-50 border-emerald-300"}`}>
{mode === "rdm" ? new Date(d.date).getDate() : `Minggu ${d.week}`}
{d.failed ? : }
{d.daya_mw} MW
))}
)}
{/* ITEM DETAIL POPUP */} {selectedItem && (

Detail {mode.toUpperCase()}

{mode === "rdm" ? `Tanggal: ${selectedItem.date}` : `Minggu ke-${selectedItem.week}`}

Daya: {selectedItem.daya_mw} MW

Status: {selectedItem.failed ? {selectedItem.note} : {selectedItem.note}}

)}
); }