Skip to content

[REFONTE FA] Retours#4240

Merged
GaelS merged 1 commit intomainfrom
retours-refonte-FA
Feb 16, 2026
Merged

[REFONTE FA] Retours#4240
GaelS merged 1 commit intomainfrom
retours-refonte-FA

Conversation

@GaelS
Copy link
Contributor

@GaelS GaelS commented Feb 3, 2026

Summary by CodeRabbit

  • Nouvelles Fonctionnalités

    • Amélioration de la gestion des notes avec édition en ligne intégrée dans un tableau
    • Système de brouillons pour les financeurs avec persistence locale
  • Améliorations de l'Interface

    • Renommage de la section « Moyens » en « Budget »
    • Corrections mineures de libellés et textes d'interface
    • Amélioration de la cohérence des menus déroulants
    • Raffinement de la typographie et de l'espacement
  • Refactorisation

    • Restructuration des formulaires de gestion des notes et financeurs
    • Modernisation de l'architecture des composants éditables

@coderabbitai
Copy link

coderabbitai bot commented Feb 3, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Ce PR effectue une refonte majeure du module budgétaire : renomme « Moyens » en « Budget », restructure les tables de notes et financeurs avec gestion des brouillons par contexte, introduit une stratégie d'ouverture forcée des sélecteurs (forceOpenSelect) et améliore la composition des formulaires avec des cellules de table spécialisées.

Changes

