@rsuci/shared-form-components 1.0.88 → 1.0.90
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 +3 -2
- package/dist/lib/condition-engine.d.ts +11 -1
- package/dist/lib/condition-engine.d.ts.map +1 -1
- package/dist/lib/condition-engine.js +54 -22
- package/dist/lib/form-tree.d.ts.map +1 -1
- package/dist/lib/form-tree.js +4 -0
- package/dist/lib/utils/interpolateVariableLabel.d.ts.map +1 -1
- package/dist/lib/utils/interpolateVariableLabel.js +11 -2
- package/package.json +1 -1
|
@@ -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;
|
|
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;AAwxBD;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAgBpD,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -64,8 +64,9 @@ const FormRendererInner = () => {
|
|
|
64
64
|
// Éviter les boucles infinies: ne pas exécuter si on est déjà en train d'appliquer des autoactions
|
|
65
65
|
if (isApplyingAutoActions.current)
|
|
66
66
|
return;
|
|
67
|
-
// Éviter de re-traiter les mêmes réponses
|
|
68
|
-
|
|
67
|
+
// Éviter de re-traiter les mêmes réponses pour la même instance
|
|
68
|
+
// CORRECTION Bug 7: Inclure l'instance pour réévaluer lors du changement de membre
|
|
69
|
+
const responsesKey = `${JSON.stringify(responses)}::instance=${currentInstance?.numeroInstance ?? 'none'}`;
|
|
69
70
|
if (responsesKey === lastProcessedResponsesKey.current)
|
|
70
71
|
return;
|
|
71
72
|
lastProcessedResponsesKey.current = responsesKey;
|
|
@@ -45,6 +45,7 @@ export declare class ConditionEngine {
|
|
|
45
45
|
evaluate(condition: string, currentIteration?: number): boolean;
|
|
46
46
|
/**
|
|
47
47
|
* Met en cache un résultat d'évaluation
|
|
48
|
+
* CORRIGÉ: Passe currentIteration au hash pour distinguer les membres
|
|
48
49
|
*/
|
|
49
50
|
private cacheResult;
|
|
50
51
|
/**
|
|
@@ -58,6 +59,8 @@ export declare class ConditionEngine {
|
|
|
58
59
|
/**
|
|
59
60
|
* Génère un hash du contexte pour les variables référencées dans une condition
|
|
60
61
|
* Utilisé pour le cache des résultats d'évaluation
|
|
62
|
+
* CORRIGÉ: Prend en compte l'itération courante pour les variables itératives,
|
|
63
|
+
* évitant que le cache retourne un résultat calculé pour un autre membre.
|
|
61
64
|
*/
|
|
62
65
|
private getContextHashForCondition;
|
|
63
66
|
/**
|
|
@@ -135,6 +138,10 @@ export declare class ConditionEngine {
|
|
|
135
138
|
private parseStringParam;
|
|
136
139
|
/**
|
|
137
140
|
* Construit le contexte d'évaluation à partir des réponses
|
|
141
|
+
* CORRIGÉ: Le fallback du code brut n'est créé que pour les variables à instance unique
|
|
142
|
+
* (groupes non-multiples où le backend stocke avec numeroMembre).
|
|
143
|
+
* Pour les variables multi-instances, seules les clés suffixées (VAR_1, VAR_2, ...)
|
|
144
|
+
* sont créées, évitant la contamination inter-membres.
|
|
138
145
|
*/
|
|
139
146
|
private buildContext;
|
|
140
147
|
/**
|
|
@@ -144,7 +151,10 @@ export declare class ConditionEngine {
|
|
|
144
151
|
private replaceVariableReferencesWithIterations;
|
|
145
152
|
/**
|
|
146
153
|
* Suffixe les références de variables ${VAR} → ${VAR_N} pour les groupes multiples
|
|
147
|
-
*
|
|
154
|
+
* CORRIGÉ: Utilise isIterativeVariable() pour détecter si la variable est itérative,
|
|
155
|
+
* au lieu de vérifier l'itération spécifique. Cela garantit que même si un membre
|
|
156
|
+
* n'a pas encore répondu, la référence est suffixée (→ undefined = pas encore répondu)
|
|
157
|
+
* plutôt que de tomber sur la valeur d'un autre membre.
|
|
148
158
|
*/
|
|
149
159
|
private suffixVariableReferences;
|
|
150
160
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"condition-engine.d.ts","sourceRoot":"","sources":["../../src/lib/condition-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAIvF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;CACxB;AAGD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IACxC,MAAM,EAAE,OAAO,GAAG,UAAU,EAAE,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,eAAe;IAgBd,OAAO,CAAC,SAAS;IAf7B,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,cAAc,CAAoE;IAC1F,OAAO,CAAC,YAAY,CAAO;IAG3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAIpD;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAuB;gBAEnD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC;IAI7D;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO;IA+C/D
|
|
1
|
+
{"version":3,"file":"condition-engine.d.ts","sourceRoot":"","sources":["../../src/lib/condition-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAIvF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;CACxB;AAGD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IACxC,MAAM,EAAE,OAAO,GAAG,UAAU,EAAE,CAAC;IAC/B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,eAAe;IAgBd,OAAO,CAAC,SAAS;IAf7B,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,cAAc,CAAoE;IAC1F,OAAO,CAAC,YAAY,CAAO;IAG3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAIpD;IAGF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAuB;gBAEnD,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC;IAI7D;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO;IA+C/D;;;OAGG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI;IAOjE;;OAEG;IACH,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAKnD;;;;;OAKG;IACH,OAAO,CAAC,0BAA0B;IAgBlC;;OAEG;IACH,2BAA2B,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI;IAa1D;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAkB/B;;;OAGG;IACH,OAAO,CAAC,cAAc;IAoCtB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAuBtB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA+CzB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAwB5B;;OAEG;IACH,OAAO,CAAC,UAAU;IA0ClB;;;OAGG;IACH,OAAO,CAAC,UAAU;IA8FlB;;OAEG;IACH,cAAc,IAAI,UAAU,EAAE;IAI9B;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAIxB;;;;;;;;OAQG;IACH,kBAAkB,CAChB,mBAAmB,EAAE,MAAM,EAC3B,YAAY,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,MAAM,GACxB,oBAAoB;IA6CvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0E7B;;OAEG;IACH,OAAO,CAAC,mCAAmC;IAS3C;;OAEG;IACH,OAAO,CAAC,gBAAgB;IASxB;;;;;;OAMG;IACH,OAAO,CAAC,YAAY;IA8BpB;;;OAGG;IACH,OAAO,CAAC,uCAAuC;IA0C/C;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IAYhC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAuDnC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAU5B;;;OAGG;IACH,OAAO,CAAC,cAAc;IA8BtB;;OAEG;IACH,OAAO,CAAC,eAAe;IA6BvB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA2CzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAY1B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAyBhC;;OAEG;IACH,OAAO,CAAC,YAAY;IA6CpB;;OAEG;IACH,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAwGhF;;OAEG;IACH,uBAAuB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE;CAwE5D;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,WAAW,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,oBAS3E,CAAC"}
|
|
@@ -39,10 +39,10 @@ export class ConditionEngine {
|
|
|
39
39
|
const cacheKey = currentIteration !== undefined
|
|
40
40
|
? `${condition}::iter${currentIteration}`
|
|
41
41
|
: condition;
|
|
42
|
-
// Vérifier le cache
|
|
42
|
+
// Vérifier le cache (CORRIGÉ: hash sensible à l'itération)
|
|
43
43
|
const cached = this.conditionCache.get(cacheKey);
|
|
44
44
|
if (cached) {
|
|
45
|
-
const currentHash = this.getContextHashForCondition(condition);
|
|
45
|
+
const currentHash = this.getContextHashForCondition(condition, currentIteration);
|
|
46
46
|
if (cached.contextHash === currentHash) {
|
|
47
47
|
return cached.result;
|
|
48
48
|
}
|
|
@@ -51,7 +51,7 @@ export class ConditionEngine {
|
|
|
51
51
|
if (this.isUtilityFunction(condition)) {
|
|
52
52
|
const result = this.evaluateUtilityFunction(condition, currentIteration);
|
|
53
53
|
// Mettre en cache le résultat
|
|
54
|
-
this.cacheResult(cacheKey, condition, result);
|
|
54
|
+
this.cacheResult(cacheKey, condition, result, currentIteration);
|
|
55
55
|
return result;
|
|
56
56
|
}
|
|
57
57
|
// Remplacer les références aux variables avec support des itérations
|
|
@@ -59,7 +59,7 @@ export class ConditionEngine {
|
|
|
59
59
|
// Évaluer l'expression
|
|
60
60
|
const result = this.safeEvaluate(processedCondition);
|
|
61
61
|
// Mettre en cache le résultat
|
|
62
|
-
this.cacheResult(cacheKey, condition, result);
|
|
62
|
+
this.cacheResult(cacheKey, condition, result, currentIteration);
|
|
63
63
|
return result;
|
|
64
64
|
}
|
|
65
65
|
catch (error) {
|
|
@@ -69,15 +69,16 @@ export class ConditionEngine {
|
|
|
69
69
|
}
|
|
70
70
|
/**
|
|
71
71
|
* Met en cache un résultat d'évaluation
|
|
72
|
+
* CORRIGÉ: Passe currentIteration au hash pour distinguer les membres
|
|
72
73
|
*/
|
|
73
|
-
cacheResult(cacheKey, condition, result) {
|
|
74
|
+
cacheResult(cacheKey, condition, result, currentIteration) {
|
|
74
75
|
// Limiter la taille du cache
|
|
75
76
|
if (this.conditionCache.size >= this.maxCacheSize) {
|
|
76
77
|
// Supprimer la première entrée (stratégie FIFO simple)
|
|
77
78
|
const firstKey = this.conditionCache.keys().next().value;
|
|
78
79
|
this.conditionCache.delete(firstKey);
|
|
79
80
|
}
|
|
80
|
-
const contextHash = this.getContextHashForCondition(condition);
|
|
81
|
+
const contextHash = this.getContextHashForCondition(condition, currentIteration);
|
|
81
82
|
this.conditionCache.set(cacheKey, { result, contextHash });
|
|
82
83
|
}
|
|
83
84
|
/**
|
|
@@ -99,11 +100,21 @@ export class ConditionEngine {
|
|
|
99
100
|
/**
|
|
100
101
|
* Génère un hash du contexte pour les variables référencées dans une condition
|
|
101
102
|
* Utilisé pour le cache des résultats d'évaluation
|
|
103
|
+
* CORRIGÉ: Prend en compte l'itération courante pour les variables itératives,
|
|
104
|
+
* évitant que le cache retourne un résultat calculé pour un autre membre.
|
|
102
105
|
*/
|
|
103
|
-
getContextHashForCondition(condition) {
|
|
106
|
+
getContextHashForCondition(condition, currentIteration) {
|
|
104
107
|
const referencedVars = this.getReferencedVariables(condition);
|
|
105
108
|
const relevantContext = referencedVars
|
|
106
|
-
.map(varCode =>
|
|
109
|
+
.map(varCode => {
|
|
110
|
+
// Pour les variables itératives en contexte d'itération,
|
|
111
|
+
// hasher la valeur spécifique à l'itération
|
|
112
|
+
if (currentIteration !== undefined && this.isIterativeVariable(varCode)) {
|
|
113
|
+
const iterKey = `${varCode}_${currentIteration}`;
|
|
114
|
+
return `${iterKey}:${JSON.stringify(this.context[iterKey])}`;
|
|
115
|
+
}
|
|
116
|
+
return `${varCode}:${JSON.stringify(this.context[varCode])}`;
|
|
117
|
+
})
|
|
107
118
|
.join('|');
|
|
108
119
|
return relevantContext;
|
|
109
120
|
}
|
|
@@ -541,24 +552,36 @@ export class ConditionEngine {
|
|
|
541
552
|
}
|
|
542
553
|
/**
|
|
543
554
|
* Construit le contexte d'évaluation à partir des réponses
|
|
555
|
+
* CORRIGÉ: Le fallback du code brut n'est créé que pour les variables à instance unique
|
|
556
|
+
* (groupes non-multiples où le backend stocke avec numeroMembre).
|
|
557
|
+
* Pour les variables multi-instances, seules les clés suffixées (VAR_1, VAR_2, ...)
|
|
558
|
+
* sont créées, évitant la contamination inter-membres.
|
|
544
559
|
*/
|
|
545
560
|
buildContext() {
|
|
546
561
|
this.context = {};
|
|
547
|
-
|
|
562
|
+
// Premier passage : stocker toutes les clés suffixées
|
|
548
563
|
Object.values(this.responses).forEach(response => {
|
|
549
564
|
const key = response.numeroMembre
|
|
550
565
|
? `${response.variableCode}_${response.numeroMembre}`
|
|
551
566
|
: response.variableCode;
|
|
552
567
|
this.context[key] = response.valeur;
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
568
|
+
});
|
|
569
|
+
// Deuxième passage : compter les instances par variableCode
|
|
570
|
+
const instanceCounts = {};
|
|
571
|
+
Object.values(this.responses).forEach(response => {
|
|
572
|
+
if (response.numeroMembre) {
|
|
573
|
+
instanceCounts[response.variableCode] = (instanceCounts[response.variableCode] || 0) + 1;
|
|
574
|
+
}
|
|
575
|
+
});
|
|
576
|
+
// Troisième passage : fallback du code brut UNIQUEMENT pour les variables
|
|
577
|
+
// à instance unique (rétrocompatibilité groupes non-multiples)
|
|
578
|
+
Object.values(this.responses).forEach(response => {
|
|
579
|
+
if (response.numeroMembre &&
|
|
580
|
+
(instanceCounts[response.variableCode] || 0) === 1 &&
|
|
581
|
+
this.context[response.variableCode] === undefined) {
|
|
557
582
|
this.context[response.variableCode] = response.valeur;
|
|
558
583
|
}
|
|
559
|
-
console.log(`🔧 [ConditionEngine] Context entry: ${key} = ${JSON.stringify(response.valeur)}`);
|
|
560
584
|
});
|
|
561
|
-
console.log('🔧 [ConditionEngine] Final context:', this.context);
|
|
562
585
|
}
|
|
563
586
|
/**
|
|
564
587
|
* Remplace les références aux variables en tenant compte des itérations
|
|
@@ -574,6 +597,8 @@ export class ConditionEngine {
|
|
|
574
597
|
// ÉTAPE 3: Gérer les fonctions d'agrégation pour les groupes multiples
|
|
575
598
|
condition = this.replaceAggregationFunctions(condition);
|
|
576
599
|
// ÉTAPE 4: Remplacer les références aux variables par leurs valeurs
|
|
600
|
+
// CORRIGÉ: Pour les variables itératives dont l'itération courante n'a pas de valeur,
|
|
601
|
+
// retourner null au lieu de tomber sur le code brut (contamination inter-membres)
|
|
577
602
|
return condition.replace(/\$\{([A-Z_][A-Z0-9_]*)(?:_(\d+))?\}/g, (match, varCode, iteration) => {
|
|
578
603
|
if (iteration) {
|
|
579
604
|
// Référence à une itération spécifique (ex: ${VAR_2})
|
|
@@ -586,25 +611,32 @@ export class ConditionEngine {
|
|
|
586
611
|
if (iterativeValue !== undefined) {
|
|
587
612
|
return this.formatValueForExpression(iterativeValue);
|
|
588
613
|
}
|
|
614
|
+
// Pour les variables itératives, retourner null plutôt que
|
|
615
|
+
// de tomber sur le code brut (qui contient la valeur d'un autre membre)
|
|
616
|
+
if (this.isIterativeVariable(varCode)) {
|
|
617
|
+
return this.formatValueForExpression(null);
|
|
618
|
+
}
|
|
589
619
|
}
|
|
590
|
-
// Référence normale à une variable globale
|
|
620
|
+
// Référence normale à une variable globale (non-itérative)
|
|
591
621
|
const value = this.context[varCode];
|
|
592
622
|
return this.formatValueForExpression(value);
|
|
593
623
|
});
|
|
594
624
|
}
|
|
595
625
|
/**
|
|
596
626
|
* Suffixe les références de variables ${VAR} → ${VAR_N} pour les groupes multiples
|
|
597
|
-
*
|
|
627
|
+
* CORRIGÉ: Utilise isIterativeVariable() pour détecter si la variable est itérative,
|
|
628
|
+
* au lieu de vérifier l'itération spécifique. Cela garantit que même si un membre
|
|
629
|
+
* n'a pas encore répondu, la référence est suffixée (→ undefined = pas encore répondu)
|
|
630
|
+
* plutôt que de tomber sur la valeur d'un autre membre.
|
|
598
631
|
*/
|
|
599
632
|
suffixVariableReferences(condition, iteration) {
|
|
600
633
|
// Regex pour capturer ${VAR} mais pas ${VAR_N} (déjà suffixé)
|
|
601
634
|
return condition.replace(/\$\{([A-Z_][A-Z0-9_]*)(?!_\d)\}/g, (match, varCode) => {
|
|
602
|
-
//
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
return `\${${iterativeKey}}`;
|
|
635
|
+
// Si au moins une version itérative existe (ex: VAR_1), TOUJOURS suffixer
|
|
636
|
+
if (this.isIterativeVariable(varCode)) {
|
|
637
|
+
return `\${${varCode}_${iteration}}`;
|
|
606
638
|
}
|
|
607
|
-
// Garder la référence globale
|
|
639
|
+
// Garder la référence globale pour les variables non-itératives
|
|
608
640
|
return match;
|
|
609
641
|
});
|
|
610
642
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"form-tree.d.ts","sourceRoot":"","sources":["../../src/lib/form-tree.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"form-tree.d.ts","sourceRoot":"","sources":["../../src/lib/form-tree.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/form-tree.js
CHANGED
|
@@ -671,6 +671,10 @@ export class FormTree {
|
|
|
671
671
|
*/
|
|
672
672
|
evaluateAutoActionsForInstance(groupeCode, instanceNumber) {
|
|
673
673
|
const updates = new Map();
|
|
674
|
+
// CORRECTION Bug 6: Nettoyer les autoActions stales de evaluateGroupConditions()
|
|
675
|
+
// qui ont été créées sans contexte d'instance et contiennent les valeurs du 1er membre.
|
|
676
|
+
// Seules les autoActions créées ci-dessous (avec le bon instanceNumber) seront retournées.
|
|
677
|
+
this.conditionEngine.clearAutoActions();
|
|
674
678
|
// Déterminer quels groupes évaluer
|
|
675
679
|
const groupesToEvaluate = groupeCode
|
|
676
680
|
? [this.groupNodes.get(groupeCode)].filter((g) => g !== undefined)
|
|
@@ -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,CAoDR;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"}
|
|
@@ -51,9 +51,18 @@ export function interpolateVariableLabel(label, allResponses, currentInstanceNum
|
|
|
51
51
|
response = allResponses[keyWithInstance];
|
|
52
52
|
}
|
|
53
53
|
// 3. Si toujours pas trouvé, chercher dans les réponses par variableCode
|
|
54
|
-
//
|
|
54
|
+
// CORRIGÉ: En contexte d'instance, ne retourner que la réponse du membre courant
|
|
55
|
+
// ou une réponse globale (sans numeroMembre), évitant la contamination inter-membres
|
|
55
56
|
if (!response) {
|
|
56
|
-
|
|
57
|
+
if (currentInstanceNumber) {
|
|
58
|
+
// En contexte d'instance : accepter uniquement le membre courant ou global
|
|
59
|
+
response = Object.values(allResponses).find(r => r.variableCode === variableCode &&
|
|
60
|
+
(r.numeroMembre === currentInstanceNumber || !r.numeroMembre));
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Hors contexte d'instance : tout match est acceptable
|
|
64
|
+
response = Object.values(allResponses).find(r => r.variableCode === variableCode);
|
|
65
|
+
}
|
|
57
66
|
}
|
|
58
67
|
// 4. Formater et retourner la valeur si trouvée
|
|
59
68
|
if (response?.valeur !== undefined && response?.valeur !== null && response?.valeur !== '') {
|
package/package.json
CHANGED