ADR 0029 – Vue table : tri serveur, regroupement, édition en ligne
Accepté (2026-10-15, mode autonome)
ADR 0029 – Vue table : tri serveur, regroupement, édition en ligne
Statut : Accepté (2026-10-15, mode autonome)
Décisions prises en mode autonome (Aurélien, 2026-10-15 : options les plus simples, sûres et réversibles).
Contexte
Le moteur de vues (ADR 0028) affiche les résultats en table, en lecture seule. La ligne « Vue table » du jalon 2 demande des colonnes issues des champs, du tri, du regroupement et de l’édition en ligne. Contrainte : AG Grid Community n’a ni regroupement de lignes ni modèle serveur, qui sont des fonctions Enterprise.
Décision
Tri : côté serveur
GET /api/views/{name}/results accepte sort, un paramètre répétable :
- 5 clés au plus, de forme
champ [asc|desc]; - les clés sont contrôlées comme celles de la vue (
Fields.sortProblem) : un champ inconnu, une référence ou un tableau donne 400sort; - elles remplacent le tri de la vue ;
- la réponse indique les clés appliquées (
sort).
Chaque colonne indique si elle est triable (sortable). Un clic sur un en-tête relance la requête, Maj+clic ajoute une clé. La grille garde l’ordre reçu (comparateur neutre) et ne recharge pas l’écran.
Pourquoi côté serveur : une vue est limitée (200 lignes par défaut, truncated). Trier côté client trierait une page, pas la vue. Le tri serveur garde aussi l’ordre déclaré des enums.
Regroupement : côté client, lignes d’en-tête pleine largeur
- Choix « Regrouper par » : il propose le
groupByde la vue (choix par défaut, valeurrow.group), puis toute colonne enum, type ou booléen. - Ordre des groupes : un en-tête de groupe, avec son compte, précède ses lignes dans l’ordre du schéma (enum, types chargés, Non puis Oui). Les valeurs inconnues viennent ensuite, puis « Sans valeur ». Un groupe vide n’est pas affiché.
- Repli : un clic ou Entrée sur l’en-tête replie ou déplie le groupe (
aria-expanded). À l’intérieur d’un groupe, l’ordre du serveur est conservé.
Pourquoi côté client : les lignes sont déjà toutes là, dans la limite, et le regroupement ne change pas leur ensemble.
Édition en ligne : PATCH /api/nodes/{id}/aspects/{aspect}
Chaque clé du corps remplace le champ, null le retire, les autres champs restent. L’écriture passe ensuite par putAspect, comme toute autre :
- validation JSON Schema ;
- workflow (ADR 0023) ;
- références ;
- événement
aspect.updatedavec avant/après.
Les erreurs possibles :
- un champ inconnu de l’aspect donne 400
aspects.<aspect>.<champ>; - un aspect non porté donne 404 ;
- un patch vide ou sans effet n’écrit rien.
Une colonne est modifiable (editable) si c’est un champ texte, nombre, booléen, date ou enum d’un aspect. La cellule ne l’est que sur les lignes qui portent l’aspect (ViewRow.aspects). La table n’ajoute jamais d’aspect.
Éditeurs AG Grid :
| Type de champ | Éditeur |
|---|---|
| Texte | texte |
| Nombre | nombre |
| Booléen | case à cocher |
| Date | date AAAA-MM-JJ |
| Enum | liste |
La liste d’un champ de workflow est restreinte à l’état courant et à ses transitions, comme dans la fiche. Le serveur reste l’arbitre : en cas de refus, la cellule reprend son ancienne valeur et un message role="alert" explique la raison.
Le titre n’est pas modifiable en ligne : PATCH /api/nodes/{id} remplace aussi le corps.
Ouverture du nœud
- Le titre est un vrai lien : Ctrl/Cmd+clic ouvre un onglet du navigateur.
- Un clic, ou Entrée, sur une cellule non modifiable ouvre le nœud.
- Sur une cellule modifiable, un double-clic ou Entrée passe en édition.
Alternatives écartées
- AG Grid Enterprise (regroupement, modèle serveur) : licence payante.
- Tri côté client : il serait faux dès que la vue est tronquée.
- Éditer par
PUTde l’aspect complet depuis le front : il faudrait relire tout l’aspect, et deux éditions proches pourraient s’écraser. Le patch fusionne côté serveur, sous le verrou du nœud.
Conséquences
- Les modes
listetkanbanréutiliseront le même endpoint de patch : le glisser-déposer du kanban écrit le champ de regroupement. - Une ligne modifiée qui ne satisfait plus la condition de la vue reste affichée jusqu’au prochain chargement, ce qui évite qu’elle disparaisse sous le curseur. Si la valeur modifiée est celle du regroupement, la ligne passe dans son nouveau groupe une fois l’enregistrement accepté.
- Un tri refusé (erreur réseau, 400) garde la grille et le tri précédents, avec un message. Le front n’envoie jamais plus de 5 clés.
- Tant qu’un enregistrement est en cours, un clic n’ouvre pas de nœud : un refus reste visible sur la page.
- Les champs date-heure, référence et tableau ne sont pas modifiables en ligne : on les modifie dans la fiche.