Cohort / File(s) Summary
Renommage Budget
apps/app/src/plans/fiches/show-fiche/content/moyens/budget.content.tsx, apps/app/src/plans/fiches/show-fiche/content/moyens/budget.tsx, apps/app/src/plans/fiches/show-fiche/content/navigation.tabs.tsx, apps/app/src/plans/fiches/show-fiche/content/type.ts, apps/app/app/(authed)/collectivite/.../actions/[actionId]/budget/page.tsx, apps/app/src/app/pages/.../moyens/moyens.view.tsx, apps/app/app/(authed)/collectivite/.../actions/[actionId]/moyens/page.tsx
Renomme le composant MoyensContent/MoyensView en BudgetContent/BudgetView, met à jour la section type de « moyens » à « budget » et crée une nouvelle page de route budget.
Gestion d'état ouvert des dropdowns
apps/app/src/plans/fiches/show-fiche/utils.ts, apps/app/src/plans/fiches/show-fiche/content/details/acteurs/index.tsx, apps/app/src/plans/fiches/show-fiche/content/details/description/index.tsx, apps/app/src/plans/fiches/show-fiche/content/details/planning/index.tsx, apps/app/src/plans/fiches/show-fiche/header/subheader/pilotes.tsx, apps/app/src/plans/fiches/show-fiche/header/subheader/status.tsx
Introduit constante forceOpenSelect centralisée et remplace les états ouverts codés en dur par celle-ci dans les dropdowns et sélecteurs pour synchroniser le comportement.
Refonte de la table de notes
apps/app/src/plans/fiches/show-fiche/content/notes/notes.table.tsx, apps/app/src/plans/fiches/show-fiche/content/notes/notes.view.tsx, apps/app/src/plans/fiches/show-fiche/content/notes/notes.picto.tsx, apps/app/src/plans/fiches/show-fiche/content/notes/note-form.context.tsx, apps/app/src/plans/fiches/show-fiche/content/notes/note.year.cell.tsx, apps/app/src/plans/fiches/show-fiche/content/notes/note.description.cell.tsx, apps/app/src/plans/fiches/show-fiche/content/notes/note.metadata.cell.tsx, apps/app/src/plans/fiches/show-fiche/content/notes/note.actions.cell.tsx, apps/app/src/plans/fiches/show-fiche/content/notes/editable-note-row.tsx, apps/app/src/plans/fiches/show-fiche/content/notes/note-table-new-row.tsx
Migre vers TanStack React Table, ajoute un contexte de formulaire centralisé (NoteFormProvider), supprime les composants de ligne distincts et crée des cellules spécialisées pour chaque colonne (année, description, métadonnées, actions).
Refonte de la table de financeurs
apps/app/src/plans/fiches/show-fiche/content/moyens/financeurs/financeurs-table.tsx, apps/app/src/plans/fiches/show-fiche/content/moyens/financeurs/financeur-form.context.tsx, apps/app/src/plans/fiches/show-fiche/content/moyens/financeurs/financeur-name.cell.tsx, apps/app/src/plans/fiches/show-fiche/content/moyens/financeurs/financeur-montant.cell.tsx, apps/app/src/plans/fiches/show-fiche/content/moyens/financeurs/financeur-actions.cell.tsx, apps/app/src/plans/fiches/show-fiche/content/moyens/financeurs/use-draft-financeurs.ts, apps/app/src/plans/fiches/show-fiche/content/moyens/financeurs/use-draft-financeurs-storage.ts, apps/app/src/plans/fiches/show-fiche/content/moyens/financeurs/types.ts, apps/app/src/plans/fiches/show-fiche/content/moyens/financeurs/index.tsx, apps/app/src/plans/fiches/show-fiche/content/moyens/financeurs/delete-financeur.button.tsx, apps/app/src/plans/fiches/show-fiche/content/moyens/financeurs/financeur-table-row.tsx, apps/app/src/plans/fiches/show-fiche/content/moyens/financeurs/financeur-table-new-row.tsx, apps/app/src/plans/fiches/show-fiche/content/moyens/financeurs/use-financeur-form.ts
Migre vers TanStack React Table, introduit gestion des brouillons persistants en localStorage (useDraftFinanceurs), centralise la gestion de formulaire par contexte (FinanceurFormProvider), crée des cellules spécialisées et supprime composants de ligne distincts.
Mises à jour du système d'indicateurs
apps/app/src/app/pages/collectivite/Indicateurs/lists/IndicateurCard/IndicateurCardMenu/IndicateurCardMenu.tsx, apps/app/src/app/pages/collectivite/Indicateurs/lists/IndicateurCard/IndicateurCardOptions.tsx, apps/app/src/app/pages/collectivite/Indicateurs/lists/IndicateurCard/menu-actions.ts
Refactor actions de menu pour utiliser un tableau d'actions (menuActions) au lieu de drapeaux booléens, centralise la logique d'actions dans menu-actions.ts et améliore la composition.
Améliorations UI et layout
apps/app/src/plans/fiches/show-fiche/content/content-layout.tsx, apps/app/src/plans/fiches/show-fiche/content/details/description/labels.tsx, apps/app/src/plans/fiches/show-fiche/content/details/editable-item.tsx, apps/app/src/plans/fiches/show-fiche/header/editable-title.tsx, apps/app/src/plans/fiches/show-fiche/header/subheader/priority.tsx, packages/ui/src/design-system/table/react-table.tsx
Ajout de prop byPassEmptyView, label pluriel pour effetsAttendus, ajustement d'alignement dans editable-item, correction de typographie, wrapping de boutons autour de badges et ajout de génériques et rowWrapper à ReactTable.
Mise à jour du Select et RichTextEditor
packages/ui/src/design-system/Select/components/SelectBase.tsx, packages/ui/src/design-system/RichTextEditor/RichTextEditor.tsx
Supprime prop alwaysOpen de SelectProps et ajoute classe !bg-transparent au RichTextEditor en mode unstyled.
Modifications textuelles mineures
apps/app/src/plans/fiches/show-fiche/header/menu/index.tsx, apps/app/src/plans/fiches/show-fiche/header/breadcrumbs/basic-breadcrumbs.tsx, apps/app/src/plans/fiches/show-fiche/header/actions/emplacement/EmplacementFiche/ModaleEmplacement.tsx, apps/app/src/plans/fiches/show-fiche/content/side-panel.config.tsx, apps/app/src/app/pages/collectivite/PlansActions/FicheAction/FicheAction.tsx, apps/app/src/plans/fiches/show-fiche/context/hooks/use-fiche-financeurs.ts, apps/app/src/plans/fiches/show-fiche/context/types.ts
Changements de libellés textuels (« mutualiser dans d'autres plans » → « dans un autre plan »), « Actions non classées » → « Action non classée », ajout de getFinanceurName au contexte et activation permanente de la vue améliorée.
Suppression de fichiers obsolètes
apps/app/src/plans/fiches/show-fiche/content/notes/notes-table-schema.ts, apps/app/src/plans/fiches/show-fiche/content/notes/note-deletion.modal.tsx
Supprime schémas de formulaire obsolètes de notes et remplace DeleteButton par Button dans le modal de suppression.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant NotesUI as Notes Table UI
    participant NoteFormProvider as NoteFormProvider<br/>(Context)
    participant Form as React Hook Form
    participant API as API Backend

    User->>NotesUI: Ouvre la table des notes
    NotesUI->>NoteFormProvider: Render avec fiche prop
    NoteFormProvider->>Form: Initialise form avec defaultValues<br/>(dateNote, description)
    NotesUI->>User: Affiche table avec cellules

    User->>NotesUI: Clique pour éditer année
    NotesUI->>NoteFormProvider: Déclenche NoteYearCell edit
    NoteFormProvider->>Form: Controller observe 'year'
    Form->>User: Affiche Select des années
    
    User->>Form: Sélectionne année
    Form->>Form: Met à jour champ 'year'
    Form->>NoteFormProvider: onChange trigger
    NoteFormProvider->>NoteFormProvider: submitNote appelé
    NoteFormProvider->>API: onUpsertNote({ dateNote, note })
    API->>API: Valide et persiste
    API-->>NoteFormProvider: Succès
    NoteFormProvider->>User: Affiche résultat mis à jour
Loading
sequenceDiagram
    participant User
    participant FinanceursUI as Financeurs Table UI
    participant Draft as useDraftFinanceurs
    participant Storage as localStorage
    participant FinanceurFormProvider as FinanceurFormProvider<br/>(Context)
    participant API as API Backend

    User->>FinanceursUI: Ouvre table des financeurs
    Draft->>Storage: Récupère brouillons persistants
    Storage-->>Draft: Retourne draftFinanceurs
    FinanceursUI->>FinanceursUI: Combine financeurs + brouillons

    User->>FinanceursUI: Clique "Ajouter un financeur"
    FinanceursUI->>Draft: handleCreateDraftFinanceur()
    Draft->>Storage: Sauvegarde nouveau draftId
    Storage-->>Draft: Confirmé
    FinanceursUI->>FinanceurFormProvider: Render nouvelle ligne avec draft

    User->>FinanceursUI: Édite montant du brouillon
    FinanceursUI->>FinanceurFormProvider: Déclenche Controller
    FinanceurFormProvider->>FinanceurFormProvider: Déclenche syncDraft
    FinanceurFormProvider->>Draft: updateDraftFinanceur()
    Draft->>Storage: Persiste changement
    
    User->>FinanceursUI: Clique Enregistrer
    FinanceurFormProvider->>API: onUpsertFinanceur()
    API->>API: Persiste financeur
    API-->>FinanceurFormProvider: Succès
    FinanceurFormProvider->>Draft: deleteDraftFinanceur(draftId)
    Draft->>Storage: Supprime brouillon
    FinanceursUI->>User: Table mise à jour
Loading
sequenceDiagram
    participant User
    participant Dropdown as Dropdown Component
    participant OpenState as forceOpenSelect<br/>(isOpen: true)
    participant Select as Select/Controller

    User->>Dropdown: Survol/Focus
    Dropdown->>OpenState: Consulte isOpen
    OpenState-->>Dropdown: true (toujours)
    Dropdown->>Dropdown: Affiche options
    
    User->>Select: Clique option
    Select->>Select: Valeur sélectionnée
    Select->>OpenState: Tente setIsOpen(false)
    OpenState->>OpenState: noop (pas d'effet)
    Dropdown->>Dropdown: Reste ouvert jusqu'à sélection
    User->>Select: Sélection finalisée
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

  • PR #4212 — Modifie également notes.table.tsx, notes.view.tsx et les fichiers budget associés, chevauchement direct avec les fluxes de notes et budget.
  • PR #4217 — Ajoute les objets d'actions et la visibilité par action à EmptyCard, directement dépendante des changements de moyens/empty-view et des actions conditionnelles.
  • PR #4229 — Touche à la conception système UI (liens, diviseurs), élément lié au refactoring des composants de la page.

Suggested labels

budget, notes, financeurs, refactoring, react-table, formulaires, context-api

Suggested reviewers

  • farnoux

Poem

🐰 Budgets renommés, notes réorganisées,

Les financeurs en brouillons si bien gardés,

Dropdowns toujours ouverts, c'est décidé,

Cellules de table, contextes imbriqués,

Une refonte grande, enfin clarifiée! ✨

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive Le titre est vague et générique, utilisant le terme non-descriptif 'Retours' qui ne transmet aucune information précise sur les changements principaux du PR. Remplacer le titre par une description plus spécifique des changements. Par exemple : '[REFONTE FA] Refactorisation des notes et financeurs' ou '[REFONTE FA] Amélioration de l'interface budgétaire'.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch retours-refonte-FA

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
apps/app/src/plans/fiches/show-fiche/content/navigation.tabs.tsx (1)

16-19: ⚠️ Potential issue | 🟠 Major

Préserver la compatibilité des liens "moyens".

Les URLs existantes avec content=moyens tomberont sur “details” via la garde actuelle. Ajoutez une normalisation pour rediriger vers budget et éviter une rupture de navigation.

💡 Proposition de корректif
-  const rawActiveTab = useSelectedLayoutSegment();
-  const activeTab =
-    rawActiveTab && isFicheSectionId(rawActiveTab) ? rawActiveTab : 'details';
+  const rawActiveTab = useSelectedLayoutSegment();
+  const normalizedTab = rawActiveTab === 'moyens' ? 'budget' : rawActiveTab;
+  const activeTab =
+    normalizedTab && isFicheSectionId(normalizedTab) ? normalizedTab : 'details';

Also applies to: 59-60

🤖 Fix all issues with AI agents
In `@apps/app/src/plans/fiches/show-fiche/content/notes/editable-note-row.tsx`:
- Around line 113-125: The inner TableCell (rendering a <td>) is nested inside
another TableCell causing invalid HTML; replace the inner TableCell in the
VisibleWhen block with a positioned div (keeping the same classes: "absolute
top-0 right-0 text-right border-b border-gray-5" and the
invisible/group-hover:visible wrapper) so NoteDeletionModal stays placed and
visible without creating a nested <td>; update any import/usages if needed and
ensure components MetadataNoteView, VisibleWhen, isReadonly and
NoteDeletionModal remain unchanged.

In `@apps/app/src/plans/fiches/show-fiche/content/notes/notes.view.tsx`:
- Around line 9-23: The view never resets isEditing because NotesTable doesn't
report cancel/success events; add a prop like onEditingStateChange to NotesTable
and call it from NotesTable's cancel handler and after a successful upsert, and
in NotesView pass setIsEditing (or a wrapper) into NotesTable; additionally add
a useEffect in NotesView that watches notes.list and calls setIsEditing(false)
whenever notes.list changes (so ContentLayout.Content/byPassEmptyView toggles
back appropriately).
🧹 Nitpick comments (2)
apps/app/src/plans/fiches/show-fiche/content/notes/notes.table.tsx (1)

45-45: État initial potentiellement figé si les notes arrivent en asynchrone.
Si notes est vide au premier render puis se remplit, isAddingNote reste true et ouvre la ligne “nouvelle note” de façon inattendue. À valider selon le flux de données.

♻️ Proposition de resynchronisation simple
-import { useState } from 'react';
+import { useEffect, useState } from 'react';
@@
-  const [isAddingNote, setIsAddingNote] = useState(notes.length === 0);
+  const [isAddingNote, setIsAddingNote] = useState(notes.length === 0);
+  useEffect(() => {
+    setIsAddingNote(notes.length === 0);
+  }, [notes.length]);
apps/app/src/plans/fiches/show-fiche/content/notes/notes.picto.tsx (1)

3-35: Ajouter un défaut d’accessibilité pour un SVG décoratif.

Si ce picto est purement décoratif, ajoutez aria-hidden="true" et focusable="false" pour éviter l’annonce par les lecteurs d’écran (les props pourront toujours surcharger).

♻️ Proposition de patch
 export const NoteDeSuiviPicto = (props: SVGProps<SVGSVGElement>) => (
   <svg
     xmlns="http://www.w3.org/2000/svg"
     width={68}
     height={68}
     fill="none"
+    aria-hidden="true"
+    focusable="false"
     {...props}
   >

@GaelS GaelS force-pushed the retours-refonte-FA branch from ee15d5f to f709d64 Compare February 4, 2026 09:32
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