gestion_table_tournante_libre/src/interface/tables/RegleObjectifs.svelte

68 lines
2.2 KiB
Svelte
Raw Normal View History

<!-- © 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>