gestion_table_tournante_libre/src/interface/libelles/communs.js
Mathieu Benoit 59f847a3fe [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

105 lines
6.3 KiB
JavaScript

// © 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. ».
//
// 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.
// communs.nom.remede est le nom accessible d'un remède posé contre un
// contrôle qui porte un nom distinct (Refus, objet).
// 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}'],
// --- 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})`],
// --- 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.enregistrerSous', 'Enregistrer sous\u{2026}'],
['communs.remede.choisirPapier', 'Choisir le papier'],
['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.importerObjectifs', 'Importer les objectifs'],
['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.changerCibleRedondance', 'Changer la cible de la somme de redondance'],
['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'],
['communs.remede.changerPriorites', "Changer l'ordre des priorités"],
['communs.remede.retablirPriorites', "Rétablir l'ordre par défaut"],
['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'],
]);