datakeen-session-react 1.1.140-rc.74 → 1.1.140-rc.75
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 +10 -4
- 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/TemplateNodeRenderer.js +1 -1
- package/dist/cjs/components/template/TemplateNodeRenderer.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/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/TemplateNodeRenderer.js +1 -1
- package/dist/esm/components/template/TemplateNodeRenderer.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/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conditionEvaluator.js","sources":["../../../../src/utils/conditionEvaluator.ts"],"sourcesContent":["import type { ConditionToken, ConditionTokenType, SessionData } from \"../types/session\";\nimport type { UserInput } from \"../types/userInput\";\nimport type { ContactInfo } from \"../types/contactInfo\";\n\nexport interface ConditionEvaluationContext {\n session: SessionData;\n userInput?: UserInput | Record<string, unknown>;\n contactInfo?: ContactInfo | Record<string, unknown>;\n}\n\nconst LOGICAL_OPERATORS = new Set([\"&&\", \"||\"]);\nconst COMPARISON_OPERATORS = new Set([\"==\", \"===\", \"!=\", \"!==\", \">\", \">=\", \"<\", \"<=\"]);\n\ninterface ComparisonTerm {\n left?: ConditionToken;\n operator?: string;\n right?: ConditionToken;\n}\n\nexport const parseConditionExpression = (expression?: string): ConditionToken[] => {\n if (!expression) {\n return [];\n }\n\n const cleanedExpression = expression.replace(/\\s+/g, \" \").trim();\n if (!cleanedExpression) {\n return [];\n }\n\n const regex = /(===|!==|==|!=|<=|>=|\\&\\&|\\|\\||<|>)|(\"(?:[^\"\\\\]|\\\\.)*\")|([^\\s]+)/g;\n const tokens: ConditionToken[] = [];\n let match: RegExpExecArray | null;\n while ((match = regex.exec(cleanedExpression)) !== null) {\n const value = match[0];\n\n if (LOGICAL_OPERATORS.has(value) || COMPARISON_OPERATORS.has(value)) {\n tokens.push({ type: \"operator\", value });\n } else {\n const isQuoted = value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\");\n const literal = isQuoted ? value.slice(1, -1) : value;\n const tokenType: ConditionTokenType = isQuoted\n ? \"input\"\n : determineOperandType(literal);\n tokens.push({ type: tokenType, value: literal });\n }\n }\n\n return tokens;\n};\n\nexport const evaluateConditionTokens = (\n tokens: ConditionToken[] = [],\n context: ConditionEvaluationContext\n): boolean => {\n if (!tokens || tokens.length === 0) {\n console.warn(\"[ConditionEvaluator] No tokens provided\");\n return false;\n }\n\n const { terms, logicalOperators } = buildComparisonTerms(tokens);\n\n if (terms.length === 0) {\n console.warn(\"[ConditionEvaluator] No comparison terms built\");\n return false;\n }\n\n const termResults = terms.map((term) => evaluateComparison(term, context));\n\n if (termResults.length === 1) {\n return termResults[0];\n }\n\n const finalResult = termResults.reduce((acc, result, index) => {\n if (index === 0) {\n return result;\n }\n const logicalOperator = logicalOperators[index - 1] || \"&&\";\n return logicalOperator === \"||\" ? acc || result : acc && result;\n }, true);\n\n return finalResult;\n};\n\nconst buildComparisonTerms = (tokens: ConditionToken[]) => {\n const terms: ComparisonTerm[] = [];\n const logicalOperators: string[] = [];\n let currentTerm: ComparisonTerm = {};\n\n tokens.forEach((token) => {\n if (token.type === \"operator\") {\n if (LOGICAL_OPERATORS.has(token.value)) {\n // If we have a left operand without comparison operator, treat it as a boolean term\n if (currentTerm.left && !currentTerm.operator) {\n terms.push({ left: currentTerm.left, operator: \"truthy\", right: undefined });\n logicalOperators.push(token.value);\n currentTerm = {};\n } else if (currentTerm.left && currentTerm.operator && currentTerm.right) {\n terms.push(currentTerm);\n logicalOperators.push(token.value);\n currentTerm = {};\n }\n } else if (COMPARISON_OPERATORS.has(token.value)) {\n currentTerm.operator = token.value;\n }\n } else {\n if (!currentTerm.left) {\n currentTerm.left = token;\n } else if (!currentTerm.right) {\n currentTerm.right = token;\n } else {\n currentTerm = { left: token };\n }\n }\n });\n\n // Handle the last term\n if (currentTerm.left) {\n if (!currentTerm.operator) {\n terms.push({ left: currentTerm.left, operator: \"truthy\", right: undefined });\n } else if (currentTerm.right) {\n terms.push(currentTerm);\n }\n }\n\n return { terms, logicalOperators };\n};\n\nconst evaluateComparison = (\n term: ComparisonTerm,\n context: ConditionEvaluationContext\n): boolean => {\n if (!term.left || !term.operator) {\n console.warn(\"[EvaluateComparison] Incomplete term - missing left or operator\");\n return false;\n }\n\n // Handle boolean/truthy evaluation (no right operand)\n if (term.operator === \"truthy\") {\n const leftValue = resolveTokenValue(term.left, context);\n return isTruthy(leftValue);\n }\n\n // Standard comparison requires both operands\n if (!term.right) {\n console.warn(\"[EvaluateComparison] Comparison operator requires right operand\");\n return false;\n }\n\n const leftValue = resolveTokenValue(term.left, context);\n const rightValue = resolveTokenValue(term.right, context);\n\n if (leftValue === undefined || rightValue === undefined) {\n console.warn(\"[EvaluateComparison] Undefined value - left:\", leftValue, \"right:\", rightValue);\n return false;\n }\n\n const trimIfString = (v: unknown) =>\n typeof v === \"string\" ? v.trim() : v;\n\n const leftComparable = trimIfString(coerceValue(leftValue));\n const rightComparable = trimIfString(coerceValue(rightValue));\n\n console.log(\"[EvaluateComparison]\", leftComparable, term.operator, rightComparable);\n\n let result: boolean;\n switch (term.operator) {\n case \"==\":\n result = leftComparable == rightComparable; // eslint-disable-line eqeqeq\n break;\n case \"===\":\n result = leftComparable === rightComparable;\n break;\n case \"!=\":\n result = leftComparable != rightComparable; // eslint-disable-line eqeqeq\n break;\n case \"!==\":\n result = leftComparable !== rightComparable;\n break;\n case \">\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a > b);\n break;\n case \">=\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a >= b);\n break;\n case \"<\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a < b);\n break;\n case \"<=\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a <= b);\n break;\n default:\n console.warn(\"[EvaluateComparison] Unknown operator:\", term.operator);\n result = false;\n }\n\n console.log(\"[EvaluateComparison] Result:\", result);\n return result;\n};\n\nconst isTruthy = (value: unknown): boolean => {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n }\n if (typeof value === \"number\") return value !== 0;\n if (value === null || value === undefined) return false;\n if (value === \"\") return false;\n return true;\n};\n\nconst resolveTokenValue = (\n token: ConditionToken,\n context: ConditionEvaluationContext\n): unknown => {\n switch (token.type) {\n case \"input\":\n return parseLiteral(token.value);\n case \"variable\":\n case \"control\":\n return resolvePathValue(token.value, context, token.sourceNodeId);\n default:\n console.warn(\"[ResolveTokenValue] Unknown token type:\", token.type);\n return undefined;\n }\n};\n\nconst FIELD_ALIASES: Record<string, string[]> = {\n nom: [\"lastName\", \"companyName\"],\n prenom: [\"firstName\"],\n email: [\"email\"],\n sms: [\"phoneNumber\"],\n date_naissance: [\"birthDate\"],\n adresse: [\"addressLine1\"],\n ville: [\"city\"],\n code_postal: [\"postalCode\"],\n pays: [\"countryCode\", \"country\"],\n nationalite: [\"nationality\"],\n};\n\nconst resolvePathValue = (\n path: string,\n context: ConditionEvaluationContext,\n sourceNodeId?: string\n): unknown => {\n if (!path) {\n console.warn(\"[ResolvePathValue] Empty path provided\");\n return undefined;\n }\n\n const segments = path.split(\".\").filter(Boolean);\n\n if (segments.length === 0) {\n console.warn(\"[ResolvePathValue] No segments after splitting path\");\n return undefined;\n }\n\n const sources: Array<Record<string, unknown> | undefined> = [\n context.session?.result as Record<string, unknown>,\n context.session?.userInput as Record<string, unknown>,\n context.session?.contactInfo as Record<string, unknown>,\n context.userInput as Record<string, unknown>,\n context.contactInfo as Record<string, unknown>,\n context.session as unknown as Record<string, unknown>,\n ];\n\n // Helper to resolve aliases\n const getPossibleKeys = (key: string): string[] => {\n return [key, ...(FIELD_ALIASES[key] || [])];\n };\n\n // 1. Try direct/nested resolution with alias support for the last segment\n for (const source of sources) {\n if (!source) continue;\n\n const parentPath = segments.slice(0, -1);\n const lastSegment = segments[segments.length - 1];\n const parent = parentPath.length > 0 ? getNestedValue(source, parentPath) : source;\n\n if (parent && typeof parent === \"object\") {\n for (const key of getPossibleKeys(lastSegment)) {\n const value = (parent as Record<string, unknown>)[key];\n if (value !== undefined) {\n console.log(`[ResolvePathValue] Found ${path} (as ${key}) in direct sources`);\n return extractValue(value);\n }\n }\n }\n }\n\n // 2. Handle nodeId prefixes and fallbacks\n if (segments.length > 1) {\n const [root, ...rest] = segments;\n const lastSegment = segments[segments.length - 1];\n\n // Check in contextual userInput (structured by node or flat)\n if (context.userInput && typeof context.userInput === \"object\") {\n const userInput = context.userInput as Record<string, unknown>;\n\n // A. Try structured by nodeId\n const nodeData = userInput[root];\n if (nodeData && typeof nodeData === \"object\") {\n const value = getNestedValue(nodeData as Record<string, unknown>, rest);\n if (value !== undefined) {\n console.log(`[ResolvePathValue] Found ${path} in contextual userInput (nested)`);\n return extractValue(value);\n }\n }\n\n // B. Flat fallback: search for the property directly if it's a node-ID.property\n for (const key of getPossibleKeys(lastSegment)) {\n if (userInput[key] !== undefined) {\n console.log(`[ResolvePathValue] Found ${lastSegment} (as ${key}) in flat userInput`);\n return extractValue(userInput[key]);\n }\n\n // C. Check in customFormData\n const customFormData = userInput[\"customFormData\"] as Record<string, unknown> | undefined;\n if (customFormData && customFormData[key] !== undefined) {\n console.log(`[ResolvePathValue] Found ${lastSegment} (as ${key}) in customFormData`);\n return extractValue(customFormData[key]);\n }\n }\n }\n\n const analysisEntries = Array.isArray(context.session?.analysis)\n ? (context.session.analysis as Array<Record<string, unknown>>)\n : [];\n\n // If sourceNodeId is provided, use it to find the relevant analysis entry\n if (sourceNodeId || segments.length > 1) {\n const targetNodeId = sourceNodeId || root;\n const relevantEntries = analysisEntries.filter((entry) => {\n const entryRecord = entry as Record<string, unknown>;\n return entryRecord[\"nodeId\"] === targetNodeId || entryRecord[\"id\"] === targetNodeId;\n });\n\n if (relevantEntries.length > 0) {\n // Use the most recent entry (last one in array)\n const targetEntry = relevantEntries[relevantEntries.length - 1];\n\n // Check if the first segment is a hash/identifier that should be skipped\n const isHashLikeId = /^[a-f0-9]{24}$/i.test(root);\n const pathToResolve = isHashLikeId ? rest : [root, ...rest];\n\n // For control tokens, look in the documents array associated with this analysis entry\n if (pathToResolve.length > 0) {\n const propertyName = pathToResolve[pathToResolve.length - 1];\n const propertyKeys = getPossibleKeys(propertyName);\n\n const documents = Array.isArray(context.session?.documents)\n ? (context.session.documents as Array<Record<string, unknown>>)\n : [];\n\n if (documents.length > 0) {\n const analysisId = targetEntry[\"id\"] as string;\n const relevantDocs = documents.filter((doc) => doc[\"analysisId\"] === analysisId);\n\n if (relevantDocs.length > 0) {\n const doc = relevantDocs[0];\n\n // Look in controlCategories for control properties\n const controlCategories = doc[\"controlCategories\"] as Record<string, unknown> | undefined;\n if (controlCategories) {\n for (const categoryData of Object.values(controlCategories)) {\n const category = categoryData as Record<string, unknown>;\n const controls = category[\"controls\"] as Record<string, unknown> | undefined;\n\n if (controls) {\n for (const key of propertyKeys) {\n if (key in controls) {\n const control = controls[key] as Record<string, unknown>;\n return extractValue(control[\"value\"]);\n }\n }\n }\n }\n }\n\n // Also check in extractedInformations\n const extractedInformations = doc[\"extractedInformations\"] as Record<string, unknown> | undefined;\n if (extractedInformations) {\n for (const key of propertyKeys) {\n const valueFromExtracted = getNestedValue(extractedInformations, [key]);\n if (valueFromExtracted !== undefined) {\n return extractValue(valueFromExtracted);\n }\n }\n }\n }\n }\n }\n\n // Try direct access on analysis entry with aliases\n const propertyName = segments[segments.length - 1];\n for (const key of getPossibleKeys(propertyName)) {\n const valueFromEntry = (targetEntry as Record<string, unknown>)[key];\n if (valueFromEntry !== undefined) {\n return extractValue(valueFromEntry);\n }\n\n const extractedInfo = (targetEntry as Record<string, unknown>)[\n \"extractedInformation\"\n ] as Record<string, unknown> | undefined;\n if (extractedInfo && extractedInfo[key] !== undefined) {\n return extractValue(extractedInfo[key]);\n }\n\n const resultInfo = (targetEntry as Record<string, unknown>)[\n \"result\"\n ] as Record<string, unknown> | undefined;\n if (resultInfo && resultInfo[key] !== undefined) {\n return extractValue(resultInfo[key]);\n }\n }\n }\n }\n }\n\n console.warn(\"⚠️ [ResolvePathValue] Could not resolve path:\", path);\n return undefined;\n};\n\n/**\n * Extracts the actual value from objects with {confidence, value} structure.\n * This is common in extractedInformations from the API.\n */\nconst extractValue = (value: unknown): unknown => {\n // If it's an object with both 'value' and 'confidence' properties, extract the value\n if (\n value &&\n typeof value === \"object\" &&\n \"value\" in value &&\n \"confidence\" in value\n ) {\n return (value as Record<string, unknown>)[\"value\"];\n }\n return value;\n};\n\nconst getNestedValue = (\n source: Record<string, unknown> | undefined,\n path: string[]\n): unknown => {\n if (!source) {\n return undefined;\n }\n\n return path.reduce<unknown>((acc, key) => {\n if (acc === undefined || acc === null) {\n return undefined;\n }\n if (Array.isArray(acc)) {\n const index = Number(key);\n if (Number.isNaN(index)) {\n return undefined;\n }\n return acc[index];\n }\n if (typeof acc === \"object\") {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, source);\n};\n\nconst parseLiteral = (value: string): unknown => {\n const trimmed = value?.trim();\n if (!trimmed) {\n return \"\";\n }\n\n if (trimmed.toLowerCase() === \"true\") {\n return true;\n }\n if (trimmed.toLowerCase() === \"false\") {\n return false;\n }\n\n const numericValue = Number(trimmed);\n if (!Number.isNaN(numericValue)) {\n return numericValue;\n }\n\n const timestamp = Date.parse(trimmed);\n if (!Number.isNaN(timestamp)) {\n return new Date(timestamp).getTime();\n }\n return trimmed.replace(/\"/g, '');\n};\n\nconst coerceValue = (value: unknown): unknown => {\n if (value instanceof Date) {\n return value.getTime();\n }\n if (typeof value === \"string\") {\n const literal = parseLiteral(value);\n if (literal !== value) {\n return literal;\n }\n }\n return value;\n};\n\nconst compareValues = (\n left: unknown,\n right: unknown,\n comparator: (a: number | string, b: number | string) => boolean\n): boolean => {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return comparator(left, right);\n }\n\n if (typeof left === \"string\" && typeof right === \"string\") {\n // Normalize case for better string matching\n return comparator(left.trim().toLowerCase(), right.trim().toLowerCase());\n }\n\n console.warn(`[CompareValues] Type mismatch: left=${typeof left}, right=${typeof right}`);\n return false;\n};\n\nconst determineOperandType = (value: string): ConditionTokenType => {\n if (isBooleanLiteral(value) || isNumericLiteral(value)) {\n return \"input\";\n }\n\n return \"variable\";\n};\n\nconst isNumericLiteral = (value: string): boolean => {\n return /^-?\\d+(?:\\.\\d+)?$/.test(value);\n};\n\nconst isBooleanLiteral = (value: string): boolean => {\n return value.toLowerCase() === \"true\" || value.toLowerCase() === \"false\";\n};\n"],"names":["__spreadArray"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conditionEvaluator.js","sources":["../../../../src/utils/conditionEvaluator.ts"],"sourcesContent":["import type { ConditionToken, ConditionTokenType, SessionData } from \"../types/session\";\nimport type { UserInput } from \"../types/userInput\";\nimport type { ContactInfo } from \"../types/contactInfo\";\n\nexport interface ConditionEvaluationContext {\n session: SessionData;\n userInput?: UserInput | Record<string, unknown>;\n contactInfo?: ContactInfo | Record<string, unknown>;\n}\n\nconst LOGICAL_OPERATORS = new Set([\"&&\", \"||\"]);\nconst COMPARISON_OPERATORS = new Set([\"==\", \"===\", \"!=\", \"!==\", \">\", \">=\", \"<\", \"<=\"]);\n\n// Valeurs sentinelles reconnues comme opérande droite pour tester la présence d'une valeur.\n// Syntaxe builder : « variable == isEmpty » ou « variable != isEmpty »\nconst PRESENCE_SENTINELS = new Set([\"isEmpty\", \"isNotEmpty\"]);\n\ninterface ComparisonTerm {\n left?: ConditionToken;\n operator?: string;\n right?: ConditionToken;\n}\n\nexport const parseConditionExpression = (expression?: string): ConditionToken[] => {\n if (!expression) {\n return [];\n }\n\n const cleanedExpression = expression.replace(/\\s+/g, \" \").trim();\n if (!cleanedExpression) {\n return [];\n }\n\n const regex = /(===|!==|==|!=|<=|>=|&&|\\|\\||<|>)|(\"(?:[^\"\\\\]|\\\\.)*\")|([^\\s]+)/g;\n const tokens: ConditionToken[] = [];\n let match: RegExpExecArray | null;\n while ((match = regex.exec(cleanedExpression)) !== null) {\n const value = match[0];\n\n if (LOGICAL_OPERATORS.has(value) || COMPARISON_OPERATORS.has(value)) {\n tokens.push({ type: \"operator\", value });\n } else {\n const isQuoted = value.startsWith(\"\\\"\") && value.endsWith(\"\\\"\");\n const literal = isQuoted ? value.slice(1, -1) : value;\n const tokenType: ConditionTokenType = isQuoted\n ? \"input\"\n : determineOperandType(literal);\n tokens.push({ type: tokenType, value: literal });\n }\n }\n\n return tokens;\n};\n\nexport const evaluateConditionTokens = (\n tokens: ConditionToken[] = [],\n context: ConditionEvaluationContext\n): boolean => {\n if (!tokens || tokens.length === 0) {\n console.warn(\"[ConditionEvaluator] No tokens provided\");\n return false;\n }\n\n const { terms, logicalOperators } = buildComparisonTerms(tokens);\n\n if (terms.length === 0) {\n console.warn(\"[ConditionEvaluator] No comparison terms built\");\n return false;\n }\n\n const termResults = terms.map((term) => evaluateComparison(term, context));\n\n if (termResults.length === 1) {\n return termResults[0];\n }\n\n const finalResult = termResults.reduce((acc, result, index) => {\n if (index === 0) {\n return result;\n }\n const logicalOperator = logicalOperators[index - 1] || \"&&\";\n return logicalOperator === \"||\" ? acc || result : acc && result;\n }, true);\n\n return finalResult;\n};\n\nconst buildComparisonTerms = (tokens: ConditionToken[]) => {\n const terms: ComparisonTerm[] = [];\n const logicalOperators: string[] = [];\n let currentTerm: ComparisonTerm = {};\n\n tokens.forEach((token) => {\n if (token.type === \"operator\") {\n if (LOGICAL_OPERATORS.has(token.value)) {\n // If we have a left operand without comparison operator, treat it as a boolean term\n if (currentTerm.left && !currentTerm.operator) {\n terms.push({ left: currentTerm.left, operator: \"truthy\", right: undefined });\n logicalOperators.push(token.value);\n currentTerm = {};\n } else if (currentTerm.left && currentTerm.operator && currentTerm.right) {\n terms.push(currentTerm);\n logicalOperators.push(token.value);\n currentTerm = {};\n }\n } else if (COMPARISON_OPERATORS.has(token.value)) {\n currentTerm.operator = token.value;\n }\n } else {\n if (!currentTerm.left) {\n currentTerm.left = token;\n } else if (!currentTerm.right) {\n currentTerm.right = token;\n } else {\n currentTerm = { left: token };\n }\n }\n });\n\n // Handle the last term\n if (currentTerm.left) {\n if (!currentTerm.operator) {\n terms.push({ left: currentTerm.left, operator: \"truthy\", right: undefined });\n } else if (currentTerm.right) {\n terms.push(currentTerm);\n }\n }\n\n return { terms, logicalOperators };\n};\n\nconst evaluateComparison = (\n term: ComparisonTerm,\n context: ConditionEvaluationContext\n): boolean => {\n if (!term.left || !term.operator) {\n console.warn(\"[EvaluateComparison] Incomplete term - missing left or operator\");\n return false;\n }\n\n // Handle boolean/truthy evaluation (no right operand)\n if (term.operator === \"truthy\") {\n const leftValue = resolveTokenValue(term.left, context);\n return isTruthy(leftValue);\n }\n\n // Standard comparison requires both operands\n if (!term.right) {\n console.warn(\"[EvaluateComparison] Comparison operator requires right operand\");\n return false;\n }\n\n const leftValue = resolveTokenValue(term.left, context);\n\n // Sentinel « isEmpty » / « isNotEmpty » en opérande droite — teste la présence de la valeur gauche.\n // Syntaxe : « variable == isEmpty » → vide ; « variable != isEmpty » → non vide.\n // De même avec « variable == isNotEmpty » / « variable != isNotEmpty » (sens inversé).\n if (term.right && PRESENCE_SENTINELS.has(term.right.value)) {\n const empty = isEmptyValue(leftValue);\n const sentinelMeansEmpty = term.right.value === \"isEmpty\";\n if (term.operator === \"==\" || term.operator === \"===\") {\n return sentinelMeansEmpty ? empty : !empty;\n }\n if (term.operator === \"!=\" || term.operator === \"!==\") {\n return sentinelMeansEmpty ? !empty : empty;\n }\n }\n\n const rightValue = resolveTokenValue(term.right, context);\n\n if (leftValue === undefined || rightValue === undefined) {\n console.warn(\"[EvaluateComparison] Undefined value - left:\", leftValue, \"right:\", rightValue);\n return false;\n }\n\n const trimIfString = (v: unknown) =>\n typeof v === \"string\" ? v.trim() : v;\n\n const leftComparable = trimIfString(coerceValue(leftValue));\n const rightComparable = trimIfString(coerceValue(rightValue));\n\n console.log(\"[EvaluateComparison]\", leftComparable, term.operator, rightComparable);\n\n let result: boolean;\n switch (term.operator) {\n case \"==\":\n result = leftComparable == rightComparable; // eslint-disable-line eqeqeq\n break;\n case \"===\":\n result = leftComparable === rightComparable;\n break;\n case \"!=\":\n result = leftComparable != rightComparable; // eslint-disable-line eqeqeq\n break;\n case \"!==\":\n result = leftComparable !== rightComparable;\n break;\n case \">\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a > b);\n break;\n case \">=\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a >= b);\n break;\n case \"<\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a < b);\n break;\n case \"<=\":\n result = compareValues(leftComparable, rightComparable, (a, b) => a <= b);\n break;\n default:\n console.warn(\"[EvaluateComparison] Unknown operator:\", term.operator);\n result = false;\n }\n\n console.log(\"[EvaluateComparison] Result:\", result);\n return result;\n};\n\nconst isTruthy = (value: unknown): boolean => {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n const lower = value.toLowerCase();\n if (lower === \"true\") return true;\n if (lower === \"false\") return false;\n }\n if (typeof value === \"number\") return value !== 0;\n if (value === null || value === undefined) return false;\n if (value === \"\") return false;\n return true;\n};\n\nconst isEmptyValue = (value: unknown): boolean => {\n if (value === null || value === undefined) return true;\n if (typeof value === \"string\") return value.trim() === \"\";\n if (Array.isArray(value)) return value.length === 0;\n return false;\n};\n\nconst resolveTokenValue = (\n token: ConditionToken,\n context: ConditionEvaluationContext\n): unknown => {\n switch (token.type) {\n case \"input\":\n return parseLiteral(token.value);\n case \"variable\":\n case \"control\":\n return resolvePathValue(token.value, context, token.sourceNodeId);\n default:\n console.warn(\"[ResolveTokenValue] Unknown token type:\", token.type);\n return undefined;\n }\n};\n\nconst FIELD_ALIASES: Record<string, string[]> = {\n nom: [\"lastName\", \"companyName\"],\n prenom: [\"firstName\"],\n email: [\"email\"],\n sms: [\"phoneNumber\"],\n date_naissance: [\"birthDate\"],\n adresse: [\"addressLine1\"],\n ville: [\"city\"],\n code_postal: [\"postalCode\"],\n pays: [\"countryCode\", \"country\"],\n nationalite: [\"nationality\"],\n};\n\nconst resolvePathValue = (\n path: string,\n context: ConditionEvaluationContext,\n sourceNodeId?: string\n): unknown => {\n if (!path) {\n console.warn(\"[ResolvePathValue] Empty path provided\");\n return undefined;\n }\n\n const segments = path.split(\".\").filter(Boolean);\n\n if (segments.length === 0) {\n console.warn(\"[ResolvePathValue] No segments after splitting path\");\n return undefined;\n }\n\n const sources: Array<Record<string, unknown> | undefined> = [\n context.session?.result as Record<string, unknown>,\n context.session?.userInput as Record<string, unknown>,\n context.session?.contactInfo as Record<string, unknown>,\n context.userInput as Record<string, unknown>,\n context.contactInfo as Record<string, unknown>,\n context.session as unknown as Record<string, unknown>,\n ];\n\n // Helper to resolve aliases\n const getPossibleKeys = (key: string): string[] => {\n return [key, ...(FIELD_ALIASES[key] || [])];\n };\n\n // 1. Try direct/nested resolution with alias support for the last segment\n for (const source of sources) {\n if (!source) continue;\n\n const parentPath = segments.slice(0, -1);\n const lastSegment = segments[segments.length - 1];\n const parent = parentPath.length > 0 ? getNestedValue(source, parentPath) : source;\n\n if (parent && typeof parent === \"object\") {\n for (const key of getPossibleKeys(lastSegment)) {\n const value = (parent as Record<string, unknown>)[key];\n if (value !== undefined) {\n console.log(`[ResolvePathValue] Found ${path} (as ${key}) in direct sources`);\n return extractValue(value);\n }\n }\n }\n }\n\n // 2. Handle nodeId prefixes and fallbacks\n if (segments.length > 1) {\n const [root, ...rest] = segments;\n const lastSegment = segments[segments.length - 1];\n\n // Check in contextual userInput (structured by node or flat)\n if (context.userInput && typeof context.userInput === \"object\") {\n const userInput = context.userInput as Record<string, unknown>;\n\n // A. Try structured by nodeId\n const nodeData = userInput[root];\n if (nodeData && typeof nodeData === \"object\") {\n const value = getNestedValue(nodeData as Record<string, unknown>, rest);\n if (value !== undefined) {\n console.log(`[ResolvePathValue] Found ${path} in contextual userInput (nested)`);\n return extractValue(value);\n }\n }\n\n // B. Flat fallback: search for the property directly if it's a node-ID.property\n for (const key of getPossibleKeys(lastSegment)) {\n if (userInput[key] !== undefined) {\n console.log(`[ResolvePathValue] Found ${lastSegment} (as ${key}) in flat userInput`);\n return extractValue(userInput[key]);\n }\n\n // C. Check in customFormData\n const customFormData = userInput[\"customFormData\"] as Record<string, unknown> | undefined;\n if (customFormData && customFormData[key] !== undefined) {\n console.log(`[ResolvePathValue] Found ${lastSegment} (as ${key}) in customFormData`);\n return extractValue(customFormData[key]);\n }\n }\n }\n\n const analysisEntries = Array.isArray(context.session?.analysis)\n ? (context.session.analysis as Array<Record<string, unknown>>)\n : [];\n\n // If sourceNodeId is provided, use it to find the relevant analysis entry\n if (sourceNodeId || segments.length > 1) {\n const targetNodeId = sourceNodeId || root;\n const relevantEntries = analysisEntries.filter((entry) => {\n const entryRecord = entry as Record<string, unknown>;\n return entryRecord[\"nodeId\"] === targetNodeId || entryRecord[\"id\"] === targetNodeId;\n });\n\n if (relevantEntries.length > 0) {\n // Use the most recent entry (last one in array)\n const targetEntry = relevantEntries[relevantEntries.length - 1];\n\n // Check if the first segment is a hash/identifier that should be skipped\n const isHashLikeId = /^[a-f0-9]{24}$/i.test(root);\n const pathToResolve = isHashLikeId ? rest : [root, ...rest];\n\n // For control tokens, look in the documents array associated with this analysis entry\n if (pathToResolve.length > 0) {\n const propertyName = pathToResolve[pathToResolve.length - 1];\n const propertyKeys = getPossibleKeys(propertyName);\n\n const documents = Array.isArray(context.session?.documents)\n ? (context.session.documents as Array<Record<string, unknown>>)\n : [];\n\n if (documents.length > 0) {\n const analysisId = targetEntry[\"id\"] as string;\n const relevantDocs = documents.filter((doc) => doc[\"analysisId\"] === analysisId);\n\n if (relevantDocs.length > 0) {\n const doc = relevantDocs[0];\n\n // Look in controlCategories for control properties\n const controlCategories = doc[\"controlCategories\"] as Record<string, unknown> | undefined;\n if (controlCategories) {\n for (const categoryData of Object.values(controlCategories)) {\n const category = categoryData as Record<string, unknown>;\n const controls = category[\"controls\"] as Record<string, unknown> | undefined;\n\n if (controls) {\n for (const key of propertyKeys) {\n if (key in controls) {\n const control = controls[key] as Record<string, unknown>;\n return extractValue(control[\"value\"]);\n }\n }\n }\n }\n }\n\n // Also check in extractedInformations\n const extractedInformations = doc[\"extractedInformations\"] as Record<string, unknown> | undefined;\n if (extractedInformations) {\n for (const key of propertyKeys) {\n const valueFromExtracted = getNestedValue(extractedInformations, [key]);\n if (valueFromExtracted !== undefined) {\n return extractValue(valueFromExtracted);\n }\n }\n }\n }\n }\n }\n\n // Try direct access on analysis entry with aliases\n const propertyName = segments[segments.length - 1];\n for (const key of getPossibleKeys(propertyName)) {\n const valueFromEntry = (targetEntry as Record<string, unknown>)[key];\n if (valueFromEntry !== undefined) {\n return extractValue(valueFromEntry);\n }\n\n const extractedInfo = (targetEntry as Record<string, unknown>)[\n \"extractedInformation\"\n ] as Record<string, unknown> | undefined;\n if (extractedInfo && extractedInfo[key] !== undefined) {\n return extractValue(extractedInfo[key]);\n }\n\n const resultInfo = (targetEntry as Record<string, unknown>)[\n \"result\"\n ] as Record<string, unknown> | undefined;\n if (resultInfo && resultInfo[key] !== undefined) {\n return extractValue(resultInfo[key]);\n }\n }\n }\n }\n }\n\n console.warn(\"⚠️ [ResolvePathValue] Could not resolve path:\", path);\n return undefined;\n};\n\n/**\n * Extracts the actual value from objects with {confidence, value} structure.\n * This is common in extractedInformations from the API.\n */\nconst extractValue = (value: unknown): unknown => {\n // If it's an object with both 'value' and 'confidence' properties, extract the value\n if (\n value &&\n typeof value === \"object\" &&\n \"value\" in value &&\n \"confidence\" in value\n ) {\n return (value as Record<string, unknown>)[\"value\"];\n }\n return value;\n};\n\nconst getNestedValue = (\n source: Record<string, unknown> | undefined,\n path: string[]\n): unknown => {\n if (!source) {\n return undefined;\n }\n\n return path.reduce<unknown>((acc, key) => {\n if (acc === undefined || acc === null) {\n return undefined;\n }\n if (Array.isArray(acc)) {\n const index = Number(key);\n if (Number.isNaN(index)) {\n return undefined;\n }\n return acc[index];\n }\n if (typeof acc === \"object\") {\n return (acc as Record<string, unknown>)[key];\n }\n return undefined;\n }, source);\n};\n\nconst parseLiteral = (value: string): unknown => {\n const trimmed = value?.trim();\n if (!trimmed) {\n return \"\";\n }\n\n if (trimmed.toLowerCase() === \"true\") {\n return true;\n }\n if (trimmed.toLowerCase() === \"false\") {\n return false;\n }\n\n const numericValue = Number(trimmed);\n if (!Number.isNaN(numericValue)) {\n return numericValue;\n }\n\n const timestamp = Date.parse(trimmed);\n if (!Number.isNaN(timestamp)) {\n return new Date(timestamp).getTime();\n }\n return trimmed.replace(/\"/g, '');\n};\n\nconst coerceValue = (value: unknown): unknown => {\n if (value instanceof Date) {\n return value.getTime();\n }\n if (typeof value === \"string\") {\n const literal = parseLiteral(value);\n if (literal !== value) {\n return literal;\n }\n }\n return value;\n};\n\nconst compareValues = (\n left: unknown,\n right: unknown,\n comparator: (a: number | string, b: number | string) => boolean\n): boolean => {\n if (typeof left === \"number\" && typeof right === \"number\") {\n return comparator(left, right);\n }\n\n if (typeof left === \"string\" && typeof right === \"string\") {\n // Normalize case for better string matching\n return comparator(left.trim().toLowerCase(), right.trim().toLowerCase());\n }\n\n console.warn(`[CompareValues] Type mismatch: left=${typeof left}, right=${typeof right}`);\n return false;\n};\n\nconst determineOperandType = (value: string): ConditionTokenType => {\n if (isBooleanLiteral(value) || isNumericLiteral(value) || PRESENCE_SENTINELS.has(value)) {\n return \"input\";\n }\n\n return \"variable\";\n};\n\nconst isNumericLiteral = (value: string): boolean => {\n return /^-?\\d+(?:\\.\\d+)?$/.test(value);\n};\n\nconst isBooleanLiteral = (value: string): boolean => {\n return value.toLowerCase() === \"true\" || value.toLowerCase() === \"false\";\n};\n"],"names":["__spreadArray"],"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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"}
|
|
@@ -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)));
|