import type { Meta, StoryObj } from '@storybook/vue3' import SelectBtnField from './SelectBtnField.vue' import SyAlert from '@/components/SyAlert/SyAlert.vue' import { VBtn } from 'vuetify/components' import { ref } from 'vue' const meta = { title: 'Composants/Formulaires/Selects/SelectBtnField', component: SelectBtnField, decorators: [ () => ({ template: '
', }), ], parameters: { layout: 'fullscreen', controls: { exclude: ['copy'] }, }, argTypes: { 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, }, hint: { control: { type: 'text' }, default: undefined, }, error: { control: { type: 'boolean' }, default: false, }, errorMessages: { control: { type: 'text' }, default: undefined, }, readonly: { control: { type: 'boolean' }, default: false, }, }, } 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, hint: undefined, error: false, errorMessages: undefined, readonly: false, }, render: (args) => { return { components: { SelectBtnField }, setup() { return { args } }, 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 messageAide: 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', }, ], hint: '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 erreur: 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', }, ], error: true, }, render: (args) => { return { components: { SelectBtnField, VBtn }, setup() { const error = ref(args.error) const value = ref(args.modelValue) function resetExample() { error.value = true value.value = null } return { args, resetExample, error, value } }, template: `

Choisissez votre moyen de contact :

Réinitialiser
`, } }, } export const messageErreur: 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', }, ], error: true, errorMessages: [ 'Le champ est requis.', ], }, render: (args) => { return { components: { SelectBtnField, VBtn }, setup() { const error = ref(args.error) const value = ref(args.modelValue) const errorMessages = ref(args.errorMessages) function resetExample() { error.value = true value.value = null errorMessages.value = ['Le champ est requis.'] } return { args, resetExample, error, value, errorMessages } }, template: `

Choisissez votre moyen de contact :

Réinitialiser
`, } }, } 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 :

`, } }, } export const Info: Story = { render: (args) => { return { components: { SyAlert }, setup() { return { args } }, template: ` `, } }, tags: ['!dev'], }