import type { Meta, StoryObj } from '@storybook/vue3' import { onMounted, ref } from 'vue' import SelectBtnField from './SelectBtnField.vue' import { getValidationDocumentation } from '@/composables/unifyValidation/documentationValidationProps' const meta = { title: 'Composants/Formulaires/Selects/SelectBtnField', component: SelectBtnField, decorators: [ () => ({ template: '
', }), ], parameters: { layout: 'fullscreen', controls: { exclude: ['copy'] }, }, argTypes: { ...getValidationDocumentation('base'), modelValue: { control: { SelectBtnField }, default: null, }, items: { control: { Array }, default: [], description: 'Liste des éléments sélectionnables', table: { type: { summary: 'SelectBtnItem[]' }, }, }, label: { description: 'Valeur utilisée pour l’attribut aria-label, préfèrer l’utilisation de aria-labelledby pour respecter les impératifs d’accessibilité', control: { type: 'text' }, default: undefined, }, ariaLabelledby: { description: 'Identifiant (id) de l’élément qui étiquette ce champ', control: { type: 'text' }, default: undefined, }, multiple: { control: { type: 'boolean' }, default: false, }, inline: { control: { type: 'boolean' }, default: false, }, helpText: { description: 'Texte d’aide permanent affiché sous le champ.', control: { type: 'text' }, default: undefined, }, }, } satisfies Meta export default meta type Story = StoryObj export const Default: Story = { parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { modelValue: null, items: [ { text: 'Email', value: 'email' }, { text: 'Courrier', value: 'courrier' }, { text: 'SMS', value: 'sms' }, ], multiple: false, inline: false, readonly: false, }, render: (args) => { return { components: { SelectBtnField }, setup() { return { args } }, template: `

Choisissez votre moyen de contact :

`, } }, } export const Required: Story = { parameters: { docs: { description: { story: 'Champ requis : la validation `required` se déclenche à la soumission (`validateOnSubmit`).', }, }, sourceCode: [ { name: 'Script', code: ``, }, ], }, args: { modelValue: null, items: [ { text: 'Email', value: 'email' }, { text: 'Courrier', value: 'courrier' }, { text: 'SMS', value: 'sms' }, ], label: 'Moyen de contact', required: true, }, render: (args) => { return { components: { SelectBtnField }, setup() { const fieldRef = ref<{ validateOnSubmit: () => Promise } | null>(null) onMounted(() => { fieldRef.value?.validateOnSubmit() }) return { args, fieldRef } }, template: `

Choisissez votre moyen de contact :

`, } }, } export const Multiple: Story = { parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { modelValue: null, items: [ { text: 'Email', value: 'email' }, { text: 'Courrier', value: 'courrier' }, { text: 'SMS', value: 'sms' }, ], multiple: true, }, render: (args) => { return { components: { SelectBtnField }, setup() { return { args } }, template: `

Choisissez votre moyen de contact :

`, } }, } export const inline: Story = { parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { modelValue: null, items: [ { text: 'Email', value: 'email' }, { text: 'Courrier', value: 'courrier' }, { text: 'SMS', value: 'sms' }, ], inline: true, }, render: (args) => { return { components: { SelectBtnField }, setup() { return { args } }, template: `

Choisissez votre moyen de contact :

`, } }, } export const itemUnique: Story = { parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { modelValue: null, items: [ { text: 'Email', value: 'email' }, { text: 'Courrier', value: 'courrier' }, { text: 'SMS', value: 'sms' }, { text: 'Autre', value: 'other', unique: true }, ], multiple: true, }, render: (args) => { return { components: { SelectBtnField }, setup() { return { args } }, template: `

Choisissez votre moyen de contact :

Les items marqués avec unique: true sont exclusifs : lorsqu’ils sont sélectionnés, tous les autres items sont automatiquement désélectionnés.

`, } }, } export const HelpText: Story = { parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { modelValue: null, items: [ { text: 'Email', value: 'email' }, { text: 'Courrier', value: 'courrier' }, { text: 'SMS', value: 'sms' }, ], helpText: 'Par défaut, le moyen de contact est l’email.', }, render: (args) => { return { components: { SelectBtnField }, setup() { return { args } }, template: `

Choisissez votre moyen de contact :

`, } }, } export const readonly: Story = { parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, args: { modelValue: ['email'], items: [ { text: 'Email', value: 'email' }, { text: 'Courrier', value: 'courrier' }, { text: 'SMS', value: 'sms' }, ], label: 'Moyen de contact', readonly: true, }, render: (args) => { return { components: { SelectBtnField }, setup() { return { args } }, template: `

Choisissez votre moyen de contact :

`, } }, }