The window showed only a banner; it now holds the application. App mounts the session, the facade and the generation, settles the working folder and lists its events before it reports ready, re-reading the list once a question is answered or a refused determination succeeds. The banner carries version, mode and the event list command; an open event shows its sections in their first form; the theme follows the system at each start and the operator's choice lasts the session; À propos names the build. Errors are collected for a report, and Electron removes the session's locks at exit. Checked: 2189 node, 193 browser, 60 node-long; the Electron start check. --- FR --- [ADD] interface : coquille — bandeau, sections, thème, À propos La fenêtre ne montrait qu'un bandeau ; elle tient désormais l'application. App monte la séance, la façade et la génération, règle le dossier de travail et liste ses événements avant de se dire prête, et relit la liste une fois une question répondue ou une détermination refusée réussie. Le bandeau porte version, mode et la commande de la liste ; un événement ouvert montre ses sections dans leur première forme ; le thème suit le système à chaque démarrage et le choix de l'opérateur vaut pour la séance ; À propos nomme la construction. Les erreurs se collectent pour un signalement, et Electron efface à la sortie les verrous de la séance. Vérifié : 2189 node, 193 navigateur, 60 node-long ; démarrage d'Electron. Assisted-by: Claude Opus 5.5
45 lines
2 KiB
JavaScript
45 lines
2 KiB
JavaScript
// © 2026 TechnoLibre (http://www.technolibre.ca)
|
|
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
|
|
|
// Ce que le bandeau dit de l'événement ouvert, en clés de la table de la
|
|
// coquille : le libellé de mode (§ 8.4, § 8.5), calculé ici une fois pour le
|
|
// bandeau et pour le cadre de mode, et l'annonce de la version de format du
|
|
// fichier (§ 18.6). Les deux se lisent dans l'état observable de la séance.
|
|
|
|
// La clé de chaque annonce de format de la séance.
|
|
const ANNONCES = new Map([
|
|
['plusRecent', 'coquille.format.plusRecent'],
|
|
['plusAncien', 'coquille.format.plusAncien'],
|
|
]);
|
|
|
|
/**
|
|
* La clé du libellé de mode : null sans événement ; 'coquille.mode.bloque'
|
|
* pour un plan bloqué, que la séance tient en lecture ;
|
|
* 'coquille.mode.lecture' ou 'coquille.mode.ecriture' sinon, le mode de la
|
|
* séance.
|
|
*
|
|
* @param {{mode: 'lecture'|'ecriture', evenement: null|{etat: string}}} etatSeance
|
|
* @returns {null|'coquille.mode.lecture'|'coquille.mode.ecriture'|'coquille.mode.bloque'}
|
|
*/
|
|
export function cleDeMode(etatSeance) {
|
|
if (etatSeance.evenement === null) return null;
|
|
if (etatSeance.evenement.etat === 'bloque') return 'coquille.mode.bloque';
|
|
return etatSeance.mode === 'ecriture' ? 'coquille.mode.ecriture' : 'coquille.mode.lecture';
|
|
}
|
|
|
|
/**
|
|
* La clé de l'annonce de format du bandeau : null sans événement ou quand le
|
|
* fichier est au format courant ; sinon celle de l'annonce de la séance,
|
|
* plus récent ou plus ancien.
|
|
*
|
|
* @param {{evenement: null|{annonceFormat: null|'plusRecent'|'plusAncien'}}} etatSeance
|
|
* @returns {null|'coquille.format.plusRecent'|'coquille.format.plusAncien'}
|
|
* @throws {RangeError} une annonce que la séance ne rend pas
|
|
*/
|
|
export function cleAnnonceFormat(etatSeance) {
|
|
const annonce = etatSeance.evenement?.annonceFormat ?? null;
|
|
if (annonce === null) return null;
|
|
const cle = ANNONCES.get(annonce);
|
|
if (cle === undefined) throw new RangeError(`annonce de format inconnue : ${JSON.stringify(annonce)}`);
|
|
return cle;
|
|
}
|