@rsuci/shared-form-components 1.0.3 → 1.0.4
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/VariableRenderer.d.ts.map +1 -1
- package/dist/components/VariableRenderer.js +2 -2
- package/dist/components/inputs/GeographicCascadeInput.d.ts.map +1 -1
- package/dist/components/inputs/GeographicCascadeInput.js +15 -11
- package/dist/components/selectors/EnqueteInput.d.ts +4 -3
- package/dist/components/selectors/EnqueteInput.d.ts.map +1 -1
- package/dist/components/selectors/EnqueteInput.js +52 -13
- package/dist/components/selectors/MenageInput.d.ts +4 -3
- package/dist/components/selectors/MenageInput.d.ts.map +1 -1
- package/dist/components/selectors/MenageInput.js +52 -13
- package/dist/utils/variableDependencyResolver.d.ts +3 -2
- package/dist/utils/variableDependencyResolver.d.ts.map +1 -1
- package/dist/utils/variableDependencyResolver.js +5 -3
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariableRenderer.d.ts","sourceRoot":"","sources":["../../src/components/VariableRenderer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,CAAC;AA2BxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,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,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC9D,qBAAqB,CAAC,EAAE,CAAC,WAAW,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjE,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC3C,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChG,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAG/B,gBAAgB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;IAC9D,eAAe,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;IAC7D,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAGvH,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,oBAAoB,CAAC,EAAE,GAAG,CAAC;CAC5B;AAGD,QAAA,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAQvD,CAAC;AAGF,QAAA,MAAM,mBAAmB,GACvB,UAAU,MAAM,EAChB,mBAAmB,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,EAC7D,kBAAkB,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,KAC3D,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAgD3C,CAAC;AAGF,QAAA,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"VariableRenderer.d.ts","sourceRoot":"","sources":["../../src/components/VariableRenderer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,CAAC;AA2BxC,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC1F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,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,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC9D,qBAAqB,CAAC,EAAE,CAAC,WAAW,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjE,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC3C,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChG,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAG/B,gBAAgB,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;IAC9D,eAAe,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;IAC7D,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAGvH,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,oBAAoB,CAAC,EAAE,GAAG,CAAC;CAC5B;AAGD,QAAA,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAQvD,CAAC;AAGF,QAAA,MAAM,mBAAmB,GACvB,UAAU,MAAM,EAChB,mBAAmB,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,EAC7D,kBAAkB,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,KAC3D,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAgD3C,CAAC;AAGF,QAAA,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAmGrD,CAAC;AAEF,eAAe,gBAAgB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -53,7 +53,7 @@ const getVariableRenderer = (typeCode, RosterCheckInput, RosterListInput) => {
|
|
|
53
53
|
return renderers[typeCode] || StringInput;
|
|
54
54
|
};
|
|
55
55
|
// Composant principal VariableRenderer
|
|
56
|
-
const VariableRenderer = ({ variable, value, onChange, onBlur, error, disabled, numeroMembre, valeurMin, onFillFormFromMenage, onFillFormFromEnquete, formulaireVariables, rosterVariables, allResponses = {}, RosterCheckInput, RosterListInput, interpolateVariableLabel, reponses = {} }) => {
|
|
56
|
+
const VariableRenderer = ({ variable, value, onChange, onBlur, error, disabled, numeroMembre, valeurMin, onFillFormFromMenage, onFillFormFromEnquete, formulaireVariables, rosterVariables, allResponses = {}, RosterCheckInput, RosterListInput, interpolateVariableLabel, reponses = {}, services }) => {
|
|
57
57
|
const RendererComponent = getVariableRenderer(variable.typeCode, RosterCheckInput, RosterListInput);
|
|
58
58
|
// Interpoler le libellé avec les valeurs des autres variables (si fonction fournie)
|
|
59
59
|
const interpolatedDesignation = interpolateVariableLabel
|
|
@@ -77,7 +77,7 @@ const VariableRenderer = ({ variable, value, onChange, onBlur, error, disabled,
|
|
|
77
77
|
length: Array.isArray(rosterVariables) ? rosterVariables.length : 'N/A'
|
|
78
78
|
});
|
|
79
79
|
return null;
|
|
80
|
-
})(), _jsx(RendererComponent, { variable: variable, value: value, onChange: onChange, onBlur: onBlur, error: error, disabled: disabled, numeroMembre: numeroMembre, valeurMin: valeurMin, onFillFormFromMenage: onFillFormFromMenage, onFillFormFromEnquete: onFillFormFromEnquete, formulaireVariables: formulaireVariables, rosterVariables: rosterVariables, allResponses: allResponses, reponses: reponses })] }), variable.proprietes?.helpText && (_jsx("p", { className: "text-xs text-gray-500", children: variable.proprietes.helpText })), 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 })] }))] }));
|
|
80
|
+
})(), _jsx(RendererComponent, { variable: variable, value: value, onChange: onChange, onBlur: onBlur, error: error, disabled: disabled, numeroMembre: numeroMembre, valeurMin: valeurMin, onFillFormFromMenage: onFillFormFromMenage, onFillFormFromEnquete: onFillFormFromEnquete, formulaireVariables: formulaireVariables, rosterVariables: rosterVariables, allResponses: allResponses, reponses: reponses, services: services })] }), variable.proprietes?.helpText && (_jsx("p", { className: "text-xs text-gray-500", children: variable.proprietes.helpText })), 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 })] }))] }));
|
|
81
81
|
};
|
|
82
82
|
export default VariableRenderer;
|
|
83
83
|
export { getVariableRenderer, GeographicFallback };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeographicCascadeInput.d.ts","sourceRoot":"","sources":["../../../src/components/inputs/GeographicCascadeInput.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAUhE;;GAEG;AACH,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAWD,UAAU,2BAA2B;IACnC,QAAQ,EAAE,GAAG,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,
|
|
1
|
+
{"version":3,"file":"GeographicCascadeInput.d.ts","sourceRoot":"","sources":["../../../src/components/inputs/GeographicCascadeInput.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAUhE;;GAEG;AACH,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAWD,UAAU,2BAA2B;IACnC,QAAQ,EAAE,GAAG,CAAC;IACd,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CAoLxE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -13,11 +13,15 @@ export const GeographicCascadeInput = ({ variable, value, onChange, reponses, di
|
|
|
13
13
|
const [loading, setLoading] = useState(false);
|
|
14
14
|
const [error, setError] = useState(null);
|
|
15
15
|
// 1. Déterminer si ce type nécessite un parent
|
|
16
|
-
const needsParent = requiresParent(variable.
|
|
16
|
+
const needsParent = requiresParent(variable.typeCode);
|
|
17
17
|
// 2. Résoudre la valeur du parent depuis les réponses
|
|
18
18
|
const parentValue = resolveParentValue(variable, reponses);
|
|
19
|
-
// 3.
|
|
20
|
-
const
|
|
19
|
+
// 3. Pour DISTRICT, déterminer le code pays (depuis variable.valeur ou défaut 'CIV')
|
|
20
|
+
const countryCode = variable.typeCode === 'DISTRICT'
|
|
21
|
+
? (variable.valeur || 'CIV')
|
|
22
|
+
: undefined;
|
|
23
|
+
// 4. Déterminer l'endpoint API à appeler
|
|
24
|
+
const apiEndpoint = getApiEndpoint(variable.typeCode, parentValue, countryCode);
|
|
21
25
|
// 4. Fonction pour charger les données
|
|
22
26
|
const fetchData = useCallback(async () => {
|
|
23
27
|
// Si un parent est requis mais absent, ne rien charger
|
|
@@ -51,8 +55,8 @@ export const GeographicCascadeInput = ({ variable, value, onChange, reponses, di
|
|
|
51
55
|
}
|
|
52
56
|
}
|
|
53
57
|
catch (err) {
|
|
54
|
-
console.error(`Error fetching ${variable.
|
|
55
|
-
setError(`Erreur de chargement des ${variable.
|
|
58
|
+
console.error(`Error fetching ${variable.typeCode}:`, err);
|
|
59
|
+
setError(`Erreur de chargement des ${variable.designation?.toLowerCase() || 'données'}`);
|
|
56
60
|
setItems([]);
|
|
57
61
|
}
|
|
58
62
|
finally {
|
|
@@ -93,12 +97,12 @@ export const GeographicCascadeInput = ({ variable, value, onChange, reponses, di
|
|
|
93
97
|
if (loading)
|
|
94
98
|
return 'Chargement...';
|
|
95
99
|
if (needsParent && !parentValue) {
|
|
96
|
-
return `Sélectionnez d'abord ${getParentLabel(variable.
|
|
100
|
+
return `Sélectionnez d'abord ${getParentLabel(variable.typeCode)}`;
|
|
97
101
|
}
|
|
98
102
|
if (items.length === 0 && !loading) {
|
|
99
|
-
return `Aucun(e) ${variable.
|
|
103
|
+
return `Aucun(e) ${variable.designation?.toLowerCase() || 'élément'} disponible`;
|
|
100
104
|
}
|
|
101
|
-
return `Sélectionner ${variable.
|
|
105
|
+
return `Sélectionner ${variable.designation || 'un élément'}...`;
|
|
102
106
|
};
|
|
103
107
|
// 10. Convertir les items en SelectOption pour SearchableSelect
|
|
104
108
|
const options = items.map(item => ({
|
|
@@ -114,10 +118,10 @@ export const GeographicCascadeInput = ({ variable, value, onChange, reponses, di
|
|
|
114
118
|
} : null;
|
|
115
119
|
// 12. Rendu du composant
|
|
116
120
|
return (_jsxs("div", { className: "w-full", children: [_jsx(SearchableSelect, { options: options, value: currentValue, onChange: handleChange, placeholder: getPlaceholder(), searchPlaceholder: "Rechercher...", disabled: isDisabled, required: required, loading: loading, error: error || undefined, className: className, noOptionsMessage: needsParent && !parentValue
|
|
117
|
-
? `Veuillez d'abord sélectionner ${getParentLabel(variable.
|
|
118
|
-
: `Aucun(e) ${variable.
|
|
121
|
+
? `Veuillez d'abord sélectionner ${getParentLabel(variable.typeCode)}`
|
|
122
|
+
: `Aucun(e) ${variable.designation?.toLowerCase() || 'élément'} disponible`, formatOptionLabel: (option) => {
|
|
119
123
|
// Formater le label avec le code si disponible
|
|
120
124
|
return option.code ? `${option.code} ${option.designation}` : option.designation;
|
|
121
|
-
} }), needsParent && !parentValue && !loading && !error && (_jsxs("p", { className: "mt-1 text-sm text-gray-500 flex items-center", children: [_jsx("svg", { className: "w-4 h-4 mr-1", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { fillRule: "evenodd", d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z", clipRule: "evenodd" }) }), "Veuillez d'abord s\u00E9lectionner ", getParentLabel(variable.
|
|
125
|
+
} }), needsParent && !parentValue && !loading && !error && (_jsxs("p", { className: "mt-1 text-sm text-gray-500 flex items-center", children: [_jsx("svg", { className: "w-4 h-4 mr-1", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { fillRule: "evenodd", d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z", clipRule: "evenodd" }) }), "Veuillez d'abord s\u00E9lectionner ", getParentLabel(variable.typeCode)] })), loading && (_jsxs("p", { className: "mt-1 text-sm text-blue-600 flex items-center", children: [_jsxs("svg", { className: "animate-spin h-4 w-4 mr-1", fill: "none", viewBox: "0 0 24 24", children: [_jsx("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), _jsx("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" })] }), "Chargement des donn\u00E9es..."] }))] }));
|
|
122
126
|
};
|
|
123
127
|
export default GeographicCascadeInput;
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
|
|
3
|
-
id: number;
|
|
4
|
-
}
|
|
2
|
+
import { EnqueteCompletDto } from '../../types/services';
|
|
5
3
|
export interface EnqueteInputProps {
|
|
6
4
|
variable: {
|
|
7
5
|
typeCode: string;
|
|
@@ -22,6 +20,9 @@ export interface EnqueteInputProps {
|
|
|
22
20
|
valeurMin?: number;
|
|
23
21
|
onFillFormFromEnquete?: (enqueteData: EnqueteCompletDto) => void;
|
|
24
22
|
formulaireVariables?: any[];
|
|
23
|
+
services?: {
|
|
24
|
+
fetchEnquetes?: (filter?: any) => Promise<EnqueteCompletDto[]>;
|
|
25
|
+
};
|
|
25
26
|
}
|
|
26
27
|
declare const EnqueteInput: React.FC<EnqueteInputProps>;
|
|
27
28
|
export { EnqueteInput };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnqueteInput.d.ts","sourceRoot":"","sources":["../../../src/components/selectors/EnqueteInput.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"EnqueteInput.d.ts","sourceRoot":"","sources":["../../../src/components/selectors/EnqueteInput.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,UAAU,CAAC,EAAE;YACX,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE,CAAC,WAAW,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjE,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE;QACT,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;KAChE,CAAC;CACH;AAED,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAmF7C,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,eAAe,YAAY,CAAC"}
|
|
@@ -1,21 +1,60 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
import { useState, useEffect } from 'react';
|
|
4
|
+
import SearchableSelect from '../inputs/SearchableSelect';
|
|
5
|
+
const EnqueteInput = ({ variable, value, onChange, error, disabled, onFillFormFromEnquete, services }) => {
|
|
6
|
+
const [enquetes, setEnquetes] = useState([]);
|
|
7
|
+
const [loading, setLoading] = useState(false);
|
|
8
|
+
const [loadError, setLoadError] = useState(null);
|
|
9
|
+
// Charger les enquêtes au montage du composant
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
const loadEnquetes = async () => {
|
|
12
|
+
if (!services?.fetchEnquetes) {
|
|
13
|
+
setLoadError('Service de chargement des enquêtes non disponible');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
setLoading(true);
|
|
17
|
+
setLoadError(null);
|
|
18
|
+
try {
|
|
19
|
+
const data = await services.fetchEnquetes();
|
|
20
|
+
setEnquetes(data);
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
console.error('Erreur lors du chargement des enquêtes:', err);
|
|
24
|
+
setLoadError('Erreur lors du chargement des enquêtes');
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
setLoading(false);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
loadEnquetes();
|
|
31
|
+
}, [services]);
|
|
32
|
+
// Convertir les enquêtes en options pour SearchableSelect
|
|
33
|
+
const options = enquetes.map(enquete => ({
|
|
34
|
+
id: enquete.id,
|
|
35
|
+
code: enquete.numeroEnquete || enquete.id.toString(),
|
|
36
|
+
designation: `Enquête ${enquete.numeroEnquete || enquete.id}` + (enquete.formulaireId ? ` - Formulaire ${enquete.formulaireId}` : '')
|
|
37
|
+
}));
|
|
38
|
+
// Trouver l'enquête sélectionnée
|
|
39
|
+
const enqueteId = value ? parseInt(value) : null;
|
|
40
|
+
const selectedOption = enqueteId ? options.find(opt => opt.id === enqueteId) : null;
|
|
41
|
+
// Gérer le changement de sélection
|
|
42
|
+
const handleChange = (option) => {
|
|
43
|
+
const newEnqueteId = option?.id;
|
|
11
44
|
onChange(newEnqueteId?.toString() || null);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
45
|
+
// Si un callback de remplissage est fourni et qu'une enquête est sélectionnée
|
|
46
|
+
if (onFillFormFromEnquete && newEnqueteId) {
|
|
47
|
+
const enqueteData = enquetes.find(e => e.id === newEnqueteId);
|
|
48
|
+
if (enqueteData) {
|
|
49
|
+
onFillFormFromEnquete(enqueteData);
|
|
50
|
+
}
|
|
16
51
|
}
|
|
17
52
|
};
|
|
18
|
-
|
|
53
|
+
// Format d'affichage: "NumeroEnquete - Description"
|
|
54
|
+
const formatOptionLabel = (option) => {
|
|
55
|
+
return `${option.code} - ${option.designation}`;
|
|
56
|
+
};
|
|
57
|
+
return (_jsx(SearchableSelect, { options: options, value: selectedOption, onChange: handleChange, placeholder: "S\u00E9lectionner une enqu\u00EAte...", searchPlaceholder: "Rechercher une enqu\u00EAte...", disabled: disabled, required: variable.estObligatoire, loading: loading, error: loadError || error, formatOptionLabel: formatOptionLabel, noOptionsMessage: loading ? "Chargement..." : "Aucune enquête trouvée" }));
|
|
19
58
|
};
|
|
20
59
|
export { EnqueteInput };
|
|
21
60
|
export default EnqueteInput;
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
|
|
3
|
-
id: number;
|
|
4
|
-
}
|
|
2
|
+
import { MenageCompletDto } from '../../types/services';
|
|
5
3
|
export interface MenageInputProps {
|
|
6
4
|
variable: {
|
|
7
5
|
typeCode: string;
|
|
@@ -22,6 +20,9 @@ export interface MenageInputProps {
|
|
|
22
20
|
valeurMin?: number;
|
|
23
21
|
onFillFormFromMenage?: (menageData: MenageCompletDto) => void;
|
|
24
22
|
formulaireVariables?: any[];
|
|
23
|
+
services?: {
|
|
24
|
+
fetchMenages?: () => Promise<MenageCompletDto[]>;
|
|
25
|
+
};
|
|
25
26
|
}
|
|
26
27
|
declare const MenageInput: React.FC<MenageInputProps>;
|
|
27
28
|
export { MenageInput };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MenageInput.d.ts","sourceRoot":"","sources":["../../../src/components/selectors/MenageInput.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"MenageInput.d.ts","sourceRoot":"","sources":["../../../src/components/selectors/MenageInput.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,UAAU,CAAC,EAAE;YACX,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,CAAC;IACF,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC9D,mBAAmB,CAAC,EAAE,GAAG,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE;QACT,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;KAClD,CAAC;CACH;AAED,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAmF3C,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,eAAe,WAAW,CAAC"}
|
|
@@ -1,21 +1,60 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
3
|
+
import { useState, useEffect } from 'react';
|
|
4
|
+
import SearchableSelect from '../inputs/SearchableSelect';
|
|
5
|
+
const MenageInput = ({ variable, value, onChange, error, disabled, onFillFormFromMenage, services }) => {
|
|
6
|
+
const [menages, setMenages] = useState([]);
|
|
7
|
+
const [loading, setLoading] = useState(false);
|
|
8
|
+
const [loadError, setLoadError] = useState(null);
|
|
9
|
+
// Charger les ménages au montage du composant
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
const loadMenages = async () => {
|
|
12
|
+
if (!services?.fetchMenages) {
|
|
13
|
+
setLoadError('Service de chargement des ménages non disponible');
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
setLoading(true);
|
|
17
|
+
setLoadError(null);
|
|
18
|
+
try {
|
|
19
|
+
const data = await services.fetchMenages();
|
|
20
|
+
setMenages(data);
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
console.error('Erreur lors du chargement des ménages:', err);
|
|
24
|
+
setLoadError('Erreur lors du chargement des ménages');
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
setLoading(false);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
loadMenages();
|
|
31
|
+
}, [services]);
|
|
32
|
+
// Convertir les ménages en options pour SearchableSelect
|
|
33
|
+
const options = menages.map(menage => ({
|
|
34
|
+
id: menage.id,
|
|
35
|
+
code: menage.numeroMenage || menage.id.toString(),
|
|
36
|
+
designation: `${menage.nomChefMenage || ''} ${menage.prenomChefMenage || ''}`.trim() || `Ménage ${menage.id}`
|
|
37
|
+
}));
|
|
38
|
+
// Trouver le ménage sélectionné
|
|
39
|
+
const menageId = value ? parseInt(value) : null;
|
|
40
|
+
const selectedOption = menageId ? options.find(opt => opt.id === menageId) : null;
|
|
41
|
+
// Gérer le changement de sélection
|
|
42
|
+
const handleChange = (option) => {
|
|
43
|
+
const newMenageId = option?.id;
|
|
11
44
|
onChange(newMenageId?.toString() || null);
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
45
|
+
// Si un callback de remplissage est fourni et qu'un ménage est sélectionné
|
|
46
|
+
if (onFillFormFromMenage && newMenageId) {
|
|
47
|
+
const menageData = menages.find(m => m.id === newMenageId);
|
|
48
|
+
if (menageData) {
|
|
49
|
+
onFillFormFromMenage(menageData);
|
|
50
|
+
}
|
|
16
51
|
}
|
|
17
52
|
};
|
|
18
|
-
|
|
53
|
+
// Format d'affichage: "NumeroMenage - Nom Prénom"
|
|
54
|
+
const formatOptionLabel = (option) => {
|
|
55
|
+
return `${option.code} - ${option.designation}`;
|
|
56
|
+
};
|
|
57
|
+
return (_jsx(SearchableSelect, { options: options, value: selectedOption, onChange: handleChange, placeholder: "S\u00E9lectionner un m\u00E9nage...", searchPlaceholder: "Rechercher un m\u00E9nage...", disabled: disabled, required: variable.estObligatoire, loading: loading, error: loadError || error, formatOptionLabel: formatOptionLabel, noOptionsMessage: loading ? "Chargement..." : "Aucun ménage trouvé" }));
|
|
19
58
|
};
|
|
20
59
|
export { MenageInput };
|
|
21
60
|
export default MenageInput;
|
|
@@ -30,14 +30,15 @@ export declare function resolveParentValue(variable: any, reponses: Record<strin
|
|
|
30
30
|
* Détermine l'endpoint API selon le type de variable et l'ID du parent
|
|
31
31
|
* @param variableType - Type de la variable (DISTRICT, REGION, DEPARTEMENT, etc.)
|
|
32
32
|
* @param parentId - ID du parent (optionnel)
|
|
33
|
+
* @param defaultCountryCode - Code pays par défaut pour DISTRICT (défaut: 'CIV')
|
|
33
34
|
* @returns Endpoint API ou null si invalide
|
|
34
35
|
*
|
|
35
36
|
* @example
|
|
36
|
-
* getApiEndpoint('DISTRICT') // Returns: '/api/v1/Districts/select'
|
|
37
|
+
* getApiEndpoint('DISTRICT') // Returns: '/api/v1/Districts/CIV/select'
|
|
37
38
|
* getApiEndpoint('REGION', 1) // Returns: '/api/v1/Regions/1/select'
|
|
38
39
|
* getApiEndpoint('REGION') // Returns: null (parent requis mais absent)
|
|
39
40
|
*/
|
|
40
|
-
export declare function getApiEndpoint(variableType: string, parentId?: number | null): string | null;
|
|
41
|
+
export declare function getApiEndpoint(variableType: string, parentId?: number | null, defaultCountryCode?: string): string | null;
|
|
41
42
|
/**
|
|
42
43
|
* Détermine le libellé du parent selon le type de variable
|
|
43
44
|
* @param variableType - Type de la variable
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variableDependencyResolver.d.ts","sourceRoot":"","sources":["../../src/utils/variableDependencyResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAMpF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,GAAG,EACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,MAAM,GAAG,IAAI,CAiCf;AAED
|
|
1
|
+
{"version":3,"file":"variableDependencyResolver.d.ts","sourceRoot":"","sources":["../../src/utils/variableDependencyResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAMpF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,GAAG,EACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,MAAM,GAAG,IAAI,CAiCf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EACxB,kBAAkB,GAAE,MAAc,GACjC,MAAM,GAAG,IAAI,CA2Bf;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAa3D;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAW5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAY9D"}
|
|
@@ -64,18 +64,20 @@ export function resolveParentValue(variable, reponses) {
|
|
|
64
64
|
* Détermine l'endpoint API selon le type de variable et l'ID du parent
|
|
65
65
|
* @param variableType - Type de la variable (DISTRICT, REGION, DEPARTEMENT, etc.)
|
|
66
66
|
* @param parentId - ID du parent (optionnel)
|
|
67
|
+
* @param defaultCountryCode - Code pays par défaut pour DISTRICT (défaut: 'CIV')
|
|
67
68
|
* @returns Endpoint API ou null si invalide
|
|
68
69
|
*
|
|
69
70
|
* @example
|
|
70
|
-
* getApiEndpoint('DISTRICT') // Returns: '/api/v1/Districts/select'
|
|
71
|
+
* getApiEndpoint('DISTRICT') // Returns: '/api/v1/Districts/CIV/select'
|
|
71
72
|
* getApiEndpoint('REGION', 1) // Returns: '/api/v1/Regions/1/select'
|
|
72
73
|
* getApiEndpoint('REGION') // Returns: null (parent requis mais absent)
|
|
73
74
|
*/
|
|
74
|
-
export function getApiEndpoint(variableType, parentId) {
|
|
75
|
+
export function getApiEndpoint(variableType, parentId, defaultCountryCode = 'CIV') {
|
|
75
76
|
const type = variableType?.toUpperCase();
|
|
76
77
|
switch (type) {
|
|
77
78
|
case 'DISTRICT':
|
|
78
|
-
|
|
79
|
+
// Pour DISTRICT, utiliser le code pays (par défaut 'CIV')
|
|
80
|
+
return `/api/v1/Districts/${defaultCountryCode}/select`;
|
|
79
81
|
case 'REGION':
|
|
80
82
|
return parentId ? `/api/v1/Regions/${parentId}/select` : null;
|
|
81
83
|
case 'DEPARTEMENT':
|
package/package.json
CHANGED