@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,184 @@
1
+ /**
2
+ * Tests unitaires pour les fonctions de date du conditionEngine
3
+ */
4
+ import { calculateDateDiff, calculateDateAdd, parseDateString, isValidDateUnit } from '../utils/date-functions';
5
+ describe('date-functions', () => {
6
+ describe('calculateDateDiff', () => {
7
+ describe('différence en jours', () => {
8
+ it('devrait calculer la différence en jours entre deux dates', () => {
9
+ const date1 = new Date('2024-01-01');
10
+ const date2 = new Date('2024-01-31');
11
+ expect(calculateDateDiff(date1, date2, 'd')).toBe(30);
12
+ });
13
+ it('devrait retourner un nombre négatif si date2 < date1', () => {
14
+ const date1 = new Date('2024-01-31');
15
+ const date2 = new Date('2024-01-01');
16
+ expect(calculateDateDiff(date1, date2, 'd')).toBe(-30);
17
+ });
18
+ it('devrait retourner 0 pour la même date', () => {
19
+ const date = new Date('2024-01-15');
20
+ expect(calculateDateDiff(date, date, 'd')).toBe(0);
21
+ });
22
+ it('devrait calculer 365 jours pour une année non bissextile', () => {
23
+ const date1 = new Date('2023-01-01');
24
+ const date2 = new Date('2024-01-01');
25
+ expect(calculateDateDiff(date1, date2, 'd')).toBe(365);
26
+ });
27
+ it('devrait calculer 366 jours pour une année bissextile', () => {
28
+ const date1 = new Date('2024-01-01');
29
+ const date2 = new Date('2025-01-01');
30
+ expect(calculateDateDiff(date1, date2, 'd')).toBe(366);
31
+ });
32
+ });
33
+ describe('différence en mois', () => {
34
+ it('devrait calculer la différence en mois', () => {
35
+ const date1 = new Date('2024-01-15');
36
+ const date2 = new Date('2024-07-15');
37
+ expect(calculateDateDiff(date1, date2, 'm')).toBe(6);
38
+ });
39
+ it('devrait ajuster si le jour du mois n\'est pas atteint', () => {
40
+ const date1 = new Date('2024-01-31');
41
+ const date2 = new Date('2024-02-15');
42
+ expect(calculateDateDiff(date1, date2, 'm')).toBe(0);
43
+ });
44
+ it('devrait retourner 12 mois pour une année exacte', () => {
45
+ const date1 = new Date('2024-01-15');
46
+ const date2 = new Date('2025-01-15');
47
+ expect(calculateDateDiff(date1, date2, 'm')).toBe(12);
48
+ });
49
+ });
50
+ describe('différence en années', () => {
51
+ it('devrait calculer la différence en années avec anniversaire passé', () => {
52
+ const date1 = new Date('2000-06-15');
53
+ const date2 = new Date('2024-08-15');
54
+ expect(calculateDateDiff(date1, date2, 'y')).toBe(24);
55
+ });
56
+ it('devrait retourner 23 si l\'anniversaire n\'est pas encore passé', () => {
57
+ const date1 = new Date('2000-12-31');
58
+ const date2 = new Date('2024-01-01');
59
+ expect(calculateDateDiff(date1, date2, 'y')).toBe(23);
60
+ });
61
+ it('devrait retourner l\'âge exact le jour de l\'anniversaire', () => {
62
+ const date1 = new Date('2000-06-15');
63
+ const date2 = new Date('2024-06-15');
64
+ expect(calculateDateDiff(date1, date2, 'y')).toBe(24);
65
+ });
66
+ it('devrait retourner 0 pour moins d\'un an', () => {
67
+ const date1 = new Date('2024-01-01');
68
+ const date2 = new Date('2024-06-01');
69
+ expect(calculateDateDiff(date1, date2, 'y')).toBe(0);
70
+ });
71
+ });
72
+ describe('gestion des erreurs', () => {
73
+ it('devrait retourner null pour date1 null', () => {
74
+ expect(calculateDateDiff(null, new Date(), 'd')).toBe(null);
75
+ });
76
+ it('devrait retourner null pour date2 null', () => {
77
+ expect(calculateDateDiff(new Date(), null, 'd')).toBe(null);
78
+ });
79
+ it('devrait retourner null pour date invalide', () => {
80
+ expect(calculateDateDiff(new Date('invalid'), new Date(), 'd')).toBe(null);
81
+ });
82
+ it('devrait retourner null pour unité invalide', () => {
83
+ expect(calculateDateDiff(new Date(), new Date(), 'x')).toBe(null);
84
+ });
85
+ });
86
+ });
87
+ describe('calculateDateAdd', () => {
88
+ describe('ajout de jours', () => {
89
+ it('devrait ajouter des jours à une date', () => {
90
+ const date = new Date('2024-01-01');
91
+ const result = calculateDateAdd(date, 30, 'd');
92
+ expect(result?.toISOString().slice(0, 10)).toBe('2024-01-31');
93
+ });
94
+ it('devrait soustraire des jours avec une valeur négative', () => {
95
+ const date = new Date('2024-01-15');
96
+ const result = calculateDateAdd(date, -7, 'd');
97
+ expect(result?.toISOString().slice(0, 10)).toBe('2024-01-08');
98
+ });
99
+ it('devrait gérer le passage de mois', () => {
100
+ const date = new Date('2024-01-31');
101
+ const result = calculateDateAdd(date, 1, 'd');
102
+ expect(result?.toISOString().slice(0, 10)).toBe('2024-02-01');
103
+ });
104
+ });
105
+ describe('ajout de mois', () => {
106
+ it('devrait ajouter des mois à une date', () => {
107
+ const date = new Date('2024-01-15');
108
+ const result = calculateDateAdd(date, 6, 'm');
109
+ expect(result?.toISOString().slice(0, 10)).toBe('2024-07-15');
110
+ });
111
+ it('devrait soustraire des mois avec une valeur négative', () => {
112
+ const date = new Date('2024-07-15');
113
+ const result = calculateDateAdd(date, -6, 'm');
114
+ expect(result?.toISOString().slice(0, 10)).toBe('2024-01-15');
115
+ });
116
+ it('devrait gérer le passage d\'année', () => {
117
+ const date = new Date('2024-11-15');
118
+ const result = calculateDateAdd(date, 3, 'm');
119
+ expect(result?.toISOString().slice(0, 10)).toBe('2025-02-15');
120
+ });
121
+ });
122
+ describe('ajout d\'années', () => {
123
+ it('devrait ajouter des années à une date', () => {
124
+ const date = new Date('2024-01-01');
125
+ const result = calculateDateAdd(date, 1, 'y');
126
+ expect(result?.toISOString().slice(0, 10)).toBe('2025-01-01');
127
+ });
128
+ it('devrait soustraire des années avec une valeur négative', () => {
129
+ const date = new Date('2024-01-01');
130
+ const result = calculateDateAdd(date, -5, 'y');
131
+ expect(result?.toISOString().slice(0, 10)).toBe('2019-01-01');
132
+ });
133
+ });
134
+ describe('gestion des erreurs', () => {
135
+ it('devrait retourner null pour date null', () => {
136
+ expect(calculateDateAdd(null, 30, 'd')).toBe(null);
137
+ });
138
+ it('devrait retourner null pour date invalide', () => {
139
+ expect(calculateDateAdd(new Date('invalid'), 30, 'd')).toBe(null);
140
+ });
141
+ it('devrait retourner null pour valeur NaN', () => {
142
+ expect(calculateDateAdd(new Date(), NaN, 'd')).toBe(null);
143
+ });
144
+ it('devrait retourner null pour unité invalide', () => {
145
+ expect(calculateDateAdd(new Date(), 30, 'x')).toBe(null);
146
+ });
147
+ });
148
+ });
149
+ describe('parseDateString', () => {
150
+ it('devrait parser une date ISO', () => {
151
+ const result = parseDateString('2024-01-15');
152
+ expect(result?.toISOString().slice(0, 10)).toBe('2024-01-15');
153
+ });
154
+ it('devrait parser une date ISO avec heure', () => {
155
+ const result = parseDateString('2024-01-15T10:30:00');
156
+ expect(result).not.toBe(null);
157
+ });
158
+ it('devrait parser un timestamp', () => {
159
+ const timestamp = new Date('2024-01-15').getTime().toString();
160
+ const result = parseDateString(timestamp);
161
+ expect(result).not.toBe(null);
162
+ });
163
+ it('devrait retourner null pour une chaîne vide', () => {
164
+ expect(parseDateString('')).toBe(null);
165
+ });
166
+ it('devrait retourner null pour une date invalide', () => {
167
+ expect(parseDateString('invalid')).toBe(null);
168
+ });
169
+ });
170
+ describe('isValidDateUnit', () => {
171
+ it('devrait retourner true pour "d"', () => {
172
+ expect(isValidDateUnit('d')).toBe(true);
173
+ });
174
+ it('devrait retourner true pour "m"', () => {
175
+ expect(isValidDateUnit('m')).toBe(true);
176
+ });
177
+ it('devrait retourner true pour "y"', () => {
178
+ expect(isValidDateUnit('y')).toBe(true);
179
+ });
180
+ it('devrait retourner false pour une unité invalide', () => {
181
+ expect(isValidDateUnit('x')).toBe(false);
182
+ });
183
+ });
184
+ });
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Gestionnaire des instances multiples pour les groupes d'enquête
3
+ * RSU v2 - Moteur de Rendu des Formulaires d'Enquête
4
+ */
5
+ import { GroupeFormulaire, GroupeInstance, EnqueteReponse, ConstraintValidationResult } from '../../types/enquete';
6
+ export declare class GroupeInstanceManager {
7
+ /**
8
+ * Récupère le nombre maximum d'instances autorisées depuis la variable de contrôle
9
+ * RÈGLE DE PROTECTION : Ne jamais permettre de réduire sous le nombre d'instances existantes
10
+ */
11
+ static getMaxInstances(groupe: GroupeFormulaire, responses: Record<string, EnqueteReponse>): number;
12
+ /**
13
+ * Récupère le nombre minimum d'instances (basé sur les instances existantes)
14
+ */
15
+ static getMinInstances(groupe: GroupeFormulaire): number;
16
+ /**
17
+ * Compte le nombre d'instances existantes pour un groupe
18
+ */
19
+ static getInstancesCount(groupe: GroupeFormulaire, responses: Record<string, EnqueteReponse>): number;
20
+ /**
21
+ * Crée une nouvelle instance pour un groupe multiple
22
+ */
23
+ static createInstance(groupe: GroupeFormulaire, numeroInstance: number): GroupeInstance;
24
+ /**
25
+ * Initialise les instances pour un groupe multiple
26
+ */
27
+ static initializeInstances(groupe: GroupeFormulaire, responses: Record<string, EnqueteReponse>): GroupeInstance[];
28
+ /**
29
+ * Vérifie si une instance est complètement renseignée
30
+ */
31
+ static isInstanceComplete(instance: GroupeInstance, groupe: GroupeFormulaire): boolean;
32
+ /**
33
+ * Valide si on peut ajouter une nouvelle instance
34
+ */
35
+ static canAddInstance(groupe: GroupeFormulaire, responses: Record<string, EnqueteReponse>): ConstraintValidationResult;
36
+ /**
37
+ * Valide si on peut supprimer une instance
38
+ */
39
+ static canRemoveInstance(groupe: GroupeFormulaire, responses: Record<string, EnqueteReponse>): ConstraintValidationResult;
40
+ /**
41
+ * Valide si on peut modifier la variable de contrôle
42
+ */
43
+ static canModifyControlVariable(variableCode: string, newValue: number, groupesMultiples: GroupeFormulaire[], responses: Record<string, EnqueteReponse>): ConstraintValidationResult;
44
+ /**
45
+ * Ajoute une nouvelle instance à un groupe
46
+ */
47
+ static addInstance(groupe: GroupeFormulaire, responses: Record<string, EnqueteReponse>): {
48
+ success: boolean;
49
+ instance?: GroupeInstance;
50
+ error?: string;
51
+ };
52
+ /**
53
+ * Supprime une instance d'un groupe
54
+ */
55
+ static removeInstance(groupe: GroupeFormulaire, instanceNumber: number, responses: Record<string, EnqueteReponse>): {
56
+ success: boolean;
57
+ error?: string;
58
+ };
59
+ /**
60
+ * Met à jour les propriétés calculées d'un groupe multiple
61
+ */
62
+ static updateGroupeProperties(groupe: GroupeFormulaire, responses: Record<string, EnqueteReponse>): void;
63
+ /**
64
+ * Synchronise les réponses d'une instance avec le store global
65
+ */
66
+ static syncInstanceResponses(instance: GroupeInstance, groupe: GroupeFormulaire, globalResponses: Record<string, EnqueteReponse>): void;
67
+ /**
68
+ * Valide la navigation vers l'instance suivante
69
+ */
70
+ static canNavigateToNextInstance(currentInstance: GroupeInstance, groupe: GroupeFormulaire): ConstraintValidationResult;
71
+ /**
72
+ * Trouve la prochaine instance incomplète dans un groupe
73
+ */
74
+ static findNextIncompleteInstance(groupe: GroupeFormulaire): GroupeInstance | null;
75
+ /**
76
+ * Calcule la progression d'un groupe multiple
77
+ */
78
+ static calculateGroupProgress(groupe: GroupeFormulaire): {
79
+ completedInstances: number;
80
+ totalInstances: number;
81
+ progressPercentage: number;
82
+ };
83
+ /**
84
+ * Réorganise les numéros d'instances après suppression
85
+ */
86
+ static reorderInstances(groupe: GroupeFormulaire, responses: Record<string, EnqueteReponse>): void;
87
+ }
88
+ //# sourceMappingURL=groupeInstanceManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"groupeInstanceManager.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/groupeInstanceManager.ts"],"names":[],"mappings":"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"}