[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)
|
|
|
|
|
|
[IMP] event screen: header card, state steps, mode band, phase tabs
The event screen showed its states and sections as flat button rows. A
header card now carries the name, the counts and the fixed « Modifier »
place; the four plan states read as steps; sections group into
Préparer, Placer and Produire. A band under the app header states the
mode edge to edge and names the command that leaves it; the mode frame
stays around the work surface. A warning's action is no longer clipped.
Checked: evenement node and browser tests, 7 mutations caught.
--- FR ---
[IMP] écran d'événement : carte d'en-tête, étapes, bande de mode, phases
L'écran montrait ses états et ses sections en rangées de boutons plates.
Une carte d'en-tête porte le nom, les comptes et la place fixe de
« Modifier » ; les quatre états du plan se lisent en étapes ; les
sections se groupent en Préparer, Placer et Produire. Une bande sous le
bandeau dit le mode de bord à bord et nomme la commande qui en sort ; le
cadre de mode reste autour de la surface. L'action d'un avertissement
n'est plus rognée. Vérifié : node et navigateur, 7 mutations prises.
Assisted-by: Claude Opus 5.5
2026-10-11 00:58:07 -04:00
|
|
|
// Les libellés de l'événement ouvert : son en-tête et son résumé chiffré,
|
[IMP] interface: full-width event screen, no mode frame, fewer columns
The 6 px mode frame around the event screen read as a dashed box that
narrowed the work surface, and the screen stopped at the 87rem page
width. The event screen now spans the window; the mode band under the
app header, the header label and the pill beside « Modifier » carry the
mode. The event list drops both « Collisions cumulées » columns, which
repeated a measure the proposals screen already shows: 7 columns, not 9.
Checked: node 4009, browser 872, long 105; full width at 1366 and 1920.
--- FR ---
[IMP] interface : événement pleine fenêtre, sans cadre, liste allégée
Le cadre de mode de 6 px autour de l'écran d'événement se lisait comme
un encadré pointillé qui rétrécissait la surface, et l'écran s'arrêtait
à 87rem. L'écran de l'événement occupe la fenêtre ; la bande sous le
bandeau, le libellé du bandeau et la pastille près de « Modifier »
portent le mode. La liste des événements perd ses deux colonnes
« Collisions cumulées », déjà montrées par les propositions : 7
colonnes au lieu de 9. Vérifié : node 4009, navigateur 872, long 105 ;
pleine largeur à 1366 et 1920.
Assisted-by: Claude Opus 5.5
2026-10-11 02:44:40 -04:00
|
|
|
// ses états, la bande de mode et la place fixe de sa barre, les phases de
|
[IMP] event screen: header card, state steps, mode band, phase tabs
The event screen showed its states and sections as flat button rows. A
header card now carries the name, the counts and the fixed « Modifier »
place; the four plan states read as steps; sections group into
Préparer, Placer and Produire. A band under the app header states the
mode edge to edge and names the command that leaves it; the mode frame
stays around the work surface. A warning's action is no longer clipped.
Checked: evenement node and browser tests, 7 mutations caught.
--- FR ---
[IMP] écran d'événement : carte d'en-tête, étapes, bande de mode, phases
L'écran montrait ses états et ses sections en rangées de boutons plates.
Une carte d'en-tête porte le nom, les comptes et la place fixe de
« Modifier » ; les quatre états du plan se lisent en étapes ; les
sections se groupent en Préparer, Placer et Produire. Une bande sous le
bandeau dit le mode de bord à bord et nomme la commande qui en sort ; le
cadre de mode reste autour de la surface. L'action d'un avertissement
n'est plus rognée. Vérifié : node et navigateur, 7 mutations prises.
Assisted-by: Claude Opus 5.5
2026-10-11 00:58:07 -04:00
|
|
|
// sa navigation, la reprise d'un verrou, ses avertissements, le support
|
|
|
|
|
// rompu (§ 8.3 à § 8.9, § 9, § 14.6). Chaque clé commence par
|
|
|
|
|
// « evenement. ». Une donnée qui désigne — un numéro, une séance, un
|
|
|
|
|
// instant, une date — n'entre dans aucun de ces textes : l'écran la pose
|
|
|
|
|
// dans son propre nœud, à côté. Les comptes du résumé, eux, entrent dans le
|
|
|
|
|
// leur, qui s'accorde au nombre et l'écrit par creerFormat.
|
|
|
|
|
import { creerFormat } from '../../application/format.js';
|
|
|
|
|
import { cite } from '../../application/libelles/aides.js';
|
|
|
|
|
|
|
|
|
|
// Un compte en chiffres, par le format de la traduction, suivi de son nom au
|
|
|
|
|
// singulier jusqu'à un, au pluriel au-delà.
|
|
|
|
|
const compteEcrit = (n, singulier, pluriel, texte) => `${creerFormat(texte).nombre(n)} ${n <= 1 ? singulier : pluriel}`;
|
|
|
|
|
|
[ADD] interface: event list, open event, participants, import, plan
The working screens of an evening. The home screen lists the events of
the working folder, asks its question, loads demos, copies, renames,
imports and deletes, and shows what the trash holds. An open event frames
its mode, offers Modifier, Débloquer and a confirmed lock takeover, and
shows its warnings. Participants get a grid, a form and a file; an import
goes through a preview and a report; tables, the default and tours have
their screens; the plan draws tables, chairs, empty seats and names.
Checked: 2342 node, 356 browser, 60 node-long; the Electron start check.
--- FR ---
[ADD] interface : liste, événement, participants, import, tables, plan
Les écrans de travail d'une soirée. L'accueil liste les événements du
dossier de travail, pose sa question, charge les démonstrations, copie,
renomme, importe et supprime, et montre ce que tient la corbeille. Un
événement ouvert encadre son mode, offre Modifier, Débloquer et une
reprise de verrou confirmée, et montre ses avertissements. Les
participants ont une grille, un formulaire et une fiche ; un import passe
par un aperçu et un rapport ; tables, défaut et tours ont leurs écrans ;
le plan dessine tables, chaises, sièges vides et noms.
Vérifié : 2342 node, 356 navigateur, 60 node-long ; démarrage d'Electron.
Assisted-by: Claude Opus 5.5
2026-10-07 08:12:27 -04:00
|
|
|
export const TABLE = new Map([
|
|
|
|
|
// --- L'en-tête et les états du plan (§ 9) -----------------------------------
|
|
|
|
|
['evenement.etat.titre', 'État du plan'],
|
|
|
|
|
['evenement.etat.brouillon', 'Brouillon'],
|
|
|
|
|
['evenement.etat.propose', 'Proposé'],
|
|
|
|
|
['evenement.etat.retenu', 'Retenu'],
|
|
|
|
|
['evenement.etat.bloque', 'Bloqué'],
|
|
|
|
|
|
[IMP] event screen: header card, state steps, mode band, phase tabs
The event screen showed its states and sections as flat button rows. A
header card now carries the name, the counts and the fixed « Modifier »
place; the four plan states read as steps; sections group into
Préparer, Placer and Produire. A band under the app header states the
mode edge to edge and names the command that leaves it; the mode frame
stays around the work surface. A warning's action is no longer clipped.
Checked: evenement node and browser tests, 7 mutations caught.
--- FR ---
[IMP] écran d'événement : carte d'en-tête, étapes, bande de mode, phases
L'écran montrait ses états et ses sections en rangées de boutons plates.
Une carte d'en-tête porte le nom, les comptes et la place fixe de
« Modifier » ; les quatre états du plan se lisent en étapes ; les
sections se groupent en Préparer, Placer et Produire. Une bande sous le
bandeau dit le mode de bord à bord et nomme la commande qui en sort ; le
cadre de mode reste autour de la surface. L'action d'un avertissement
n'est plus rognée. Vérifié : node et navigateur, 7 mutations prises.
Assisted-by: Claude Opus 5.5
2026-10-11 00:58:07 -04:00
|
|
|
// --- Le résumé chiffré de l'en-tête ------------------------------------------
|
|
|
|
|
['evenement.resume.participants', ({ participants }, texte) => compteEcrit(participants, 'participant', 'participants', texte)],
|
|
|
|
|
[
|
|
|
|
|
'evenement.resume.tables',
|
|
|
|
|
({ tables, sieges }, texte) =>
|
|
|
|
|
`${compteEcrit(tables, 'table', 'tables', texte)} \u{00B7} ${compteEcrit(sieges, 'siège', 'sièges', texte)}`,
|
|
|
|
|
],
|
|
|
|
|
['evenement.resume.tours', ({ tours }, texte) => compteEcrit(tours, 'tour', 'tours', texte)],
|
|
|
|
|
|
|
|
|
|
// --- La bande de mode, sous le bandeau (§ 8.4, § 8.5) ------------------------
|
|
|
|
|
// Chaque phrase cite la commande qui sort du mode par son propre libellé,
|
|
|
|
|
// sauf lectureSeule : devant un format plus récent, la place fixe n'offre
|
|
|
|
|
// aucune commande (§ 8.8), et la phrase n'en nomme aucune.
|
|
|
|
|
['evenement.bande.lecture', (_, texte) => `Rien ne change ; ${cite(texte('communs.commande.modifier'))} passe en écriture.`],
|
|
|
|
|
[
|
|
|
|
|
'evenement.bande.ecriture',
|
|
|
|
|
(_, texte) => `Chaque geste s\u{2019}enregistre aussitôt ; ${cite(texte('communs.commande.lecture'))} arrête l\u{2019}écriture.`,
|
|
|
|
|
],
|
|
|
|
|
[
|
|
|
|
|
'evenement.bande.bloque',
|
|
|
|
|
(_, texte) => `Rien ne change tant que le plan est bloqué ; ${cite(texte('communs.commande.debloquer'))} le rouvre.`,
|
|
|
|
|
],
|
|
|
|
|
['evenement.bande.lectureSeule', 'Rien ne change ; ce fichier ne s\u{2019}ouvre qu\u{2019}en lecture.'],
|
|
|
|
|
|
|
|
|
|
// --- Les phases de la navigation des sections ---------------------------------
|
|
|
|
|
['evenement.phase.preparer', 'Préparer'],
|
|
|
|
|
['evenement.phase.placer', 'Placer'],
|
|
|
|
|
['evenement.phase.produire', 'Produire'],
|
|
|
|
|
|
[IMP] interface: full-width event screen, no mode frame, fewer columns
The 6 px mode frame around the event screen read as a dashed box that
narrowed the work surface, and the screen stopped at the 87rem page
width. The event screen now spans the window; the mode band under the
app header, the header label and the pill beside « Modifier » carry the
mode. The event list drops both « Collisions cumulées » columns, which
repeated a measure the proposals screen already shows: 7 columns, not 9.
Checked: node 4009, browser 872, long 105; full width at 1366 and 1920.
--- FR ---
[IMP] interface : événement pleine fenêtre, sans cadre, liste allégée
Le cadre de mode de 6 px autour de l'écran d'événement se lisait comme
un encadré pointillé qui rétrécissait la surface, et l'écran s'arrêtait
à 87rem. L'écran de l'événement occupe la fenêtre ; la bande sous le
bandeau, le libellé du bandeau et la pastille près de « Modifier »
portent le mode. La liste des événements perd ses deux colonnes
« Collisions cumulées », déjà montrées par les propositions : 7
colonnes au lieu de 9. Vérifié : node 4009, navigateur 872, long 105 ;
pleine largeur à 1366 et 1920.
Assisted-by: Claude Opus 5.5
2026-10-11 02:44:40 -04:00
|
|
|
// --- La barre de l'événement et sa place fixe (§ 8.3, § 8.4, § 8.5) ------
|
[REF] event screen: no frame names, list summaries trimmed to use
The event list shows only the retained plan's redundancy gap and the id
of the best proposal, yet its summaries still carried cumulative
collisions and redundancy totals. They now carry what the list reads.
The mode frame is gone from the screen, so its names go too: the mode
surface component, the mode colour tokens and the bar's mode label are
named for what they are. Values, pixels and captures are unchanged.
Checked: node 4039, navigateur 884 with the walkthrough, node-long 105.
--- FR ---
[REF] écran d'événement : sans noms de cadre, résumés de liste réduits
La liste des événements ne montre que l'écart de redondance du retenu et
l'identifiant de la meilleure proposition, mais ses résumés portaient
encore les collisions cumulées et les totaux de redondance. Ils portent
désormais ce que la liste lit. Le cadre de mode a quitté l'écran, ses noms
aussi : le composant de surface, les jetons de couleur du mode et le
libellé de mode de la barre portent le nom de ce qu'ils sont. Valeurs,
pixels et captures inchangés.
Vérifié : node 4039, navigateur 884 avec le parcours, node-long 105.
Assisted-by: Claude Opus 5.5
2026-10-11 06:56:17 -04:00
|
|
|
['evenement.barre.commandes', 'Commandes de l\u{2019}événement'],
|
[ADD] interface: event list, open event, participants, import, plan
The working screens of an evening. The home screen lists the events of
the working folder, asks its question, loads demos, copies, renames,
imports and deletes, and shows what the trash holds. An open event frames
its mode, offers Modifier, Débloquer and a confirmed lock takeover, and
shows its warnings. Participants get a grid, a form and a file; an import
goes through a preview and a report; tables, the default and tours have
their screens; the plan draws tables, chairs, empty seats and names.
Checked: 2342 node, 356 browser, 60 node-long; the Electron start check.
--- FR ---
[ADD] interface : liste, événement, participants, import, tables, plan
Les écrans de travail d'une soirée. L'accueil liste les événements du
dossier de travail, pose sa question, charge les démonstrations, copie,
renomme, importe et supprime, et montre ce que tient la corbeille. Un
événement ouvert encadre son mode, offre Modifier, Débloquer et une
reprise de verrou confirmée, et montre ses avertissements. Les
participants ont une grille, un formulaire et une fiche ; un import passe
par un aperçu et un rapport ; tables, défaut et tours ont leurs écrans ;
le plan dessine tables, chaises, sièges vides et noms.
Vérifié : 2342 node, 356 navigateur, 60 node-long ; démarrage d'Electron.
Assisted-by: Claude Opus 5.5
2026-10-07 08:12:27 -04:00
|
|
|
['evenement.commande.defaire', 'Défaire'],
|
|
|
|
|
['evenement.commande.refaire', 'Refaire'],
|
|
|
|
|
|
|
|
|
|
// --- La reprise d'un verrou dont la vie ne se prouve pas (§ 8.8) ----------
|
|
|
|
|
['evenement.verrou.titre', 'Le verrou qui tient cet événement'],
|
|
|
|
|
['evenement.verrou.seance', 'Séance'],
|
|
|
|
|
['evenement.verrou.depuis', 'Pris le'],
|
|
|
|
|
['evenement.verrou.inconnu', 'illisible'],
|
|
|
|
|
[
|
|
|
|
|
'evenement.verrou.avis',
|
|
|
|
|
"Reprendre ce verrou n'est sûr que si cette séance est arrêtée : deux séances qui écrivent le même événement se contrediraient.",
|
|
|
|
|
],
|
|
|
|
|
['evenement.verrou.confirmerReprise', 'Confirmer la reprise de ce verrou'],
|
|
|
|
|
|
|
|
|
|
// --- Les avertissements (§ 8.6, § 8.9, § 9) -------------------------------
|
|
|
|
|
['evenement.avertissements', 'Avertissements'],
|
|
|
|
|
['evenement.fautive.numero', 'Proposition n°'],
|
|
|
|
|
['evenement.fautive.rang', 'Proposition illisible, au rang'],
|
|
|
|
|
['evenement.derive.retenu', 'Placement retenu'],
|
|
|
|
|
['evenement.derive.proposition', 'Proposition n°'],
|
|
|
|
|
|
|
|
|
|
// --- Le support rompu (§ 8.6) ----------------------------------------------
|
|
|
|
|
['evenement.supportRompu.abandonner', 'Fermer sans écrire ailleurs'],
|
|
|
|
|
['evenement.supportRompu.confirmerAbandon', "Confirmer : fermer sans l'écrire ailleurs"],
|
|
|
|
|
]);
|