gestion_table_tournante_libre/src/interface/primitives/geste.js
Mathieu Benoit 876ea0f2ce [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

63 lines
2.1 KiB
JavaScript

// © 2026 TechnoLibre (http://www.technolibre.ca)
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
// Le geste qu'une primitive tient ouvert sur la séance (§ 8.4) : une saisie
// non validée, une fenêtre à confirmer ouverte. Un geste compté par la
// séance suspend son compte d'inactivité, qui ne la ramène pas en lecture
// sous l'opérateur.
//
// Le geste ne se compte qu'en écriture, seul mode où le compte d'inactivité
// court. Le retour en lecture, explicite ou à la fermeture de l'événement,
// remet le compte de la séance à zéro et l'annonce par surAnnulation : le
// geste n'est plus compté, et finirGeste n'est pas appelé pour lui — il
// retirerait le geste d'une autre primitive. Le retour automatique n'a lieu
// que sans geste compté. Le passage en écriture suivant, que subscribe
// publie, recompte le geste que la primitive tient encore.
/**
* Le geste d'une primitive sur une séance.
*
* @param {{subscribe: Function, surAnnulation: Function, debuterGeste: Function, finirGeste: Function}} seance
* @returns {{tenir: (voulu: boolean) => void, liberer: () => void}}
* tenir(voulu) dit si la primitive tient le geste ouvert ; liberer, au
* démontage, finit le geste compté et désabonne.
*/
export function creerGeste(seance) {
// voulu : la primitive tient le geste ; compte : la séance le compte ;
// ecriture : le mode publié en dernier, ou annoncé quitté.
let voulu = false;
let compte = false;
let ecriture = false;
function ajuster() {
if (voulu && ecriture && !compte) {
compte = true;
seance.debuterGeste();
} else if (!voulu && compte) {
compte = false;
seance.finirGeste();
}
}
const desabonnerEtat = seance.subscribe((etat) => {
ecriture = etat.mode === 'ecriture';
ajuster();
});
const desabonnerAnnulation = seance.surAnnulation(() => {
ecriture = false;
compte = false;
});
return {
tenir(nouveau) {
voulu = nouveau;
ajuster();
},
liberer() {
voulu = false;
ajuster();
desabonnerEtat();
desabonnerAnnulation();
},
};
}