@rsuci/shared-form-components 1.0.29 → 1.0.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/form-renderer/ConfirmationModal.d.ts +20 -0
- package/dist/components/form-renderer/ConfirmationModal.d.ts.map +1 -0
- package/dist/components/form-renderer/ConfirmationModal.js +79 -0
- package/dist/components/form-renderer/FormActions.d.ts +23 -0
- package/dist/components/form-renderer/FormActions.d.ts.map +1 -0
- package/dist/components/form-renderer/FormActions.js +116 -0
- package/dist/components/form-renderer/FormNavigationButtons.d.ts +23 -0
- package/dist/components/form-renderer/FormNavigationButtons.d.ts.map +1 -0
- package/dist/components/form-renderer/FormNavigationButtons.js +35 -0
- package/dist/components/form-renderer/FormProgress.d.ts +19 -0
- package/dist/components/form-renderer/FormProgress.d.ts.map +1 -0
- package/dist/components/form-renderer/FormProgress.js +26 -0
- package/dist/components/form-renderer/FormRenderer.d.ts +39 -0
- package/dist/components/form-renderer/FormRenderer.d.ts.map +1 -0
- package/dist/components/form-renderer/FormRenderer.js +113 -0
- package/dist/components/form-renderer/FormRendererContext.d.ts +109 -0
- package/dist/components/form-renderer/FormRendererContext.d.ts.map +1 -0
- package/dist/components/form-renderer/FormRendererContext.js +114 -0
- package/dist/components/form-renderer/GroupeInstanceTabs.d.ts +18 -0
- package/dist/components/form-renderer/GroupeInstanceTabs.d.ts.map +1 -0
- package/dist/components/form-renderer/GroupeInstanceTabs.js +174 -0
- package/dist/components/form-renderer/ValidationModal.d.ts +25 -0
- package/dist/components/form-renderer/ValidationModal.d.ts.map +1 -0
- package/dist/components/form-renderer/ValidationModal.js +37 -0
- package/dist/components/form-renderer/index.d.ts +19 -0
- package/dist/components/form-renderer/index.d.ts.map +1 -0
- package/dist/components/form-renderer/index.js +24 -0
- package/dist/hooks/useFormInstances.d.ts +87 -0
- package/dist/hooks/useFormInstances.d.ts.map +1 -0
- package/dist/hooks/useFormInstances.js +197 -0
- package/dist/hooks/useFormNavigation.d.ts +72 -0
- package/dist/hooks/useFormNavigation.d.ts.map +1 -0
- package/dist/hooks/useFormNavigation.js +147 -0
- package/dist/hooks/useFormRenderer.d.ts +87 -0
- package/dist/hooks/useFormRenderer.d.ts.map +1 -0
- package/dist/hooks/useFormRenderer.js +177 -0
- package/dist/hooks/useFormValidation.d.ts +50 -0
- package/dist/hooks/useFormValidation.d.ts.map +1 -0
- package/dist/hooks/useFormValidation.js +175 -0
- package/dist/index.d.ts +14 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -0
- package/dist/lib/__tests__/date-functions.test.d.ts +5 -0
- package/dist/lib/__tests__/date-functions.test.d.ts.map +1 -0
- package/dist/lib/__tests__/date-functions.test.js +184 -0
- package/dist/lib/utils/groupeInstanceManager.d.ts +88 -0
- package/dist/lib/utils/groupeInstanceManager.d.ts.map +1 -0
- package/dist/lib/utils/groupeInstanceManager.js +606 -0
- package/dist/types/form-renderer.d.ts +115 -1
- package/dist/types/form-renderer.d.ts.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook principal pour le rendu des formulaires d'enquête
|
|
3
|
+
* Combine navigation, validation et gestion des instances
|
|
4
|
+
* RSU v2 - Package Partagé
|
|
5
|
+
*/
|
|
6
|
+
import { useState, useCallback, useEffect, useMemo } from 'react';
|
|
7
|
+
import { useFormNavigation } from './useFormNavigation';
|
|
8
|
+
import { useFormValidation } from './useFormValidation';
|
|
9
|
+
import { useFormInstances } from './useFormInstances';
|
|
10
|
+
/**
|
|
11
|
+
* Hook principal pour gérer un formulaire d'enquête
|
|
12
|
+
*
|
|
13
|
+
* @param formulaire - Le formulaire complet
|
|
14
|
+
* @param enquete - L'instance d'enquête (optionnel pour nouvelle enquête)
|
|
15
|
+
* @param options - Options de configuration
|
|
16
|
+
* @returns Objet contenant tout l'état et les fonctions nécessaires
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```tsx
|
|
20
|
+
* const formRenderer = useFormRenderer(formulaire, enquete, {
|
|
21
|
+
* config: { mode: 'admin', features: { saveDraft: true } },
|
|
22
|
+
* onResponsesChange: (responses) => console.log('Changed:', responses)
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* // Utilisation
|
|
26
|
+
* const { navigation, validation, responses, updateResponse } = formRenderer;
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export function useFormRenderer(formulaire, enquete, options = { config: { mode: 'public' } }) {
|
|
30
|
+
const { config, initialResponses, onResponsesChange, onGroupChange, isVariableVisible: externalIsVariableVisible, debug = false } = options;
|
|
31
|
+
const mode = config.mode;
|
|
32
|
+
const features = config.features || {};
|
|
33
|
+
// === État de base ===
|
|
34
|
+
const [responses, setResponses] = useState(initialResponses || enquete?.reponses || {});
|
|
35
|
+
const [hasUnsavedChanges, setHasUnsavedChanges] = useState(false);
|
|
36
|
+
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
37
|
+
// === Calcul du mode lecture seule ===
|
|
38
|
+
const isReadOnly = useMemo(() => {
|
|
39
|
+
if (!enquete)
|
|
40
|
+
return false;
|
|
41
|
+
// En mode admin, certains statuts empêchent la modification
|
|
42
|
+
if (mode === 'admin') {
|
|
43
|
+
return ['VALIDE_ENQUETEUR', 'VALIDE_DR', 'FINALISE'].includes(enquete.statut);
|
|
44
|
+
}
|
|
45
|
+
// En mode public, on utilise le flag isReadOnly de l'enquête
|
|
46
|
+
return enquete.isReadOnly || false;
|
|
47
|
+
}, [enquete, mode]);
|
|
48
|
+
const isConsultationMode = enquete?.isReadOnly || false;
|
|
49
|
+
const effectiveDisabled = isReadOnly || isConsultationMode;
|
|
50
|
+
// === Utilitaires ===
|
|
51
|
+
const isControlVariable = useCallback((variable) => {
|
|
52
|
+
return formulaire?.groupes?.some(groupe => groupe.estMultiple && groupe.codeVariable === variable.code) || false;
|
|
53
|
+
}, [formulaire?.groupes]);
|
|
54
|
+
const getResponseKey = useCallback((variableCode, numeroMembre) => {
|
|
55
|
+
return numeroMembre ? `${variableCode}_${numeroMembre}` : variableCode;
|
|
56
|
+
}, []);
|
|
57
|
+
const getResponseValue = useCallback((variableCode, numeroMembre) => {
|
|
58
|
+
const key = getResponseKey(variableCode, numeroMembre);
|
|
59
|
+
return responses[key]?.valeur ?? null;
|
|
60
|
+
}, [responses, getResponseKey]);
|
|
61
|
+
// === Hook de gestion des instances ===
|
|
62
|
+
const instances = useFormInstances(formulaire?.groupes || [], responses, {
|
|
63
|
+
debug,
|
|
64
|
+
onGroupesUpdated: (groupes) => {
|
|
65
|
+
if (debug) {
|
|
66
|
+
console.log('[FormRenderer] Groupes mis à jour:', groupes.length);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
// === Hook de validation ===
|
|
71
|
+
const validation = useFormValidation({
|
|
72
|
+
isVariableVisible: externalIsVariableVisible || (() => true),
|
|
73
|
+
isControlVariable,
|
|
74
|
+
debug
|
|
75
|
+
});
|
|
76
|
+
// === Hook de navigation ===
|
|
77
|
+
const navigation = useFormNavigation(instances.groupesWithInstances.length > 0
|
|
78
|
+
? instances.groupesWithInstances
|
|
79
|
+
: formulaire?.groupes || [], {
|
|
80
|
+
onGroupChange,
|
|
81
|
+
validateBeforeNavigation: () => {
|
|
82
|
+
// Valider le groupe actuel avant de naviguer
|
|
83
|
+
return validation.validateCurrentGroupRequiredFields(navigation.currentGroup, responses);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// === Groupe et instance actuels ===
|
|
87
|
+
const currentGroup = useMemo(() => {
|
|
88
|
+
return instances.groupesWithInstances[navigation.navigationState.groupeIndex]
|
|
89
|
+
|| formulaire?.groupes?.[navigation.navigationState.groupeIndex];
|
|
90
|
+
}, [instances.groupesWithInstances, formulaire?.groupes, navigation.navigationState.groupeIndex]);
|
|
91
|
+
const currentInstance = useMemo(() => {
|
|
92
|
+
return currentGroup?.instances?.[navigation.navigationState.instanceIndex];
|
|
93
|
+
}, [currentGroup, navigation.navigationState.instanceIndex]);
|
|
94
|
+
// === Mise à jour des réponses ===
|
|
95
|
+
const updateResponse = useCallback((variableCode, value, variable, numeroMembre) => {
|
|
96
|
+
const responseKey = getResponseKey(variableCode, numeroMembre);
|
|
97
|
+
const newResponse = {
|
|
98
|
+
variableId: variable.id,
|
|
99
|
+
variableCode: variableCode,
|
|
100
|
+
valeur: value,
|
|
101
|
+
numeroMembre,
|
|
102
|
+
dateModification: new Date()
|
|
103
|
+
};
|
|
104
|
+
setResponses(prev => {
|
|
105
|
+
const updated = {
|
|
106
|
+
...prev,
|
|
107
|
+
[responseKey]: newResponse
|
|
108
|
+
};
|
|
109
|
+
if (onResponsesChange) {
|
|
110
|
+
onResponsesChange(updated);
|
|
111
|
+
}
|
|
112
|
+
return updated;
|
|
113
|
+
});
|
|
114
|
+
// Mettre à jour l'instance si c'est un groupe multiple
|
|
115
|
+
if (currentGroup?.estMultiple && currentInstance) {
|
|
116
|
+
currentInstance.reponses[variableCode] = newResponse;
|
|
117
|
+
currentInstance.estComplete = instances.isInstanceComplete(currentInstance, currentGroup);
|
|
118
|
+
}
|
|
119
|
+
// Mettre à jour les propriétés des groupes affectés
|
|
120
|
+
const affectedGroups = instances.groupesWithInstances.filter(g => g.codeVariable === variableCode);
|
|
121
|
+
if (affectedGroups.length > 0) {
|
|
122
|
+
affectedGroups.forEach(groupe => {
|
|
123
|
+
instances.updateGroupeProperties(groupe, {
|
|
124
|
+
...responses,
|
|
125
|
+
[responseKey]: newResponse
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
setHasUnsavedChanges(true);
|
|
130
|
+
}, [
|
|
131
|
+
getResponseKey,
|
|
132
|
+
currentGroup,
|
|
133
|
+
currentInstance,
|
|
134
|
+
instances,
|
|
135
|
+
responses,
|
|
136
|
+
onResponsesChange
|
|
137
|
+
]);
|
|
138
|
+
// === Synchronisation initiale ===
|
|
139
|
+
useEffect(() => {
|
|
140
|
+
if (formulaire?.groupes?.length && Object.keys(responses).length > 0) {
|
|
141
|
+
const initialized = instances.initializeGroupesWithInstances(formulaire.groupes, responses);
|
|
142
|
+
instances.setGroupesWithInstances(initialized);
|
|
143
|
+
}
|
|
144
|
+
}, [formulaire?.groupes]);
|
|
145
|
+
return {
|
|
146
|
+
// Navigation
|
|
147
|
+
navigation,
|
|
148
|
+
// Validation
|
|
149
|
+
validation,
|
|
150
|
+
// Instances
|
|
151
|
+
instances,
|
|
152
|
+
// Réponses
|
|
153
|
+
responses,
|
|
154
|
+
updateResponse,
|
|
155
|
+
setResponses,
|
|
156
|
+
// État
|
|
157
|
+
hasUnsavedChanges,
|
|
158
|
+
setHasUnsavedChanges,
|
|
159
|
+
isSubmitting,
|
|
160
|
+
setIsSubmitting,
|
|
161
|
+
effectiveDisabled,
|
|
162
|
+
isConsultationMode,
|
|
163
|
+
isReadOnly,
|
|
164
|
+
// Configuration
|
|
165
|
+
mode,
|
|
166
|
+
features,
|
|
167
|
+
// Groupes
|
|
168
|
+
currentGroup,
|
|
169
|
+
currentInstance,
|
|
170
|
+
groupesWithInstances: instances.groupesWithInstances,
|
|
171
|
+
// Utilitaires
|
|
172
|
+
isControlVariable,
|
|
173
|
+
getResponseKey,
|
|
174
|
+
getResponseValue
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
export default useFormRenderer;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook de validation pour les formulaires d'enquête
|
|
3
|
+
* Gère la validation des variables, groupes et instances
|
|
4
|
+
* RSU v2 - Package Partagé
|
|
5
|
+
*/
|
|
6
|
+
import { GroupeFormulaire, VariableFormulaire, EnqueteReponse, ValidationError, ValidationResult } from '../types/enquete';
|
|
7
|
+
export interface UseFormValidationOptions {
|
|
8
|
+
/** Fonction pour vérifier si une variable est visible */
|
|
9
|
+
isVariableVisible?: (variable: VariableFormulaire) => boolean;
|
|
10
|
+
/** Fonction pour vérifier si une variable est de contrôle */
|
|
11
|
+
isControlVariable?: (variable: VariableFormulaire) => boolean;
|
|
12
|
+
/** Mode debug (affiche les logs de validation) */
|
|
13
|
+
debug?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface UseFormValidationResult {
|
|
16
|
+
/** Valide une variable individuelle */
|
|
17
|
+
validateVariable: (variable: VariableFormulaire, allResponses: Record<string, EnqueteReponse>) => boolean;
|
|
18
|
+
/** Valide un groupe complet */
|
|
19
|
+
validateGroup: (groupe: GroupeFormulaire, allResponses: Record<string, EnqueteReponse>) => ValidationResult;
|
|
20
|
+
/** Valide les champs obligatoires du groupe actuel */
|
|
21
|
+
validateCurrentGroupRequiredFields: (currentGroup: GroupeFormulaire | undefined, responses: Record<string, EnqueteReponse>) => boolean;
|
|
22
|
+
/** Valide que toutes les instances d'un groupe multiple sont complètes */
|
|
23
|
+
validateAllInstancesComplete: (groupe: GroupeFormulaire) => boolean;
|
|
24
|
+
/** Valide tous les groupes du formulaire */
|
|
25
|
+
validateAllGroups: (groupes: GroupeFormulaire[], responses: Record<string, EnqueteReponse>) => ValidationResult;
|
|
26
|
+
/** Récupère les erreurs de validation pour un groupe */
|
|
27
|
+
getGroupValidationErrors: (groupe: GroupeFormulaire, responses: Record<string, EnqueteReponse>) => ValidationError[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Hook pour gérer la validation dans un formulaire d'enquête
|
|
31
|
+
*
|
|
32
|
+
* @param options - Options de configuration
|
|
33
|
+
* @returns Objet contenant les fonctions de validation
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```tsx
|
|
37
|
+
* const {
|
|
38
|
+
* validateVariable,
|
|
39
|
+
* validateCurrentGroupRequiredFields,
|
|
40
|
+
* validateAllGroups
|
|
41
|
+
* } = useFormValidation({
|
|
42
|
+
* isVariableVisible: (v) => formTree.isVariableVisible(v.code),
|
|
43
|
+
* isControlVariable: (v) => groupes.some(g => g.codeVariable === v.code),
|
|
44
|
+
* debug: true
|
|
45
|
+
* });
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare function useFormValidation(options?: UseFormValidationOptions): UseFormValidationResult;
|
|
49
|
+
export default useFormValidation;
|
|
50
|
+
//# sourceMappingURL=useFormValidation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFormValidation.d.ts","sourceRoot":"","sources":["../../src/hooks/useFormValidation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,gBAAgB,EAEjB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,wBAAwB;IACvC,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC;IAC9D,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC;IAC9D,kDAAkD;IAClD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,uCAAuC;IACvC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,OAAO,CAAC;IAC1G,+BAA+B;IAC/B,aAAa,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,gBAAgB,CAAC;IAC5G,sDAAsD;IACtD,kCAAkC,EAAE,CAClC,YAAY,EAAE,gBAAgB,GAAG,SAAS,EAC1C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,KACtC,OAAO,CAAC;IACb,0EAA0E;IAC1E,4BAA4B,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC;IACpE,4CAA4C;IAC5C,iBAAiB,EAAE,CACjB,OAAO,EAAE,gBAAgB,EAAE,EAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,KACtC,gBAAgB,CAAC;IACtB,wDAAwD;IACxD,wBAAwB,EAAE,CACxB,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,KACtC,eAAe,EAAE,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,wBAA6B,GACrC,uBAAuB,CAyLzB;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook de validation pour les formulaires d'enquête
|
|
3
|
+
* Gère la validation des variables, groupes et instances
|
|
4
|
+
* RSU v2 - Package Partagé
|
|
5
|
+
*/
|
|
6
|
+
import { useCallback } from 'react';
|
|
7
|
+
import { GroupeInstanceManager } from '../lib/utils/groupeInstanceManager';
|
|
8
|
+
/**
|
|
9
|
+
* Hook pour gérer la validation dans un formulaire d'enquête
|
|
10
|
+
*
|
|
11
|
+
* @param options - Options de configuration
|
|
12
|
+
* @returns Objet contenant les fonctions de validation
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* const {
|
|
17
|
+
* validateVariable,
|
|
18
|
+
* validateCurrentGroupRequiredFields,
|
|
19
|
+
* validateAllGroups
|
|
20
|
+
* } = useFormValidation({
|
|
21
|
+
* isVariableVisible: (v) => formTree.isVariableVisible(v.code),
|
|
22
|
+
* isControlVariable: (v) => groupes.some(g => g.codeVariable === v.code),
|
|
23
|
+
* debug: true
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export function useFormValidation(options = {}) {
|
|
28
|
+
const { isVariableVisible = () => true, isControlVariable = () => false, debug = false } = options;
|
|
29
|
+
// Fonction utilitaire pour logger en mode debug
|
|
30
|
+
const log = useCallback((message, data) => {
|
|
31
|
+
if (debug) {
|
|
32
|
+
console.log(`[FormValidation] ${message}`, data || '');
|
|
33
|
+
}
|
|
34
|
+
}, [debug]);
|
|
35
|
+
/**
|
|
36
|
+
* Valide une variable individuelle selon les règles conditionnelles
|
|
37
|
+
*/
|
|
38
|
+
const validateVariable = useCallback((variable, allResponses) => {
|
|
39
|
+
const response = allResponses[variable.code];
|
|
40
|
+
const hasValue = response && response.valeur != null && response.valeur !== '';
|
|
41
|
+
// Étape 1: Variables non obligatoires → Toujours OK
|
|
42
|
+
if (!variable.estObligatoire) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
// Étape 2: Variables de contrôle → TOUJOURS requises (même si masquées)
|
|
46
|
+
if (isControlVariable(variable)) {
|
|
47
|
+
log('Validation variable de contrôle:', {
|
|
48
|
+
variableCode: variable.code,
|
|
49
|
+
hasValue,
|
|
50
|
+
isControlVariable: true
|
|
51
|
+
});
|
|
52
|
+
return Boolean(hasValue);
|
|
53
|
+
}
|
|
54
|
+
// Étape 3: Variables normales → Dépend de la visibilité
|
|
55
|
+
const isVisible = isVariableVisible(variable);
|
|
56
|
+
if (!isVisible) {
|
|
57
|
+
log('Variable obligatoire masquée ignorée:', {
|
|
58
|
+
variableCode: variable.code,
|
|
59
|
+
isVisible: false
|
|
60
|
+
});
|
|
61
|
+
return true; // Masquée = pas de validation
|
|
62
|
+
}
|
|
63
|
+
log('Validation variable normale:', {
|
|
64
|
+
variableCode: variable.code,
|
|
65
|
+
hasValue,
|
|
66
|
+
isVisible
|
|
67
|
+
});
|
|
68
|
+
return Boolean(hasValue);
|
|
69
|
+
}, [isControlVariable, isVariableVisible, log]);
|
|
70
|
+
/**
|
|
71
|
+
* Valide que toutes les instances d'un groupe multiple sont complètes
|
|
72
|
+
*/
|
|
73
|
+
const validateAllInstancesComplete = useCallback((groupe) => {
|
|
74
|
+
if (!groupe.estMultiple || !groupe.instances) {
|
|
75
|
+
return true; // Groupe normal, validation standard
|
|
76
|
+
}
|
|
77
|
+
// TOUS les onglets doivent être complets
|
|
78
|
+
return groupe.instances.every(instance => GroupeInstanceManager.isInstanceComplete(instance, groupe));
|
|
79
|
+
}, []);
|
|
80
|
+
/**
|
|
81
|
+
* Valide les champs obligatoires du groupe actuel
|
|
82
|
+
*/
|
|
83
|
+
const validateCurrentGroupRequiredFields = useCallback((currentGroup, responses) => {
|
|
84
|
+
if (!currentGroup || !currentGroup.variables)
|
|
85
|
+
return true;
|
|
86
|
+
if (currentGroup.estMultiple) {
|
|
87
|
+
// Pour les groupes multiples, TOUTES les instances doivent être complètes
|
|
88
|
+
return validateAllInstancesComplete(currentGroup);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Pour les groupes normaux, utiliser la validation conditionnelle
|
|
92
|
+
const requiredVariables = currentGroup.variables.filter(v => v.estObligatoire);
|
|
93
|
+
for (const variable of requiredVariables) {
|
|
94
|
+
if (!validateVariable(variable, responses)) {
|
|
95
|
+
log('Validation groupe actuel échouée:', {
|
|
96
|
+
variableCode: variable.code,
|
|
97
|
+
isControlVariable: isControlVariable(variable),
|
|
98
|
+
isVisible: isVariableVisible(variable)
|
|
99
|
+
});
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
}, [validateVariable, validateAllInstancesComplete, isControlVariable, isVariableVisible, log]);
|
|
106
|
+
/**
|
|
107
|
+
* Valide un groupe complet et retourne les erreurs
|
|
108
|
+
*/
|
|
109
|
+
const validateGroup = useCallback((groupe, allResponses) => {
|
|
110
|
+
const errors = [];
|
|
111
|
+
if (groupe.estMultiple) {
|
|
112
|
+
// Pour les groupes multiples, vérifier les instances
|
|
113
|
+
if (!validateAllInstancesComplete(groupe)) {
|
|
114
|
+
errors.push({
|
|
115
|
+
variableCode: groupe.code,
|
|
116
|
+
message: 'Toutes les instances du groupe doivent être complètes',
|
|
117
|
+
type: 'required'
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// Pour les groupes normaux
|
|
123
|
+
const requiredVariables = groupe.variables.filter(v => v.estObligatoire);
|
|
124
|
+
for (const variable of requiredVariables) {
|
|
125
|
+
if (!validateVariable(variable, allResponses)) {
|
|
126
|
+
errors.push({
|
|
127
|
+
variableCode: variable.code,
|
|
128
|
+
message: `Le champ "${variable.designation}" est obligatoire`,
|
|
129
|
+
type: 'required'
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
isValid: errors.length === 0,
|
|
136
|
+
errors
|
|
137
|
+
};
|
|
138
|
+
}, [validateVariable, validateAllInstancesComplete]);
|
|
139
|
+
/**
|
|
140
|
+
* Valide tous les groupes du formulaire
|
|
141
|
+
*/
|
|
142
|
+
const validateAllGroups = useCallback((groupes, responses) => {
|
|
143
|
+
const allErrors = [];
|
|
144
|
+
for (const groupe of groupes) {
|
|
145
|
+
const result = validateGroup(groupe, responses);
|
|
146
|
+
if (!result.isValid) {
|
|
147
|
+
allErrors.push(...result.errors);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
log('Validation de tous les groupes:', {
|
|
151
|
+
totalGroupes: groupes.length,
|
|
152
|
+
totalErrors: allErrors.length,
|
|
153
|
+
isValid: allErrors.length === 0
|
|
154
|
+
});
|
|
155
|
+
return {
|
|
156
|
+
isValid: allErrors.length === 0,
|
|
157
|
+
errors: allErrors
|
|
158
|
+
};
|
|
159
|
+
}, [validateGroup, log]);
|
|
160
|
+
/**
|
|
161
|
+
* Récupère les erreurs de validation pour un groupe
|
|
162
|
+
*/
|
|
163
|
+
const getGroupValidationErrors = useCallback((groupe, responses) => {
|
|
164
|
+
return validateGroup(groupe, responses).errors;
|
|
165
|
+
}, [validateGroup]);
|
|
166
|
+
return {
|
|
167
|
+
validateVariable,
|
|
168
|
+
validateGroup,
|
|
169
|
+
validateCurrentGroupRequiredFields,
|
|
170
|
+
validateAllInstancesComplete,
|
|
171
|
+
validateAllGroups,
|
|
172
|
+
getGroupValidationErrors
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
export default useFormValidation;
|
package/dist/index.d.ts
CHANGED
|
@@ -31,16 +31,29 @@ export { default as VillageInput } from './components/geographic/VillageInput';
|
|
|
31
31
|
export { default as RSUInput } from './components/selectors/RSUInput';
|
|
32
32
|
export { default as MenageInput } from './components/selectors/MenageInput';
|
|
33
33
|
export { default as EnqueteInput } from './components/selectors/EnqueteInput';
|
|
34
|
+
export { default as ConfirmationModal, type ConfirmationModalProps, type ConfirmationModalType } from './components/form-renderer/ConfirmationModal';
|
|
35
|
+
export { default as ValidationModal, type ValidationModalProps } from './components/form-renderer/ValidationModal';
|
|
36
|
+
export { default as GroupeInstanceTabs, type GroupeInstanceTabsProps } from './components/form-renderer/GroupeInstanceTabs';
|
|
37
|
+
export { FormRendererProvider, useFormRendererContext, useFormRendererNavigation, useFormRendererValidation, useFormRendererInstances, useFormRendererConfig, useFormRendererResponses, useFormRendererState, type FormRendererContextValue, type FormRendererProviderProps } from './components/form-renderer/FormRendererContext';
|
|
38
|
+
export { default as FormProgress, type FormProgressProps } from './components/form-renderer/FormProgress';
|
|
39
|
+
export { default as FormNavigationButtons, type FormNavigationButtonsProps } from './components/form-renderer/FormNavigationButtons';
|
|
40
|
+
export { default as FormActions, type FormActionsProps } from './components/form-renderer/FormActions';
|
|
41
|
+
export { default as FormRenderer, type FormRendererProps as UnifiedFormRendererProps } from './components/form-renderer/FormRenderer';
|
|
34
42
|
export type { EnqueteReponse, VariableFormulaire, GroupeFormulaire, FormulaireComplet, EnqueteInstance, GroupeInstance, VariableValue, VariableType, ComponentStyle, ValidationError, AutoAction, NavigationState } from './types/enquete';
|
|
35
43
|
export type { FormRendererServices, GeographicComponents, DistrictSelectorProps, RegionSelectorProps, DepartementSelectorProps, SousPrefectureSelectorProps, QuartierSelectorProps, VillageSelectorProps } from './types/services';
|
|
36
|
-
export type { FormRendererProps, GroupRendererProps, VariableRendererProps } from './types/form-renderer';
|
|
44
|
+
export type { FormRendererProps, GroupRendererProps, VariableRendererProps, FormRendererMode, FormRendererFeatures, FormRendererLabels, FormRendererConfig, FormRendererCallbacks, FormRendererUnifiedProps, DRValidationResult } from './types/form-renderer';
|
|
37
45
|
export type { VariableNodeState, GroupNodeState, JumpRange, JumpError, IFormTree, FormTreeOptions, JumpEvaluationResult } from './types/form-tree';
|
|
38
46
|
export { VariableValueConverter } from './lib/utils/variableValueConverter';
|
|
47
|
+
export { GroupeInstanceManager } from './lib/utils/groupeInstanceManager';
|
|
39
48
|
export { interpolateVariableLabel } from './lib/utils/interpolateVariableLabel';
|
|
40
49
|
export { ConditionEngine } from './lib/condition-engine';
|
|
41
50
|
export { RosterConditionEngine, type RosterConditionError, type RosterConditionErrorType, type RosterConditionValidationResult, type RosterVariableRef } from './lib/roster-condition-engine';
|
|
42
51
|
export { FormTree } from './lib/form-tree';
|
|
43
52
|
export { useFormTree, type UseFormTreeOptions, type UseFormTreeReturn } from './hooks/useFormTree';
|
|
53
|
+
export { useFormNavigation, type UseFormNavigationOptions, type UseFormNavigationResult } from './hooks/useFormNavigation';
|
|
54
|
+
export { useFormValidation, type UseFormValidationOptions, type UseFormValidationResult } from './hooks/useFormValidation';
|
|
55
|
+
export { useFormInstances, type UseFormInstancesOptions, type UseFormInstancesResult } from './hooks/useFormInstances';
|
|
56
|
+
export { useFormRenderer, type UseFormRendererOptions, type UseFormRendererResult } from './hooks/useFormRenderer';
|
|
44
57
|
export { cn } from './lib/utils/cn';
|
|
45
58
|
export { getStyleObject, getContainerStyle, applyComponentStyle } from './utils/styleUtils';
|
|
46
59
|
export { isComponentReadonly, isComponentDisabled, getReadonlyAttributes, getReadonlyClasses, readonlyClasses } from './utils/componentStateUtils';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAG5E,OAAO,EACL,OAAO,IAAI,gBAAgB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EACL,OAAO,IAAI,eAAe,EAC1B,KAAK,oBAAoB,EAC1B,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,OAAO,IAAI,WAAW,EACtB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACpB,MAAM,iCAAiC,CAAC;AAOzC,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGhE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAGrE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAG3E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAM5E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAC7F,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAM/E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -50,10 +50,26 @@ export { default as RSUInput } from './components/selectors/RSUInput';
|
|
|
50
50
|
export { default as MenageInput } from './components/selectors/MenageInput';
|
|
51
51
|
export { default as EnqueteInput } from './components/selectors/EnqueteInput';
|
|
52
52
|
// ========================================
|
|
53
|
+
// COMPOSANTS FORM RENDERER
|
|
54
|
+
// ========================================
|
|
55
|
+
export { default as ConfirmationModal } from './components/form-renderer/ConfirmationModal';
|
|
56
|
+
export { default as ValidationModal } from './components/form-renderer/ValidationModal';
|
|
57
|
+
export { default as GroupeInstanceTabs } from './components/form-renderer/GroupeInstanceTabs';
|
|
58
|
+
// Contexte et Provider FormRenderer
|
|
59
|
+
export { FormRendererProvider, useFormRendererContext, useFormRendererNavigation, useFormRendererValidation, useFormRendererInstances, useFormRendererConfig, useFormRendererResponses, useFormRendererState } from './components/form-renderer/FormRendererContext';
|
|
60
|
+
// Sous-composants du FormRenderer
|
|
61
|
+
export { default as FormProgress } from './components/form-renderer/FormProgress';
|
|
62
|
+
export { default as FormNavigationButtons } from './components/form-renderer/FormNavigationButtons';
|
|
63
|
+
export { default as FormActions } from './components/form-renderer/FormActions';
|
|
64
|
+
// Composant principal FormRenderer
|
|
65
|
+
export { default as FormRenderer } from './components/form-renderer/FormRenderer';
|
|
66
|
+
// ========================================
|
|
53
67
|
// UTILITAIRES
|
|
54
68
|
// ========================================
|
|
55
69
|
// Convertisseur de valeurs
|
|
56
70
|
export { VariableValueConverter } from './lib/utils/variableValueConverter';
|
|
71
|
+
// Gestionnaire d'instances multiples pour groupes
|
|
72
|
+
export { GroupeInstanceManager } from './lib/utils/groupeInstanceManager';
|
|
57
73
|
// Interpolation de libellés
|
|
58
74
|
export { interpolateVariableLabel } from './lib/utils/interpolateVariableLabel';
|
|
59
75
|
// Moteur de conditions
|
|
@@ -67,6 +83,11 @@ export { FormTree } from './lib/form-tree';
|
|
|
67
83
|
// ========================================
|
|
68
84
|
// Hook FormTree
|
|
69
85
|
export { useFormTree } from './hooks/useFormTree';
|
|
86
|
+
// Hooks FormRenderer
|
|
87
|
+
export { useFormNavigation } from './hooks/useFormNavigation';
|
|
88
|
+
export { useFormValidation } from './hooks/useFormValidation';
|
|
89
|
+
export { useFormInstances } from './hooks/useFormInstances';
|
|
90
|
+
export { useFormRenderer } from './hooks/useFormRenderer';
|
|
70
91
|
// Utilitaire CSS
|
|
71
92
|
export { cn } from './lib/utils/cn';
|
|
72
93
|
// ========================================
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-functions.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/date-functions.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|