// @mui import { useEffect, useState } from 'react'; import { Button, Container, Grid, styled, Typography, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, Card, TextField, FormControl, InputLabel, Select, MenuItem, Dialog, DialogTitle, DialogContent, DialogActions, Checkbox, } from '@mui/material'; // hooks import useSettings from '../hooks/useSettings'; // components import { PieChart, Pie, Cell, Tooltip, BarChart, Bar, XAxis, YAxis, Legend, ResponsiveContainer } from 'recharts'; import Page from '../components/Page'; import axios from '../utils/axios'; import useAuth from '../hooks/useAuth'; import SomethingUsage from '../sections/dashboard/SomethingUsage'; import { fCurrency } from '../utils/formatNumber'; import dayjs from "dayjs"; import {DesktopDatePicker, LocalizationProvider } from '@mui/x-date-pickers'; import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; import { green, red } from "@mui/material/colors"; import MuiDialog from '@/components/MuiDialog'; import SearchIcon from "@mui/icons-material/Search"; // ---------------------------------------------------------------------- const COLORS = ['#229A16', '#919EAB', '#FF4842']; // const performaDokterData = [ // { name: 'Dr. John', Berhasil: 70, Gagal: 8, Abandon: 4 }, // { name: 'Dr. Richard', Berhasil: 68, Gagal: 10, Abandon: 2 }, // { name: 'Dr. Harman', Berhasil: 75, Gagal: 5, Abandon: 3 }, // { name: 'Dr. Emma', Berhasil: 80, Gagal: 7, Abandon: 1 }, // { name: 'Dr. tb', Berhasil: 80, Gagal: 7, Abandon: 1 }, // { name: 'Dr. test', Berhasil: 80, Gagal: 7, Abandon: 1 }, // { name: 'Dr. yayan', Berhasil: 80, Gagal: 7, Abandon: 1 }, // { name: 'Dr. intan', Berhasil: 80, Gagal: 7, Abandon: 1 }, // { name: 'Dr. fajri', Berhasil: 80, Gagal: 7, Abandon: 1 }, // ]; // Custom Tooltip const CustomTooltip = ({ active, payload, label }) => { if (active && payload && payload.length) { const totalPasien = payload[0].value + payload[1].value + payload[2].value; return (

{label}

Total Pasien: {totalPasien}

Berhasil: {payload[0].value}

Gagal: {payload[1].value}

Abandon: {payload[2].value}

); } return null; }; // Custom Tooltip const CustomTooltipPie = ({ active, payload, startDate, endDate }) => { if (!active || !payload || payload.length === 0) return null; // Fungsi format tanggal ke "2 Jan 2025" const formatDate = (date) => { if (!date) return "N/A"; return new Date(date).toLocaleDateString("id-ID", { day: "numeric", month: "short", year: "numeric", }); }; return (

{formatDate(startDate)} - {formatDate(endDate)}

Status: {payload[0]?.name || "Tidak ada data"}

