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
{/* 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)
)}
);
};
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
| Tanggal |
Operator |
Unit |
Total Jam |
Status |
Aksi |
{data.map(item => (
| {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 */}
{/* Dynamic Content */}
{activeTab === 'dashboard' &&
}
{activeTab === 'operational' &&
}
{activeTab === 'approval' &&
}
{activeTab === 'fuel' &&
Modul Bahan Bakar (Mockup Placeholder)
}
{activeTab === 'maintenance' &&
Modul Maintenance (Mockup Placeholder)
}
);
}