@rsuci/shared-form-components 1.0.87 → 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.
@@ -1 +1 @@
1
- {"version":3,"file":"FormRenderer.d.ts","sourceRoot":"","sources":["../../../src/components/form-renderer/FormRenderer.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAA4D,MAAM,OAAO,CAAC;AACjF,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,cAAc,EAIf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EAEtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAsBlF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClD,oCAAoC;IACpC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,iCAAiC;IACjC,SAAS,EAAE,qBAAqB,CAAC;IACjC,wBAAwB;IACxB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,wCAAwC;IACxC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,iCAAiC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iCAAiC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAwyBD;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAgBpD,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"FormRenderer.d.ts","sourceRoot":"","sources":["../../../src/components/form-renderer/FormRenderer.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAA4D,MAAM,OAAO,CAAC;AACjF,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,cAAc,EAIf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EAEtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAsBlF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,6BAA6B;IAC7B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClD,oCAAoC;IACpC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,iCAAiC;IACjC,SAAS,EAAE,qBAAqB,CAAC;IACjC,wBAAwB;IACxB,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,wCAAwC;IACxC,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,iCAAiC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iCAAiC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAuxBD;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAgBpD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -76,6 +76,9 @@ const FormRendererInner = () => {
76
76
  const instanceNumber = currentGroup.estMultiple
77
77
  ? currentInstance?.numeroInstance
78
78
  : undefined;
79
+ // Ne pas exécuter les auto-actions sans instance résolue dans un groupe multiple
80
+ if (currentGroup.estMultiple && instanceNumber === undefined)
81
+ return;
79
82
  // Évaluer les autoactions pour le groupe courant
80
83
  const autoUpdates = evaluateAutoActionsForInstance(currentGroup.code, instanceNumber);
81
84
  // Appliquer les mises à jour si nécessaire
@@ -94,7 +97,6 @@ const FormRendererInner = () => {
94
97
  : targetVariable.code;
95
98
  const currentValue = responses[currentResponseKey]?.valeur;
96
99
  if (currentValue !== value) {
97
- console.log(`🔄 [AutoAction] Setting ${targetKey} = ${JSON.stringify(value)}`);
98
100
  updateResponse(targetVariable.code, value, targetVariable, instanceNumber);
99
101
  }
100
102
  }
@@ -142,9 +144,15 @@ const FormRendererInner = () => {
142
144
  let numeroMembre = currentGroup?.estMultiple
143
145
  ? currentInstance?.numeroInstance
144
146
  : undefined;
147
+ // Pour les groupes multiples, ne PAS continuer sans instance résolue
148
+ // (évite de stocker les réponses sans suffixe _N)
149
+ if (currentGroup?.estMultiple && numeroMembre === undefined) {
150
+ console.warn('[FormRenderer] handleVariableChange: groupe multiple sans currentInstance, rejet');
151
+ return;
152
+ }
145
153
  // Pour les groupes non-multiples, préserver le numeroMembre existant du backend
146
154
  // afin que la sauvegarde utilise la même clé que le chargement
147
- if (numeroMembre === undefined) {
155
+ if (numeroMembre === undefined && !currentGroup?.estMultiple) {
148
156
  const existingResponse = responsesByVariableCode.get(variable.code);
149
157
  if (existingResponse?.numeroMembre) {
150
158
  numeroMembre = existingResponse.numeroMembre;
@@ -246,24 +254,19 @@ const FormRendererInner = () => {
246
254
  }
247
255
  // Pour les groupes normaux, valider uniquement les variables visibles et obligatoires
248
256
  const requiredVariables = currentGroup.variables.filter(v => v.estObligatoire);
249
- console.log('🔍 [Validation] Mode:', mode, 'Groupe:', currentGroup.code);
250
- console.log('🔍 [Validation] Variables obligatoires:', requiredVariables.length);
251
257
  for (const variable of requiredVariables) {
252
258
  // Ignorer les variables LABEL - ce sont des éléments d'affichage uniquement qui ne peuvent pas avoir de valeur
253
259
  if (variable.typeCode === 'LABEL') {
254
- console.log('🔍 [Validation] Variable LABEL ignorée:', variable.code);
255
260
  continue;
256
261
  }
257
262
  // Vérifier si la variable est filtrée par le mode (MENAGE/ENQUETE en mode public)
258
263
  const isFilteredByMode = isVariableFilteredByMode(variable);
259
264
  if (isFilteredByMode) {
260
- console.log('🔍 [Validation] Variable filtrée par mode:', variable.code, 'typeCode:', variable.typeCode);
261
265
  continue;
262
266
  }
263
267
  // Vérifier si la variable est visible via le formTree
264
268
  const isVisible = isVariableVisible(variable);
265
269
  if (!isVisible) {
266
- console.log('🔍 [Validation] Variable masquée par formTree:', variable.code);
267
270
  continue;
268
271
  }
269
272
  // Vérifier si la variable a une valeur
@@ -272,13 +275,10 @@ const FormRendererInner = () => {
272
275
  : variable.code;
273
276
  const response = responses[responseKey];
274
277
  const hasValue = response && response.valeur != null && response.valeur !== '';
275
- console.log('🔍 [Validation] Variable:', variable.code, 'hasValue:', hasValue, 'valeur:', response?.valeur);
276
278
  if (!hasValue) {
277
- console.log('❌ [Validation] ECHEC - Variable sans valeur:', variable.code);
278
279
  return false;
279
280
  }
280
281
  }
281
- console.log('✅ [Validation] Toutes les variables obligatoires sont remplies');
282
282
  return true;
283
283
  }, [currentGroup, currentInstance, responses, isVariableVisible, isVariableFilteredByMode, validateGroupForInstance, mode]);
284
284
  // Mode consultation (pas de validation, navigation libre)
@@ -296,7 +296,6 @@ const FormRendererInner = () => {
296
296
  }
297
297
  // Valider les champs obligatoires
298
298
  if (!canGoNext) {
299
- console.log('❌ [Navigation] Champs obligatoires non remplis');
300
299
  return;
301
300
  }
302
301
  // Valider les conditions de validation (ConditionEval) du groupe actuel
@@ -304,7 +303,6 @@ const FormRendererInner = () => {
304
303
  const numeroMembre = currentGroup.estMultiple ? currentInstance?.numeroInstance : undefined;
305
304
  const conditionErrors = validateConditionGroup(currentGroup, numeroMembre);
306
305
  if (conditionErrors.length > 0) {
307
- console.log('❌ [Navigation] Erreurs de validation ConditionEval:', conditionErrors);
308
306
  // Les erreurs sont déjà affichées sous les variables via getConditionErrorForVariable
309
307
  return;
310
308
  }
@@ -339,7 +337,6 @@ const FormRendererInner = () => {
339
337
  }
340
338
  const conditionErrors = validateAllConditions(groupes, instancesMap);
341
339
  if (conditionErrors.length > 0) {
342
- console.log('❌ [Soumission] Erreurs de validation ConditionEval:', conditionErrors);
343
340
  if (callbacks.onValidationError) {
344
341
  // Convertir les erreurs de condition en erreurs de validation standard
345
342
  callbacks.onValidationError(conditionErrors.map(e => ({
@@ -405,25 +402,13 @@ const FormRendererInner = () => {
405
402
  : variable.code;
406
403
  let currentValue = responses[responseKey]?.valeur;
407
404
  // Fallback: si pas trouvé par clé directe, chercher par variableCode
408
- // (gère les groupes non-multiples le backend stocke avec numero_membre)
409
- if (currentValue === undefined) {
405
+ // UNIQUEMENT pour les groupes non-multiples (évite la fuite de données cross-instance)
406
+ if (currentValue === undefined && !currentGroup?.estMultiple) {
410
407
  const fallbackResponse = responsesByVariableCode.get(variable.code);
411
408
  if (fallbackResponse) {
412
409
  currentValue = fallbackResponse.valeur;
413
410
  }
414
411
  }
415
- // Debug log pour tracer le flux de données géographiques
416
- if (['DISTRICT', 'REGION', 'DEPARTEMENT', 'SOUSPREFECTURE', 'QUARTIER'].includes(variable.typeCode)) {
417
- console.log('[FormRenderer] Variable géographique:', {
418
- variableCode: variable.code,
419
- typeCode: variable.typeCode,
420
- responseKey,
421
- hasResponseKey: responseKey in responses,
422
- responseObject: responses[responseKey],
423
- currentValue,
424
- currentValueType: typeof currentValue
425
- });
426
- }
427
412
  // Extraire les variables roster si c'est un type ROSTERCHECK ou ROSTERLIST
428
413
  const rosterVariables = (variable.typeCode === 'ROSTERCHECK' || variable.typeCode === 'ROSTERLIST')
429
414
  ? variable.rosterVariables
@@ -1 +1 @@
1
- {"version":3,"file":"useFormRenderer.d.ts","sourceRoot":"","sources":["../../src/hooks/useFormRenderer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useFormRenderer.d.ts","sourceRoot":"","sources":["../../src/hooks/useFormRenderer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,aAAa,EACd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAqB,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAqB,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAoB,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAG9E,MAAM,WAAW,sBAAsB;IACrC,oCAAoC;IACpC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,yBAAyB;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAClD,8CAA8C;IAC9C,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,KAAK,IAAI,CAAC;IACxE,4CAA4C;IAC5C,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC;IAC9D,iBAAiB;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IAEpC,UAAU,EAAE,uBAAuB,CAAC;IAGpC,UAAU,EAAE,uBAAuB,CAAC;IAGpC,SAAS,EAAE,sBAAsB,CAAC;IAGlC,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC1C,gCAAgC;IAChC,cAAc,EAAE,CACd,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,kBAAkB,EAC5B,YAAY,CAAC,EAAE,MAAM,KAClB,IAAI,CAAC;IACV,wCAAwC;IACxC,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAGnF,gDAAgD;IAChD,iBAAiB,EAAE,OAAO,CAAC;IAC3B,0CAA0C;IAC1C,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,iCAAiC;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,mCAAmC;IACnC,eAAe,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,kCAAkC;IAClC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gCAAgC;IAChC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,4BAA4B;IAC5B,UAAU,EAAE,OAAO,CAAC;IAGpB,iCAAiC;IACjC,IAAI,EAAE,gBAAgB,CAAC;IACvB,+BAA+B;IAC/B,QAAQ,EAAE,oBAAoB,CAAC;IAG/B,kCAAkC;IAClC,YAAY,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC3C,qCAAqC;IACrC,eAAe,EAAE,cAAc,GAAG,SAAS,CAAC;IAC5C,0CAA0C;IAC1C,oBAAoB,EAAE,gBAAgB,EAAE,CAAC;IAGzC,+CAA+C;IAC/C,iBAAiB,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC;IAC7D,kDAAkD;IAClD,cAAc,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACxE,sCAAsC;IACtC,gBAAgB,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,aAAa,CAAC;CAClF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,iBAAiB,EAC7B,OAAO,CAAC,EAAE,eAAe,EACzB,OAAO,GAAE,sBAAuD,GAC/D,qBAAqB,CAgQvB;AAED,eAAe,eAAe,CAAC"}
@@ -126,20 +126,46 @@ export function useFormRenderer(formulaire, enquete, options = { config: { mode:
126
126
  }
127
127
  return updated;
128
128
  });
129
- // Mettre à jour l'instance si c'est un groupe multiple
129
+ // Mettre à jour l'instance si c'est un groupe multiple (immutable via setter)
130
130
  if (currentGroup?.estMultiple && currentInstance) {
131
- currentInstance.reponses[variableCode] = newResponse;
132
- currentInstance.estComplete = instances.isInstanceComplete(currentInstance, currentGroup);
131
+ instances.setGroupesWithInstances(prev => prev.map(g => {
132
+ if (g.code !== currentGroup.code || !g.instances)
133
+ return g;
134
+ return {
135
+ ...g,
136
+ instances: g.instances.map(inst => {
137
+ if (inst.numeroInstance !== currentInstance.numeroInstance)
138
+ return inst;
139
+ const updatedReponses = { ...inst.reponses, [variableCode]: newResponse };
140
+ return {
141
+ ...inst,
142
+ reponses: updatedReponses,
143
+ estComplete: instances.isInstanceComplete({ ...inst, reponses: updatedReponses }, currentGroup)
144
+ };
145
+ })
146
+ };
147
+ }));
133
148
  }
134
- // Mettre à jour les propriétés des groupes affectés
135
- const affectedGroups = instances.groupesWithInstances.filter(g => g.codeVariable === variableCode);
136
- if (affectedGroups.length > 0) {
137
- affectedGroups.forEach(groupe => {
138
- instances.updateGroupeProperties(groupe, {
139
- ...responses,
140
- [responseKey]: newResponse
141
- });
142
- });
149
+ // Mettre à jour les propriétés des groupes affectés (immutable via setter)
150
+ const affectedGroupCodes = instances.groupesWithInstances
151
+ .filter(g => g.codeVariable === variableCode)
152
+ .map(g => g.code);
153
+ if (affectedGroupCodes.length > 0) {
154
+ const updatedResponses = { ...responses, [responseKey]: newResponse };
155
+ instances.setGroupesWithInstances(prev => prev.map(g => {
156
+ if (!affectedGroupCodes.includes(g.code))
157
+ return g;
158
+ return {
159
+ ...g,
160
+ maxInstances: GroupeInstanceManager.getMaxInstances(g, updatedResponses),
161
+ minInstances: GroupeInstanceManager.getMinInstances(g),
162
+ instancesCount: g.instances?.length ?? 0,
163
+ instances: g.instances?.map(inst => ({
164
+ ...inst,
165
+ estComplete: GroupeInstanceManager.isInstanceComplete(inst, g)
166
+ }))
167
+ };
168
+ }));
143
169
  }
144
170
  setHasUnsavedChanges(true);
145
171
  }, [
@@ -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.87",
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",