Project

General

Profile

Actions

Feature #1143

open
RA

Feature #1133: Implémenter une page de profil utilisateur avec gestion des crédits et des tiers d'abonnement

Frontend — Page de profil client (infos, jauge crédits, tier, upgrade)

Feature #1143: Frontend — Page de profil client (infos, jauge crédits, tier, upgrade)

Added by Redmine Admin about 2 months ago. Updated about 2 months ago.

Status:
QA
Priority:
Normal
Assignee:
-
Start date:
06/18/2026
Due date:
% Done:

0%

Estimated time:
spec_ref:

issue:1133 — spec in epic + ticket description

build_status:
build_number:
ci_run_url:
scan_status:
scan_report_url:
deploy_status:
preprod_url:
deployed_at:
branch:
feat/1143-profile-page
pr_url:
https://github.com/omdev-tech/PipeLiner-Client/pull/69
security_key:
severity:
paused:

Description

## Objectif
Construire la page de profil client Next.js (App Router) consommant les endpoints de lecture du backend (#1141) : infos personnelles, jauge de crédits, carte tier, bouton upgrade. Le changement de mot de passe est traité dans le ticket Fullstack dédié.

## Dépendances
Dépend des endpoints de lecture profil/crédits/tier (#1141).

## Portée
- Route App Router « Mon compte », accessible depuis le menu principal.
- Section infos personnelles (nom, email, entreprise) : email en lecture seule, autres champs modifiables (formulaire + TanStack Query mutation vers l'endpoint backend).
- Jauge de crédits (Atomic Design) à couleur adaptative : vert >50 %, orange <30 %, rouge <10 %.
- Carte du tier actuel : nom, avantages en liste à puces, couleur distinctive par niveau (Démarrage/Maintenance/Évolutions/Pilotage).
- Bouton « Demander une mise à niveau » (optionnel : mailto/redirection vers un formulaire).
- Option : historique des consommations de crédits (affichage si l'endpoint le fournit).
- i18n next-intl : ajouter les clés dans `src/i18n/messages/en.ts` ET `fr.ts` (mêmes clés/placeholders).

## Acceptance criteria
- [ ] La page « Mon compte » est accessible depuis le menu principal.
- [ ] Infos perso affichées; tous les champs modifiables sauf l'email.
- [ ] La jauge de crédits respecte les seuils de couleur (vert >50 %, orange <30 %, rouge <10 %).
- [ ] Le tier est affiché avec ses avantages (liste à puces) et une couleur distinctive.
- [ ] Le bouton « Demander une mise à niveau » est présent et fonctionnel.
- [ ] Clés i18n présentes et cohérentes dans `en.ts` et `fr.ts` (tsc vert).
- [ ] `npx vitest run && npx tsc --noEmit && npx eslint . && npm run build` verts.


Files

design-1143-before.png (168 KB) design-1143-before.png Redmine Admin, 06/18/2026 12:57 PM
design-1143-after.png (387 KB) design-1143-after.png Redmine Admin, 06/18/2026 12:57 PM
design-1143-mockup.html (13.7 KB) design-1143-mockup.html Redmine Admin, 06/18/2026 12:57 PM
design-1143-before.png
design-1143-after.png

RA Updated by Redmine Admin about 2 months ago Actions #1

  • Status changed from Submitted to Spec
  • spec_ref updated (diff)

RA Updated by Redmine Admin about 2 months ago Actions #5

## Design — Mon compte (profil client)

**Stack détectée :** Next.js 16 App Router · React 19 · Tailwind v4 (`@theme`) · next-intl (`en.ts` source de vérité + `fr.ts` **vraie traduction FR** typée `Translated<typeof en>` → tsc impose les mêmes clés/placeholders) · Atomic Design (`src/components/{atoms,molecules,organisms}`). Design system = source de vérité (`docs/design/design-system.md`). **Aucune nouvelle couleur** : la jauge et la carte tier réutilisent les tokens feedback/statut §2 existants.

### Brief — Atomic Design
- **Shell de page (MC.1)** — réutilise le **TopBar §TB** + ajoute une entrée **« Mon compte »** au menu principal et un `Link href="/account"` dans la molecule **`AccountMenu`** existante. Grille responsive `lg:grid-cols-[1.15fr_0.85fr]`, repliée en une colonne en mobile.
- **Atomes réutilisés :** `TextInput` (label + helper/erreur déjà câblés `aria-invalid`/`aria-describedby`), `Button` (primary/ghost, état `loading`), `Toast`, pastille forme §6.1.
- **Nouveaux :**
- atome **`CreditGauge`** (MC.3) — arc SVG natif (pas recharts, réservé à `TimeSeriesChart.tsx`), **couleur adaptative** : `success-fg` `#15803d` si **> 50 %**, `warning-fg` `#b45309` si **< 30 %**, `danger-fg` `#b91c1c` si **< 10 %** ; pourcentage chiffré + mot-verdict + `role="img"`/`aria-label` (jamais la couleur seule, §7).
- molecule **`PasswordChangeForm`** (MC.4) — voir ci-dessous.
- molecule **`CreditHistoryTable`** (MC.6, optionnelle).
- organisms **`ProfileInfoForm`** (MC.2) et **`TierCard`** (MC.5).

### Sections
- **Infos personnelles (MC.2)** — `TextInput` nom/entreprise éditables ; **e-mail en lecture seule** (`disabled` `bg-surface-muted` + pastille « 🔒 Lecture seule », non focusable). Mutation TanStack Query → Toast `success`.
- **Mot de passe (MC.4) — réf. #1144** : conçu ici comme **référence visuelle**. Ancien / nouveau / confirmer ; règle de force (helper ✓ `text-success-fg`) ; non-correspondance → `border-danger-fg` + helper `text-danger-fg` ; bandeaux **succès** (`bg-success-bg`, `role="status"`) / **erreur** serveur (`bg-danger-bg`, `role="alert"`). Le FE de #1143 pose la page ; **#1144 branche le formulaire sur l'endpoint sécurisé**.
- **Carte tier (MC.5)** — liseré gauche 4px + accent par niveau, **couleurs reprises des tokens de statut existants** : Démarrage 2 500 € (slate), Maintenance 4 200 € (cyan), Évolutions 9 700 € (violet), Pilotage 16 000 € (emerald). Avantages en liste à puces (check coloré), échelle 4 segments, **bouton « Demander une mise à niveau → »** pleine largeur.
- **Historique (MC.6)** — table accessible §AD.3, débit `text-danger-fg` / crédit `text-success-fg` ; affichée seulement si l'endpoint la fournit.

### États couverts
Vide/chargement (skeleton `animate-pulse`, respect `prefers-reduced-motion`), erreur (`SectionError`/bandeau + retry), succès (Toast / bandeau), peuplé.

### i18n (MC.7)
Espace `account` (+ `nav.account`) ajouté dans **`en.ts` ET `fr.ts`** (mêmes clés, mêmes placeholders ICU `{amount}`/`{total}`/`{pct}`/`{verdict}`). Noms de formule + mots-verdict toujours rendus en texte à côté de la couleur (§7).

### Preuve before/after (jointe)
- **`design-1143-after.png`** — maquette proposée (TopBar + « Mon compte », infos perso e-mail RO, jauge crédits verte 66 %, formule Évolutions violette, bouton upgrade, bloc mot de passe avec états validation/erreur, historique).
- **`design-1143-before.png`** — **reconstruction** (pas l'écran live) : « Mon compte » est un **écran neuf**. Aujourd'hui le client n'a que le menu Admin / Se déconnecter et aucune page de compte. Capture via le daemon gstack `/browse` (`load-html` + `screenshot`, viewport 840×… @2x).
- **`design-1143-mockup.html`** — maquette HTML autoportante (tokens §2/§3).

### Design system
Section **« Mon compte — profil client (MC) »** ajoutée (strictement additive) à `docs/design/design-system.md`, sous-sections MC.1→MC.7.

Transition **Spec → Design**.

RA Updated by Redmine Admin about 2 months ago Actions #6

  • Status changed from Spec to Design

RA Updated by Redmine Admin about 2 months ago Actions #7

  • Status changed from Design to In development

RA Updated by Redmine Admin about 2 months ago Actions #8

  • Status changed from In development to QA
  • branch set to feat/1143-profile-page
  • pr_url set to https://github.com/omdev-tech/PipeLiner-Client/pull/69

PR ouverte vers `dev` : https://github.com/omdev-tech/PipeLiner-Client/pull/69

Page **« Mon compte »** (`/account`) livrée, accessible depuis le menu principal (`AccountMenu`), consommant les endpoints de lecture billing de #1141. Construite selon le design system **MC.1→MC.7** (section ajoutée à `docs/design/design-system.md`, additive).

**Composants (Atomic Design)**
- Page `app/account/page.tsx` (shell `WorkspaceLayout`, auth-gatée) — §MC.1.
- `AccountModule` (orchestrateur — états chargement/vide/erreur/peuplé).
- Atome **`CreditGauge`** (arc SVG natif, couleur adaptative success/warning/danger, `role="img"` + alternative texte, mot-verdict à côté de la couleur) — §MC.3.
- Organism **`ProfileInfoForm`** (nom + entreprise éditables, **e-mail en lecture seule**, mutation TanStack Query, Toast succès + bandeau erreur) — §MC.2.
- Organism **`TierCard`** (accent par tier repris des tokens de statut, avantages à puces, échelle 4 segments, bouton « Demander une mise à niveau ») — §MC.5.
- Molecule **`CreditHistoryTable`** (optionnelle, table accessible, débit/crédit signé) — §MC.6.

**i18n** — nouveau namespace `account` + `common.myAccount`, ajoutés dans **`en.ts` ET `fr.ts`** (fr = vraie traduction, tsc impose le miroir) — §MC.7.

**Note backend (minimal)** : le critère « infos éditables » exige une cible d'écriture absente des endpoints de lecture #1141 ; ajout minimal et conventionnel — colonne `company` (migration `0013`) + `PATCH /auth/me` + use-case `UpdateClientProfile`. **MC.4 (changement de mot de passe) laissé en `TODO(#1144)`**.

**Gates verts** : `vitest` 586 ✓ · `tsc --noEmit` ✓ · `eslint .` ✓ · `npm run build` ✓ (seul le log `/admin` `ENVIRONMENT_FALLBACK` préexistant) · API `pytest` 557 passés.

Statut : In development → QA.

Actions

Also available in: PDF Atom