import { useState, useEffect, useCallback } from 'react'; import { api } from '../../api.js'; import { fmt, StatusBadge } from './adminHelpers.jsx'; const KNOWN_JOBS = [ { name: 'auto_statut_retard', label: 'Passage automatique en retard' }, ]; export default function JobLogsSection() { const [logs, setLogs] = useState([]); const [total, setTotal] = useState(0); const [loading, setLoading] = useState(true); const [running, setRunning] = useState(null); const [runResult, setRunResult] = useState(null); const [err, setErr] = useState(null); const [page, setPage] = useState(0); const PER_PAGE = 20; const load = useCallback(async () => { try { setLoading(true); const data = await api.get('/admin/job-logs', { limit: PER_PAGE, offset: page * PER_PAGE }); setLogs(data.rows); setTotal(data.total); } catch (e) { setErr(e.message); } finally { setLoading(false); } }, [page]); useEffect(() => { load(); }, [load]); const runJob = async (jobName) => { setRunning(jobName); setRunResult(null); try { const r = await api.post(`/admin/jobs/${jobName}/run`, {}); setRunResult({ ok: true, msg: `Exécution terminée — ${r.nb_changes} modification(s)` }); load(); } catch (e) { setRunResult({ ok: false, msg: e.message }); } finally { setRunning(null); } }; const pages = Math.ceil(total / PER_PAGE); return (

Logs des jobs automatiques

Historique d'exécution des tâches planifiées et lancement manuel.

{KNOWN_JOBS.map(j => ( ))} {runResult && ( {runResult.msg} )}
{loading &&

Chargement…

} {err &&

{err}

} {!loading && !err && !logs.length &&

Aucun log disponible.

} {logs.length > 0 && ( <>

{total} entrée{total > 1 ? 's' : ''} au total

{logs.map(l => ( ))}
DateJobStatut ModifsDétailsErreur
{fmt(l.run_at)} {l.job_name} {l.nb_changes > 0 ? {l.nb_changes} : 0 } {l.details || } {l.error_msg || }
{pages > 1 && (
Page {page + 1} / {pages}
)} )}
); }