@rsuci/shared-form-components 1.0.86 → 1.0.88
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/FormRenderer.d.ts.map +1 -1
- package/dist/components/form-renderer/FormRenderer.js +24 -33
- package/dist/components/form-renderer/GroupeInstanceTabs.d.ts +2 -2
- package/dist/components/form-renderer/GroupeInstanceTabs.d.ts.map +1 -1
- package/dist/components/form-renderer/GroupeInstanceTabs.js +4 -22
- package/dist/hooks/useFormInstances.js +8 -8
- package/dist/hooks/useFormRenderer.d.ts.map +1 -1
- package/dist/hooks/useFormRenderer.js +55 -12
- package/dist/lib/__tests__/groupeInstanceManager.test.d.ts +6 -0
- package/dist/lib/__tests__/groupeInstanceManager.test.d.ts.map +1 -0
- package/dist/lib/__tests__/groupeInstanceManager.test.js +454 -0
- package/dist/lib/utils/groupeInstanceManager.d.ts +15 -4
- package/dist/lib/utils/groupeInstanceManager.d.ts.map +1 -1
- package/dist/lib/utils/groupeInstanceManager.js +102 -207
- package/dist/lib/utils/interpolateVariableLabel.d.ts.map +1 -1
- package/dist/lib/utils/interpolateVariableLabel.js +1 -35
- package/package.json +1 -1
|
@@ -9,19 +9,8 @@ export class GroupeInstanceManager {
|
|
|
9
9
|
*/
|
|
10
10
|
static getMaxInstances(groupe, responses) {
|
|
11
11
|
if (!groupe.estMultiple || !groupe.codeVariable) {
|
|
12
|
-
console.log('GroupeInstanceManager.getMaxInstances - Groupe non multiple ou sans variable de contrôle:', {
|
|
13
|
-
estMultiple: groupe.estMultiple,
|
|
14
|
-
codeVariable: groupe.codeVariable,
|
|
15
|
-
groupeCode: groupe.code
|
|
16
|
-
});
|
|
17
12
|
return 1;
|
|
18
13
|
}
|
|
19
|
-
console.log('GroupeInstanceManager.getMaxInstances - Recherche variable de contrôle:', {
|
|
20
|
-
groupeCode: groupe.code,
|
|
21
|
-
codeVariable: groupe.codeVariable,
|
|
22
|
-
responsesKeys: Object.keys(responses),
|
|
23
|
-
responses: responses
|
|
24
|
-
});
|
|
25
14
|
// Chercher la réponse de la variable de contrôle
|
|
26
15
|
// D'abord essayer avec la clé directe
|
|
27
16
|
let controlResponse = responses[groupe.codeVariable];
|
|
@@ -31,17 +20,8 @@ export class GroupeInstanceManager {
|
|
|
31
20
|
if (foundResponse) {
|
|
32
21
|
controlResponse = foundResponse;
|
|
33
22
|
}
|
|
34
|
-
console.log('GroupeInstanceManager.getMaxInstances - Recherche par variableCode:', {
|
|
35
|
-
found: !!foundResponse,
|
|
36
|
-
controlResponse: foundResponse
|
|
37
|
-
});
|
|
38
23
|
}
|
|
39
24
|
const controlValue = controlResponse?.valeur;
|
|
40
|
-
console.log('GroupeInstanceManager.getMaxInstances - Valeur de contrôle trouvée:', {
|
|
41
|
-
controlResponse: controlResponse,
|
|
42
|
-
controlValue: controlValue,
|
|
43
|
-
valueType: typeof controlValue
|
|
44
|
-
});
|
|
45
25
|
// Convertir la valeur en nombre
|
|
46
26
|
let maxFromControl = 1; // Valeur par défaut
|
|
47
27
|
if (typeof controlValue === 'number') {
|
|
@@ -53,20 +33,9 @@ export class GroupeInstanceManager {
|
|
|
53
33
|
maxFromControl = parsed;
|
|
54
34
|
}
|
|
55
35
|
}
|
|
56
|
-
//
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
const protectedMax = Math.max(maxFromControl, existingInstancesCount);
|
|
60
|
-
console.log('GroupeInstanceManager.getMaxInstances - Résultat avec protection:', {
|
|
61
|
-
groupeCode: groupe.code,
|
|
62
|
-
codeVariable: groupe.codeVariable,
|
|
63
|
-
maxFromControl: maxFromControl,
|
|
64
|
-
existingInstancesCount: existingInstancesCount,
|
|
65
|
-
protectedMax: protectedMax,
|
|
66
|
-
isProtectionActive: protectedMax > maxFromControl
|
|
67
|
-
});
|
|
68
|
-
// S'assurer qu'on a au moins 1 instance
|
|
69
|
-
return Math.max(1, protectedMax);
|
|
36
|
+
// Le max pour l'ajout est strictement la valeur de la variable de contrôle
|
|
37
|
+
// La protection d'affichage des onglets existants est dans GroupeInstanceTabs (minDisplayCount)
|
|
38
|
+
return Math.max(1, maxFromControl);
|
|
70
39
|
}
|
|
71
40
|
/**
|
|
72
41
|
* Récupère le nombre minimum d'instances (basé sur les instances existantes)
|
|
@@ -80,19 +49,19 @@ export class GroupeInstanceManager {
|
|
|
80
49
|
}
|
|
81
50
|
/**
|
|
82
51
|
* Compte le nombre d'instances existantes pour un groupe
|
|
52
|
+
* Source de vérité : groupe.instances.length
|
|
53
|
+
* Fallback par numeroMembre uniquement pour l'initialisation
|
|
83
54
|
*/
|
|
84
55
|
static getInstancesCount(groupe, responses) {
|
|
85
56
|
if (!groupe.estMultiple) {
|
|
86
57
|
return 1;
|
|
87
58
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
// Compter les instances basées sur les réponses
|
|
59
|
+
// Source de vérité : le tableau instances
|
|
60
|
+
if (groupe.instances && groupe.instances.length > 0) {
|
|
61
|
+
return groupe.instances.length;
|
|
62
|
+
}
|
|
63
|
+
// Fallback pour l'initialisation : compter par numeroMembre uniquement
|
|
94
64
|
const instanceNumbers = new Set();
|
|
95
|
-
// Méthode 1: Par numeroMembre
|
|
96
65
|
groupe.variables.forEach(variable => {
|
|
97
66
|
Object.values(responses).forEach(response => {
|
|
98
67
|
if (response.variableCode === variable.code && response.numeroMembre) {
|
|
@@ -100,30 +69,7 @@ export class GroupeInstanceManager {
|
|
|
100
69
|
}
|
|
101
70
|
});
|
|
102
71
|
});
|
|
103
|
-
|
|
104
|
-
groupe.variables.forEach(variable => {
|
|
105
|
-
Object.keys(responses).forEach(key => {
|
|
106
|
-
const response = responses[key];
|
|
107
|
-
if (response.variableCode === variable.code) {
|
|
108
|
-
// Extraire le numéro d'instance de la clé si elle suit le format "CODE_NUMERO"
|
|
109
|
-
const keyParts = key.split('_');
|
|
110
|
-
if (keyParts.length >= 2) {
|
|
111
|
-
const lastPart = keyParts[keyParts.length - 1];
|
|
112
|
-
const instanceNum = parseInt(lastPart, 10);
|
|
113
|
-
if (!isNaN(instanceNum) && instanceNum > 0) {
|
|
114
|
-
instanceNumbers.add(instanceNum);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
const count = Math.max(1, instanceNumbers.size);
|
|
121
|
-
console.log('GroupeInstanceManager.getInstancesCount - Résultat:', {
|
|
122
|
-
groupeCode: groupe.code,
|
|
123
|
-
instanceNumbers: Array.from(instanceNumbers).sort(),
|
|
124
|
-
finalCount: count
|
|
125
|
-
});
|
|
126
|
-
return count;
|
|
72
|
+
return Math.max(1, instanceNumbers.size);
|
|
127
73
|
}
|
|
128
74
|
/**
|
|
129
75
|
* Crée une nouvelle instance pour un groupe multiple
|
|
@@ -144,12 +90,6 @@ export class GroupeInstanceManager {
|
|
|
144
90
|
if (!groupe.estMultiple) {
|
|
145
91
|
return [];
|
|
146
92
|
}
|
|
147
|
-
console.log('GroupeInstanceManager.initializeInstances - Début:', {
|
|
148
|
-
groupeCode: groupe.code,
|
|
149
|
-
codeVariable: groupe.codeVariable,
|
|
150
|
-
responsesKeys: Object.keys(responses),
|
|
151
|
-
allResponses: responses
|
|
152
|
-
});
|
|
153
93
|
// Identifier toutes les instances existantes pour ce groupe
|
|
154
94
|
const instanceNumbers = new Set();
|
|
155
95
|
// Collecter les réponses existantes pour ce groupe (avec et sans numeroMembre)
|
|
@@ -164,29 +104,8 @@ export class GroupeInstanceManager {
|
|
|
164
104
|
}
|
|
165
105
|
}
|
|
166
106
|
});
|
|
167
|
-
//
|
|
168
|
-
|
|
169
|
-
const response = responses[key];
|
|
170
|
-
const belongsToGroup = groupe.variables.some(v => v.code === response.variableCode);
|
|
171
|
-
if (belongsToGroup) {
|
|
172
|
-
// Extraire le numéro d'instance de la clé si elle suit le format "CODE_NUMERO"
|
|
173
|
-
const keyParts = key.split('_');
|
|
174
|
-
if (keyParts.length >= 2) {
|
|
175
|
-
const lastPart = keyParts[keyParts.length - 1];
|
|
176
|
-
const instanceNum = parseInt(lastPart, 10);
|
|
177
|
-
if (!isNaN(instanceNum) && instanceNum > 0) {
|
|
178
|
-
instanceNumbers.add(instanceNum);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
console.log('GroupeInstanceManager.initializeInstances - Données trouvées:', {
|
|
184
|
-
groupeCode: groupe.code,
|
|
185
|
-
instanceNumbers: Array.from(instanceNumbers).sort(),
|
|
186
|
-
groupResponsesCount: groupResponses.length,
|
|
187
|
-
responsesWithNumeroMembre: groupResponses.filter(r => r.numeroMembre).length,
|
|
188
|
-
responsesWithoutNumeroMembre: groupResponses.filter(r => !r.numeroMembre).length
|
|
189
|
-
});
|
|
107
|
+
// Note: le parsing de clé par format "CODE_NUMERO" a été supprimé car il
|
|
108
|
+
// produisait des faux positifs pour les codes variables contenant des chiffres (ex: S1_01)
|
|
190
109
|
const maxInstances = this.getMaxInstances(groupe, responses);
|
|
191
110
|
// Déterminer le nombre d'instances à créer
|
|
192
111
|
let instanceCount = Math.max(1, instanceNumbers.size);
|
|
@@ -197,12 +116,6 @@ export class GroupeInstanceManager {
|
|
|
197
116
|
if (instanceCount === 0) {
|
|
198
117
|
instanceCount = 1;
|
|
199
118
|
}
|
|
200
|
-
console.log('GroupeInstanceManager.initializeInstances - Calcul instances:', {
|
|
201
|
-
groupeCode: groupe.code,
|
|
202
|
-
maxInstances,
|
|
203
|
-
existingInstancesCount: instanceNumbers.size,
|
|
204
|
-
finalInstanceCount: instanceCount
|
|
205
|
-
});
|
|
206
119
|
const instances = [];
|
|
207
120
|
// Séparer les réponses avec et sans numeroMembre
|
|
208
121
|
const responsesWithMember = groupResponses.filter(r => r.numeroMembre);
|
|
@@ -226,12 +139,6 @@ export class GroupeInstanceManager {
|
|
|
226
139
|
if (i === 1) {
|
|
227
140
|
existingResponse = responsesWithoutMember.find(r => r.variableCode === variable.code);
|
|
228
141
|
if (existingResponse) {
|
|
229
|
-
console.log('GroupeInstanceManager.initializeInstances - Attribution réponse sans numeroMembre:', {
|
|
230
|
-
groupeCode: groupe.code,
|
|
231
|
-
instanceNumber: i,
|
|
232
|
-
variableCode: variable.code,
|
|
233
|
-
originalResponse: existingResponse
|
|
234
|
-
});
|
|
235
142
|
// Créer une copie avec numeroMembre pour cette instance
|
|
236
143
|
existingResponse = {
|
|
237
144
|
...existingResponse,
|
|
@@ -241,35 +148,13 @@ export class GroupeInstanceManager {
|
|
|
241
148
|
}
|
|
242
149
|
}
|
|
243
150
|
if (existingResponse) {
|
|
244
|
-
console.log('GroupeInstanceManager.initializeInstances - Réponse trouvée:', {
|
|
245
|
-
groupeCode: groupe.code,
|
|
246
|
-
instanceNumber: i,
|
|
247
|
-
variableCode: variable.code,
|
|
248
|
-
hasNumeroMembre: !!existingResponse.numeroMembre,
|
|
249
|
-
response: existingResponse
|
|
250
|
-
});
|
|
251
151
|
instance.reponses[variable.code] = existingResponse;
|
|
252
152
|
}
|
|
253
153
|
});
|
|
254
154
|
// Vérifier si l'instance est complète
|
|
255
155
|
instance.estComplete = this.isInstanceComplete(instance, groupe);
|
|
256
156
|
instances.push(instance);
|
|
257
|
-
console.log('GroupeInstanceManager.initializeInstances - Instance créée:', {
|
|
258
|
-
groupeCode: groupe.code,
|
|
259
|
-
instanceNumber: i,
|
|
260
|
-
responsesCount: Object.keys(instance.reponses).length,
|
|
261
|
-
isComplete: instance.estComplete
|
|
262
|
-
});
|
|
263
157
|
}
|
|
264
|
-
console.log('GroupeInstanceManager.initializeInstances - Résultat final:', {
|
|
265
|
-
groupeCode: groupe.code,
|
|
266
|
-
instancesCreated: instances.length,
|
|
267
|
-
instances: instances.map(inst => ({
|
|
268
|
-
numero: inst.numeroInstance,
|
|
269
|
-
responsesCount: Object.keys(inst.reponses).length,
|
|
270
|
-
isComplete: inst.estComplete
|
|
271
|
-
}))
|
|
272
|
-
});
|
|
273
158
|
return instances;
|
|
274
159
|
}
|
|
275
160
|
/**
|
|
@@ -332,12 +217,6 @@ export class GroupeInstanceManager {
|
|
|
332
217
|
const constraints = [];
|
|
333
218
|
// CORRECTION: Utiliser le nombre d'instances du groupe directement
|
|
334
219
|
const currentCount = groupe.instances?.length || 0;
|
|
335
|
-
console.log('GroupeInstanceManager.canRemoveInstance - Debug:', {
|
|
336
|
-
groupeCode: groupe.code,
|
|
337
|
-
instancesLength: groupe.instances?.length,
|
|
338
|
-
currentCount,
|
|
339
|
-
canRemove: currentCount > 1
|
|
340
|
-
});
|
|
341
220
|
if (currentCount <= 1) {
|
|
342
221
|
constraints.push({
|
|
343
222
|
type: 'instance_limit',
|
|
@@ -368,7 +247,7 @@ export class GroupeInstanceManager {
|
|
|
368
247
|
// Trouver tous les groupes qui utilisent cette variable de contrôle
|
|
369
248
|
const affectedGroups = groupesMultiples.filter(g => g.codeVariable === variableCode);
|
|
370
249
|
for (const groupe of affectedGroups) {
|
|
371
|
-
const existingInstances = this.getInstancesCount(groupe, responses);
|
|
250
|
+
const existingInstances = groupe.instances?.length || this.getInstancesCount(groupe, responses);
|
|
372
251
|
if (newValue < existingInstances) {
|
|
373
252
|
constraints.push({
|
|
374
253
|
type: 'bidirectional_control',
|
|
@@ -396,7 +275,8 @@ export class GroupeInstanceManager {
|
|
|
396
275
|
};
|
|
397
276
|
}
|
|
398
277
|
/**
|
|
399
|
-
* Ajoute une nouvelle instance à un groupe
|
|
278
|
+
* Ajoute une nouvelle instance à un groupe (immutable)
|
|
279
|
+
* Retourne un nouveau groupe sans muter l'original
|
|
400
280
|
*/
|
|
401
281
|
static addInstance(groupe, responses) {
|
|
402
282
|
const validation = this.canAddInstance(groupe, responses);
|
|
@@ -406,29 +286,25 @@ export class GroupeInstanceManager {
|
|
|
406
286
|
error: validation.constraints[0]?.message || 'Impossible d\'ajouter une instance'
|
|
407
287
|
};
|
|
408
288
|
}
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
groupe.instances = [];
|
|
412
|
-
}
|
|
413
|
-
const newInstanceNumber = groupe.instances.length + 1;
|
|
289
|
+
const currentInstances = groupe.instances || [];
|
|
290
|
+
const newInstanceNumber = currentInstances.length + 1;
|
|
414
291
|
const newInstance = this.createInstance(groupe, newInstanceNumber);
|
|
415
|
-
//
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
totalInstances: groupe.instances.length,
|
|
423
|
-
maxInstances: this.getMaxInstances(groupe, responses)
|
|
424
|
-
});
|
|
292
|
+
// Construire un nouveau groupe avec l'instance ajoutée (sans muter l'original)
|
|
293
|
+
const updatedInstances = [...currentInstances, newInstance];
|
|
294
|
+
const updatedGroupe = {
|
|
295
|
+
...groupe,
|
|
296
|
+
instances: updatedInstances,
|
|
297
|
+
instancesCount: updatedInstances.length
|
|
298
|
+
};
|
|
425
299
|
return {
|
|
426
300
|
success: true,
|
|
427
|
-
instance: newInstance
|
|
301
|
+
instance: newInstance,
|
|
302
|
+
updatedGroupe
|
|
428
303
|
};
|
|
429
304
|
}
|
|
430
305
|
/**
|
|
431
|
-
* Supprime une instance d'un groupe
|
|
306
|
+
* Supprime une instance d'un groupe (immutable)
|
|
307
|
+
* Retourne de nouveaux objets sans muter les originaux
|
|
432
308
|
*/
|
|
433
309
|
static removeInstance(groupe, instanceNumber, responses) {
|
|
434
310
|
const validation = this.canRemoveInstance(groupe, responses);
|
|
@@ -438,26 +314,29 @@ export class GroupeInstanceManager {
|
|
|
438
314
|
error: validation.constraints[0]?.message || 'Impossible de supprimer cette instance'
|
|
439
315
|
};
|
|
440
316
|
}
|
|
441
|
-
//
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
// Trouver si cette réponse appartient à ce groupe
|
|
451
|
-
const belongsToGroup = groupe.variables.some(v => v.code === response.variableCode);
|
|
452
|
-
if (belongsToGroup) {
|
|
453
|
-
delete responses[key];
|
|
454
|
-
}
|
|
317
|
+
// Filtrer les instances (sans muter l'original)
|
|
318
|
+
const filteredInstances = (groupe.instances || []).filter(i => i.numeroInstance !== instanceNumber);
|
|
319
|
+
// Construire de nouvelles réponses en excluant celles de l'instance supprimée
|
|
320
|
+
const cleanedResponses = {};
|
|
321
|
+
Object.entries(responses).forEach(([key, response]) => {
|
|
322
|
+
const belongsToGroup = groupe.variables.some(v => v.code === response.variableCode);
|
|
323
|
+
if (belongsToGroup && response.numeroMembre === instanceNumber) {
|
|
324
|
+
// Exclure les réponses de l'instance supprimée
|
|
325
|
+
return;
|
|
455
326
|
}
|
|
327
|
+
cleanedResponses[key] = { ...response };
|
|
456
328
|
});
|
|
457
329
|
// Réorganiser les instances pour maintenir une numérotation séquentielle
|
|
458
|
-
this.reorderInstances(
|
|
330
|
+
const { reorderedInstances, reorderedResponses } = this.reorderInstances(filteredInstances, cleanedResponses, groupe);
|
|
331
|
+
const updatedGroupe = {
|
|
332
|
+
...groupe,
|
|
333
|
+
instances: reorderedInstances,
|
|
334
|
+
instancesCount: reorderedInstances.length
|
|
335
|
+
};
|
|
459
336
|
return {
|
|
460
|
-
success: true
|
|
337
|
+
success: true,
|
|
338
|
+
updatedGroupe,
|
|
339
|
+
updatedResponses: reorderedResponses
|
|
461
340
|
};
|
|
462
341
|
}
|
|
463
342
|
/**
|
|
@@ -473,14 +352,6 @@ export class GroupeInstanceManager {
|
|
|
473
352
|
if (!groupe.instances) {
|
|
474
353
|
groupe.instances = this.initializeInstances(groupe, responses);
|
|
475
354
|
}
|
|
476
|
-
// PROTECTION DES DONNÉES : Ne plus supprimer automatiquement les instances
|
|
477
|
-
// La logique de protection est maintenant dans getMaxInstances()
|
|
478
|
-
console.log('GroupeInstanceManager.updateGroupeProperties - Protection des données active:', {
|
|
479
|
-
groupeCode: groupe.code,
|
|
480
|
-
currentInstances: groupe.instances.length,
|
|
481
|
-
maxInstances: groupe.maxInstances,
|
|
482
|
-
protectionActive: groupe.instances.length > 0
|
|
483
|
-
});
|
|
484
355
|
groupe.instancesCount = groupe.instances.length;
|
|
485
356
|
// Mettre à jour le statut de completion des instances
|
|
486
357
|
groupe.instances.forEach(instance => {
|
|
@@ -567,40 +438,64 @@ export class GroupeInstanceManager {
|
|
|
567
438
|
};
|
|
568
439
|
}
|
|
569
440
|
/**
|
|
570
|
-
* Réorganise les numéros d'instances après suppression
|
|
441
|
+
* Réorganise les numéros d'instances après suppression (immutable)
|
|
442
|
+
* Retourne de nouveaux objets sans muter les originaux
|
|
571
443
|
*/
|
|
572
|
-
static reorderInstances(
|
|
573
|
-
if (!
|
|
574
|
-
return;
|
|
444
|
+
static reorderInstances(instances, responses, groupe) {
|
|
445
|
+
if (!instances || instances.length === 0) {
|
|
446
|
+
return { reorderedInstances: [], reorderedResponses: { ...responses } };
|
|
575
447
|
}
|
|
576
|
-
// Trier les instances par numéro
|
|
577
|
-
|
|
578
|
-
//
|
|
579
|
-
|
|
448
|
+
// Trier les instances par numéro (sur des copies)
|
|
449
|
+
const sortedInstances = [...instances].sort((a, b) => a.numeroInstance - b.numeroInstance);
|
|
450
|
+
// Construire le mapping oldNumber → newNumber
|
|
451
|
+
const numberMapping = new Map();
|
|
452
|
+
sortedInstances.forEach((instance, index) => {
|
|
580
453
|
const newNumber = index + 1;
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
454
|
+
if (instance.numeroInstance !== newNumber) {
|
|
455
|
+
numberMapping.set(instance.numeroInstance, newNumber);
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
// Créer les nouvelles instances avec les numéros mis à jour
|
|
459
|
+
const reorderedInstances = sortedInstances.map((instance, index) => {
|
|
460
|
+
const newNumber = index + 1;
|
|
461
|
+
if (instance.numeroInstance === newNumber) {
|
|
462
|
+
return { ...instance }; // Copie sans changement de numéro
|
|
463
|
+
}
|
|
464
|
+
// Copier avec nouveau numéro
|
|
465
|
+
const newReponses = {};
|
|
466
|
+
Object.entries(instance.reponses).forEach(([variableCode, response]) => {
|
|
467
|
+
newReponses[variableCode] = { ...response, numeroMembre: newNumber };
|
|
468
|
+
});
|
|
469
|
+
return {
|
|
470
|
+
...instance,
|
|
471
|
+
numeroInstance: newNumber,
|
|
472
|
+
libelle: `${groupe.designation} ${newNumber}`,
|
|
473
|
+
reponses: newReponses
|
|
474
|
+
};
|
|
475
|
+
});
|
|
476
|
+
// Si aucun renumérotage nécessaire, retourner une copie simple
|
|
477
|
+
if (numberMapping.size === 0) {
|
|
478
|
+
return { reorderedInstances, reorderedResponses: { ...responses } };
|
|
479
|
+
}
|
|
480
|
+
// Construire les nouvelles réponses avec les clés mises à jour
|
|
481
|
+
const reorderedResponses = {};
|
|
482
|
+
Object.entries(responses).forEach(([key, response]) => {
|
|
483
|
+
const belongsToGroup = groupe.variables.some(v => v.code === response.variableCode);
|
|
484
|
+
if (belongsToGroup && response.numeroMembre && numberMapping.has(response.numeroMembre)) {
|
|
485
|
+
const newNumber = numberMapping.get(response.numeroMembre);
|
|
486
|
+
const newKey = `${response.variableCode}_${newNumber}`;
|
|
487
|
+
reorderedResponses[newKey] = { ...response, numeroMembre: newNumber };
|
|
488
|
+
}
|
|
489
|
+
else if (belongsToGroup && response.numeroMembre && !numberMapping.has(response.numeroMembre)) {
|
|
490
|
+
// Réponse du groupe mais pas de renumérotage nécessaire - garder avec la bonne clé
|
|
491
|
+
const correctKey = `${response.variableCode}_${response.numeroMembre}`;
|
|
492
|
+
reorderedResponses[correctKey] = { ...response };
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
// Réponse hors du groupe, garder telle quelle
|
|
496
|
+
reorderedResponses[key] = { ...response };
|
|
603
497
|
}
|
|
604
498
|
});
|
|
499
|
+
return { reorderedInstances, reorderedResponses };
|
|
605
500
|
}
|
|
606
501
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interpolateVariableLabel.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/interpolateVariableLabel.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,qBAAqB,CAAC,EAAE,MAAM,GAC7B,MAAM,
|
|
1
|
+
{"version":3,"file":"interpolateVariableLabel.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/interpolateVariableLabel.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAC5C,qBAAqB,CAAC,EAAE,MAAM,GAC7B,MAAM,CA0CR;AA2DD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG5D;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAcjE;AAED,eAAe,wBAAwB,CAAC"}
|
|
@@ -31,71 +31,37 @@
|
|
|
31
31
|
* // Cherchera MEMBRE_NOM_2 → "Nom: Pierre"
|
|
32
32
|
*/
|
|
33
33
|
export function interpolateVariableLabel(label, allResponses, currentInstanceNumber) {
|
|
34
|
-
console.log('🔍 [interpolateVariableLabel] DEBUT', {
|
|
35
|
-
label,
|
|
36
|
-
currentInstanceNumber,
|
|
37
|
-
allResponsesKeys: Object.keys(allResponses),
|
|
38
|
-
allResponsesCount: Object.keys(allResponses).length
|
|
39
|
-
});
|
|
40
34
|
// Si pas de label ou pas de pattern ${}, retourner tel quel
|
|
41
35
|
if (!label || !label.includes('${')) {
|
|
42
|
-
console.log('🔍 [interpolateVariableLabel] Pas de pattern ${} trouvé, retour direct');
|
|
43
36
|
return label;
|
|
44
37
|
}
|
|
45
38
|
// Regex pour capturer ${CODE} - le code peut contenir lettres, chiffres, underscores
|
|
46
39
|
const regex = /\$\{([A-Za-z0-9_]+)\}/g;
|
|
47
40
|
const result = label.replace(regex, (match, variableCode) => {
|
|
48
|
-
console.log('🔍 [interpolateVariableLabel] Traitement de', { match, variableCode });
|
|
49
41
|
let response;
|
|
50
42
|
// Stratégie de recherche de la valeur
|
|
51
43
|
// 1. Essayer avec le code exact tel quel
|
|
52
44
|
// Cela couvre le cas ${CODE_N} où N est explicite
|
|
53
45
|
response = allResponses[variableCode];
|
|
54
|
-
console.log('🔍 [interpolateVariableLabel] Stratégie 1 - Code exact', {
|
|
55
|
-
variableCode,
|
|
56
|
-
found: !!response,
|
|
57
|
-
value: response?.valeur
|
|
58
|
-
});
|
|
59
46
|
// 2. Si pas trouvé, essayer avec l'instance courante
|
|
60
|
-
// La stratégie de recherche en étapes garantit le bon fonctionnement :
|
|
61
47
|
// - Les références explicites (${CODE_1}) sont trouvées à l'étape 1
|
|
62
48
|
// - Les variables dans groupes multiples (${S0_1} -> S0_1_2) sont trouvées ici
|
|
63
49
|
if (!response && currentInstanceNumber) {
|
|
64
|
-
// Essayer CODE_instanceNumber
|
|
65
50
|
const keyWithInstance = `${variableCode}_${currentInstanceNumber}`;
|
|
66
51
|
response = allResponses[keyWithInstance];
|
|
67
|
-
console.log('🔍 [interpolateVariableLabel] Stratégie 2 - Avec instance', {
|
|
68
|
-
keyWithInstance,
|
|
69
|
-
found: !!response,
|
|
70
|
-
value: response?.valeur
|
|
71
|
-
});
|
|
72
52
|
}
|
|
73
53
|
// 3. Si toujours pas trouvé, chercher dans les réponses par variableCode
|
|
74
54
|
// (pour le cas où la clé est juste le code sans suffix)
|
|
75
55
|
if (!response) {
|
|
76
56
|
response = Object.values(allResponses).find(r => r.variableCode === variableCode);
|
|
77
|
-
console.log('🔍 [interpolateVariableLabel] Stratégie 3 - Par variableCode', {
|
|
78
|
-
variableCode,
|
|
79
|
-
found: !!response,
|
|
80
|
-
value: response?.valeur
|
|
81
|
-
});
|
|
82
57
|
}
|
|
83
58
|
// 4. Formater et retourner la valeur si trouvée
|
|
84
59
|
if (response?.valeur !== undefined && response?.valeur !== null && response?.valeur !== '') {
|
|
85
|
-
|
|
86
|
-
console.log('🔍 [interpolateVariableLabel] Valeur trouvée et formatée', {
|
|
87
|
-
match,
|
|
88
|
-
variableCode,
|
|
89
|
-
rawValue: response.valeur,
|
|
90
|
-
formatted
|
|
91
|
-
});
|
|
92
|
-
return formatted;
|
|
60
|
+
return formatValue(response.valeur);
|
|
93
61
|
}
|
|
94
62
|
// 5. Pas de valeur trouvée → garder le placeholder pour indiquer le champ à remplir
|
|
95
|
-
console.log('⚠️ [interpolateVariableLabel] Aucune valeur trouvée, garder le placeholder', { match, variableCode });
|
|
96
63
|
return match;
|
|
97
64
|
});
|
|
98
|
-
console.log('🔍 [interpolateVariableLabel] RESULTAT', { original: label, result });
|
|
99
65
|
return result;
|
|
100
66
|
}
|
|
101
67
|
/**
|
package/package.json
CHANGED