Aller au contenu
←
05 / Projets sélectionnés — Étude de casProjet personnel

Un tableau de bord pour le commerce multi-boutiques.

J’ai conçu NyxBoard autour de la file de commandes : filtrer entre plusieurs boutiques, examiner une commande sans perdre sa place et voir chaque changement d’état se répercuter sur l’ensemble du tableau de bord.

Année
2026
Type
Projet personnel
Stack
React + TypeScript
Focus
UI opérationnelle & gestion d’état
Preuve d’interface // Opérations desktopEspace commandes // Vue tableau desktop
Tableau des commandes NyxBoard montrant les onglets de statuts, la barre de recherche avec debounce et les colonnes triables
01En attente

Nécessite une décision opérationnelle avant expédition.

02Non expédiée

Commande active en attente de préparation.

03Expédiée

Expédiée avec numéro de suivi ; le compteur s’incrémente et le taux d’expédition progresse.

04Annulée

Marquée comme annulée et exclue du chiffre d’affaires actif.

01 / Problématique

Garder le tableau de bord clair et lisible

NyxBoard réunit les commandes de plusieurs boutiques, avec leurs filtres, leurs détails et leurs changements de statut. Il fallait garder ces actions à portée de main sans remplir tout l’écran de contrôles.

J’ai gardé la liste et le détail des commandes dans le même espace. On peut filtrer, ouvrir une commande, changer son statut, puis reprendre la liste là où on l’a laissée.

02 / Vue d’ensemble

La vue opérationnelle

La vue d’ensemble et la liste utilisent le même état enregistré. Les commandes annulées sortent du chiffre d’affaires actif.

Preuve d’interface // Opérations desktopVue opérationnelle // Affichage desktop
Interface desktop de la vue d’ensemble opérationnelle NyxBoard présentant les KPI synthétiques, la courbe des ventes et la ventilation des statuts
01 / Filtrage boutique

Périmètre boutique

Changer de boutique filtre le tableau de bord tout en préservant la comparaison globale.

02 / Hiérarchie des métriques

Santé des expéditions

La ligne supérieure met en avant les chiffres prioritaires : chiffre d’affaires, total des commandes, révisions en attente, volume de file et taux d’expédition.

03 / Trajectoire visuelle

Volume & distribution

Expédier une commande modifie la répartition des statuts, mais ne change pas la courbe du chiffre d’affaires sur 14 jours.

04 / Synchronisation d’état

Métriques synchronisées

La vue d’ensemble et la liste utilisent le même état enregistré. Les commandes annulées sortent du chiffre d’affaires actif.

03 / Filtres

L’espace commandes

Recherche, boutique, statut, tri et pagination sont synchronisés dans l’URL. Actualiser ou partager l’écran conserve exactement la même vue au lieu de réinitialiser la liste.

?status=unshipped&store=all&sort=date
Flux d’état des filtres
04 / Inspection & action

Ouvrir une page dédiée ferait perdre le filtre actif et la position de défilement. NyxBoard conserve la liste en arrière-plan et ouvre la commande dans un volet latéral, permettant révision et expédition sans quitter la file.

01 / 03

Contexte filtré

La vue Non expédiées isole les commandes nécessitant une action, tandis que les filtres restent enregistrés dans l’URL.

Progression du flux // 01Contexte filtré // File non expédiée
Espace commandes filtré sur neuf commandes non expédiées, dont ORD-98420.
02 / 03

Inspection en place

La commande ORD-98420 s’ouvre dans un volet latéral pendant que la liste filtrée reste visible derrière.

Progression du flux // 02Examen direct // Volet coulissant
Commande ORD-98420 ouverte dans un volet latéral au-dessus de la liste filtrée, avec bouton Marquer comme expédiée disponible.
Volet de la commande ORD-98420 affichant son statut Non expédiée avant traitement
03 / 03

État mis à jour

Marquer la commande comme expédiée actualise son statut, génère un numéro de suivi et met à jour les indicateurs d’expédition depuis l’état local de démo.

Progression du flux // 03État recalculé // Commande expédiée
Commande ORD-98420 marquée comme Expédiée avec transporteur et numéro de suivi générés ; la liste reste visible derrière.
Volet de la commande ORD-98420 affichant le statut Expédiée, le transporteur et la référence de suivi
05 / Responsive

Priorisation responsive

J’ai maintenu le tableau sur petit écran au lieu de basculer chaque ligne en carte. Les colonnes secondaires s’effacent progressivement pour préserver les informations indispensables à l’identification et au traitement d’une commande.

Priorisation des colonnes

Ce qui reste visible quand l’espace se réduit.

RéférenceP1 Principal

Toujours visible et sert de déclencheur principal.

BoutiqueNiveau 2

