diff --git a/ticket_form/frontend/src/components/form/StepWizardPlan.tsx b/ticket_form/frontend/src/components/form/StepWizardPlan.tsx index 8623b258..74a1d1f7 100644 --- a/ticket_form/frontend/src/components/form/StepWizardPlan.tsx +++ b/ticket_form/frontend/src/components/form/StepWizardPlan.tsx @@ -706,6 +706,17 @@ export default function StepWizardPlan({ return `upload_${group.index}`; }; + // ✅ Подсчитываем дубликаты labels для автоматической нумерации + const labelCounts: Record = {}; + const labelIndexes: Record = {}; + + // Первый проход - считаем сколько раз встречается каждый label + groups.forEach((group) => { + const block = group.block; + const baseLabel = (block.description?.trim()) || block.docLabel || block.fieldName || guessFieldName(group); + labelCounts[baseLabel] = (labelCounts[baseLabel] || 0) + 1; + }); + groups.forEach((group) => { const i = group.index; const block = group.block; @@ -724,7 +735,16 @@ export default function StepWizardPlan({ ); // ✅ Добавляем реальное название поля (label) для использования в n8n - const finalFieldLabel = block.docLabel || block.description || fieldLabel; + // Приоритет: description (если заполнено) > docLabel > fieldLabel + const baseLabel = (block.description?.trim()) || block.docLabel || fieldLabel; + + // ✅ Автоматическая нумерация для дубликатов + let finalFieldLabel = baseLabel; + if (labelCounts[baseLabel] > 1) { + labelIndexes[baseLabel] = (labelIndexes[baseLabel] || 0) + 1; + finalFieldLabel = `${baseLabel} #${labelIndexes[baseLabel]}`; + } + formPayload.append( `uploads_field_labels[${i}]`, finalFieldLabel