import type { Meta, StoryObj } from '@storybook/vue3' import { ref } from 'vue' import SyCheckBoxGroup from '@/components/Customs/SyCheckBoxGroup/SyCheckBoxGroup.vue' import SyForm from '@/components/Customs/SyForm/SyForm.vue' import { VBtn } from 'vuetify/components' const meta: Meta = { title: 'Composants/Formulaires/SyCheckBoxGroup', component: SyCheckBoxGroup, decorators: [ () => ({ template: '
', }), ], parameters: { layout: 'fullscreen', docs: { description: { component: 'SyCheckBoxGroup est un composant de groupe de cases à cocher basé sur SyCheckbox.', }, }, }, argTypes: { 'modelValue': { control: false }, 'onUpdate:modelValue': { action: 'update:modelValue' }, 'onChange': { action: 'change' }, 'label': { control: 'text' }, 'displayAsterisk': { control: 'boolean' }, 'disabled': { control: 'boolean' }, 'readonly': { control: 'boolean' }, 'required': { control: 'boolean' }, 'multiple': { control: 'boolean' }, 'hideDetails': { control: 'boolean' }, 'density': { control: 'select', options: ['default', 'comfortable', 'compact'], }, 'options': { control: 'object' }, }, } export default meta type Story = StoryObj const baseOptions = [ { label: 'Option A', value: 'a' }, { label: 'Option B', value: 'b' }, { label: 'Option C', value: 'c' }, ] export const Default: Story = { parameters: { sourceCode: [ { name: 'Template', code: `
Sélection : {{ value }}
`, }, { name: 'Script', code: ` `, }, ], }, args: { label: 'Choisissez une option', options: baseOptions, multiple: false, required: false, }, render: args => ({ components: { SyCheckBoxGroup }, setup() { const value = ref(null) return { args, value } }, template: `
Sélection : {{ value }}
`, }), } export const Disabled: Story = { parameters: { sourceCode: [ { name: 'Template', code: `
Sélection : {{ value }}
`, }, { name: 'Script', code: ` `, }, ], }, args: { label: 'CheckBoxGroup désactivé', disabled: true, options: baseOptions, multiple: false, hideDetails: true, }, render: args => ({ components: { SyCheckBoxGroup }, setup() { const value = ref('a') return { args, value } }, template: `
Sélection : {{ value }}
`, }), } export const Required: Story = { parameters: { sourceCode: [ { name: 'Template', code: `
Sélection : {{ value }}
Valider
`, }, { name: 'Script', code: ` `, }, ], }, args: { label: 'Choisissez une option (obligatoire)', required: true, options: [ { label: 'Option A', value: 'a' }, { label: 'Option B', value: 'b' }, ], multiple: false, id: 'sy-checkbox-group-required', isValidateOnBlur: false, }, render: args => ({ components: { SyCheckBoxGroup, SyForm, VBtn }, setup() { const value = ref(null) const onSubmit = (event: { isValid: boolean }) => { if (event.isValid) { alert('Formulaire valide !') } } return { args, value, onSubmit } }, template: `
Sélection : {{ value }}
Valider
`, }), } export const Multiple: Story = { parameters: { sourceCode: [ { name: 'Template', code: `
Sélection : {{ values }}
`, }, { name: 'Script', code: ` `, }, ], }, args: { label: 'Choisissez plusieurs options', options: baseOptions, multiple: true, required: false, }, render: args => ({ components: { SyCheckBoxGroup }, setup() { const value = ref>(['a']) return { args, value } }, template: `
Sélection : {{ value }}
`, }), } export const MultipleRequired: Story = { parameters: { sourceCode: [ { name: 'Template', code: `
Sélection : {{ values }}
Valider
`, }, { name: 'Script', code: ` `, }, ], }, args: { label: 'Choisissez au moins une option (multiple requis)', options: baseOptions, multiple: true, required: true, customRules: [ { type: 'custom', options: { message: 'Veuillez sélectionner au moins 2 options.', validate: (value: Array) => Array.isArray(value) && value.length >= 2, }, }, ], id: 'sy-checkbox-group-multiple-required', isValidateOnBlur: false, }, render: args => ({ components: { SyCheckBoxGroup, SyForm, VBtn }, setup() { const value = ref>([]) const onSubmit = (event: { isValid: boolean }) => { if (event.isValid) { alert('Formulaire valide !') } } return { args, value, onSubmit } }, template: `
Sélection : {{ value }}
Valider
`, }), } export const ListModel: Story = { parameters: { sourceCode: [ { name: 'Template', code: `
Sélection : {{ selected }}
`, }, { name: 'Script', code: ` `, }, ], }, args: { label: 'v-model comme une liste (tableau)', options: baseOptions, multiple: true, required: false, hideDetails: true, }, render: args => ({ components: { SyCheckBoxGroup }, setup() { const selected = ref>(['a']) return { args, selected } }, template: `
Sélection : {{ selected }}
`, }), } export const FormValidation: Story = { args: { label: 'Choisissez une option (obligatoire)', required: true, options: [ { label: 'Option A', value: 'a' }, { label: 'Option B', value: 'b' }, ], multiple: false, id: 'sy-checkbox-group-form-validation', isValidateOnBlur: false, }, render: args => ({ components: { SyCheckBoxGroup, SyForm, VBtn }, setup() { const value = ref(null) const onSubmit = (event: { isValid: boolean }) => { if (event.isValid) { alert('Formulaire valide !') } } return { args, value, onSubmit } }, template: `
Sélection : {{ value }}
Valider
`, }), parameters: { sourceCode: [ { name: 'Template', code: `
Sélection : {{ value }}
Valider
`, }, { name: 'Script', code: ` `, }, ], }, } export const CustomColors: Story = { parameters: { sourceCode: [ { name: 'Template', code: `
`, }, { name: 'Script', code: ``, }, ], docs: { description: { story: ` ### Couleurs personnalisées Le composant SyCheckBoxGroup peut être personnalisé avec différentes couleurs pour s'adapter à votre thème. `, }, }, }, render: args => ({ components: { SyCheckBoxGroup }, setup() { const options = [ { label: 'Value 1', value: 'a' }, { label: 'Value 2', value: 'b' }, ] const value1 = ref('a') const value2 = ref('a') const value3 = ref('a') const value4 = ref('a') const value5 = ref('a') return { args, options, value1, value2, value3, value4, value5 } }, template: `
`, }), } export const DifferentDensities: Story = { parameters: { sourceCode: [ { name: 'Template', code: `
`, }, { name: 'Script', code: ``, }, ], docs: { description: { story: ` ### Différentes densités Le composant SyCheckBoxGroup prend en charge différentes densités pour s'adapter à différents contextes d'interface utilisateur. `, }, }, }, render: () => ({ components: { SyCheckBoxGroup }, setup() { const val1 = ref(null) const val2 = ref(null) const val3 = ref(null) const options = [ { label: 'Value 1', value: 'a' }, { label: 'Value 2', value: 'b' }, ] return { val1, val2, val3, options } }, template: `
`, }), } export const Readonly: Story = { args: { readonly: true, options: [ { label: 'Option A', value: 'a' }, { label: 'Option B', value: 'b' }, { label: 'Option C', value: 'c' }, ], }, render: args => ({ components: { SyCheckBoxGroup }, setup() { const value = ref('a') return { args, value } }, template: `
Sélection : {{ value }}
`, }), parameters: { sourceCode: [ { name: 'Template', code: `
Sélection : {{ value }}
`, }, { name: 'Script', code: ` `, }, ], }, } export const CustomRules: Story = { parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { SyCheckBoxGroup }, setup() { const selected = ref('A') const options = [ { label: 'Option A', value: 'A' }, { label: 'Option B', value: 'B' }, ] const warningRules = [ { type: 'custom', options: { validate: (value: string | null) => { if (value !== 'A') { return 'Vous devez sélectionner l’option A' } return true }, }, }, ] const successRules = [ { type: 'custom', options: { validate: (value: string | null) => value === 'A', successMessage: 'Option A sélectionnée', }, }, ] return { args, selected, options, warningRules, successRules } }, template: ` `, }), }