From b6f1e09ba5beec39fe8fe353d45125f97a0b41dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=9D=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Mon, 8 Dec 2025 13:37:20 +0300 Subject: [PATCH] fix: prevent double form submission in employee edit form Problem: - When editing employee profile, got duplicate PATCH requests - One request returned 502, another 200 OK - Error appeared in console but operation succeeded - Classic double-submit race condition Root Cause: initEmployeeForm() added new addEventListener('submit') on every call. If function was called twice (e.g., on tab navigation or re-render), two event handlers would fire simultaneously, sending parallel requests. Solution: 1. Check if form already initialized via data-attribute 2. Set form.dataset.employeeFormInitialized = 'true' flag 3. Skip re-initialization if already initialized 4. Return API object for already initialized forms This ensures only ONE submit handler per form, preventing: - Duplicate PATCH requests - 502 errors from race conditions - Confusing UX with errors that don't break functionality Now form submits cleanly with single request. --- .../static/js/components/employeeFormHandler.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/backend/static/js/components/employeeFormHandler.js b/backend/static/js/components/employeeFormHandler.js index dfaaf2c8..5157160f 100644 --- a/backend/static/js/components/employeeFormHandler.js +++ b/backend/static/js/components/employeeFormHandler.js @@ -12,7 +12,22 @@ export function initEmployeeForm(options = {}) { return null; } + // Проверяем, не была ли форма уже инициализирована + if (form.dataset.employeeFormInitialized === 'true') { + console.warn('[EmployeeForm] Форма уже инициализирована, пропускаем повторную инициализацию'); + return { + setSubmitting: (state) => { + const submitBtn = form.querySelector('button[type="submit"]'); + if (submitBtn) submitBtn.disabled = state; + }, + refresh: () => location.reload() + }; + } + console.info('[EmployeeForm] Инициализация AJAX обработчика формы'); + + // Помечаем форму как инициализированную + form.dataset.employeeFormInitialized = 'true'; // Перехватываем submit формы form.addEventListener('submit', async (e) => {