Réapparaît à partir du breakpoint xl lorsque l’espace le permet.

Client & CompteReplié

Fusionné sous la cellule Référence sur écran compact.

ArticlesNiveau 2

Réapparaît à partir de 2xl avec une largeur suffisante.

Date de commandeNiveau 2

Réapparaît au breakpoint lg.

Date limite d’envoiNiveau 2

Réapparaît au breakpoint xl.

TotalP1 Principal

Toujours visible.

StatutP1 Principal

Toujours visible.

ActionsNiveau 2

Action explicite sur grand écran ; sur mobile, un appui sur la ligne ouvre la commande.

Priorisation des colonnesCommandes mobile // Viewport 390px
Vue mobile des commandes NyxBoard démontrant la disposition condensée du tableau et la priorisation progressive des colonnes
06 / Ingénierie

Conçu avec rigueur

Une grande partie du travail est invisible sur une capture d’écran. Les filtres doivent survivre au rafraîchissement, chaque mise à jour doit atteindre les vues dépendantes et le volet doit restituer le focus clavier au bon endroit.

Actualisation de l’état partagé

01 / Déclencheur d’événementAction utilisateur

L’utilisateur clique sur « Marquer comme expédiée » dans le volet

Met à jour l’état local de démo avec un indicateur de chargement immédiat pour le retour visuel.

02 / Persistance & actualisationbumpVersion()

orderService.markAsShipped(id) → version++

Enregistre la commande modifiée localement et incrémente le compteur de version.

03 / Vues synchroniséesMise à jour des vues dépendantes
Architecture & frontières d’état

React + TypeScript strict

Garantit le typage explicite des commandes, filtres et mutations à travers toute l’application.

État d’espace de travail dans l’URL

Recherche, boutique, statut, tri et pagination sont inscrits dans l’URL et validés avant exécution.

État partagé & actualisation

Lorsqu’une commande change, OrdersContext recalcule les données dérivées pour le tableau, les compteurs, la barre latérale et la vue d’ensemble.OrdersContext

Couche de service

orderService.ts centralise le filtrage, le tri, la pagination, les calculs de KPI et les mutations locales.orderService.ts

Persistance & chargement

localStorage préserve les modifications de démo entre les recharges, tandis que routes et graphiques sont chargés à la demande.localStorage

Tokens de statuts opérationnelsTexte + couleur

Les statuts associent texte et couleur, avec un contraste vérifié pour chaque badge.

Expédiée Comportement du statutExpédiée avec numéro de suivi ; le compteur s’incrémente et le taux d’expédition progresse.
#047857 sur #ecfdf5
Statut lisible même sans perception des couleursContraste vérifié par badge

NyxBoard utilise une interface claire et très contrastée. Le traitement sombre encre, violet et cyan est propre à cette étude de cas, non au produit lui-même.

Ingénierie de l’accessibilité

Le volet de commande et sa boîte de dialogue de confirmation exigent tous deux un parcours clavier prévisible.

Déclencheur→Focus capté→Piégé→Échap→Restauré
  • Dialogues & tableaux sémantiquesStructure de tableau HTML native et boîtes de dialogue labellisées sans recourir à des div génériques.
  • Navigation clavier & lien d’évitementCommandes accessibles au clavier, touche Échap pour fermer le volet et lien d’évitement au sommet de l’interface.
  • Restauration du focusFermer le volet restitue le focus sur la commande correspondante ; fermer la confirmation renvoie au bouton déclencheur.
  • Mouvement réduitTransitions du volet et graphiques respectent les préférences prefers-reduced-motion.prefers-reduced-motion
  • Graphiques accessiblesRésumés textuels concis doublant chaque représentation visuelle SVG.
07 / Bilan

Ce qui fonctionne

Je garderais la file de commandes au cœur du produit. La vue d’ensemble aide à repérer le travail à faire, mais c’est dans la liste et le volet latéral qu’on examine et met à jour chaque commande.

Dans un contexte de production

NyxBoard est un projet front-end. Les données sont injectées en local, la persistance s’opère dans le navigateur et l’authentification est simulée. Une version de production nécessiterait un véritable backend, des permissions fines et des intégrations avec les systèmes métiers.

01

API Backend

Déplacer la gestion des commandes de orderService.ts vers des endpoints API sécurisés.orderService.ts

02

Données côté serveur

Traiter le filtrage, le tri et la pagination côté serveur lorsque le volume dépasse les capacités du navigateur.

03

Gestion des permissions

Définir des rôles précis pour l’expédition, l’annulation ou l’exportation au lieu d’un accès démo indifférencié.

04

Intégrations réelles

Remplacer les états d’expédition simulés par des événements réels de transporteurs ou de plateformes e-commerce.