@rsuci/shared-form-components 1.0.48 → 1.0.50

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,KAAyC,MAAM,OAAO,CAAC;AAC9D,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;AAmBlF;;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;AA0hBD;;;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,KAAyC,MAAM,OAAO,CAAC;AAC9D,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;AAqBlF;;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;AAkiBD;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAgBpD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -15,6 +15,8 @@ import ConfirmationModal from './ConfirmationModal';
15
15
  import ValidationModal from './ValidationModal';
16
16
  // Composants de rendu
17
17
  import VariableRenderer from '../VariableRenderer';
18
+ import RosterCheckInput from '../roster/RosterCheckInput';
19
+ import RosterListInput from '../roster/RosterListInput';
18
20
  // Hooks et utilitaires
19
21
  import { useFormTree } from '../../hooks/useFormTree';
20
22
  import { interpolateVariableLabel } from '../../lib/utils/interpolateVariableLabel';
@@ -228,7 +230,11 @@ const FormRendererInner = () => {
228
230
  ? `${variable.code}_${currentInstance.numeroInstance}`
229
231
  : variable.code;
230
232
  const currentValue = responses[responseKey]?.valeur;
231
- return (_jsx(VariableRenderer, { variable: variable, value: currentValue, onChange: (value) => handleVariableChange(variable, value), disabled: effectiveDisabled, numeroMembre: currentGroup?.estMultiple ? currentInstance?.numeroInstance : undefined, services: services, geographicComponents: geographicComponents, formulaireVariables: formulaire.variables, allResponses: responses, reponses: responses, interpolateVariableLabel: interpolateVariableLabel }, variable.id));
233
+ // Extraire les variables roster si c'est un type ROSTERCHECK ou ROSTERLIST
234
+ const rosterVariables = (variable.typeCode === 'ROSTERCHECK' || variable.typeCode === 'ROSTERLIST')
235
+ ? variable.rosterVariables
236
+ : undefined;
237
+ return (_jsx(VariableRenderer, { variable: variable, value: currentValue, onChange: (value) => handleVariableChange(variable, value), disabled: effectiveDisabled, numeroMembre: currentGroup?.estMultiple ? currentInstance?.numeroInstance : undefined, services: services, geographicComponents: geographicComponents, formulaireVariables: formulaire.variables, allResponses: responses, reponses: responses, interpolateVariableLabel: interpolateVariableLabel, rosterVariables: rosterVariables, RosterCheckInput: RosterCheckInput, RosterListInput: RosterListInput }, variable.id));
232
238
  }) }), currentGroup?.estMultiple && currentGroup.instances && (_jsx("div", { className: "mt-6 pt-6 border-t", children: _jsx(GroupeInstanceTabs, { groupe: currentGroup, currentInstanceIndex: navigation.navigationState.instanceIndex, responses: responses, onInstanceChange: handleInstanceChange, onInstanceAdded: handleInstanceAdded, onInstanceRemoved: handleInstanceRemoved, disabled: effectiveDisabled }) }))] })] }), _jsx("div", { className: "bg-white rounded-lg shadow-sm border border-gray-200 p-4", children: _jsxs("div", { className: "flex flex-wrap justify-between items-center gap-2", children: [_jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsxs("button", { type: "button", onClick: handlePrevious, disabled: navigation.isFirstGroup || effectiveDisabled, className: `flex items-center px-4 py-2 rounded-lg font-medium transition-colors ${!navigation.isFirstGroup && !effectiveDisabled
233
239
  ? 'bg-orange-500 text-white hover:bg-orange-600'
234
240
  : 'bg-gray-100 text-gray-400 cursor-not-allowed'}`, children: [_jsx("svg", { className: "h-4 w-4 mr-2", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 19l-7-7 7-7" }) }), _jsx("span", { className: "hidden sm:inline", children: labels.previousButton || 'Précédent' }), _jsx("span", { className: "sm:hidden", children: "Pr\u00E9c." })] }), mode === 'admin' && features?.saveDraft && callbacks.onSaveDraft && (_jsx("button", { type: "button", onClick: handleSaveDraft, disabled: effectiveDisabled || isSavingDraft || isSubmitting || isSubmittingForm, className: `flex items-center px-4 py-2 rounded-lg font-medium transition-colors ${!effectiveDisabled && !isSavingDraft && !isSubmitting && !isSubmittingForm
@@ -20,6 +20,9 @@ export interface RosterCheckInputProps {
20
20
  rosterVariables?: RosterVariable[];
21
21
  services?: FormRendererServices;
22
22
  isConsultationMode?: boolean;
23
+ interpolateVariableLabel?: (label: string, responses: Record<string, any>, numeroMembre?: number) => string;
24
+ allResponses?: Record<string, any>;
25
+ numeroMembre?: number;
23
26
  }
24
27
  declare const RosterCheckInput: React.FC<RosterCheckInputProps>;
25
28
  export default RosterCheckInput;
@@ -1 +1 @@
1
- {"version":3,"file":"RosterCheckInput.d.ts","sourceRoot":"","sources":["../../../src/components/roster/RosterCheckInput.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAuC,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IAEnC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAYD,QAAA,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA8LrD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"RosterCheckInput.d.ts","sourceRoot":"","sources":["../../../src/components/roster/RosterCheckInput.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAuC,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IAEnC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5G,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAYD,QAAA,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAoMrD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -12,7 +12,7 @@ import { useMemo, useState, useEffect } from 'react';
12
12
  import { AlertCircle } from 'lucide-react';
13
13
  import { VariableValueConverter } from '../../lib/utils/variableValueConverter';
14
14
  import RosterPanel from './RosterPanel';
15
- const RosterCheckInput = ({ variable, value, onChange, onBlur, error, disabled, rosterVariables = [], services, isConsultationMode = false }) => {
15
+ const RosterCheckInput = ({ variable, value, onChange, onBlur, error, disabled, rosterVariables = [], services, isConsultationMode = false, interpolateVariableLabel, allResponses, numeroMembre }) => {
16
16
  // Parser les options depuis la propriété valeur (format: "01#Option1|02#Option2|...")
17
17
  const options = useMemo(() => {
18
18
  const optionsSource = variable.proprietes?.valeur || variable.valeurDefaut;
@@ -114,7 +114,7 @@ const RosterCheckInput = ({ variable, value, onChange, onBlur, error, disabled,
114
114
  }
115
115
  return (_jsxs("div", { className: "space-y-4", children: [_jsx("div", { children: _jsx("p", { className: "text-sm text-gray-500", children: "Renseignez les options" }) }), _jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: options.map(option => {
116
116
  const isChecked = checkedOptions.has(option.code);
117
- return (_jsx(RosterPanel, { option: option, rosterVariables: sortedRosterVariables, value: currentData[option.code] || {}, onChange: (variableCode, variableValue) => handleVariableChange(option.code, variableCode, variableValue), disabled: disabled, showCheckbox: true, isChecked: isChecked, onCheckChange: (checked) => handleCheckChange(option.code, checked), services: services, isConsultationMode: isConsultationMode }, option.code));
117
+ return (_jsx(RosterPanel, { option: option, rosterVariables: sortedRosterVariables, value: currentData[option.code] || {}, onChange: (variableCode, variableValue) => handleVariableChange(option.code, variableCode, variableValue), disabled: disabled, showCheckbox: true, isChecked: isChecked, onCheckChange: (checked) => handleCheckChange(option.code, checked), services: services, isConsultationMode: isConsultationMode, interpolateVariableLabel: interpolateVariableLabel, allResponses: allResponses, numeroMembre: numeroMembre }, option.code));
118
118
  }) }), checkedOptions.size > 0 && (_jsx("div", { className: "p-2 bg-green-50 border border-green-200 rounded text-sm", children: _jsxs("span", { className: "text-green-800 font-medium", children: [checkedOptions.size, " option(s) coch\u00E9e(s)", Object.keys(currentData).length > 0 && ` · ${Object.keys(currentData).length} avec des données`] }) })), error && (_jsxs("div", { className: "flex items-center space-x-1 text-red-600 text-sm", children: [_jsx(AlertCircle, { className: "h-4 w-4" }), _jsx("span", { children: error })] }))] }));
119
119
  };
120
120
  export default RosterCheckInput;
@@ -20,6 +20,9 @@ export interface RosterListInputProps {
20
20
  rosterVariables?: RosterVariable[];
21
21
  services?: FormRendererServices;
22
22
  isConsultationMode?: boolean;
23
+ interpolateVariableLabel?: (label: string, responses: Record<string, any>, numeroMembre?: number) => string;
24
+ allResponses?: Record<string, any>;
25
+ numeroMembre?: number;
23
26
  }
24
27
  declare const RosterListInput: React.FC<RosterListInputProps>;
25
28
  export default RosterListInput;
@@ -1 +1 @@
1
- {"version":3,"file":"RosterListInput.d.ts","sourceRoot":"","sources":["../../../src/components/roster/RosterListInput.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IAEnC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAYD,QAAA,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAiJnD,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"RosterListInput.d.ts","sourceRoot":"","sources":["../../../src/components/roster/RosterListInput.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,KAAK,EAAE,aAAa,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IAEnC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5G,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAYD,QAAA,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAuJnD,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -12,7 +12,7 @@ import { useMemo } from 'react';
12
12
  import { AlertCircle } from 'lucide-react';
13
13
  import { VariableValueConverter } from '../../lib/utils/variableValueConverter';
14
14
  import RosterPanel from './RosterPanel';
15
- const RosterListInput = ({ variable, value, onChange, onBlur, error, disabled, rosterVariables = [], services, isConsultationMode = false }) => {
15
+ const RosterListInput = ({ variable, value, onChange, onBlur, error, disabled, rosterVariables = [], services, isConsultationMode = false, interpolateVariableLabel, allResponses, numeroMembre }) => {
16
16
  // Parser les options depuis la propriété valeur (format: "01#Option1|02#Option2|...")
17
17
  const options = useMemo(() => {
18
18
  const optionsSource = variable.proprietes?.valeur || variable.valeurDefaut;
@@ -81,6 +81,6 @@ const RosterListInput = ({ variable, value, onChange, onBlur, error, disabled, r
81
81
  if (sortedRosterVariables.length === 0) {
82
82
  return (_jsx("div", { className: "p-3 bg-yellow-50 border border-yellow-200 rounded-lg", children: _jsx("p", { className: "text-yellow-800 text-sm", children: "Aucune variable de roster d\u00E9finie. Veuillez configurer les variables du roster." }) }));
83
83
  }
84
- return (_jsxs("div", { className: "space-y-4", children: [_jsx("div", { children: _jsx("p", { className: "text-sm text-gray-500", children: "Renseignez les options" }) }), _jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: options.map(option => (_jsx(RosterPanel, { option: option, rosterVariables: sortedRosterVariables, value: currentData[option.code] || {}, onChange: (variableCode, newValue) => handleVariableChange(option.code, variableCode, newValue), disabled: disabled, services: services, isConsultationMode: isConsultationMode }, option.code))) }), Object.keys(currentData).length > 0 && (_jsx("div", { className: "p-2 bg-green-50 border border-green-200 rounded text-sm", children: _jsxs("span", { className: "text-green-800 font-medium", children: [Object.keys(currentData).length, " option(s) avec des s\u00E9lections"] }) })), error && (_jsxs("div", { className: "flex items-center space-x-1 text-red-600 text-sm", children: [_jsx(AlertCircle, { className: "h-4 w-4" }), _jsx("span", { children: error })] }))] }));
84
+ return (_jsxs("div", { className: "space-y-4", children: [_jsx("div", { children: _jsx("p", { className: "text-sm text-gray-500", children: "Renseignez les options" }) }), _jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: options.map(option => (_jsx(RosterPanel, { option: option, rosterVariables: sortedRosterVariables, value: currentData[option.code] || {}, onChange: (variableCode, newValue) => handleVariableChange(option.code, variableCode, newValue), disabled: disabled, services: services, isConsultationMode: isConsultationMode, interpolateVariableLabel: interpolateVariableLabel, allResponses: allResponses, numeroMembre: numeroMembre }, option.code))) }), Object.keys(currentData).length > 0 && (_jsx("div", { className: "p-2 bg-green-50 border border-green-200 rounded text-sm", children: _jsxs("span", { className: "text-green-800 font-medium", children: [Object.keys(currentData).length, " option(s) avec des s\u00E9lections"] }) })), error && (_jsxs("div", { className: "flex items-center space-x-1 text-red-600 text-sm", children: [_jsx(AlertCircle, { className: "h-4 w-4" }), _jsx("span", { children: error })] }))] }));
85
85
  };
86
86
  export default RosterListInput;
@@ -6,6 +6,7 @@
6
6
  * (RADIO, COMBOBOX, STRING, etc.) au lieu de simples checkboxes/selects
7
7
  */
8
8
  import React from 'react';
9
+ import { EnqueteReponse } from '../../types/enquete';
9
10
  import { FormRendererServices } from '../../types/services';
10
11
  interface RosterOption {
11
12
  code: string;
@@ -33,6 +34,9 @@ export interface RosterPanelProps {
33
34
  onCheckChange?: (checked: boolean) => void;
34
35
  services?: FormRendererServices;
35
36
  isConsultationMode?: boolean;
37
+ interpolateVariableLabel?: (label: string, responses: Record<string, EnqueteReponse>, numeroMembre?: number) => string;
38
+ allResponses?: Record<string, EnqueteReponse>;
39
+ numeroMembre?: number;
36
40
  }
37
41
  declare const RosterPanel: React.FC<RosterPanelProps>;
38
42
  export default RosterPanel;
@@ -1 +1 @@
1
- {"version":3,"file":"RosterPanel.d.ts","sourceRoot":"","sources":["../../../src/components/roster/RosterPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAM5D,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAGD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAE3C,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAqL3C,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"RosterPanel.d.ts","sourceRoot":"","sources":["../../../src/components/roster/RosterPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,EAAsB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAM5D,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAGD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAE3C,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IACvH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CA2L3C,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -11,7 +11,7 @@ import { useMemo } from 'react';
11
11
  import VariableRenderer from '../VariableRenderer';
12
12
  import { cn } from '../../lib/utils/cn';
13
13
  import { RosterConditionEngine } from '../../lib/roster-condition-engine';
14
- const RosterPanel = ({ option, rosterVariables, value, onChange, disabled, showCheckbox = false, isChecked = true, onCheckChange, services, isConsultationMode = false }) => {
14
+ const RosterPanel = ({ option, rosterVariables, value, onChange, disabled, showCheckbox = false, isChecked = true, onCheckChange, services, isConsultationMode = false, interpolateVariableLabel, allResponses, numeroMembre }) => {
15
15
  // Trier les variables par ordre
16
16
  const sortedVariables = [...rosterVariables].sort((a, b) => a.ordre - b.ordre);
17
17
  // Calculer les variables masquées par les jumps
@@ -105,7 +105,7 @@ const RosterPanel = ({ option, rosterVariables, value, onChange, disabled, showC
105
105
  newValueType: typeof newValue
106
106
  });
107
107
  onChange(rosterVar.code, newValue);
108
- }, disabled: disabled, services: services, isConsultationMode: isConsultationMode }) }, rosterVar.code));
108
+ }, disabled: disabled, services: services, isConsultationMode: isConsultationMode, interpolateVariableLabel: interpolateVariableLabel, allResponses: allResponses, numeroMembre: numeroMembre }) }, rosterVar.code));
109
109
  }) })) : (_jsx("div", { className: "p-4 text-center text-gray-500 bg-gray-50 rounded border border-gray-200", children: _jsx("p", { className: "text-sm", children: "\u2713 Cochez l'option ci-dessus pour renseigner les variables" }) }))] }));
110
110
  };
