@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;
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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