[ADD] interface: plan keyboard, tooltip, side panels, person menu, lists
Every gesture the pointer offers on the plan is reachable from the
keyboard (§ 7.3): one stop enters the plan, arrows move between tables and
seats, and the table and place panels choose a seat and keep the focus.
A tooltip names who sits where; a per-person menu moves, assigns or
reserves without dragging; the reserve and the work lists choose a person
to designate on the plan. Escape, a tour change and the executed command
forget the choice, and a click never moves the view.
Checked: 2537 node, 466 browser (one expected failure kept), 60 node-long.
--- FR ---
[ADD] interface : clavier du plan, infobulle, panneaux, menu, listes
Chaque geste que le pointeur offre sur le plan s'atteint au clavier
(§ 7.3) : un seul arrêt entre dans le plan, les flèches vont de table en
table et de siège en siège, et les panneaux de table et de place
choisissent un siège en gardant le focus. Une infobulle nomme qui est
assis où ; un menu par personne déplace, assigne ou réserve sans glisser ;
la réserve et les listes de travail choisissent une personne à désigner
sur le plan. Échap, un changement de tour et la commande exécutée
oublient le choix, et un clic ne déplace jamais la vue.
Vérifié : 2537 node, 466 navigateur (un échec attendu gardé), 60 node-long.
Assisted-by: Claude Opus 5.5
2026-10-07 11:08:59 -04:00
{
[ADD] storage: file format 2, tags, goals, converted journal
Tags on people and goals on tables are operator input that an older
build must not silently drop. Files written now carry format 2 with
every new field optional and last; a format-1 file opens with no write,
and its journal is rewritten as format 2 at the first gesture with every
revision rebuilt byte for byte, so undo crosses the conversion. An older
build opens a format-2 pair read-only. Tags follow one shared form and
split rule, which a guard forbids reimplementing.
Checked: node 4215, navigateur 884, node-long 113; a real format-1 event
written by the previous build stays a fixture; depot and journal 100%.
--- FR ---
[ADD] stockage : format 2, étiquettes, objectifs, journal converti
Les étiquettes des personnes et les objectifs des tables sont de la saisie
qu'une version antérieure ne doit pas perdre sans bruit. Les fichiers
écrits portent le format 2, chaque champ nouveau facultatif et en dernier ;
un fichier du format 1 s'ouvre sans écriture, et son journal passe au
format 2 au premier geste, chaque révision reconstruite à l'octet près :
Défaire traverse la conversion. Une version antérieure ouvre un couple du
format 2 en lecture seule. Une forme et une découpe uniques des étiquettes,
qu'une garde interdit de refaire ailleurs.
Vérifié : node 4215, navigateur 884, longues 113 ; un vrai événement du
format 1, écrit par la version précédente, reste en fixture ; 100 %.
Assisted-by: Claude Opus 5.5
2026-10-11 13:55:19 -04:00
"entete" : { "format" : 2 , "produitVersion" : "epreuve" , "revision" : 1 , "comptes" : { "participants" : 8 , "tables" : 4 , "reservations" : 0 , "titres" : 0 , "propositions" : 1 , "retenu" : 1 } } ,
[ADD] interface: plan keyboard, tooltip, side panels, person menu, lists
Every gesture the pointer offers on the plan is reachable from the
keyboard (§ 7.3): one stop enters the plan, arrows move between tables and
seats, and the table and place panels choose a seat and keep the focus.
A tooltip names who sits where; a per-person menu moves, assigns or
reserves without dragging; the reserve and the work lists choose a person
to designate on the plan. Escape, a tour change and the executed command
forget the choice, and a click never moves the view.
Checked: 2537 node, 466 browser (one expected failure kept), 60 node-long.
--- FR ---
[ADD] interface : clavier du plan, infobulle, panneaux, menu, listes
Chaque geste que le pointeur offre sur le plan s'atteint au clavier
(§ 7.3) : un seul arrêt entre dans le plan, les flèches vont de table en
table et de siège en siège, et les panneaux de table et de place
choisissent un siège en gardant le focus. Une infobulle nomme qui est
assis où ; un menu par personne déplace, assigne ou réserve sans glisser ;
la réserve et les listes de travail choisissent une personne à désigner
sur le plan. Échap, un changement de tour et la commande exécutée
oublient le choix, et un clic ne déplace jamais la vue.
Vérifié : 2537 node, 466 navigateur (un échec attendu gardé), 60 node-long.
Assisted-by: Claude Opus 5.5
2026-10-07 11:08:59 -04:00
"charge" : {
"evenement" : { "id" : "evt-conflit-table-un" , "nom" : "Club des Merles" , "date" : null , "siegesParDefaut" : 2 , "tours" : 2 , "unite" : "cm" , "etat" : "retenu" , "filiation" : null } ,
"reglages" : { "separerAppartenances" : true , "nouveauxVoisins" : true , "nouvelleTable" : true , "varierAppartenances" : true , "attribuerSieges" : false , "generation" : { "nombre" : 5 , "arret" : 200000 , "historique" : 1000 } } ,
"prochainsIds" : { "participant" : 9 , "table" : 5 , "proposition" : 2 } ,
"participants" : [
{ "id" : 1 , "nom" : "Ombrelle" , "prenom" : "Iris" , "appartenance" : null , "courriel" : null , "titrePressenti" : null , "notes" : null , "exclu" : false } ,
{ "id" : 2 , "nom" : "Pervenche" , "prenom" : "Théo" , "appartenance" : null , "courriel" : null , "titrePressenti" : null , "notes" : null , "exclu" : false } ,
{ "id" : 3 , "nom" : "Lacasse" , "prenom" : "Ondine" , "appartenance" : null , "courriel" : null , "titrePressenti" : null , "notes" : null , "exclu" : false } ,
{ "id" : 4 , "nom" : "Grisaille" , "prenom" : null , "appartenance" : null , "courriel" : null , "titrePressenti" : null , "notes" : null , "exclu" : false } ,
{ "id" : 5 , "nom" : "Tourmaline" , "prenom" : "Basile" , "appartenance" : null , "courriel" : null , "titrePressenti" : null , "notes" : null , "exclu" : false } ,
{ "id" : 6 , "nom" : "Arrosoir" , "prenom" : "Capucine" , "appartenance" : null , "courriel" : null , "titrePressenti" : null , "notes" : null , "exclu" : false } ,
{ "id" : 7 , "nom" : "Cerfeuil" , "prenom" : "Aurèle" , "appartenance" : null , "courriel" : null , "titrePressenti" : null , "notes" : null , "exclu" : false } ,
{ "id" : 8 , "nom" : "Bruyère" , "prenom" : "Mélisande" , "appartenance" : null , "courriel" : null , "titrePressenti" : null , "notes" : null , "exclu" : false }
] ,
"tables" : [
{ "id" : 1 , "numero" : 1 , "sieges" : null , "forme" : "ronde" , "position" : { "x" : 0 , "y" : 0 } } ,
{ "id" : 2 , "numero" : 2 , "sieges" : null , "forme" : "ronde" , "position" : { "x" : 300 , "y" : 0 } } ,
{ "id" : 3 , "numero" : 3 , "sieges" : null , "forme" : "ronde" , "position" : { "x" : 600 , "y" : 0 } } ,
{ "id" : 4 , "numero" : 4 , "sieges" : null , "forme" : "ronde" , "position" : { "x" : 900 , "y" : 0 } }
] ,
"reservations" : [ ] ,
"titres" : [ ] ,
"propositions" : [
{ "id" : 1 , "graine" : 1 , "arret" : 40 , "historique" : 1000 , "produitVersion" : "epreuve" , "siegesAttribues" : false , "tables" : [ 1 , 2 , 3 , 4 ] , "capacites" : [ 2 , 2 , 2 , 2 ] , "tours" : 2 , "participants" : [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] , "placement" : [
{ "sieges" : [ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] , [ 7 , 8 ] ] , "reserve" : [ ] } ,
{ "sieges" : [ [ 1 , 2 ] , [ 5 , 7 ] , [ 3 , 8 ] , [ 4 , 6 ] ] , "reserve" : [ ] }
] }
] ,
"retenu" : { "proposition" : 1 , "siegesAttribues" : false , "tables" : [ 1 , 2 , 3 , 4 ] , "capacites" : [ 2 , 2 , 2 , 2 ] , "tours" : 2 , "participants" : [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ] , "placement" : [
{ "sieges" : [ [ 1 , 2 ] , [ 3 , 4 ] , [ 5 , 6 ] , [ 7 , 8 ] ] , "reserve" : [ ] } ,
{ "sieges" : [ [ 1 , 2 ] , [ 5 , 7 ] , [ 3 , 8 ] , [ 4 , 6 ] ] , "reserve" : [ ] }
] }
}
}