111
111
  export default RosterPanel;
@@ -69,10 +69,12 @@ export declare class ConditionEngine {
69
69
  * Évalue la fonction setValeur(value, variable, condition)
70
70
  * Enregistre l'action automatique si la condition est vraie
71
71
  * Retourne toujours true (n'affecte pas la visibilité)
72
+ * CORRIGÉ: Suffixe la variable cible et passe currentIteration à parseValue
72
73
  */
73
74
  private evaluateSetValeur;
74
75
  /**
75
76
  * Parse les paramètres de setValeur(value, variable, condition)
77
+ * CORRIGÉ: Extrait le nom de variable sans les ${}
76
78
  */
77
79
  private parseSetValeurParams;
78
80
  /**
@@ -81,6 +83,7 @@ export declare class ConditionEngine {
81
83
  private smartSplit;
82
84
  /**
83
85
  * Parse une valeur depuis une chaîne (string, number, boolean, etc.)
86
+ * CORRIGÉ: Accepte currentIteration et supporte dateDiff() et expressions complexes
84
87
  */
85
88
  private parseValue;
86
89
  /**
@@ -97,8 +100,18 @@ export declare class ConditionEngine {
97
100
  private buildContext;
98
101
  /**
99
102
  * Remplace les références aux variables en tenant compte des itérations
103
+ * ORDRE CORRIGÉ: suffixer d'abord, puis traiter les fonctions de date
100
104
  */
101
105
  private replaceVariableReferencesWithIterations;
106
+ /**
107
+ * Suffixe les références de variables ${VAR} → ${VAR_N} pour les groupes multiples
108
+ * Ne suffixe que si la variable a une version itérative dans le contexte
109
+ */
110
+ private suffixVariableReferences;
111
+ /**
112
+ * Vérifie si une variable est de type itératif (groupe multiple)
113
+ */
114
+ private isIterativeVariable;
102
115
  /**
103
116
  * Remplace les fonctions d'agrégation pour les groupes multiples
104
117
  */
@@ -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,MAAM,kBAAkB,CAAC;AAIjE,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;IAId,OAAO,CAAC,SAAS;IAH7B,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,WAAW,CAAoB;gBAEnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC;IAI7D;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO;IAuB/D;;OAEG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI;IAMjE;;OAEG;IACH,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAKnD;;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;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAwCzB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiB5B;;OAEG;IACH,OAAO,CAAC,UAAU;IA0ClB;;OAEG;IACH,OAAO,CAAC,UAAU;IA8ClB;;OAEG;IACH,cAAc,IAAI,UAAU,EAAE;IAI9B;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAIxB;;OAEG;IACH,OAAO,CAAC,YAAY;IAepB;;OAEG;IACH,OAAO,CAAC,uCAAuC;IA8B/C;;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;IA0CzB;;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"}
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,MAAM,kBAAkB,CAAC;AAIjE,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;IAId,OAAO,CAAC,SAAS;IAH7B,OAAO,CAAC,OAAO,CAAqC;IACpD,OAAO,CAAC,WAAW,CAAoB;gBAEnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC;IAI7D;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO;IAuB/D;;OAEG;IACH,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,IAAI;IAMjE;;OAEG;IACH,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAKnD;;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;;OAEG;IACH,OAAO,CAAC,YAAY;IAepB;;;OAGG;IACH,OAAO,CAAC,uCAAuC;IAmC/C;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAahC;;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"}
@@ -142,6 +142,7 @@ export class ConditionEngine {
142
142
  * Évalue la fonction setValeur(value, variable, condition)
143
143
  * Enregistre l'action automatique si la condition est vraie
144
144
  * Retourne toujours true (n'affecte pas la visibilité)
145
+ * CORRIGÉ: Suffixe la variable cible et passe currentIteration à parseValue
145
146
  */
146
147
  evaluateSetValeur(expression, currentIteration) {
147
148
  try {
@@ -159,11 +160,17 @@ export class ConditionEngine {
159
160
  const processedCondition = this.replaceVariableReferencesWithIterations(condition, currentIteration);
160
161
  shouldExecute = this.safeEvaluate(processedCondition);
161
162
  }
163
+ // CORRECTION 3: Suffixer la variable cible si dans une itération
164
+ let targetVariable = variable;
165
+ if (currentIteration !== undefined && this.isIterativeVariable(variable)) {
166
+ targetVariable = `${variable}_${currentIteration}`;
167
+ }
162
168
  // Créer l'action automatique
169
+ // CORRECTION 4: Passer currentIteration à parseValue
163
170
  const action = {
164
171
  type: 'setValue',
165
- targetVariable: variable,
166
- value: this.parseValue(value),
172
+ targetVariable: targetVariable,
173
+ value: this.parseValue(value, currentIteration),
167
174
  condition: condition || '',
168
175
  shouldExecute
169
176
  };
@@ -178,6 +185,7 @@ export class ConditionEngine {
178
185
  }
179
186
  /**
180
187
  * Parse les paramètres de setValeur(value, variable, condition)
188
+ * CORRIGÉ: Extrait le nom de variable sans les ${}
181
189
  */
182
190
  parseSetValeurParams(paramsString) {
183
191
  try {
@@ -186,7 +194,12 @@ export class ConditionEngine {
186
194
  if (params.length < 2)
187
195
  return null;
188
196
  const value = params[0].trim();
189
- const variable = params[1].trim();
197
+ let variable = params[1].trim();
198
+ // CORRECTION 9: Extraire le nom de variable sans ${}
199
+ const varMatch = variable.match(/^\$\{([A-Z_][A-Z0-9_]*(?:_\d+)?)\}$/);
200
+ if (varMatch) {
201
+ variable = varMatch[1]; // "AGE" au lieu de "${AGE}"
202
+ }
190
203
  const condition = params.length > 2 ? params.slice(2).join(',').trim() : '';
191
204
  return { value, variable, condition };
192
205
  }
@@ -236,8 +249,9 @@ export class ConditionEngine {
236
249
  }
237
250
  /**
238
251
  * Parse une valeur depuis une chaîne (string, number, boolean, etc.)
252
+ * CORRIGÉ: Accepte currentIteration et supporte dateDiff() et expressions complexes
239
253
  */
240
- parseValue(valueStr) {
254
+ parseValue(valueStr, currentIteration) {
241
255
  const trimmed = valueStr.trim();
242
256
  // Chaîne entre guillemets
243
257
  if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
@@ -263,7 +277,12 @@ export class ConditionEngine {
263
277
  return new Date();
264
278
  // Fonction dateAdd() - traiter et retourner la date calculée
265
279
  if (trimmed.startsWith('dateAdd(')) {
266
- const processed = this.processDateAdd(trimmed);
280
+ // CORRECTION: Suffixer les variables si nécessaire
281
+ let processed = trimmed;
282
+ if (currentIteration !== undefined) {
283
+ processed = this.suffixVariableReferences(processed, currentIteration);
284
+ }
285
+ processed = this.processDateAdd(processed);
267
286
  // Si le traitement a réussi, processed contient "new Date("ISO_STRING")"
268
287
  const dateMatch = processed.match(/^new Date\(["']([^"']+)["']\)$/);
269
288
  if (dateMatch) {
@@ -271,10 +290,51 @@ export class ConditionEngine {
271
290
  }
272
291
  return null;
273
292
  }
274
- // Variable référence
275
- if (trimmed.startsWith('${') && trimmed.endsWith('}')) {
276
- const varCode = trimmed.slice(2, -1);
277
- return this.context[varCode] || null;
293
+ // CORRECTION 7: Fonction dateDiff() - traiter et retourner le nombre calculé
294
+ if (trimmed.startsWith('dateDiff(')) {
295
+ // Suffixer les variables si nécessaire
296
+ let processed = trimmed;
297
+ if (currentIteration !== undefined) {
298
+ processed = this.suffixVariableReferences(processed, currentIteration);
299
+ }
300
+ processed = this.processDateDiff(processed);
301
+ // Si le traitement a réussi, processed est un nombre
302
+ const numValue = parseFloat(processed);
303
+ if (!isNaN(numValue)) {
304
+ return numValue;
305
+ }
306
+ return null;
307
+ }
308
+ // Variable référence simple ${VAR} ou ${VAR_N}
309
+ const simpleVarMatch = trimmed.match(/^\$\{([A-Z_][A-Z0-9_]*(?:_\d+)?)\}$/);
310
+ if (simpleVarMatch) {
311
+ const varCode = simpleVarMatch[1];
312
+ // CORRECTION 4: Chercher d'abord la version itérative
313
+ if (currentIteration !== undefined && !varCode.match(/_\d+$/)) {
314
+ const iterativeKey = `${varCode}_${currentIteration}`;
315
+ if (this.context[iterativeKey] !== undefined) {
316
+ return this.context[iterativeKey];
317
+ }
318
+ }
319
+ // Sinon chercher la version globale
320
+ return this.context[varCode] ?? null;
321
+ }
322
+ // CORRECTION 8: Expression complexe contenant des variables (ex: ${AGE} + 1)
323
+ if (trimmed.includes('${')) {
324
+ try {
325
+ // Remplacer les variables et évaluer
326
+ let processed = trimmed;
327
+ if (currentIteration !== undefined) {
328
+ processed = this.suffixVariableReferences(processed, currentIteration);
329
+ }
330
+ processed = this.replaceVariableReferencesWithIterations(processed, currentIteration);
331
+ // Évaluer l'expression
332
+ const result = new Function(`"use strict"; return (${processed})`)();
333
+ return result;
334
+ }
335
+ catch {
336
+ return null;
337
+ }
278
338
  }
279
339
  // Par défaut, traiter comme chaîne
280
340
  return trimmed;
@@ -308,16 +368,21 @@ export class ConditionEngine {
308
368
  }
309
369
  /**
310
370
  * Remplace les références aux variables en tenant compte des itérations
371
+ * ORDRE CORRIGÉ: suffixer d'abord, puis traiter les fonctions de date
311
372
  */
312
373
  replaceVariableReferencesWithIterations(condition, currentIteration) {
313
- // Gérer les fonctions de date EN PREMIER (avant les variables)
374
+ // ÉTAPE 1 (NOUVEAU): Suffixer les références ${VAR} ${VAR_index} AVANT les fonctions de date
375
+ if (currentIteration !== undefined) {
376
+ condition = this.suffixVariableReferences(condition, currentIteration);
377
+ }
378
+ // ÉTAPE 2: Gérer les fonctions de date (maintenant avec variables suffixées)
314
379
  condition = this.replaceDateFunctions(condition);
315
- // Gérer les fonctions d'agrégation pour les groupes multiples
380
+ // ÉTAPE 3: Gérer les fonctions d'agrégation pour les groupes multiples
316
381
  condition = this.replaceAggregationFunctions(condition);
317
- // Remplacer les références aux variables normales et itératives
382
+ // ÉTAPE 4: Remplacer les références aux variables par leurs valeurs
318
383
  return condition.replace(/\$\{([A-Z_][A-Z0-9_]*)(?:_(\d+))?\}/g, (match, varCode, iteration) => {
319
384
  if (iteration) {
320
- // Référence à une itération spécifique
385
+ // Référence à une itération spécifique (ex: ${VAR_2})
321
386
  const value = this.context[`${varCode}_${iteration}`];
322
387
  return this.formatValueForExpression(value);
323
388
  }
@@ -328,11 +393,34 @@ export class ConditionEngine {
328
393
  return this.formatValueForExpression(iterativeValue);
329
394
  }
330
395
  }
331
- // Référence normale à une variable
396
+ // Référence normale à une variable globale
332
397
  const value = this.context[varCode];
333
398
  return this.formatValueForExpression(value);
334
399
  });
335
400
  }
401
+ /**
402
+ * Suffixe les références de variables ${VAR} → ${VAR_N} pour les groupes multiples
403
+ * Ne suffixe que si la variable a une version itérative dans le contexte
404
+ */
405
+ suffixVariableReferences(condition, iteration) {
406
+ // Regex pour capturer ${VAR} mais pas ${VAR_N} (déjà suffixé)
407
+ return condition.replace(/\$\{([A-Z_][A-Z0-9_]*)(?!_\d)\}/g, (match, varCode) => {
408
+ // Vérifier si cette variable a une version itérative
409
+ const iterativeKey = `${varCode}_${iteration}`;
410
+ if (this.context[iterativeKey] !== undefined) {
411
+ return `\${${iterativeKey}}`;
412
+ }
413
+ // Garder la référence globale si pas de version itérative
414
+ return match;
415
+ });
416
+ }
417
+ /**
418
+ * Vérifie si une variable est de type itératif (groupe multiple)
419
+ */
420
+ isIterativeVariable(varCode) {
421
+ // Chercher si au moins une version itérative existe
422
+ return this.context[`${varCode}_1`] !== undefined;
423
+ }
336
424
  /**
337
425
  * Remplace les fonctions d'agrégation pour les groupes multiples
338
426
  */
@@ -466,8 +554,9 @@ export class ConditionEngine {
466
554
  if (quotedMatch) {
467
555
  return parseDateString(quotedMatch[1]);
468
556
  }
469
- // Référence de variable ${CODE} - récupérer la valeur du contexte
470
- const varMatch = trimmed.match(/^\$\{([A-Z_][A-Z0-9_]*)\}$/);
557
+ // Référence de variable ${CODE} ou ${CODE_N} - récupérer la valeur du contexte
558
+ // CORRIGÉ: Accepter aussi les suffixes _N (ex: ${VAR_1}, ${VAR_2})
559
+ const varMatch = trimmed.match(/^\$\{([A-Z_][A-Z0-9_]*(?:_\d+)?)\}$/);
471
560
  if (varMatch) {
472
561
  const value = this.context[varMatch[1]];
473
562
  if (value instanceof Date) {
@@ -92,6 +92,16 @@ export declare class FormTree implements IFormTree {
92
92
  * (showMe, hideMe, setValeur, etc.)
93
93
  */
94
94
  getConditionEngine(): ConditionEngine;
95
+ /**
96
+ * Exécute les AutoActions créées par setValeur() et retourne les mises à jour à appliquer
97
+ * @returns Map<variableCode, valeur> des variables à mettre à jour
98
+ */
99
+ executeAutoActions(): Map<string, VariableValue>;
100
+ /**
101
+ * Évalue les conditions et exécute les auto-actions, retournant toutes les mises à jour
102
+ * Méthode utilitaire combinant evaluateAll() et executeAutoActions()
103
+ */
104
+ evaluateAndExecuteActions(): Map<string, VariableValue>;
95
105
  /**
96
106
  * Retourne un snapshot de l'état complet pour debug
97
107
  */
@@ -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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"}
@@ -570,6 +570,33 @@ export class FormTree {
570
570
  getConditionEngine() {
571
571
  return this.conditionEngine;
572
572
  }
573
+ // ============ AUTO-ACTIONS ============
574
+ /**
575
+ * Exécute les AutoActions créées par setValeur() et retourne les mises à jour à appliquer
576
+ * @returns Map<variableCode, valeur> des variables à mettre à jour
577
+ */
578
+ executeAutoActions() {
579
+ const actions = this.conditionEngine.getAutoActions();
580
+ const updates = new Map();
581
+ this.log(`Executing ${actions.length} auto-actions`);
582
+ for (const action of actions) {
583
+ if (action.shouldExecute && action.type === 'setValue') {
584
+ updates.set(action.targetVariable, action.value);
585
+ this.log(`AutoAction: Setting ${action.targetVariable} = ${JSON.stringify(action.value)}`);
586
+ }
587
+ }
588
+ // Nettoyer les auto-actions après exécution
589
+ this.conditionEngine.clearAutoActions();
590
+ return updates;
591
+ }
592
+ /**
593
+ * Évalue les conditions et exécute les auto-actions, retournant toutes les mises à jour
594
+ * Méthode utilitaire combinant evaluateAll() et executeAutoActions()
595
+ */
596
+ evaluateAndExecuteActions() {
597
+ this.evaluateAll();
598
+ return this.executeAutoActions();
599
+ }
573
600
  // ============ DEBUG ============
574
601
  /**
575
602
  * Retourne un snapshot de l'état complet pour debug
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsuci/shared-form-components",
3
- "version": "1.0.48",
3
+ "version": "1.0.50",
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",