import type { Meta, StoryObj } from '@storybook/vue3' import { ref, watch } from 'vue' import AmeliproCheckboxGroup from './AmeliproCheckboxGroup.vue' import AmeliproTooltips from '../AmeliproTooltips/AmeliproTooltips.vue' const meta = { argTypes: { '`append-${index}`': { description: 'Permet de rajouter un élément après le label des checkbox, il y a un slot par item de la liste' }, '`subItem-${index}`': { description: 'Permet de rajouter un élément sous une checkbox seulement lorsqu’elle est cochée (existe seulement si les props horizontal et fullHorizontal sont à false)' }, 'append': { description: 'Permet de rajouter un élément après les label de toutes les checkbox' }, 'required': { description: 'Permet de rendre la selection obligatoire' }, 'change:selected': { description: 'Événement émis au click sur une checkbox retourne les items sélectionnés' }, 'disabled': { description: 'Permet de désactiver la CheckboxGroup' }, 'fullHorizontal': { description: 'Permet d’afficher le checkboxGroup ainsi que le label à l’horizontal' }, 'groupLabel': { description: 'Label du groupe de checkbox' }, 'hiddenLabel': { description: 'Permet de masquer le label du groupe de checkbox, dans une démarche d’amélioration de l’accessibilité, il est recommandé de ne pas utiliser cette property dans la mesure du possible' }, 'horizontal': { description: 'Permet d’afficher le checkboxGroup à l’horizontal' }, 'horizontalLabel': { description: 'Permet d’afficher le checkboxGroup avec le label à l’horizontal tout en gardant les checkbox sous forme de colonnes' }, 'labelInfo': { description: 'Slot pour ajouter une tooltip après le label du groupe si besoin' }, 'modelValue': { description: 'Tableau d’objets qui permet de générer les checkbox', table: { type: { detail: `Array<{ description?: string; disabled?: boolean; isChecked: boolean; label: string; value: string; }[]>`, summary: 'AmeliproCheckboxGroupItem[]', }, }, }, 'multipleRequired': { description: 'Permet de rendre la selection multiple obligatoire' }, 'multipleRequiredErrorMessage': { description: 'Message d’erreur affiché lorsque la props multipleRequired est active' }, 'pills': { description: 'Change le style du groupe de checkbox ' }, 'requiredErrorMessage': { description: 'Message d’erreur affiché lorsque la props required est active' }, 'subItem': { description: 'Permet de rajouter un élément sous toutes checkbox seulement lorsqu’elle sont cochées (existe seulement si les props horizontal et fullHorizontal sont à false)' }, 'uniqueId': { description: 'Id unique du groupe de checkbox' }, 'update:model-value': { description: 'Événement émis au changement du v-model' }, }, component: AmeliproCheckboxGroup, title: 'Composants/Amelipro/Formulaires/AmeliproCheckboxGroup', } as Meta export default meta type Story = StoryObj const baseItems = [ { isChecked: false, label: 'Option 1', value: '1' }, { isChecked: false, label: 'Option 2', value: '2' }, { isChecked: false, label: 'Option 3', value: '3' }, ] const items = [ { disabled: true, isChecked: true, label: '1', value: 'Valeur 1', }, { description: 'ma-tooltip', disabled: true, isChecked: false, label: '2', value: 'Valeur 2', }, { isChecked: false, label: '3', value: 'Valeur 3', }, { isChecked: false, label: '4', value: 'Valeur 4', }, { isChecked: false, label: '5', value: 'Valeur 5', }, ] export const Default: Story = { args: { groupLabel: 'Exemple de checkbox', modelValue: items, uniqueId: 'checkbox-group', }, parameters: { args: {}, sourceCode: [ { name: 'Template', code: ``, }, { name: 'Scripts', code: ``, }, ], }, render: args => ({ components: { AmeliproCheckboxGroup, AmeliproTooltips }, setup() { const model = ref(args.modelValue) // Optional: Keeps v-model in sync with storybook args watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: ` `, }), } export const Disabled: Story = { args: { groupLabel: 'Groupe désactivé', modelValue: baseItems.map(i => ({ ...i, disabled: true })), uniqueId: 'checkbox-group-disabled', disabled: true, }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { AmeliproCheckboxGroup }, setup() { const model = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: `

Le groupe de checkbox est désactivé grâce à la prop disabled.

`, }), } export const Required: Story = { args: { groupLabel: 'Groupe obligatoire', modelValue: baseItems, uniqueId: 'checkbox-group-required', required: true, }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { AmeliproCheckboxGroup }, setup() { const model = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: `

La sélection d’au moins une option est obligatoire grâce à la prop required.

`, }), } export const MultipleRequired: Story = { args: { groupLabel: 'Sélection multiple obligatoire', modelValue: [ { isChecked: false, label: 'Option 1', value: '1' }, { isChecked: false, label: 'Option 2', value: '2' }, { isChecked: false, label: 'Option 3', value: '3' }, ], uniqueId: 'checkbox-group-multiple-required', multipleRequired: true, }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { AmeliproCheckboxGroup }, setup() { const model = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: `

La sélection d’au moins deux options est obligatoire grâce à la prop multipleRequired.

`, }), } export const Horizontal: Story = { args: { groupLabel: 'Affichage horizontal', modelValue: [ { isChecked: false, label: 'Option 1', value: '1' }, { isChecked: false, label: 'Option 2', value: '2' }, { isChecked: false, label: 'Option 3', value: '3' }, ], uniqueId: 'checkbox-group-horizontal', horizontal: true, }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { AmeliproCheckboxGroup }, setup() { const model = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: `

Le groupe de checkbox est affiché horizontalement grâce à la prop horizontal.

`, }), } export const FullHorizontal: Story = { args: { groupLabel: 'Affichage fullHorizontal', modelValue: [ { isChecked: false, label: 'Option 1', value: '1' }, { isChecked: false, label: 'Option 2', value: '2' }, { isChecked: false, label: 'Option 3', value: '3' }, ], uniqueId: 'checkbox-group-full-horizontal', fullHorizontal: true, }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { AmeliproCheckboxGroup }, setup() { const model = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: `

Le groupe de checkbox et son label sont affichés à l’horizontal grâce à la prop fullHorizontal.

`, }), } export const HorizontalLabel: Story = { args: { groupLabel: 'Affichage horizontalLabel', modelValue: [ { isChecked: false, label: 'Option 1', value: '1' }, { isChecked: false, label: 'Option 2', value: '2' }, { isChecked: false, label: 'Option 3', value: '3' }, ], uniqueId: 'checkbox-group-horizontal-label', horizontalLabel: true, }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { AmeliproCheckboxGroup }, setup() { const model = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: `

Le label du groupe est affiché à l’horizontal grâce à la prop horizontalLabel, tandis que les checkbox restent en colonnes.

`, }), } export const Pills: Story = { args: { groupLabel: 'Affichage en mode pills', modelValue: [ { isChecked: false, label: 'Option 1', value: '1' }, { isChecked: false, label: 'Option 2', value: '2' }, { isChecked: false, label: 'Option 3', value: '3' }, ], uniqueId: 'checkbox-group-pills', pills: true, }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { AmeliproCheckboxGroup }, setup() { const model = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: `

Le groupe de checkbox utilise le style pills pour un rendu visuel différent.

`, }), } export const HiddenLabel: Story = { args: { groupLabel: 'Label masqué', modelValue: [ { isChecked: false, label: 'Option 1', value: '1' }, { isChecked: false, label: 'Option 2', value: '2' }, { isChecked: false, label: 'Option 3', value: '3' }, ], uniqueId: 'checkbox-group-hidden-label', hiddenLabel: true, }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { AmeliproCheckboxGroup }, setup() { const model = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: `

Le label du groupe est masqué grâce à la prop hiddenLabel.

`, }), }