@rsuci/shared-form-components 1.0.46 → 1.0.48
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/VariableRenderer.d.ts +1 -0
- package/dist/components/VariableRenderer.d.ts.map +1 -1
- package/dist/components/VariableRenderer.js +3 -3
- package/dist/components/inputs/StringInput.d.ts.map +1 -1
- package/dist/components/inputs/StringInput.js +22 -1
- package/dist/components/roster/RosterCheckInput.d.ts +3 -0
- package/dist/components/roster/RosterCheckInput.d.ts.map +1 -1
- package/dist/components/roster/RosterCheckInput.js +12 -3
- package/dist/components/roster/RosterListInput.d.ts +3 -0
- package/dist/components/roster/RosterListInput.d.ts.map +1 -1
- package/dist/components/roster/RosterListInput.js +12 -3
- package/dist/components/roster/RosterPanel.d.ts +3 -0
- package/dist/components/roster/RosterPanel.d.ts.map +1 -1
- package/dist/components/roster/RosterPanel.js +19 -2
- package/dist/hooks/useFormNavigation.d.ts.map +1 -1
- package/dist/hooks/useFormNavigation.js +12 -0
- package/package.json +1 -1
|
@@ -31,6 +31,7 @@ export interface VariableRendererProps {
|
|
|
31
31
|
interpolateVariableLabel?: (label: string, responses: Record<string, EnqueteReponse>, numeroMembre?: number) => string;
|
|
32
32
|
services?: any;
|
|
33
33
|
geographicComponents?: any;
|
|
34
|
+
isConsultationMode?: boolean;
|
|
34
35
|
}
|
|
35
36
|
declare const GeographicFallback: React.FC<VariableRendererProps>;
|
|
36
37
|
declare const getVariableRenderer: (typeCode: string, RosterCheckInput?: React.ComponentType<VariableRendererProps>, RosterListInput?: React.ComponentType<VariableRendererProps>) => React.ComponentType<VariableRendererProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariableRenderer.d.ts","sourceRoot":"","sources":["../../src/components/VariableRenderer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,CAAC;AA+BxC,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,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1L,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;
|
|
1
|
+
{"version":3,"file":"VariableRenderer.d.ts","sourceRoot":"","sources":["../../src/components/VariableRenderer.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAmB,MAAM,OAAO,CAAC;AA+BxC,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,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1L,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;IAG3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;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,CAsD3C,CAAC;AAGF,QAAA,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAqHrD,CAAC;AAEF,eAAe,gBAAgB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -58,7 +58,7 @@ const getVariableRenderer = (typeCode, RosterCheckInput, RosterListInput) => {
|
|
|
58
58
|
return renderers[typeCode] || StringInput;
|
|
59
59
|
};
|
|
60
60
|
// Composant principal VariableRenderer
|
|
61
|
-
const VariableRenderer = ({ variable, value, onChange, onBlur, error, disabled, numeroMembre, valeurMin, onFillFormFromMenage, onFillFormFromEnquete, formulaireVariables, rosterVariables, allResponses = {}, RosterCheckInput, RosterListInput, interpolateVariableLabel, reponses = {}, services }) => {
|
|
61
|
+
const VariableRenderer = ({ variable, value, onChange, onBlur, error, disabled, numeroMembre, valeurMin, onFillFormFromMenage, onFillFormFromEnquete, formulaireVariables, rosterVariables, allResponses = {}, RosterCheckInput, RosterListInput, interpolateVariableLabel, reponses = {}, services, isConsultationMode = false }) => {
|
|
62
62
|
console.log('🎨 [VariableRenderer] Rendu de variable', {
|
|
63
63
|
code: variable.code,
|
|
64
64
|
designation: variable.designation,
|
|
@@ -85,7 +85,7 @@ const VariableRenderer = ({ variable, value, onChange, onBlur, error, disabled,
|
|
|
85
85
|
...variable,
|
|
86
86
|
designation: interpolatedDesignation
|
|
87
87
|
};
|
|
88
|
-
return _jsx(RendererComponent, { variable: variableWithInterpolatedLabel, value, onChange, onBlur, error, disabled, numeroMembre, valeurMin, onFillFormFromMenage, formulaireVariables, rosterVariables });
|
|
88
|
+
return _jsx(RendererComponent, { variable: variableWithInterpolatedLabel, value, onChange, onBlur, error, disabled, numeroMembre, valeurMin, onFillFormFromMenage, formulaireVariables, rosterVariables, isConsultationMode });
|
|
89
89
|
}
|
|
90
90
|
return (_jsxs("div", { className: "variable-container space-y-2", children: [_jsxs("label", { className: "block text-sm font-medium text-gray-700", children: [variable.typeCode !== 'LABEL' && variable.code && (_jsxs("span", { className: "text-blue-600 font-mono text-xs mr-2", children: ["(", variable.code, ")"] })), interpolatedDesignation, variable.estObligatoire && _jsx("span", { className: "text-red-500 ml-1", children: "*" }), variable.proprietes?.tooltip && (_jsx("button", { type: "button", className: "ml-2 text-gray-400 hover:text-gray-600", title: variable.proprietes.tooltip, children: _jsx(HelpCircle, { className: "h-4 w-4 inline" }) }))] }), _jsxs(Suspense, { fallback: _jsx("div", { className: "animate-pulse bg-gray-200 h-10 rounded" }), children: [(variable.typeCode === 'ROSTERCHECK' || variable.typeCode === 'ROSTERLIST') && (() => {
|
|
91
91
|
console.log(`🔍 [VariableRenderer] Variable ${variable.code} - Avant rendu:`, {
|
|
@@ -96,7 +96,7 @@ const VariableRenderer = ({ variable, value, onChange, onBlur, error, disabled,
|
|
|
96
96
|
length: Array.isArray(rosterVariables) ? rosterVariables.length : 'N/A'
|
|
97
97
|
});
|
|
98
98
|
return null;
|
|
99
|
-
})(), _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 })] }))] }));
|
|
99
|
+
})(), _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, isConsultationMode: isConsultationMode })] }), 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 })] }))] }));
|
|
100
100
|
};
|
|
101
101
|
export default VariableRenderer;
|
|
102
102
|
export { getVariableRenderer, GeographicFallback };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StringInput.d.ts","sourceRoot":"","sources":["../../../src/components/inputs/StringInput.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAI5D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,kBAAkB,GAAG;QAAE,QAAQ,EAAE,QAAQ,CAAA;KAAE,CAAC;IACtD,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,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,
|
|
1
|
+
{"version":3,"file":"StringInput.d.ts","sourceRoot":"","sources":["../../../src/components/inputs/StringInput.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAI5D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,kBAAkB,GAAG;QAAE,QAAQ,EAAE,QAAQ,CAAA;KAAE,CAAC;IACtD,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,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAmF3C,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -13,10 +13,31 @@ const StringInput = ({ variable, value, onChange, onBlur, error, disabled, servi
|
|
|
13
13
|
const { textStyle, containerStyle } = applyComponentStyle(variable.componentStyle);
|
|
14
14
|
// Déterminer si le composant est en lecture seule
|
|
15
15
|
const isReadonly = isComponentReadonly(variable, isConsultationMode);
|
|
16
|
+
// 🔍 DEBUG: Log pour tracer le problème des STRING dans les rosters
|
|
17
|
+
console.log('[StringInput] État du composant', {
|
|
18
|
+
code: variable.code,
|
|
19
|
+
typeCode: variable.typeCode,
|
|
20
|
+
value,
|
|
21
|
+
stringValue,
|
|
22
|
+
isReadonly,
|
|
23
|
+
isConsultationMode,
|
|
24
|
+
variableIsReadonly: variable.isReadonly,
|
|
25
|
+
disabled,
|
|
26
|
+
hasOnChange: !!onChange
|
|
27
|
+
});
|
|
16
28
|
const handleChange = (newValue) => {
|
|
17
|
-
|
|
29
|
+
console.log('[StringInput] handleChange appelé', {
|
|
30
|
+
code: variable.code,
|
|
31
|
+
newValue,
|
|
32
|
+
isReadonly,
|
|
33
|
+
willProcess: !isReadonly
|
|
34
|
+
});
|
|
35
|
+
if (isReadonly) {
|
|
36
|
+
console.log('[StringInput] ⚠️ Changement bloqué car isReadonly=true');
|
|
18
37
|
return;
|
|
38
|
+
}
|
|
19
39
|
const transformed = forceUppercase ? newValue.toLocaleUpperCase('fr-FR') : newValue;
|
|
40
|
+
console.log('[StringInput] Appel onChange avec:', transformed);
|
|
20
41
|
onChange(transformed);
|
|
21
42
|
};
|
|
22
43
|
// Générer les classes CSS
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import React from 'react';
|
|
10
10
|
import { VariableFormulaire, VariableValue } from '../../types/enquete';
|
|
11
11
|
import { RosterVariable } from './RosterPanel';
|
|
12
|
+
import { FormRendererServices } from '../../types/services';
|
|
12
13
|
export interface RosterCheckInputProps {
|
|
13
14
|
variable: VariableFormulaire;
|
|
14
15
|
value: VariableValue;
|
|
@@ -17,6 +18,8 @@ export interface RosterCheckInputProps {
|
|
|
17
18
|
error?: string;
|
|
18
19
|
disabled?: boolean;
|
|
19
20
|
rosterVariables?: RosterVariable[];
|
|
21
|
+
services?: FormRendererServices;
|
|
22
|
+
isConsultationMode?: boolean;
|
|
20
23
|
}
|
|
21
24
|
declare const RosterCheckInput: React.FC<RosterCheckInputProps>;
|
|
22
25
|
export default RosterCheckInput;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RosterCheckInput.d.ts","sourceRoot":"","sources":["../../../src/components/roster/RosterCheckInput.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAuC,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG5D,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,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"RosterCheckInput.d.ts","sourceRoot":"","sources":["../../../src/components/roster/RosterCheckInput.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAuC,MAAM,OAAO,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,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,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IAEnC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAYD,QAAA,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA8LrD,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
|
@@ -12,7 +12,7 @@ import { useMemo, useState, useEffect } from 'react';
|
|
|
12
12
|
import { AlertCircle } from 'lucide-react';
|
|
13
13
|
import { VariableValueConverter } from '../../lib/utils/variableValueConverter';
|
|
14
14
|
import RosterPanel from './RosterPanel';
|
|
15
|
-
const RosterCheckInput = ({ variable, value, onChange, onBlur, error, disabled, rosterVariables = [] }) => {
|
|
15
|
+
const RosterCheckInput = ({ variable, value, onChange, onBlur, error, disabled, rosterVariables = [], services, isConsultationMode = false }) => {
|
|
16
16
|
// Parser les options depuis la propriété valeur (format: "01#Option1|02#Option2|...")
|
|
17
17
|
const options = useMemo(() => {
|
|
18
18
|
const optionsSource = variable.proprietes?.valeur || variable.valeurDefaut;
|
|
@@ -75,6 +75,13 @@ const RosterCheckInput = ({ variable, value, onChange, onBlur, error, disabled,
|
|
|
75
75
|
}, [rosterVariables]);
|
|
76
76
|
// Gérer le changement d'une variable dans une option
|
|
77
77
|
const handleVariableChange = (optionCode, variableCode, variableValue) => {
|
|
78
|
+
console.log('[RosterCheckInput] handleVariableChange appelé', {
|
|
79
|
+
optionCode,
|
|
80
|
+
variableCode,
|
|
81
|
+
variableValue,
|
|
82
|
+
variableValueType: typeof variableValue,
|
|
83
|
+
currentDataBefore: JSON.stringify(currentData)
|
|
84
|
+
});
|
|
78
85
|
const newData = { ...currentData };
|
|
79
86
|
if (!newData[optionCode]) {
|
|
80
87
|
newData[optionCode] = {};
|
|
@@ -90,8 +97,10 @@ const RosterCheckInput = ({ variable, value, onChange, onBlur, error, disabled,
|
|
|
90
97
|
delete newData[optionCode];
|
|
91
98
|
}
|
|
92
99
|
}
|
|
100
|
+
const serializedData = JSON.stringify(newData);
|
|
101
|
+
console.log('[RosterCheckInput] Nouvelle valeur sérialisée:', serializedData);
|
|
93
102
|
// Sérialiser en JSON pour le stockage
|
|
94
|
-
onChange(
|
|
103
|
+
onChange(serializedData);
|
|
95
104
|
if (onBlur) {
|
|
96
105
|
onBlur();
|
|
97
106
|
}
|
|
@@ -105,7 +114,7 @@ const RosterCheckInput = ({ variable, value, onChange, onBlur, error, disabled,
|
|
|
105
114
|
}
|
|
106
115
|
return (_jsxs("div", { className: "space-y-4", children: [_jsx("div", { children: _jsx("p", { className: "text-sm text-gray-500", children: "Renseignez les options" }) }), _jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: options.map(option => {
|
|
107
116
|
const isChecked = checkedOptions.has(option.code);
|
|
108
|
-
return (_jsx(RosterPanel, { option: option, rosterVariables: sortedRosterVariables, value: currentData[option.code] || {}, onChange: (variableCode, variableValue) => handleVariableChange(option.code, variableCode, variableValue), disabled: disabled, showCheckbox: true, isChecked: isChecked, onCheckChange: (checked) => handleCheckChange(option.code, checked) }, option.code));
|
|
117
|
+
return (_jsx(RosterPanel, { option: option, rosterVariables: sortedRosterVariables, value: currentData[option.code] || {}, onChange: (variableCode, variableValue) => handleVariableChange(option.code, variableCode, variableValue), disabled: disabled, showCheckbox: true, isChecked: isChecked, onCheckChange: (checked) => handleCheckChange(option.code, checked), services: services, isConsultationMode: isConsultationMode }, option.code));
|
|
109
118
|
}) }), checkedOptions.size > 0 && (_jsx("div", { className: "p-2 bg-green-50 border border-green-200 rounded text-sm", children: _jsxs("span", { className: "text-green-800 font-medium", children: [checkedOptions.size, " option(s) coch\u00E9e(s)", Object.keys(currentData).length > 0 && ` · ${Object.keys(currentData).length} avec des données`] }) })), 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 })] }))] }));
|
|
110
119
|
};
|
|
111
120
|
export default RosterCheckInput;
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
import React from 'react';
|
|
10
10
|
import { VariableFormulaire, VariableValue } from '../../types/enquete';
|
|
11
11
|
import { RosterVariable } from './RosterPanel';
|
|
12
|
+
import { FormRendererServices } from '../../types/services';
|
|
12
13
|
export interface RosterListInputProps {
|
|
13
14
|
variable: VariableFormulaire;
|
|
14
15
|
value: VariableValue;
|
|
@@ -17,6 +18,8 @@ export interface RosterListInputProps {
|
|
|
17
18
|
error?: string;
|
|
18
19
|
disabled?: boolean;
|
|
19
20
|
rosterVariables?: RosterVariable[];
|
|
21
|
+
services?: FormRendererServices;
|
|
22
|
+
isConsultationMode?: boolean;
|
|
20
23
|
}
|
|
21
24
|
declare const RosterListInput: React.FC<RosterListInputProps>;
|
|
22
25
|
export default RosterListInput;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RosterListInput.d.ts","sourceRoot":"","sources":["../../../src/components/roster/RosterListInput.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG5D,MAAM,WAAW,oBAAoB;IACnC,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,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"RosterListInput.d.ts","sourceRoot":"","sources":["../../../src/components/roster/RosterListInput.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIxE,OAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,MAAM,WAAW,oBAAoB;IACnC,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,eAAe,CAAC,EAAE,cAAc,EAAE,CAAC;IAEnC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAYD,QAAA,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAiJnD,CAAC;AAEF,eAAe,eAAe,CAAC"}
|
|
@@ -12,7 +12,7 @@ import { useMemo } from 'react';
|
|
|
12
12
|
import { AlertCircle } from 'lucide-react';
|
|
13
13
|
import { VariableValueConverter } from '../../lib/utils/variableValueConverter';
|
|
14
14
|
import RosterPanel from './RosterPanel';
|
|
15
|
-
const RosterListInput = ({ variable, value, onChange, onBlur, error, disabled, rosterVariables = [] }) => {
|
|
15
|
+
const RosterListInput = ({ variable, value, onChange, onBlur, error, disabled, rosterVariables = [], services, isConsultationMode = false }) => {
|
|
16
16
|
// Parser les options depuis la propriété valeur (format: "01#Option1|02#Option2|...")
|
|
17
17
|
const options = useMemo(() => {
|
|
18
18
|
const optionsSource = variable.proprietes?.valeur || variable.valeurDefaut;
|
|
@@ -44,6 +44,13 @@ const RosterListInput = ({ variable, value, onChange, onBlur, error, disabled, r
|
|
|
44
44
|
}, [rosterVariables]);
|
|
45
45
|
// Gérer le changement d'une variable dans un panel
|
|
46
46
|
const handleVariableChange = (optionCode, variableCode, newValue) => {
|
|
47
|
+
console.log('[RosterListInput] handleVariableChange appelé', {
|
|
48
|
+
optionCode,
|
|
49
|
+
variableCode,
|
|
50
|
+
newValue,
|
|
51
|
+
newValueType: typeof newValue,
|
|
52
|
+
currentDataBefore: JSON.stringify(currentData)
|
|
53
|
+
});
|
|
47
54
|
const newData = { ...currentData };
|
|
48
55
|
if (!newData[optionCode]) {
|
|
49
56
|
newData[optionCode] = {};
|
|
@@ -58,8 +65,10 @@ const RosterListInput = ({ variable, value, onChange, onBlur, error, disabled, r
|
|
|
58
65
|
delete newData[optionCode];
|
|
59
66
|
}
|
|
60
67
|
}
|
|
68
|
+
const serializedData = JSON.stringify(newData);
|
|
69
|
+
console.log('[RosterListInput] Nouvelle valeur sérialisée:', serializedData);
|
|
61
70
|
// Sérialiser en JSON pour le stockage
|
|
62
|
-
onChange(
|
|
71
|
+
onChange(serializedData);
|
|
63
72
|
};
|
|
64
73
|
// Obtenir la valeur d'une variable
|
|
65
74
|
const getVariableValue = (optionCode, variableCode) => {
|
|
@@ -72,6 +81,6 @@ const RosterListInput = ({ variable, value, onChange, onBlur, error, disabled, r
|
|
|
72
81
|
if (sortedRosterVariables.length === 0) {
|
|
73
82
|
return (_jsx("div", { className: "p-3 bg-yellow-50 border border-yellow-200 rounded-lg", children: _jsx("p", { className: "text-yellow-800 text-sm", children: "Aucune variable de roster d\u00E9finie. Veuillez configurer les variables du roster." }) }));
|
|
74
83
|
}
|
|
75
|
-
return (_jsxs("div", { className: "space-y-4", children: [_jsx("div", { children: _jsx("p", { className: "text-sm text-gray-500", children: "Renseignez les options" }) }), _jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: options.map(option => (_jsx(RosterPanel, { option: option, rosterVariables: sortedRosterVariables, value: currentData[option.code] || {}, onChange: (variableCode, newValue) => handleVariableChange(option.code, variableCode, newValue), disabled: disabled }, option.code))) }), Object.keys(currentData).length > 0 && (_jsx("div", { className: "p-2 bg-green-50 border border-green-200 rounded text-sm", children: _jsxs("span", { className: "text-green-800 font-medium", children: [Object.keys(currentData).length, " option(s) avec des s\u00E9lections"] }) })), 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 })] }))] }));
|
|
84
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsx("div", { children: _jsx("p", { className: "text-sm text-gray-500", children: "Renseignez les options" }) }), _jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: options.map(option => (_jsx(RosterPanel, { option: option, rosterVariables: sortedRosterVariables, value: currentData[option.code] || {}, onChange: (variableCode, newValue) => handleVariableChange(option.code, variableCode, newValue), disabled: disabled, services: services, isConsultationMode: isConsultationMode }, option.code))) }), Object.keys(currentData).length > 0 && (_jsx("div", { className: "p-2 bg-green-50 border border-green-200 rounded text-sm", children: _jsxs("span", { className: "text-green-800 font-medium", children: [Object.keys(currentData).length, " option(s) avec des s\u00E9lections"] }) })), 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 })] }))] }));
|
|
76
85
|
};
|
|
77
86
|
export default RosterListInput;
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* (RADIO, COMBOBOX, STRING, etc.) au lieu de simples checkboxes/selects
|
|
7
7
|
*/
|
|
8
8
|
import React from 'react';
|
|
9
|
+
import { FormRendererServices } from '../../types/services';
|
|
9
10
|
interface RosterOption {
|
|
10
11
|
code: string;
|
|
11
12
|
designation: string;
|
|
@@ -30,6 +31,8 @@ export interface RosterPanelProps {
|
|
|
30
31
|
showCheckbox?: boolean;
|
|
31
32
|
isChecked?: boolean;
|
|
32
33
|
onCheckChange?: (checked: boolean) => void;
|
|
34
|
+
services?: FormRendererServices;
|
|
35
|
+
isConsultationMode?: boolean;
|
|
33
36
|
}
|
|
34
37
|
declare const RosterPanel: React.FC<RosterPanelProps>;
|
|
35
38
|
export default RosterPanel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RosterPanel.d.ts","sourceRoot":"","sources":["../../../src/components/roster/RosterPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAkB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"RosterPanel.d.ts","sourceRoot":"","sources":["../../../src/components/roster/RosterPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAM5D,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAGD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAE3C,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,QAAA,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAqL3C,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -11,7 +11,7 @@ import { useMemo } from 'react';
|
|
|
11
11
|
import VariableRenderer from '../VariableRenderer';
|
|
12
12
|
import { cn } from '../../lib/utils/cn';
|
|
13
13
|
import { RosterConditionEngine } from '../../lib/roster-condition-engine';
|
|
14
|
-
const RosterPanel = ({ option, rosterVariables, value, onChange, disabled, showCheckbox = false, isChecked = true, onCheckChange }) => {
|
|
14
|
+
const RosterPanel = ({ option, rosterVariables, value, onChange, disabled, showCheckbox = false, isChecked = true, onCheckChange, services, isConsultationMode = false }) => {
|
|
15
15
|
// Trier les variables par ordre
|
|
16
16
|
const sortedVariables = [...rosterVariables].sort((a, b) => a.ordre - b.ordre);
|
|
17
17
|
// Calculer les variables masquées par les jumps
|
|
@@ -88,7 +88,24 @@ const RosterPanel = ({ option, rosterVariables, value, onChange, disabled, showC
|
|
|
88
88
|
};
|
|
89
89
|
// Récupérer la valeur actuelle pour cette variable dans cette option
|
|
90
90
|
const currentValue = value[rosterVar.code] || null;
|
|
91
|
-
|
|
91
|
+
// 🔍 DEBUG: Log pour tracer le problème des STRING dans les rosters
|
|
92
|
+
console.log('[RosterPanel] Rendu variable', {
|
|
93
|
+
code: rosterVar.code,
|
|
94
|
+
uniqueCode,
|
|
95
|
+
typeCode: effectiveTypeCode,
|
|
96
|
+
currentValue,
|
|
97
|
+
currentValueType: typeof currentValue,
|
|
98
|
+
isDisabled: disabled,
|
|
99
|
+
variableIsReadonly: variable.isReadonly
|
|
100
|
+
});
|
|
101
|
+
return (_jsx("div", { className: "roster-variable", children: _jsx(VariableRenderer, { variable: variable, value: currentValue, onChange: (newValue) => {
|
|
102
|
+
console.log('[RosterPanel] onChange appelé', {
|
|
103
|
+
variableCode: rosterVar.code,
|
|
104
|
+
newValue,
|
|
105
|
+
newValueType: typeof newValue
|
|
106
|
+
});
|
|
107
|
+
onChange(rosterVar.code, newValue);
|
|
108
|
+
}, disabled: disabled, services: services, isConsultationMode: isConsultationMode }) }, rosterVar.code));
|
|
92
109
|
}) })) : (_jsx("div", { className: "p-4 text-center text-gray-500 bg-gray-50 rounded border border-gray-200", children: _jsx("p", { className: "text-sm", children: "\u2713 Cochez l'option ci-dessus pour renseigner les variables" }) }))] }));
|
|
93
110
|
};
|
|
94
111
|
export default RosterPanel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFormNavigation.d.ts","sourceRoot":"","sources":["../../src/hooks/useFormNavigation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAkB,MAAM,kBAAkB,CAAC;AAErF,MAAM,WAAW,wBAAwB;IACvC,8BAA8B;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qDAAqD;IACrD,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,qFAAqF;IACrF,wBAAwB,CAAC,EAAE,MAAM,OAAO,CAAC;CAC1C;AAED,MAAM,WAAW,uBAAuB;IACtC,gCAAgC;IAChC,eAAe,EAAE,eAAe,CAAC;IACjC,kCAAkC;IAClC,YAAY,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC3C,8DAA8D;IAC9D,eAAe,EAAE,GAAG,GAAG,SAAS,CAAC;IACjC,gCAAgC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,gCAAgC;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,uCAAuC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,aAAa,EAAE,OAAO,CAAC;IACvB,8BAA8B;IAC9B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,gCAAgC;IAChC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,mCAAmC;IACnC,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kDAAkD;IAClD,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,gDAAgD;IAChD,oBAAoB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,kCAAkC;IAClC,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,iCAAiC;IACjC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,OAAO,GAAE,wBAA6B,GACrC,uBAAuB,
|
|
1
|
+
{"version":3,"file":"useFormNavigation.d.ts","sourceRoot":"","sources":["../../src/hooks/useFormNavigation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAkB,MAAM,kBAAkB,CAAC;AAErF,MAAM,WAAW,wBAAwB;IACvC,8BAA8B;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kCAAkC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qDAAqD;IACrD,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,qFAAqF;IACrF,wBAAwB,CAAC,EAAE,MAAM,OAAO,CAAC;CAC1C;AAED,MAAM,WAAW,uBAAuB;IACtC,gCAAgC;IAChC,eAAe,EAAE,eAAe,CAAC;IACjC,kCAAkC;IAClC,YAAY,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC3C,8DAA8D;IAC9D,eAAe,EAAE,GAAG,GAAG,SAAS,CAAC;IACjC,gCAAgC;IAChC,YAAY,EAAE,OAAO,CAAC;IACtB,gCAAgC;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,uCAAuC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,aAAa,EAAE,OAAO,CAAC;IACvB,8BAA8B;IAC9B,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,gCAAgC;IAChC,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,mCAAmC;IACnC,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,kDAAkD;IAClD,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,gDAAgD;IAChD,oBAAoB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,kCAAkC;IAClC,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,iCAAiC;IACjC,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,gBAAgB,EAAE,EAC3B,OAAO,GAAE,wBAA6B,GACrC,uBAAuB,CAoKzB;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -67,6 +67,10 @@ export function useFormNavigation(groupes, options = {}) {
|
|
|
67
67
|
if (onGroupChange && nextGroup) {
|
|
68
68
|
onGroupChange(nextGroupIndex, nextGroup.code);
|
|
69
69
|
}
|
|
70
|
+
// Scroll to top of the new group
|
|
71
|
+
if (typeof window !== 'undefined') {
|
|
72
|
+
window.scrollTo({ top: 0, behavior: 'smooth' });
|
|
73
|
+
}
|
|
70
74
|
}, [isLastGroup, navigationState.groupeIndex, groupes, validateBeforeNavigation, onGroupChange]);
|
|
71
75
|
// Aller au groupe précédent
|
|
72
76
|
const goToPreviousGroup = useCallback(() => {
|
|
@@ -83,6 +87,10 @@ export function useFormNavigation(groupes, options = {}) {
|
|
|
83
87
|
if (onGroupChange && prevGroup) {
|
|
84
88
|
onGroupChange(prevGroupIndex, prevGroup.code);
|
|
85
89
|
}
|
|
90
|
+
// Scroll to top of the new group
|
|
91
|
+
if (typeof window !== 'undefined') {
|
|
92
|
+
window.scrollTo({ top: 0, behavior: 'smooth' });
|
|
93
|
+
}
|
|
86
94
|
}, [isFirstGroup, navigationState.groupeIndex, groupes, onGroupChange]);
|
|
87
95
|
// Aller à un groupe spécifique
|
|
88
96
|
const goToGroup = useCallback((groupIndex) => {
|
|
@@ -98,6 +106,10 @@ export function useFormNavigation(groupes, options = {}) {
|
|
|
98
106
|
if (onGroupChange && targetGroup) {
|
|
99
107
|
onGroupChange(groupIndex, targetGroup.code);
|
|
100
108
|
}
|
|
109
|
+
// Scroll to top of the new group
|
|
110
|
+
if (typeof window !== 'undefined') {
|
|
111
|
+
window.scrollTo({ top: 0, behavior: 'smooth' });
|
|
112
|
+
}
|
|
101
113
|
}, [groupes, onGroupChange]);
|
|
102
114
|
// Changer d'instance
|
|
103
115
|
const changeInstance = useCallback((instanceIndex) => {
|
package/package.json
CHANGED