gestion_table_tournante_libre/test/navigateur/designations.js
Mathieu Benoit e71879e852 [ADD] badges: event section to prepare, produce and reissue the sheet
The Badges section follows Propositions. It offers the retained plan by
default, or the proposal chosen in Propositions, which always prints as
BROUILLON; the announcement names the source, the imposition and the
page count before anything is written. The paper question is asked
once per machine, refusals sit beside « Produire » with their remedy,
and a new production clears the previous sheet's path. Section buttons
narrow so eight still fit one line at 1 366 px.
Checked: node 3769, browser 745, node-long 101 from the index alone.

--- FR ---

[ADD] badges : section pour préparer, produire et rééditer la planche

La section Badges suit Propositions. Elle offre le retenu par défaut,
ou la proposition choisie dans Propositions, toujours BROUILLON ;
l'annonce nomme la source, l'imposition et le nombre de pages avant
toute écriture. La question du papier se pose une fois par machine, les
refus se posent à côté de « Produire » avec leur remède, et une
nouvelle production efface le chemin de la précédente. Les boutons de
section s'amincissent : huit tiennent sur une ligne à 1 366 px.
Vérifié : node 3769, navigateur 745, node-long 101 depuis l'index seul.

Assisted-by: Claude Opus 5.5
2026-10-10 11:11:33 -04:00

