@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.
@@ -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,CAiGrD,CAAC;AAEF,eAAe,gBAAgB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC"}
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,CA+KxE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
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.type);
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. Déterminer l'endpoint API à appeler
20
- const apiEndpoint = getApiEndpoint(variable.type, parentValue);
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.type}:`, err);
55
- setError(`Erreur de chargement des ${variable.libelle?.toLowerCase() || 'données'}`);
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.type)}`;
100
+ return `Sélectionnez d'abord ${getParentLabel(variable.typeCode)}`;
97
101
  }
98
102
  if (items.length === 0 && !loading) {
99
- return `Aucun(e) ${variable.libelle?.toLowerCase() || 'élément'} disponible`;
103
+ return `Aucun(e) ${variable.designation?.toLowerCase() || 'élément'} disponible`;
100
104
  }
101
- return `Sélectionner ${variable.libelle || 'un élément'}...`;
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.type)}`
118
- : `Aucun(e) ${variable.libelle?.toLowerCase() || 'élément'} disponible`, formatOptionLabel: (option) => {
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.type)] })), 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..."] }))] }));
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
- export interface EnqueteCompletDto {
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,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;CAEZ;AAED,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;CAC7B;AAoBD,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAiC7C,CAAC;AAEF,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,eAAe,YAAY,CAAC"}
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
- // Import du composant EnqueteSelector adapter selon votre architecture)
4
- // Placeholder pour l'import - à remplacer par le vrai import
5
- const EnqueteSelector = ({ value, onChange, onFillForm, disabled, required, showFillButton, formulaireVariables, className }) => {
6
- return (_jsx("div", { className: `enquete-selector ${className || ''}`, children: _jsx("select", { value: value || '', onChange: (e) => onChange(e.target.value ? parseInt(e.target.value) : null), disabled: disabled, required: required, className: "w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent text-gray-900 bg-white", children: _jsx("option", { value: "", children: "S\u00E9lectionner une enqu\u00EAte..." }) }) }));
7
- };
8
- const EnqueteInput = ({ variable, value, onChange, error, disabled, onFillFormFromEnquete, formulaireVariables = [] }) => {
9
- const enqueteId = value ? parseInt(value) : undefined;
10
- const handleChange = (newEnqueteId) => {
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
- const handleFillForm = (enqueteData) => {
14
- if (onFillFormFromEnquete) {
15
- onFillFormFromEnquete(enqueteData);
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
- return (_jsx(EnqueteSelector, { value: enqueteId, onChange: handleChange, onFillForm: handleFillForm, disabled: disabled, required: variable.estObligatoire, showFillButton: true, formulaireVariables: formulaireVariables, className: error ? 'border-red-500' : '' }));
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
- export interface MenageCompletDto {
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,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;CAEZ;AAED,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;CAC7B;AAoBD,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAiC3C,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,eAAe,WAAW,CAAC"}
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
- // Import du composant MenageSelector adapter selon votre architecture)
4
- // Placeholder pour l'import - à remplacer par le vrai import
5
- const MenageSelector = ({ value, onChange, onFillForm, disabled, required, showFillButton, formulaireVariables, className }) => {
6
- return (_jsx("div", { className: `menage-selector ${className || ''}`, children: _jsx("select", { value: value || '', onChange: (e) => onChange(e.target.value ? parseInt(e.target.value) : null), disabled: disabled, required: required, className: "w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-green-500 focus:border-transparent text-gray-900 bg-white", children: _jsx("option", { value: "", children: "S\u00E9lectionner un m\u00E9nage..." }) }) }));
7
- };
8
- const MenageInput = ({ variable, value, onChange, error, disabled, onFillFormFromMenage, formulaireVariables = [] }) => {
9
- const menageId = value ? parseInt(value) : undefined;
10
- const handleChange = (newMenageId) => {
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
- const handleFillForm = (menageData) => {
14
- if (onFillFormFromMenage) {
15
- onFillFormFromMenage(menageData);
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
- return (_jsx(MenageSelector, { value: menageId, onChange: handleChange, onFillForm: handleFillForm, disabled: disabled, required: variable.estObligatoire, showFillButton: true, formulaireVariables: formulaireVariables, className: error ? 'border-red-500' : '' }));
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;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CA0B5F;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"}
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
- return '/api/v1/Districts/select';
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsuci/shared-form-components",
3
- "version": "1.0.3",
3
+ "version": "1.0.4",
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",