import React, { useState, useEffect } from 'react'; import { LayoutDashboard, Truck, Droplets, Wrench, FileText, Bell, CheckCircle, XCircle, AlertTriangle, Users, MapPin, LogOut, Menu, Upload, Camera, Calendar } from 'lucide-react'; import { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, Legend, ResponsiveContainer, LineChart, Line, PieChart, Pie, Cell } from 'recharts'; // --- MOCK DATA & CONFIG --- const THEME = { bg: "bg-slate-50", sidebar: "bg-white", primary: "bg-indigo-500", pastelBlue: "bg-blue-50 text-blue-700 border-blue-200", pastelGreen: "bg-emerald-50 text-emerald-700 border-emerald-200", pastelRed: "bg-rose-50 text-rose-700 border-rose-200", pastelOrange: "bg-amber-50 text-amber-700 border-amber-200", }; const DUMMY_UNITS = [ { id: 'DT-01', model: 'Dump Truck', lastHM: 5000, status: 'Ready' }, { id: 'DT-02', model: 'Dump Truck', lastHM: 5200, status: 'Breakdown' }, { id: 'EX-01', model: 'Excavator', lastHM: 8000, status: 'Ready' }, ]; const DUMMY_SITES = ["Site A - Tambang Utama", "Site B - Port", "Site C - Disposal"]; // --- COMPONENTS --- const Dashboard = () => { const dataPerformance = [ { name: 'Op. Andi', siklusLalu: 40, siklusIni: 24 }, { name: 'Op. Budi', siklusLalu: 30, siklusIni: 13 }, { name: 'Op. Citra', siklusLalu: 20, siklusIni: 58 }, ]; const dataFuel = [ { name: 'H1', ratio: 12 }, { name: 'H2', ratio: 14 }, { name: 'H3', ratio: 11 }, { name: 'H4', ratio: 18 }, { name: 'H5', ratio: 12 }, { name: 'H6', ratio: 13 }, ]; const dataStatus = [ { name: 'Ready', value: 85 }, { name: 'Breakdown', value: 15 }, ]; const COLORS = ['#10B981', '#F43F5E']; return (

Dashboard Eksekutif

{/* Stat Cards */}
Total HM Bulan Ini
1,240 Jam
Unit Ready
85%
Pending Approval
12 Data
Unit Breakdown
3 Unit
{/* Charts Row 1 */}

Kinerja Operator (Jam Kerja)

Ketersediaan Unit (PA)

{dataStatus.map((entry, index) => ( ))}
{/* Service Warning Widget */}

Peringatan Servis (Predictive)

Unit HM Saat Ini Jadwal Servis Status
DT-05 4,980 5,000 Due Soon
EX-02 12,050 12,000 OVERDUE
); }; const InputOperational = () => { const [formData, setFormData] = useState({ date: new Date().toISOString().split('T')[0], unit: '', hmStart: '', hmStop: '', ritase: 0, site: DUMMY_SITES[0], spl: false }); const [error, setError] = useState(null); const [success, setSuccess] = useState(false); // Simulated Last HM lookup const lastHM = 5000; const handleChange = (e) => { const { name, value, type, checked } = e.target; setFormData(prev => ({ ...prev, [name]: type === 'checkbox' ? checked : value })); setError(null); }; const handleSubmit = (e) => { e.preventDefault(); const start = parseFloat(formData.hmStart); const stop = parseFloat(formData.hmStop); // LOGIC VALIDASI CERDAS if (stop <= start) { setError("Error: HM Stop tidak boleh lebih kecil atau sama dengan HM Start."); return; } if (start < lastHM) { setError(`Error: HM Start (${start}) lebih kecil dari HM Terakhir unit ini (${lastHM}). Manipulasi data terdeteksi.`); return; } setSuccess(true); setTimeout(() => setSuccess(false), 3000); }; return (

Input Operasional Harian

{error && (
{error}
)} {success && (
Data berhasil disimpan (Status: Pending Approval)
)}

HM Terakhir Tercatat: {lastHM}

); }; const ApprovalFlow = () => { const [data, setData] = useState([ { id: 1, date: '2023-10-25', unit: 'DT-01', operator: 'Budi', hmTotal: 8, status: 'Pending' }, { id: 2, date: '2023-10-25', unit: 'EX-04', operator: 'Sari', hmTotal: 10, status: 'Pending' }, { id: 3, date: '2023-10-24', unit: 'DT-02', operator: 'Anto', hmTotal: 12, status: 'Approved' }, ]); const handleAction = (id, newStatus) => { setData(prev => prev.map(item => item.id === id ? { ...item, status: newStatus } : item)); }; return (

Workflow Approval

2 Pending
{data.map(item => ( ))}
Tanggal Operator Unit Total Jam Status Aksi
{item.date} {item.operator} {item.unit} {item.hmTotal} Jam {item.status} {item.status === 'Pending' && (
)}
); }; // --- MAIN LAYOUT --- export default function OperationalApp() { const [activeTab, setActiveTab] = useState('dashboard'); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const NavItem = ({ id, icon: Icon, label }) => ( ); return (
{/* Sidebar */} {/* Main Content */}
{/* Mobile Header */}
O

OpWebApp

{/* Dynamic Content */}
{activeTab === 'dashboard' && } {activeTab === 'operational' && } {activeTab === 'approval' && } {activeTab === 'fuel' &&
Modul Bahan Bakar (Mockup Placeholder)
} {activeTab === 'maintenance' &&
Modul Maintenance (Mockup Placeholder)
}
); }