195 lines
13 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// © 2026 TechnoLibre (http://www.technolibre.ca)
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
// Les désignations stables de l'interface (contrainte 16) : la liste fermée
// des attributs data-… que src/interface pose — gabarit ou script d'un
// composant, code d'un module —, et par lesquels les épreuves atteignent un
// élément sans lire sa classe ni son texte traduit.
// test/sources_interface.test.js la compare au code dans les deux sens : un
// attribut posé hors de la liste se relève, une entrée que rien ne pose
// aussi. Un attribut nouveau entre ici avec le code qui le pose.
//
// Chaque entrée : attribut → { porteur, valeurs }. porteur dit l'élément qui
// le porte ; valeurs vaut null quand la valeur se calcule — un identifiant,
// un code, une clé —, sinon la liste fermée des valeurs littérales que le
// code écrit, '' pour un attribut posé sans valeur. Une liste fermée ne vaut
// que pour un attribut dont chaque pose est littérale ; la garde le vérifie.
// Le module est pur : il se lit sous node comme dans le navigateur.
// [attribut, porteur, valeurs], dans l'ordre des attributs.
const ENTREES = [
['data-affichee', 'import : la valeur affichée d’une cellule de l’aperçu', ['']],
['data-annonce-planche', 'badges : l’annonce de la planche, avant de produire', ['']],
['data-annonces', 'événement : la zone des annonces à côté de la tête', ['']],
['data-apercu', 'import : l’aperçu d’un fichier ou d’un collage', ['']],
['data-attente-demonstration', 'accueil : le message d’une démonstration cliquée pendant un chargement', ['']],
['data-autre', 'accueil : le choix d’un autre dossier de travail', ['']],
['data-autre-chemin', 'accueil : le chemin de l’autre dossier de travail', ['']],
['data-avancement', 'génération : la barre d’avancement', ['']],
['data-avertissement', 'un avertissement, par son code', null],
['data-bandeau', 'le bandeau d’application', ['']],
['data-bandeau-plan', 'plan : le bandeau au-dessus de la surface', ['']],
['data-bloc', 'à propos : le bloc de version à copier', ['']],
['data-cartouche', 'aperçu : le cartouche de repérage d’une page du plan imprimé', ['']],
['data-cellule', 'import : une cellule de l’aperçu, par son champ', null],
['data-champ', 'un champ de saisie ou un sélecteur, par son nom', null],
['data-chargement', 'accueil : le signe d’un calcul en cours', ['']],
['data-chargement-liste', 'accueil : l’annonce du calcul des colonnes de la liste', ['']],
['data-chemin-planche', 'badges : le chemin de la planche produite, ou son nom téléchargé', ['']],
['data-choix-siege', 'plan : un siège offert par le panneau d’une table, par son rang', null],
['data-cible', 'la cible d’une commande : section, groupe, colonne, vue imprimée ou papier', null],
['data-cible-redondance', 'propositions : le champ de la cible de redondance', ['']],
['data-classement', 'propositions : les lignes classées', ['']],
['data-coeurs', 'génération : le réglage des cœurs de calcul', ['']],
['data-coeurs-disponibles', 'génération : la valeur automatique des cœurs', ['']],
['data-collage', 'import : l’origine collage de l’aperçu', ['']],
['data-colonne', 'une colonne d’un tableau, par son nom', null],
['data-colonnes', 'import : l’association des colonnes', ['']],
['data-contenu', 'aperçu : la zone de contenu d’une feuille imprimée', ['']],
['data-commande', 'un bouton de commande, par son nom', null],
['data-compte', 'import : un compte du rapport, par son nom', null],
['data-conflit', 'participants : une ligne de conflit d’un groupe', ['']],
['data-conflit-personne', 'participants : les règles d’une personne en conflit', ['']],
['data-conflits', 'participants : les conflits d’un groupe, par sa clé', null],
['data-conversion', 'plan : une conversion offerte par une liste de travail', null],
['data-corbeille', 'accueil : la corbeille', ['']],
['data-corbeille-dossier', 'accueil : un dossier de la corbeille', null],
['data-critere', 'propositions : un nom de critère de la phrase de l’ordre', null],
['data-defaut', 'tables : le réglage du défaut de places', ['']],
['data-demonstration', 'accueil : une démonstration, par sa clé', null],
['data-derive', 'événement : un placement en dérive, par son identifiant', null],
['data-devient', 'import : ce que devient une ligne', ['']],
['data-donnee', 'diagnostic : une donnée nommée dans une phrase', ['']],
['data-dossier', 'accueil : le dossier de travail montré', ['']],
['data-dossier-travail', 'accueil : le bloc du dossier de travail', ['']],
['data-doublon', 'un doublon : base de la liste, ou ligne de l’aperçu', null],
['data-doublons', 'import : les doublons de l’aperçu', ['']],
['data-duree', 'génération : la durée estimée', ['']],
['data-ecran', 'un écran de l’application', ['accueil', 'apercu', 'apropos', 'evenement', 'recuperation']],
['data-encodage', 'import : l’encodage nommé', ['']],
['data-enonce', 'un énoncé : diagnostic, ou défaut des tables', null],
['data-enregistre', 'import : le chemin des refus enregistrés', ['']],
['data-entete', 'import : la ligne d’en-tête lue', ['']],
['data-entete-liste', 'aperçu : l’en-tête d’une liste imprimée — titre et têtes de colonnes —, répété sur chaque feuille', ['']],
['data-estimation', 'génération : l’estimation de la durée', ['']],
['data-etat', 'événement : un état du plan dans la tête', null],
['data-etat-table', 'tables : l’état d’une table', ['']],
['data-evenement', 'accueil : une ligne de la liste, par sa base', null],
['data-evidence', 'plan : la personne mise en évidence', null],
['data-fantome', 'plan : le fantôme d’une personne glissée', ['']],
['data-fautive', 'événement : une proposition fautive', null],
['data-feuille', 'aperçu : une feuille du document imprimé, une page, par son rang', null],
['data-fiche', 'participants : la fiche d’une personne', null],
['data-filigrane', 'aperçu : le filigrane BROUILLON d’une feuille', ['']],
['data-fichier', 'import : le fichier lu', ['']],
['data-focus-initial', 'plan : le siège qui reçoit le focus à l’ouverture du panneau', null],
['data-fusion', 'import : un groupe d’orthographes fondu', ['']],
['data-fusions', 'import : les groupes d’orthographes', ['']],
['data-groupe', 'participants : l’en-tête d’un groupe, par sa clé', null],
['data-groupe-compte', 'participants : le compte d’un groupe', ['']],
['data-groupe-conflits', 'participants : la marque de conflit d’un groupe', ['']],
['data-groupe-etat', 'participants : l’état replié ou déplié d’un groupe', ['']],
['data-groupe-libelle', 'participants : le libellé d’un groupe', ['']],
['data-groupe-ligne', 'participants : le groupe qui compte une ligne', null],
['data-historique', 'événement : la commande de l’historique', ['']],
['data-homonyme', 'import : une ligne homonyme', null],
['data-impression', 'aperçu : le document imprimé', ['']],
['data-hors-classement', 'propositions : les lignes hors classement', ['']],
['data-issue', 'génération : l’issue de la dernière génération', ['']],
['data-legende', 'plan : la légende des conflits', ['']],
['data-legende-pastille', 'plan : la pastille de la légende', ['']],
['data-legende-regle', 'plan : une entrée de la légende, par sa règle', null],
['data-ligne', 'import : une ligne de l’aperçu, par son rang', null],
['data-ligne-imprimee', 'aperçu : une ligne d’une liste imprimée, par son rang dans la liste', null],
['data-lignes', 'import : le tableau des lignes', ['']],
['data-liste', 'plan : la liste de noms d’une table', null],
['data-liste-imprimee', 'aperçu : une liste imprimée — l’accueil, ou une table —, par son rang dans le document', null],
['data-liste-travail', 'plan : une liste de travail', ['pressentis', 'titres']],
['data-marque', 'une marque porteuse d’information, par son nom au registre', null],
['data-meilleure', 'la meilleure proposition : accueil ou génération', ['']],
['data-meilleure-collisions', 'les collisions de la meilleure proposition', ['']],
['data-meilleure-id', 'l’identifiant de la meilleure proposition', ['']],
['data-meilleure-libelle-id', 'génération : le libellé de l’identifiant de la meilleure', ['']],
['data-meilleure-vide', 'génération : la meilleure absente', ['']],
['data-mention', 'aperçu : une mention d’une page du plan imprimé — disposition relative, listes hors d’échelle', ['listes', 'relative']],
['data-menu', 'plan : le menu d’une personne', null],
['data-mode', 'événement : le cadre de mode, par sa forme', null],
['data-mode-libelle', 'le libellé de mode', ['bandeau', 'cadre']],
['data-motif', 'import : le motif d’une ligne refusée', ['']],
['data-multiligne', 'import : une ligne sur plusieurs lignes de texte', null],
['data-niveau', 'participants : le niveau d’un groupe ou d’un sélecteur', null],
['data-nom-imprime', 'aperçu : le nom entier d’une personne sur une liste imprimée', ['']],
['data-nombre', 'import : un nombre affiché', ['']],
['data-ordre', 'propositions : la phrase de l’ordre', ['']],
['data-orthographe', 'import : une orthographe d’un groupe', ['']],
['data-panneau', 'plan : un panneau', ['place', 'table']],
['data-panneau-diagnostic', 'plan : le panneau du diagnostic', ['']],
['data-papier', 'le papier de la machine : la question, ou le papier choisi', ['choisi', 'question']],
['data-participant', 'une personne, par son identifiant', null],
['data-partie', 'plan : une partie d’une ligne de liste ou du fantôme', null],
['data-pastille', 'plan : la pastille d’une table', null],
['data-phrase', 'une phrase : diagnostic ou défaut des tables', ['']],
['data-pied', 'aperçu : le pied d’une feuille imprimée', ['']],
['data-place-fixe', 'événement : la place fixe du cadre de mode', ['']],
['data-place-vide', 'aperçu : une place vide de la feuille par table', ['']],
['data-plan', 'plan : le <svg> du plan', ['']],
['data-poignee', 'plan : la poignée d’une table', null],
['data-proposition', 'propositions : une ligne, par son identifiant', null],
['data-question', 'une question posée : dossier de travail ou durée longue', null],
['data-rapport', 'import : le rapport', ['']],
['data-refus', 'un refus, par son code ou sa place', null],
['data-refus-realigner', 'tables : le refus du réalignement', ['']],
['data-refusees', 'import : les lignes refusées', ['']],
['data-reglages', 'génération : les réglages', ['']],
['data-remede', 'diagnostic : un remède', ['']],
['data-reserve', 'plan : la réserve d’un tour', null],
['data-retenu', 'propositions : la ligne du retenu', null],
['data-secours', 'récupération : une source de secours', null],
['data-section', 'une section de l’événement', ['badges', 'diagnostic', 'generation', 'import', 'participants', 'plan', 'propositions', 'tables']],
['data-separateur', 'import : le séparateur nommé', ['']],
['data-siege', 'plan : un siège, par sa table et son numéro', null],
['data-sieges-retires', 'tables : les sièges retirés', ['']],
['data-signalement', 'accueil : un signalement d’une ligne', null],
['data-socle', 'plan : le socle d’une pastille', ['']],
['data-source', 'plan : le placement montré, dans la barre de vue', ['']],
['data-support-rompu', 'événement : le message du support rompu', ['']],
['data-surface', 'plan : la surface du plan', ['']],
['data-table', 'une table, par son identifiant', null],
['data-table-panneau', 'plan : la table d’un panneau', null],
['data-terme', 'un terme expliqué par une infobulle', null],
['data-texte', 'import : le texte d’une ligne', ['']],
['data-theme', '<html> : le thème, clair ou sombre, que pose le script d’App', null],
['data-theme-choix', 'le bandeau : un choix de thème', null],
['data-titre', 'plan : un titre non pourvu d’une liste de travail', null],
['data-tours', 'tables : le réglage du nombre de tours', ['']],
['data-valides', 'import : le compte des lignes valides', ['']],
['data-verrou', 'événement : le verrou d’une autre séance', ['']],
['data-verrou-depuis', 'événement : l’instant du verrou', ['']],
['data-verrou-seance', 'événement : la séance du verrou', ['']],
['data-version', 'accueil : la version affichée', ['']],
['data-vue', 'plan : le groupe de la vue', ['']],
['data-vue-impression', 'aperçu : la vue du document imprimé — plan, accueil ou tables', null],
];
// La Map des entrées, gelée : Object.freeze ne gèle pas le contenu d'une
// Map, et ses modificateurs lèvent ici.
function geler(carte) {
for (const nom of ['set', 'delete', 'clear']) {
Object.defineProperty(carte, nom, {
value: () => {
throw new TypeError(`DESIGNATIONS est gelée : ${nom} refusé`);
},
});
}
return Object.freeze(carte);
}
/** Les désignations stables : attribut → { porteur, valeurs }, gelées. */
export const DESIGNATIONS = geler(
new Map(
ENTREES.map(([attribut, porteur, valeurs]) => [
attribut,
Object.freeze({ porteur, valeurs: valeurs === null ? null : Object.freeze([...valeurs]) }),
]),
),
);