@rsuci/shared-form-components 1.0.79 → 1.0.80

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;AAuuBD;;;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;AA0wBD;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAgBpD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -29,6 +29,18 @@ const FormRendererInner = () => {
29
29
  const { formulaire, enquete, config, callbacks, services, geographicComponents, navigation, validation, instances, responses, updateResponse, hasUnsavedChanges, isSubmitting, effectiveDisabled, currentGroup, currentInstance, groupesWithInstances } = context;
30
30
  const { mode, features } = config;
31
31
  const labels = config.labels || {};
32
+ // Map de fallback: variableCode → réponse (même stratégie que interpolateVariableLabel)
33
+ // Permet de trouver les réponses dont la clé utilise un suffixe _N (ex: S1_01_1)
34
+ // alors que le rendu cherche par code simple (ex: S1_01)
35
+ const responsesByVariableCode = useMemo(() => {
36
+ const map = new Map();
37
+ Object.values(responses).forEach((response) => {
38
+ if (response?.variableCode && !map.has(response.variableCode)) {
39
+ map.set(response.variableCode, response);
40
+ }
41
+ });
42
+ return map;
43
+ }, [responses]);
32
44
  // État local pour les modals et actions
33
45
  const [showCancelModal, setShowCancelModal] = useState(false);
34
46
  const [showValidationModal, setShowValidationModal] = useState(false);
@@ -118,9 +130,17 @@ const FormRendererInner = () => {
118
130
  }, [currentGroup, getFilteredVariables, isVariableVisible]);
119
131
  // Handler pour le changement de variable
120
132
  const handleVariableChange = useCallback((variable, value) => {
121
- const numeroMembre = currentGroup?.estMultiple
133
+ let numeroMembre = currentGroup?.estMultiple
122
134
  ? currentInstance?.numeroInstance
123
135
  : undefined;
136
+ // Pour les groupes non-multiples, préserver le numeroMembre existant du backend
137
+ // afin que la sauvegarde utilise la même clé que le chargement
138
+ if (numeroMembre === undefined) {
139
+ const existingResponse = responsesByVariableCode.get(variable.code);
140
+ if (existingResponse?.numeroMembre) {
141
+ numeroMembre = existingResponse.numeroMembre;
142
+ }
143
+ }
124
144
  updateResponse(variable.code, value, variable, numeroMembre);
125
145
  // Mettre à jour le contexte du ConditionEngine immédiatement avec la nouvelle valeur
126
146
  // avant de lancer la validation (sinon le contexte est en retard d'un cycle React)
@@ -143,7 +163,7 @@ const FormRendererInner = () => {
143
163
  // Réévaluer les validations des variables dépendantes
144
164
  const groupes = groupesWithInstances.length > 0 ? groupesWithInstances : formulaire?.groupes || [];
145
165
  revalidateDependents(variable.code, groupes, numeroMembre);
146
- }, [currentGroup, currentInstance, updateResponse, conditionEngine, validateConditionVariable, revalidateDependents, groupesWithInstances, formulaire?.groupes]);
166
+ }, [currentGroup, currentInstance, updateResponse, conditionEngine, validateConditionVariable, revalidateDependents, groupesWithInstances, formulaire?.groupes, responsesByVariableCode]);
147
167
  // Handler pour remplir le formulaire depuis les données d'une enquête sélectionnée
148
168
  const handleFillFormFromEnquete = useCallback((enqueteData) => {
149
169
  if (!enqueteData?.reponses)
@@ -364,7 +384,15 @@ const FormRendererInner = () => {
364
384
  const responseKey = currentGroup?.estMultiple && currentInstance?.numeroInstance
365
385
  ? `${variable.code}_${currentInstance.numeroInstance}`
366
386
  : variable.code;
367
- const currentValue = responses[responseKey]?.valeur;
387
+ let currentValue = responses[responseKey]?.valeur;
388
+ // Fallback: si pas trouvé par clé directe, chercher par variableCode
389
+ // (gère les groupes non-multiples où le backend stocke avec numero_membre)
390
+ if (currentValue === undefined) {
391
+ const fallbackResponse = responsesByVariableCode.get(variable.code);
392
+ if (fallbackResponse) {
393
+ currentValue = fallbackResponse.valeur;
394
+ }
395
+ }
368
396
  // Debug log pour tracer le flux de données géographiques
369
397
  if (['DISTRICT', 'REGION', 'DEPARTEMENT', 'SOUSPREFECTURE', 'QUARTIER'].includes(variable.typeCode)) {
370
398
  console.log('[FormRenderer] Variable géographique:', {
@@ -381,7 +409,11 @@ const FormRendererInner = () => {
381
409
  const rosterVariables = (variable.typeCode === 'ROSTERCHECK' || variable.typeCode === 'ROSTERLIST')
382
410
  ? variable.rosterVariables
383
411
  : undefined;
384
- return (_jsx(VariableRenderer, { variable: variable, value: currentValue, onChange: (value) => handleVariableChange(variable, value), disabled: effectiveDisabled, numeroMembre: currentGroup?.estMultiple ? currentInstance?.numeroInstance : undefined, conditionValidationError: getConditionErrorForVariable(variable.code, currentGroup?.estMultiple ? currentInstance?.numeroInstance : undefined), services: services, geographicComponents: geographicComponents, formulaireVariables: formulaire.variables, allResponses: responses, reponses: responses, interpolateVariableLabel: interpolateVariableLabel, rosterVariables: rosterVariables, RosterCheckInput: RosterCheckInput, RosterListInput: RosterListInput, onFillFormFromEnquete: handleFillFormFromEnquete }, variable.id));
412
+ return (_jsx(VariableRenderer, { variable: variable, value: currentValue, onChange: (value) => handleVariableChange(variable, value), disabled: effectiveDisabled, numeroMembre: currentGroup?.estMultiple
413
+ ? currentInstance?.numeroInstance
414
+ : responsesByVariableCode.get(variable.code)?.numeroMembre, conditionValidationError: getConditionErrorForVariable(variable.code, currentGroup?.estMultiple
415
+ ? currentInstance?.numeroInstance
416
+ : responsesByVariableCode.get(variable.code)?.numeroMembre), services: services, geographicComponents: geographicComponents, formulaireVariables: formulaire.variables, allResponses: responses, reponses: responses, interpolateVariableLabel: interpolateVariableLabel, rosterVariables: rosterVariables, RosterCheckInput: RosterCheckInput, RosterListInput: RosterListInput, onFillFormFromEnquete: handleFillFormFromEnquete }, variable.id));
385
417
  }) }), 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 || (!isConsultationMode && effectiveDisabled), className: `flex items-center px-4 py-2 rounded-lg font-medium transition-colors ${!navigation.isFirstGroup && (isConsultationMode || !effectiveDisabled)
386
418
  ? 'bg-orange-500 text-white hover:bg-orange-600'
387
419
  : '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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsuci/shared-form-components",
3
- "version": "1.0.79",
3
+ "version": "1.0.80",
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",