Skip to content

#minor (2653) [Action] Historiser les modifications#1450

Draft
ch-benard wants to merge 19 commits intodevelopfrom
issue/2653
Draft

#minor (2653) [Action] Historiser les modifications#1450
ch-benard wants to merge 19 commits intodevelopfrom
issue/2653

Conversation

@ch-benard
Copy link
Copy Markdown
Contributor

@ch-benard ch-benard commented Mar 26, 2026

🧾 Ticket Trello

https://trello.com/c/otR94k9k/2653

🛠 Description de la PR

Objectif

Implémenter l'affichage de l'historique des modifications des actions, similaire au fonctionnement de l'historique des sites. Cette fonctionnalité permet aux utilisateurs de consulter toutes les modifications apportées à une action, avec un système de filtrage par catégorie et une différenciation claire des types de financement.

Modifications apportées

Backend

1. Structure de base
  • Controller : packages/api/server/controllers/action/getHistory/

    • Route GET /actions/:id/history
    • Validation des permissions et de l'ID
  • Service : packages/api/server/services/action/getHistory.ts

    • Récupération de l'historique via le modèle
    • Gestion des erreurs
  • Tests : packages/api/server/services/action/getHistory.spec.ts

    • Tests unitaires du service
2. Requête SQL avec UNION
  • Fichier : packages/api/server/models/actionModel/getHistory/getHistory.ts
    • UNION entre actions_history (versions historisées) et actions (état actuel)
    • CTEs pour agréger les relations de l'état actuel :
      • action_topics_agg : thématiques
      • action_managers_agg : pilotes
      • action_operators_agg : opérateurs
      • action_shantytowns_agg : sites liés
      • action_finances_agg : financements
    • Cast de location_type::enum_actions_history_location_type pour compatibilité enum
    • Utilisation de :actionId AS hid dans les CTEs pour les jointures
    • Tri : ORDER BY updated_at ASC, hid DESC
3. Sérialisation
  • Fichier : packages/api/server/models/actionModel/_common/serializeAction.ts
    • Formatage des données d'action pour l'historique
    • Conversion des timestamps
    • Structuration des relations
4. Différenciation des financements
  • Fichier : packages/api/server/models/actionModel/_common/getDiff.ts
    • Comparaison type par type au lieu d'agréger en un seul total
    • Création de Maps pour indexer par type.uid
    • Génération de diffs séparés :
      • fieldKey : finances.{année}.{typeUid} (ex: finances.2024.state)
      • field : Financement {année} - {typeName} (ex: "Financement 2024 - État")

Frontend

5. Composants d'affichage
  • FicheActionHistorique.vue : Panneau latéral principal

    • Affichage de la liste des modifications
    • Filtrage par catégorie (Financements, Thématiques, Contacts, Sites)
    • Support du filtrage par préfixes (finances.2024.state matche finances)
    • Rechargement forcé à chaque ouverture
  • FicheActionHistoriqueItem.vue : Item de modification

    • Affichage de l'auteur et de son organisation
    • Date de modification formatée
    • Liste des champs modifiés avec anciennes/nouvelles valeurs
    • Valeurs barrées pour les anciennes valeurs
  • FicheAction.filter.js : Configuration des filtres

    • Mapping catégories → champs
    • financements → finances
    • thematiquestopics
    • contactsmanagers, operators
    • sitesshantytowns
6. Intégration
  • API : packages/frontend/webapp/src/api/actions.api.js

    • Fonction getHistory(actionId) pour appeler le backend
  • FicheAction.vue : Intégration du composant historique

    • Gestion de l'état historyPanelOpened
    • Provide openHistoryPanel pour les sous-composants
  • FicheActionHeaderBoutons.vue : Bouton "Historique"

    • Ouvre le panneau latéral
7. Provide/Inject pour les sections
  • Toutes les sections de la fiche (FicheActionCaracteristiques, FicheActionFinancements, etc.)
    • Inject openHistoryPanel
    • Permettra d'ouvrir l'historique avec un filtre spécifique (future amélioration)

Résultat

Fonctionnalités

  • Affichage de toutes les modifications d'une action (historique + état actuel)
  • Filtrage par catégorie (Financements, Thématiques, Contacts, Sites)
  • Différenciation des types de financement par année
  • Affichage des anciennes et nouvelles valeurs
  • Formatage des dates et des montants
  • Affichage de l'auteur et de son organisation

Tests

  • Affichage de l'historique complet (16 modifications)
  • Filtre "Financements" affiche les modifications par type
  • Filtre "Thématiques" affiche les changements de thématiques
  • Filtre "Contacts" affiche les modifications de pilotes/opérateurs
  • Filtre "Sites" affiche les modifications de sites liés
  • État actuel inclus dans l'historique
  • Lint passé sans erreur

Description de la mise à jour de la PR #1

Objectif

Corriger l'affichage du bouton "Modifier les options" qui s'affichait pour des rôles n'ayant aucune option configurable (notamment direct_collaborator)

Modifications apportées

Frontend

  1. FicheAccesActionModifyOptions.vue

    • Ajout d'une vérification dynamique hasAvailableOptions qui vérifie si le rôle possède des options dans permissions_description
    • Le bouton ne s'affiche plus que si rolePermissions.options.length > 0
    • Approche générique et maintenable : pas besoin de lister les rôles à exclure
  2. FicheAccesBodyOptions.vue

    • Alignement sur la structure de la branche develop
    • Remplacement de CheckableGroup par des composants Checkbox individuels
    • Ajout des props variant="checkbox", direction="col" et :active
    • Déplacement du bouton de validation à l'intérieur du conteneur des options
  3. ModalExportLien.vue

    • Remplacement du composant Button par DsfrButton (disponible globalement)
    • Correction : la prop :loading n'existe pas dans DsfrButton (selon la documentation officielle)
    • Utilisation de :disabled="disabled || isLoading" à la place

