import type { Meta, StoryObj } from '@storybook/vue3' import SelectBtnField from '../SelectBtnField.vue' import SyForm from '@/components/Customs/SyForm/SyForm.vue' import { onMounted, ref } from 'vue' import { fn } from '@storybook/test' import { VBtn, VForm } from 'vuetify/components' const meta: Meta = { title: 'Composants/Formulaires/Selects/SelectBtnField/Validation', component: SelectBtnField, parameters: { layout: 'fullscreen', docs: { description: { component: 'Exemples de validation pour le composant SelectBtnField.', }, }, }, args: { 'onUpdate:modelValue': fn(), }, } as Meta export default meta type Story = StoryObj const items = [ { text: 'Email', value: 'email' }, { text: 'Courrier', value: 'courrier' }, { text: 'SMS', value: 'sms' }, ] export const WithError: Story = { parameters: { docs: { description: { story: 'Une `customRule` bloque la sélection « SMS » et affiche un message d’erreur.', }, }, sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { SelectBtnField }, setup() { const value = ref('sms') const fieldRef = ref<{ validateOnSubmit: () => Promise } | null>(null) const customRules = [ { type: 'custom', options: { validate: (v: unknown) => v !== 'sms', message: 'Le SMS n’est pas disponible pour ce dossier.', }, }, ] onMounted(() => { fieldRef.value?.validateOnSubmit() }) return { args, value, items, customRules, fieldRef } }, template: `
`, }), } export const WithWarning: Story = { parameters: { docs: { description: { story: 'Une `customWarningRule` affiche un avertissement non bloquant.', }, }, sourceCode: [ { name: 'Script', code: ``, }, ], }, render: args => ({ components: { SelectBtnField }, setup() { const value = ref('courrier') const fieldRef = ref<{ validateOnSubmit: () => Promise } | null>(null) const customWarningRules = [ { type: 'custom', options: { validate: (v: unknown) => v !== 'courrier', warningMessage: 'Le courrier postal allonge les délais de traitement.', }, }, ] onMounted(() => { fieldRef.value?.validateOnSubmit() }) return { args, value, items, customWarningRules, fieldRef } }, template: `
`, }), } export const WithSuccess: Story = { parameters: { docs: { description: { story: 'Une `customSuccessRule` affiche un feedback positif lorsque `showSuccessMessages` est activé.', }, }, sourceCode: [ { name: 'Script', code: ``, }, ], }, render: args => ({ components: { SelectBtnField }, setup() { const value = ref('email') const fieldRef = ref<{ validateOnSubmit: () => Promise } | null>(null) const customSuccessRules = [ { type: 'custom', options: { validate: (v: unknown) => v === 'email', successMessage: 'L’email est le moyen de contact le plus rapide.', }, }, ] onMounted(() => { fieldRef.value?.validateOnSubmit() }) return { args, value, items, customSuccessRules, fieldRef } }, template: `
`, }), } export const DisableErrorHandling: Story = { parameters: { docs: { description: { story: 'Avec `disableErrorHandling`, aucune erreur n’est affichée même si une règle échoue.', }, }, }, render: args => ({ components: { SelectBtnField }, setup() { const value = ref(null) return { args, value, items } }, template: `
`, }), } export const ExternalMessages: Story = { parameters: { docs: { description: { story: 'Les props `errorMessages` / `warningMessages` / `successMessages` injectent des messages depuis le parent.', }, }, }, render: args => ({ components: { SelectBtnField, VBtn }, setup() { const value = ref('email') const errorMessages = ref(null) const warningMessages = ref(null) const successMessages = ref(null) function setError() { errorMessages.value = ['Ce moyen de contact est indisponible.'] warningMessages.value = null successMessages.value = null } function setWarning() { errorMessages.value = null warningMessages.value = ['Vérifiez vos coordonnées.'] successMessages.value = null } function setSuccess() { errorMessages.value = null warningMessages.value = null successMessages.value = ['Moyen de contact validé par le serveur.'] } function reset() { errorMessages.value = null warningMessages.value = null successMessages.value = null } return { args, value, items, errorMessages, warningMessages, successMessages, setError, setWarning, setSuccess, reset } }, template: `
Erreur Avertissement Succès Réinitialiser
`, }), } export const SyFormValidation: Story = { parameters: { docs: { description: { story: 'Intégration automatique au `SyForm` : le champ s’enregistre et est validé à la soumission.', }, }, sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { SelectBtnField, SyForm, VBtn }, setup() { const value = ref(null) function handleSubmit(e: { isValid: boolean }) { alert(e.isValid ? 'Formulaire valide !' : 'Veuillez corriger les erreurs.') } return { args, value, items, handleSubmit } }, template: `
Valider
`, }), } export const VFormValidation: Story = { parameters: { docs: { description: { story: 'Validation Synapse (`customRules`) dans un `VForm` Vuetify, déclenchée via `validateOnSubmit` exposé par le composant.', }, }, sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { SelectBtnField, VBtn, VForm }, setup() { const value = ref(null) const fieldRef = ref<{ validateOnSubmit: () => Promise } | null>(null) const customRules = [ { type: 'custom', options: { validate: (v: unknown) => v !== 'sms', message: 'Le SMS n’est pas disponible pour ce dossier.', }, }, ] async function handleSubmit() { const isValid = await fieldRef.value?.validateOnSubmit() alert(isValid ? 'Valide !' : 'Veuillez corriger les erreurs.') } return { args, value, items, customRules, fieldRef, handleSubmit } }, template: `
Valider
`, }), } export const SyFormVuetifyValidation: Story = { parameters: { docs: { description: { story: 'Validation native Vuetify (`useVuetifyValidation` + `rules`) intégrée automatiquement à un `SyForm`.', }, }, sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, render: args => ({ components: { SelectBtnField, SyForm, VBtn }, setup() { const value = ref(null) const rules = [ (v: unknown) => !!v || 'Le moyen de contact est requis.', ] function handleSubmit(e: { isValid: boolean }) { alert(e.isValid ? 'Formulaire valide !' : 'Veuillez corriger les erreurs.') } return { args, value, items, rules, handleSubmit } }, template: `
Valider
`, }), } export const VFormVuetifyValidation: Story = { parameters: { docs: { description: { story: 'Avec `useVuetifyValidation`, les règles sont des fonctions Vuetify natives `(value) => true | message`.', }, }, sourceCode: [ { name: 'Script', code: ``, }, ], }, render: args => ({ components: { SelectBtnField, VBtn, VForm }, setup() { const value = ref(null) const rules = [ (v: unknown) => !!v || 'Le moyen de contact est requis.', ] async function handleSubmit(e: Promise<{ valid: boolean }>) { const result = await e alert(result.valid ? 'Valide !' : 'Veuillez corriger les erreurs.') } return { args, value, items, rules, handleSubmit } }, template: `
Valider
`, }), }