gestion_table_tournante_libre/src/interface/tables/RegleObjectifs.svelte
Mathieu Benoit 91879ea4a5 [ADD] screens: tags on the card, table goals, priority editor, import
The operator now reaches tags, goals and priorities from the screens.
A person's card adds and removes tags, the participant list carries a
tag legend; each table takes an evening goal or one per round with its
rule; the generation settings hold a keyboard-operable priority editor
(move, join, split, restore, weights), the two optional criteria and the
goal mode; the proposals table and its ranking sentence follow the
order; the import screen reads a participants or a goals file. Removing
a tag or a goal returns focus to a neighbouring control.
Checked: node 4590, navigateur 942, node-long 124; captures republished.

--- FR ---

[ADD] écrans : étiquettes, objectifs des tables, priorités, import

L'opérateur atteint étiquettes, objectifs et priorités depuis les écrans.
La fiche ajoute et retire les étiquettes, la liste porte leur légende ;
chaque table reçoit un objectif de soirée ou par tour avec sa règle ; les
réglages de génération portent un éditeur des priorités utilisable au
clavier (monter, joindre, séparer, rétablir, poids), les deux critères
facultatifs et le mode des objectifs ; le tableau des propositions et sa
phrase suivent l'ordre ; l'import lit un fichier de personnes ou
d'objectifs. Retirer une étiquette ou un objectif rend le focus à côté.
Vérifié : node 4590, navigateur 942, longues 124 ; captures republiées.

Assisted-by: Claude Opus 5.5
2026-10-11 17:53:34 -04:00

67 lines
2.2 KiB
Svelte

<!-- © 2026 TechnoLibre (http://www.technolibre.ca)
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) -->
<script>
// La règle par défaut des objectifs de table (§ 2.1 étape 4, § 4.5, D3) :
// un sélecteur, à côté des places par défaut et du nombre de tours, entre
// « au moins une (OU) » et « toutes (ET) ». Un choix exécute
// changerRegleObjectifs {regle}, une entrée ; les objectifs qui portent
// une règle propre n'en changent pas. À l'issue du geste, le sélecteur
// montre la règle de la charge, écrite ou inchangée. Un refus de la séance
// — lecture, plan bloqué — se pose à côté du sélecteur, avec son remède,
// et rien ne s'écrit.
import { getContext } from 'svelte';
import Refus from '../primitives/Refus.svelte';
import ChoixRegle from './ChoixRegle.svelte';
import { OPTIONS_REGLE_PAR_DEFAUT, regleParDefaut } from './objectifs.js';
let { charge } = $props();
const t = getContext('t');
const seance = getContext('seance');
const uid = $props.id();
const idChoix = `${uid}-regle`;
const idRefus = `${uid}-regle-refus`;
// Le refus du dernier choix, posé à côté du sélecteur.
let refus = $state.raw(null);
const options = $derived(OPTIONS_REGLE_PAR_DEFAUT.map(({ valeur, cle }) => ({ valeur, libelle: t(cle) })));
async function choisir(evenement) {
const choix = evenement.currentTarget;
refus = null;
try {
await seance.executer('changerRegleObjectifs', { regle: choix.value });
} catch (erreur) {
if (typeof erreur?.code !== 'string') throw erreur;
refus = { code: erreur.code, details: erreur.details ?? {} };
} finally {
choix.value = regleParDefaut(seance.etat().charge ?? charge);
}
}
</script>
<div class="regle" data-regle-objectifs>
<label for={idChoix}>{t('tables.regle.etiquette')}</label>
<ChoixRegle
id={idChoix}
champ="regleObjectifs"
valeur={regleParDefaut(charge)}
{options}
idRefus={refus === null ? null : idRefus}
surChoix={choisir}
/>
{#if refus !== null}
<Refus id={idRefus} {refus} lever={() => (refus = null)} />
{/if}
</div>
<style>
.regle {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: var(--espace-1);
}
</style>