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
63 lines
2.1 KiB
JavaScript
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();
|
|
},
|
|
};
|
|
}
|