@rsuci/shared-form-components 1.0.130 → 1.0.132
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/inputs/GeographicCascadeInput.d.ts +0 -9
- package/dist/components/inputs/GeographicCascadeInput.d.ts.map +1 -1
- package/dist/components/inputs/GeographicCascadeInput.js +101 -77
- package/dist/components/inputs/SearchableSelect.d.ts.map +1 -1
- package/dist/components/inputs/SearchableSelect.js +10 -7
- package/dist/components/selectors/RSUInput.d.ts +2 -2
- package/dist/components/selectors/RSUInput.d.ts.map +1 -1
- package/dist/components/selectors/RSUInput.js +40 -22
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/types/services.d.ts +1 -1
- package/dist/types/services.d.ts.map +1 -1
- package/dist/utils/variableDependencyResolver.d.ts.map +1 -1
- package/dist/utils/variableDependencyResolver.js +13 -27
- package/package.json +1 -1
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Composant unifié pour la sélection géographique en cascade
|
|
3
|
-
* S'adapte automatiquement selon le type de variable (DISTRICT, REGION, DEPARTEMENT, etc.)
|
|
4
|
-
* Gère la cascade via le champ variable.valeur (ex: "${G_01}")
|
|
5
|
-
* Utilise SearchableSelect pour une meilleure UX avec recherche intégrée
|
|
6
|
-
*/
|
|
7
1
|
import React from 'react';
|
|
8
|
-
/**
|
|
9
|
-
* Format de données retourné par les APIs backend
|
|
10
|
-
*/
|
|
11
2
|
interface SelectDto {
|
|
12
3
|
id: number;
|
|
13
4
|
code: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeographicCascadeInput.d.ts","sourceRoot":"","sources":["../../../src/components/inputs/GeographicCascadeInput.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"GeographicCascadeInput.d.ts","sourceRoot":"","sources":["../../../src/components/inputs/GeographicCascadeInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAWjF,UAAU,SAAS;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,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;IACnB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC,EAAE,CAAC,2BAA2B,CAqRxE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -1,104 +1,126 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
/**
|
|
3
|
-
* Composant unifié pour la sélection géographique en cascade
|
|
4
|
-
* S'adapte automatiquement selon le type de variable (DISTRICT, REGION, DEPARTEMENT, etc.)
|
|
5
|
-
* Gère la cascade via le champ variable.valeur (ex: "${G_01}")
|
|
6
|
-
* Utilise SearchableSelect pour une meilleure UX avec recherche intégrée
|
|
7
|
-
*/
|
|
8
2
|
import { useEffect, useState, useCallback, useRef, useMemo } from 'react';
|
|
9
3
|
import SearchableSelect from './SearchableSelect';
|
|
10
4
|
import { extractVariableCode, resolveParentValue, getApiEndpoint, getParentLabel, requiresParent } from '../../utils/variableDependencyResolver';
|
|
11
5
|
import { isComponentReadonly } from '../../utils/componentStateUtils';
|
|
12
6
|
export const GeographicCascadeInput = ({ variable, value, onChange, reponses, disabled = false, required = false, className = '', isConsultationMode = false }) => {
|
|
7
|
+
const PAGE_SIZE = 50;
|
|
13
8
|
const [items, setItems] = useState([]);
|
|
14
9
|
const [loading, setLoading] = useState(false);
|
|
10
|
+
const [loadingMore, setLoadingMore] = useState(false);
|
|
15
11
|
const [error, setError] = useState(null);
|
|
16
|
-
|
|
12
|
+
const [page, setPage] = useState(1);
|
|
13
|
+
const [hasMore, setHasMore] = useState(true);
|
|
14
|
+
const [searchTerm, setSearchTerm] = useState('');
|
|
17
15
|
const needsParent = requiresParent(variable.typeCode);
|
|
18
|
-
// 1b. Vérifier si un parent est CONFIGURÉ dans la variable (valeur non vide)
|
|
19
16
|
const hasParentConfigured = !!extractVariableCode(variable);
|
|
20
|
-
// Le champ a besoin d'un parent SEULEMENT si le type le requiert ET qu'un parent est configuré
|
|
21
17
|
const effectiveNeedsParent = needsParent && hasParentConfigured;
|
|
22
|
-
// 2. Résoudre la valeur du parent depuis les réponses
|
|
23
18
|
const parentValue = resolveParentValue(variable, reponses);
|
|
24
|
-
// Debug temporaire - À SUPPRIMER après validation
|
|
25
|
-
console.log('[GeographicCascade] Debug:', {
|
|
26
|
-
variableCode: variable.code,
|
|
27
|
-
variableType: variable.typeCode,
|
|
28
|
-
valueProp: value,
|
|
29
|
-
valueType: typeof value,
|
|
30
|
-
variableValeurDefaut: variable.valeurDefaut,
|
|
31
|
-
needsParent,
|
|
32
|
-
parentCode: extractVariableCode(variable),
|
|
33
|
-
parentValue,
|
|
34
|
-
reponsesKeys: Object.keys(reponses || {})
|
|
35
|
-
});
|
|
36
|
-
// 3. Pour DISTRICT, déterminer le code pays (depuis variable.valeur ou défaut 'CIV')
|
|
37
19
|
const countryCode = variable.typeCode === 'DISTRICT'
|
|
38
20
|
? (variable.valeur || 'CIV')
|
|
39
21
|
: undefined;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
22
|
+
const baseEndpoint = getApiEndpoint(variable.typeCode, parentValue, countryCode, hasParentConfigured);
|
|
23
|
+
// Construire l'URL paginée avec recherche
|
|
24
|
+
const buildUrl = useCallback((p, search) => {
|
|
25
|
+
if (!baseEndpoint)
|
|
26
|
+
return null;
|
|
27
|
+
const url = new URL(baseEndpoint, window.location.origin);
|
|
28
|
+
url.searchParams.set('page', String(p));
|
|
29
|
+
url.searchParams.set('pageSize', String(PAGE_SIZE));
|
|
30
|
+
if (search)
|
|
31
|
+
url.searchParams.set('search', search);
|
|
32
|
+
return url.pathname + url.search;
|
|
33
|
+
}, [baseEndpoint]);
|
|
34
|
+
// Extraire les items depuis la réponse API (multi-format)
|
|
35
|
+
const parseResponse = (result) => {
|
|
36
|
+
// Format endpoint unifié : { data: { data: [...], totalCount, ... } }
|
|
37
|
+
if (result.data && typeof result.data === 'object' && !Array.isArray(result.data) && Array.isArray(result.data.data)) {
|
|
38
|
+
return result.data.data.map((item) => ({
|
|
39
|
+
id: item.id,
|
|
40
|
+
code: item.code,
|
|
41
|
+
designation: item.label || item.designation,
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
// Format RSU API : { status: "SUCCESS", data: [...] }
|
|
45
|
+
if (result.status === 'SUCCESS' && Array.isArray(result.data)) {
|
|
46
|
+
return result.data;
|
|
47
|
+
}
|
|
48
|
+
if (Array.isArray(result))
|
|
49
|
+
return result;
|
|
50
|
+
if (result.data && Array.isArray(result.data))
|
|
51
|
+
return result.data;
|
|
52
|
+
throw new Error('Format de réponse invalide');
|
|
53
|
+
};
|
|
54
|
+
// Chargement initial + reset quand parent ou recherche change (debounce 300ms sur recherche)
|
|
55
|
+
useEffect(() => {
|
|
45
56
|
if (effectiveNeedsParent && !parentValue) {
|
|
46
57
|
setItems([]);
|
|
47
58
|
setLoading(false);
|
|
48
59
|
setError(null);
|
|
60
|
+
setPage(1);
|
|
61
|
+
setHasMore(true);
|
|
49
62
|
return;
|
|
50
63
|
}
|
|
51
|
-
|
|
52
|
-
if (!
|
|
64
|
+
const url = buildUrl(1, searchTerm || undefined);
|
|
65
|
+
if (!url) {
|
|
53
66
|
setItems([]);
|
|
54
67
|
setLoading(false);
|
|
55
68
|
setError(null);
|
|
56
69
|
return;
|
|
57
70
|
}
|
|
58
|
-
|
|
71
|
+
const timer = setTimeout(async () => {
|
|
59
72
|
setLoading(true);
|
|
60
73
|
setError(null);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
setItems(
|
|
71
|
-
|
|
72
|
-
else if (result.status === 'SUCCESS' && Array.isArray(result.data)) {
|
|
73
|
-
// Format 2: { status: "SUCCESS", data: [...] } (format RSU API)
|
|
74
|
-
setItems(result.data);
|
|
75
|
-
}
|
|
76
|
-
else if (result.success && Array.isArray(result.data)) {
|
|
77
|
-
// Format 3: { success: true, data: [...] }
|
|
78
|
-
setItems(result.data);
|
|
74
|
+
setItems([]);
|
|
75
|
+
setPage(1);
|
|
76
|
+
setHasMore(true);
|
|
77
|
+
try {
|
|
78
|
+
const response = await fetch(url);
|
|
79
|
+
if (!response.ok)
|
|
80
|
+
throw new Error(`HTTP ${response.status}`);
|
|
81
|
+
const result = await response.json();
|
|
82
|
+
const data = parseResponse(result);
|
|
83
|
+
setItems(data);
|
|
84
|
+
setHasMore(data.length === PAGE_SIZE);
|
|
79
85
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
setItems(
|
|
86
|
+
catch (err) {
|
|
87
|
+
setError(`Erreur de chargement des ${variable.designation?.toLowerCase() || 'données'}`);
|
|
88
|
+
setItems([]);
|
|
83
89
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
throw new Error('Format de réponse invalide');
|
|
90
|
+
finally {
|
|
91
|
+
setLoading(false);
|
|
87
92
|
}
|
|
93
|
+
}, searchTerm ? 300 : 0);
|
|
94
|
+
return () => clearTimeout(timer);
|
|
95
|
+
}, [baseEndpoint, effectiveNeedsParent, parentValue, searchTerm, buildUrl]);
|
|
96
|
+
const handleScrollEnd = useCallback(async () => {
|
|
97
|
+
if (!hasMore || loadingMore || loading)
|
|
98
|
+
return;
|
|
99
|
+
const nextPage = page + 1;
|
|
100
|
+
const url = buildUrl(nextPage, searchTerm || undefined);
|
|
101
|
+
if (!url)
|
|
102
|
+
return;
|
|
103
|
+
setLoadingMore(true);
|
|
104
|
+
try {
|
|
105
|
+
const response = await fetch(url);
|
|
106
|
+
if (!response.ok)
|
|
107
|
+
throw new Error(`HTTP ${response.status}`);
|
|
108
|
+
const result = await response.json();
|
|
109
|
+
const data = parseResponse(result);
|
|
110
|
+
setItems(prev => [...prev, ...data]);
|
|
111
|
+
setPage(nextPage);
|
|
112
|
+
setHasMore(data.length === PAGE_SIZE);
|
|
88
113
|
}
|
|
89
|
-
catch
|
|
90
|
-
|
|
91
|
-
setError(`Erreur de chargement des ${variable.designation?.toLowerCase() || 'données'}`);
|
|
92
|
-
setItems([]);
|
|
114
|
+
catch {
|
|
115
|
+
// Les données existantes restent affichées
|
|
93
116
|
}
|
|
94
117
|
finally {
|
|
95
|
-
|
|
118
|
+
setLoadingMore(false);
|
|
96
119
|
}
|
|
97
|
-
}, [
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
}, [fetchData]);
|
|
120
|
+
}, [hasMore, loadingMore, loading, page, searchTerm, buildUrl]);
|
|
121
|
+
const handleSearchChange = useCallback((term) => {
|
|
122
|
+
setSearchTerm(term);
|
|
123
|
+
}, []);
|
|
102
124
|
// 6. Réinitialiser la valeur si le parent change
|
|
103
125
|
const previousParentRef = useRef(undefined);
|
|
104
126
|
useEffect(() => {
|
|
@@ -145,13 +167,6 @@ export const GeographicCascadeInput = ({ variable, value, onChange, reponses, di
|
|
|
145
167
|
}
|
|
146
168
|
return `Sélectionner ${variable.designation || 'un élément'}...`;
|
|
147
169
|
};
|
|
148
|
-
// 10. Convertir les items en SelectOption pour SearchableSelect
|
|
149
|
-
const options = items.map(item => ({
|
|
150
|
-
id: item.id,
|
|
151
|
-
code: item.code,
|
|
152
|
-
designation: item.designation
|
|
153
|
-
}));
|
|
154
|
-
// 11. Parser la valeur si c'est une chaîne JSON (cas édition d'enquête existante)
|
|
155
170
|
const parsedValue = useMemo(() => {
|
|
156
171
|
if (!value)
|
|
157
172
|
return null;
|
|
@@ -173,7 +188,19 @@ export const GeographicCascadeInput = ({ variable, value, onChange, reponses, di
|
|
|
173
188
|
}
|
|
174
189
|
return null;
|
|
175
190
|
}, [value]);
|
|
176
|
-
//
|
|
191
|
+
// Convertir les items en SelectOption, avec la valeur pré-sélectionnée en tête si absente
|
|
192
|
+
const options = useMemo(() => {
|
|
193
|
+
const mapped = items.map(item => ({
|
|
194
|
+
id: item.id,
|
|
195
|
+
code: item.code,
|
|
196
|
+
designation: item.designation,
|
|
197
|
+
}));
|
|
198
|
+
if (parsedValue && !items.some(item => item.id === parsedValue.id)) {
|
|
199
|
+
return [{ id: parsedValue.id, code: parsedValue.code, designation: parsedValue.designation }, ...mapped];
|
|
200
|
+
}
|
|
201
|
+
return mapped;
|
|
202
|
+
}, [items, parsedValue]);
|
|
203
|
+
// Convertir la valeur parsée en SelectOption
|
|
177
204
|
const currentValue = parsedValue ? {
|
|
178
205
|
id: parsedValue.id,
|
|
179
206
|
code: parsedValue.code,
|
|
@@ -182,9 +209,6 @@ export const GeographicCascadeInput = ({ variable, value, onChange, reponses, di
|
|
|
182
209
|
// 13. Rendu du composant
|
|
183
210
|
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: effectiveNeedsParent && !parentValue
|
|
184
211
|
? `Veuillez d'abord sélectionner ${getParentLabel(variable.typeCode)}`
|
|
185
|
-
: `Aucun(e) ${variable.designation?.toLowerCase() || 'élément'} disponible`, formatOptionLabel: (option) => {
|
|
186
|
-
// Afficher uniquement la désignation
|
|
187
|
-
return option.designation;
|
|
188
|
-
} }), effectiveNeedsParent && !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..."] }))] }));
|
|
212
|
+
: `Aucun(e) ${variable.designation?.toLowerCase() || 'élément'} disponible`, formatOptionLabel: (option) => option.designation, onSearchChange: handleSearchChange, onScrollEnd: handleScrollEnd, loadingMore: loadingMore }), effectiveNeedsParent && !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..."] }))] }));
|
|
189
213
|
};
|
|
190
214
|
export default GeographicCascadeInput;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchableSelect.d.ts","sourceRoot":"","sources":["../../../src/components/inputs/SearchableSelect.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAsC,MAAM,OAAO,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,UAAU,qBAAqB;IAC7B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,MAAM,CAAC;IACrD,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"SearchableSelect.d.ts","sourceRoot":"","sources":["../../../src/components/inputs/SearchableSelect.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAsC,MAAM,OAAO,CAAC;AAE3D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,UAAU,qBAAqB;IAC7B,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,KAAK,IAAI,CAAC;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,MAAM,CAAC;IACrD,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA8N5D,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -31,13 +31,16 @@ export const SearchableSelect = ({ options, value, onChange, placeholder = 'Sél
|
|
|
31
31
|
searchInputRef.current.focus();
|
|
32
32
|
}
|
|
33
33
|
}, [isOpen]);
|
|
34
|
-
//
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
(option
|
|
40
|
-
|
|
34
|
+
// Si onSearchChange est fourni, la recherche est côté serveur : pas de filtrage local
|
|
35
|
+
const isServerSearch = !!onSearchChange;
|
|
36
|
+
const filteredOptions = isServerSearch
|
|
37
|
+
? options
|
|
38
|
+
: options.filter(option => {
|
|
39
|
+
const label = formatOptionLabel ? formatOptionLabel(option) : option.designation;
|
|
40
|
+
const searchLower = searchTerm.toLowerCase();
|
|
41
|
+
return (label.toLowerCase().includes(searchLower) ||
|
|
42
|
+
(option.code && option.code.toLowerCase().includes(searchLower)));
|
|
43
|
+
});
|
|
41
44
|
// Gérer la sélection d'une option
|
|
42
45
|
const handleSelect = (option, event) => {
|
|
43
46
|
event.preventDefault();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { StructureDto } from '../../types/services';
|
|
2
|
+
import { StructureDto, FetchFilter } from '../../types/services';
|
|
3
3
|
export interface RSUInputProps {
|
|
4
4
|
variable: {
|
|
5
5
|
typeCode: string;
|
|
@@ -19,7 +19,7 @@ export interface RSUInputProps {
|
|
|
19
19
|
numeroMembre?: number;
|
|
20
20
|
valeurMin?: number;
|
|
21
21
|
services?: {
|
|
22
|
-
fetchStructures?: () => Promise<StructureDto[]>;
|
|
22
|
+
fetchStructures?: (filter?: FetchFilter) => Promise<StructureDto[]>;
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
25
|
declare const RSUInput: React.FC<RSUInputProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RSUInput.d.ts","sourceRoot":"","sources":["../../../src/components/selectors/RSUInput.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"RSUInput.d.ts","sourceRoot":"","sources":["../../../src/components/selectors/RSUInput.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,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,QAAQ,CAAC,EAAE;QACT,eAAe,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;KACrE,CAAC;CACH;AAID,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CA6FrC,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,CAAC;AACpB,eAAe,QAAQ,CAAC"}
|
|
@@ -1,53 +1,71 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
import { useState, useEffect } from 'react';
|
|
3
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
4
4
|
import SearchableSelect from '../inputs/SearchableSelect';
|
|
5
|
+
const PAGE_SIZE = 50;
|
|
5
6
|
const RSUInput = ({ variable, value, onChange, error, disabled, services }) => {
|
|
6
7
|
const [structures, setStructures] = useState([]);
|
|
8
|
+
const [page, setPage] = useState(1);
|
|
9
|
+
const [hasMore, setHasMore] = useState(true);
|
|
7
10
|
const [loading, setLoading] = useState(false);
|
|
11
|
+
const [loadingMore, setLoadingMore] = useState(false);
|
|
8
12
|
const [loadError, setLoadError] = useState(null);
|
|
9
|
-
|
|
13
|
+
const [searchTerm, setSearchTerm] = useState('');
|
|
10
14
|
useEffect(() => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
if (!services?.fetchStructures) {
|
|
16
|
+
setLoadError('Service de chargement des structures non disponible');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const timer = setTimeout(async () => {
|
|
16
20
|
setLoading(true);
|
|
17
21
|
setLoadError(null);
|
|
22
|
+
setStructures([]);
|
|
23
|
+
setPage(1);
|
|
24
|
+
setHasMore(true);
|
|
18
25
|
try {
|
|
19
|
-
const data = await services.fetchStructures();
|
|
26
|
+
const data = await services.fetchStructures({ searchText: searchTerm || undefined, page: 1, pageSize: PAGE_SIZE });
|
|
20
27
|
setStructures(data);
|
|
28
|
+
setHasMore(data.length === PAGE_SIZE);
|
|
21
29
|
}
|
|
22
|
-
catch
|
|
23
|
-
console.error('Erreur lors du chargement des structures:', err);
|
|
30
|
+
catch {
|
|
24
31
|
setLoadError('Erreur lors du chargement des structures');
|
|
25
32
|
}
|
|
26
33
|
finally {
|
|
27
34
|
setLoading(false);
|
|
28
35
|
}
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
}, [services]);
|
|
32
|
-
|
|
36
|
+
}, searchTerm ? 300 : 0);
|
|
37
|
+
return () => clearTimeout(timer);
|
|
38
|
+
}, [searchTerm, services]);
|
|
39
|
+
const handleScrollEnd = useCallback(async () => {
|
|
40
|
+
if (!hasMore || loadingMore || loading || !services?.fetchStructures)
|
|
41
|
+
return;
|
|
42
|
+
setLoadingMore(true);
|
|
43
|
+
const nextPage = page + 1;
|
|
44
|
+
try {
|
|
45
|
+
const data = await services.fetchStructures({ searchText: searchTerm || undefined, page: nextPage, pageSize: PAGE_SIZE });
|
|
46
|
+
setStructures(prev => [...prev, ...data]);
|
|
47
|
+
setPage(nextPage);
|
|
48
|
+
setHasMore(data.length === PAGE_SIZE);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Les données existantes restent affichées
|
|
52
|
+
}
|
|
53
|
+
finally {
|
|
54
|
+
setLoadingMore(false);
|
|
55
|
+
}
|
|
56
|
+
}, [hasMore, loadingMore, loading, page, searchTerm, services]);
|
|
33
57
|
const options = structures.map(structure => ({
|
|
34
58
|
id: structure.id,
|
|
35
59
|
code: structure.code || structure.id.toString(),
|
|
36
|
-
designation: structure.designation || `Structure ${structure.id}
|
|
60
|
+
designation: structure.designation || `Structure ${structure.id}`,
|
|
37
61
|
}));
|
|
38
|
-
// Trouver la structure sélectionnée
|
|
39
62
|
const structureId = value ? parseInt(value) : null;
|
|
40
63
|
const selectedOption = structureId ? options.find(opt => opt.id === structureId) : null;
|
|
41
|
-
// Gérer le changement de sélection
|
|
42
64
|
const handleChange = (option) => {
|
|
43
65
|
const newStructureId = option?.id;
|
|
44
66
|
onChange(newStructureId?.toString() || null);
|
|
45
67
|
};
|
|
46
|
-
|
|
47
|
-
const formatOptionLabel = (option) => {
|
|
48
|
-
return option.designation;
|
|
49
|
-
};
|
|
50
|
-
return (_jsx(SearchableSelect, { options: options, value: selectedOption, onChange: handleChange, placeholder: "S\u00E9lectionner une structure RSU...", searchPlaceholder: "Rechercher une structure...", disabled: disabled, required: variable.estObligatoire, loading: loading, error: loadError || error, formatOptionLabel: formatOptionLabel, noOptionsMessage: loading ? "Chargement..." : "Aucune structure trouvée" }));
|
|
68
|
+
return (_jsx(SearchableSelect, { options: options, value: selectedOption, onChange: handleChange, placeholder: "S\u00E9lectionner une structure RSU...", searchPlaceholder: "Rechercher une structure...", disabled: disabled, required: variable.estObligatoire, loading: loading, error: loadError || error, formatOptionLabel: (option) => option.designation, noOptionsMessage: loading ? 'Chargement...' : 'Aucune structure trouvée', onSearchChange: setSearchTerm, onScrollEnd: handleScrollEnd, loadingMore: loadingMore }));
|
|
51
69
|
};
|
|
52
70
|
export { RSUInput };
|
|
53
71
|
export default RSUInput;
|
package/dist/index.d.ts
CHANGED
|
@@ -40,7 +40,7 @@ export { default as FormNavigationButtons, type FormNavigationButtonsProps } fro
|
|
|
40
40
|
export { default as FormActions, type FormActionsProps } from './components/form-renderer/FormActions';
|
|
41
41
|
export { default as FormRenderer, type FormRendererProps as UnifiedFormRendererProps } from './components/form-renderer/FormRenderer';
|
|
42
42
|
export type { EnqueteReponse, VariableFormulaire, GroupeFormulaire, FormulaireComplet, EnqueteInstance, GroupeInstance, VariableValue, VariableType, ComponentStyle, ValidationError, AutoAction, NavigationState } from './types/enquete';
|
|
43
|
-
export type { FormRendererServices, GeographicComponents, DistrictSelectorProps, RegionSelectorProps, DepartementSelectorProps, SousPrefectureSelectorProps, QuartierSelectorProps, VillageSelectorProps } from './types/services';
|
|
43
|
+
export type { FormRendererServices, FetchFilter, GeographicComponents, DistrictSelectorProps, RegionSelectorProps, DepartementSelectorProps, SousPrefectureSelectorProps, QuartierSelectorProps, VillageSelectorProps } from './types/services';
|
|
44
44
|
export type { FormRendererProps, GroupRendererProps, VariableRendererProps, FormRendererMode, FormRendererFeatures, FormRendererLabels, FormRendererConfig, FormRendererCallbacks, FormRendererUnifiedProps, DRValidationResult } from './types/form-renderer';
|
|
45
45
|
export type { VariableNodeState, GroupNodeState, JumpRange, JumpError, IFormTree, FormTreeOptions, JumpEvaluationResult } from './types/form-tree';
|
|
46
46
|
export { VariableValueConverter } from './lib/utils/variableValueConverter';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/services.d.ts
CHANGED
|
@@ -33,7 +33,7 @@ export interface FormRendererServices {
|
|
|
33
33
|
fetchMenages?: (filter?: FetchFilter) => Promise<MenageCompletDto[]>;
|
|
34
34
|
fetchEnquetes?: (filter?: FetchFilter) => Promise<EnqueteCompletDto[]>;
|
|
35
35
|
fetchEnqueteDonnees?: (enqueteId: number) => Promise<any>;
|
|
36
|
-
fetchStructures?: () => Promise<StructureDto[]>;
|
|
36
|
+
fetchStructures?: (filter?: FetchFilter) => Promise<StructureDto[]>;
|
|
37
37
|
fetchGeographicData?: (level: string, parentId?: number) => Promise<GeographicItem[]>;
|
|
38
38
|
forceUppercase?: boolean;
|
|
39
39
|
currentUser?: CurrentUserDto;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/types/services.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAGD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,oBAAoB;IAEnC,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAGrE,aAAa,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAGvE,mBAAmB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAG1D,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/types/services.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variableDependencyResolver.d.ts","sourceRoot":"","sources":["../../src/utils/variableDependencyResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAmCpG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,GAAG,EACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,MAAM,GAAG,IAAI,CA+Cf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EACxB,kBAAkB,GAAE,MAAc,EAClC,mBAAmB,GAAE,OAAc,GAClC,MAAM,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"variableDependencyResolver.d.ts","sourceRoot":"","sources":["../../src/utils/variableDependencyResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAmCpG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,GAAG,EACb,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,MAAM,GAAG,IAAI,CA+Cf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,YAAY,EAAE,MAAM,EACpB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,EACxB,kBAAkB,GAAE,MAAc,EAClC,mBAAmB,GAAE,OAAc,GAClC,MAAM,GAAG,IAAI,CAiBf;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"}
|
|
@@ -116,33 +116,19 @@ export function resolveParentValue(variable, reponses) {
|
|
|
116
116
|
*/
|
|
117
117
|
export function getApiEndpoint(variableType, parentId, defaultCountryCode = 'CIV', hasParentConfigured = true) {
|
|
118
118
|
const type = variableType?.toUpperCase();
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if (parentId)
|
|
133
|
-
return `/api/v1/SousPrefectures/${parentId}/select`;
|
|
134
|
-
return hasParentConfigured ? null : `/api/v1/SousPrefectures/select`;
|
|
135
|
-
case 'QUARTIER':
|
|
136
|
-
if (parentId)
|
|
137
|
-
return `/api/v1/Quartiers/${parentId}/select`;
|
|
138
|
-
return hasParentConfigured ? null : `/api/v1/Quartiers/select`;
|
|
139
|
-
case 'VILLAGE':
|
|
140
|
-
if (parentId)
|
|
141
|
-
return `/api/v1/Villages/${parentId}/select`;
|
|
142
|
-
return hasParentConfigured ? null : `/api/v1/Villages/select`;
|
|
143
|
-
default:
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
119
|
+
// Normaliser SOUS_PREFECTURE → SOUSPREFECTURE pour le endpoint unifié
|
|
120
|
+
const entityType = type === 'SOUS_PREFECTURE' ? 'SOUSPREFECTURE' : type;
|
|
121
|
+
const validTypes = ['DISTRICT', 'REGION', 'DEPARTEMENT', 'SOUSPREFECTURE', 'QUARTIER', 'VILLAGE'];
|
|
122
|
+
if (!validTypes.includes(entityType))
|
|
123
|
+
return null;
|
|
124
|
+
// Si un parent est configuré mais absent, ne pas charger
|
|
125
|
+
if (hasParentConfigured && requiresParent(type) && !parentId)
|
|
126
|
+
return null;
|
|
127
|
+
const params = new URLSearchParams();
|
|
128
|
+
params.set('entityType', entityType);
|
|
129
|
+
if (parentId)
|
|
130
|
+
params.set('parentId', String(parentId));
|
|
131
|
+
return `/api/v1/Select?${params.toString()}`;
|
|
146
132
|
}
|
|
147
133
|
/**
|
|
148
134
|
* Détermine le libellé du parent selon le type de variable
|
package/package.json
CHANGED