import { computed, ref, toRef, type ComputedRef, type Ref } from 'vue' import { useValidation, type ValidationRule } from '@/composables/unifyValidation/useValidation' import type { SyCheckboxValidationProps } from '../types' export interface UseSyCheckboxValidationReturn { validate: () => Promise validateOnSubmit: () => Promise clearValidation: () => void errors: Ref warnings: Ref successes: Ref hasError: ComputedRef hasWarning: ComputedRef hasSuccess: ComputedRef defaultRules: ComputedRef focused: Ref } /** * Composable de validation du composant SyCheckbox * * Version simplifiée du système unifié : pour une case à cocher, « required » signifie * que la case doit être cochée (`value === true`). On utilise donc une règle `custom` * plutôt que la règle `required` générique, qui considère `false` comme une valeur valide. * * @example * const { validate, errors, hasError } = useSyCheckboxValidation(props, model, focused) */ export function useSyCheckboxValidation( props: SyCheckboxValidationProps, model: Ref, focused?: Ref, ): UseSyCheckboxValidationReturn { const focusedRef = focused !== undefined ? focused : ref(false) // « required » pour une case = doit être cochée (true) const defaultRules = computed(() => props.required ? [{ type: 'custom', options: { validate: (value: unknown) => value === true, message: `Le champ ${props.label || 'ce champ'} est requis.`, fieldIdentifier: props.label, }, }] : [], ) // Vuetify ne gère pas les messages de succès : on les désactive en mode Vuetify const effectiveShowSuccessMessages = computed(() => props.useVuetifyValidation ? false : (props.showSuccessMessages ?? false), ) const { validate, clearValidation, errors, warnings, successes, hasError, hasWarning, hasSuccess, } = useValidation({ modelValue: model, readonly: toRef(() => props.readonly ?? false), disabled: toRef(() => props.disabled ?? false), required: toRef(() => props.required ?? false), isValidateOnBlur: toRef(() => props.isValidateOnBlur ?? false), showSuccessMessages: effectiveShowSuccessMessages, disableErrorHandling: toRef(() => props.disableErrorHandling ?? false), useVuetifyValidation: toRef(() => props.useVuetifyValidation ?? false), label: toRef(() => props.label ?? ''), rules: toRef(() => props.rules), customRules: computed(() => [...defaultRules.value, ...(props.customRules ?? [])]), customWarningRules: toRef(() => props.customWarningRules ?? []), customSuccessRules: toRef(() => props.customSuccessRules ?? []), errorMessages: toRef(() => props.errorMessages ?? null), warningMessages: toRef(() => props.warningMessages ?? null), successMessages: toRef(() => props.successMessages ?? null), hasErrorProp: toRef(() => props.hasError ?? false), hasWarningProp: toRef(() => props.hasWarning ?? false), hasSuccessProp: toRef(() => props.hasSuccess ?? false), maxErrors: toRef(() => props.maxErrors ?? 1), focused: focusedRef, }) const validateOnSubmit = async (): Promise => { return await validate() } return { validate, validateOnSubmit, clearValidation, errors, warnings, successes, hasError, hasWarning, hasSuccess, defaultRules, focused: focusedRef, } }