// src/pages/MonitoringDetail/MonitoringDetail.jsx
// Page de détail d'un monitoring avec fil d'Ariane, tableau d'erreurs, export CSV
import { useState, useEffect } from 'react';
import { useParams, useNavigate } from 'react-router-dom';
import { Download, TrendingUp } from 'lucide-react';
import { getMonitoringById, getMonitoringDetails, getMonitoringCount, getMonitoringColumns, exportToCSV } from '../../services/api';
import DataTable from '../../components/common/DataTable';
import LoadingSpinner from '../../components/common/LoadingSpinner';
import ErrorMessage from '../../components/common/ErrorMessage';
import Badge from '../../components/common/Badge';
import Button from '../../components/common/Button';
import { getStatutMonitoring } from '../../utils/statutMonitoring';
import styles from './MonitoringDetail.module.css';
export default function MonitoringDetail() {
const { id } = useParams();
const navigate = useNavigate();
const [monitoring, setMonitoring] = useState(null);
const [details, setDetails] = useState([]);
const [columns, setColumns] = useState([]);
const [count, setCount] = useState(0);
const [loading, setLoading] = useState(true);
const [erreur, setErreur] = useState('');
const [search, setSearch] = useState('');
useEffect(() => {
async function loadData() {
setLoading(true);
setErreur('');
try {
const [monit, det, cnt, cols] = await Promise.all([
getMonitoringById(id),
getMonitoringDetails(id, { limit: 5000 }), // Charge maximum pour export complet
getMonitoringCount(id),
getMonitoringColumns(id)
]);
setMonitoring(monit);
setDetails(Array.isArray(det) ? det : []);
setCount(cnt.count ?? cnt.nb_erreurs ?? 0);
// Traite les colonnes de l'API
if (cols?.columns) {
const colsList = cols.columns.map(col => ({
key: col.COLUMN_NAME,
label: col.COLUMN_NAME
}));
setColumns(colsList);
}
} catch (e) {
setErreur(e.message || 'Erreur lors du chargement du monitoring.');
} finally {
setLoading(false);
}
}
loadData();
}, [id]);
/* Filtrage des détails par recherche */
const filteredDetails = details.filter(row => {
if (!search) return true;
return Object.values(row).some(val =>
String(val || '').toLowerCase().includes(search.toLowerCase())
);
});
if (loading) return
Aide : Ce tableau affiche les erreurs détectées pour ce monitoring. Utilisez la barre de recherche pour filtrer. L'export CSV permet de télécharger toutes les données filtrées.