[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.
|
|
|
|
|
|
|
|
|
|
// 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}'],
|
|
|
|
|
|
|
|
|
|
// --- 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'],
|
|
|
|
|
['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] 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'],
|
|
|
|
|
]);
|