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