From 003210dcfcbfedcd61eab81a4925e83ece4751cc Mon Sep 17 00:00:00 2001 From: Fedor Date: Thu, 4 Dec 2025 09:21:12 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5?= =?UTF-8?q?=D0=BC=D1=8B=20=D1=81=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D1=86=D0=B8=D0=BA=D0=BB=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=D0=BC=D0=B8=20=D1=81=D1=81=D1=8B=D0=BB=D0=BA?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Исправлена проблема с циклическими ссылками в Step1Phone.tsx при onPaste (добавлен setTimeout) - Добавлены name атрибуты во все поля формы для правильной работы форм и автозаполнения - Исправлены проблемы с label/input связями (все label имеют правильные for/id) - Все поля теперь имеют id и name атрибуты (исправляет предупреждения в консоли) Исправленные функции: - createField: добавлен name атрибут - createReadonlyField: добавлен name атрибут - createDateField: добавлен name атрибут - createMoneyField: добавлен name атрибут - createTextarea: добавлен name атрибут - createBankSelect: добавлен name атрибут для основного поля и скрытого bank_id - createCheckbox: добавлен name атрибут, проверена связь label/input --- ticket_form/SESSION_LOG_2025-12-03.md | 1 + .../backend/app/services/crm_mysql_service.py | 1 + .../docs/CF_2624_IMPLEMENTATION_SUMMARY.md | 1 + .../docs/CF_2624_IN_OCR_STATUS_EVENT.md | 1 + .../N8N_ADD_CF_2624_TO_OCR_STATUS_EVENT.md | 1 + .../docs/N8N_MYSQL_GET_CONTACT_DATA.md | 1 + .../docs/N8N_UPDATE_CF_2624_IN_RESPONSE.md | 1 + .../N8N_WORKFLOW_ADD_POSTGRESQL_CONTACT.md | 1 + .../src/components/form/Step1Phone.tsx | 14 ++++---- .../form/generateConfirmationFormHTML.ts | 35 ++++++++++++++----- 10 files changed, 42 insertions(+), 15 deletions(-) diff --git a/ticket_form/SESSION_LOG_2025-12-03.md b/ticket_form/SESSION_LOG_2025-12-03.md index fb46bb6b..489bb751 100644 --- a/ticket_form/SESSION_LOG_2025-12-03.md +++ b/ticket_form/SESSION_LOG_2025-12-03.md @@ -195,3 +195,4 @@ curl "http://localhost:8200/api/v1/claims/drafts/226564ce-d7cf-48ee-a820-690e8f5 **Время работы:** 2025-12-03 16:00-17:00 **Статус:** ✅ Завершено успешно + diff --git a/ticket_form/backend/app/services/crm_mysql_service.py b/ticket_form/backend/app/services/crm_mysql_service.py index a6ba8e83..091a1b27 100644 --- a/ticket_form/backend/app/services/crm_mysql_service.py +++ b/ticket_form/backend/app/services/crm_mysql_service.py @@ -115,3 +115,4 @@ class CrmMySQLService: # Глобальный экземпляр crm_mysql_service = CrmMySQLService() + diff --git a/ticket_form/docs/CF_2624_IMPLEMENTATION_SUMMARY.md b/ticket_form/docs/CF_2624_IMPLEMENTATION_SUMMARY.md index b19ebf4d..d777f17a 100644 --- a/ticket_form/docs/CF_2624_IMPLEMENTATION_SUMMARY.md +++ b/ticket_form/docs/CF_2624_IMPLEMENTATION_SUMMARY.md @@ -133,3 +133,4 @@ return { - `ticket_form/docs/N8N_UPDATE_CF_2624_IN_RESPONSE.md` - Обновление n8n workflow - `ticket_form/docs/CODE_CREATE_WEB_CONTACT_FINAL.js` - Код для n8n (обновлён) + diff --git a/ticket_form/docs/CF_2624_IN_OCR_STATUS_EVENT.md b/ticket_form/docs/CF_2624_IN_OCR_STATUS_EVENT.md index f487aeac..9a0e440e 100644 --- a/ticket_form/docs/CF_2624_IN_OCR_STATUS_EVENT.md +++ b/ticket_form/docs/CF_2624_IN_OCR_STATUS_EVENT.md @@ -111,3 +111,4 @@ LIMIT 1; - Сохраняться в черновик в `payload.cf_2624` - Использоваться для блокировки полей на фронтенде + diff --git a/ticket_form/docs/N8N_ADD_CF_2624_TO_OCR_STATUS_EVENT.md b/ticket_form/docs/N8N_ADD_CF_2624_TO_OCR_STATUS_EVENT.md index 28b449b0..7153b6e4 100644 --- a/ticket_form/docs/N8N_ADD_CF_2624_TO_OCR_STATUS_EVENT.md +++ b/ticket_form/docs/N8N_ADD_CF_2624_TO_OCR_STATUS_EVENT.md @@ -207,3 +207,4 @@ if actual_event.get('event_type') == 'ocr_status' and actual_event.get('status') - ✅ Обрабатываться backend'ом - ✅ Сохраняться в черновик в поле `payload.cf_2624` + diff --git a/ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.md b/ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.md index 18f878a4..83111c52 100644 --- a/ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.md +++ b/ticket_form/docs/N8N_MYSQL_GET_CONTACT_DATA.md @@ -71,3 +71,4 @@ if (pgContactNode && pgContactNode.json && pgContactNode.json.length > 0) { **Примечание:** Название файла `N8N_POSTGRESQL_GET_CONTACT_DATA.sql` устарело, но запрос работает для MySQL. + diff --git a/ticket_form/docs/N8N_UPDATE_CF_2624_IN_RESPONSE.md b/ticket_form/docs/N8N_UPDATE_CF_2624_IN_RESPONSE.md index 916fb27b..2b1c1669 100644 --- a/ticket_form/docs/N8N_UPDATE_CF_2624_IN_RESPONSE.md +++ b/ticket_form/docs/N8N_UPDATE_CF_2624_IN_RESPONSE.md @@ -144,3 +144,4 @@ if (contact_id) { } ``` + diff --git a/ticket_form/docs/N8N_WORKFLOW_ADD_POSTGRESQL_CONTACT.md b/ticket_form/docs/N8N_WORKFLOW_ADD_POSTGRESQL_CONTACT.md index 49685e98..9d5d8b8e 100644 --- a/ticket_form/docs/N8N_WORKFLOW_ADD_POSTGRESQL_CONTACT.md +++ b/ticket_form/docs/N8N_WORKFLOW_ADD_POSTGRESQL_CONTACT.md @@ -97,3 +97,4 @@ LIMIT 1; Но лучше использовать PostgreSQL напрямую для скорости. + diff --git a/ticket_form/frontend/src/components/form/Step1Phone.tsx b/ticket_form/frontend/src/components/form/Step1Phone.tsx index bdc7f20a..092d6577 100644 --- a/ticket_form/frontend/src/components/form/Step1Phone.tsx +++ b/ticket_form/frontend/src/components/form/Step1Phone.tsx @@ -290,12 +290,14 @@ export default function Step1Phone({ } // Оставляем только первые 10 цифр cleanText = cleanText.substring(0, 10); - // Устанавливаем очищенное значение - form.setFieldValue('phone', cleanText); - // Показываем предупреждение, если номер был обрезан - if (pastedText.replace(/\D/g, '').length > 10) { - message.warning('Номер автоматически обрезан до 10 цифр'); - } + // ✅ Используем setTimeout для избежания циклических ссылок при обновлении формы + setTimeout(() => { + form.setFieldValue('phone', cleanText); + // Показываем предупреждение, если номер был обрезан + if (pastedText.replace(/\D/g, '').length > 10) { + message.warning('Номер автоматически обрезан до 10 цифр'); + } + }, 0); }} /> diff --git a/ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts b/ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts index 589088f5..023f77b0 100644 --- a/ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts +++ b/ticket_form/frontend/src/components/form/generateConfirmationFormHTML.ts @@ -811,14 +811,18 @@ export function generateConfirmationFormHTML(data: any, contact_data_confirmed: extra = ' type="email" inputmode="email" autocomplete="email"'; } + // ✅ Добавляем name атрибут для правильной работы форм и автозаполнения + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + (index !== undefined ? '_' + index : '') + '"'; var fieldHtml = ''; + ' id="' + id + '" ' + nameAttr + ' value="' + esc(value || '') + '" placeholder="' + esc(placeholder || '') + '"' + extra + ' />'; return fieldHtml; } function createReadonlyField(root, key, value) { var id = 'field_' + root + '_' + key + '_readonly_' + Math.random().toString(36).slice(2); - return ''; + // ✅ Добавляем name атрибут для правильной работы форм + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + '"'; + return ''; } function createDateField(root, key, value) { @@ -834,20 +838,25 @@ export function generateConfirmationFormHTML(data: any, contact_data_confirmed: } } + // ✅ Добавляем name атрибут для правильной работы форм + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + '"'; + // ✅ Проверяем, нужно ли блокировать поле (для подтверждённых данных) var isLockedField = contact_data_confirmed && root === 'user' && key === 'birthday'; if (isLockedField) { - return ''; + return ''; } - return ''; + return ''; } function createMoneyField(root, key, value) { var id = 'field_' + root + '_' + key + '_' + Math.random().toString(36).slice(2); + // ✅ Добавляем name атрибут для правильной работы форм + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + '"'; return '
' + '' + 'рублей' + '
'; @@ -855,20 +864,25 @@ export function generateConfirmationFormHTML(data: any, contact_data_confirmed: function createTextarea(root, key, value) { var id = 'field_' + root + '_' + key + '_' + Math.random().toString(36).slice(2); - return ''; + // ✅ Добавляем name атрибут для правильной работы форм + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + '"'; + return ''; } function createBankSelect(root, key, value) { var id = 'field_' + root + '_' + key + '_' + Math.random().toString(36).slice(2); var datalistId = 'bank-datalist-' + id; + // ✅ Добавляем name атрибут для правильной работы форм + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + '"'; // Создаём input с datalist для автоподстановки - var inputHtml = ''; + var inputHtml = ''; inputHtml += ''; inputHtml += ''; inputHtml += ''; // Скрытое поле для bank_id var hiddenId = id + '_id'; - inputHtml += ''; + var hiddenNameAttr = 'name="' + esc(root) + '_bank_id"'; + inputHtml += ''; return inputHtml; } @@ -876,9 +890,12 @@ export function generateConfirmationFormHTML(data: any, contact_data_confirmed: var id = 'field_' + root + '_' + key + '_' + Math.random().toString(36).slice(2); var checkedAttr = checked ? ' checked' : ''; var requiredClass = required ? ' required-checkbox' : ''; + // ✅ Добавляем name атрибут для правильной работы форм + var nameAttr = 'name="' + esc(root) + '_' + esc(key) + '"'; + // ✅ Label правильно связан с input через for/id var checkboxHtml = '';