diff --git a/docs/UTILISATEURS.md b/docs/UTILISATEURS.md index 03d1696..9f51208 100644 --- a/docs/UTILISATEURS.md +++ b/docs/UTILISATEURS.md @@ -576,6 +576,8 @@ Les consultations simples ne sont pas journalisées comme actions modificatrices Le journal doit servir à comprendre les changements et protéger l'historique, pas à surveiller les membres. +Tous les modules ne sont pas équivalents en journalisation. Les actions techniques sont enregistrées largement par l'API. L'historique métier détaillé, avec raison et valeurs avant/après, existe pour les processus sensibles déjà instrumentés : trésorerie, réserves, collectes, dépenses, gouvernance, procès-verbaux, rencontres, contributions, littérature et gestion des membres. + ## 14. Modifications simultanées Il peut arriver que deux membres exécutifs travaillent sur la même information en même temps. diff --git a/frontend/src/pages/JournalActions.jsx b/frontend/src/pages/JournalActions.jsx index e6187a6..f72eb5e 100644 --- a/frontend/src/pages/JournalActions.jsx +++ b/frontend/src/pages/JournalActions.jsx @@ -4,6 +4,7 @@ import { api } from '../stores/api'; const DOMAINES = [ ['', 'Tous les domaines'], + ['membres', 'Membres'], ['propositions', 'Gouvernance'], ['pv_reunions', 'Procès-verbaux'], ['collectes', 'Collectes'], @@ -62,9 +63,11 @@ export default function JournalActions() { dateStyle: 'medium', timeStyle: 'short', }); - const formatDateCompacte = (value) => new Date(value).toLocaleString('fr-CA', { + const formatJour = (value) => new Date(value).toLocaleDateString('fr-CA', { month: 'short', day: 'numeric', + }); + const formatHeure = (value) => new Date(value).toLocaleTimeString('fr-CA', { hour: '2-digit', minute: '2-digit', }); @@ -81,17 +84,6 @@ export default function JournalActions() { .map((cle) => [cle, avant?.[cle], apres?.[cle]]) .filter(([, a, b]) => JSON.stringify(a) !== JSON.stringify(b)); }; - const resumeChangements = (item) => { - const lignes = changements(item.avant, item.apres); - if (lignes.length === 0 && item.avant && !item.apres) { - return Object.keys(item.avant).slice(0, 2).join(', ') || item.raison; - } - if (lignes.length === 0) return item.raison; - const resume = lignes.slice(0, 2) - .map(([cle, avant, apres]) => `${cle}: ${formatValeur(avant)} → ${formatValeur(apres)}`) - .join(' · '); - return lignes.length > 2 ? `${resume} · +${lignes.length - 2}` : resume; - }; const domaineLabel = (value) => DOMAINES.find(([id]) => id === value)?.[1] || value || '—'; const updateFiltre = (key, value) => setFiltres((f) => ({ ...f, [key]: value })); const resetFiltres = () => { @@ -154,7 +146,7 @@ export default function JournalActions() { {actionsDisponibles.map((action) => )}
{item.raison}
-- {formatDate(item.cree_le)} · {item.membre_prenom || item.membre_id || 'Membre inconnu'} -
+Par {item.membre_prenom || item.membre_id || 'membre inconnu'}
Domaine
{domaineLabel(item.table_cible)}
Action
{item.action}
Référence technique
{item.objet_id}
API
{item.chemin_api}
Date: {formatDate(action.cree_le)}
+Action: {action.methode} {action.chemin}
Membre: {action.membre_id}
{action.admin_id &&Admin: {action.admin_id}
} {action.adresse_ip &&IP: {action.adresse_ip}
}