Backend

  1. permissions_description.ts
    • Documentation explicite des permissions d'export des actions :
      • direct_collaborator : "Exporter les actions" (avec financements)
      • association : "Exporter les actions" (hors financements)
    • Ces permissions sont déjà accordées par la migration 30000106-01, cette modification améliore juste la documentation

Résultat

  • Le bouton "Modifier les options" ne s'affiche plus pour les rôles sans options configurables (direct_collaborator, external_observator, etc.)
  • Le panneau d'options utilise les mêmes composants que dans develop
  • Les permissions d'export sont correctement documentées
  • Correction d'un bug d'utilisation de DsfrButton avec une prop inexistante

📸 Captures d'écran

Si pertinent, mettre ici des captures de présentation de la fonctionnalité.

🚨 Notes pour la mise en production

Liste des choses à faire pour le déploiement (changement de configuration, migrations à faire tourner, etc.), si possible avec les éléments les plus précis possibles (commande exacte à exécuter, etc.).

refers to https://trello.com/c/otR94k9k/2653

- Création du controller getHistory avec route et validation
- Création du service getHistory pour récupérer l'historique d'une action
- Création de la fonction serializeAction pour formater les données
- Ajout des tests unitaires pour le service getHistory
- Export des nouvelles fonctions dans l'index du modèle
- Enregistrement du service dans actionService
refers to https://trello.com/c/otR94k9k/2653

- Requête SQL avec UNION entre actions_history et actions (état actuel)
- Création de CTEs pour agréger les relations de l'état actuel (topics, managers, operators, shantytowns, finances)
- Cast du champ location_type pour résoudre l'incompatibilité des types enum
- Utilisation de :actionId AS hid dans les CTEs pour les jointures
- Tri par updated_at ASC puis hid DESC
- Parsing des colonnes JSONB retournées comme strings
refers to https://trello.com/c/otR94k9k/2653

- Modification de la logique de diff pour comparer les financements type par type
- Création de Maps pour indexer les financements par type (uid)
- Génération de diffs séparés pour chaque type (État, Europe, Collectivité, etc.)
- Format des fieldKey : finances.{année}.{typeUid} (ex: finances.2024.state)
- Affichage du nom du type dans le label : 'Financement 2024 - État'
refers to https://trello.com/c/otR94k9k/2653

- Création du composant FicheActionHistorique avec panneau latéral
- Création du composant FicheActionHistoriqueItem pour afficher chaque modification
- Implémentation du filtrage par catégorie (Financements, Thématiques, Contacts, Sites)
- Support du filtrage par préfixes de champs (finances.2024.state matche finances)
- Formatage des noms d'auteur et des dates
- Rechargement forcé de l'historique à chaque ouverture du panneau
- Création du fichier de configuration des filtres
refers to https://trello.com/c/otR94k9k/2653

- Ajout de la fonction getHistory dans l'API actions
- Intégration du composant FicheActionHistorique dans FicheAction
- Ajout du bouton 'Historique' dans le header de la fiche
- Gestion de l'état d'ouverture/fermeture du panneau historique
refers to https://trello.com/c/otR94k9k/2653

- Utilisation de provide/inject pour partager openHistoryPanel entre les composants
- Permet aux sections de la fiche d'ouvrir l'historique avec un filtre spécifique
- Ajout de la prop categoryFilter dans FicheRubrique
- Propagation du filtre aux sous-composants des sections
refers to https://trello.com/c/otR94k9k/2653

Cette propriété est initialisée à false par défaut, puis elle sera mise à true dans mergeFinances.ts si l'action possède un financement de type "dédié" (Dihal)
@tristanrobert
Copy link
Copy Markdown
Contributor

tristanrobert commented Mar 26, 2026

Snyk checks have passed. No issues have been found so far.

Status Scan Engine Critical High Medium Low Total (0)
Open Source Security 0 0 0 0 0 issues

💻 Catch issues earlier using the plugins for VS Code, JetBrains IDEs, Visual Studio, and Eclipse.

@MTES-MCT MTES-MCT deleted a comment from sonarqubecloud bot Mar 26, 2026
…teur

refers to https://trello.com/c/otR94k9k/2653

- Création de UserInfo pour les informations de base
- Création de CreatorInfo pour les informations de créateur (toujours présentes)
- Création de EditorInfo pour les informations d'éditeur (optionnelles)
- Création de AuditInfo combinant CreatorInfo et EditorInfo
- Permet de mutualiser le code dupliqué dans les types ActionRow
…teur

refers to https://trello.com/c/otR94k9k/2653

- Création de UserInfo pour les informations de base
- Création de CreatorInfo pour les informations de créateur (toujours présentes)
- Création de EditorInfo pour les informations d'éditeur (optionnelles)
- Création de AuditInfo combinant CreatorInfo et EditorInfo
- Permet de mutualiser le code dupliqué dans les types ActionRow
@MTES-MCT MTES-MCT deleted a comment from sonarqubecloud bot Mar 26, 2026
@sonarqubecloud
Copy link
Copy Markdown

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants