import type { Meta, StoryObj } from '@storybook/vue3' import { ref, watch, onMounted } from 'vue' import { VBtn, VForm } from 'vuetify/components' import { fn } from '@storybook/test' import LunarCalendar from '../LunarCalendar.vue' import SyForm from '../../Customs/SyForm/SyForm.vue' import { getValidationDocumentation } from '@/composables/unifyValidation/documentationValidationProps' const meta = { title: 'Composants/Formulaires/LunarCalendar/Validation', component: LunarCalendar, decorators: [ () => ({ template: '
', }), ], parameters: { layout: 'fullscreen', docs: { description: { component: `Exemples de validation pour le composant LunarCalendar`, }, }, }, argTypes: { ...getValidationDocumentation('date'), modelValue: { control: 'text', description: 'La valeur du calendrier lunaire au format DD/MM/YYYY', }, label: { control: 'text', description: 'Libellé du champ', }, }, args: { 'modelValue': '', 'label': 'Date de naissance', 'required': false, 'errorMessages': null, 'warningMessages': null, 'successMessages': null, 'readonly': false, 'disabled': false, 'customRules': [], 'customWarningRules': [], 'customSuccessRules': [], 'isValidateOnBlur': true, 'onUpdate:modelValue': fn(), }, } as Meta export default meta type Story = StoryObj export const WithError: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, ], }, args: { modelValue: '16/08/1550', minYear: 1400, maxYear: 1500, }, render: args => ({ components: { LunarCalendar }, setup() { const value = ref(args.modelValue) const fieldRef = ref<{ validateOnSubmit: () => Promise } | null>(null) watch(() => args.modelValue, (newValue) => { value.value = newValue }) onMounted(() => { fieldRef.value?.validateOnSubmit() }) return { args, value, fieldRef } }, template: `
`, }), } export const WithWarning: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, ], }, args: { modelValue: '01/01/1900', customWarningRules: [ { type: 'custom', options: { validate: (value: string) => { const year = Number(value.split('/')[2]) return isNaN(year) || year >= 1912 }, warningMessage: 'Cette date est antérieure à 1912.', }, }, ], }, render: args => ({ components: { LunarCalendar }, setup() { const value = ref(args.modelValue) const fieldRef = ref<{ validateOnSubmit: () => Promise } | null>(null) watch(() => args.modelValue, (newValue) => { value.value = newValue }) onMounted(() => { fieldRef.value?.validateOnSubmit() }) return { args, value, fieldRef } }, template: `
`, }), } export const WithSuccess: Story = { parameters: { a11y: { disable: true, }, sourceCode: [ { name: 'Template', code: ` `, }, ], }, args: { modelValue: '15/08/1450', showSuccessMessages: true, customSuccessRules: [ { type: 'custom', options: { validate: (value: string) => /^\d{2}\/\d{2}\/\d{4}$/.test(value), successMessage: 'Date lunaire valide.', }, }, ], }, render: args => ({ components: { LunarCalendar }, setup() { const value = ref(args.modelValue) const fieldRef = ref<{ validateOnSubmit: () => Promise } | null>(null) watch(() => args.modelValue, (newValue) => { value.value = newValue }) onMounted(() => { fieldRef.value?.validateOnSubmit() }) return { args, value, fieldRef } }, template: `
`, }), } export const ExternalMessages: Story = { parameters: { sourceCode: [ { name: 'Template', code: ` `, }, ], }, args: { modelValue: '15/08/1450', showSuccessMessages: true, }, render: args => ({ components: { LunarCalendar, VBtn }, setup() { const value = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { value.value = newValue }) const errorMessages = ref(null) const warningMessages = ref(null) const successMessages = ref(null) function setError() { errorMessages.value = ['Date non reconnue dans le calendrier lunaire.'] warningMessages.value = null successMessages.value = null } function setWarning() { errorMessages.value = null warningMessages.value = ['Cette date correspond à une période incertaine.'] successMessages.value = null } function setSuccess() { errorMessages.value = null warningMessages.value = null successMessages.value = ['Date lunaire validée par le serveur.'] } function reset() { errorMessages.value = null warningMessages.value = null successMessages.value = null } return { args, value, errorMessages, warningMessages, successMessages, setError, setWarning, setSuccess, reset } }, template: `
Simuler une erreur Simuler un avertissement Simuler un succès Réinitialiser
`, }), } export const WithYearConstraints: Story = { parameters: { sourceCode: [ { name: 'Template', code: ` `, }, ], }, args: { modelValue: '16/08/1550', minYear: 1400, maxYear: 1500, }, render: args => ({ components: { LunarCalendar }, setup() { const value = ref(args.modelValue) const fieldRef = ref<{ validateOnSubmit: () => Promise } | null>(null) watch(() => args.modelValue, (newValue) => { value.value = newValue }) onMounted(() => { fieldRef.value?.validateOnSubmit() }) return { args, value, fieldRef } }, template: `
`, }), } export const WithMinYearOnly: Story = { parameters: { sourceCode: [ { name: 'Template', code: ` `, }, ], }, args: { modelValue: '12/12/1445', minYear: 1420, }, render: args => ({ components: { LunarCalendar }, setup() { const value = ref(args.modelValue) const fieldRef = ref<{ validateOnSubmit: () => Promise } | null>(null) watch(() => args.modelValue, (newValue) => { value.value = newValue }) onMounted(() => { fieldRef.value?.validateOnSubmit() }) return { args, value, fieldRef } }, template: `
`, }), } export const WithMaxYearOnly: Story = { parameters: { sourceCode: [ { name: 'Template', code: ` `, }, ], }, args: { modelValue: '12/12/1445', maxYear: 1450, }, render: args => ({ components: { LunarCalendar }, setup() { const value = ref(args.modelValue) const fieldRef = ref<{ validateOnSubmit: () => Promise } | null>(null) watch(() => args.modelValue, (newValue) => { value.value = newValue }) onMounted(() => { fieldRef.value?.validateOnSubmit() }) return { args, value, fieldRef } }, template: `
`, }), } export const SyFormValidation: Story = { parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, args: { modelValue: '', required: true, }, render: args => ({ components: { LunarCalendar, VBtn, SyForm }, setup() { const value = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { value.value = newValue }) const customRules = [ { type: 'custom', options: { validate: (value: string) => { if (!value || !/^\d{2}\/\d{2}\/\d{4}$/.test(value)) { return false } return true }, message: 'La date doit être au format JJ/MM/AAAA.', fieldIdentifier: 'date', }, }, ] function handleSubmit(e: { isValid: boolean }) { const isValid = e.isValid alert(isValid ? 'Date valide !' : 'Veuillez corriger les erreurs.') } return { args, value, customRules, handleSubmit } }, template: `
Valider
`, }), } export const VFormValidation: Story = { parameters: { sourceCode: [ { name: 'Template', code: ``, }, { name: 'Script', code: ``, }, ], }, args: { modelValue: '', required: true, }, render: args => ({ components: { LunarCalendar, VBtn, VForm }, setup() { const value = ref(args.modelValue) watch(() => args.modelValue, (newValue) => { value.value = newValue }) const lunarRef = ref() async function handleSubmit() { if (lunarRef.value) { const result = await lunarRef.value.validateOnSubmit() alert(result ? 'Date valide !' : 'Veuillez corriger les erreurs.') } } return { args, value, lunarRef, handleSubmit } }, template: `

Il faut privilégier l'utilisation de SyForm pour bénéficier de l'intégration native.

Valider
`, }), }