datakeen-session-react 1.1.174 → 1.1.176
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/CLAUDE.md +233 -0
- package/dist/cjs/components/legal-consent/LegalConsentNode.js +6 -11
- package/dist/cjs/components/legal-consent/LegalConsentNode.js.map +1 -1
- package/dist/cjs/components/session/UserInputForm/CustomFormFields.js +41 -1
- package/dist/cjs/components/session/UserInputForm/CustomFormFields.js.map +1 -1
- package/dist/cjs/components/signature-electronic/SignatureElectronic.js +4 -5
- package/dist/cjs/components/signature-electronic/SignatureElectronic.js.map +1 -1
- package/dist/cjs/components/template/ConditionNodeHandler.js +1 -1
- package/dist/cjs/components/template/ConditionNodeHandler.js.map +1 -1
- package/dist/cjs/components/template/TemplateNodeRenderer.js +1 -1
- package/dist/cjs/components/template/TemplateNodeRenderer.js.map +1 -1
- package/dist/cjs/i18n/en.json.js +2 -0
- package/dist/cjs/i18n/en.json.js.map +1 -1
- package/dist/cjs/i18n/fr.json.js +2 -0
- package/dist/cjs/i18n/fr.json.js.map +1 -1
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/cjs/utils/conditionEvaluator.js +27 -2
- package/dist/cjs/utils/conditionEvaluator.js.map +1 -1
- package/dist/cjs/utils/renderInlineMarkdown.js +75 -0
- package/dist/cjs/utils/renderInlineMarkdown.js.map +1 -0
- package/dist/esm/components/legal-consent/LegalConsentNode.js +6 -11
- package/dist/esm/components/legal-consent/LegalConsentNode.js.map +1 -1
- package/dist/esm/components/session/UserInputForm/CustomFormFields.js +42 -2
- package/dist/esm/components/session/UserInputForm/CustomFormFields.js.map +1 -1
- package/dist/esm/components/signature-electronic/SignatureElectronic.js +4 -5
- package/dist/esm/components/signature-electronic/SignatureElectronic.js.map +1 -1
- package/dist/esm/components/template/ConditionNodeHandler.js +1 -1
- package/dist/esm/components/template/ConditionNodeHandler.js.map +1 -1
- package/dist/esm/components/template/TemplateNodeRenderer.js +1 -1
- package/dist/esm/components/template/TemplateNodeRenderer.js.map +1 -1
- package/dist/esm/i18n/en.json.js +2 -0
- package/dist/esm/i18n/en.json.js.map +1 -1
- package/dist/esm/i18n/fr.json.js +2 -0
- package/dist/esm/i18n/fr.json.js.map +1 -1
- package/dist/esm/types/session.js.map +1 -1
- package/dist/esm/utils/conditionEvaluator.js +27 -2
- package/dist/esm/utils/conditionEvaluator.js.map +1 -1
- package/dist/esm/utils/renderInlineMarkdown.js +73 -0
- package/dist/esm/utils/renderInlineMarkdown.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Mini-renderer Markdown *inline* et sûr, pour les textes de consentement.
|
|
7
|
+
*
|
|
8
|
+
* Volontairement limité (pas de lib externe, SDK publié npm) :
|
|
9
|
+
* - liens `[libellé](url)` — uniquement http(s) et mailto, ouverts en nouvel onglet ;
|
|
10
|
+
* - gras `**texte**` ;
|
|
11
|
+
* - paragraphes (lignes vides) et sauts de ligne simples.
|
|
12
|
+
*
|
|
13
|
+
* Aucune injection de HTML brut : on ne produit que des éléments React, le texte
|
|
14
|
+
* reste du texte. Les URLs non http(s)/mailto sont rendues en texte (pas de lien).
|
|
15
|
+
*/
|
|
16
|
+
var SAFE_URL = /^(https?:|mailto:)/i;
|
|
17
|
+
// Capture **gras** ou [libellé](url) ; le reste est du texte simple.
|
|
18
|
+
var INLINE_PATTERN = /(\*\*([^*]+)\*\*)|(\[([^\]]+)\]\(([^)\s]+)\))/g;
|
|
19
|
+
function renderInlineSegments(text, keyPrefix) {
|
|
20
|
+
var nodes = [];
|
|
21
|
+
var lastIndex = 0;
|
|
22
|
+
var match;
|
|
23
|
+
var i = 0;
|
|
24
|
+
INLINE_PATTERN.lastIndex = 0;
|
|
25
|
+
while ((match = INLINE_PATTERN.exec(text)) !== null) {
|
|
26
|
+
if (match.index > lastIndex) {
|
|
27
|
+
nodes.push(text.slice(lastIndex, match.index));
|
|
28
|
+
}
|
|
29
|
+
if (match[2] !== undefined) {
|
|
30
|
+
// **gras**
|
|
31
|
+
nodes.push(jsxRuntime.jsx("strong", { children: match[2] }, "".concat(keyPrefix, "-b-").concat(i)));
|
|
32
|
+
}
|
|
33
|
+
else if (match[4] !== undefined && match[5] !== undefined) {
|
|
34
|
+
// [libellé](url)
|
|
35
|
+
var label = match[4];
|
|
36
|
+
var url = match[5];
|
|
37
|
+
if (SAFE_URL.test(url)) {
|
|
38
|
+
nodes.push(jsxRuntime.jsx("a", { href: url, target: "_blank", rel: "noopener noreferrer", className: "underline text-blue-600 hover:text-blue-800", children: label }, "".concat(keyPrefix, "-a-").concat(i)));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// URL non sûre : on retombe sur le libellé en texte simple.
|
|
42
|
+
nodes.push(label);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
lastIndex = INLINE_PATTERN.lastIndex;
|
|
46
|
+
i += 1;
|
|
47
|
+
}
|
|
48
|
+
if (lastIndex < text.length) {
|
|
49
|
+
nodes.push(text.slice(lastIndex));
|
|
50
|
+
}
|
|
51
|
+
return nodes;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Rend une chaîne markdown en paragraphes React. Les blocs séparés par une ligne
|
|
55
|
+
* vide deviennent des `<p>` ; les sauts de ligne simples deviennent des `<br/>`.
|
|
56
|
+
*/
|
|
57
|
+
function renderInlineMarkdown(text) {
|
|
58
|
+
if (!text)
|
|
59
|
+
return null;
|
|
60
|
+
var blocks = text.split(/\n\s*\n/);
|
|
61
|
+
return blocks.map(function (block, blockIndex) {
|
|
62
|
+
var lines = block.split("\n");
|
|
63
|
+
var content = [];
|
|
64
|
+
lines.forEach(function (line, lineIndex) {
|
|
65
|
+
if (lineIndex > 0) {
|
|
66
|
+
content.push(jsxRuntime.jsx("br", {}, "br-".concat(blockIndex, "-").concat(lineIndex)));
|
|
67
|
+
}
|
|
68
|
+
content.push.apply(content, renderInlineSegments(line, "".concat(blockIndex, "-").concat(lineIndex)));
|
|
69
|
+
});
|
|
70
|
+
return jsxRuntime.jsx("p", { children: content }, "p-".concat(blockIndex));
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
exports.renderInlineMarkdown = renderInlineMarkdown;
|
|
75
|
+
//# sourceMappingURL=renderInlineMarkdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderInlineMarkdown.js","sources":["../../../../src/utils/renderInlineMarkdown.tsx"],"sourcesContent":["import React from \"react\";\n\n/**\n * Mini-renderer Markdown *inline* et sûr, pour les textes de consentement.\n *\n * Volontairement limité (pas de lib externe, SDK publié npm) :\n * - liens `[libellé](url)` — uniquement http(s) et mailto, ouverts en nouvel onglet ;\n * - gras `**texte**` ;\n * - paragraphes (lignes vides) et sauts de ligne simples.\n *\n * Aucune injection de HTML brut : on ne produit que des éléments React, le texte\n * reste du texte. Les URLs non http(s)/mailto sont rendues en texte (pas de lien).\n */\n\nconst SAFE_URL = /^(https?:|mailto:)/i;\n\n// Capture **gras** ou [libellé](url) ; le reste est du texte simple.\nconst INLINE_PATTERN = /(\\*\\*([^*]+)\\*\\*)|(\\[([^\\]]+)\\]\\(([^)\\s]+)\\))/g;\n\nfunction renderInlineSegments(text: string, keyPrefix: string): React.ReactNode[] {\n const nodes: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n let i = 0;\n\n INLINE_PATTERN.lastIndex = 0;\n while ((match = INLINE_PATTERN.exec(text)) !== null) {\n if (match.index > lastIndex) {\n nodes.push(text.slice(lastIndex, match.index));\n }\n\n if (match[2] !== undefined) {\n // **gras**\n nodes.push(<strong key={`${keyPrefix}-b-${i}`}>{match[2]}</strong>);\n } else if (match[4] !== undefined && match[5] !== undefined) {\n // [libellé](url)\n const label = match[4];\n const url = match[5];\n if (SAFE_URL.test(url)) {\n nodes.push(\n <a\n key={`${keyPrefix}-a-${i}`}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline text-blue-600 hover:text-blue-800\"\n >\n {label}\n </a>,\n );\n } else {\n // URL non sûre : on retombe sur le libellé en texte simple.\n nodes.push(label);\n }\n }\n\n lastIndex = INLINE_PATTERN.lastIndex;\n i += 1;\n }\n\n if (lastIndex < text.length) {\n nodes.push(text.slice(lastIndex));\n }\n\n return nodes;\n}\n\n/**\n * Rend une chaîne markdown en paragraphes React. Les blocs séparés par une ligne\n * vide deviennent des `<p>` ; les sauts de ligne simples deviennent des `<br/>`.\n */\nexport function renderInlineMarkdown(\n text: string | undefined,\n): React.ReactNode {\n if (!text) return null;\n\n const blocks = text.split(/\\n\\s*\\n/);\n\n return blocks.map((block, blockIndex) => {\n const lines = block.split(\"\\n\");\n const content: React.ReactNode[] = [];\n\n lines.forEach((line, lineIndex) => {\n if (lineIndex > 0) {\n content.push(<br key={`br-${blockIndex}-${lineIndex}`} />);\n }\n content.push(\n ...renderInlineSegments(line, `${blockIndex}-${lineIndex}`),\n );\n });\n\n return <p key={`p-${blockIndex}`}>{content}</p>;\n });\n}\n"],"names":["_jsx"],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ import PageActions from '../ui/PageActions.js';
|
|
|
11
11
|
import MobilePageLayout from '../ui/MobilePageLayout.js';
|
|
12
12
|
import { useI18n } from '../../hooks/useI18n.js';
|
|
13
13
|
import { updateSessionUserInput } from '../../services/sessionService.js';
|
|
14
|
+
import { renderInlineMarkdown } from '../../utils/renderInlineMarkdown.js';
|
|
14
15
|
|
|
15
16
|
var LegalConsentNode = function (_a) {
|
|
16
17
|
var node = _a.node, session = _a.session, sessionId = _a.sessionId, stepObject = _a.stepObject;
|
|
@@ -63,25 +64,19 @@ var LegalConsentNode = function (_a) {
|
|
|
63
64
|
});
|
|
64
65
|
}); };
|
|
65
66
|
var pageTitle = node.pageTitle || t("LEGAL_CONSENT.default_title");
|
|
67
|
+
// Description unique au format Markdown (liens [libellé](url), gras).
|
|
66
68
|
var description = node.consentDescription;
|
|
67
|
-
|
|
69
|
+
// Rétrocompat : on n'affiche consentDescription2 que pour les anciens nœuds
|
|
70
|
+
// qui n'ont pas de consentDescription (sinon doublon, le texte étant fusionné).
|
|
71
|
+
var description2 = description ? undefined : node.consentDescription2;
|
|
68
72
|
var checkboxLabel = node.checkboxText || t("LEGAL_CONSENT.default_checkbox");
|
|
69
|
-
// Use Datakeen default URLs when fields are left empty
|
|
70
|
-
var cguUrl = node.cguUrl || t("LEGAL_CONSENT.default_cgu_url");
|
|
71
|
-
var privacyUrl = node.privacyPolicyUrl || t("LEGAL_CONSENT.default_privacy_url");
|
|
72
|
-
// Build description text with optional hyperlinks
|
|
73
|
-
var renderDescription = function (text, url) {
|
|
74
|
-
if (!url || !text)
|
|
75
|
-
return jsx("p", { children: text });
|
|
76
|
-
return (jsxs("p", { children: [text, " ", jsx("a", { href: url, target: "_blank", rel: "noopener noreferrer", className: "underline text-blue-600 hover:text-blue-800", children: url })] }));
|
|
77
|
-
};
|
|
78
73
|
return (jsx(MobilePageLayout, { session: session, footer: jsxs("div", { className: "w-full space-y-4", children: [(error || submitError) && (jsx("div", { className: "bg-red-50 border border-red-200 rounded-lg p-3", children: jsx(Body, { className: "text-red-600 text-sm text-center", children: submitError
|
|
79
74
|
? submitError
|
|
80
75
|
: t("LEGAL_CONSENT.error.required") }) })), jsxs("div", { className: "flex items-start gap-3 p-3 bg-gray-50 rounded-lg", children: [jsx(CheckboxPrimitive.Root, { id: "legal-consent-checkbox-".concat(node.id), checked: checked, onCheckedChange: function (value) { return handleCheckboxChange(!!value); }, className: "mt-1 h-5 w-5 shrink-0 rounded border bg-white transition-colors\n data-[state=checked]:bg-[var(--dk-btn-bg)] data-[state=checked]:border-[var(--dk-btn-bg)]\n ".concat(error
|
|
81
76
|
? "border-red-500"
|
|
82
77
|
: "border-gray-300 hover:border-gray-400", "\n "), children: jsx(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center text-white", children: jsx(CheckIcon, { className: "h-4 w-4" }) }) }), jsx(Label.Root, { htmlFor: "legal-consent-checkbox-".concat(node.id), className: "cursor-pointer", children: jsx(Body, { className: "text-left text-sm leading-relaxed ".concat(error ? "text-red-600" : "text-gray-700"), children: checkboxLabel }) })] }), jsx(PageActions, { primary: jsx(Button, { onClick: handleContinue, disabled: (isRequired && !checked) || isSubmitting, children: isSubmitting
|
|
83
78
|
? t("LEGAL_CONSENT.button.loading")
|
|
84
|
-
: t("LEGAL_CONSENT.button.continue") }) })] }), children: jsx("div", { className: "px-4 py-8 md:px-8 flex flex-col", children: jsxs("div", { className: "w-full max-w-2xl mx-auto space-y-6", children: [jsx("div", { className: "text-center", children: jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl mb-6", children: pageTitle }) }), (description || description2) && (jsx("div", { className: "bg-gray-50 rounded-lg p-4 md:p-6", children: jsxs(Body, { className: "text-left text-sm md:text-base leading-relaxed space-y-4", children: [description &&
|
|
79
|
+
: t("LEGAL_CONSENT.button.continue") }) })] }), children: jsx("div", { className: "px-4 py-8 md:px-8 flex flex-col", children: jsxs("div", { className: "w-full max-w-2xl mx-auto space-y-6", children: [jsx("div", { className: "text-center", children: jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl mb-6", children: pageTitle }) }), (description || description2) && (jsx("div", { className: "bg-gray-50 rounded-lg p-4 md:p-6", children: jsxs(Body, { className: "text-left text-sm md:text-base leading-relaxed space-y-4", children: [description && renderInlineMarkdown(description), description2 && renderInlineMarkdown(description2)] }) }))] }) }) }));
|
|
85
80
|
};
|
|
86
81
|
|
|
87
82
|
export { LegalConsentNode as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegalConsentNode.js","sources":["../../../../../src/components/legal-consent/LegalConsentNode.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { CheckIcon } from \"@radix-ui/react-icons\";\nimport Body from \"../ui/Body\";\nimport Title from \"../ui/Title\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { updateSessionUserInput } from \"../../services/sessionService\";\nimport type { SessionData, SessionTemplateNode, stepObject } from \"../../types/session\";\n\ninterface LegalConsentNodeProps {\n node: SessionTemplateNode;\n session: SessionData;\n sessionId: string;\n stepObject: stepObject;\n}\n\nconst LegalConsentNode = ({\n node,\n session,\n sessionId,\n stepObject,\n}: LegalConsentNodeProps) => {\n const { t } = useI18n();\n const [checked, setChecked] = useState(false);\n const [error, setError] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const isRequired = node.isRequired !== false; // true by default\n\n const handleCheckboxChange = (value: boolean) => {\n setChecked(value);\n setError(false);\n setSubmitError(null);\n };\n\n const handleContinue = async () => {\n if (isRequired && !checked) {\n setError(true);\n return;\n }\n\n setIsSubmitting(true);\n try {\n // Merge consent data with existing userInput (backend does full replacement)\n const existingUserInput = (session.userInput as Record<string, unknown>) ?? {};\n const merged = {\n ...existingUserInput,\n [node.id]: {\n accepted: checked,\n timestamp: new Date().toISOString(),\n },\n };\n await updateSessionUserInput(sessionId, merged);\n stepObject.goToNextStep(node.id, session.template);\n } catch (err) {\n console.error(t(\"LEGAL_CONSENT.error.console_update\"), err);\n setSubmitError(t(\"LEGAL_CONSENT.error.general\"));\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const pageTitle = node.pageTitle || t(\"LEGAL_CONSENT.default_title\");\n const description = node.consentDescription;\n const description2 = node.consentDescription2;\n const checkboxLabel = node.checkboxText || t(\"LEGAL_CONSENT.default_checkbox\");\n\n // Use Datakeen default URLs when fields are left empty\n const cguUrl = node.cguUrl || t(\"LEGAL_CONSENT.default_cgu_url\");\n const privacyUrl = node.privacyPolicyUrl || t(\"LEGAL_CONSENT.default_privacy_url\");\n\n // Build description text with optional hyperlinks\n const renderDescription = (text: string, url?: string) => {\n if (!url || !text) return <p>{text}</p>;\n return (\n <p>\n {text}{\" \"}\n <a\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline text-blue-600 hover:text-blue-800\"\n >\n {url}\n </a>\n </p>\n );\n };\n\n return (\n <MobilePageLayout\n session={session}\n footer={\n <div className=\"w-full space-y-4\">\n {/* Error message */}\n {(error || submitError) && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3\">\n <Body className=\"text-red-600 text-sm text-center\">\n {submitError\n ? submitError\n : t(\"LEGAL_CONSENT.error.required\")}\n </Body>\n </div>\n )}\n\n {/* Consent checkbox */}\n <div className=\"flex items-start gap-3 p-3 bg-gray-50 rounded-lg\">\n <CheckboxPrimitive.Root\n id={`legal-consent-checkbox-${node.id}`}\n checked={checked}\n onCheckedChange={(value) => handleCheckboxChange(!!value)}\n className={`mt-1 h-5 w-5 shrink-0 rounded border bg-white transition-colors\n data-[state=checked]:bg-[var(--dk-btn-bg)] data-[state=checked]:border-[var(--dk-btn-bg)]\n ${error\n ? \"border-red-500\"\n : \"border-gray-300 hover:border-gray-400\"\n }\n `}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-white\">\n <CheckIcon className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n\n <LabelPrimitive.Root\n htmlFor={`legal-consent-checkbox-${node.id}`}\n className=\"cursor-pointer\"\n >\n <Body\n className={`text-left text-sm leading-relaxed ${\n error ? \"text-red-600\" : \"text-gray-700\"\n }`}\n >\n {checkboxLabel}\n </Body>\n </LabelPrimitive.Root>\n </div>\n\n {/* Continue button */}\n <PageActions\n primary={\n <Button\n onClick={handleContinue}\n disabled={(isRequired && !checked) || isSubmitting}\n >\n {isSubmitting\n ? t(\"LEGAL_CONSENT.button.loading\")\n : t(\"LEGAL_CONSENT.button.continue\")}\n </Button>\n }\n />\n </div>\n }\n >\n <div className=\"px-4 py-8 md:px-8 flex flex-col\">\n <div className=\"w-full max-w-2xl mx-auto space-y-6\">\n <div className=\"text-center\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl mb-6\">\n {pageTitle}\n </Title>\n </div>\n\n {/* Consent content */}\n {(description || description2) && (\n <div className=\"bg-gray-50 rounded-lg p-4 md:p-6\">\n <Body className=\"text-left text-sm md:text-base leading-relaxed space-y-4\">\n {description && renderDescription(description, cguUrl)}\n {description2 && renderDescription(description2, privacyUrl)}\n </Body>\n </div>\n )}\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default LegalConsentNode;\n"],"names":["_jsx","_jsxs","LabelPrimitive"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LegalConsentNode.js","sources":["../../../../../src/components/legal-consent/LegalConsentNode.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { CheckIcon } from \"@radix-ui/react-icons\";\nimport Body from \"../ui/Body\";\nimport Title from \"../ui/Title\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { updateSessionUserInput } from \"../../services/sessionService\";\nimport { renderInlineMarkdown } from \"../../utils/renderInlineMarkdown\";\nimport type { SessionData, SessionTemplateNode, stepObject } from \"../../types/session\";\n\ninterface LegalConsentNodeProps {\n node: SessionTemplateNode;\n session: SessionData;\n sessionId: string;\n stepObject: stepObject;\n}\n\nconst LegalConsentNode = ({\n node,\n session,\n sessionId,\n stepObject,\n}: LegalConsentNodeProps) => {\n const { t } = useI18n();\n const [checked, setChecked] = useState(false);\n const [error, setError] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const isRequired = node.isRequired !== false; // true by default\n\n const handleCheckboxChange = (value: boolean) => {\n setChecked(value);\n setError(false);\n setSubmitError(null);\n };\n\n const handleContinue = async () => {\n if (isRequired && !checked) {\n setError(true);\n return;\n }\n\n setIsSubmitting(true);\n try {\n // Merge consent data with existing userInput (backend does full replacement)\n const existingUserInput = (session.userInput as Record<string, unknown>) ?? {};\n const merged = {\n ...existingUserInput,\n [node.id]: {\n accepted: checked,\n timestamp: new Date().toISOString(),\n },\n };\n await updateSessionUserInput(sessionId, merged);\n stepObject.goToNextStep(node.id, session.template);\n } catch (err) {\n console.error(t(\"LEGAL_CONSENT.error.console_update\"), err);\n setSubmitError(t(\"LEGAL_CONSENT.error.general\"));\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const pageTitle = node.pageTitle || t(\"LEGAL_CONSENT.default_title\");\n // Description unique au format Markdown (liens [libellé](url), gras).\n const description = node.consentDescription;\n // Rétrocompat : on n'affiche consentDescription2 que pour les anciens nœuds\n // qui n'ont pas de consentDescription (sinon doublon, le texte étant fusionné).\n const description2 = description ? undefined : node.consentDescription2;\n const checkboxLabel = node.checkboxText || t(\"LEGAL_CONSENT.default_checkbox\");\n\n return (\n <MobilePageLayout\n session={session}\n footer={\n <div className=\"w-full space-y-4\">\n {/* Error message */}\n {(error || submitError) && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3\">\n <Body className=\"text-red-600 text-sm text-center\">\n {submitError\n ? submitError\n : t(\"LEGAL_CONSENT.error.required\")}\n </Body>\n </div>\n )}\n\n {/* Consent checkbox */}\n <div className=\"flex items-start gap-3 p-3 bg-gray-50 rounded-lg\">\n <CheckboxPrimitive.Root\n id={`legal-consent-checkbox-${node.id}`}\n checked={checked}\n onCheckedChange={(value) => handleCheckboxChange(!!value)}\n className={`mt-1 h-5 w-5 shrink-0 rounded border bg-white transition-colors\n data-[state=checked]:bg-[var(--dk-btn-bg)] data-[state=checked]:border-[var(--dk-btn-bg)]\n ${error\n ? \"border-red-500\"\n : \"border-gray-300 hover:border-gray-400\"\n }\n `}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-white\">\n <CheckIcon className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n\n <LabelPrimitive.Root\n htmlFor={`legal-consent-checkbox-${node.id}`}\n className=\"cursor-pointer\"\n >\n <Body\n className={`text-left text-sm leading-relaxed ${\n error ? \"text-red-600\" : \"text-gray-700\"\n }`}\n >\n {checkboxLabel}\n </Body>\n </LabelPrimitive.Root>\n </div>\n\n {/* Continue button */}\n <PageActions\n primary={\n <Button\n onClick={handleContinue}\n disabled={(isRequired && !checked) || isSubmitting}\n >\n {isSubmitting\n ? t(\"LEGAL_CONSENT.button.loading\")\n : t(\"LEGAL_CONSENT.button.continue\")}\n </Button>\n }\n />\n </div>\n }\n >\n <div className=\"px-4 py-8 md:px-8 flex flex-col\">\n <div className=\"w-full max-w-2xl mx-auto space-y-6\">\n <div className=\"text-center\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl mb-6\">\n {pageTitle}\n </Title>\n </div>\n\n {/* Consent content */}\n {(description || description2) && (\n <div className=\"bg-gray-50 rounded-lg p-4 md:p-6\">\n <Body className=\"text-left text-sm md:text-base leading-relaxed space-y-4\">\n {/* Descriptions au format Markdown : liens cliquables dans le texte. */}\n {description && renderInlineMarkdown(description)}\n {description2 && renderInlineMarkdown(description2)}\n </Body>\n </div>\n )}\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default LegalConsentNode;\n"],"names":["_jsx","_jsxs","LabelPrimitive"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __assign, __spreadArray } from '../../../node_modules/tslib/tslib.es6.js';
|
|
2
2
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
-
import { Fragment } from 'react';
|
|
3
|
+
import { useRef, Fragment } from 'react';
|
|
4
4
|
import * as Label from '@radix-ui/react-label';
|
|
5
5
|
import clsx from 'clsx';
|
|
6
6
|
import { Select } from '../../ui/SelectComponent.js';
|
|
@@ -169,7 +169,47 @@ var CustomFormFields = function (_a) {
|
|
|
169
169
|
return null;
|
|
170
170
|
}
|
|
171
171
|
};
|
|
172
|
-
|
|
172
|
+
// Un champ est masqué quand il est verrouillé depuis l'API :
|
|
173
|
+
// - hard lock (lockedFromApi sans editableIfMissing) → toujours masqué ;
|
|
174
|
+
// - soft lock (editableIfMissing) → masqué uniquement si l'API a fourni une
|
|
175
|
+
// valeur ; sinon le champ redevient éditable par l'utilisateur final.
|
|
176
|
+
var isValuePresent = function (value) {
|
|
177
|
+
if (value === null || value === undefined)
|
|
178
|
+
return false;
|
|
179
|
+
if (typeof value === "string")
|
|
180
|
+
return value.trim().length > 0;
|
|
181
|
+
if (Array.isArray(value))
|
|
182
|
+
return value.length > 0;
|
|
183
|
+
return true;
|
|
184
|
+
};
|
|
185
|
+
// La décision de visibilité d'un soft lock se fige à l'OUVERTURE du nœud,
|
|
186
|
+
// pas à chaque frappe : on capture une seule fois (au mount, via ref) les
|
|
187
|
+
// soft locks dont l'API n'avait fourni AUCUNE valeur. Ceux-là restent
|
|
188
|
+
// éditables ensuite, même quand l'utilisateur commence à taper (sinon le
|
|
189
|
+
// champ se masquerait dès le 1er caractère puisque formData deviendrait
|
|
190
|
+
// non vide). Le composant est remonté par nœud (key={node.id}), donc le
|
|
191
|
+
// snapshot est bien réinitialisé à chaque entrée de nœud.
|
|
192
|
+
var editableSoftLocksRef = useRef(null);
|
|
193
|
+
if (editableSoftLocksRef.current === null) {
|
|
194
|
+
var ids = new Set();
|
|
195
|
+
for (var _i = 0, customFields_1 = customFields; _i < customFields_1.length; _i++) {
|
|
196
|
+
var f = customFields_1[_i];
|
|
197
|
+
if (f.lockedFromApi && f.editableIfMissing && !isValuePresent(formData[f.id])) {
|
|
198
|
+
ids.add(f.id);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
editableSoftLocksRef.current = ids;
|
|
202
|
+
}
|
|
203
|
+
var editableSoftLocks = editableSoftLocksRef.current;
|
|
204
|
+
var isLockedHidden = function (f) {
|
|
205
|
+
if (!f.lockedFromApi)
|
|
206
|
+
return false;
|
|
207
|
+
if (!f.editableIfMissing)
|
|
208
|
+
return true;
|
|
209
|
+
// soft lock : visible seulement s'il était vide à l'ouverture du nœud
|
|
210
|
+
return !editableSoftLocks.has(f.id);
|
|
211
|
+
};
|
|
212
|
+
var visibleFields = customFields.filter(function (f) { return !isLockedHidden(f); });
|
|
173
213
|
return (jsx(Fragment, { children: visibleFields.map(function (field) { return (jsxs("div", { className: "space-y-2", children: [jsxs(Label.Root, { htmlFor: field.id, className: "block text-sm md:text-base font-semibold text-gray-900", children: [field.label, field.required && jsx("span", { className: "text-red-500 ml-1", children: "*" })] }), field.description && field.valueType !== "boolean" && (jsx("p", { className: "text-xs text-gray-500 -mt-1", children: field.description })), renderField(field), (function () {
|
|
174
214
|
var fieldErr = errors[field.id];
|
|
175
215
|
if (!fieldErr)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFormFields.js","sources":["../../../../../../src/components/session/UserInputForm/CustomFormFields.tsx"],"sourcesContent":["import { Fragment } 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 const visibleFields = customFields.filter((f) => !f.lockedFromApi);\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 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","_jsxs"],"mappings":"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"}
|
|
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 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","_jsxs"],"mappings":"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"}
|
|
@@ -23,7 +23,7 @@ var FIELD_KEY_TO_USER_INPUT = {
|
|
|
23
23
|
tva: function (ui) { return ui.tva; },
|
|
24
24
|
};
|
|
25
25
|
var SignatureElectronic = function (_a) {
|
|
26
|
-
var sessionId = _a.sessionId, stepObject = _a.stepObject, title = _a.title, description = _a.description, external_id = _a.external_id, fieldMappings = _a.fieldMappings, userInput = _a.userInput, contactInfo = _a.contactInfo;
|
|
26
|
+
var sessionId = _a.sessionId, stepObject = _a.stepObject, node = _a.node, session = _a.session, title = _a.title, description = _a.description, external_id = _a.external_id, fieldMappings = _a.fieldMappings, userInput = _a.userInput, contactInfo = _a.contactInfo;
|
|
27
27
|
var t = useTranslation("translation", { i18n: sdkI18n }).t;
|
|
28
28
|
var signatureViewStorageKey = useMemo(function () { return "dk-signature-open:".concat(sessionId, ":").concat(external_id !== null && external_id !== void 0 ? external_id : "no-template"); }, [sessionId, external_id]);
|
|
29
29
|
var _b = useState(function () {
|
|
@@ -101,8 +101,8 @@ var SignatureElectronic = function (_a) {
|
|
|
101
101
|
console.error("[SignatureElectronic] Failed to update session status:", err_1);
|
|
102
102
|
return [3 /*break*/, 4];
|
|
103
103
|
case 4:
|
|
104
|
-
// Progress to the next step
|
|
105
|
-
stepObject.
|
|
104
|
+
// Progress to the next step via graph edges (pas d'arithmétique — évite de sauter dans la mauvaise branche)
|
|
105
|
+
stepObject.goToNextStep(node.id, session.template);
|
|
106
106
|
return [2 /*return*/];
|
|
107
107
|
}
|
|
108
108
|
});
|
|
@@ -115,8 +115,7 @@ var SignatureElectronic = function (_a) {
|
|
|
115
115
|
if (typeof window !== "undefined") {
|
|
116
116
|
window.sessionStorage.removeItem(signatureViewStorageKey);
|
|
117
117
|
}
|
|
118
|
-
|
|
119
|
-
stepObject.setStep(stepObject.step - 1);
|
|
118
|
+
stepObject.goBack();
|
|
120
119
|
}
|
|
121
120
|
};
|
|
122
121
|
if (showSignature && external_id) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignatureElectronic.js","sources":["../../../../../src/components/signature-electronic/SignatureElectronic.tsx"],"sourcesContent":["import React, { useState, useMemo, useEffect } from \"react\";\nimport type { stepObject, SessionTemplateNode } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\nimport type { ContactInfo } from \"../../types/contactInfo\";\nimport { useTranslation } from \"react-i18next\";\nimport sdkI18n from \"../../i18n\";\nimport SignatureElectronicIntroduction from \"./SignatureElectronicIntroduction\";\nimport DocusealSignature from \"./DocusealSignature\";\nimport { updateSessionStatus } from \"../../services/sessionService\";\n\n/**\n * Maps an InformationFieldKey (journey field) to the corresponding UserInput key.\n * This bridges the admin-defined field names to the actual data collected in the SDK.\n */\nconst FIELD_KEY_TO_USER_INPUT: Record<string, (ui: UserInput, ci?: ContactInfo) => string | undefined> = {\n nom: (ui) => ui.lastName,\n prenom: (ui) => ui.firstName,\n date_naissance: (ui) => ui.birthDate,\n email: (ui, ci) => ui.email || ci?.email,\n sms: (ui, ci) => ui.sms || ui.phoneNumber || ci?.phoneNumber,\n adresse: (ui) => [ui.addressLine1, ui.addressLine2, ui.postalCode, ui.city, ui.countryCode].filter(Boolean).join(', '),\n nationalite: (ui) => ui.nationality,\n siret: (ui) => ui.siret,\n tva: (ui) => ui.tva,\n};\n\ninterface SignatureElectronicProps {\n sessionId: string;\n stepObject: stepObject;\n title?: string;\n description?: string;\n external_id?: string;\n fieldMappings?: SessionTemplateNode['fieldMappings'];\n userInput?: UserInput;\n contactInfo?: ContactInfo;\n}\n\nconst SignatureElectronic: React.FC<SignatureElectronicProps> = ({\n sessionId,\n stepObject,\n title,\n description,\n external_id,\n fieldMappings,\n userInput,\n contactInfo,\n}) => {\n const { t } = useTranslation(\"translation\", { i18n: sdkI18n });\n const signatureViewStorageKey = useMemo(() => `dk-signature-open:${sessionId}:${external_id ?? \"no-template\"}`, [sessionId, external_id]);\n const [showSignature, setShowSignature] = useState<boolean>(() => {\n if (typeof window === \"undefined\") return false;\n return window.sessionStorage.getItem(signatureViewStorageKey) === \"1\";\n });\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n if (showSignature) {\n window.sessionStorage.setItem(signatureViewStorageKey, \"1\");\n } else {\n window.sessionStorage.removeItem(signatureViewStorageKey);\n }\n }, [showSignature, signatureViewStorageKey]);\n\n /**\n * Build the pre-fill values object from userInput + fieldMappings.\n * Maps each configured field to its value from userInput.\n * Used by DocusealForm's `values` prop for client-side pre-filling.\n */\n const prefillValues = useMemo<Record<string, string> | undefined>(() => {\n if (!fieldMappings || !userInput) return undefined;\n\n const values: Record<string, string> = {};\n\n fieldMappings.forEach(mapping => {\n const resolver = FIELD_KEY_TO_USER_INPUT[mapping.sourceFieldId];\n let value: string | undefined;\n\n if (resolver) {\n value = resolver(userInput, contactInfo);\n } else if (userInput.customFormData) {\n const raw = userInput.customFormData[mapping.sourceFieldId];\n value = raw != null ? String(raw) : undefined;\n }\n\n if (value !== undefined && value !== '') {\n values[mapping.sourceFieldId] = value;\n }\n });\n\n return Object.keys(values).length > 0 ? values : undefined;\n }, [fieldMappings, userInput, contactInfo]);\n\n /**\n * Build the list of field names that should be read-only in the signing form.\n * Only includes fields that are both mapped AND marked as readonly by the admin.\n */\n const readonlyFieldNames = useMemo<string[] | undefined>(() => {\n if (!fieldMappings) return undefined;\n\n const names = fieldMappings\n .filter(m => m.readonly)\n .map(m => m.sourceFieldId);\n\n return names.length > 0 ? names : undefined;\n }, [fieldMappings]);\n\n const handleContinue = () => {\n setShowSignature(true);\n };\n\n const handleComplete = async () => {\n if (typeof window !== \"undefined\") {\n window.sessionStorage.removeItem(signatureViewStorageKey);\n }\n try {\n await updateSessionStatus(sessionId, \"conform\");\n } catch (err) {\n console.error(\"[SignatureElectronic] Failed to update session status:\", err);\n // Non-bloquant : l'utilisateur avance quoi qu'il arrive\n }\n // Progress to the next step in the journey\n stepObject.setStep(stepObject.step + 1);\n };\n\n const handleBack = () => {\n if (showSignature) {\n setShowSignature(false);\n } else {\n if (typeof window !== \"undefined\") {\n window.sessionStorage.removeItem(signatureViewStorageKey);\n }\n // Go back to the previous step in the journey\n stepObject.setStep(stepObject.step - 1);\n }\n };\n\n if (showSignature && external_id) {\n return (\n <DocusealSignature\n sessionId={sessionId}\n templateId={external_id}\n templateName={title}\n onComplete={handleComplete}\n onBack={handleBack}\n prefillValues={prefillValues}\n readonlyFieldNames={readonlyFieldNames}\n />\n );\n }\n\n if (showSignature && !external_id) {\n // No template configured — show error instead of silently falling back to intro\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"signature.error_title\", \"Erreur\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\"signature.no_template\", \"Le modèle de signature n'est pas configuré.\")}\n </p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={handleBack}\n >\n {t(\"buttons.back\", \"Retour\")}\n </button>\n </div>\n );\n }\n\n return (\n <SignatureElectronicIntroduction\n onContinue={handleContinue}\n onBack={handleBack}\n title={title}\n description={description}\n />\n );\n};\n\nexport default SignatureElectronic;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SignatureElectronic.js","sources":["../../../../../src/components/signature-electronic/SignatureElectronic.tsx"],"sourcesContent":["import React, { useState, useMemo, useEffect } from \"react\";\nimport type { stepObject, SessionTemplateNode, SessionData } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\nimport type { ContactInfo } from \"../../types/contactInfo\";\nimport { useTranslation } from \"react-i18next\";\nimport sdkI18n from \"../../i18n\";\nimport SignatureElectronicIntroduction from \"./SignatureElectronicIntroduction\";\nimport DocusealSignature from \"./DocusealSignature\";\nimport { updateSessionStatus } from \"../../services/sessionService\";\n\n/**\n * Maps an InformationFieldKey (journey field) to the corresponding UserInput key.\n * This bridges the admin-defined field names to the actual data collected in the SDK.\n */\nconst FIELD_KEY_TO_USER_INPUT: Record<string, (ui: UserInput, ci?: ContactInfo) => string | undefined> = {\n nom: (ui) => ui.lastName,\n prenom: (ui) => ui.firstName,\n date_naissance: (ui) => ui.birthDate,\n email: (ui, ci) => ui.email || ci?.email,\n sms: (ui, ci) => ui.sms || ui.phoneNumber || ci?.phoneNumber,\n adresse: (ui) => [ui.addressLine1, ui.addressLine2, ui.postalCode, ui.city, ui.countryCode].filter(Boolean).join(', '),\n nationalite: (ui) => ui.nationality,\n siret: (ui) => ui.siret,\n tva: (ui) => ui.tva,\n};\n\ninterface SignatureElectronicProps {\n sessionId: string;\n stepObject: stepObject;\n node: SessionTemplateNode;\n session: SessionData;\n title?: string;\n description?: string;\n external_id?: string;\n fieldMappings?: SessionTemplateNode['fieldMappings'];\n userInput?: UserInput;\n contactInfo?: ContactInfo;\n}\n\nconst SignatureElectronic: React.FC<SignatureElectronicProps> = ({\n sessionId,\n stepObject,\n node,\n session,\n title,\n description,\n external_id,\n fieldMappings,\n userInput,\n contactInfo,\n}) => {\n const { t } = useTranslation(\"translation\", { i18n: sdkI18n });\n const signatureViewStorageKey = useMemo(() => `dk-signature-open:${sessionId}:${external_id ?? \"no-template\"}`, [sessionId, external_id]);\n const [showSignature, setShowSignature] = useState<boolean>(() => {\n if (typeof window === \"undefined\") return false;\n return window.sessionStorage.getItem(signatureViewStorageKey) === \"1\";\n });\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n if (showSignature) {\n window.sessionStorage.setItem(signatureViewStorageKey, \"1\");\n } else {\n window.sessionStorage.removeItem(signatureViewStorageKey);\n }\n }, [showSignature, signatureViewStorageKey]);\n\n /**\n * Build the pre-fill values object from userInput + fieldMappings.\n * Maps each configured field to its value from userInput.\n * Used by DocusealForm's `values` prop for client-side pre-filling.\n */\n const prefillValues = useMemo<Record<string, string> | undefined>(() => {\n if (!fieldMappings || !userInput) return undefined;\n\n const values: Record<string, string> = {};\n\n fieldMappings.forEach(mapping => {\n const resolver = FIELD_KEY_TO_USER_INPUT[mapping.sourceFieldId];\n let value: string | undefined;\n\n if (resolver) {\n value = resolver(userInput, contactInfo);\n } else if (userInput.customFormData) {\n const raw = userInput.customFormData[mapping.sourceFieldId];\n value = raw != null ? String(raw) : undefined;\n }\n\n if (value !== undefined && value !== '') {\n values[mapping.sourceFieldId] = value;\n }\n });\n\n return Object.keys(values).length > 0 ? values : undefined;\n }, [fieldMappings, userInput, contactInfo]);\n\n /**\n * Build the list of field names that should be read-only in the signing form.\n * Only includes fields that are both mapped AND marked as readonly by the admin.\n */\n const readonlyFieldNames = useMemo<string[] | undefined>(() => {\n if (!fieldMappings) return undefined;\n\n const names = fieldMappings\n .filter(m => m.readonly)\n .map(m => m.sourceFieldId);\n\n return names.length > 0 ? names : undefined;\n }, [fieldMappings]);\n\n const handleContinue = () => {\n setShowSignature(true);\n };\n\n const handleComplete = async () => {\n if (typeof window !== \"undefined\") {\n window.sessionStorage.removeItem(signatureViewStorageKey);\n }\n try {\n await updateSessionStatus(sessionId, \"conform\");\n } catch (err) {\n console.error(\"[SignatureElectronic] Failed to update session status:\", err);\n // Non-bloquant : l'utilisateur avance quoi qu'il arrive\n }\n // Progress to the next step via graph edges (pas d'arithmétique — évite de sauter dans la mauvaise branche)\n stepObject.goToNextStep(node.id, session.template);\n };\n\n const handleBack = () => {\n if (showSignature) {\n setShowSignature(false);\n } else {\n if (typeof window !== \"undefined\") {\n window.sessionStorage.removeItem(signatureViewStorageKey);\n }\n stepObject.goBack();\n }\n };\n\n if (showSignature && external_id) {\n return (\n <DocusealSignature\n sessionId={sessionId}\n templateId={external_id}\n templateName={title}\n onComplete={handleComplete}\n onBack={handleBack}\n prefillValues={prefillValues}\n readonlyFieldNames={readonlyFieldNames}\n />\n );\n }\n\n if (showSignature && !external_id) {\n // No template configured — show error instead of silently falling back to intro\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"signature.error_title\", \"Erreur\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\"signature.no_template\", \"Le modèle de signature n'est pas configuré.\")}\n </p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={handleBack}\n >\n {t(\"buttons.back\", \"Retour\")}\n </button>\n </div>\n );\n }\n\n return (\n <SignatureElectronicIntroduction\n onContinue={handleContinue}\n onBack={handleBack}\n title={title}\n description={description}\n />\n );\n};\n\nexport default SignatureElectronic;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -71,7 +71,7 @@ var ConditionNodeHandler = function (_a) {
|
|
|
71
71
|
stepObject.goToNextStep(node.id, freshSession.template, "true");
|
|
72
72
|
return [2 /*return*/];
|
|
73
73
|
}
|
|
74
|
-
if (node.conditionFalseMode
|
|
74
|
+
if (node.conditionFalseMode !== "retry") {
|
|
75
75
|
stepObject.goToNextStep(node.id, freshSession.template, "false");
|
|
76
76
|
return [2 /*return*/];
|
|
77
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConditionNodeHandler.js","sources":["../../../../../src/components/template/ConditionNodeHandler.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport LoadingState from \"../states/LoadingState\";\nimport type { SessionData, SessionTemplateNode } from \"../../types/session\";\nimport type { stepObject } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\nimport type { ContactInfo } from \"../../types/contactInfo\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport {\n evaluateConditionTokens,\n parseConditionExpression,\n} from \"../../utils/conditionEvaluator\";\nimport {\n fetchSessionById,\n findOutgoingEdge,\n} from \"../../services/sessionService\";\nimport {\n getNodeRetryCount,\n updateNodeRetryCount,\n} from \"../../services/retryService\";\nimport {\n hasExceededConditionMaxRetries,\n normalizeConditionMaxRetries,\n normalizeConditionMaxRetryAction,\n} from \"./conditionNodePolicy\";\n\ninterface ConditionNodeHandlerProps {\n node: SessionTemplateNode;\n session: SessionData;\n templateNodes: SessionTemplateNode[];\n stepObject: stepObject;\n userInput: UserInput;\n contactInfo: ContactInfo;\n}\n\ninterface FalseConditionState {\n message: string;\n retryCount: number;\n maxRetries: number;\n template: SessionData[\"template\"];\n}\n\nconst ConditionNodeHandler: React.FC<ConditionNodeHandlerProps> = ({\n node,\n session,\n templateNodes,\n stepObject,\n userInput,\n contactInfo,\n}) => {\n const { t } = useI18n();\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [isLoadingSession, setIsLoadingSession] = useState(false);\n const [falseConditionState, setFalseConditionState] =\n useState<FalseConditionState | null>(null);\n const hasEvaluatedRef = useRef(false);\n\n const tokens = useMemo(() => {\n return (\n (node.conditionTokens && node.conditionTokens.length > 0\n ? node.conditionTokens\n : parseConditionExpression(node.conditionExpression || \"\")) || []\n );\n }, [node.conditionExpression, node.conditionTokens]);\n\n useEffect(() => {\n hasEvaluatedRef.current = false;\n setErrorMessage(null);\n setFalseConditionState(null);\n }, [node.id]);\n\n useEffect(() => {\n if (hasEvaluatedRef.current) {\n return;\n }\n hasEvaluatedRef.current = true;\n\n const evaluateCondition = async () => {\n if (!session?.template) {\n setErrorMessage(\n t(\n \"condition_node.error_missing_template\",\n \"Aucun template disponible pour évaluer la condition.\",\n ),\n );\n return;\n }\n\n if (tokens.length === 0) {\n setErrorMessage(\n t(\n \"condition_node.error_missing_tokens\",\n \"Aucune expression de condition n'est définie pour ce nœud.\",\n ),\n );\n return;\n }\n\n setIsLoadingSession(true);\n let freshSession: SessionData;\n try {\n freshSession = await fetchSessionById(session.id);\n } catch (error) {\n console.error(\"[ConditionNodeHandler] Error fetching fresh session:\", error);\n freshSession = session;\n } finally {\n setIsLoadingSession(false);\n }\n\n try {\n const evaluationResult = evaluateConditionTokens(tokens, {\n session: freshSession,\n userInput,\n contactInfo,\n });\n\n if (evaluationResult) {\n stepObject.goToNextStep(node.id, freshSession.template, \"true\");\n return;\n }\n\n if (node.conditionFalseMode === \"loop\") {\n stepObject.goToNextStep(node.id, freshSession.template, \"false\");\n return;\n }\n\n const maxRetries = normalizeConditionMaxRetries(node.conditionMaxRetries);\n const maxRetryAction = normalizeConditionMaxRetryAction(\n node.conditionMaxRetryAction,\n );\n const currentRetryCount = getNodeRetryCount(freshSession, node.id);\n const retryCountAfterFailure = currentRetryCount + 1;\n\n try {\n await updateNodeRetryCount(\n session.id,\n node.id,\n retryCountAfterFailure,\n );\n } catch (retryError) {\n console.error(\n \"[ConditionNodeHandler] Failed to persist retry count:\",\n retryError,\n );\n }\n\n if (\n hasExceededConditionMaxRetries(retryCountAfterFailure, maxRetries)\n ) {\n if (maxRetryAction === \"force-true\") {\n stepObject.goToNextStep(node.id, freshSession.template, \"true\");\n return;\n }\n stepObject.goToNextStep(node.id, freshSession.template, \"false\");\n return;\n }\n\n const falseEdge = findOutgoingEdge(node.id, freshSession.template, \"false\");\n if (!falseEdge) {\n throw new Error(\"No outgoing false edge defined for condition node\");\n }\n\n setFalseConditionState({\n message:\n node.conditionFalseErrorMessage?.trim() ||\n t(\n \"condition_node.false_error_default\",\n \"Les informations ne respectent pas les conditions demandées.\",\n ),\n retryCount: retryCountAfterFailure,\n maxRetries,\n template: freshSession.template,\n });\n } catch (error) {\n console.error(\"Failed to evaluate condition node\", error);\n setErrorMessage(\n t(\n \"condition_node.error_evaluation\",\n \"Impossible d'évaluer cette condition. Vous pouvez poursuivre manuellement.\",\n ),\n );\n }\n };\n\n evaluateCondition();\n }, [contactInfo, node, session, stepObject, t, tokens, userInput, templateNodes]);\n\n const handleRetry = () => {\n if (!falseConditionState) {\n return;\n }\n stepObject.goToNextStep(node.id, falseConditionState.template, \"false\");\n };\n\n if (isLoadingSession) {\n return (\n <LoadingState\n message={t(\n \"condition_node.loading_analysis\",\n \"Chargement des données d'analyse...\",\n )}\n subtitle={t(\n \"condition_node.loading_description\",\n \"Récupération des informations nécessaires pour évaluer la condition.\",\n )}\n />\n );\n }\n\n if (falseConditionState) {\n return (\n <div className=\"flex flex-col justify-between h-full w-full\">\n <div className=\"flex-1 px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n <div className=\"text-center\">\n <div className=\"mx-auto w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mb-4\">\n <div className=\"w-8 h-8 bg-red-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-lg\">✕</span>\n </div>\n </div>\n </div>\n\n <div className=\"text-center space-y-4\">\n <h2 className=\"text-xl font-bold text-red-600\">\n {t(\"condition_node.false_error_title\", \"Condition non remplie\")}\n </h2>\n <p className=\"text-sm text-gray-600 leading-relaxed\">\n {falseConditionState.message}\n </p>\n </div>\n\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <p className=\"text-sm text-orange-800\">\n {t(\n \"condition_node.retry_counter\",\n \"Tentative {{current}}/{{max}}\",\n {\n current: falseConditionState.retryCount,\n max: falseConditionState.maxRetries,\n },\n )}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"sticky bottom-0 md:static bg-white border-t md:border-t-0 p-4 md:p-0 md:pb-8\">\n <div className=\"w-full max-w-md mx-auto\">\n <button\n className=\"w-full px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={handleRetry}\n >\n {t(\"condition_node.buttons.retry\", \"Réessayer\")}\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n if (errorMessage) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"condition_node.title\", \"Condition\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">{errorMessage}</p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => stepObject.setStep(stepObject.step + 1)}\n >\n {t(\"condition_node.buttons.skip\", \"Continuer\")}\n </button>\n </div>\n );\n }\n\n return (\n <LoadingState\n message={t(\n \"condition_node.evaluating\",\n \"Évaluation de la condition en cours...\",\n )}\n subtitle={t(\n \"condition_node.evaluating_description\",\n \"Merci de patienter pendant que nous déterminons la prochaine étape.\",\n )}\n />\n );\n};\n\nexport default ConditionNodeHandler;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ConditionNodeHandler.js","sources":["../../../../../src/components/template/ConditionNodeHandler.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport LoadingState from \"../states/LoadingState\";\nimport type { SessionData, SessionTemplateNode } from \"../../types/session\";\nimport type { stepObject } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\nimport type { ContactInfo } from \"../../types/contactInfo\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport {\n evaluateConditionTokens,\n parseConditionExpression,\n} from \"../../utils/conditionEvaluator\";\nimport {\n fetchSessionById,\n findOutgoingEdge,\n} from \"../../services/sessionService\";\nimport {\n getNodeRetryCount,\n updateNodeRetryCount,\n} from \"../../services/retryService\";\nimport {\n hasExceededConditionMaxRetries,\n normalizeConditionMaxRetries,\n normalizeConditionMaxRetryAction,\n} from \"./conditionNodePolicy\";\n\ninterface ConditionNodeHandlerProps {\n node: SessionTemplateNode;\n session: SessionData;\n templateNodes: SessionTemplateNode[];\n stepObject: stepObject;\n userInput: UserInput;\n contactInfo: ContactInfo;\n}\n\ninterface FalseConditionState {\n message: string;\n retryCount: number;\n maxRetries: number;\n template: SessionData[\"template\"];\n}\n\nconst ConditionNodeHandler: React.FC<ConditionNodeHandlerProps> = ({\n node,\n session,\n templateNodes,\n stepObject,\n userInput,\n contactInfo,\n}) => {\n const { t } = useI18n();\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n const [isLoadingSession, setIsLoadingSession] = useState(false);\n const [falseConditionState, setFalseConditionState] =\n useState<FalseConditionState | null>(null);\n const hasEvaluatedRef = useRef(false);\n\n const tokens = useMemo(() => {\n return (\n (node.conditionTokens && node.conditionTokens.length > 0\n ? node.conditionTokens\n : parseConditionExpression(node.conditionExpression || \"\")) || []\n );\n }, [node.conditionExpression, node.conditionTokens]);\n\n useEffect(() => {\n hasEvaluatedRef.current = false;\n setErrorMessage(null);\n setFalseConditionState(null);\n }, [node.id]);\n\n useEffect(() => {\n if (hasEvaluatedRef.current) {\n return;\n }\n hasEvaluatedRef.current = true;\n\n const evaluateCondition = async () => {\n if (!session?.template) {\n setErrorMessage(\n t(\n \"condition_node.error_missing_template\",\n \"Aucun template disponible pour évaluer la condition.\",\n ),\n );\n return;\n }\n\n if (tokens.length === 0) {\n setErrorMessage(\n t(\n \"condition_node.error_missing_tokens\",\n \"Aucune expression de condition n'est définie pour ce nœud.\",\n ),\n );\n return;\n }\n\n setIsLoadingSession(true);\n let freshSession: SessionData;\n try {\n freshSession = await fetchSessionById(session.id);\n } catch (error) {\n console.error(\"[ConditionNodeHandler] Error fetching fresh session:\", error);\n freshSession = session;\n } finally {\n setIsLoadingSession(false);\n }\n\n try {\n const evaluationResult = evaluateConditionTokens(tokens, {\n session: freshSession,\n userInput,\n contactInfo,\n });\n\n if (evaluationResult) {\n stepObject.goToNextStep(node.id, freshSession.template, \"true\");\n return;\n }\n\n if (node.conditionFalseMode !== \"retry\") {\n stepObject.goToNextStep(node.id, freshSession.template, \"false\");\n return;\n }\n\n const maxRetries = normalizeConditionMaxRetries(node.conditionMaxRetries);\n const maxRetryAction = normalizeConditionMaxRetryAction(\n node.conditionMaxRetryAction,\n );\n const currentRetryCount = getNodeRetryCount(freshSession, node.id);\n const retryCountAfterFailure = currentRetryCount + 1;\n\n try {\n await updateNodeRetryCount(\n session.id,\n node.id,\n retryCountAfterFailure,\n );\n } catch (retryError) {\n console.error(\n \"[ConditionNodeHandler] Failed to persist retry count:\",\n retryError,\n );\n }\n\n if (\n hasExceededConditionMaxRetries(retryCountAfterFailure, maxRetries)\n ) {\n if (maxRetryAction === \"force-true\") {\n stepObject.goToNextStep(node.id, freshSession.template, \"true\");\n return;\n }\n stepObject.goToNextStep(node.id, freshSession.template, \"false\");\n return;\n }\n\n const falseEdge = findOutgoingEdge(node.id, freshSession.template, \"false\");\n if (!falseEdge) {\n throw new Error(\"No outgoing false edge defined for condition node\");\n }\n\n setFalseConditionState({\n message:\n node.conditionFalseErrorMessage?.trim() ||\n t(\n \"condition_node.false_error_default\",\n \"Les informations ne respectent pas les conditions demandées.\",\n ),\n retryCount: retryCountAfterFailure,\n maxRetries,\n template: freshSession.template,\n });\n } catch (error) {\n console.error(\"Failed to evaluate condition node\", error);\n setErrorMessage(\n t(\n \"condition_node.error_evaluation\",\n \"Impossible d'évaluer cette condition. Vous pouvez poursuivre manuellement.\",\n ),\n );\n }\n };\n\n evaluateCondition();\n }, [contactInfo, node, session, stepObject, t, tokens, userInput, templateNodes]);\n\n const handleRetry = () => {\n if (!falseConditionState) {\n return;\n }\n stepObject.goToNextStep(node.id, falseConditionState.template, \"false\");\n };\n\n if (isLoadingSession) {\n return (\n <LoadingState\n message={t(\n \"condition_node.loading_analysis\",\n \"Chargement des données d'analyse...\",\n )}\n subtitle={t(\n \"condition_node.loading_description\",\n \"Récupération des informations nécessaires pour évaluer la condition.\",\n )}\n />\n );\n }\n\n if (falseConditionState) {\n return (\n <div className=\"flex flex-col justify-between h-full w-full\">\n <div className=\"flex-1 px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n <div className=\"text-center\">\n <div className=\"mx-auto w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mb-4\">\n <div className=\"w-8 h-8 bg-red-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-lg\">✕</span>\n </div>\n </div>\n </div>\n\n <div className=\"text-center space-y-4\">\n <h2 className=\"text-xl font-bold text-red-600\">\n {t(\"condition_node.false_error_title\", \"Condition non remplie\")}\n </h2>\n <p className=\"text-sm text-gray-600 leading-relaxed\">\n {falseConditionState.message}\n </p>\n </div>\n\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <p className=\"text-sm text-orange-800\">\n {t(\n \"condition_node.retry_counter\",\n \"Tentative {{current}}/{{max}}\",\n {\n current: falseConditionState.retryCount,\n max: falseConditionState.maxRetries,\n },\n )}\n </p>\n </div>\n </div>\n </div>\n\n <div className=\"sticky bottom-0 md:static bg-white border-t md:border-t-0 p-4 md:p-0 md:pb-8\">\n <div className=\"w-full max-w-md mx-auto\">\n <button\n className=\"w-full px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={handleRetry}\n >\n {t(\"condition_node.buttons.retry\", \"Réessayer\")}\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n if (errorMessage) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"condition_node.title\", \"Condition\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">{errorMessage}</p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => stepObject.setStep(stepObject.step + 1)}\n >\n {t(\"condition_node.buttons.skip\", \"Continuer\")}\n </button>\n </div>\n );\n }\n\n return (\n <LoadingState\n message={t(\n \"condition_node.evaluating\",\n \"Évaluation de la condition en cours...\",\n )}\n subtitle={t(\n \"condition_node.evaluating_description\",\n \"Merci de patienter pendant que nous déterminons la prochaine étape.\",\n )}\n />\n );\n};\n\nexport default ConditionNodeHandler;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -110,7 +110,7 @@ var TemplateNodeRenderer = function (_a) {
|
|
|
110
110
|
case "selfie-capture":
|
|
111
111
|
return (jsx(Selfie, { stepObject: stepObject, sessionId: sessionId, node: node, template: session.template }, "selfie-".concat(templateIndex)));
|
|
112
112
|
case "signature-electronic":
|
|
113
|
-
return (jsx(SignatureElectronic, { sessionId: sessionId, stepObject: stepObject, title: node.title, description: node.description,
|
|
113
|
+
return (jsx(SignatureElectronic, { sessionId: sessionId, stepObject: stepObject, node: node, session: session, title: node.title, description: node.description,
|
|
114
114
|
// Always pass a stable node identifier so backend can resolve
|
|
115
115
|
// either a static DocuSeal template OR a generated PDF source.
|
|
116
116
|
external_id: node.templateId || node.external_id || node.id, fieldMappings: node.fieldMappings, userInput: userInput, contactInfo: contactInfo }, "signature-".concat(templateIndex)));
|