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: `
Simuler une erreur
Simuler un avertissement
Simuler un succès
Réinitialiser
`,
},
],
},
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: `
Valider
`,
},
{
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: `
`,
}),
}
export const VFormValidation: Story = {
parameters: {
sourceCode: [
{
name: 'Template',
code: `
Valider
`,
},
{
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
`,
}),
}