@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.
Files changed (51) hide show
  1. package/dist/components/form-renderer/ConfirmationModal.d.ts +20 -0
  2. package/dist/components/form-renderer/ConfirmationModal.d.ts.map +1 -0
  3. package/dist/components/form-renderer/ConfirmationModal.js +79 -0
  4. package/dist/components/form-renderer/FormActions.d.ts +23 -0
  5. package/dist/components/form-renderer/FormActions.d.ts.map +1 -0
  6. package/dist/components/form-renderer/FormActions.js +116 -0
  7. package/dist/components/form-renderer/FormNavigationButtons.d.ts +23 -0
  8. package/dist/components/form-renderer/FormNavigationButtons.d.ts.map +1 -0
  9. package/dist/components/form-renderer/FormNavigationButtons.js +35 -0
  10. package/dist/components/form-renderer/FormProgress.d.ts +19 -0
  11. package/dist/components/form-renderer/FormProgress.d.ts.map +1 -0
  12. package/dist/components/form-renderer/FormProgress.js +26 -0
  13. package/dist/components/form-renderer/FormRenderer.d.ts +39 -0
  14. package/dist/components/form-renderer/FormRenderer.d.ts.map +1 -0
  15. package/dist/components/form-renderer/FormRenderer.js +113 -0
  16. package/dist/components/form-renderer/FormRendererContext.d.ts +109 -0
  17. package/dist/components/form-renderer/FormRendererContext.d.ts.map +1 -0
  18. package/dist/components/form-renderer/FormRendererContext.js +114 -0
  19. package/dist/components/form-renderer/GroupeInstanceTabs.d.ts +18 -0
  20. package/dist/components/form-renderer/GroupeInstanceTabs.d.ts.map +1 -0
  21. package/dist/components/form-renderer/GroupeInstanceTabs.js +174 -0
  22. package/dist/components/form-renderer/ValidationModal.d.ts +25 -0
  23. package/dist/components/form-renderer/ValidationModal.d.ts.map +1 -0
  24. package/dist/components/form-renderer/ValidationModal.js +37 -0
  25. package/dist/components/form-renderer/index.d.ts +19 -0
  26. package/dist/components/form-renderer/index.d.ts.map +1 -0
  27. package/dist/components/form-renderer/index.js +24 -0
  28. package/dist/hooks/useFormInstances.d.ts +87 -0
  29. package/dist/hooks/useFormInstances.d.ts.map +1 -0
  30. package/dist/hooks/useFormInstances.js +197 -0
  31. package/dist/hooks/useFormNavigation.d.ts +72 -0
  32. package/dist/hooks/useFormNavigation.d.ts.map +1 -0
  33. package/dist/hooks/useFormNavigation.js +147 -0
  34. package/dist/hooks/useFormRenderer.d.ts +87 -0
  35. package/dist/hooks/useFormRenderer.d.ts.map +1 -0
  36. package/dist/hooks/useFormRenderer.js +177 -0
  37. package/dist/hooks/useFormValidation.d.ts +50 -0
  38. package/dist/hooks/useFormValidation.d.ts.map +1 -0
  39. package/dist/hooks/useFormValidation.js +175 -0
  40. package/dist/index.d.ts +14 -1
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +21 -0
  43. package/dist/lib/__tests__/date-functions.test.d.ts +5 -0
  44. package/dist/lib/__tests__/date-functions.test.d.ts.map +1 -0
  45. package/dist/lib/__tests__/date-functions.test.js +184 -0
  46. package/dist/lib/utils/groupeInstanceManager.d.ts +88 -0
  47. package/dist/lib/utils/groupeInstanceManager.d.ts.map +1 -0
  48. package/dist/lib/utils/groupeInstanceManager.js +606 -0
  49. package/dist/types/form-renderer.d.ts +115 -1
  50. package/dist/types/form-renderer.d.ts.map +1 -1
  51. 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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
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,5 @@
1
+ /**
2
+ * Tests unitaires pour les fonctions de date du conditionEngine
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=date-functions.test.d.ts.map
@@ -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"}