@rsuci/shared-form-components 1.0.0 → 1.0.2
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/.gitattributes +2 -0
- package/dist/components/VariableRenderer.d.ts +1 -0
- package/dist/components/VariableRenderer.d.ts.map +1 -1
- package/dist/components/VariableRenderer.js +10 -10
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +5 -0
- package/dist/components/inputs/GeographicCascadeInput.d.ts +26 -0
- package/dist/components/inputs/GeographicCascadeInput.d.ts.map +1 -0
- package/dist/components/inputs/GeographicCascadeInput.js +112 -0
- package/dist/utils/variableDependencyResolver.d.ts +71 -0
- package/dist/utils/variableDependencyResolver.d.ts.map +1 -0
- package/dist/utils/variableDependencyResolver.js +155 -0
- package/package.json +1 -1
package/.gitattributes
ADDED
|
@@ -21,6 +21,7 @@ export interface VariableRendererProps {
|
|
|
21
21
|
valeur?: string;
|
|
22
22
|
}>;
|
|
23
23
|
allResponses?: Record<string, EnqueteReponse>;
|
|
24
|
+
reponses?: Record<string, any>;
|
|
24
25
|
RosterCheckInput?: React.ComponentType<VariableRendererProps>;
|
|
25
26
|
RosterListInput?: React.ComponentType<VariableRendererProps>;
|
|
26
27
|
interpolateVariableLabel?: (label: string, responses: Record<string, EnqueteReponse>, numeroMembre?: number) => string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariableRenderer.d.ts","sourceRoot":"","sources":["../../src/components/VariableRenderer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,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,CAiGrD,CAAC;AAEF,eAAe,gBAAgB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -3,7 +3,7 @@ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
|
3
3
|
import { Suspense } from 'react';
|
|
4
4
|
import { AlertCircle, HelpCircle } from 'lucide-react';
|
|
5
5
|
// Import des composants depuis l'index
|
|
6
|
-
import { IdDocInput, LabelDisplay, PanelDisplay,
|
|
6
|
+
import { IdDocInput, LabelDisplay, PanelDisplay, GeographicCascadeInput, StringInput, NumberInput, DatePicker, SelectInput, RadioInput, CheckboxInput, ComboboxInput, PhoneInput, GPSInput, HourInput, RSUInput, MenageInput, EnqueteInput, PhotoCapture, ImageUpload } from './index';
|
|
7
7
|
// Composant générique pour les types géographiques non encore implémentés
|
|
8
8
|
const GeographicFallback = ({ variable }) => {
|
|
9
9
|
return (_jsx("div", { className: "p-3 bg-yellow-50 border border-yellow-200 rounded-lg", children: _jsxs("p", { className: "text-yellow-800 text-sm", children: ["Composant ", variable.typeCode, " en cours d'impl\u00E9mentation"] }) }));
|
|
@@ -27,14 +27,14 @@ const getVariableRenderer = (typeCode, RosterCheckInput, RosterListInput) => {
|
|
|
27
27
|
'PHONE': PhoneInput,
|
|
28
28
|
'LABEL': LabelDisplay,
|
|
29
29
|
'PANEL': PanelDisplay,
|
|
30
|
-
// Composants géographiques
|
|
30
|
+
// Composants géographiques - Utilisation du composant unifié GeographicCascadeInput
|
|
31
31
|
'PAYS': GeographicFallback,
|
|
32
|
-
'DISTRICT':
|
|
33
|
-
'REGION':
|
|
34
|
-
'DEPARTEMENT':
|
|
35
|
-
'SOUSPREFECTURE':
|
|
36
|
-
'QUARTIER':
|
|
37
|
-
'VILLAGE':
|
|
32
|
+
'DISTRICT': GeographicCascadeInput,
|
|
33
|
+
'REGION': GeographicCascadeInput,
|
|
34
|
+
'DEPARTEMENT': GeographicCascadeInput,
|
|
35
|
+
'SOUSPREFECTURE': GeographicCascadeInput,
|
|
36
|
+
'QUARTIER': GeographicCascadeInput,
|
|
37
|
+
'VILLAGE': GeographicCascadeInput,
|
|
38
38
|
'RSU': RSUInput,
|
|
39
39
|
// Composant de sélection de ménage
|
|
40
40
|
'MENAGE': MenageInput,
|
|
@@ -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 }) => {
|
|
56
|
+
const VariableRenderer = ({ variable, value, onChange, onBlur, error, disabled, numeroMembre, valeurMin, onFillFormFromMenage, onFillFormFromEnquete, formulaireVariables, rosterVariables, allResponses = {}, RosterCheckInput, RosterListInput, interpolateVariableLabel, reponses = {} }) => {
|
|
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 })] }), 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 })] }), 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 };
|
|
@@ -9,6 +9,7 @@ export { default as DepartementInput } from './geographic/DepartementInput';
|
|
|
9
9
|
export { default as SousPrefectureInput } from './geographic/SousPrefectureInput';
|
|
10
10
|
export { default as QuartierInput } from './geographic/QuartierInput';
|
|
11
11
|
export { default as VillageInput } from './geographic/VillageInput';
|
|
12
|
+
export { default as GeographicCascadeInput } from './inputs/GeographicCascadeInput';
|
|
12
13
|
export { default as StringInput } from './inputs/StringInput';
|
|
13
14
|
export { default as NumberInput } from './inputs/NumberInput';
|
|
14
15
|
export { default as DatePicker } from './inputs/DatePicker';
|
|
@@ -19,6 +20,9 @@ export { default as ComboboxInput } from './inputs/ComboboxInput';
|
|
|
19
20
|
export { default as PhoneInput } from './inputs/PhoneInput';
|
|
20
21
|
export { default as GPSInput } from './inputs/GPSInput';
|
|
21
22
|
export { default as HourInput } from './inputs/HourInput';
|
|
23
|
+
export { default as RosterCheckInput } from './roster/RosterCheckInput';
|
|
24
|
+
export { default as RosterListInput } from './roster/RosterListInput';
|
|
25
|
+
export { default as RosterPanel } from './roster/RosterPanel';
|
|
22
26
|
export { default as RSUInput } from './selectors/RSUInput';
|
|
23
27
|
export { default as MenageInput } from './selectors/MenageInput';
|
|
24
28
|
export { default as EnqueteInput } from './selectors/EnqueteInput';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAI3D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGpE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGnE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAI3D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGjE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGpE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAG9D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAGnE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/components/index.js
CHANGED
|
@@ -14,6 +14,7 @@ export { default as SousPrefectureInput } from './geographic/SousPrefectureInput
|
|
|
14
14
|
export { default as QuartierInput } from './geographic/QuartierInput';
|
|
15
15
|
export { default as VillageInput } from './geographic/VillageInput';
|
|
16
16
|
// Input Components
|
|
17
|
+
export { default as GeographicCascadeInput } from './inputs/GeographicCascadeInput';
|
|
17
18
|
export { default as StringInput } from './inputs/StringInput';
|
|
18
19
|
export { default as NumberInput } from './inputs/NumberInput';
|
|
19
20
|
export { default as DatePicker } from './inputs/DatePicker';
|
|
@@ -24,6 +25,10 @@ export { default as ComboboxInput } from './inputs/ComboboxInput';
|
|
|
24
25
|
export { default as PhoneInput } from './inputs/PhoneInput';
|
|
25
26
|
export { default as GPSInput } from './inputs/GPSInput';
|
|
26
27
|
export { default as HourInput } from './inputs/HourInput';
|
|
28
|
+
// Roster Components
|
|
29
|
+
export { default as RosterCheckInput } from './roster/RosterCheckInput';
|
|
30
|
+
export { default as RosterListInput } from './roster/RosterListInput';
|
|
31
|
+
export { default as RosterPanel } from './roster/RosterPanel';
|
|
27
32
|
// Selector Components
|
|
28
33
|
export { default as RSUInput } from './selectors/RSUInput';
|
|
29
34
|
export { default as MenageInput } from './selectors/MenageInput';
|
|
@@ -0,0 +1,26 @@
|
|
|
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
|
+
*/
|
|
6
|
+
import React from 'react';
|
|
7
|
+
/**
|
|
8
|
+
* Format de données retourné par les APIs backend
|
|
9
|
+
*/
|
|
10
|
+
interface SelectDto {
|
|
11
|
+
id: number;
|
|
12
|
+
code: string;
|
|
13
|
+
designation: string;
|
|
14
|
+
}
|
|
15
|
+
interface GeographicCascadeInputProps {
|
|
16
|
+
variable: any;
|
|
17
|
+
value: any;
|
|
18
|
+
onChange: (value: SelectDto | null) => void;
|
|
19
|
+
reponses: Record<string, any>;
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
required?: boolean;
|
|
22
|
+
className?: string;
|
|
23
|
+
}
|
|
24
|
+
export declare const GeographicCascadeInput: React.FC<GeographicCascadeInputProps>;
|
|
25
|
+
export default GeographicCascadeInput;
|
|
26
|
+
//# sourceMappingURL=GeographicCascadeInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeographicCascadeInput.d.ts","sourceRoot":"","sources":["../../../src/components/inputs/GeographicCascadeInput.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAA2C,MAAM,OAAO,CAAC;AAShE;;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,CAiLxE,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,112 @@
|
|
|
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
|
+
*/
|
|
7
|
+
import { useEffect, useState, useCallback } from 'react';
|
|
8
|
+
import { resolveParentValue, getApiEndpoint, getParentLabel, requiresParent } from '../../utils/variableDependencyResolver';
|
|
9
|
+
export const GeographicCascadeInput = ({ variable, value, onChange, reponses, disabled = false, required = false, className = '' }) => {
|
|
10
|
+
const [items, setItems] = useState([]);
|
|
11
|
+
const [loading, setLoading] = useState(false);
|
|
12
|
+
const [error, setError] = useState(null);
|
|
13
|
+
// 1. Déterminer si ce type nécessite un parent
|
|
14
|
+
const needsParent = requiresParent(variable.type);
|
|
15
|
+
// 2. Résoudre la valeur du parent depuis les réponses
|
|
16
|
+
const parentValue = resolveParentValue(variable, reponses);
|
|
17
|
+
// 3. Déterminer l'endpoint API à appeler
|
|
18
|
+
const apiEndpoint = getApiEndpoint(variable.type, parentValue);
|
|
19
|
+
// 4. Fonction pour charger les données
|
|
20
|
+
const fetchData = useCallback(async () => {
|
|
21
|
+
// Si un parent est requis mais absent, ne rien charger
|
|
22
|
+
if (needsParent && !parentValue) {
|
|
23
|
+
setItems([]);
|
|
24
|
+
setLoading(false);
|
|
25
|
+
setError(null);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// Si pas d'endpoint valide, ne rien charger
|
|
29
|
+
if (!apiEndpoint) {
|
|
30
|
+
setItems([]);
|
|
31
|
+
setLoading(false);
|
|
32
|
+
setError(null);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
setLoading(true);
|
|
37
|
+
setError(null);
|
|
38
|
+
const response = await fetch(apiEndpoint);
|
|
39
|
+
if (!response.ok) {
|
|
40
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
41
|
+
}
|
|
42
|
+
const result = await response.json();
|
|
43
|
+
// Vérifier le format de la réponse
|
|
44
|
+
if (result.success && Array.isArray(result.data)) {
|
|
45
|
+
setItems(result.data);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
throw new Error('Format de réponse invalide');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
console.error(`Error fetching ${variable.type}:`, err);
|
|
53
|
+
setError(`Erreur de chargement des ${variable.libelle?.toLowerCase() || 'données'}`);
|
|
54
|
+
setItems([]);
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
setLoading(false);
|
|
58
|
+
}
|
|
59
|
+
}, [apiEndpoint, needsParent, parentValue, variable.type, variable.libelle]);
|
|
60
|
+
// 5. Charger les données quand l'endpoint ou le parent change
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
fetchData();
|
|
63
|
+
}, [fetchData]);
|
|
64
|
+
// 6. Réinitialiser la valeur si le parent change
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
// Si un parent est requis et qu'il a changé, réinitialiser la valeur
|
|
67
|
+
if (needsParent && value && parentValue) {
|
|
68
|
+
// Vérifier si la valeur actuelle est toujours valide
|
|
69
|
+
// (on pourrait faire une vérification plus poussée ici)
|
|
70
|
+
// Pour l'instant, on garde la valeur et laisse l'utilisateur la changer si nécessaire
|
|
71
|
+
}
|
|
72
|
+
}, [parentValue, needsParent, value]);
|
|
73
|
+
// 7. Gérer le changement de valeur
|
|
74
|
+
const handleChange = (e) => {
|
|
75
|
+
const selectedId = e.target.value;
|
|
76
|
+
if (!selectedId || selectedId === '') {
|
|
77
|
+
onChange(null);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const parsedId = parseInt(selectedId, 10);
|
|
81
|
+
if (isNaN(parsedId)) {
|
|
82
|
+
onChange(null);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const selected = items.find(item => item.id === parsedId);
|
|
86
|
+
if (selected) {
|
|
87
|
+
// Stocker l'objet complet SelectDto
|
|
88
|
+
onChange(selected);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
// 8. Déterminer si le champ est désactivé
|
|
92
|
+
const isDisabled = disabled || loading || (needsParent && !parentValue);
|
|
93
|
+
// 9. Déterminer le message du placeholder
|
|
94
|
+
const getPlaceholder = () => {
|
|
95
|
+
if (loading)
|
|
96
|
+
return 'Chargement...';
|
|
97
|
+
if (error)
|
|
98
|
+
return error;
|
|
99
|
+
if (needsParent && !parentValue) {
|
|
100
|
+
return `Sélectionnez d'abord ${getParentLabel(variable.type)}`;
|
|
101
|
+
}
|
|
102
|
+
if (items.length === 0 && !loading) {
|
|
103
|
+
return `Aucun(e) ${variable.libelle?.toLowerCase() || 'élément'} disponible`;
|
|
104
|
+
}
|
|
105
|
+
return `Sélectionner ${variable.libelle || 'un élément'}...`;
|
|
106
|
+
};
|
|
107
|
+
// 10. Rendu du composant
|
|
108
|
+
return (_jsxs("div", { className: "w-full", children: [_jsxs("select", { value: value?.id || '', onChange: handleChange, disabled: isDisabled, required: required, className: `w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-colors ${error ? 'border-red-300 bg-red-50' : 'border-gray-300'} ${isDisabled
|
|
109
|
+
? 'bg-gray-100 cursor-not-allowed text-gray-500'
|
|
110
|
+
: 'bg-white text-gray-900'} ${className}`, title: isDisabled && needsParent && !parentValue ? `Sélectionnez d'abord ${getParentLabel(variable.type)}` : '', children: [_jsx("option", { value: "", children: getPlaceholder() }), items.map((item) => (_jsx("option", { value: item.id, children: item.designation }, item.id)))] }), error && !loading && (_jsxs("p", { className: "mt-1 text-sm text-red-600 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 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z", clipRule: "evenodd" }) }), error] })), 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..."] }))] }));
|
|
111
|
+
};
|
|
112
|
+
export default GeographicCascadeInput;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilitaires pour résoudre les dépendances entre variables géographiques
|
|
3
|
+
* Permet de gérer la cascade : District → Région → Département → Sous-Préfecture → Quartier/Village
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extrait le code d'une variable depuis le format "${CODE}"
|
|
7
|
+
* @param valeur - Valeur du champ variable.valeur (ex: "${G_01}")
|
|
8
|
+
* @returns Code de la variable (ex: "G_01") ou null si pas de référence
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* extractVariableCode("${G_01}") // Returns: "G_01"
|
|
12
|
+
* extractVariableCode("${DISTRICT_VAR}") // Returns: "DISTRICT_VAR"
|
|
13
|
+
* extractVariableCode(null) // Returns: null
|
|
14
|
+
* extractVariableCode("G_01") // Returns: null (pas de ${})
|
|
15
|
+
*/
|
|
16
|
+
export declare function extractVariableCode(valeur: string | null | undefined): string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Résout la valeur ID d'une variable parente depuis les réponses
|
|
19
|
+
* @param variable - Variable actuelle
|
|
20
|
+
* @param reponses - Toutes les réponses du formulaire
|
|
21
|
+
* @returns ID de la valeur parente ou null
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* // Variable G_03 (Département) avec valeur: "${G_02}"
|
|
25
|
+
* // reponses = { "G_02": { valeur: { id: 10, code: "REG01", designation: "Abidjan" } } }
|
|
26
|
+
* resolveParentValue(variable, reponses) // Returns: 10
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveParentValue(variable: any, reponses: Record<string, any>): number | null;
|
|
29
|
+
/**
|
|
30
|
+
* Détermine l'endpoint API selon le type de variable et l'ID du parent
|
|
31
|
+
* @param variableType - Type de la variable (DISTRICT, REGION, DEPARTEMENT, etc.)
|
|
32
|
+
* @param parentId - ID du parent (optionnel)
|
|
33
|
+
* @returns Endpoint API ou null si invalide
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* getApiEndpoint('DISTRICT') // Returns: '/api/v1/Districts/select'
|
|
37
|
+
* getApiEndpoint('REGION', 1) // Returns: '/api/v1/Regions/1/select'
|
|
38
|
+
* getApiEndpoint('REGION') // Returns: null (parent requis mais absent)
|
|
39
|
+
*/
|
|
40
|
+
export declare function getApiEndpoint(variableType: string, parentId?: number | null): string | null;
|
|
41
|
+
/**
|
|
42
|
+
* Détermine le libellé du parent selon le type de variable
|
|
43
|
+
* @param variableType - Type de la variable
|
|
44
|
+
* @returns Libellé du parent en français
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* getParentLabel('REGION') // Returns: 'un district'
|
|
48
|
+
* getParentLabel('DEPARTEMENT') // Returns: 'une région'
|
|
49
|
+
*/
|
|
50
|
+
export declare function getParentLabel(variableType: string): string;
|
|
51
|
+
/**
|
|
52
|
+
* Vérifie si un type de variable nécessite un parent
|
|
53
|
+
* @param variableType - Type de la variable
|
|
54
|
+
* @returns true si un parent est requis
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* requiresParent('DISTRICT') // Returns: false
|
|
58
|
+
* requiresParent('REGION') // Returns: true
|
|
59
|
+
*/
|
|
60
|
+
export declare function requiresParent(variableType: string): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Vérifie si un type de variable est géographique
|
|
63
|
+
* @param variableType - Type de la variable
|
|
64
|
+
* @returns true si c'est un type géographique
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* isGeographicType('DISTRICT') // Returns: true
|
|
68
|
+
* isGeographicType('TEXT') // Returns: false
|
|
69
|
+
*/
|
|
70
|
+
export declare function isGeographicType(variableType: string): boolean;
|
|
71
|
+
//# sourceMappingURL=variableDependencyResolver.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilitaires pour résoudre les dépendances entre variables géographiques
|
|
3
|
+
* Permet de gérer la cascade : District → Région → Département → Sous-Préfecture → Quartier/Village
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extrait le code d'une variable depuis le format "${CODE}"
|
|
7
|
+
* @param valeur - Valeur du champ variable.valeur (ex: "${G_01}")
|
|
8
|
+
* @returns Code de la variable (ex: "G_01") ou null si pas de référence
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* extractVariableCode("${G_01}") // Returns: "G_01"
|
|
12
|
+
* extractVariableCode("${DISTRICT_VAR}") // Returns: "DISTRICT_VAR"
|
|
13
|
+
* extractVariableCode(null) // Returns: null
|
|
14
|
+
* extractVariableCode("G_01") // Returns: null (pas de ${})
|
|
15
|
+
*/
|
|
16
|
+
export function extractVariableCode(valeur) {
|
|
17
|
+
if (!valeur)
|
|
18
|
+
return null;
|
|
19
|
+
// Match ${ANYTHING}
|
|
20
|
+
const match = valeur.match(/\$\{([^}]+)\}/);
|
|
21
|
+
return match ? match[1] : null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Résout la valeur ID d'une variable parente depuis les réponses
|
|
25
|
+
* @param variable - Variable actuelle
|
|
26
|
+
* @param reponses - Toutes les réponses du formulaire
|
|
27
|
+
* @returns ID de la valeur parente ou null
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* // Variable G_03 (Département) avec valeur: "${G_02}"
|
|
31
|
+
* // reponses = { "G_02": { valeur: { id: 10, code: "REG01", designation: "Abidjan" } } }
|
|
32
|
+
* resolveParentValue(variable, reponses) // Returns: 10
|
|
33
|
+
*/
|
|
34
|
+
export function resolveParentValue(variable, reponses) {
|
|
35
|
+
// Extraire le code de la variable parente
|
|
36
|
+
const parentCode = extractVariableCode(variable.valeur);
|
|
37
|
+
if (!parentCode)
|
|
38
|
+
return null;
|
|
39
|
+
// Récupérer la réponse de la variable parente
|
|
40
|
+
const parentReponse = reponses[parentCode];
|
|
41
|
+
if (!parentReponse?.valeur)
|
|
42
|
+
return null;
|
|
43
|
+
// La valeur peut être :
|
|
44
|
+
// 1. Un objet SelectDto : { id: number, code: string, designation: string }
|
|
45
|
+
// 2. Un nombre (ID direct)
|
|
46
|
+
// 3. Autre format (on essaie d'extraire l'ID)
|
|
47
|
+
const parentValue = parentReponse.valeur;
|
|
48
|
+
// Cas 1 : Objet avec propriété id
|
|
49
|
+
if (typeof parentValue === 'object' && parentValue !== null && 'id' in parentValue) {
|
|
50
|
+
return typeof parentValue.id === 'number' ? parentValue.id : null;
|
|
51
|
+
}
|
|
52
|
+
// Cas 2 : Nombre direct
|
|
53
|
+
if (typeof parentValue === 'number') {
|
|
54
|
+
return parentValue;
|
|
55
|
+
}
|
|
56
|
+
// Cas 3 : String qui pourrait être un nombre
|
|
57
|
+
if (typeof parentValue === 'string') {
|
|
58
|
+
const parsed = parseInt(parentValue, 10);
|
|
59
|
+
return isNaN(parsed) ? null : parsed;
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Détermine l'endpoint API selon le type de variable et l'ID du parent
|
|
65
|
+
* @param variableType - Type de la variable (DISTRICT, REGION, DEPARTEMENT, etc.)
|
|
66
|
+
* @param parentId - ID du parent (optionnel)
|
|
67
|
+
* @returns Endpoint API ou null si invalide
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* getApiEndpoint('DISTRICT') // Returns: '/api/v1/Districts/select'
|
|
71
|
+
* getApiEndpoint('REGION', 1) // Returns: '/api/v1/Regions/1/select'
|
|
72
|
+
* getApiEndpoint('REGION') // Returns: null (parent requis mais absent)
|
|
73
|
+
*/
|
|
74
|
+
export function getApiEndpoint(variableType, parentId) {
|
|
75
|
+
const type = variableType?.toUpperCase();
|
|
76
|
+
switch (type) {
|
|
77
|
+
case 'DISTRICT':
|
|
78
|
+
return '/api/v1/Districts/select';
|
|
79
|
+
case 'REGION':
|
|
80
|
+
return parentId ? `/api/v1/Regions/${parentId}/select` : null;
|
|
81
|
+
case 'DEPARTEMENT':
|
|
82
|
+
return parentId ? `/api/v1/Departements/${parentId}/select` : null;
|
|
83
|
+
case 'SOUS_PREFECTURE':
|
|
84
|
+
case 'SOUSPREFECTURE':
|
|
85
|
+
return parentId ? `/api/v1/SousPrefectures/${parentId}/select` : null;
|
|
86
|
+
case 'QUARTIER':
|
|
87
|
+
return parentId ? `/api/v1/Quartiers/${parentId}/select` : null;
|
|
88
|
+
case 'VILLAGE':
|
|
89
|
+
return parentId ? `/api/v1/Villages/${parentId}/select` : null;
|
|
90
|
+
default:
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Détermine le libellé du parent selon le type de variable
|
|
96
|
+
* @param variableType - Type de la variable
|
|
97
|
+
* @returns Libellé du parent en français
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* getParentLabel('REGION') // Returns: 'un district'
|
|
101
|
+
* getParentLabel('DEPARTEMENT') // Returns: 'une région'
|
|
102
|
+
*/
|
|
103
|
+
export function getParentLabel(variableType) {
|
|
104
|
+
const type = variableType?.toUpperCase();
|
|
105
|
+
const labels = {
|
|
106
|
+
'REGION': 'un district',
|
|
107
|
+
'DEPARTEMENT': 'une région',
|
|
108
|
+
'SOUS_PREFECTURE': 'un département',
|
|
109
|
+
'SOUSPREFECTURE': 'un département',
|
|
110
|
+
'QUARTIER': 'une sous-préfecture',
|
|
111
|
+
'VILLAGE': 'une sous-préfecture'
|
|
112
|
+
};
|
|
113
|
+
return labels[type] || 'le niveau précédent';
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Vérifie si un type de variable nécessite un parent
|
|
117
|
+
* @param variableType - Type de la variable
|
|
118
|
+
* @returns true si un parent est requis
|
|
119
|
+
*
|
|
120
|
+
* @example
|
|
121
|
+
* requiresParent('DISTRICT') // Returns: false
|
|
122
|
+
* requiresParent('REGION') // Returns: true
|
|
123
|
+
*/
|
|
124
|
+
export function requiresParent(variableType) {
|
|
125
|
+
const type = variableType?.toUpperCase();
|
|
126
|
+
return [
|
|
127
|
+
'REGION',
|
|
128
|
+
'DEPARTEMENT',
|
|
129
|
+
'SOUS_PREFECTURE',
|
|
130
|
+
'SOUSPREFECTURE',
|
|
131
|
+
'QUARTIER',
|
|
132
|
+
'VILLAGE'
|
|
133
|
+
].includes(type);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Vérifie si un type de variable est géographique
|
|
137
|
+
* @param variableType - Type de la variable
|
|
138
|
+
* @returns true si c'est un type géographique
|
|
139
|
+
*
|
|
140
|
+
* @example
|
|
141
|
+
* isGeographicType('DISTRICT') // Returns: true
|
|
142
|
+
* isGeographicType('TEXT') // Returns: false
|
|
143
|
+
*/
|
|
144
|
+
export function isGeographicType(variableType) {
|
|
145
|
+
const type = variableType?.toUpperCase();
|
|
146
|
+
return [
|
|
147
|
+
'DISTRICT',
|
|
148
|
+
'REGION',
|
|
149
|
+
'DEPARTEMENT',
|
|
150
|
+
'SOUS_PREFECTURE',
|
|
151
|
+
'SOUSPREFECTURE',
|
|
152
|
+
'QUARTIER',
|
|
153
|
+
'VILLAGE'
|
|
154
|
+
].includes(type);
|
|
155
|
+
}
|
package/package.json
CHANGED