Plan d'Amélioration Frontend - Aaperture
Dernière mise à jour : 2026-02-21
Source de vérité : Ce document est la référence principale pour les améliorations frontend.
Point d'entrée : ROADMAP.md | PRIORITES.md
📊 Vue d'ensemble
Objectif principal : Maintenir tous les fichiers de composant/page sous 400 lignes pour améliorer la lisibilité, la maintenabilité et la testabilité.
Statut actuel :
- ✅ Refactoring cible (fichiers > 400 lignes) : première vague terminée (32 fichiers refactorisés, voir FRONTEND_REFACTORING_RESTANTS.md).
- Les éventuels fichiers encore au-dessus de 400 lignes relèvent d’une priorisation continue ; pas de liste figée dans ce document.
✅ Ajouts récents (février 2026)
-
✅ Dashboard simplifié (hub) : recentrage de l’accueil vers un hub modulaire et allégé, avec dispatch des vues détaillées vers les pages dédiées.
-
✅ Quick Actions : suppression du pattern dropdown non essentiel, harmonisation des actions rapides.
-
✅ Session Wizard (modal multi-étapes) :
- création guidée session + documents (devis/facture) + moodboard
- champs obligatoires visibles et validation de progression par étape
- dépendances explicites entre type de session, workflow, prestation (rate) et plan de paiement
- résumé final rendu lisible (labels métier, statuts humains, valeurs compréhensibles)
- création automatique de ligne prestation dans devis/facture si sélectionnée
- placeholders explicites pour noms optionnels devis/facture avec nom par défaut
-
✅ UX Configuration Wizard :
- workflow hérité du type de session par défaut (édition manuelle possible)
- états disabled maîtrisés tant que les prérequis ne sont pas sélectionnés
- correction du bouton
Modifierworkflow (plus d’écrasement automatique de l’état manuel)
-
✅ Messagerie : unification des threads (app/portail/contacts) avec
ClientThreadView, previews images via URL signées, modal plein écran et UX alignée. -
✅ Pièces jointes : upload résilient côté portail (presigned + fallback backend), rafraîchissement temps réel des fichiers via WebSocket.
-
✅ Stabilité UI : loaders cohérents sur le chargement de conversation, scroll interne maîtrisé (pas de scroll global).
-
✅ Chat agent : refonte UI/UX (input, tokens
/et@, commandes, navigation clavier), formulaires guidés et statut visuel des actions. -
✅ Chat agent (form builder) : refactor en composants + hooks dédiés pour rester < 400 lignes par fichier, lint stabilisé.
-
✅ Chat agent (usages) :
/helpdirect sans formulaire, input actif même avec formulaire ouvert, badges@typelisibles. -
✅ Chat agent (stabilité runtime) :
- suppression du streaming
- message utilisateur optimiste immédiat
- apparition formulaire sans refresh
- rendu standardisé des retours actions (success/warning/error)
- tests ciblés prefill formulaires
🎯 Nouvelle priorité frontend recommandée
Priorité #1 - E2E Agent Chat (fiabilité produit)
- Ajouter une suite e2e navigateur pour couvrir :
- commande
/avec formulaire attendu - mention
@+ préremplissage effectif - soumission formulaire -> statut DONE
- réponse erreur -> statut WARNING/ERROR standardisé
- commande
- Objectif : empêcher les régressions invisibles “ça marche au refresh mais pas à chaud”.
- ✅ Base Playwright ajoutée (config + scénarios critiques)
- ✅ Fixture d’auth + seed API minimal (contact/session) ajoutés
- ✅ 2 scénarios critiques activés (slash token immédiat,
@session-> chip) - 🔜 Prochaine étape : rendre 2 scénarios restants déterministes (DONE + bloc warning/error)
- ✅ Intégration GitLab ajoutée : job
test:e2e:frontend(auto si secrets e2e disponibles, manuel sinon)
📋 Refactoring (historique)
Le refactoring des fichiers > 400 lignes a été mené à bien pour une première vague de 32 fichiers. Liste et statistiques : FRONTEND_REFACTORING_RESTANTS.md. Pour toute nouvelle cible (fichiers encore longs), prioriser via PRIORITES.md et ce plan.
📋 Checklist de Refactoring
Pour chaque fichier à refactorer :
Analyse
- Identifier les sections distinctes
- Identifier la logique métier réutilisable
- Identifier les utilitaires à extraire
- Identifier les types à extraire
Extraction
- Créer
components/directory avec composants scoped - Créer
hooks/directory avec hooks personnalisés - Créer
helpers.tspour utilitaires - Créer
types.tspour types spécifiques
Refactoring
- Utiliser
FormPageLayout/ViewPageLayout/ListPageLayout - Utiliser composants molécules (
PageHeader,DataField,StatusBadge) - Utiliser
ListPageContentpour listes - Utiliser
useListPagepour logique de liste - Vérifier responsive (mobile-first)
- Vérifier accessibility
Validation
-
npm run lint- Aucune erreur -
npm run build- Build réussi - Tester toutes les fonctionnalités
- Vérifier sur mobile
- Vérifier sur desktop
🏗️ Structure Recommandée pour Pages Complexes
{PageName}/
{PageName}.tsx # Composant principal (< 400 lignes)
types.ts # Types TypeScript
helpers.ts # Fonctions utilitaires
hooks/ # Hooks personnalisés
use{Feature}.ts
components/ # Composants scoped
{SectionComponent}.tsx
index.ts
📚 Patterns de Refactoring
Pattern 1 : Formulaires Complexes
// InvoiceFormPage.tsx (< 400 lignes)
import { InvoiceDetailsForm, InvoiceItemsForm, InvoiceRecipientForm } from "./components";
import { useInvoiceForm } from "./hooks/useInvoiceForm";
export const InvoiceFormPage = () => {
const form = useInvoiceForm();
return (
<FormPageLayout backTo="/invoices" title="...">
<InvoiceDetailsForm form={form} />
<InvoiceItemsForm form={form} />
<InvoiceRecipientForm form={form} />
<FormActions ... />
</FormPageLayout>
);
};
Pattern 2 : Pages avec Onglets
// AdminPanelPage.tsx (< 400 lignes)
import { AdminUsersTab, AdminSettingsTab, AdminSystemTab } from "./components";
export const AdminPanelPage = () => {
const [activeTab, setActiveTab] = useState("users");
return (
<Tabs value={activeTab} onValueChange={setActiveTab}>
<TabsList>...</TabsList>
<TabsContent value="users">
<AdminUsersTab />
</TabsContent>
<TabsContent value="settings">
<AdminSettingsTab />
</TabsContent>
<TabsContent value="system">
<AdminSystemTab />
</TabsContent>
</Tabs>
);
};
Pattern 3 : Pages de Visualisation
// SessionViewPage.tsx (< 400 lignes)
import {
SessionInfoSection,
SessionTimelineSection,
SessionDocumentsSection,
} from "./components";
export const SessionViewPage = () => {
const { data: session } = useSession(id);
return (
<ViewPageLayout>
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
<div className="md:col-span-2">
<SessionInfoSection session={session} />
<SessionTimelineSection session={session} />
</div>
<div className="sticky top-20">
<SessionDocumentsSection session={session} />
</div>
</div>
</ViewPageLayout>
);
};
Pattern 4 : Router Configuration
// router.tsx (< 400 lignes)
import { authRoutes } from "./routes/auth.routes";
import { adminRoutes } from "./routes/admin.routes";
import { sessionsRoutes } from "./routes/sessions.routes";
// ... autres routes
export const routeTree = rootRoute.addChildren([
...authRoutes,
...adminRoutes,
...sessionsRoutes,
// ...
]);
📈 Métriques de Succès
Objectifs Quantitatifs
- 0 fichiers > 1000 lignes
- 0 fichiers > 400 lignes
- 100% des pages utilisent les layouts standardisés
- 100% des listes utilisent
ListPageContent - 100% des formulaires utilisent
FormPageLayout
Objectifs Qualitatifs
- Code plus maintenable et testable
- Composants réutilisables maximisés
- Performance améliorée (First Contentful Paint, Time to Interactive)
- Meilleure expérience utilisateur (mobile et desktop)
✅ Améliorations Complétées Récemment
Settings Contextuels avec Sidebar (2026-01-29)
Objectif : Intégrer les panneaux de settings directement dans les vues pour réduire la navigation et améliorer l'expérience utilisateur.
Implémentation :
- ✅ UserViewPage : Panneau de settings contextuel avec tabs Profile, Subscription, Permissions
- ❌ AdminPanelPage : Panneau de settings retiré (2026-01-29) - Les tabs sont restés inline car la page Admin est déjà une page de configuration
- ✅ Pattern cohérent avec
InsightSettingsSidebarContentexistant - ✅ Bouton Settings (icône roue crantée) dans les headers des vues
- Bouton icon-only (
size="icon") avec variantoutline - Icône
Settingsde lucide-react (h-4 w-4) - Texte
sr-onlypour l'accessibilité - Positionné dans le header à droite, à côté des autres actions
- Bouton icon-only (
- ✅ Footer fixe avec actions (Cancel/Save) dans les panneaux
Pattern du bouton Settings :
<Button
size="icon"
variant="outline"
onClick={() => setSettingsSidebarOpen(true)}
>
<Settings className="h-4 w-4" />
<span className="sr-only">{t("common.settings", "Paramètres")}</span>
</Button>
Fichiers créés/modifiés :
frontend/src/pages/users/UserViewPage/components/UserSettingsSidebarContent.tsx(CREATED)frontend/src/pages/users/UserViewPage/UserViewPage.tsx(MODIFIED - intégration sidebar + bouton Settings)frontend/src/pages/admin/AdminPanelPage/AdminPanelPage.tsx(MODIFIED - tabs inline restaurés, sidebar retirée)
Bénéfices :
- Accès contextuel aux settings depuis les vues
- Réduction de la navigation vers des pages séparées
- Pattern uniforme avec les autres vues (Insights)
- Meilleure découverte des options de configuration
- Bouton Settings visible et accessible dans le header de chaque vue
Prochaines étapes :
- ✅ COMPLÉTÉ (2026-01-29) - Toutes les vues principales ont maintenant des sidebars de settings :
- ✅ SessionViewPage (type de session, notifications)
- ✅ OrganizationViewPage (membres, ressources)
- ✅ DashboardPage (widgets, rafraîchissement)
🔗 Références
- Liste complète : FRONTEND_REFACTORING_RESTANTS.md
- Guidelines Frontend : AGENTS_FRONTEND.md (documentation interne)
- Documentation Frontend : FRONTEND.md
- Patterns : AGENTS_PATTERNS.md (documentation interne)
- Priorités : PRIORITES.md