datakeen-session-react 1.1.191 → 1.1.192
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/cjs/components/DatakeenSession.js +7 -1
- package/dist/cjs/components/DatakeenSession.js.map +1 -1
- package/dist/cjs/components/document-collection/DocumentCollection.js +42 -29
- package/dist/cjs/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/cjs/components/session/EndFlow.js +3 -2
- package/dist/cjs/components/session/EndFlow.js.map +1 -1
- package/dist/cjs/components/session/MobileRedirect.js +4 -0
- package/dist/cjs/components/session/MobileRedirect.js.map +1 -1
- package/dist/cjs/components/session/PdfGeneration.js +25 -19
- package/dist/cjs/components/session/PdfGeneration.js.map +1 -1
- package/dist/cjs/components/session/StartSession.js +16 -5
- package/dist/cjs/components/session/StartSession.js.map +1 -1
- package/dist/cjs/components/session/UserInputForm/CustomFormFields.js +7 -14
- package/dist/cjs/components/session/UserInputForm/CustomFormFields.js.map +1 -1
- package/dist/cjs/components/session/UserInputForm.js +2 -2
- package/dist/cjs/components/session/UserInputForm.js.map +1 -1
- package/dist/cjs/components/signature-electronic/SignedDocumentPreview.js +12 -14
- package/dist/cjs/components/signature-electronic/SignedDocumentPreview.js.map +1 -1
- package/dist/cjs/components/template/ExternalVerificationNodeHandler.js +67 -4
- package/dist/cjs/components/template/ExternalVerificationNodeHandler.js.map +1 -1
- package/dist/cjs/hooks/useSession.js +3 -3
- package/dist/cjs/hooks/useSession.js.map +1 -1
- package/dist/cjs/hooks/useUserInputForm.js +13 -9
- package/dist/cjs/hooks/useUserInputForm.js.map +1 -1
- package/dist/cjs/i18n/en.json.js +4 -1
- package/dist/cjs/i18n/en.json.js.map +1 -1
- package/dist/cjs/i18n/fr.json.js +4 -1
- package/dist/cjs/i18n/fr.json.js.map +1 -1
- package/dist/cjs/services/api.js +5 -0
- package/dist/cjs/services/api.js.map +1 -1
- package/dist/cjs/services/auditTrailService.js +19 -9
- package/dist/cjs/services/auditTrailService.js.map +1 -1
- package/dist/cjs/services/integrationService.js +2 -0
- package/dist/cjs/services/integrationService.js.map +1 -1
- package/dist/cjs/services/sessionCredentials.js +24 -0
- package/dist/cjs/services/sessionCredentials.js.map +1 -0
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/cjs/utils/customFieldIds.js +52 -0
- package/dist/cjs/utils/customFieldIds.js.map +1 -0
- package/dist/cjs/utils/navigation.js +21 -0
- package/dist/cjs/utils/navigation.js.map +1 -0
- package/dist/esm/components/DatakeenSession.js +8 -2
- package/dist/esm/components/DatakeenSession.js.map +1 -1
- package/dist/esm/components/document-collection/DocumentCollection.js +43 -30
- package/dist/esm/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/esm/components/session/EndFlow.js +3 -2
- package/dist/esm/components/session/EndFlow.js.map +1 -1
- package/dist/esm/components/session/MobileRedirect.js +4 -0
- package/dist/esm/components/session/MobileRedirect.js.map +1 -1
- package/dist/esm/components/session/PdfGeneration.js +25 -19
- package/dist/esm/components/session/PdfGeneration.js.map +1 -1
- package/dist/esm/components/session/StartSession.js +16 -5
- package/dist/esm/components/session/StartSession.js.map +1 -1
- package/dist/esm/components/session/UserInputForm/CustomFormFields.js +7 -14
- package/dist/esm/components/session/UserInputForm/CustomFormFields.js.map +1 -1
- package/dist/esm/components/session/UserInputForm.js +2 -2
- package/dist/esm/components/session/UserInputForm.js.map +1 -1
- package/dist/esm/components/signature-electronic/SignedDocumentPreview.js +12 -14
- package/dist/esm/components/signature-electronic/SignedDocumentPreview.js.map +1 -1
- package/dist/esm/components/template/ExternalVerificationNodeHandler.js +67 -4
- package/dist/esm/components/template/ExternalVerificationNodeHandler.js.map +1 -1
- package/dist/esm/hooks/useSession.js +3 -3
- package/dist/esm/hooks/useSession.js.map +1 -1
- package/dist/esm/hooks/useUserInputForm.js +13 -9
- package/dist/esm/hooks/useUserInputForm.js.map +1 -1
- package/dist/esm/i18n/en.json.js +4 -1
- package/dist/esm/i18n/en.json.js.map +1 -1
- package/dist/esm/i18n/fr.json.js +4 -1
- package/dist/esm/i18n/fr.json.js.map +1 -1
- package/dist/esm/services/api.js +5 -0
- package/dist/esm/services/api.js.map +1 -1
- package/dist/esm/services/auditTrailService.js +19 -9
- package/dist/esm/services/auditTrailService.js.map +1 -1
- package/dist/esm/services/integrationService.js +2 -0
- package/dist/esm/services/integrationService.js.map +1 -1
- package/dist/esm/services/sessionCredentials.js +20 -0
- package/dist/esm/services/sessionCredentials.js.map +1 -0
- package/dist/esm/types/session.js.map +1 -1
- package/dist/esm/utils/customFieldIds.js +50 -0
- package/dist/esm/utils/customFieldIds.js.map +1 -0
- package/dist/esm/utils/navigation.js +19 -0
- package/dist/esm/utils/navigation.js.map +1 -0
- package/dist/types/components/DatakeenSession.d.ts +1 -1
- package/dist/types/hooks/useSession.d.ts +1 -1
- package/dist/types/types/session.d.ts +3 -0
- package/docs/SESSION_TOKEN_MIGRATION.md +52 -0
- package/package.json +1 -1
|
@@ -17,51 +17,57 @@ var PdfGeneration = function (_a) {
|
|
|
17
17
|
var _d = React.useState(null), generationError = _d[0], setGenerationError = _d[1];
|
|
18
18
|
var baseURL = (api.apiService.getRawClient().defaults.baseURL || "").replace(/\/+$/, "");
|
|
19
19
|
var generatedPdfPath = "/session/sdk/".concat(sessionId, "/generated-pdf/").concat(node.id, ".pdf");
|
|
20
|
-
var generatedPdfUrl =
|
|
21
|
-
|
|
22
|
-
: generatedPdfPath;
|
|
23
|
-
var downloadPdfUrl = "".concat(generatedPdfUrl, "?download=1");
|
|
20
|
+
var _e = React.useState(''), generatedPdfUrl = _e[0], setGeneratedPdfUrl = _e[1];
|
|
21
|
+
var downloadPdfUrl = generatedPdfUrl;
|
|
24
22
|
var isDevEnv = /localhost|app\.dev\.datakeen\.co/.test(baseURL);
|
|
25
23
|
React.useEffect(function () {
|
|
26
24
|
var cancelled = false;
|
|
25
|
+
var objectUrl;
|
|
27
26
|
var generate = function () { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
|
|
28
|
-
var error_1;
|
|
27
|
+
var response, error_1;
|
|
29
28
|
var _a;
|
|
30
29
|
return tslib_es6.__generator(this, function (_b) {
|
|
31
30
|
switch (_b.label) {
|
|
32
31
|
case 0:
|
|
33
|
-
_b.trys.push([0,
|
|
32
|
+
_b.trys.push([0, 5, , 6]);
|
|
34
33
|
return [4 /*yield*/, api.apiService.post("/session/sdk/".concat(sessionId, "/generate-pdf"), {
|
|
35
34
|
nodeId: node.id,
|
|
36
35
|
userInput: tslib_es6.__assign(tslib_es6.__assign({}, userInput), { customFormData: (_a = userInput.customFormData) !== null && _a !== void 0 ? _a : {} }),
|
|
37
36
|
}, { timeout: 60000 })];
|
|
38
37
|
case 1:
|
|
39
38
|
_b.sent();
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
39
|
+
if (!!cancelled) return [3 /*break*/, 4];
|
|
40
|
+
setGenerationError(null);
|
|
41
|
+
if (!!isDevEnv) return [3 /*break*/, 2];
|
|
42
|
+
stepObject.goToNextStep(node.id, session.template);
|
|
43
|
+
return [3 /*break*/, 4];
|
|
44
|
+
case 2: return [4 /*yield*/, api.apiService.get(generatedPdfPath, { responseType: 'blob' })];
|
|
45
|
+
case 3:
|
|
46
|
+
response = _b.sent();
|
|
47
|
+
if (cancelled)
|
|
48
|
+
return [2 /*return*/];
|
|
49
|
+
objectUrl = URL.createObjectURL(response.data);
|
|
50
|
+
setGeneratedPdfUrl(objectUrl);
|
|
51
|
+
setStatus("ready");
|
|
52
|
+
_b.label = 4;
|
|
53
|
+
case 4: return [3 /*break*/, 6];
|
|
54
|
+
case 5:
|
|
51
55
|
error_1 = _b.sent();
|
|
52
56
|
if (!cancelled) {
|
|
53
57
|
setGenerationError((error_1 === null || error_1 === void 0 ? void 0 : error_1.message) ||
|
|
54
58
|
t("pdf_generation.error_unknown", "Erreur inconnue pendant la génération du PDF."));
|
|
55
59
|
setStatus("error");
|
|
56
60
|
}
|
|
57
|
-
return [3 /*break*/,
|
|
58
|
-
case
|
|
61
|
+
return [3 /*break*/, 6];
|
|
62
|
+
case 6: return [2 /*return*/];
|
|
59
63
|
}
|
|
60
64
|
});
|
|
61
65
|
}); };
|
|
62
66
|
generate();
|
|
63
67
|
return function () {
|
|
64
68
|
cancelled = true;
|
|
69
|
+
if (objectUrl)
|
|
70
|
+
URL.revokeObjectURL(objectUrl);
|
|
65
71
|
};
|
|
66
72
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
67
73
|
}, [runId]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PdfGeneration.js","sources":["../../../../../src/components/session/PdfGeneration.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport LoadingState from \"../states/LoadingState\";\nimport { apiService } from \"../../services/api\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport type { SessionData, stepObject } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\n\ninterface PdfGenerationProps {\n node: {\n id: string;\n type: string;\n pageTitle?: string;\n pageDescription?: string;\n };\n session: SessionData;\n sessionId: string;\n stepObject: stepObject;\n userInput: UserInput;\n}\n\nconst PdfGeneration: React.FC<PdfGenerationProps> = ({\n node,\n session,\n sessionId,\n stepObject,\n userInput,\n}) => {\n const { t } = useI18n();\n const [status, setStatus] = useState<\"loading\" | \"ready\" | \"error\">(\n \"loading\",\n );\n const [runId, setRunId] = useState(0);\n const [generationError, setGenerationError] = useState<string | null>(null);\n\n const baseURL = (apiService.getRawClient().defaults.baseURL || \"\").replace(\n /\\/+$/,\n \"\",\n );\n const generatedPdfPath = `/session/sdk/${sessionId}/generated-pdf/${node.id}.pdf`;\n const generatedPdfUrl = baseURL\n ? `${baseURL}${generatedPdfPath}`\n : generatedPdfPath;\n const downloadPdfUrl = `${generatedPdfUrl}?download=1`;\n\n const isDevEnv = /localhost|app\\.dev\\.datakeen\\.co/.test(baseURL);\n\n useEffect(() => {\n let cancelled = false;\n\n const generate = async () => {\n try {\n await apiService.post(\n `/session/sdk/${sessionId}/generate-pdf`,\n {\n nodeId: node.id,\n userInput: {\n ...userInput,\n customFormData: (userInput as any).customFormData ?? {},\n },\n },\n { timeout: 60_000 }, // PDF generation can take up to 60s\n );\n\n if (!cancelled) {\n setGenerationError(null);\n if (!isDevEnv) {\n stepObject.goToNextStep(node.id, session.template);\n } else {\n setStatus(\"ready\");\n }\n }\n } catch (error: any) {\n if (!cancelled) {\n setGenerationError(\n error?.message ||\n t(\n \"pdf_generation.error_unknown\",\n \"Erreur inconnue pendant la génération du PDF.\",\n ),\n );\n setStatus(\"error\");\n }\n }\n };\n\n generate();\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runId]);\n\n if (status === \"loading\") {\n return (\n <LoadingState\n message={\n node.pageTitle ||\n t(\"pdf_generation.loading_title\", \"Génération du document\")\n }\n subtitle={\n node.pageDescription ||\n t(\n \"pdf_generation.loading_subtitle\",\n \"Votre document est en cours de préparation...\",\n )\n }\n />\n );\n }\n\n if (status === \"ready\") {\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center gap-4\">\n <div className=\"text-green-500 text-4xl\">✅</div>\n <h2 className=\"text-xl font-bold text-gray-900\">\n {t(\"pdf_generation.ready_title\", \"Document généré\")}\n </h2>\n <p className=\"text-gray-600 max-w-md\">\n {t(\n \"pdf_generation.ready_description\",\n \"Vous pouvez prévisualiser ou télécharger le PDF avant de continuer.\",\n )}\n </p>\n <div className=\"flex flex-wrap justify-center gap-3 mt-2\">\n <a\n href={generatedPdfUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"px-4 py-2 border border-gray-300 rounded text-gray-700 hover:bg-gray-50 transition-colors\"\n >\n {t(\"pdf_generation.preview\", \"Aperçu\")}\n </a>\n <a\n href={downloadPdfUrl}\n className=\"px-4 py-2 border border-gray-300 rounded text-gray-700 hover:bg-gray-50 transition-colors\"\n >\n {t(\"pdf_generation.download\", \"Télécharger\")}\n </a>\n <button\n type=\"button\"\n className=\"px-4 py-2 bg-primary text-white rounded hover:opacity-90 transition-opacity\"\n onClick={() => stepObject.goToNextStep(node.id, session.template)}\n >\n {t(\"template.buttons.continue\", \"Continuer\")}\n </button>\n </div>\n </div>\n );\n }\n\n // Error state\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center gap-4\">\n <div className=\"text-red-500 text-4xl\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600\">\n {t(\"pdf_generation.error_title\", \"Erreur lors de la génération\")}\n </h2>\n <p className=\"text-gray-600 max-w-sm\">\n {t(\n \"pdf_generation.error_description\",\n \"Une erreur est survenue lors de la génération de votre document. Veuillez réessayer.\",\n )}\n </p>\n {generationError && (\n <p className=\"max-w-md text-xs text-red-500\">{generationError}</p>\n )}\n <div className=\"flex gap-3 mt-2\">\n {stepObject.canGoBack && (\n <button\n type=\"button\"\n className=\"px-4 py-2 border border-gray-300 rounded text-gray-700 hover:bg-gray-50 transition-colors\"\n onClick={() => stepObject.goBack()}\n >\n {t(\"template.buttons.back\", \"Retour\")}\n </button>\n )}\n <button\n type=\"button\"\n className=\"px-4 py-2 bg-primary text-white rounded hover:opacity-90 transition-opacity\"\n onClick={() => {\n setGenerationError(null);\n setStatus(\"loading\");\n setRunId((value) => value + 1);\n }}\n >\n {t(\"pdf_generation.retry\", \"Réessayer\")}\n </button>\n </div>\n </div>\n );\n};\n\nexport default PdfGeneration;\n"],"names":["useI18n","useState","apiService","useEffect","__awaiter","__assign","_jsx","LoadingState","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PdfGeneration.js","sources":["../../../../../src/components/session/PdfGeneration.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport LoadingState from \"../states/LoadingState\";\nimport { apiService } from \"../../services/api\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport type { SessionData, stepObject } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\n\ninterface PdfGenerationProps {\n node: {\n id: string;\n type: string;\n pageTitle?: string;\n pageDescription?: string;\n };\n session: SessionData;\n sessionId: string;\n stepObject: stepObject;\n userInput: UserInput;\n}\n\nconst PdfGeneration: React.FC<PdfGenerationProps> = ({\n node,\n session,\n sessionId,\n stepObject,\n userInput,\n}) => {\n const { t } = useI18n();\n const [status, setStatus] = useState<\"loading\" | \"ready\" | \"error\">(\n \"loading\",\n );\n const [runId, setRunId] = useState(0);\n const [generationError, setGenerationError] = useState<string | null>(null);\n\n const baseURL = (apiService.getRawClient().defaults.baseURL || \"\").replace(\n /\\/+$/,\n \"\",\n );\n const generatedPdfPath = `/session/sdk/${sessionId}/generated-pdf/${node.id}.pdf`;\n const [generatedPdfUrl, setGeneratedPdfUrl] = useState('');\n const downloadPdfUrl = generatedPdfUrl;\n\n const isDevEnv = /localhost|app\\.dev\\.datakeen\\.co/.test(baseURL);\n\n useEffect(() => {\n let cancelled = false;\n let objectUrl: string | undefined;\n\n const generate = async () => {\n try {\n await apiService.post(\n `/session/sdk/${sessionId}/generate-pdf`,\n {\n nodeId: node.id,\n userInput: {\n ...userInput,\n customFormData: (userInput as any).customFormData ?? {},\n },\n },\n { timeout: 60_000 }, // PDF generation can take up to 60s\n );\n\n if (!cancelled) {\n setGenerationError(null);\n if (!isDevEnv) {\n stepObject.goToNextStep(node.id, session.template);\n } else {\n const response = await apiService.get(generatedPdfPath, { responseType: 'blob' });\n if (cancelled) return;\n objectUrl = URL.createObjectURL(response.data);\n setGeneratedPdfUrl(objectUrl);\n setStatus(\"ready\");\n }\n }\n } catch (error: any) {\n if (!cancelled) {\n setGenerationError(\n error?.message ||\n t(\n \"pdf_generation.error_unknown\",\n \"Erreur inconnue pendant la génération du PDF.\",\n ),\n );\n setStatus(\"error\");\n }\n }\n };\n\n generate();\n\n return () => {\n cancelled = true;\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runId]);\n\n if (status === \"loading\") {\n return (\n <LoadingState\n message={\n node.pageTitle ||\n t(\"pdf_generation.loading_title\", \"Génération du document\")\n }\n subtitle={\n node.pageDescription ||\n t(\n \"pdf_generation.loading_subtitle\",\n \"Votre document est en cours de préparation...\",\n )\n }\n />\n );\n }\n\n if (status === \"ready\") {\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center gap-4\">\n <div className=\"text-green-500 text-4xl\">✅</div>\n <h2 className=\"text-xl font-bold text-gray-900\">\n {t(\"pdf_generation.ready_title\", \"Document généré\")}\n </h2>\n <p className=\"text-gray-600 max-w-md\">\n {t(\n \"pdf_generation.ready_description\",\n \"Vous pouvez prévisualiser ou télécharger le PDF avant de continuer.\",\n )}\n </p>\n <div className=\"flex flex-wrap justify-center gap-3 mt-2\">\n <a\n href={generatedPdfUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"px-4 py-2 border border-gray-300 rounded text-gray-700 hover:bg-gray-50 transition-colors\"\n >\n {t(\"pdf_generation.preview\", \"Aperçu\")}\n </a>\n <a\n href={downloadPdfUrl}\n className=\"px-4 py-2 border border-gray-300 rounded text-gray-700 hover:bg-gray-50 transition-colors\"\n >\n {t(\"pdf_generation.download\", \"Télécharger\")}\n </a>\n <button\n type=\"button\"\n className=\"px-4 py-2 bg-primary text-white rounded hover:opacity-90 transition-opacity\"\n onClick={() => stepObject.goToNextStep(node.id, session.template)}\n >\n {t(\"template.buttons.continue\", \"Continuer\")}\n </button>\n </div>\n </div>\n );\n }\n\n // Error state\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center gap-4\">\n <div className=\"text-red-500 text-4xl\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600\">\n {t(\"pdf_generation.error_title\", \"Erreur lors de la génération\")}\n </h2>\n <p className=\"text-gray-600 max-w-sm\">\n {t(\n \"pdf_generation.error_description\",\n \"Une erreur est survenue lors de la génération de votre document. Veuillez réessayer.\",\n )}\n </p>\n {generationError && (\n <p className=\"max-w-md text-xs text-red-500\">{generationError}</p>\n )}\n <div className=\"flex gap-3 mt-2\">\n {stepObject.canGoBack && (\n <button\n type=\"button\"\n className=\"px-4 py-2 border border-gray-300 rounded text-gray-700 hover:bg-gray-50 transition-colors\"\n onClick={() => stepObject.goBack()}\n >\n {t(\"template.buttons.back\", \"Retour\")}\n </button>\n )}\n <button\n type=\"button\"\n className=\"px-4 py-2 bg-primary text-white rounded hover:opacity-90 transition-opacity\"\n onClick={() => {\n setGenerationError(null);\n setStatus(\"loading\");\n setRunId((value) => value + 1);\n }}\n >\n {t(\"pdf_generation.retry\", \"Réessayer\")}\n </button>\n </div>\n </div>\n );\n};\n\nexport default PdfGeneration;\n"],"names":["useI18n","useState","apiService","useEffect","__awaiter","__assign","_jsx","LoadingState","_jsxs"],"mappings":";;;;;;;;;;;AAoBA,IAAM,aAAa,GAAiC,UAAC,EAMpD,EAAA;AALC,IAAA,IAAA,IAAI,GAAA,EAAA,CAAA,IAAA,EACJ,OAAO,GAAA,EAAA,CAAA,OAAA,EACP,SAAS,GAAA,EAAA,CAAA,SAAA,EACT,UAAU,GAAA,EAAA,CAAA,UAAA,EACV,SAAS,GAAA,EAAA,CAAA,SAAA;AAED,IAAA,IAAA,CAAC,GAAKA,eAAO,EAAE,EAAd;IACH,IAAA,EAAA,GAAsBC,cAAQ,CAClC,SAAS,CACV,EAFM,MAAM,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,SAAS,GAAA,EAAA,CAAA,CAAA,CAEvB;IACK,IAAA,EAAA,GAAoBA,cAAQ,CAAC,CAAC,CAAC,EAA9B,KAAK,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,QAAQ,GAAA,EAAA,CAAA,CAAA,CAAe;IAC/B,IAAA,EAAA,GAAwCA,cAAQ,CAAgB,IAAI,CAAC,EAApE,eAAe,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,kBAAkB,GAAA,EAAA,CAAA,CAAA,CAAiC;IAE3E,IAAM,OAAO,GAAG,CAACC,cAAU,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CACxE,MAAM,EACN,EAAE,CACH;IACD,IAAM,gBAAgB,GAAG,eAAA,CAAA,MAAA,CAAgB,SAAS,4BAAkB,IAAI,CAAC,EAAE,EAAA,MAAA,CAAM;IAC3E,IAAA,EAAA,GAAwCD,cAAQ,CAAC,EAAE,CAAC,EAAnD,eAAe,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,kBAAkB,GAAA,EAAA,CAAA,CAAA,CAAgB;IAC1D,IAAM,cAAc,GAAG,eAAe;IAEtC,IAAM,QAAQ,GAAG,kCAAkC,CAAC,IAAI,CAAC,OAAO,CAAC;AAEjE,IAAAE,eAAS,CAAC,YAAA;QACR,IAAI,SAAS,GAAG,KAAK;AACrB,QAAA,IAAI,SAA6B;AAEjC,QAAA,IAAM,QAAQ,GAAG,YAAA,EAAA,OAAAC,mBAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;;;AAEb,wBAAA,OAAA,CAAA,CAAA,YAAMF,cAAU,CAAC,IAAI,CACnB,eAAA,CAAA,MAAA,CAAgB,SAAS,kBAAe,EACxC;gCACE,MAAM,EAAE,IAAI,CAAC,EAAE;gCACf,SAAS,EAAAG,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EACJ,SAAS,CAAA,EAAA,EACZ,cAAc,EAAE,CAAA,EAAA,GAAC,SAAiB,CAAC,cAAc,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE,EAAA,CACxD;AACF,6BAAA,EACD,EAAE,OAAO,EAAE,KAAM,EAAE,CACpB,CAAA;;AAVD,wBAAA,EAAA,CAAA,IAAA,EAUC;6BAEG,CAAC,SAAS,EAAV,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;wBACF,kBAAkB,CAAC,IAAI,CAAC;6BACpB,CAAC,QAAQ,EAAT,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;wBACF,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC;;AAEjC,oBAAA,KAAA,CAAA,EAAA,OAAA,CAAA,CAAA,YAAMH,cAAU,CAAC,GAAG,CAAC,gBAAgB,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAAA;;AAA3E,wBAAA,QAAQ,GAAG,EAAA,CAAA,IAAA,EAAgE;AACjF,wBAAA,IAAI,SAAS;4BAAE,OAAA,CAAA,CAAA,YAAA;wBACf,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC;wBAC9C,kBAAkB,CAAC,SAAS,CAAC;wBAC7B,SAAS,CAAC,OAAO,CAAC;;;;;wBAItB,IAAI,CAAC,SAAS,EAAE;4BACd,kBAAkB,CAChB,CAAA,OAAK,KAAA,IAAA,IAAL,OAAK,KAAA,MAAA,GAAA,MAAA,GAAL,OAAK,CAAE,OAAO;AACZ,gCAAA,CAAC,CACC,8BAA8B,EAC9B,+CAA+C,CAChD,CACJ;4BACD,SAAS,CAAC,OAAO,CAAC;wBACpB;;;;;aAEH;AAED,QAAA,QAAQ,EAAE;QAEV,OAAO,YAAA;YACL,SAAS,GAAG,IAAI;AAChB,YAAA,IAAI,SAAS;AAAE,gBAAA,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC;AAC/C,QAAA,CAAC;;AAEH,IAAA,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AAEX,IAAA,IAAI,MAAM,KAAK,SAAS,EAAE;QACxB,QACEI,eAACC,oBAAY,EAAA,EACX,OAAO,EACL,IAAI,CAAC,SAAS;gBACd,CAAC,CAAC,8BAA8B,EAAE,wBAAwB,CAAC,EAE7D,QAAQ,EACN,IAAI,CAAC,eAAe;AACpB,gBAAA,CAAC,CACC,iCAAiC,EACjC,+CAA+C,CAChD,EAAA,CAEH;IAEN;AAEA,IAAA,IAAI,MAAM,KAAK,OAAO,EAAE;QACtB,QACEC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wEAAwE,EAAA,QAAA,EAAA,CACrFF,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,EAAA,QAAA,EAAA,QAAA,EAAA,CAAQ,EAChDA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC5C,CAAC,CAAC,4BAA4B,EAAE,iBAAiB,CAAC,EAAA,CAChD,EACLA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAClC,CAAC,CACA,kCAAkC,EAClC,qEAAqE,CACtE,EAAA,CACC,EACJE,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0CAA0C,EAAA,QAAA,EAAA,CACvDF,cAAA,CAAA,GAAA,EAAA,EACE,IAAI,EAAE,eAAe,EACrB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,2FAA2F,EAAA,QAAA,EAEpG,CAAC,CAAC,wBAAwB,EAAE,QAAQ,CAAC,EAAA,CACpC,EACJA,cAAA,CAAA,GAAA,EAAA,EACE,IAAI,EAAE,cAAc,EACpB,SAAS,EAAC,2FAA2F,EAAA,QAAA,EAEpG,CAAC,CAAC,yBAAyB,EAAE,aAAa,CAAC,EAAA,CAC1C,EACJA,cAAA,CAAA,QAAA,EAAA,EACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,6EAA6E,EACvF,OAAO,EAAE,YAAA,EAAM,OAAA,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA,CAAlD,CAAkD,EAAA,QAAA,EAEhE,CAAC,CAAC,2BAA2B,EAAE,WAAW,CAAC,EAAA,CACrC,CAAA,EAAA,CACL,CAAA,EAAA,CACF;IAEV;;IAGA,QACEE,yBAAK,SAAS,EAAC,wEAAwE,EAAA,QAAA,EAAA,CACrFF,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uBAAuB,6BAAS,EAC/CA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,gCAAgC,YAC3C,CAAC,CAAC,4BAA4B,EAAE,8BAA8B,CAAC,GAC7D,EACLA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,wBAAwB,YAClC,CAAC,CACA,kCAAkC,EAClC,sFAAsF,CACvF,GACC,EACH,eAAe,KACdA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,+BAA+B,EAAA,QAAA,EAAE,eAAe,EAAA,CAAK,CACnE,EACDE,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iBAAiB,EAAA,QAAA,EAAA,CAC7B,UAAU,CAAC,SAAS,KACnBF,cAAA,CAAA,QAAA,EAAA,EACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,2FAA2F,EACrG,OAAO,EAAE,YAAA,EAAM,OAAA,UAAU,CAAC,MAAM,EAAE,CAAA,CAAnB,CAAmB,EAAA,QAAA,EAEjC,CAAC,CAAC,uBAAuB,EAAE,QAAQ,CAAC,EAAA,CAC9B,CACV,EACDA,cAAA,CAAA,QAAA,EAAA,EACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,6EAA6E,EACvF,OAAO,EAAE,YAAA;4BACP,kBAAkB,CAAC,IAAI,CAAC;4BACxB,SAAS,CAAC,SAAS,CAAC;4BACpB,QAAQ,CAAC,UAAC,KAAK,EAAA,EAAK,OAAA,KAAK,GAAG,CAAC,CAAA,CAAT,CAAS,CAAC;wBAChC,CAAC,EAAA,QAAA,EAEA,CAAC,CAAC,sBAAsB,EAAE,WAAW,CAAC,EAAA,CAChC,CAAA,EAAA,CACL,CAAA,EAAA,CACF;AAEV;;;;"}
|
|
@@ -8,14 +8,25 @@ var Start = require('../start-flow/Start.js');
|
|
|
8
8
|
var CGU = require('../start-flow/CGU.js');
|
|
9
9
|
|
|
10
10
|
var StartSession = function (_a) {
|
|
11
|
-
var _b, _c, _d;
|
|
11
|
+
var _b, _c, _d, _e, _f;
|
|
12
12
|
var stepObject = _a.stepObject, session = _a.session, showQRCodeInstructions = _a.showQRCodeInstructions;
|
|
13
13
|
var setStep = stepObject.setStep;
|
|
14
|
-
var
|
|
14
|
+
var _g = React.useState(0), startStep = _g[0], setStartStep = _g[1];
|
|
15
15
|
// Find the start node from template
|
|
16
16
|
var startNode = (_c = (_b = session === null || session === void 0 ? void 0 : session.template) === null || _b === void 0 ? void 0 : _b.nodes) === null || _c === void 0 ? void 0 : _c.find(function (node) { return node.type === "start"; });
|
|
17
|
-
//
|
|
18
|
-
|
|
17
|
+
// Un nœud `legal-consent` porte lui-même le consentement : afficher en plus
|
|
18
|
+
// les CGU de la page d'accueil ferait consentir deux fois pour la même chose.
|
|
19
|
+
//
|
|
20
|
+
// Le drapeau `showLegacyCGU` n'existe que pour les parcours antérieurs à ce
|
|
21
|
+
// nœud. Il était posé à `false` par une migration au démarrage, retirée
|
|
22
|
+
// depuis (« remove legacy legal consent migration from bootstrap process ») :
|
|
23
|
+
// un parcours créé ou restauré après ce retrait garde donc le défaut `true`
|
|
24
|
+
// et réaffiche les CGU malgré son nœud de consentement. On déduit le cas du
|
|
25
|
+
// graphe plutôt que du drapeau, ce qui couvre aussi les parcours existants
|
|
26
|
+
// sans toucher aux données.
|
|
27
|
+
var hasLegalConsentNode = ((_e = (_d = session === null || session === void 0 ? void 0 : session.template) === null || _d === void 0 ? void 0 : _d.nodes) === null || _e === void 0 ? void 0 : _e.some(function (node) { return node.type === "legal-consent"; })) === true;
|
|
28
|
+
var showLegacyCGU = !hasLegalConsentNode &&
|
|
29
|
+
(startNode === null || startNode === void 0 ? void 0 : startNode.showLegacyCGU) !== false;
|
|
19
30
|
// If CGU is disabled, clicking "Start" skips CGU.
|
|
20
31
|
// Still honour showQRCodeInstructions so the QR code step is not bypassed.
|
|
21
32
|
var handleStartButtonClick = function (localStep) {
|
|
@@ -26,7 +37,7 @@ var StartSession = function (_a) {
|
|
|
26
37
|
setStartStep(localStep);
|
|
27
38
|
}
|
|
28
39
|
};
|
|
29
|
-
return (jsxRuntime.jsxs("div", { className: "w-full h-full", children: [startStep === 0 && (jsxRuntime.jsx(Start.default, { setStep: handleStartButtonClick, welcomeTitle: startNode === null || startNode === void 0 ? void 0 : startNode.welcomeTitle, welcomeSubtitle: startNode === null || startNode === void 0 ? void 0 : startNode.welcomeSubtitle, welcomeDescription: startNode === null || startNode === void 0 ? void 0 : startNode.welcomeDescription, welcomeImage: startNode === null || startNode === void 0 ? void 0 : startNode.welcomeImage, session: session !== null && session !== void 0 ? session : undefined })), startStep === 1 && showLegacyCGU && (jsxRuntime.jsx(CGU.default, { setStep: setStep, session: session !== null && session !== void 0 ? session : undefined, sessionId: session === null || session === void 0 ? void 0 : session.id, showQRCodeInstructions: showQRCodeInstructions, languages: (
|
|
40
|
+
return (jsxRuntime.jsxs("div", { className: "w-full h-full", children: [startStep === 0 && (jsxRuntime.jsx(Start.default, { setStep: handleStartButtonClick, welcomeTitle: startNode === null || startNode === void 0 ? void 0 : startNode.welcomeTitle, welcomeSubtitle: startNode === null || startNode === void 0 ? void 0 : startNode.welcomeSubtitle, welcomeDescription: startNode === null || startNode === void 0 ? void 0 : startNode.welcomeDescription, welcomeImage: startNode === null || startNode === void 0 ? void 0 : startNode.welcomeImage, session: session !== null && session !== void 0 ? session : undefined })), startStep === 1 && showLegacyCGU && (jsxRuntime.jsx(CGU.default, { setStep: setStep, session: session !== null && session !== void 0 ? session : undefined, sessionId: session === null || session === void 0 ? void 0 : session.id, showQRCodeInstructions: showQRCodeInstructions, languages: (_f = session === null || session === void 0 ? void 0 : session.template) === null || _f === void 0 ? void 0 : _f.languages, onBack: function () { return setStartStep(0); } }))] }));
|
|
30
41
|
};
|
|
31
42
|
|
|
32
43
|
exports.default = StartSession;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StartSession.js","sources":["../../../../../src/components/session/StartSession.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { stepObject } from \"../../types/session\";\nimport { type SessionData } from \"../../types/session\";\nimport Start from \"../start-flow/Start\";\nimport CGU from \"../start-flow/CGU\";\n\ninterface StartSessionProps {\n stepObject: stepObject;\n session: SessionData | null;\n showQRCodeInstructions: boolean;\n}\n\nconst StartSession = ({ stepObject, session, showQRCodeInstructions }: StartSessionProps) => {\n const { setStep } = stepObject;\n const [startStep, setStartStep] = useState(0);\n\n // Find the start node from template\n const startNode = (session as SessionData | null)?.template?.nodes?.find(\n (node) => node.type === \"start\"\n );\n\n // showLegacyCGU
|
|
1
|
+
{"version":3,"file":"StartSession.js","sources":["../../../../../src/components/session/StartSession.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport type { stepObject } from \"../../types/session\";\nimport { type SessionData } from \"../../types/session\";\nimport Start from \"../start-flow/Start\";\nimport CGU from \"../start-flow/CGU\";\n\ninterface StartSessionProps {\n stepObject: stepObject;\n session: SessionData | null;\n showQRCodeInstructions: boolean;\n}\n\nconst StartSession = ({ stepObject, session, showQRCodeInstructions }: StartSessionProps) => {\n const { setStep } = stepObject;\n const [startStep, setStartStep] = useState(0);\n\n // Find the start node from template\n const startNode = (session as SessionData | null)?.template?.nodes?.find(\n (node) => node.type === \"start\"\n );\n\n // Un nœud `legal-consent` porte lui-même le consentement : afficher en plus\n // les CGU de la page d'accueil ferait consentir deux fois pour la même chose.\n //\n // Le drapeau `showLegacyCGU` n'existe que pour les parcours antérieurs à ce\n // nœud. Il était posé à `false` par une migration au démarrage, retirée\n // depuis (« remove legacy legal consent migration from bootstrap process ») :\n // un parcours créé ou restauré après ce retrait garde donc le défaut `true`\n // et réaffiche les CGU malgré son nœud de consentement. On déduit le cas du\n // graphe plutôt que du drapeau, ce qui couvre aussi les parcours existants\n // sans toucher aux données.\n const hasLegalConsentNode =\n (session as SessionData | null)?.template?.nodes?.some(\n (node) => node.type === \"legal-consent\",\n ) === true;\n\n const showLegacyCGU =\n !hasLegalConsentNode &&\n (startNode as { showLegacyCGU?: boolean } | undefined)?.showLegacyCGU !== false;\n\n // If CGU is disabled, clicking \"Start\" skips CGU.\n // Still honour showQRCodeInstructions so the QR code step is not bypassed.\n const handleStartButtonClick = (localStep: number) => {\n if (!showLegacyCGU) {\n setStep(showQRCodeInstructions ? 0.5 : 1);\n } else {\n setStartStep(localStep);\n }\n };\n\n return (\n <div className=\"w-full h-full\">\n {startStep === 0 && (\n <Start\n setStep={handleStartButtonClick}\n welcomeTitle={startNode?.welcomeTitle}\n welcomeSubtitle={startNode?.welcomeSubtitle}\n welcomeDescription={startNode?.welcomeDescription}\n welcomeImage={startNode?.welcomeImage}\n session={session ?? undefined}\n />\n )}\n {startStep === 1 && showLegacyCGU && (\n <CGU\n setStep={setStep}\n session={session ?? undefined}\n sessionId={session?.id}\n showQRCodeInstructions={showQRCodeInstructions}\n languages={session?.template?.languages}\n onBack={() => setStartStep(0)}\n />\n )}\n </div>\n );\n};\n\nexport default StartSession;\n"],"names":["useState","_jsxs","_jsx","Start","CGU"],"mappings":"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"}
|
|
@@ -55,16 +55,6 @@ var ListCell = function (_a) {
|
|
|
55
55
|
var CustomFormFields = function (_a) {
|
|
56
56
|
var customFields = _a.customFields, formData = _a.formData, errors = _a.errors, _b = _a.cellErrors, cellErrors = _b === void 0 ? {} : _b, onFieldChange = _a.onFieldChange, _c = _a.addressSuggestions, addressSuggestions = _c === void 0 ? [] : _c, _d = _a.showSuggestions, showSuggestions = _d === void 0 ? false : _d, onAddressChange = _a.onAddressChange, onAddressFocus = _a.onAddressFocus, onAddressBlur = _a.onAddressBlur, onApplySuggestion = _a.onApplySuggestion;
|
|
57
57
|
var _e = useI18n.useI18n(), t = _e.t, currentLanguage = _e.currentLanguage;
|
|
58
|
-
console.log("🎨 [CustomFormFields] Rendering with:", {
|
|
59
|
-
fieldsCount: customFields.length,
|
|
60
|
-
fields: customFields.map(function (f) { return ({
|
|
61
|
-
id: f.id,
|
|
62
|
-
label: f.label,
|
|
63
|
-
type: f.valueType,
|
|
64
|
-
}); }),
|
|
65
|
-
formData: formData,
|
|
66
|
-
errors: errors,
|
|
67
|
-
});
|
|
68
58
|
var renderField = function (field) {
|
|
69
59
|
var _a, _b;
|
|
70
60
|
var hasError = Boolean(errors[field.id]);
|
|
@@ -166,9 +156,6 @@ var CustomFormFields = function (_a) {
|
|
|
166
156
|
}
|
|
167
157
|
onFieldChange(field.id, rows_1.filter(function (_, i) { return i !== rowIndex; }));
|
|
168
158
|
};
|
|
169
|
-
clsx("w-full px-2 py-2 border rounded-lg text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent", hasError
|
|
170
|
-
? "border-red-500 bg-red-50"
|
|
171
|
-
: "border-gray-300 hover:border-gray-400");
|
|
172
159
|
return (jsxRuntime.jsxs("div", { className: "space-y-3 overflow-x-auto", children: [columns_1.length > 0 && (jsxRuntime.jsxs("div", { className: "grid gap-2 items-center w-full", style: {
|
|
173
160
|
gridTemplateColumns: gridTemplateColumns_1,
|
|
174
161
|
minWidth: gridMinWidth_1,
|
|
@@ -181,7 +168,13 @@ var CustomFormFields = function (_a) {
|
|
|
181
168
|
var cellInputClasses = clsx("w-full px-2 py-2 border rounded-lg text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent", cellHasError
|
|
182
169
|
? "border-red-500 bg-red-50"
|
|
183
170
|
: "border-gray-300 hover:border-gray-400");
|
|
184
|
-
return (jsxRuntime.jsxs("div", { className: "flex flex-col gap-1 min-w-0", children: [jsxRuntime.jsx(ListCell, { col: col, value: row[col.label] || "",
|
|
171
|
+
return (jsxRuntime.jsxs("div", { className: "flex flex-col gap-1 min-w-0", children: [jsxRuntime.jsx(ListCell, { col: col, value: row[col.label] || "",
|
|
172
|
+
// Volontairement `cellHasError` seul : l'ancien
|
|
173
|
+
// `|| hasError` peignait tout le tableau en rouge dès
|
|
174
|
+
// qu'une seule cellule était invalide, sans permettre
|
|
175
|
+
// de repérer laquelle. Le cas « pas assez de lignes »
|
|
176
|
+
// reste signalé par le message sous le champ.
|
|
177
|
+
hasError: cellHasError, cellClasses: cellInputClasses, onChange: function (val) {
|
|
185
178
|
return handleRowChange_1(rowIndex, col.label, val);
|
|
186
179
|
}, language: currentLanguage }), typeof cellErr === "string" && (jsxRuntime.jsx("span", { className: "text-xs text-red-600", children: cellErr }))] }, col.label));
|
|
187
180
|
}), jsxRuntime.jsx("button", { type: "button", onClick: function () { return handleRemoveRow_1(rowIndex); }, className: clsx("flex items-center justify-center w-8 h-8 rounded-full transition-colors", rows_1.length <= minRows_1
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFormFields.js","sources":["../../../../../../src/components/session/UserInputForm/CustomFormFields.tsx"],"sourcesContent":["import { Fragment, useRef } from \"react\";\nimport * as Label from \"@radix-ui/react-label\";\nimport clsx from \"clsx\";\nimport { Select } from \"../../ui/SelectComponent\";\nimport type { CustomField, ListColumn } from \"../../../types/session\";\nimport { useI18n } from \"../../../hooks/useI18n\";\nimport AddressFields from \"./AddressFields\";\nimport type { AddressSuggestion } from \"../../../types/userInputForm\";\nimport {\n createEmptyListRow,\n ensureMinimumListRows,\n getListFieldMinRows,\n normalizeListColumns,\n} from \"../../../utils/listFieldUtils\";\nimport { cellErrorKey } from \"../../../utils/customFieldValidation\";\nimport { DatePickerField } from \"./DatePickerField\";\n\ntype CellErrorValue = string | boolean;\n\n/**\n * Sous-composant dédié au rendu d'une cellule du tableau dynamique.\n * Nécessaire pour que les hooks internes à Select soient toujours appelés\n * de façon stable (règle des hooks React).\n */\nconst ListCell = ({\n col,\n value,\n hasError,\n cellClasses,\n onChange,\n language,\n}: {\n col: ListColumn;\n value: string;\n hasError: boolean;\n cellClasses: string;\n onChange: (val: string) => void;\n language: string;\n}) => {\n if (col.type === \"enum\") {\n return (\n <Select\n options={(col.options ?? []).map((opt) => ({ value: opt, label: opt }))}\n value={value}\n onValueChange={onChange}\n placeholder={col.placeholder || col.label}\n error={hasError}\n compact\n />\n );\n }\n if (col.type === \"email\") {\n return (\n <input\n type=\"email\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={col.placeholder || col.label}\n className={cellClasses}\n autoComplete=\"off\"\n inputMode=\"email\"\n />\n );\n }\n if (col.type === \"date\") {\n return (\n <DatePickerField\n value={value}\n dateFormat={col.dateFormat ?? \"dd/mm/yyyy\"}\n placeholder={col.placeholder}\n hasError={hasError}\n language={language}\n onChange={onChange}\n className={cellClasses}\n />\n );\n }\n return (\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={col.placeholder || col.label}\n className={cellClasses}\n autoComplete=\"off\"\n />\n );\n};\n\ninterface CustomFormFieldsProps {\n customFields: CustomField[];\n formData: Record<string, any>;\n errors: Record<string, CellErrorValue>;\n cellErrors?: Record<string, Record<string, CellErrorValue>>;\n onFieldChange: (fieldId: string, value: any) => void;\n // Address autocomplete props (for address field type)\n addressSuggestions?: AddressSuggestion[];\n showSuggestions?: boolean;\n onAddressChange?: (fieldId: string, value: string) => void;\n onAddressFocus?: (fieldId: string) => void;\n onAddressBlur?: (fieldId: string) => void;\n onApplySuggestion?: (fieldId: string, suggestion: AddressSuggestion) => void;\n}\n\nconst CustomFormFields = ({\n customFields,\n formData,\n errors,\n cellErrors = {},\n onFieldChange,\n addressSuggestions = [],\n showSuggestions = false,\n onAddressChange,\n onAddressFocus,\n onAddressBlur,\n onApplySuggestion,\n}: CustomFormFieldsProps) => {\n const { t, currentLanguage } = useI18n();\n\n console.log(\"🎨 [CustomFormFields] Rendering with:\", {\n fieldsCount: customFields.length,\n fields: customFields.map((f) => ({\n id: f.id,\n label: f.label,\n type: f.valueType,\n })),\n formData,\n errors,\n });\n\n const renderField = (field: CustomField) => {\n const hasError = Boolean(errors[field.id]);\n const value = formData[field.id];\n\n // Classes communes (EXACTEMENT comme IdentityFields/ContactFields)\n const inputClasses = clsx(\n \"w-full px-3 py-3 md:py-4 border rounded-lg text-base transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\",\n hasError\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\",\n );\n\n switch (field.valueType) {\n case \"text\":\n return (\n <input\n id={field.id}\n type=\"text\"\n value={value || \"\"}\n onChange={(e) => onFieldChange(field.id, e.target.value)}\n placeholder={field.placeholder}\n className={inputClasses}\n autoComplete=\"off\"\n />\n );\n\n case \"number\":\n return (\n <input\n id={field.id}\n type=\"number\"\n inputMode=\"numeric\"\n value={value || \"\"}\n onChange={(e) => onFieldChange(field.id, e.target.value)}\n placeholder={field.placeholder}\n className={inputClasses}\n />\n );\n\n case \"date\":\n return (\n <DatePickerField\n id={field.id}\n value={value || \"\"}\n dateFormat={field.dateFormat ?? \"dd/mm/yyyy\"}\n placeholder={field.placeholder}\n hasError={hasError}\n language={currentLanguage}\n onChange={(v) => onFieldChange(field.id, v)}\n className={inputClasses}\n />\n );\n\n case \"boolean\":\n return (\n <div className=\"flex items-center gap-2\">\n <input\n id={field.id}\n type=\"checkbox\"\n checked={value || false}\n onChange={(e) => onFieldChange(field.id, e.target.checked)}\n className=\"h-4 w-4 text-[#11E5C5] border-gray-300 rounded focus:ring-[#11E5C5]\"\n />\n {field.description && (\n <span className=\"text-sm text-gray-600\">{field.description}</span>\n )}\n </div>\n );\n\n case \"enum\":\n return (\n <Select\n options={(field.enumOptions || []).map((opt) => ({\n value: opt,\n label: opt,\n }))}\n value={value || \"\"}\n onValueChange={(val) => onFieldChange(field.id, val)}\n placeholder={field.placeholder || t(\"custom_form.select_option\")}\n error={hasError}\n />\n );\n\n case \"email\":\n return (\n <input\n id={field.id}\n type=\"email\"\n value={value || \"\"}\n onChange={(e) => onFieldChange(field.id, e.target.value)}\n placeholder={field.placeholder}\n className={inputClasses}\n autoComplete=\"off\"\n inputMode=\"email\"\n />\n );\n\n case \"address\":\n // For address, use the existing AddressFields component\n const addressValue = value || {};\n const addressForm = {\n lastName: \"\",\n firstName: \"\",\n birthDate: \"\",\n day: \"\",\n month: \"\",\n year: \"\",\n email: \"\",\n phoneNumber: \"\",\n sms: \"\",\n addressLine1: addressValue.addressLine1 || \"\",\n addressLine2: addressValue.addressLine2 || \"\",\n postalCode: addressValue.postalCode || \"\",\n city: addressValue.city || \"\",\n countryCode: addressValue.countryCode || \"\",\n nationality: \"\",\n companyName: \"\",\n siret: \"\",\n tva: \"\",\n };\n\n return (\n <AddressFields\n form={addressForm}\n errors={{\n addressLine1: hasError,\n addressLine2: false,\n postalCode: hasError,\n city: hasError,\n country: hasError,\n }}\n requestedFields={new Set([\"adresse\"])}\n onFieldChange={(key, val) => {\n const updatedAddress = {\n ...addressValue,\n [key]: val,\n };\n onFieldChange(field.id, updatedAddress);\n }}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={(val) => {\n const updatedAddress = {\n ...addressValue,\n addressLine1: val,\n };\n onFieldChange(field.id, updatedAddress);\n onAddressChange?.(field.id, val);\n }}\n onAddressFocus={() => onAddressFocus?.(field.id)}\n onAddressBlur={() => onAddressBlur?.(field.id)}\n onApplySuggestion={(suggestion) => {\n const updatedAddress = {\n addressLine1: suggestion.label || \"\",\n addressLine2: addressValue.addressLine2 || \"\",\n postalCode: suggestion.postalCode || \"\",\n city: suggestion.city || \"\",\n countryCode: suggestion.countryCode || \"\",\n };\n onFieldChange(field.id, updatedAddress);\n onApplySuggestion?.(field.id, suggestion);\n }}\n />\n );\n\n case \"list\": {\n const persistedRows: Record<string, string>[] = Array.isArray(value)\n ? value\n : [];\n const columns: ListColumn[] = normalizeListColumns(field.listColumns);\n const minRows = getListFieldMinRows(field);\n const rows = ensureMinimumListRows(persistedRows, columns, minRows);\n const gridTemplateColumns = `repeat(${columns.length}, minmax(180px, 1fr)) 32px`;\n const gridMinWidth = `${columns.length * 180 + (columns.length - 1) * 8 + 32}px`;\n const fieldCellErrors = cellErrors[field.id] ?? {};\n\n if (columns.length === 0) {\n return (\n <p className=\"text-sm text-red-600\">\n {t(\n \"custom_form.list_missing_columns\",\n \"Ce tableau n'a pas de colonnes configurées.\",\n )}\n </p>\n );\n }\n\n const handleRowChange = (\n rowIndex: number,\n colName: string,\n colValue: string,\n ) => {\n const updated = [...rows];\n updated[rowIndex] = { ...updated[rowIndex], [colName]: colValue };\n onFieldChange(field.id, updated);\n };\n\n const handleAddRow = () => {\n const emptyRow = createEmptyListRow(columns);\n onFieldChange(field.id, [...rows, emptyRow]);\n };\n\n const handleRemoveRow = (rowIndex: number) => {\n if (rows.length <= minRows) {\n return;\n }\n\n onFieldChange(\n field.id,\n rows.filter((_, i) => i !== rowIndex),\n );\n };\n\n const cellClasses = clsx(\n \"w-full px-2 py-2 border rounded-lg text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\",\n hasError\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\",\n );\n\n return (\n <div className=\"space-y-3 overflow-x-auto\">\n {columns.length > 0 && (\n <div\n className=\"grid gap-2 items-center w-full\"\n style={{\n gridTemplateColumns,\n minWidth: gridMinWidth,\n }}\n >\n {columns.map((col) => (\n <span\n key={col.label}\n className=\"text-xs font-semibold text-gray-600 uppercase tracking-wide truncate\"\n >\n {col.label}\n </span>\n ))}\n <span />\n </div>\n )}\n\n {rows.map((row, rowIndex) => (\n <div\n key={rowIndex}\n className=\"grid gap-2 items-start w-full\"\n style={{\n gridTemplateColumns,\n minWidth: gridMinWidth,\n }}\n >\n {columns.map((col) => {\n const cellErr =\n fieldCellErrors[cellErrorKey(rowIndex, col.label)];\n const cellHasError = Boolean(cellErr);\n const cellInputClasses = clsx(\n \"w-full px-2 py-2 border rounded-lg text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\",\n cellHasError\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\",\n );\n return (\n <div\n key={col.label}\n className=\"flex flex-col gap-1 min-w-0\"\n >\n <ListCell\n col={col}\n value={row[col.label] || \"\"}\n hasError={cellHasError || hasError}\n cellClasses={cellInputClasses}\n onChange={(val) =>\n handleRowChange(rowIndex, col.label, val)\n }\n language={currentLanguage}\n />\n {typeof cellErr === \"string\" && (\n <span className=\"text-xs text-red-600\">\n {cellErr}\n </span>\n )}\n </div>\n );\n })}\n <button\n type=\"button\"\n onClick={() => handleRemoveRow(rowIndex)}\n className={clsx(\n \"flex items-center justify-center w-8 h-8 rounded-full transition-colors\",\n rows.length <= minRows\n ? \"text-gray-300 cursor-not-allowed\"\n : \"text-gray-400 hover:text-red-500 hover:bg-red-50\",\n )}\n aria-label={t(\"custom_form.remove_row\", \"Supprimer la ligne\")}\n disabled={rows.length <= minRows}\n >\n ✕\n </button>\n </div>\n ))}\n\n <button\n type=\"button\"\n onClick={handleAddRow}\n className=\"flex items-center gap-2 text-sm text-[#11E5C5] hover:underline font-medium\"\n >\n + {t(\"custom_form.add_row\", \"Ajouter une ligne\")}\n </button>\n </div>\n );\n }\n\n default:\n return null;\n }\n };\n\n // Un champ est masqué quand il est verrouillé depuis l'API :\n // - hard lock (lockedFromApi sans editableIfMissing) → toujours masqué ;\n // - soft lock (editableIfMissing) → masqué uniquement si l'API a fourni une\n // valeur ; sinon le champ redevient éditable par l'utilisateur final.\n const isValuePresent = (value: unknown): boolean => {\n if (value === null || value === undefined) return false;\n if (typeof value === \"string\") return value.trim().length > 0;\n if (Array.isArray(value)) return value.length > 0;\n return true;\n };\n\n // La décision de visibilité d'un soft lock se fige à l'OUVERTURE du nœud,\n // pas à chaque frappe : on capture une seule fois (au mount, via ref) les\n // soft locks dont l'API n'avait fourni AUCUNE valeur. Ceux-là restent\n // éditables ensuite, même quand l'utilisateur commence à taper (sinon le\n // champ se masquerait dès le 1er caractère puisque formData deviendrait\n // non vide). Le composant est remonté par nœud (key={node.id}), donc le\n // snapshot est bien réinitialisé à chaque entrée de nœud.\n const editableSoftLocksRef = useRef<Set<string> | null>(null);\n if (editableSoftLocksRef.current === null) {\n const ids = new Set<string>();\n for (const f of customFields) {\n if (f.lockedFromApi && f.editableIfMissing && !isValuePresent(formData[f.id])) {\n ids.add(f.id);\n }\n }\n editableSoftLocksRef.current = ids;\n }\n const editableSoftLocks = editableSoftLocksRef.current;\n\n const isLockedHidden = (f: CustomField): boolean => {\n if (!f.lockedFromApi) return false;\n if (!f.editableIfMissing) return true;\n // soft lock : visible seulement s'il était vide à l'ouverture du nœud\n return !editableSoftLocks.has(f.id);\n };\n\n const visibleFields = customFields.filter((f) => !isLockedHidden(f));\n\n return (\n <Fragment>\n {visibleFields.map((field) => (\n <div key={field.id} className=\"space-y-2\">\n <Label.Root\n htmlFor={field.id}\n className=\"block text-sm md:text-base font-semibold text-gray-900\"\n >\n {field.label}\n {field.required && <span className=\"text-red-500 ml-1\">*</span>}\n </Label.Root>\n\n {field.description && field.valueType !== \"boolean\" && (\n <p className=\"text-xs text-gray-500 -mt-1\">{field.description}</p>\n )}\n\n {renderField(field)}\n\n {(() => {\n const fieldCellErrs = cellErrors[field.id];\n if (fieldCellErrs && Object.keys(fieldCellErrs).length > 0) {\n return null;\n }\n const fieldErr = errors[field.id];\n if (!fieldErr) return null;\n const message =\n typeof fieldErr === \"string\"\n ? fieldErr\n : field.required && !formData[field.id]\n ? t(\"custom_form.required_field\")\n : t(\"custom_form.invalid_value\");\n return (\n <p className=\"text-red-600 text-sm flex items-center gap-1\">\n <span className=\"text-red-500\">⚠</span>\n {message}\n </p>\n );\n })()}\n </div>\n ))}\n </Fragment>\n );\n};\n\nexport default CustomFormFields;\n"],"names":["_jsx","Select","DatePickerField","useI18n","_jsxs","AddressFields","normalizeListColumns","getListFieldMinRows","ensureMinimumListRows","__spreadArray","__assign","createEmptyListRow","cellErrorKey","useRef","Fragment","Label"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA;;;;AAIG;AACH,IAAM,QAAQ,GAAG,UAAC,EAcjB,EAAA;;AAbC,IAAA,IAAA,GAAG,GAAA,EAAA,CAAA,GAAA,EACH,KAAK,GAAA,EAAA,CAAA,KAAA,EACL,QAAQ,GAAA,EAAA,CAAA,QAAA,EACR,WAAW,iBAAA,EACX,QAAQ,GAAA,EAAA,CAAA,QAAA,EACR,QAAQ,GAAA,EAAA,CAAA,QAAA;AASR,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;AACvB,QAAA,QACEA,cAAA,CAACC,sBAAM,EAAA,EACL,OAAO,EAAE,CAAC,CAAA,EAAA,GAAA,GAAG,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE,EAAE,GAAG,CAAC,UAAC,GAAG,EAAA,EAAK,QAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAC,CAA5B,CAA4B,CAAC,EACvE,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,QAAQ,EACvB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,EACzC,KAAK,EAAE,QAAQ,EACf,OAAO,EAAA,IAAA,EAAA,CACP;IAEN;AACA,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE;QACxB,QACED,0BACE,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAxB,CAAwB,EACzC,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,EACzC,SAAS,EAAE,WAAW,EACtB,YAAY,EAAC,KAAK,EAClB,SAAS,EAAC,OAAO,EAAA,CACjB;IAEN;AACA,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;AACvB,QAAA,QACEA,cAAA,CAACE,+BAAe,IACd,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,CAAA,EAAA,GAAA,GAAG,CAAC,UAAU,mCAAI,YAAY,EAC1C,WAAW,EAAE,GAAG,CAAC,WAAW,EAC5B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,WAAW,EAAA,CACtB;IAEN;IACA,QACEF,0BACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAxB,CAAwB,EACzC,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,EACzC,SAAS,EAAE,WAAW,EACtB,YAAY,EAAC,KAAK,EAAA,CAClB;AAEN,CAAC;AAiBD,IAAM,gBAAgB,GAAG,UAAC,EAYF,EAAA;AAXtB,IAAA,IAAA,YAAY,kBAAA,EACZ,QAAQ,cAAA,EACR,MAAM,YAAA,EACN,EAAA,GAAA,EAAA,CAAA,UAAe,EAAf,UAAU,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,GAAA,EAAA,EACf,aAAa,GAAA,EAAA,CAAA,aAAA,EACb,0BAAuB,EAAvB,kBAAkB,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,KAAA,EACvB,EAAA,GAAA,EAAA,CAAA,eAAuB,EAAvB,eAAe,GAAA,EAAA,KAAA,MAAA,GAAG,KAAK,GAAA,EAAA,EACvB,eAAe,GAAA,EAAA,CAAA,eAAA,EACf,cAAc,GAAA,EAAA,CAAA,cAAA,EACd,aAAa,GAAA,EAAA,CAAA,aAAA,EACb,iBAAiB,GAAA,EAAA,CAAA,iBAAA;IAEX,IAAA,EAAA,GAAyBG,eAAO,EAAE,EAAhC,CAAC,GAAA,EAAA,CAAA,CAAA,EAAE,eAAe,GAAA,EAAA,CAAA,eAAc;AAExC,IAAA,OAAO,CAAC,GAAG,CAAC,uCAAuC,EAAE;QACnD,WAAW,EAAE,YAAY,CAAC,MAAM;QAChC,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,UAAC,CAAC,EAAA,EAAK,QAAC;YAC/B,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,SAAS;SAClB,EAAC,CAJ8B,CAI9B,CAAC;AACH,QAAA,QAAQ,EAAA,QAAA;AACR,QAAA,MAAM,EAAA,MAAA;AACP,KAAA,CAAC;IAEF,IAAM,WAAW,GAAG,UAAC,KAAkB,EAAA;;QACrC,IAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;;AAGhC,QAAA,IAAM,YAAY,GAAG,IAAI,CACvB,sJAAsJ,EACtJ;AACE,cAAE;cACA,uCAAuC,CAC5C;AAED,QAAA,QAAQ,KAAK,CAAC,SAAS;AACrB,YAAA,KAAK,MAAM;gBACT,QACEH,cAAA,CAAA,OAAA,EAAA,EACE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAvC,CAAuC,EACxD,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,SAAS,EAAE,YAAY,EACvB,YAAY,EAAC,KAAK,EAAA,CAClB;AAGN,YAAA,KAAK,QAAQ;gBACX,QACEA,cAAA,CAAA,OAAA,EAAA,EACE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,SAAS,EACnB,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAvC,CAAuC,EACxD,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,SAAS,EAAE,YAAY,EAAA,CACvB;AAGN,YAAA,KAAK,MAAM;AACT,gBAAA,QACEA,cAAA,CAACE,+BAAe,EAAA,EACd,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,UAAU,EAAE,CAAA,EAAA,GAAA,KAAK,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,YAAY,EAC5C,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA,CAA1B,CAA0B,EAC3C,SAAS,EAAE,YAAY,EAAA,CACvB;AAGN,YAAA,KAAK,SAAS;AACZ,gBAAA,QACEE,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,EAAA,QAAA,EAAA,CACtCJ,cAAA,CAAA,OAAA,EAAA,EACE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,KAAK,IAAI,KAAK,EACvB,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA,CAAzC,CAAyC,EAC1D,SAAS,EAAC,qEAAqE,GAC/E,EACD,KAAK,CAAC,WAAW,KAChBA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAE,KAAK,CAAC,WAAW,EAAA,CAAQ,CACnE,CAAA,EAAA,CACG;AAGV,YAAA,KAAK,MAAM;gBACT,QACEA,eAACC,sBAAM,EAAA,EACL,OAAO,EAAE,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,EAAE,GAAG,CAAC,UAAC,GAAG,EAAA,EAAK,QAAC;AAC/C,wBAAA,KAAK,EAAE,GAAG;AACV,wBAAA,KAAK,EAAE,GAAG;AACX,qBAAA,GAH+C,CAG9C,CAAC,EACH,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,aAAa,EAAE,UAAC,GAAG,EAAA,EAAK,OAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EAA5B,CAA4B,EACpD,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,2BAA2B,CAAC,EAChE,KAAK,EAAE,QAAQ,EAAA,CACf;AAGN,YAAA,KAAK,OAAO;gBACV,QACED,cAAA,CAAA,OAAA,EAAA,EACE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAvC,CAAuC,EACxD,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,SAAS,EAAE,YAAY,EACvB,YAAY,EAAC,KAAK,EAClB,SAAS,EAAC,OAAO,EAAA,CACjB;AAGN,YAAA,KAAK,SAAS;;AAEZ,gBAAA,IAAM,cAAY,GAAG,KAAK,IAAI,EAAE;AAChC,gBAAA,IAAM,WAAW,GAAG;AAClB,oBAAA,QAAQ,EAAE,EAAE;AACZ,oBAAA,SAAS,EAAE,EAAE;AACb,oBAAA,SAAS,EAAE,EAAE;AACb,oBAAA,GAAG,EAAE,EAAE;AACP,oBAAA,KAAK,EAAE,EAAE;AACT,oBAAA,IAAI,EAAE,EAAE;AACR,oBAAA,KAAK,EAAE,EAAE;AACT,oBAAA,WAAW,EAAE,EAAE;AACf,oBAAA,GAAG,EAAE,EAAE;AACP,oBAAA,YAAY,EAAE,cAAY,CAAC,YAAY,IAAI,EAAE;AAC7C,oBAAA,YAAY,EAAE,cAAY,CAAC,YAAY,IAAI,EAAE;AAC7C,oBAAA,UAAU,EAAE,cAAY,CAAC,UAAU,IAAI,EAAE;AACzC,oBAAA,IAAI,EAAE,cAAY,CAAC,IAAI,IAAI,EAAE;AAC7B,oBAAA,WAAW,EAAE,cAAY,CAAC,WAAW,IAAI,EAAE;AAC3C,oBAAA,WAAW,EAAE,EAAE;AACf,oBAAA,WAAW,EAAE,EAAE;AACf,oBAAA,KAAK,EAAE,EAAE;AACT,oBAAA,GAAG,EAAE,EAAE;iBACR;gBAED,QACEA,eAACK,qBAAa,EAAA,EACZ,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE;AACN,wBAAA,YAAY,EAAE,QAAQ;AACtB,wBAAA,YAAY,EAAE,KAAK;AACnB,wBAAA,UAAU,EAAE,QAAQ;AACpB,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,OAAO,EAAE,QAAQ;AAClB,qBAAA,EACD,eAAe,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EACrC,aAAa,EAAE,UAAC,GAAG,EAAE,GAAG,EAAA;;wBACtB,IAAM,cAAc,6CACf,cAAY,CAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,CACd,GAAG,CAAA,GAAG,GAAG,MACX;AACD,wBAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC;AACzC,oBAAA,CAAC,EACD,kBAAkB,EAAE,kBAAkB,EACtC,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,UAAC,GAAG,EAAA;wBACnB,IAAM,cAAc,6CACf,cAAY,CAAA,EAAA,EACf,YAAY,EAAE,GAAG,GAClB;AACD,wBAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC;wBACvC,eAAe,KAAA,IAAA,IAAf,eAAe,KAAA,MAAA,GAAA,MAAA,GAAf,eAAe,CAAG,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC;AAClC,oBAAA,CAAC,EACD,cAAc,EAAE,YAAA,EAAM,OAAA,cAAc,KAAA,IAAA,IAAd,cAAc,KAAA,MAAA,GAAA,MAAA,GAAd,cAAc,CAAG,KAAK,CAAC,EAAE,CAAC,CAAA,CAA1B,CAA0B,EAChD,aAAa,EAAE,YAAA,EAAM,OAAA,aAAa,KAAA,IAAA,IAAb,aAAa,KAAA,MAAA,GAAA,MAAA,GAAb,aAAa,CAAG,KAAK,CAAC,EAAE,CAAC,CAAA,CAAzB,CAAyB,EAC9C,iBAAiB,EAAE,UAAC,UAAU,EAAA;AAC5B,wBAAA,IAAM,cAAc,GAAG;AACrB,4BAAA,YAAY,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;AACpC,4BAAA,YAAY,EAAE,cAAY,CAAC,YAAY,IAAI,EAAE;AAC7C,4BAAA,UAAU,EAAE,UAAU,CAAC,UAAU,IAAI,EAAE;AACvC,4BAAA,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,EAAE;AAC3B,4BAAA,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE;yBAC1C;AACD,wBAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC;wBACvC,iBAAiB,KAAA,IAAA,IAAjB,iBAAiB,KAAA,MAAA,GAAA,MAAA,GAAjB,iBAAiB,CAAG,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC;oBAC3C,CAAC,EAAA,CACD;YAGN,KAAK,MAAM,EAAE;AACX,gBAAA,IAAM,aAAa,GAA6B,KAAK,CAAC,OAAO,CAAC,KAAK;AACjE,sBAAE;sBACA,EAAE;gBACN,IAAM,SAAO,GAAiBC,mCAAoB,CAAC,KAAK,CAAC,WAAW,CAAC;AACrE,gBAAA,IAAM,SAAO,GAAGC,kCAAmB,CAAC,KAAK,CAAC;gBAC1C,IAAM,MAAI,GAAGC,oCAAqB,CAAC,aAAa,EAAE,SAAO,EAAE,SAAO,CAAC;AACnE,gBAAA,IAAM,qBAAmB,GAAG,SAAA,CAAA,MAAA,CAAU,SAAO,CAAC,MAAM,+BAA4B;gBAChF,IAAM,cAAY,GAAG,EAAA,CAAA,MAAA,CAAG,SAAO,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,SAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAA,IAAA,CAAI;gBAChF,IAAM,iBAAe,GAAG,CAAA,EAAA,GAAA,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE;AAElD,gBAAA,IAAI,SAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,oBAAA,QACER,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,sBAAsB,EAAA,QAAA,EAChC,CAAC,CACA,kCAAkC,EAClC,6CAA6C,CAC9C,EAAA,CACC;gBAER;AAEA,gBAAA,IAAM,iBAAe,GAAG,UACtB,QAAgB,EAChB,OAAe,EACf,QAAgB,EAAA;;AAEhB,oBAAA,IAAM,OAAO,GAAAS,uBAAA,CAAA,EAAA,EAAO,MAAI,EAAA,IAAA,CAAC;AACzB,oBAAA,OAAO,CAAC,QAAQ,CAAC,GAAAC,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EAAQ,OAAO,CAAC,QAAQ,CAAC,CAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,CAAG,OAAO,CAAA,GAAG,QAAQ,MAAE;AACjE,oBAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC;AAClC,gBAAA,CAAC;AAED,gBAAA,IAAM,YAAY,GAAG,YAAA;AACnB,oBAAA,IAAM,QAAQ,GAAGC,iCAAkB,CAAC,SAAO,CAAC;oBAC5C,aAAa,CAAC,KAAK,CAAC,EAAE,sDAAM,MAAI,EAAA,IAAA,CAAA,EAAA,CAAE,QAAQ,CAAA,EAAA,KAAA,CAAA,CAAE;AAC9C,gBAAA,CAAC;gBAED,IAAM,iBAAe,GAAG,UAAC,QAAgB,EAAA;AACvC,oBAAA,IAAI,MAAI,CAAC,MAAM,IAAI,SAAO,EAAE;wBAC1B;oBACF;oBAEA,aAAa,CACX,KAAK,CAAC,EAAE,EACR,MAAI,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,EAAA,EAAK,OAAA,CAAC,KAAK,QAAQ,CAAA,CAAd,CAAc,CAAC,CACtC;AACH,gBAAA,CAAC;AAED,gBAAoB,IAAI,CACtB,4IAA4I,EAC5I;AACE,sBAAE;sBACA,uCAAuC;AAG7C,gBAAA,QACEP,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2BAA2B,EAAA,QAAA,EAAA,CACvC,SAAO,CAAC,MAAM,GAAG,CAAC,KACjBA,eAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,gCAAgC,EAC1C,KAAK,EAAE;AACL,gCAAA,mBAAmB,EAAA,qBAAA;AACnB,gCAAA,QAAQ,EAAE,cAAY;6BACvB,EAAA,QAAA,EAAA,CAEA,SAAO,CAAC,GAAG,CAAC,UAAC,GAAG,EAAA,EAAK,QACpBJ,cAAA,CAAA,MAAA,EAAA,EAEE,SAAS,EAAC,sEAAsE,EAAA,QAAA,EAE/E,GAAG,CAAC,KAAK,IAHL,GAAG,CAAC,KAAK,CAIT,EACR,CAPqB,CAOrB,CAAC,EACFA,0BAAQ,CAAA,EAAA,CACJ,CACP,EAEA,MAAI,CAAC,GAAG,CAAC,UAAC,GAAG,EAAE,QAAQ,EAAA,EAAK,QAC3BI,eAAA,CAAA,KAAA,EAAA,EAEE,SAAS,EAAC,+BAA+B,EACzC,KAAK,EAAE;AACL,gCAAA,mBAAmB,EAAA,qBAAA;AACnB,gCAAA,QAAQ,EAAE,cAAY;AACvB,6BAAA,EAAA,QAAA,EAAA,CAEA,SAAO,CAAC,GAAG,CAAC,UAAC,GAAG,EAAA;AACf,oCAAA,IAAM,OAAO,GACX,iBAAe,CAACQ,kCAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AACpD,oCAAA,IAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;AACrC,oCAAA,IAAM,gBAAgB,GAAG,IAAI,CAC3B,4IAA4I,EAC5I;AACE,0CAAE;0CACA,uCAAuC,CAC5C;AACD,oCAAA,QACER,eAAA,CAAA,KAAA,EAAA,EAEE,SAAS,EAAC,6BAA6B,aAEvCJ,cAAA,CAAC,QAAQ,EAAA,EACP,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAC3B,QAAQ,EAAE,YAAY,IAAI,QAAQ,EAClC,WAAW,EAAE,gBAAgB,EAC7B,QAAQ,EAAE,UAAC,GAAG,EAAA;oDACZ,OAAA,iBAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;gDAAzC,CAAyC,EAE3C,QAAQ,EAAE,eAAe,EAAA,CACzB,EACD,OAAO,OAAO,KAAK,QAAQ,KAC1BA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,sBAAsB,EAAA,QAAA,EACnC,OAAO,EAAA,CACH,CACR,CAAA,EAAA,EAjBI,GAAG,CAAC,KAAK,CAkBV;AAEV,gCAAA,CAAC,CAAC,EACFA,cAAA,CAAA,QAAA,EAAA,EACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAA,EAAM,OAAA,iBAAe,CAAC,QAAQ,CAAC,CAAA,CAAzB,CAAyB,EACxC,SAAS,EAAE,IAAI,CACb,yEAAyE,EACzE,MAAI,CAAC,MAAM,IAAI;AACb,0CAAE;0CACA,kDAAkD,CACvD,EAAA,YAAA,EACW,CAAC,CAAC,wBAAwB,EAAE,oBAAoB,CAAC,EAC7D,QAAQ,EAAE,MAAI,CAAC,MAAM,IAAI,SAAO,EAAA,QAAA,EAAA,QAAA,EAAA,CAGzB,CAAA,EAAA,EArDJ,QAAQ,CAsDT,EACP,CAzD4B,CAyD5B,CAAC,EAEFI,4BACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,SAAS,EAAC,4EAA4E,EAAA,QAAA,EAAA,CAAA,IAAA,EAEnF,CAAC,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,CAAA,EAAA,CACzC,CAAA,EAAA,CACL;YAEV;AAEA,YAAA;AACE,gBAAA,OAAO,IAAI;;AAEjB,IAAA,CAAC;;;;;IAMD,IAAM,cAAc,GAAG,UAAC,KAAc,EAAA;AACpC,QAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;AAAE,YAAA,OAAO,KAAK;QACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;AAC7D,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC;AACjD,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;;;;;;;;AASD,IAAA,IAAM,oBAAoB,GAAGS,YAAM,CAAqB,IAAI,CAAC;AAC7D,IAAA,IAAI,oBAAoB,CAAC,OAAO,KAAK,IAAI,EAAE;AACzC,QAAA,IAAM,GAAG,GAAG,IAAI,GAAG,EAAU;QAC7B,KAAgB,IAAA,EAAA,GAAA,CAAY,EAAZ,cAAA,GAAA,YAAY,EAAZ,0BAAY,EAAZ,EAAA,EAAY,EAAE;AAAzB,YAAA,IAAM,CAAC,GAAA,cAAA,CAAA,EAAA,CAAA;AACV,YAAA,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,iBAAiB,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;AAC7E,gBAAA,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACf;QACF;AACA,QAAA,oBAAoB,CAAC,OAAO,GAAG,GAAG;IACpC;AACA,IAAA,IAAM,iBAAiB,GAAG,oBAAoB,CAAC,OAAO;IAEtD,IAAM,cAAc,GAAG,UAAC,CAAc,EAAA;QACpC,IAAI,CAAC,CAAC,CAAC,aAAa;AAAE,YAAA,OAAO,KAAK;QAClC,IAAI,CAAC,CAAC,CAAC,iBAAiB;AAAE,YAAA,OAAO,IAAI;;QAErC,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,IAAA,CAAC;AAED,IAAA,IAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,UAAC,CAAC,EAAA,EAAK,OAAA,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA,CAAlB,CAAkB,CAAC;AAEpE,IAAA,QACEb,cAAA,CAACc,cAAQ,EAAA,EAAA,QAAA,EACN,aAAa,CAAC,GAAG,CAAC,UAAC,KAAK,EAAA,EAAK,QAC5BV,eAAA,CAAA,KAAA,EAAA,EAAoB,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACvCA,eAAA,CAACW,gBAAK,CAAC,IAAI,EAAA,EACT,OAAO,EAAE,KAAK,CAAC,EAAE,EACjB,SAAS,EAAC,wDAAwD,EAAA,QAAA,EAAA,CAEjE,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,QAAQ,IAAIf,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,mBAAmB,EAAA,QAAA,EAAA,GAAA,EAAA,CAAS,CAAA,EAAA,CACpD,EAEZ,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,KACjDA,sBAAG,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAE,KAAK,CAAC,WAAW,EAAA,CAAK,CACnE,EAEA,WAAW,CAAC,KAAK,CAAC,EAElB,CAAC,YAAA;oBACA,IAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1C,oBAAA,IAAI,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1D,wBAAA,OAAO,IAAI;oBACb;oBACA,IAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACjC,oBAAA,IAAI,CAAC,QAAQ;AAAE,wBAAA,OAAO,IAAI;AAC1B,oBAAA,IAAM,OAAO,GACX,OAAO,QAAQ,KAAK;AAClB,0BAAE;0BACA,KAAK,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACpC,8BAAE,CAAC,CAAC,4BAA4B;AAChC,8BAAE,CAAC,CAAC,2BAA2B,CAAC;AACtC,oBAAA,QACEI,eAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,8CAA8C,EAAA,QAAA,EAAA,CACzDJ,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,cAAc,EAAA,QAAA,EAAA,QAAA,EAAA,CAAS,EACtC,OAAO,CAAA,EAAA,CACN;AAER,gBAAA,CAAC,GAAG,CAAA,EAAA,EAlCI,KAAK,CAAC,EAAE,CAmCZ,EACP,CArC6B,CAqC7B,CAAC,EAAA,CACO;AAEf;;;;"}
|
|
1
|
+
{"version":3,"file":"CustomFormFields.js","sources":["../../../../../../src/components/session/UserInputForm/CustomFormFields.tsx"],"sourcesContent":["import { Fragment, useRef } from \"react\";\nimport * as Label from \"@radix-ui/react-label\";\nimport clsx from \"clsx\";\nimport { Select } from \"../../ui/SelectComponent\";\nimport type { CustomField, ListColumn } from \"../../../types/session\";\nimport { useI18n } from \"../../../hooks/useI18n\";\nimport AddressFields from \"./AddressFields\";\nimport type { AddressSuggestion } from \"../../../types/userInputForm\";\nimport {\n createEmptyListRow,\n ensureMinimumListRows,\n getListFieldMinRows,\n normalizeListColumns,\n} from \"../../../utils/listFieldUtils\";\nimport { cellErrorKey } from \"../../../utils/customFieldValidation\";\nimport { DatePickerField } from \"./DatePickerField\";\n\ntype CellErrorValue = string | boolean;\n\n/**\n * Sous-composant dédié au rendu d'une cellule du tableau dynamique.\n * Nécessaire pour que les hooks internes à Select soient toujours appelés\n * de façon stable (règle des hooks React).\n */\nconst ListCell = ({\n col,\n value,\n hasError,\n cellClasses,\n onChange,\n language,\n}: {\n col: ListColumn;\n value: string;\n hasError: boolean;\n cellClasses: string;\n onChange: (val: string) => void;\n language: string;\n}) => {\n if (col.type === \"enum\") {\n return (\n <Select\n options={(col.options ?? []).map((opt) => ({ value: opt, label: opt }))}\n value={value}\n onValueChange={onChange}\n placeholder={col.placeholder || col.label}\n error={hasError}\n compact\n />\n );\n }\n if (col.type === \"email\") {\n return (\n <input\n type=\"email\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={col.placeholder || col.label}\n className={cellClasses}\n autoComplete=\"off\"\n inputMode=\"email\"\n />\n );\n }\n if (col.type === \"date\") {\n return (\n <DatePickerField\n value={value}\n dateFormat={col.dateFormat ?? \"dd/mm/yyyy\"}\n placeholder={col.placeholder}\n hasError={hasError}\n language={language}\n onChange={onChange}\n className={cellClasses}\n />\n );\n }\n return (\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={col.placeholder || col.label}\n className={cellClasses}\n autoComplete=\"off\"\n />\n );\n};\n\ninterface CustomFormFieldsProps {\n customFields: CustomField[];\n formData: Record<string, any>;\n errors: Record<string, CellErrorValue>;\n cellErrors?: Record<string, Record<string, CellErrorValue>>;\n onFieldChange: (fieldId: string, value: any) => void;\n // Address autocomplete props (for address field type)\n addressSuggestions?: AddressSuggestion[];\n showSuggestions?: boolean;\n onAddressChange?: (fieldId: string, value: string) => void;\n onAddressFocus?: (fieldId: string) => void;\n onAddressBlur?: (fieldId: string) => void;\n onApplySuggestion?: (fieldId: string, suggestion: AddressSuggestion) => void;\n}\n\nconst CustomFormFields = ({\n customFields,\n formData,\n errors,\n cellErrors = {},\n onFieldChange,\n addressSuggestions = [],\n showSuggestions = false,\n onAddressChange,\n onAddressFocus,\n onAddressBlur,\n onApplySuggestion,\n}: CustomFormFieldsProps) => {\n const { t, currentLanguage } = useI18n();\n\n const renderField = (field: CustomField) => {\n const hasError = Boolean(errors[field.id]);\n const value = formData[field.id];\n\n // Classes communes (EXACTEMENT comme IdentityFields/ContactFields)\n const inputClasses = clsx(\n \"w-full px-3 py-3 md:py-4 border rounded-lg text-base transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\",\n hasError\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\",\n );\n\n switch (field.valueType) {\n case \"text\":\n return (\n <input\n id={field.id}\n type=\"text\"\n value={value || \"\"}\n onChange={(e) => onFieldChange(field.id, e.target.value)}\n placeholder={field.placeholder}\n className={inputClasses}\n autoComplete=\"off\"\n />\n );\n\n case \"number\":\n return (\n <input\n id={field.id}\n type=\"number\"\n inputMode=\"numeric\"\n value={value || \"\"}\n onChange={(e) => onFieldChange(field.id, e.target.value)}\n placeholder={field.placeholder}\n className={inputClasses}\n />\n );\n\n case \"date\":\n return (\n <DatePickerField\n id={field.id}\n value={value || \"\"}\n dateFormat={field.dateFormat ?? \"dd/mm/yyyy\"}\n placeholder={field.placeholder}\n hasError={hasError}\n language={currentLanguage}\n onChange={(v) => onFieldChange(field.id, v)}\n className={inputClasses}\n />\n );\n\n case \"boolean\":\n return (\n <div className=\"flex items-center gap-2\">\n <input\n id={field.id}\n type=\"checkbox\"\n checked={value || false}\n onChange={(e) => onFieldChange(field.id, e.target.checked)}\n className=\"h-4 w-4 text-[#11E5C5] border-gray-300 rounded focus:ring-[#11E5C5]\"\n />\n {field.description && (\n <span className=\"text-sm text-gray-600\">{field.description}</span>\n )}\n </div>\n );\n\n case \"enum\":\n return (\n <Select\n options={(field.enumOptions || []).map((opt) => ({\n value: opt,\n label: opt,\n }))}\n value={value || \"\"}\n onValueChange={(val) => onFieldChange(field.id, val)}\n placeholder={field.placeholder || t(\"custom_form.select_option\")}\n error={hasError}\n />\n );\n\n case \"email\":\n return (\n <input\n id={field.id}\n type=\"email\"\n value={value || \"\"}\n onChange={(e) => onFieldChange(field.id, e.target.value)}\n placeholder={field.placeholder}\n className={inputClasses}\n autoComplete=\"off\"\n inputMode=\"email\"\n />\n );\n\n case \"address\":\n // For address, use the existing AddressFields component\n const addressValue = value || {};\n const addressForm = {\n lastName: \"\",\n firstName: \"\",\n birthDate: \"\",\n day: \"\",\n month: \"\",\n year: \"\",\n email: \"\",\n phoneNumber: \"\",\n sms: \"\",\n addressLine1: addressValue.addressLine1 || \"\",\n addressLine2: addressValue.addressLine2 || \"\",\n postalCode: addressValue.postalCode || \"\",\n city: addressValue.city || \"\",\n countryCode: addressValue.countryCode || \"\",\n nationality: \"\",\n companyName: \"\",\n siret: \"\",\n tva: \"\",\n };\n\n return (\n <AddressFields\n form={addressForm}\n errors={{\n addressLine1: hasError,\n addressLine2: false,\n postalCode: hasError,\n city: hasError,\n country: hasError,\n }}\n requestedFields={new Set([\"adresse\"])}\n onFieldChange={(key, val) => {\n const updatedAddress = {\n ...addressValue,\n [key]: val,\n };\n onFieldChange(field.id, updatedAddress);\n }}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={(val) => {\n const updatedAddress = {\n ...addressValue,\n addressLine1: val,\n };\n onFieldChange(field.id, updatedAddress);\n onAddressChange?.(field.id, val);\n }}\n onAddressFocus={() => onAddressFocus?.(field.id)}\n onAddressBlur={() => onAddressBlur?.(field.id)}\n onApplySuggestion={(suggestion) => {\n const updatedAddress = {\n addressLine1: suggestion.label || \"\",\n addressLine2: addressValue.addressLine2 || \"\",\n postalCode: suggestion.postalCode || \"\",\n city: suggestion.city || \"\",\n countryCode: suggestion.countryCode || \"\",\n };\n onFieldChange(field.id, updatedAddress);\n onApplySuggestion?.(field.id, suggestion);\n }}\n />\n );\n\n case \"list\": {\n const persistedRows: Record<string, string>[] = Array.isArray(value)\n ? value\n : [];\n const columns: ListColumn[] = normalizeListColumns(field.listColumns);\n const minRows = getListFieldMinRows(field);\n const rows = ensureMinimumListRows(persistedRows, columns, minRows);\n const gridTemplateColumns = `repeat(${columns.length}, minmax(180px, 1fr)) 32px`;\n const gridMinWidth = `${columns.length * 180 + (columns.length - 1) * 8 + 32}px`;\n const fieldCellErrors = cellErrors[field.id] ?? {};\n\n if (columns.length === 0) {\n return (\n <p className=\"text-sm text-red-600\">\n {t(\n \"custom_form.list_missing_columns\",\n \"Ce tableau n'a pas de colonnes configurées.\",\n )}\n </p>\n );\n }\n\n const handleRowChange = (\n rowIndex: number,\n colName: string,\n colValue: string,\n ) => {\n const updated = [...rows];\n updated[rowIndex] = { ...updated[rowIndex], [colName]: colValue };\n onFieldChange(field.id, updated);\n };\n\n const handleAddRow = () => {\n const emptyRow = createEmptyListRow(columns);\n onFieldChange(field.id, [...rows, emptyRow]);\n };\n\n const handleRemoveRow = (rowIndex: number) => {\n if (rows.length <= minRows) {\n return;\n }\n\n onFieldChange(\n field.id,\n rows.filter((_, i) => i !== rowIndex),\n );\n };\n\n return (\n <div className=\"space-y-3 overflow-x-auto\">\n {columns.length > 0 && (\n <div\n className=\"grid gap-2 items-center w-full\"\n style={{\n gridTemplateColumns,\n minWidth: gridMinWidth,\n }}\n >\n {columns.map((col) => (\n <span\n key={col.label}\n className=\"text-xs font-semibold text-gray-600 uppercase tracking-wide truncate\"\n >\n {col.label}\n </span>\n ))}\n <span />\n </div>\n )}\n\n {rows.map((row, rowIndex) => (\n <div\n key={rowIndex}\n className=\"grid gap-2 items-start w-full\"\n style={{\n gridTemplateColumns,\n minWidth: gridMinWidth,\n }}\n >\n {columns.map((col) => {\n const cellErr =\n fieldCellErrors[cellErrorKey(rowIndex, col.label)];\n const cellHasError = Boolean(cellErr);\n const cellInputClasses = clsx(\n \"w-full px-2 py-2 border rounded-lg text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\",\n cellHasError\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\",\n );\n return (\n <div\n key={col.label}\n className=\"flex flex-col gap-1 min-w-0\"\n >\n <ListCell\n col={col}\n value={row[col.label] || \"\"}\n // Volontairement `cellHasError` seul : l'ancien\n // `|| hasError` peignait tout le tableau en rouge dès\n // qu'une seule cellule était invalide, sans permettre\n // de repérer laquelle. Le cas « pas assez de lignes »\n // reste signalé par le message sous le champ.\n hasError={cellHasError}\n cellClasses={cellInputClasses}\n onChange={(val) =>\n handleRowChange(rowIndex, col.label, val)\n }\n language={currentLanguage}\n />\n {typeof cellErr === \"string\" && (\n <span className=\"text-xs text-red-600\">\n {cellErr}\n </span>\n )}\n </div>\n );\n })}\n <button\n type=\"button\"\n onClick={() => handleRemoveRow(rowIndex)}\n className={clsx(\n \"flex items-center justify-center w-8 h-8 rounded-full transition-colors\",\n rows.length <= minRows\n ? \"text-gray-300 cursor-not-allowed\"\n : \"text-gray-400 hover:text-red-500 hover:bg-red-50\",\n )}\n aria-label={t(\"custom_form.remove_row\", \"Supprimer la ligne\")}\n disabled={rows.length <= minRows}\n >\n ✕\n </button>\n </div>\n ))}\n\n <button\n type=\"button\"\n onClick={handleAddRow}\n className=\"flex items-center gap-2 text-sm text-[#11E5C5] hover:underline font-medium\"\n >\n + {t(\"custom_form.add_row\", \"Ajouter une ligne\")}\n </button>\n </div>\n );\n }\n\n default:\n return null;\n }\n };\n\n // Un champ est masqué quand il est verrouillé depuis l'API :\n // - hard lock (lockedFromApi sans editableIfMissing) → toujours masqué ;\n // - soft lock (editableIfMissing) → masqué uniquement si l'API a fourni une\n // valeur ; sinon le champ redevient éditable par l'utilisateur final.\n const isValuePresent = (value: unknown): boolean => {\n if (value === null || value === undefined) return false;\n if (typeof value === \"string\") return value.trim().length > 0;\n if (Array.isArray(value)) return value.length > 0;\n return true;\n };\n\n // La décision de visibilité d'un soft lock se fige à l'OUVERTURE du nœud,\n // pas à chaque frappe : on capture une seule fois (au mount, via ref) les\n // soft locks dont l'API n'avait fourni AUCUNE valeur. Ceux-là restent\n // éditables ensuite, même quand l'utilisateur commence à taper (sinon le\n // champ se masquerait dès le 1er caractère puisque formData deviendrait\n // non vide). Le composant est remonté par nœud (key={node.id}), donc le\n // snapshot est bien réinitialisé à chaque entrée de nœud.\n const editableSoftLocksRef = useRef<Set<string> | null>(null);\n if (editableSoftLocksRef.current === null) {\n const ids = new Set<string>();\n for (const f of customFields) {\n if (f.lockedFromApi && f.editableIfMissing && !isValuePresent(formData[f.id])) {\n ids.add(f.id);\n }\n }\n editableSoftLocksRef.current = ids;\n }\n const editableSoftLocks = editableSoftLocksRef.current;\n\n const isLockedHidden = (f: CustomField): boolean => {\n if (!f.lockedFromApi) return false;\n if (!f.editableIfMissing) return true;\n // soft lock : visible seulement s'il était vide à l'ouverture du nœud\n return !editableSoftLocks.has(f.id);\n };\n\n const visibleFields = customFields.filter((f) => !isLockedHidden(f));\n\n return (\n <Fragment>\n {visibleFields.map((field) => (\n <div key={field.id} className=\"space-y-2\">\n <Label.Root\n htmlFor={field.id}\n className=\"block text-sm md:text-base font-semibold text-gray-900\"\n >\n {field.label}\n {field.required && <span className=\"text-red-500 ml-1\">*</span>}\n </Label.Root>\n\n {field.description && field.valueType !== \"boolean\" && (\n <p className=\"text-xs text-gray-500 -mt-1\">{field.description}</p>\n )}\n\n {renderField(field)}\n\n {(() => {\n const fieldCellErrs = cellErrors[field.id];\n if (fieldCellErrs && Object.keys(fieldCellErrs).length > 0) {\n return null;\n }\n const fieldErr = errors[field.id];\n if (!fieldErr) return null;\n const message =\n typeof fieldErr === \"string\"\n ? fieldErr\n : field.required && !formData[field.id]\n ? t(\"custom_form.required_field\")\n : t(\"custom_form.invalid_value\");\n return (\n <p className=\"text-red-600 text-sm flex items-center gap-1\">\n <span className=\"text-red-500\">⚠</span>\n {message}\n </p>\n );\n })()}\n </div>\n ))}\n </Fragment>\n );\n};\n\nexport default CustomFormFields;\n"],"names":["_jsx","Select","DatePickerField","useI18n","_jsxs","AddressFields","normalizeListColumns","getListFieldMinRows","ensureMinimumListRows","__spreadArray","__assign","createEmptyListRow","cellErrorKey","useRef","Fragment","Label"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA;;;;AAIG;AACH,IAAM,QAAQ,GAAG,UAAC,EAcjB,EAAA;;AAbC,IAAA,IAAA,GAAG,GAAA,EAAA,CAAA,GAAA,EACH,KAAK,GAAA,EAAA,CAAA,KAAA,EACL,QAAQ,GAAA,EAAA,CAAA,QAAA,EACR,WAAW,iBAAA,EACX,QAAQ,GAAA,EAAA,CAAA,QAAA,EACR,QAAQ,GAAA,EAAA,CAAA,QAAA;AASR,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;AACvB,QAAA,QACEA,cAAA,CAACC,sBAAM,EAAA,EACL,OAAO,EAAE,CAAC,CAAA,EAAA,GAAA,GAAG,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE,EAAE,GAAG,CAAC,UAAC,GAAG,EAAA,EAAK,QAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAC,CAA5B,CAA4B,CAAC,EACvE,KAAK,EAAE,KAAK,EACZ,aAAa,EAAE,QAAQ,EACvB,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,EACzC,KAAK,EAAE,QAAQ,EACf,OAAO,EAAA,IAAA,EAAA,CACP;IAEN;AACA,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE;QACxB,QACED,0BACE,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAxB,CAAwB,EACzC,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,EACzC,SAAS,EAAE,WAAW,EACtB,YAAY,EAAC,KAAK,EAClB,SAAS,EAAC,OAAO,EAAA,CACjB;IAEN;AACA,IAAA,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE;AACvB,QAAA,QACEA,cAAA,CAACE,+BAAe,IACd,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,CAAA,EAAA,GAAA,GAAG,CAAC,UAAU,mCAAI,YAAY,EAC1C,WAAW,EAAE,GAAG,CAAC,WAAW,EAC5B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,WAAW,EAAA,CACtB;IAEN;IACA,QACEF,0BACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAxB,CAAwB,EACzC,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC,KAAK,EACzC,SAAS,EAAE,WAAW,EACtB,YAAY,EAAC,KAAK,EAAA,CAClB;AAEN,CAAC;AAiBD,IAAM,gBAAgB,GAAG,UAAC,EAYF,EAAA;AAXtB,IAAA,IAAA,YAAY,kBAAA,EACZ,QAAQ,cAAA,EACR,MAAM,YAAA,EACN,EAAA,GAAA,EAAA,CAAA,UAAe,EAAf,UAAU,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,GAAA,EAAA,EACf,aAAa,GAAA,EAAA,CAAA,aAAA,EACb,0BAAuB,EAAvB,kBAAkB,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,KAAA,EACvB,EAAA,GAAA,EAAA,CAAA,eAAuB,EAAvB,eAAe,GAAA,EAAA,KAAA,MAAA,GAAG,KAAK,GAAA,EAAA,EACvB,eAAe,GAAA,EAAA,CAAA,eAAA,EACf,cAAc,GAAA,EAAA,CAAA,cAAA,EACd,aAAa,GAAA,EAAA,CAAA,aAAA,EACb,iBAAiB,GAAA,EAAA,CAAA,iBAAA;IAEX,IAAA,EAAA,GAAyBG,eAAO,EAAE,EAAhC,CAAC,GAAA,EAAA,CAAA,CAAA,EAAE,eAAe,GAAA,EAAA,CAAA,eAAc;IAExC,IAAM,WAAW,GAAG,UAAC,KAAkB,EAAA;;QACrC,IAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1C,IAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;;AAGhC,QAAA,IAAM,YAAY,GAAG,IAAI,CACvB,sJAAsJ,EACtJ;AACE,cAAE;cACA,uCAAuC,CAC5C;AAED,QAAA,QAAQ,KAAK,CAAC,SAAS;AACrB,YAAA,KAAK,MAAM;gBACT,QACEH,cAAA,CAAA,OAAA,EAAA,EACE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAvC,CAAuC,EACxD,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,SAAS,EAAE,YAAY,EACvB,YAAY,EAAC,KAAK,EAAA,CAClB;AAGN,YAAA,KAAK,QAAQ;gBACX,QACEA,cAAA,CAAA,OAAA,EAAA,EACE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,SAAS,EACnB,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAvC,CAAuC,EACxD,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,SAAS,EAAE,YAAY,EAAA,CACvB;AAGN,YAAA,KAAK,MAAM;AACT,gBAAA,QACEA,cAAA,CAACE,+BAAe,EAAA,EACd,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,UAAU,EAAE,CAAA,EAAA,GAAA,KAAK,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,YAAY,EAC5C,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA,CAA1B,CAA0B,EAC3C,SAAS,EAAE,YAAY,EAAA,CACvB;AAGN,YAAA,KAAK,SAAS;AACZ,gBAAA,QACEE,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,EAAA,QAAA,EAAA,CACtCJ,cAAA,CAAA,OAAA,EAAA,EACE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,KAAK,IAAI,KAAK,EACvB,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA,CAAzC,CAAyC,EAC1D,SAAS,EAAC,qEAAqE,GAC/E,EACD,KAAK,CAAC,WAAW,KAChBA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAE,KAAK,CAAC,WAAW,EAAA,CAAQ,CACnE,CAAA,EAAA,CACG;AAGV,YAAA,KAAK,MAAM;gBACT,QACEA,eAACC,sBAAM,EAAA,EACL,OAAO,EAAE,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,EAAE,GAAG,CAAC,UAAC,GAAG,EAAA,EAAK,QAAC;AAC/C,wBAAA,KAAK,EAAE,GAAG;AACV,wBAAA,KAAK,EAAE,GAAG;AACX,qBAAA,GAH+C,CAG9C,CAAC,EACH,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,aAAa,EAAE,UAAC,GAAG,EAAA,EAAK,OAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EAA5B,CAA4B,EACpD,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,CAAC,CAAC,2BAA2B,CAAC,EAChE,KAAK,EAAE,QAAQ,EAAA,CACf;AAGN,YAAA,KAAK,OAAO;gBACV,QACED,cAAA,CAAA,OAAA,EAAA,EACE,EAAE,EAAE,KAAK,CAAC,EAAE,EACZ,IAAI,EAAC,OAAO,EACZ,KAAK,EAAE,KAAK,IAAI,EAAE,EAClB,QAAQ,EAAE,UAAC,CAAC,EAAA,EAAK,OAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,CAAvC,CAAuC,EACxD,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,SAAS,EAAE,YAAY,EACvB,YAAY,EAAC,KAAK,EAClB,SAAS,EAAC,OAAO,EAAA,CACjB;AAGN,YAAA,KAAK,SAAS;;AAEZ,gBAAA,IAAM,cAAY,GAAG,KAAK,IAAI,EAAE;AAChC,gBAAA,IAAM,WAAW,GAAG;AAClB,oBAAA,QAAQ,EAAE,EAAE;AACZ,oBAAA,SAAS,EAAE,EAAE;AACb,oBAAA,SAAS,EAAE,EAAE;AACb,oBAAA,GAAG,EAAE,EAAE;AACP,oBAAA,KAAK,EAAE,EAAE;AACT,oBAAA,IAAI,EAAE,EAAE;AACR,oBAAA,KAAK,EAAE,EAAE;AACT,oBAAA,WAAW,EAAE,EAAE;AACf,oBAAA,GAAG,EAAE,EAAE;AACP,oBAAA,YAAY,EAAE,cAAY,CAAC,YAAY,IAAI,EAAE;AAC7C,oBAAA,YAAY,EAAE,cAAY,CAAC,YAAY,IAAI,EAAE;AAC7C,oBAAA,UAAU,EAAE,cAAY,CAAC,UAAU,IAAI,EAAE;AACzC,oBAAA,IAAI,EAAE,cAAY,CAAC,IAAI,IAAI,EAAE;AAC7B,oBAAA,WAAW,EAAE,cAAY,CAAC,WAAW,IAAI,EAAE;AAC3C,oBAAA,WAAW,EAAE,EAAE;AACf,oBAAA,WAAW,EAAE,EAAE;AACf,oBAAA,KAAK,EAAE,EAAE;AACT,oBAAA,GAAG,EAAE,EAAE;iBACR;gBAED,QACEA,eAACK,qBAAa,EAAA,EACZ,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE;AACN,wBAAA,YAAY,EAAE,QAAQ;AACtB,wBAAA,YAAY,EAAE,KAAK;AACnB,wBAAA,UAAU,EAAE,QAAQ;AACpB,wBAAA,IAAI,EAAE,QAAQ;AACd,wBAAA,OAAO,EAAE,QAAQ;AAClB,qBAAA,EACD,eAAe,EAAE,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EACrC,aAAa,EAAE,UAAC,GAAG,EAAE,GAAG,EAAA;;wBACtB,IAAM,cAAc,6CACf,cAAY,CAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,CACd,GAAG,CAAA,GAAG,GAAG,MACX;AACD,wBAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC;AACzC,oBAAA,CAAC,EACD,kBAAkB,EAAE,kBAAkB,EACtC,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,UAAC,GAAG,EAAA;wBACnB,IAAM,cAAc,6CACf,cAAY,CAAA,EAAA,EACf,YAAY,EAAE,GAAG,GAClB;AACD,wBAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC;wBACvC,eAAe,KAAA,IAAA,IAAf,eAAe,KAAA,MAAA,GAAA,MAAA,GAAf,eAAe,CAAG,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC;AAClC,oBAAA,CAAC,EACD,cAAc,EAAE,YAAA,EAAM,OAAA,cAAc,KAAA,IAAA,IAAd,cAAc,KAAA,MAAA,GAAA,MAAA,GAAd,cAAc,CAAG,KAAK,CAAC,EAAE,CAAC,CAAA,CAA1B,CAA0B,EAChD,aAAa,EAAE,YAAA,EAAM,OAAA,aAAa,KAAA,IAAA,IAAb,aAAa,KAAA,MAAA,GAAA,MAAA,GAAb,aAAa,CAAG,KAAK,CAAC,EAAE,CAAC,CAAA,CAAzB,CAAyB,EAC9C,iBAAiB,EAAE,UAAC,UAAU,EAAA;AAC5B,wBAAA,IAAM,cAAc,GAAG;AACrB,4BAAA,YAAY,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;AACpC,4BAAA,YAAY,EAAE,cAAY,CAAC,YAAY,IAAI,EAAE;AAC7C,4BAAA,UAAU,EAAE,UAAU,CAAC,UAAU,IAAI,EAAE;AACvC,4BAAA,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,EAAE;AAC3B,4BAAA,WAAW,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE;yBAC1C;AACD,wBAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,cAAc,CAAC;wBACvC,iBAAiB,KAAA,IAAA,IAAjB,iBAAiB,KAAA,MAAA,GAAA,MAAA,GAAjB,iBAAiB,CAAG,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC;oBAC3C,CAAC,EAAA,CACD;YAGN,KAAK,MAAM,EAAE;AACX,gBAAA,IAAM,aAAa,GAA6B,KAAK,CAAC,OAAO,CAAC,KAAK;AACjE,sBAAE;sBACA,EAAE;gBACN,IAAM,SAAO,GAAiBC,mCAAoB,CAAC,KAAK,CAAC,WAAW,CAAC;AACrE,gBAAA,IAAM,SAAO,GAAGC,kCAAmB,CAAC,KAAK,CAAC;gBAC1C,IAAM,MAAI,GAAGC,oCAAqB,CAAC,aAAa,EAAE,SAAO,EAAE,SAAO,CAAC;AACnE,gBAAA,IAAM,qBAAmB,GAAG,SAAA,CAAA,MAAA,CAAU,SAAO,CAAC,MAAM,+BAA4B;gBAChF,IAAM,cAAY,GAAG,EAAA,CAAA,MAAA,CAAG,SAAO,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,SAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAA,IAAA,CAAI;gBAChF,IAAM,iBAAe,GAAG,CAAA,EAAA,GAAA,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE;AAElD,gBAAA,IAAI,SAAO,CAAC,MAAM,KAAK,CAAC,EAAE;AACxB,oBAAA,QACER,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,sBAAsB,EAAA,QAAA,EAChC,CAAC,CACA,kCAAkC,EAClC,6CAA6C,CAC9C,EAAA,CACC;gBAER;AAEA,gBAAA,IAAM,iBAAe,GAAG,UACtB,QAAgB,EAChB,OAAe,EACf,QAAgB,EAAA;;AAEhB,oBAAA,IAAM,OAAO,GAAAS,uBAAA,CAAA,EAAA,EAAO,MAAI,EAAA,IAAA,CAAC;AACzB,oBAAA,OAAO,CAAC,QAAQ,CAAC,GAAAC,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EAAQ,OAAO,CAAC,QAAQ,CAAC,CAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,CAAG,OAAO,CAAA,GAAG,QAAQ,MAAE;AACjE,oBAAA,aAAa,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,CAAC;AAClC,gBAAA,CAAC;AAED,gBAAA,IAAM,YAAY,GAAG,YAAA;AACnB,oBAAA,IAAM,QAAQ,GAAGC,iCAAkB,CAAC,SAAO,CAAC;oBAC5C,aAAa,CAAC,KAAK,CAAC,EAAE,sDAAM,MAAI,EAAA,IAAA,CAAA,EAAA,CAAE,QAAQ,CAAA,EAAA,KAAA,CAAA,CAAE;AAC9C,gBAAA,CAAC;gBAED,IAAM,iBAAe,GAAG,UAAC,QAAgB,EAAA;AACvC,oBAAA,IAAI,MAAI,CAAC,MAAM,IAAI,SAAO,EAAE;wBAC1B;oBACF;oBAEA,aAAa,CACX,KAAK,CAAC,EAAE,EACR,MAAI,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,CAAC,EAAA,EAAK,OAAA,CAAC,KAAK,QAAQ,CAAA,CAAd,CAAc,CAAC,CACtC;AACH,gBAAA,CAAC;AAED,gBAAA,QACEP,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,2BAA2B,EAAA,QAAA,EAAA,CACvC,SAAO,CAAC,MAAM,GAAG,CAAC,KACjBA,eAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,gCAAgC,EAC1C,KAAK,EAAE;AACL,gCAAA,mBAAmB,EAAA,qBAAA;AACnB,gCAAA,QAAQ,EAAE,cAAY;6BACvB,EAAA,QAAA,EAAA,CAEA,SAAO,CAAC,GAAG,CAAC,UAAC,GAAG,EAAA,EAAK,QACpBJ,cAAA,CAAA,MAAA,EAAA,EAEE,SAAS,EAAC,sEAAsE,EAAA,QAAA,EAE/E,GAAG,CAAC,KAAK,IAHL,GAAG,CAAC,KAAK,CAIT,EACR,CAPqB,CAOrB,CAAC,EACFA,0BAAQ,CAAA,EAAA,CACJ,CACP,EAEA,MAAI,CAAC,GAAG,CAAC,UAAC,GAAG,EAAE,QAAQ,EAAA,EAAK,QAC3BI,eAAA,CAAA,KAAA,EAAA,EAEE,SAAS,EAAC,+BAA+B,EACzC,KAAK,EAAE;AACL,gCAAA,mBAAmB,EAAA,qBAAA;AACnB,gCAAA,QAAQ,EAAE,cAAY;AACvB,6BAAA,EAAA,QAAA,EAAA,CAEA,SAAO,CAAC,GAAG,CAAC,UAAC,GAAG,EAAA;AACf,oCAAA,IAAM,OAAO,GACX,iBAAe,CAACQ,kCAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AACpD,oCAAA,IAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;AACrC,oCAAA,IAAM,gBAAgB,GAAG,IAAI,CAC3B,4IAA4I,EAC5I;AACE,0CAAE;0CACA,uCAAuC,CAC5C;oCACD,QACER,yBAEE,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAA,CAEvCJ,cAAA,CAAC,QAAQ,EAAA,EACP,GAAG,EAAE,GAAG,EACR,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;;;;;;gDAM3B,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,gBAAgB,EAC7B,QAAQ,EAAE,UAAC,GAAG,EAAA;oDACZ,OAAA,iBAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;gDAAzC,CAAyC,EAE3C,QAAQ,EAAE,eAAe,EAAA,CACzB,EACD,OAAO,OAAO,KAAK,QAAQ,KAC1BA,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,sBAAsB,EAAA,QAAA,EACnC,OAAO,EAAA,CACH,CACR,CAAA,EAAA,EAtBI,GAAG,CAAC,KAAK,CAuBV;AAEV,gCAAA,CAAC,CAAC,EACFA,cAAA,CAAA,QAAA,EAAA,EACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAA,EAAM,OAAA,iBAAe,CAAC,QAAQ,CAAC,CAAA,CAAzB,CAAyB,EACxC,SAAS,EAAE,IAAI,CACb,yEAAyE,EACzE,MAAI,CAAC,MAAM,IAAI;AACb,0CAAE;0CACA,kDAAkD,CACvD,EAAA,YAAA,EACW,CAAC,CAAC,wBAAwB,EAAE,oBAAoB,CAAC,EAC7D,QAAQ,EAAE,MAAI,CAAC,MAAM,IAAI,SAAO,EAAA,QAAA,EAAA,QAAA,EAAA,CAGzB,CAAA,EAAA,EA1DJ,QAAQ,CA2DT,EACP,CA9D4B,CA8D5B,CAAC,EAEFI,4BACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,YAAY,EACrB,SAAS,EAAC,4EAA4E,EAAA,QAAA,EAAA,CAAA,IAAA,EAEnF,CAAC,CAAC,qBAAqB,EAAE,mBAAmB,CAAC,CAAA,EAAA,CACzC,CAAA,EAAA,CACL;YAEV;AAEA,YAAA;AACE,gBAAA,OAAO,IAAI;;AAEjB,IAAA,CAAC;;;;;IAMD,IAAM,cAAc,GAAG,UAAC,KAAc,EAAA;AACpC,QAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;AAAE,YAAA,OAAO,KAAK;QACvD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;AAC7D,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC;AACjD,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;;;;;;;;AASD,IAAA,IAAM,oBAAoB,GAAGS,YAAM,CAAqB,IAAI,CAAC;AAC7D,IAAA,IAAI,oBAAoB,CAAC,OAAO,KAAK,IAAI,EAAE;AACzC,QAAA,IAAM,GAAG,GAAG,IAAI,GAAG,EAAU;QAC7B,KAAgB,IAAA,EAAA,GAAA,CAAY,EAAZ,cAAA,GAAA,YAAY,EAAZ,0BAAY,EAAZ,EAAA,EAAY,EAAE;AAAzB,YAAA,IAAM,CAAC,GAAA,cAAA,CAAA,EAAA,CAAA;AACV,YAAA,IAAI,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,iBAAiB,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;AAC7E,gBAAA,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACf;QACF;AACA,QAAA,oBAAoB,CAAC,OAAO,GAAG,GAAG;IACpC;AACA,IAAA,IAAM,iBAAiB,GAAG,oBAAoB,CAAC,OAAO;IAEtD,IAAM,cAAc,GAAG,UAAC,CAAc,EAAA;QACpC,IAAI,CAAC,CAAC,CAAC,aAAa;AAAE,YAAA,OAAO,KAAK;QAClC,IAAI,CAAC,CAAC,CAAC,iBAAiB;AAAE,YAAA,OAAO,IAAI;;QAErC,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACrC,IAAA,CAAC;AAED,IAAA,IAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,UAAC,CAAC,EAAA,EAAK,OAAA,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA,CAAlB,CAAkB,CAAC;AAEpE,IAAA,QACEb,cAAA,CAACc,cAAQ,EAAA,EAAA,QAAA,EACN,aAAa,CAAC,GAAG,CAAC,UAAC,KAAK,EAAA,EAAK,QAC5BV,eAAA,CAAA,KAAA,EAAA,EAAoB,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACvCA,eAAA,CAACW,gBAAK,CAAC,IAAI,EAAA,EACT,OAAO,EAAE,KAAK,CAAC,EAAE,EACjB,SAAS,EAAC,wDAAwD,EAAA,QAAA,EAAA,CAEjE,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,QAAQ,IAAIf,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,mBAAmB,EAAA,QAAA,EAAA,GAAA,EAAA,CAAS,CAAA,EAAA,CACpD,EAEZ,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,KACjDA,sBAAG,SAAS,EAAC,6BAA6B,EAAA,QAAA,EAAE,KAAK,CAAC,WAAW,EAAA,CAAK,CACnE,EAEA,WAAW,CAAC,KAAK,CAAC,EAElB,CAAC,YAAA;oBACA,IAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1C,oBAAA,IAAI,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1D,wBAAA,OAAO,IAAI;oBACb;oBACA,IAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACjC,oBAAA,IAAI,CAAC,QAAQ;AAAE,wBAAA,OAAO,IAAI;AAC1B,oBAAA,IAAM,OAAO,GACX,OAAO,QAAQ,KAAK;AAClB,0BAAE;0BACA,KAAK,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACpC,8BAAE,CAAC,CAAC,4BAA4B;AAChC,8BAAE,CAAC,CAAC,2BAA2B,CAAC;AACtC,oBAAA,QACEI,eAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,8CAA8C,EAAA,QAAA,EAAA,CACzDJ,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,cAAc,EAAA,QAAA,EAAA,QAAA,EAAA,CAAS,EACtC,OAAO,CAAA,EAAA,CACN;AAER,gBAAA,CAAC,GAAG,CAAA,EAAA,EAlCI,KAAK,CAAC,EAAE,CAmCZ,EACP,CArC6B,CAqC7B,CAAC,EAAA,CACO;AAEf;;;;"}
|
|
@@ -23,11 +23,11 @@ var UserInputForm = function (props) {
|
|
|
23
23
|
var t = useI18n.useI18n().t;
|
|
24
24
|
var hasListCustomField = props.node.informationType === "custom" &&
|
|
25
25
|
(props.node.customFields || []).some(function (field) { return field.valueType === "list"; });
|
|
26
|
-
var _b = useUserInputForm.useUserInputForm(props), form = _b.form, errors = _b.errors, informationType = _b.informationType, requestedFields = _b.requestedFields, pageTitle = _b.pageTitle, pageDescription = _b.pageDescription, addressSuggestions = _b.addressSuggestions, showSuggestions = _b.showSuggestions, handleFieldChange = _b.handleFieldChange, handleAddressChange = _b.handleAddressChange, handleAddressFocus = _b.handleAddressFocus, handleAddressBlur = _b.handleAddressBlur, applyAddressSuggestion = _b.applyAddressSuggestion, goOnNextStep = _b.goOnNextStep, goOnPreviousStep = _b.goOnPreviousStep, customFormData = _b.customFormData, customFormErrors = _b.customFormErrors, customFormCellErrors = _b.customFormCellErrors, handleCustomFieldChange = _b.handleCustomFieldChange;
|
|
26
|
+
var _b = useUserInputForm.useUserInputForm(props), form = _b.form, errors = _b.errors, informationType = _b.informationType, requestedFields = _b.requestedFields, pageTitle = _b.pageTitle, pageDescription = _b.pageDescription, addressSuggestions = _b.addressSuggestions, showSuggestions = _b.showSuggestions, handleFieldChange = _b.handleFieldChange, handleAddressChange = _b.handleAddressChange, handleAddressFocus = _b.handleAddressFocus, handleAddressBlur = _b.handleAddressBlur, applyAddressSuggestion = _b.applyAddressSuggestion, goOnNextStep = _b.goOnNextStep, goOnPreviousStep = _b.goOnPreviousStep, customFormData = _b.customFormData, customFormErrors = _b.customFormErrors, customFormCellErrors = _b.customFormCellErrors, handleCustomFieldChange = _b.handleCustomFieldChange, customFields = _b.customFields;
|
|
27
27
|
return (jsxRuntime.jsxs(MobilePageLayout.default, { contentClassName: "overflow-y-auto", footerClassName: "md:sticky md:bottom-0 md:bg-white md:pt-4 md:z-20", footer: jsxRuntime.jsx(PageActions.default, { primary: jsxRuntime.jsx(Button.default, { onClick: goOnNextStep, children: t("user_input_form.buttons.continue") }), secondary: props.stepObject.canGoBack ? (jsxRuntime.jsx(Button.default, { variant: "secondary", onClick: goOnPreviousStep, children: t("user_input_form.buttons.back") })) : undefined }), children: [typeof process !== "undefined" &&
|
|
28
28
|
((_a = process.env) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === "development" && (jsxRuntime.jsx("div", { className: "fixed right-0 top-0 z-50 bg-green-500 p-2 text-xs text-white", children: "UserInputForm Rendered \u2713" })), jsxRuntime.jsx("div", { className: "px-4 py-6 pt-11 md:px-8 md:py-8", children: jsxRuntime.jsxs("div", { className: "mx-auto w-full space-y-6 ".concat(hasListCustomField
|
|
29
29
|
? "max-w-[98vw] md:max-w-[1300px] lg:max-w-[1500px]"
|
|
30
|
-
: "max-w-md"), children: [jsxRuntime.jsxs("div", { className: "space-y-4 text-center", children: [jsxRuntime.jsx(Title.default, { className: "text-xl md:text-2xl lg:text-3xl", children: pageTitle }), jsxRuntime.jsx(Subtitle.default, { className: "text-sm leading-relaxed text-gray-600 md:text-base whitespace-pre-line", children: pageDescription })] }), jsxRuntime.jsxs("div", { className: "space-y-6 z-30", children: [informationType === "identity" && (jsxRuntime.jsx(IdentityFields.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "identity-legal-rep" && (jsxRuntime.jsx(LegalRepFields.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "identity-legal" && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(LegalEntityFields.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange }), requestedFields.has("adresse") && (jsxRuntime.jsxs("div", { className: "space-y-4", children: [jsxRuntime.jsx("h3", { className: "text-lg md:text-xl font-semibold text-gray-900", children: t("user_input_form.registered_office_address", "Adresse du siège social") }), jsxRuntime.jsx(AddressFields.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange, addressSuggestions: addressSuggestions, showSuggestions: showSuggestions, onAddressChange: handleAddressChange, onAddressFocus: handleAddressFocus, onAddressBlur: handleAddressBlur, onApplySuggestion: applyAddressSuggestion })] }))] })), informationType === "contact" && (jsxRuntime.jsx(ContactFields.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "address" && (jsxRuntime.jsx(AddressFields.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange, addressSuggestions: addressSuggestions, showSuggestions: showSuggestions, onAddressChange: handleAddressChange, onAddressFocus: handleAddressFocus, onAddressBlur: handleAddressBlur, onApplySuggestion: applyAddressSuggestion })), informationType === "nationality" && (jsxRuntime.jsx(NationalityField.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "custom" &&
|
|
30
|
+
: "max-w-md"), children: [jsxRuntime.jsxs("div", { className: "space-y-4 text-center", children: [jsxRuntime.jsx(Title.default, { className: "text-xl md:text-2xl lg:text-3xl", children: pageTitle }), jsxRuntime.jsx(Subtitle.default, { className: "text-sm leading-relaxed text-gray-600 md:text-base whitespace-pre-line", children: pageDescription })] }), jsxRuntime.jsxs("div", { className: "space-y-6 z-30", children: [informationType === "identity" && (jsxRuntime.jsx(IdentityFields.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "identity-legal-rep" && (jsxRuntime.jsx(LegalRepFields.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "identity-legal" && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(LegalEntityFields.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange }), requestedFields.has("adresse") && (jsxRuntime.jsxs("div", { className: "space-y-4", children: [jsxRuntime.jsx("h3", { className: "text-lg md:text-xl font-semibold text-gray-900", children: t("user_input_form.registered_office_address", "Adresse du siège social") }), jsxRuntime.jsx(AddressFields.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange, addressSuggestions: addressSuggestions, showSuggestions: showSuggestions, onAddressChange: handleAddressChange, onAddressFocus: handleAddressFocus, onAddressBlur: handleAddressBlur, onApplySuggestion: applyAddressSuggestion })] }))] })), informationType === "contact" && (jsxRuntime.jsx(ContactFields.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "address" && (jsxRuntime.jsx(AddressFields.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange, addressSuggestions: addressSuggestions, showSuggestions: showSuggestions, onAddressChange: handleAddressChange, onAddressFocus: handleAddressFocus, onAddressBlur: handleAddressBlur, onApplySuggestion: applyAddressSuggestion })), informationType === "nationality" && (jsxRuntime.jsx(NationalityField.default, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "custom" && customFields.length > 0 && (jsxRuntime.jsx(CustomFormFields.default, { customFields: customFields, formData: customFormData, errors: customFormErrors, cellErrors: customFormCellErrors, onFieldChange: handleCustomFieldChange, addressSuggestions: addressSuggestions, showSuggestions: showSuggestions, onAddressChange: function (fieldId, val) { return handleAddressChange(val); }, onAddressFocus: function (fieldId) { return handleAddressFocus(); }, onAddressBlur: function (fieldId) { return handleAddressBlur(); }, onApplySuggestion: function (fieldId, suggestion) {
|
|
31
31
|
return applyAddressSuggestion(suggestion);
|
|
32
32
|
} }))] })] }) })] }));
|
|
33
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserInputForm.js","sources":["../../../../../src/components/session/UserInputForm.tsx"],"sourcesContent":["import type { UserInputFormProps } from \"../../types/userInput\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { useUserInputForm } from \"../../hooks/useUserInputForm\";\nimport IdentityFields from \"./UserInputForm/IdentityFields\";\nimport LegalEntityFields from \"./UserInputForm/LegalEntityFields\";\nimport LegalRepFields from \"./UserInputForm/LegalRepFields\";\nimport ContactFields from \"./UserInputForm/ContactFields\";\nimport AddressFields from \"./UserInputForm/AddressFields\";\nimport NationalityField from \"./UserInputForm/NationalityField\";\nimport CustomFormFields from \"./UserInputForm/CustomFormFields\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\nconst UserInputForm = (props: UserInputFormProps) => {\n const { t } = useI18n();\n const hasListCustomField =\n props.node.informationType === \"custom\" &&\n (props.node.customFields || []).some((field) => field.valueType === \"list\");\n\n const {\n form,\n errors,\n informationType,\n requestedFields,\n pageTitle,\n pageDescription,\n addressSuggestions,\n showSuggestions,\n handleFieldChange,\n handleAddressChange,\n handleAddressFocus,\n handleAddressBlur,\n applyAddressSuggestion,\n goOnNextStep,\n goOnPreviousStep,\n customFormData,\n customFormErrors,\n customFormCellErrors,\n handleCustomFieldChange,\n } = useUserInputForm(props);\n\n return (\n <MobilePageLayout\n contentClassName=\"overflow-y-auto\"\n footerClassName=\"md:sticky md:bottom-0 md:bg-white md:pt-4 md:z-20\"\n footer={\n <PageActions\n primary={\n <Button onClick={goOnNextStep}>\n {t(\"user_input_form.buttons.continue\")}\n </Button>\n }\n secondary={props.stepObject.canGoBack ? (\n <Button variant=\"secondary\" onClick={goOnPreviousStep}>\n {t(\"user_input_form.buttons.back\")}\n </Button>\n ) : undefined}\n />\n }\n >\n {typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"development\" && (\n <div className=\"fixed right-0 top-0 z-50 bg-green-500 p-2 text-xs text-white\">\n UserInputForm Rendered ✓\n </div>\n )}\n\n <div className=\"px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div\n className={`mx-auto w-full space-y-6 ${\n hasListCustomField\n ? \"max-w-[98vw] md:max-w-[1300px] lg:max-w-[1500px]\"\n : \"max-w-md\"\n }`}\n >\n <div className=\"space-y-4 text-center\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {pageTitle}\n </Title>\n <Subtitle className=\"text-sm leading-relaxed text-gray-600 md:text-base whitespace-pre-line\">\n {pageDescription}\n </Subtitle>\n </div>\n\n <div className=\"space-y-6 z-30\">\n {informationType === \"identity\" && (\n <IdentityFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"identity-legal-rep\" && (\n <LegalRepFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"identity-legal\" && (\n <>\n <LegalEntityFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n {requestedFields.has(\"adresse\") && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg md:text-xl font-semibold text-gray-900\">\n {t(\n \"user_input_form.registered_office_address\",\n \"Adresse du siège social\",\n )}\n </h3>\n <AddressFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={handleAddressChange}\n onAddressFocus={handleAddressFocus}\n onAddressBlur={handleAddressBlur}\n onApplySuggestion={applyAddressSuggestion}\n />\n </div>\n )}\n </>\n )}\n\n {informationType === \"contact\" && (\n <ContactFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"address\" && (\n <AddressFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={handleAddressChange}\n onAddressFocus={handleAddressFocus}\n onAddressBlur={handleAddressBlur}\n onApplySuggestion={applyAddressSuggestion}\n />\n )}\n\n {informationType === \"nationality\" && (\n <NationalityField\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"custom\" && props.node.customFields && (\n <CustomFormFields\n customFields={props.node.customFields}\n formData={customFormData}\n errors={customFormErrors}\n cellErrors={customFormCellErrors}\n onFieldChange={handleCustomFieldChange}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={(fieldId, val) => handleAddressChange(val)}\n onAddressFocus={(fieldId) => handleAddressFocus()}\n onAddressBlur={(fieldId) => handleAddressBlur()}\n onApplySuggestion={(fieldId, suggestion) =>\n applyAddressSuggestion(suggestion)\n }\n />\n )}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default UserInputForm;\n"],"names":["useI18n","useUserInputForm","_jsxs","MobilePageLayout","_jsx","PageActions","Button","Title","Subtitle","IdentityFields","LegalRepFields","_Fragment","LegalEntityFields","AddressFields","ContactFields","NationalityField","CustomFormFields"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UserInputForm.js","sources":["../../../../../src/components/session/UserInputForm.tsx"],"sourcesContent":["import type { UserInputFormProps } from \"../../types/userInput\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { useUserInputForm } from \"../../hooks/useUserInputForm\";\nimport IdentityFields from \"./UserInputForm/IdentityFields\";\nimport LegalEntityFields from \"./UserInputForm/LegalEntityFields\";\nimport LegalRepFields from \"./UserInputForm/LegalRepFields\";\nimport ContactFields from \"./UserInputForm/ContactFields\";\nimport AddressFields from \"./UserInputForm/AddressFields\";\nimport NationalityField from \"./UserInputForm/NationalityField\";\nimport CustomFormFields from \"./UserInputForm/CustomFormFields\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\nconst UserInputForm = (props: UserInputFormProps) => {\n const { t } = useI18n();\n const hasListCustomField =\n props.node.informationType === \"custom\" &&\n (props.node.customFields || []).some((field) => field.valueType === \"list\");\n\n const {\n form,\n errors,\n informationType,\n requestedFields,\n pageTitle,\n pageDescription,\n addressSuggestions,\n showSuggestions,\n handleFieldChange,\n handleAddressChange,\n handleAddressFocus,\n handleAddressBlur,\n applyAddressSuggestion,\n goOnNextStep,\n goOnPreviousStep,\n customFormData,\n customFormErrors,\n customFormCellErrors,\n handleCustomFieldChange,\n customFields,\n } = useUserInputForm(props);\n\n return (\n <MobilePageLayout\n contentClassName=\"overflow-y-auto\"\n footerClassName=\"md:sticky md:bottom-0 md:bg-white md:pt-4 md:z-20\"\n footer={\n <PageActions\n primary={\n <Button onClick={goOnNextStep}>\n {t(\"user_input_form.buttons.continue\")}\n </Button>\n }\n secondary={props.stepObject.canGoBack ? (\n <Button variant=\"secondary\" onClick={goOnPreviousStep}>\n {t(\"user_input_form.buttons.back\")}\n </Button>\n ) : undefined}\n />\n }\n >\n {typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"development\" && (\n <div className=\"fixed right-0 top-0 z-50 bg-green-500 p-2 text-xs text-white\">\n UserInputForm Rendered ✓\n </div>\n )}\n\n <div className=\"px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div\n className={`mx-auto w-full space-y-6 ${\n hasListCustomField\n ? \"max-w-[98vw] md:max-w-[1300px] lg:max-w-[1500px]\"\n : \"max-w-md\"\n }`}\n >\n <div className=\"space-y-4 text-center\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {pageTitle}\n </Title>\n <Subtitle className=\"text-sm leading-relaxed text-gray-600 md:text-base whitespace-pre-line\">\n {pageDescription}\n </Subtitle>\n </div>\n\n <div className=\"space-y-6 z-30\">\n {informationType === \"identity\" && (\n <IdentityFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"identity-legal-rep\" && (\n <LegalRepFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"identity-legal\" && (\n <>\n <LegalEntityFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n {requestedFields.has(\"adresse\") && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg md:text-xl font-semibold text-gray-900\">\n {t(\n \"user_input_form.registered_office_address\",\n \"Adresse du siège social\",\n )}\n </h3>\n <AddressFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={handleAddressChange}\n onAddressFocus={handleAddressFocus}\n onAddressBlur={handleAddressBlur}\n onApplySuggestion={applyAddressSuggestion}\n />\n </div>\n )}\n </>\n )}\n\n {informationType === \"contact\" && (\n <ContactFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"address\" && (\n <AddressFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={handleAddressChange}\n onAddressFocus={handleAddressFocus}\n onAddressBlur={handleAddressBlur}\n onApplySuggestion={applyAddressSuggestion}\n />\n )}\n\n {informationType === \"nationality\" && (\n <NationalityField\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"custom\" && customFields.length > 0 && (\n <CustomFormFields\n customFields={customFields}\n formData={customFormData}\n errors={customFormErrors}\n cellErrors={customFormCellErrors}\n onFieldChange={handleCustomFieldChange}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={(fieldId, val) => handleAddressChange(val)}\n onAddressFocus={(fieldId) => handleAddressFocus()}\n onAddressBlur={(fieldId) => handleAddressBlur()}\n onApplySuggestion={(fieldId, suggestion) =>\n applyAddressSuggestion(suggestion)\n }\n />\n )}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default UserInputForm;\n"],"names":["useI18n","useUserInputForm","_jsxs","MobilePageLayout","_jsx","PageActions","Button","Title","Subtitle","IdentityFields","LegalRepFields","_Fragment","LegalEntityFields","AddressFields","ContactFields","NationalityField","CustomFormFields"],"mappings":"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"}
|
|
@@ -31,24 +31,20 @@ var SignedDocumentPreview = function (_a) {
|
|
|
31
31
|
React.useEffect(function () {
|
|
32
32
|
cancelledRef.current = false;
|
|
33
33
|
var attempts = 0;
|
|
34
|
+
var objectUrl;
|
|
34
35
|
var timer;
|
|
35
36
|
var fetchAccessLink = function () { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
|
|
36
|
-
var response,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
case 0: return [4 /*yield*/, api.apiService.get("/session/sdk/".concat(sessionId, "/signed-document/").concat(nodeId, "/access-link"))];
|
|
37
|
+
var response, url;
|
|
38
|
+
return tslib_es6.__generator(this, function (_a) {
|
|
39
|
+
switch (_a.label) {
|
|
40
|
+
case 0: return [4 /*yield*/, api.apiService.get("/session/sdk/".concat(sessionId, "/signed-document/").concat(nodeId, ".pdf"), { responseType: 'blob' })];
|
|
41
41
|
case 1:
|
|
42
|
-
response =
|
|
43
|
-
token = (_b = (_a = response.data) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.token;
|
|
44
|
-
if (!token) {
|
|
45
|
-
throw new Error("Missing signed document access token");
|
|
46
|
-
}
|
|
47
|
-
baseURL = (api.apiService.getRawClient().defaults.baseURL || "").replace(/\/+$/, "");
|
|
48
|
-
path = "/session/sdk/".concat(sessionId, "/signed-document/").concat(nodeId, "/view?token=").concat(token);
|
|
42
|
+
response = _a.sent();
|
|
49
43
|
if (!cancelledRef.current) {
|
|
50
|
-
|
|
51
|
-
|
|
44
|
+
url = URL.createObjectURL(response.data);
|
|
45
|
+
objectUrl = url;
|
|
46
|
+
setViewUrl(url);
|
|
47
|
+
setStatus('ready');
|
|
52
48
|
}
|
|
53
49
|
return [2 /*return*/];
|
|
54
50
|
}
|
|
@@ -115,6 +111,8 @@ var SignedDocumentPreview = function (_a) {
|
|
|
115
111
|
cancelledRef.current = true;
|
|
116
112
|
if (timer)
|
|
117
113
|
clearTimeout(timer);
|
|
114
|
+
if (objectUrl)
|
|
115
|
+
URL.revokeObjectURL(objectUrl);
|
|
118
116
|
};
|
|
119
117
|
}, [sessionId, nodeId]);
|
|
120
118
|
if (status === "polling") {
|