Second Brain documentation

ADR 0029 – Vue table : tri serveur, regroupement, édition en ligne

Accepté (2026-10-15, mode autonome)

← Toutes les décisions

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 400 sort ;
  • 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 groupBy de la vue (choix par défaut, valeur row.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.updated avec 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 PUT de 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 list et kanban ré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.