ADR 0036 – Vues contextuelles : une vue paramétrée par le nœud affiché
Accepté (2026-10-16, mode autonome)
ADR 0036 – Vues contextuelles : une vue paramétrée par le nœud affiché
Statut : Accepté (2026-10-16, mode autonome)
Contexte
Le jalon 2 prévoit des vues « paramétrées par le nœud courant, affichées sur les nœuds d’un type donné », dans le panneau de contexte à sections de la charte C3. Exemple : sur la fiche d’un projet, les tâches ouvertes de ce projet.
Décision
Format
name: taches-du-projet
context:
aspects: [projet] # fiches où la vue s'affiche : l'un des types (s'il y en a), tous les aspects
query:
aspects: [tache]
where: "tache.projet == node && tache.statut != 'fait'"
display:
mode: list
columns: [title, tache.statut, tache.echeance]
context(filtre de nœud :types,aspects) rend la vue contextuelle.context: {}l’affiche sur toutes les fiches.nodeest un mot-clé du langagewhere. Il désigne l’identifiant du nœud courant et ne se compare (==,!=) qu’à une référence : un champnode-ref, ouparent. Hors d’une vue contextuelle, le chargeur le refuse.parentest un nouveau champ du nœud, de nature référence :parent == nodedonne les enfants. Il est aussi affichable en colonne (identifiant, décrit dansnodes). Il ne se compare pas à un champ référence d’aspect : on compare chacun ànode.!=traite l’absence comme une valeur (ADR 0028) :tache.projet != noderetient aussi les tâches sans projet, etparent != nodeles racines.- Une vue contextuelle exige
?node=même si sonwherene cite pasnode: elle est conçue pour une fiche. tache.projet == nodeprofite de l’index GIN denode_aspect.data(conditiondata @> {projet: id}ajoutée), etparent == nodede l’index surparent_id.
Ce mot-clé remplace la syntaxe {{node.id}} envisagée dans le cahier. Il est typé et contrôlé au chargement comme le reste du langage, et ne crée pas de gabarit textuel à résoudre.
API
GET /api/views/{name}/results?node=<id>:- le paramètre est exigé par une vue contextuelle (400
node) et ignoré par une vue autonome ; - un nœud inexistant donne 404 (la corbeille est admise) ;
- la réponse porte
contextNode(titre et type).
- le paramètre est exigé par une vue contextuelle (400
GET /api/definitions/viewsexposecontext: le front choisit les vues à montrer sans requête supplémentaire.
Interface
- Panneau de contexte : une section par vue contextuelle qui s’applique au nœud affiché, après « Sous-nœuds ». Elle montre au plus 10 lignes en liste compacte (
ViewList, ADR 0030), avec « Tout voir » vers la page de la vue si le résultat est tronqué. La section est relue quand le nœud change ou est enregistré. - Page de la vue :
/views/<nom>?node=<id>, avec le titre « Tâches du projet · Rénovation toiture 2027 » (lien vers le nœud). - Menu « Vue » : il ne liste que les vues autonomes, puisqu’une vue contextuelle s’ouvre depuis sa fiche.
Alternatives écartées
- Gabarit
{{node.id}}danswhere: il faudrait résoudre un texte avant l’analyse. Le contrôle de type ne pourrait pas vérifier qu’on compare bien une référence, et une valeur mal formée deviendrait une erreur à l’exécution. - Sous-arbre complet (descendants) : il n’est pas demandé par les vues d’exemple, et
parent == nodecouvre les enfants directs. Un opérateurdescendant depourra s’ajouter au langage si un besoin se présente.