Jumlah Pasien: {payload[0]?.value || 0}

); }; export default function Dashboard() { const transaksiDataDefault = [ { name: "Berhasil", value: 0, color: "#4CAF50" }, { name: "Gagal", value: 0, color: "#F44336" }, { name: "Abandon", value: 0, color: "#9E9E9E" }, ]; const { themeStretch } = useSettings(); const [startDate, setStartDate] = useState(dayjs().startOf('month').format('YYYY-MM-DD')); const [endDate, setEndDate] = useState(dayjs().format('YYYY-MM-DD')); const [startDateDokter, setStartDateDokter] = useState(dayjs().startOf('month').format('YYYY-MM-DD')); const [endDateDokter, setEndDateDokter] = useState(dayjs().format('YYYY-MM-DD')); const [transaksiData, setTransaksiData] = useState(transaksiDataDefault); const [transaksiDataBar, setTransaksiDataBar] = useState([]); const [type, setType] = useState(0); const [status, setStatus] = useState(0); const [statusDokter, setStatusDokter] = useState(0); const [view, setView] = useState(["day", "month", "year"]); const [performaDokterData, setListPerformaDoctors] = useState([]); const [doctors, setListDoctors] = useState([]); const [selectedDoctors, setSelectedDoctors] = useState(doctors.map((doctor) => doctor.id)); // State untuk dokter yang dipilih const fetchData = async () => { try { const response = await axios.get(`dashboard/transaksi`, { params: { start_date: startDate, end_date: endDate, type, status } }); if (response.data) { setTransaksiData(response.data); } if (type === 0) { setView(["day", "month", "year"]); // Urutan yang benar: day, month, year } else { setView(["month"]); // Hanya menampilkan bulan & tahun } } catch (error) { console.error('Error fetching transaksi data:', error); } }; const fetchDataBar = async () => { try { const response = await axios.get(`dashboard/transaksi-bar-chart`, { params: { start_date: startDate, end_date: endDate, type, status } }); if (response.data) { setTransaksiDataBar(response.data); } if (type === 0) { setView(["day", "month", "year"]); // Urutan yang benar: day, month, year } else { setView(["month"]); // Hanya menampilkan bulan & tahun } } catch (error) { console.error('Error fetching transaksi data:', error); } } const fetchListPerfomaDokter = async () => { try { const response = await axios.get(`dashboard/list-performa-dokter`, { params: { start_date: startDateDokter, end_date: endDateDokter, type, statusDokter, nIDDokter: selectedDoctors } } ); if (response.data) { setListPerformaDoctors(response.data); } } catch (error) { console.error('Error fetching transaksi data:', error); } }; const fetchListDokter = async () => { try { const response = await axios.get(`dashboard/list-dokter`); if (response.data) { setListDoctors(response.data); } } catch (error) { console.error('Error fetching transaksi data:', error); } }; // Fetch data saat pertama kali halaman dimuat dan ketika filter berubah useEffect(() => { fetchData(); fetchDataBar(); // fetchListPerfomaDokter(); }, [startDate, endDate, type, status]); // Fetch useEffect(() => { fetchListPerfomaDokter(); }, [selectedDoctors, startDateDokter, endDateDokter]) useEffect(() => { fetchListDokter(); }, []); // Performa dokter const [openDialog, setOpenDialog] = useState(false); const handleOpen = () => setOpenDialog(true); const getContent = () => { const [search, setSearch] = useState(""); // State untuk pencarian dokter // Filter dokter berdasarkan pencarian const filteredDoctors = doctors.filter((doctor) => doctor.name.toLowerCase().includes(search.toLowerCase()) ); // Handle pilih satu dokter const handleSelectDoctor = (id) => { setSelectedDoctors((prev) => prev.includes(id) ? prev.filter((docId) => docId !== id) : [...prev, id] ); }; // Handle pilih semua dokter const handleSelectAll = () => { if (selectedDoctors.length === doctors.length) { setSelectedDoctors([]); } else { setSelectedDoctors(doctors.map((doctor) => doctor.id)); } }; const handleCloseDialog = () => { setOpenDialog(false); setSelectedDoctors([]); } const handlePilihDokter = () => { setOpenDialog(false); console.log(selectedDoctors); } return ( <> {/* Search Bar */} setSearch(e.target.value)} InputProps={{ endAdornment: , }} sx={{ mb: 2, mt:2 }} /> {/* Table Dokter */} Kode Nama Status {filteredDoctors.map((doctor) => ( handleSelectDoctor(doctor.id)} /> {doctor.code} {doctor.name} {doctor.online === 1 ? "🟢 Online" : "🔴 Offline"} ))}
); }; return ( Dashboard {/* Jumlah Transaksi */} Jumlah Transaksi {/* Pilih */} Tipe { if (!value) return; // Hindari error jika value null atau undefined if (type == 0) { setStartDate(value); } else { setStartDate(new Date(value.getFullYear(), value.getMonth(), 1)); } }} renderInput={(params) => } /> { if (!value) return; // Hindari error jika value null atau undefined if (type == 0) { setEndDate(value); } else { setEndDate(new Date(value.getFullYear(), value.getMonth(), 1)); } }} renderInput={(params) => } /> {/* Pilih Status */} Status `${(percent * 100).toFixed(0)}%`} > {transaksiData.map((entry, index) => ( ))} } />
date} /> } />
{/* Performa Dokter */} Performa Dokter {/* Pilih Dokter*/} {/* Pilih */} Tipe { if (!value) return; // Hindari error jika value null atau undefined if (type == 0) { setStartDateDokter(value); } else { setStartDateDokter(new Date(value.getFullYear(), value.getMonth(), 1)); } }} renderInput={(params) => } /> { if (!value) return; // Hindari error jika value null atau undefined if (type == 0) { setEndDateDokter(value); } else { setEndDateDokter(new Date(value.getFullYear(), value.getMonth(), 1)); } }} renderInput={(params) => } /> {/* Pilih Status */} Status {/* Dialog Pilih Dokter */}
); }