const RuleGeneralType = `'required' | 'custom'` const StringRuleType = `'minLength' | 'maxLength' | 'exactLength' | 'email' | 'matchPattern'` const NumberRuleType = `'min' | 'max'` const DateRuleType = `'noWeekend' | 'noBeforeToday' | 'notAfterToday' | 'notBeforeDate' | 'notAfterDate' | 'dateExact' | 'isHolidayDay'` function generateBuiltInRuleType(type: 'base' | 'date' | 'number' | 'string' | 'all' = 'all') { switch (type) { case 'base': return RuleGeneralType case 'date': return `${RuleGeneralType} | ${DateRuleType}` case 'number': return `${RuleGeneralType} | ${NumberRuleType}` case 'string': return `${RuleGeneralType} | ${StringRuleType}` case 'all': return `${RuleGeneralType} | ${NumberRuleType} | ${StringRuleType} | ${DateRuleType}` } } export function getValidationDocumentation(type: 'base' | 'date' | 'number' | 'string' | 'all' = 'all') { const builtInRuleType = generateBuiltInRuleType(type) return { readonly: { description: 'Permet de rendre le champ en lecture seule, le champ deviens grisé.', control: 'boolean', table: { type: { summary: 'boolean' }, defaultValue: { summary: 'false' }, category: 'props', }, }, disabled: { description: 'Désactive le champ sans changement visuel pour l\'utilisateur.', control: 'boolean', table: { type: { summary: 'boolean' }, defaultValue: { summary: 'false' }, category: 'props', }, }, required: { description: 'Indique que le champ est requis.', control: 'boolean', table: { type: { summary: 'boolean' }, defaultValue: { summary: 'false' }, category: 'props', }, }, isValidateOnBlur: { description: 'Détermine si la validation doit être déclenchée lors de la saisie ou du blur de l\'input.', control: 'boolean', table: { type: { summary: 'boolean' }, defaultValue: { summary: 'true' }, category: 'props', }, }, showSuccessMessages: { description: 'Affiche les messages de succès lorsque la validation est réussie. Si la prop est à `false` cela cache uniquement les messages texte, l\'état visuel reste actif.', control: 'boolean', table: { type: { summary: 'boolean' }, defaultValue: { summary: 'false' }, category: 'props', }, }, disableErrorHandling: { description: 'Désactive la gestion des erreurs, utile lorsque vous souhaitez gérer les erreurs manuellement.', control: 'boolean', table: { type: { summary: 'boolean' }, defaultValue: { summary: 'false' }, category: 'props', }, }, useVuetifyValidation: { description: 'Indique si la validation doit être gérée par Vuetify (true) ou par Synapse (false).', control: 'boolean', table: { type: { summary: 'boolean' }, defaultValue: { summary: 'false' }, category: 'props', }, }, label: { description: 'Le label du champ.', control: 'text', table: { type: { summary: 'string' }, category: 'props', }, }, rules: { description: 'Les règles de validation Vuetify à appliquer au champ si useVuetifyValidation est true.', control: 'object', table: { type: { summary: 'array', detail: ` (value: unknown) => boolean | string `, }, category: 'props', }, }, customRules: { description: 'Les règles de validation personnalisées d\'erreur (bloquantes) à appliquer au champ. Elles sont évaluées à partir de la valeur du champ.', control: 'object', table: { type: { summary: 'array', detail: ` { type: ${builtInRuleType}, options: { validate: (value: unknown) => boolean | string, message: string, [key: string]: unknown } } `, }, category: 'props', }, }, customWarningRules: { description: 'Les règles de validation personnalisées d\'avertissement (non bloquantes) à appliquer au champ. Elles sont évaluées à partir de la valeur du champ.', control: 'object', table: { type: { summary: 'array', detail: ` { type: ${builtInRuleType}, options: { validate: (value: unknown) => boolean | string, warningMessage: string, [key: string]: unknown } } `, }, category: 'props', }, }, customSuccessRules: { description: 'Les règles de validation personnalisées de succès à appliquer au champ. Elles sont évaluées à partir de la valeur du champ.', control: 'object', table: { type: { summary: 'array', detail: ` { type: ${builtInRuleType}, options: { validate: (value: unknown) => boolean | string, successMessage: string, [key: string]: unknown } } `, }, category: 'props', }, }, errorMessages: { description: 'Permet d\'injecter des messages d\'erreur depuis le parent. Aucun calcul de validation n\'est exécuté.', control: 'object', table: { type: { summary: 'array' }, category: 'props', }, }, warningMessages: { description: 'Permet d\'injecter des messages d\'avertissement depuis le parent. Aucun calcul de validation n\'est exécuté.', control: 'object', table: { type: { summary: 'array' }, category: 'props', }, }, successMessages: { description: 'Permet d\'injecter des messages de succès depuis le parent. Aucun calcul de validation n\'est exécuté.', control: 'object', table: { type: { summary: 'array' }, category: 'props', }, }, hasError: { description: 'Indique si le champ a une erreur, peut être utilisé pour forcer l\'état d\'erreur.', control: 'boolean', table: { type: { summary: 'boolean' }, category: 'props', }, }, hasWarning: { description: 'Indique si le champ a un avertissement, peut être utilisé pour forcer l\'état d\'avertissement.', control: 'boolean', table: { type: { summary: 'boolean' }, category: 'props', }, }, hasSuccess: { description: 'Indique si le champ a un succès, peut être utilisé pour forcer l\'état de succès.', control: 'boolean', table: { type: { summary: 'boolean' }, category: 'props', }, }, hideDetails: { description: 'Masque la section des détails (messages d\'erreur, compteur)', control: 'boolean', table: { type: { summary: 'boolean' }, defaultValue: { summary: 'false' }, category: 'props', }, }, maxErrors: { description: 'Le nombre maximum d\'erreurs à afficher, applicable uniquement si useVuetifyValidation est true.', control: 'number', table: { type: { summary: 'number' }, category: 'props', }, }, errors: { description: 'Tableau réactif contenant tous les messages d\'erreur. Combine les erreurs injectées via errorMessages et celles générées par la validation. Les doublons sont supprimés et le tableau est limité selon maxErrors. Accessible via template ref du composant.', table: { type: { summary: 'Readonly>' }, category: 'expose', }, }, warnings: { description: 'Tableau réactif contenant tous les messages d\'avertissement. Combine les avertissements injectés via warningMessages et ceux générés par customWarningRules. Les doublons sont supprimés et le tableau est limité selon maxErrors. Accessible via template ref du composant.', table: { type: { summary: 'Readonly>' }, category: 'expose', }, }, successes: { description: 'Tableau réactif contenant tous les messages de succès. Combine les succès injectés via successMessages et ceux générés par customSuccessRules. Les doublons sont supprimés et le tableau est limité selon maxErrors. Accessible via template ref du composant.', table: { type: { summary: 'Readonly>' }, category: 'expose', }, }, hasErrorExpose: { name: 'hasError', description: 'Booléen réactif indiquant si le champ est en erreur (erreur de validation ou erreur injectée). Accessible via template ref du composant.', table: { type: { summary: 'Readonly>' }, category: 'expose', }, }, hasWarningExpose: { name: 'hasWarning', description: 'Booléen réactif indiquant si le champ est en avertissement. Accessible via template ref du composant.', table: { type: { summary: 'Readonly>' }, category: 'expose', }, }, hasSuccessExpose: { name: 'hasSuccess', description: 'Booléen réactif indiquant si le champ est en succès. Accessible via template ref du composant.', table: { type: { summary: 'Readonly>' }, category: 'expose', }, }, clearValidation: { description: 'Méthode pour réinitialiser l\'état de validation du composant', table: { type: { summary: '() => void' }, category: 'expose', }, }, validateOnSubmit: { description: 'Méthode pour déclencher la validation du composant', table: { type: { summary: '() => Promise' }, category: 'expose', }, }, } as const }