// 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 ; if (erreur) return ; const statut = getStatutMonitoring(count); return (
{/* Fil d'Ariane */}
navigate('/dashboard')} className={styles.breadcrumbLink}>Dashboard {monitoring?.service || 'Service'} {monitoring?.nom || 'Monitoring'}
{/* En-tête */}

{monitoring?.nom || monitoring?.monito_intitule || 'Monitoring'}

{monitoring?.bdd_source && {monitoring.bdd_source}} {monitoring?.id_categorie && Catégorie {monitoring.id_categorie}} {statut.label}
{count} erreur{count !== 1 ? 's' : ''}
{/* Actions */}
{/* Filtres */}
setSearch(e.target.value)} />
{/* Résumé des résultats */}
{filteredDetails.length} / {details.length} erreur{details.length !== 1 ? 's' : ''} {search && ` (filtré: ${search})`}
{/* Tableau */} {columns.length > 0 && ( )} {/* Encart aide */}

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.

); }