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
67 lines
2.2 KiB
Svelte
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>
|