import type { Meta, StoryObj } from '@storybook/vue3' import { ref, watch } from 'vue' import AmeliproCaptcha from './AmeliproCaptcha.vue' const meta = { argTypes: { 'captchaInputLabelAudio': { description: 'Libellé du champ texte pour le captcha audio' }, 'captchaInputLabelImg': { description: 'Libellé du champ texte pour le captcha image' }, 'captchaTitle': { description: 'Titre du bloc captcha' }, 'click-play': { description: 'Événement émis au clic sur le bouton lecture', type: 'void' }, 'click-switch': { description: 'Événement émis au clic sur le bouton permettant de passer du captcha image au captcha audio (et inversement). Retourne `true` si l’on bascule vers le captcha audio, `false` dans le cas inverse.', type: 'boolean' }, 'click-update': { description: 'Événement émis au clic sur le bouton permettant de changer d’image ou d’audio', type: 'void' }, 'defaultAudio': { description: 'Charge le composant avec le captcha audio par défaut' }, 'imgAlt': { description: 'Défini une alternative textuelle pour le captcha image' }, 'imgMaxWidth': { description: 'Défini la largeur maximale du captcha image' }, 'imgWidth': { description: 'Défini la largeur du captcha image' }, 'modelValue': { description: 'Défini la valeur du champ de saisie' }, 'switchCaptchaTypeLabelAudio': { description: 'Libellé du bouton permettant de passer du captcha audio au captcha image' }, 'switchCaptchaTypeLabelImg': { description: 'Libellé du bouton permettant de passer du captcha image au captcha audio' }, 'uniqueId': { description: 'Identifiant unique du bloc captcha' }, 'update:model-value': { description: 'Événement émis au changement de valeur du champ de saisie. Retourne un object ICaptcha.', type: 'ICaptcha' }, 'updateCaptchaLabelAudio': { description: 'Libellé du bouton permettant de changer d’audio' }, 'updateCaptchaLabelImg': { description: 'Libellé du bouton permettant de changer d’image' }, }, component: AmeliproCaptcha, title: 'Composants/Amelipro/Formulaires/AmeliproCaptcha', } as Meta export default meta type Story = StoryObj export const Default: Story = { args: { modelValue: { audioSrc: '/amelipro/sound/captcha.wav', imgSrc: '/amelipro/img/captcha.png', inputValue: '', }, uniqueId: 'amelipro-captcha-unique-id', }, parameters: { sourceCode: [ { name: 'Template', code: ` `, }, { name: 'Script', code: ` `, }, ], }, render: args => ({ components: { AmeliproCaptcha }, 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 AudioParDefaut: Story = { args: { modelValue: { audioSrc: '/amelipro/sound/captcha.wav', imgSrc: '/amelipro/img/captcha.png', inputValue: '', }, uniqueId: 'amelipro-captcha-audio-default', defaultAudio: true, }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { AmeliproCaptcha }, setup() { const model = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: `

Le captcha s'affiche en mode audio par défaut grâce à la prop defaultAudio.

`, }), } export const LabelsPersonnalises: Story = { args: { modelValue: { audioSrc: '/amelipro/sound/captcha.wav', imgSrc: '/amelipro/img/captcha.png', inputValue: '', }, uniqueId: 'amelipro-captcha-labels', captchaInputLabelAudio: 'Code audio personnalisé :', captchaInputLabelImg: 'Code image personnalisé :', captchaTitle: 'Titre personnalisé', }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { AmeliproCaptcha }, setup() { const model = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: `

Les labels et le titre sont personnalisés via les props captchaInputLabelAudio, captchaInputLabelImg et captchaTitle.

`, }), } export const ImagePersonnalisee: Story = { args: { modelValue: { audioSrc: '/amelipro/sound/captcha.wav', imgSrc: '/amelipro/img/captcha.png', inputValue: '', }, uniqueId: 'amelipro-captcha-img', imgAlt: 'Captcha personnalisé', imgWidth: '200px', imgMaxWidth: '80%', }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { AmeliproCaptcha }, setup() { const model = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: `

L’image du captcha est personnalisée via les props imgAlt, imgWidth et imgMaxWidth.

`, }), } export const BoutonsDeMiseAJour: Story = { args: { modelValue: { audioSrc: '/amelipro/sound/captcha.wav', imgSrc: '/amelipro/img/captcha.png', inputValue: '', }, uniqueId: 'amelipro-captcha-btns', updateCaptchaLabelAudio: 'Nouveau son', updateCaptchaLabelImg: 'Nouvelle image', }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { AmeliproCaptcha }, setup() { const model = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: `

Les libellés des boutons de mise à jour (à gauche) sont personnalisés via les props updateCaptchaLabelAudio et updateCaptchaLabelImg.

`, }), } export const BoutonsDeBascule: Story = { args: { modelValue: { audioSrc: '/amelipro/sound/captcha.wav', imgSrc: '/amelipro/img/captcha.png', inputValue: '', }, uniqueId: 'amelipro-captcha-switch', switchCaptchaTypeLabelAudio: 'Basculer vers image', switchCaptchaTypeLabelImg: 'Basculer vers audio', }, parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { AmeliproCaptcha }, setup() { const model = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { model.value = newValue }) return { args, model } }, template: `

Les libellés des boutons de bascule (à droite) sont personnalisés via les props switchCaptchaTypeLabelAudio et switchCaptchaTypeLabelImg.

`, }), }