@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.
@@ -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
- // PROTECTION DES DONNÉES : Obtenir le nombre d'instances existantes
57
- const existingInstancesCount = groupe.instances?.length || 0;
58
- // Le maximum effectif est au moins égal au nombre d'instances existantes
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
- console.log('GroupeInstanceManager.getInstancesCount - Début:', {
89
- groupeCode: groupe.code,
90
- variableCodes: groupe.variables.map(v => v.code),
91
- responsesKeys: Object.keys(responses)
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
- // Méthode 2: Par clé avec format "CODE_NUMERO"
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
- // Aussi chercher par clé avec format "CODE_NUMERO"
168
- Object.keys(responses).forEach(key => {
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
- // CORRECTION: Calculer le bon numéro d'instance
410
- if (!groupe.instances) {
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
- // Ajouter l'instance au groupe
416
- groupe.instances.push(newInstance);
417
- // Mettre à jour les propriétés calculées
418
- groupe.instancesCount = groupe.instances.length;
419
- console.log('GroupeInstanceManager.addInstance - Instance ajoutée:', {
420
- groupeCode: groupe.code,
421
- newInstanceNumber,
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
- // Supprimer l'instance du tableau
442
- if (groupe.instances) {
443
- groupe.instances = groupe.instances.filter(i => i.numeroInstance !== instanceNumber);
444
- groupe.instancesCount = groupe.instances.length;
445
- }
446
- // Supprimer les réponses associées à cette instance
447
- Object.keys(responses).forEach(key => {
448
- const response = responses[key];
449
- if (response.numeroMembre === instanceNumber) {
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(groupe, responses);
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(groupe, responses) {
573
- if (!groupe.instances) {
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
- groupe.instances.sort((a, b) => a.numeroInstance - b.numeroInstance);
578
- // Réassigner les numéros séquentiellement
579
- groupe.instances.forEach((instance, index) => {
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
- const oldNumber = instance.numeroInstance;
582
- if (newNumber !== oldNumber) {
583
- // Mettre à jour le numéro de l'instance
584
- instance.numeroInstance = newNumber;
585
- instance.libelle = `${groupe.designation} ${newNumber}`;
586
- // Mettre à jour les réponses dans le store global
587
- Object.keys(responses).forEach(key => {
588
- const response = responses[key];
589
- if (response.numeroMembre === oldNumber) {
590
- const belongsToGroup = groupe.variables.some(v => v.code === response.variableCode);
591
- if (belongsToGroup) {
592
- response.numeroMembre = newNumber;
593
- // Mettre à jour la clé si nécessaire
594
- delete responses[key];
595
- responses[`${response.variableCode}_${newNumber}`] = response;
596
- }
597
- }
598
- });
599
- // Mettre à jour les réponses dans l'instance
600
- Object.keys(instance.reponses).forEach(variableCode => {
601
- instance.reponses[variableCode].numeroMembre = newNumber;
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,CA6ER;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"}
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
- const formatted = formatValue(response.valeur);
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsuci/shared-form-components",
3
- "version": "1.0.86",
3
+ "version": "1.0.88",
4
4
  "description": "Composants partagés de rendu de formulaires RSU v2 - Package local pour frontend Admin et Public",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",