[ADD] application: clock, translation, formatting, displayed name
The screens need one clock, one translation mechanism and one way to
format and name, or each component grows its own. horloge.js is the only
code that reads time and arms timers, injected so tests drive it.
traduction.js keys texts by domain, in two families of tables, raises on a
missing key and never shows a raw key; libelles/ splits the label table by
domain. format.js formats numbers and dates in French, and personnes.js
composes the displayed name the frozen labels use. Nothing persists
between sessions.
Checked: 1773 node and 43 browser tests.
--- FR ---
[ADD] application : horloge, traduction, mise en forme, nom affiché
Les écrans exigent une horloge, un mécanisme de traduction et une façon de
mettre en forme et de nommer, sans quoi chaque composant ferait les siens.
horloge.js est le seul code qui lit l'heure et arme des minuteries, injecté
pour que les épreuves le pilotent. traduction.js range les textes par
domaine, en deux familles de tables, lève sur une clé absente et ne montre
jamais une clé brute ; libelles/ découpe la table des libellés par domaine.
format.js met en forme nombres et dates en français, et personnes.js
compose le nom affiché qu'emploient les libellés figés. Rien ne persiste
d'une séance à l'autre.
Vérifié : 1773 node et 43 navigateur.
Assisted-by: Claude Opus 5.5
2026-10-07 02:33:39 -04:00
|
|
|
// © 2026 TechnoLibre (http://www.technolibre.ca)
|
|
|
|
|
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
|
|
|
|
|
|
|
|
|
// Les libellés communs aux écrans : commandes, confirmations, remèdes d'un
|
|
|
|
|
// refus (§ 14.6). Chaque clé commence par « communs. ».
|
[ADD] interface: primitives — field, refusal, confirmation, command
Every screen of the plan edits, refuses and confirms the same way, so
these behaviours live once. A field validates on leaving it and shows a
refused value as refused, restoring the stored one when a session refusal
clears. A refusal is shown where the gesture happened, with its remedy as
an executable command. The confirmation window only opens for a gesture
that destroys data, and stays busy — no key closes it — until the
confirmed action ends.
Checked: 2152 node and 163 browser tests.
--- FR ---
[ADD] interface : primitives — champ, refus, confirmation, commande
Chaque écran du plan saisit, refuse et confirme de la même façon : ces
comportements n'existent qu'une fois. Un champ se valide à sa sortie et
montre une valeur refusée comme refusée, rendant la valeur enregistrée
quand un refus de séance s'efface. Un refus se pose là où le geste a eu
lieu, son remède en commande exécutable. La fenêtre à confirmer ne s'ouvre
que pour un geste qui détruit des données, et reste occupée — aucune touche
ne la ferme — jusqu'à la fin de l'action confirmée.
Vérifié : 2152 node et 163 navigateur.
Assisted-by: Claude Opus 5.5
2026-10-07 07:21:20 -04:00
|
|
|
//
|
|
|
|
|
// communs.commande.* nomme les commandes de mode et de secours, que la place
|
|
|
|
|
// fixe de l'événement et les écrans de la liste reprennent. communs.remede.*
|
|
|
|
|
// nomme le remède d'un refus : communs.remede.<commande> pour chaque commande
|
|
|
|
|
// du registre (src/application/commandes.js), communs.remede.<geste> pour un
|
|
|
|
|
// geste du contrat, suivi de .<variante> quand ses arguments changent son
|
|
|
|
|
// libellé (primitives/commande.js, libelleRemede). Un remède qui fait ce que
|
|
|
|
|
// fait une commande de mode en reprend le texte, par texte.
|
[IMP] screens a11y: table-named controls, focus back after a remedy
Controls repeated under every table (places, goals, rule, remove, the
remedies of their refusals) all read the same to a screen reader, and a
remedy that cleared its own refusal dropped focus on the page body. Each
such control now carries an accessible name with its table, through a
declared prop on Champ and Commande; every refusal is linked to its
control by id, and after a remedy focus returns to that control, nested
refusals and the priority editor included. Visible text is unchanged.
Checked: node 4590, navigateur 954, walkthrough green in verify mode.
--- FR ---
[IMP] écrans, accessibilité : noms par table, focus rendu après remède
Les commandes répétées sous chaque table (places, objectifs, règle,
retrait, remèdes de leurs refus) se lisaient pareil au lecteur d'écran,
et un remède qui retirait son propre refus laissait le focus sur le corps
de la page. Chacune porte désormais un nom accessible qui nomme sa table,
par une prop déclarée de Champ et Commande ; chaque refus est relié à sa
commande par id, et après un remède le focus y revient, refus imbriqués et
éditeur des priorités compris. Le texte visible ne change pas.
Vérifié : node 4590, navigateur 954, parcours vert en vérification.
Assisted-by: Claude Opus 5.5
2026-10-11 19:04:09 -04:00
|
|
|
// communs.nom.remede est le nom accessible d'un remède posé contre un
|
|
|
|
|
// contrôle qui porte un nom distinct (Refus, objet).
|
[ADD] interface: primitives — field, refusal, confirmation, command
Every screen of the plan edits, refuses and confirms the same way, so
these behaviours live once. A field validates on leaving it and shows a
refused value as refused, restoring the stored one when a session refusal
clears. A refusal is shown where the gesture happened, with its remedy as
an executable command. The confirmation window only opens for a gesture
that destroys data, and stays busy — no key closes it — until the
confirmed action ends.
Checked: 2152 node and 163 browser tests.
--- FR ---
[ADD] interface : primitives — champ, refus, confirmation, commande
Chaque écran du plan saisit, refuse et confirme de la même façon : ces
comportements n'existent qu'une fois. Un champ se valide à sa sortie et
montre une valeur refusée comme refusée, rendant la valeur enregistrée
quand un refus de séance s'efface. Un refus se pose là où le geste a eu
lieu, son remède en commande exécutable. La fenêtre à confirmer ne s'ouvre
que pour un geste qui détruit des données, et reste occupée — aucune touche
ne la ferme — jusqu'à la fin de l'action confirmée.
Vérifié : 2152 node et 163 navigateur.
Assisted-by: Claude Opus 5.5
2026-10-07 07:21:20 -04:00
|
|
|
|
|
|
|
|
// Le libellé d'une autre clé de cette table.
|
|
|
|
|
const meme = (cle) => (details, texte) => texte(cle);
|
|
|
|
|
|
|
|
|
|
export const TABLE = new Map([
|
|
|
|
|
// --- Les commandes de mode et de secours (§ 8.4, § 8.5, § 8.6, § 8.8) -----
|
|
|
|
|
['communs.commande.modifier', 'Modifier'],
|
|
|
|
|
['communs.commande.debloquer', 'Débloquer'],
|
|
|
|
|
['communs.commande.confirmerDeblocage', 'Confirmer le déblocage'],
|
|
|
|
|
['communs.commande.lecture', 'Revenir en lecture'],
|
|
|
|
|
['communs.commande.ecrireDocuments', 'Écrire dans les Documents'],
|
|
|
|
|
['communs.commande.choisirDossier', 'Choisir un dossier\u{2026}'],
|
|
|
|
|
['communs.commande.ouvrirPrecedent', 'Ouvrir la version précédente'],
|
|
|
|
|
['communs.commande.ouvrirJournal', 'Ouvrir le dernier instant du journal'],
|
|
|
|
|
|
|
|
|
|
// --- La fenêtre à confirmer (§ 2.1) -------------------------------------------
|
|
|
|
|
['communs.confirmation.confirmer', 'Confirmer'],
|
|
|
|
|
['communs.confirmation.annuler', 'Annuler'],
|
|
|
|
|
['communs.confirmation.enCours', 'Opération en cours\u{2026}'],
|
|
|
|
|
|
[IMP] screens a11y: table-named controls, focus back after a remedy
Controls repeated under every table (places, goals, rule, remove, the
remedies of their refusals) all read the same to a screen reader, and a
remedy that cleared its own refusal dropped focus on the page body. Each
such control now carries an accessible name with its table, through a
declared prop on Champ and Commande; every refusal is linked to its
control by id, and after a remedy focus returns to that control, nested
refusals and the priority editor included. Visible text is unchanged.
Checked: node 4590, navigateur 954, walkthrough green in verify mode.
--- FR ---
[IMP] écrans, accessibilité : noms par table, focus rendu après remède
Les commandes répétées sous chaque table (places, objectifs, règle,
retrait, remèdes de leurs refus) se lisaient pareil au lecteur d'écran,
et un remède qui retirait son propre refus laissait le focus sur le corps
de la page. Chacune porte désormais un nom accessible qui nomme sa table,
par une prop déclarée de Champ et Commande ; chaque refus est relié à sa
commande par id, et après un remède le focus y revient, refus imbriqués et
éditeur des priorités compris. Le texte visible ne change pas.
Vérifié : node 4590, navigateur 954, parcours vert en vérification.
Assisted-by: Claude Opus 5.5
2026-10-11 19:04:09 -04:00
|
|
|
// --- Le nom accessible d'un remède (§ 14.5) ---------------------------------
|
|
|
|
|
// Le remède d'un refus posé contre un contrôle qui porte un nom distinct
|
|
|
|
|
// se nomme par son texte, sous ses détails, puis par ce nom, objet : deux
|
|
|
|
|
// remèdes de même texte, sous deux tables, ne se confondent pas.
|
|
|
|
|
['communs.nom.remede', ({ cle, details = {}, objet }, texte) => `${texte(cle, details)} (${objet})`],
|
|
|
|
|
|
[ADD] interface: primitives — field, refusal, confirmation, command
Every screen of the plan edits, refuses and confirms the same way, so
these behaviours live once. A field validates on leaving it and shows a
refused value as refused, restoring the stored one when a session refusal
clears. A refusal is shown where the gesture happened, with its remedy as
an executable command. The confirmation window only opens for a gesture
that destroys data, and stays busy — no key closes it — until the
confirmed action ends.
Checked: 2152 node and 163 browser tests.
--- FR ---
[ADD] interface : primitives — champ, refus, confirmation, commande
Chaque écran du plan saisit, refuse et confirme de la même façon : ces
comportements n'existent qu'une fois. Un champ se valide à sa sortie et
montre une valeur refusée comme refusée, rendant la valeur enregistrée
quand un refus de séance s'efface. Un refus se pose là où le geste a eu
lieu, son remède en commande exécutable. La fenêtre à confirmer ne s'ouvre
que pour un geste qui détruit des données, et reste occupée — aucune touche
ne la ferme — jusqu'à la fin de l'action confirmée.
Vérifié : 2152 node et 163 navigateur.
Assisted-by: Claude Opus 5.5
2026-10-07 07:21:20 -04:00
|
|
|
// --- Les remèdes des gestes du contrat ------------------------------------
|
|
|
|
|
['communs.remede.modifier', meme('communs.commande.modifier')],
|
|
|
|
|
['communs.remede.debloquer', meme('communs.commande.debloquer')],
|
|
|
|
|
['communs.remede.reprendreVerrou', 'Reprendre le verrou'],
|
|
|
|
|
['communs.remede.afficherTour', ({ tour }) => `Afficher le tour ${tour}`],
|
|
|
|
|
['communs.remede.choisirPlace', 'Choisir une place'],
|
[ADD] badges: prepare, produce and save the sheet from the session
The operator needs the badge sheet as a file next to the event, built
from what the session shows at that moment. The session prepares an
announcement (sheets per paper, counts, namesakes, missing glyphs, draft),
then produces the PDF through a single deferred import of the PDF code and
writes it atomically; under the web build it downloads instead. A gesture
started during production waits its turn. A proposal sheet is always a
draft, and an unwritable file or a missing paper choice gives its refusal
with a remedy.
Checked: red first; 3670 node, 707 browser and 101 long tests green from
the index alone.
--- FR ---
[ADD] badges : préparer, produire et déposer la planche depuis la séance
L'opérateur a besoin de la planche en fichier, à côté de l'événement, tirée
de ce que la séance montre à cet instant. La séance prépare une annonce
(planches par papier, comptes, homonymes, glyphes absents, brouillon), puis
produit le PDF par un seul import différé du code PDF et l'écrit de façon
atomique ; sous web, elle le télécharge. Un geste lancé pendant la
production attend son tour. Une planche tirée d'une proposition est
toujours un brouillon, et un fichier non écrit ou un papier non choisi
donnent leur refus avec un remède.
Vérifié : rouge d'abord ; 3670 node, 707 navigateur et 101 longues vertes
depuis l'index seul.
Assisted-by: Claude Opus 5.5
2026-10-09 17:11:48 -04:00
|
|
|
['communs.remede.enregistrerSous', 'Enregistrer sous\u{2026}'],
|
|
|
|
|
['communs.remede.choisirPapier', 'Choisir le papier'],
|
[ADD] interface: primitives — field, refusal, confirmation, command
Every screen of the plan edits, refuses and confirms the same way, so
these behaviours live once. A field validates on leaving it and shows a
refused value as refused, restoring the stored one when a session refusal
clears. A refusal is shown where the gesture happened, with its remedy as
an executable command. The confirmation window only opens for a gesture
that destroys data, and stays busy — no key closes it — until the
confirmed action ends.
Checked: 2152 node and 163 browser tests.
--- FR ---
[ADD] interface : primitives — champ, refus, confirmation, commande
Chaque écran du plan saisit, refuse et confirme de la même façon : ces
comportements n'existent qu'une fois. Un champ se valide à sa sortie et
montre une valeur refusée comme refusée, rendant la valeur enregistrée
quand un refus de séance s'efface. Un refus se pose là où le geste a eu
lieu, son remède en commande exécutable. La fenêtre à confirmer ne s'ouvre
que pour un geste qui détruit des données, et reste occupée — aucune touche
ne la ferme — jusqu'à la fin de l'action confirmée.
Vérifié : 2152 node et 163 navigateur.
Assisted-by: Claude Opus 5.5
2026-10-07 07:21:20 -04:00
|
|
|
['communs.remede.ouvrirSecours.precedent', meme('communs.commande.ouvrirPrecedent')],
|
|
|
|
|
['communs.remede.ouvrirSecours.journal', meme('communs.commande.ouvrirJournal')],
|
|
|
|
|
['communs.remede.ecrireAilleurs.documents', meme('communs.commande.ecrireDocuments')],
|
|
|
|
|
['communs.remede.ecrireAilleurs.choisi', meme('communs.commande.choisirDossier')],
|
|
|
|
|
['communs.remede.ouvrirSection.import', "Ouvrir l'import"],
|
|
|
|
|
['communs.remede.ouvrirSection.participants', 'Ouvrir les participants'],
|
|
|
|
|
['communs.remede.ouvrirSection.tables', 'Ouvrir les tables'],
|
|
|
|
|
['communs.remede.ouvrirSection.plan', 'Ouvrir le plan'],
|
|
|
|
|
['communs.remede.ouvrirSection.diagnostic', 'Ouvrir le diagnostic'],
|
|
|
|
|
['communs.remede.ouvrirSection.generation', 'Ouvrir la génération'],
|
|
|
|
|
['communs.remede.ouvrirSection.propositions', 'Ouvrir les propositions'],
|
|
|
|
|
|
|
|
|
|
// --- Les remèdes de commande : un par commande du registre ------------------
|
|
|
|
|
// debloquer, commande et geste, porte la clé des gestes, plus haut.
|
|
|
|
|
['communs.remede.ajouterParticipant', 'Ajouter la personne'],
|
|
|
|
|
['communs.remede.modifierParticipant', 'Modifier la personne'],
|
|
|
|
|
['communs.remede.exclureParticipant', 'Exclure la personne'],
|
|
|
|
|
['communs.remede.reintegrerParticipant', 'Réintégrer la personne'],
|
|
|
|
|
['communs.remede.supprimerParticipant', 'Supprimer la personne'],
|
|
|
|
|
['communs.remede.importerParticipants', 'Importer la liste'],
|
[ADD] priorities: search and ranking follow tiers, goals CSV, commands
The operator's priority order now drives both the search and the
ranking: each tier compiles into one score component, weights sum inside
a shared tier, and the three goal modes compare their own values. With
no stored order, no goals and the facilitator case off, plans and
rankings equal the reference fingerprints under every mode; incremental
and complete scores agree on 1 500 random configurations; a move costs
1 to 2 % more. Table goals import and export through their own CSV, and
commands set or restore the order and choose the goal mode.
Checked: node 4501, navigateur 885, node-long 124.
--- FR ---
[ADD] priorités : recherche et classement par paliers, CSV, commandes
L'ordre des priorités de l'opérateur mène désormais la recherche et le
classement : chaque palier devient une composante du score, les poids
s'additionnent dans un palier partagé, et les trois modes des objectifs
comparent leurs propres valeurs. Sans ordre écrit, sans objectif et sans
case des animateurs, plans et classements égalent les empreintes sous
chaque mode ; score incrémental et complet concordent sur 1 500
configurations tirées ; un mouvement coûte 1 à 2 % de plus. Les objectifs
des tables s'importent et s'exportent par leur CSV ; des commandes posent
ou rétablissent l'ordre et choisissent le mode des objectifs.
Vérifié : node 4501, navigateur 885, node-long 124.
Assisted-by: Claude Opus 5.5
2026-10-11 16:19:38 -04:00
|
|
|
['communs.remede.importerObjectifs', 'Importer les objectifs'],
|
[ADD] interface: primitives — field, refusal, confirmation, command
Every screen of the plan edits, refuses and confirms the same way, so
these behaviours live once. A field validates on leaving it and shows a
refused value as refused, restoring the stored one when a session refusal
clears. A refusal is shown where the gesture happened, with its remedy as
an executable command. The confirmation window only opens for a gesture
that destroys data, and stays busy — no key closes it — until the
confirmed action ends.
Checked: 2152 node and 163 browser tests.
--- FR ---
[ADD] interface : primitives — champ, refus, confirmation, commande
Chaque écran du plan saisit, refuse et confirme de la même façon : ces
comportements n'existent qu'une fois. Un champ se valide à sa sortie et
montre une valeur refusée comme refusée, rendant la valeur enregistrée
quand un refus de séance s'efface. Un refus se pose là où le geste a eu
lieu, son remède en commande exécutable. La fenêtre à confirmer ne s'ouvre
que pour un geste qui détruit des données, et reste occupée — aucune touche
ne la ferme — jusqu'à la fin de l'action confirmée.
Vérifié : 2152 node et 163 navigateur.
Assisted-by: Claude Opus 5.5
2026-10-07 07:21:20 -04:00
|
|
|
['communs.remede.changerEtat', "Changer l'état du plan"],
|
|
|
|
|
['communs.remede.enregistrerGeneration', 'Enregistrer la génération'],
|
|
|
|
|
['communs.remede.retenirProposition', 'Retenir la proposition'],
|
|
|
|
|
['communs.remede.effacerPropositions', 'Effacer les propositions'],
|
|
|
|
|
['communs.remede.creerTable', 'Créer une table'],
|
|
|
|
|
['communs.remede.supprimerTable', 'Supprimer la table'],
|
|
|
|
|
['communs.remede.deplacerTable', 'Déplacer la table'],
|
|
|
|
|
// sieges : le nombre de places que le remède donne à la table, quand il le
|
|
|
|
|
// fixe (SURRESERVATION, § 5.9).
|
|
|
|
|
[
|
|
|
|
|
'communs.remede.changerPlacesTable',
|
|
|
|
|
({ sieges }) => (Number.isInteger(sieges) ? `Passer la table à ${sieges} places` : 'Changer le nombre de places'),
|
|
|
|
|
],
|
|
|
|
|
['communs.remede.realignerTable', 'Réaligner la table'],
|
|
|
|
|
['communs.remede.changerDefaut', 'Changer le nombre de places par défaut'],
|
|
|
|
|
['communs.remede.changerTours', 'Changer le nombre de tours'],
|
|
|
|
|
['communs.remede.modifierReglage', 'Modifier le réglage'],
|
[ADD] home: retained plan's collisions and redundancy gap per event
The event list showed no outcome, so comparing events meant opening each.
Each line now shows, for the retained plan only, the cumulated collisions
(pair and tour) and the redundancy gap |target - sum of r(p)|, with an
explanation tooltip; an event without a measurable retained plan shows a
dash. The target is set per event in Propositions, 1000 by default: an
optional settings field, absent in every existing file and read as 1000,
written through one undoable command refused in reading mode. Listing
stays read-only. Checked: 2909 node, 604 browser, 62 long tests.
--- FR ---
[ADD] accueil : collisions et Diff de redondance du retenu par événement
La liste des événements ne montrait aucun résultat : comparer obligeait à
ouvrir chacun. Chaque ligne montre, pour le retenu seul, les collisions
cumulées (paire et tour) et la Diff somme d'appartenance, |cible - somme
de r(p)|, avec une infobulle ; sans retenu mesurable, un tiret. La cible
se règle par événement dans Propositions, 1000 par défaut : champ
facultatif des réglages, absent de tout fichier existant et lu 1000, écrit
par une commande qui se défait et se refuse en lecture. La liste reste en
lecture seule. Vérifié : 2909 node, 604 navigateur, 62 longues.
Assisted-by: Claude Opus 5.5
2026-10-08 05:35:48 -04:00
|
|
|
['communs.remede.changerCibleRedondance', 'Changer la cible de la somme de redondance'],
|
[ADD] tags and goals: engine measures, CSV column, commands, bridge
Tags on people and goals on tables now reach every layer below the
screens. The engine measures rounds served, never-served people and
facilitators met, with a floor per goal mode at the diagnostic; the CSV
reads and writes an etiquettes column through the shared split and
spelling reconciliation; commands set tags, goals, their rule and the
two optional criteria, each refusal with cause and remedy; facilitators
and the stored priority order reach the engine through one bridge.
Without goals or the facilitator case, plans equal the reference prints.
Checked: node 4373, navigateur 885, node-long 113.
--- FR ---
[ADD] étiquettes et objectifs : mesures, colonne CSV, commandes, pont
Les étiquettes des personnes et les objectifs des tables atteignent toutes
les couches sous les écrans. Le moteur mesure les tours servis, les
personnes jamais servies et les animateurs rencontrés, avec un plancher
par mode au diagnostic ; le CSV lit et écrit une colonne d'étiquettes par
la découpe et la réconciliation communes ; des commandes posent étiquettes,
objectifs, règle et les deux critères facultatifs, chaque refus avec cause
et remède ; animateurs et ordre écrit passent au moteur par un seul pont.
Sans objectif ni case des animateurs, les plans égalent les empreintes.
Vérifié : node 4373, navigateur 885, node-long 113.
Assisted-by: Claude Opus 5.5
2026-10-11 15:03:13 -04:00
|
|
|
['communs.remede.changerEtiquettes', 'Changer les étiquettes'],
|
|
|
|
|
['communs.remede.poserObjectif', "Poser l'objectif"],
|
|
|
|
|
['communs.remede.retirerObjectif', "Retirer l'objectif"],
|
|
|
|
|
['communs.remede.changerRegleObjectifs', 'Changer la règle par défaut des objectifs'],
|
[ADD] priorities: search and ranking follow tiers, goals CSV, commands
The operator's priority order now drives both the search and the
ranking: each tier compiles into one score component, weights sum inside
a shared tier, and the three goal modes compare their own values. With
no stored order, no goals and the facilitator case off, plans and
rankings equal the reference fingerprints under every mode; incremental
and complete scores agree on 1 500 random configurations; a move costs
1 to 2 % more. Table goals import and export through their own CSV, and
commands set or restore the order and choose the goal mode.
Checked: node 4501, navigateur 885, node-long 124.
--- FR ---
[ADD] priorités : recherche et classement par paliers, CSV, commandes
L'ordre des priorités de l'opérateur mène désormais la recherche et le
classement : chaque palier devient une composante du score, les poids
s'additionnent dans un palier partagé, et les trois modes des objectifs
comparent leurs propres valeurs. Sans ordre écrit, sans objectif et sans
case des animateurs, plans et classements égalent les empreintes sous
chaque mode ; score incrémental et complet concordent sur 1 500
configurations tirées ; un mouvement coûte 1 à 2 % de plus. Les objectifs
des tables s'importent et s'exportent par leur CSV ; des commandes posent
ou rétablissent l'ordre et choisissent le mode des objectifs.
Vérifié : node 4501, navigateur 885, node-long 124.
Assisted-by: Claude Opus 5.5
2026-10-11 16:19:38 -04:00
|
|
|
['communs.remede.changerPriorites', "Changer l'ordre des priorités"],
|
|
|
|
|
['communs.remede.retablirPriorites', "Rétablir l'ordre par défaut"],
|
[ADD] interface: primitives — field, refusal, confirmation, command
Every screen of the plan edits, refuses and confirms the same way, so
these behaviours live once. A field validates on leaving it and shows a
refused value as refused, restoring the stored one when a session refusal
clears. A refusal is shown where the gesture happened, with its remedy as
an executable command. The confirmation window only opens for a gesture
that destroys data, and stays busy — no key closes it — until the
confirmed action ends.
Checked: 2152 node and 163 browser tests.
--- FR ---
[ADD] interface : primitives — champ, refus, confirmation, commande
Chaque écran du plan saisit, refuse et confirme de la même façon : ces
comportements n'existent qu'une fois. Un champ se valide à sa sortie et
montre une valeur refusée comme refusée, rendant la valeur enregistrée
quand un refus de séance s'efface. Un refus se pose là où le geste a eu
lieu, son remède en commande exécutable. La fenêtre à confirmer ne s'ouvre
que pour un geste qui détruit des données, et reste occupée — aucune touche
ne la ferme — jusqu'à la fin de l'action confirmée.
Vérifié : 2152 node et 163 navigateur.
Assisted-by: Claude Opus 5.5
2026-10-07 07:21:20 -04:00
|
|
|
['communs.remede.reserver', 'Réserver la place'],
|
|
|
|
|
['communs.remede.retirerReservation', 'Retirer la réservation'],
|
|
|
|
|
['communs.remede.deplacerReservation', 'Déplacer la réservation'],
|
|
|
|
|
['communs.remede.poserTitre', 'Poser le titre'],
|
|
|
|
|
['communs.remede.retirerTitre', 'Retirer le titre'],
|
|
|
|
|
['communs.remede.designer', 'Désigner la personne'],
|
|
|
|
|
['communs.remede.convertirEnTous', 'Réserver pour tous les tours'],
|
|
|
|
|
['communs.remede.deplacerDansRetenu', 'Déplacer dans le placement retenu'],
|
|
|
|
|
['communs.remede.echangerDansRetenu', 'Échanger les deux places'],
|
|
|
|
|
['communs.remede.retirerDuTour', 'Retirer du tour'],
|
|
|
|
|
]);
|