From 58dd60b19a5e6309c9a9950a81d5fb8f87d6d504 Mon Sep 17 00:00:00 2001 From: Andrey Smakotin Date: Sun, 9 Nov 2025 13:32:21 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B0=D0=B2=D1=82=D0=BE=D1=81=D0=BE=D1=85=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=82=D0=BE=D0=B2=D0=B0=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=B2=20=D1=87=D0=B5=D1=80=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=B8=D0=BA=D0=B0=D1=85=20=D0=B7=D0=B0=D0=BA=D0=B0=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Исправлен ID контейнера формсета (order-items-container) - Добавлена поддержка событий Select2 для полей выбора товара - Добавлен MutationObserver для отслеживания новых форм товаров - Удалены отладочные console.log 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- myproject/orders/static/orders/js/autosave.js | 30 +++++-------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/myproject/orders/static/orders/js/autosave.js b/myproject/orders/static/orders/js/autosave.js index 56f2138..f985a29 100644 --- a/myproject/orders/static/orders/js/autosave.js +++ b/myproject/orders/static/orders/js/autosave.js @@ -25,25 +25,20 @@ * Инициализация модуля автосохранения */ function init() { - console.log('[Autosave] Attempting to initialize...'); - // Проверяем, что мы на странице редактирования const isEditPage = window.location.pathname.includes('/edit/'); if (!isEditPage) { - console.log('[Autosave] Not on edit page, exiting'); return; } const orderForm = document.getElementById('order-form'); if (!orderForm) { - console.log('[Autosave] Order form not found, exiting'); return; } // Получаем ID заказа из URL const urlMatch = window.location.pathname.match(/\/orders\/(\d+)\/edit\//); if (!urlMatch) { - console.log('[Autosave] Could not extract order ID from URL, exiting'); return; } orderId = urlMatch[1]; @@ -51,12 +46,9 @@ // Проверяем, является ли заказ черновиком isDraft = checkIfDraft(); if (!isDraft) { - console.log('[Autosave] Not a draft order, exiting'); return; } - console.log('[Autosave] Initialized for draft order #' + orderId); - // Инициализируем UI индикатора initStatusIndicator(); @@ -71,7 +63,6 @@ // Проверяем через data-атрибут на форме const form = document.getElementById('order-form'); if (form && form.dataset.isDraft === 'true') { - console.log('[Autosave] Form has data-is-draft="true"'); return true; } @@ -165,12 +156,9 @@ function attachEventListeners() { const form = document.getElementById('order-form'); if (!form) { - console.log('[Autosave] Form not found in attachEventListeners'); return; } - console.log('[Autosave] Attaching event listeners to form fields'); - // Слушаем изменения в основных полях заказа const fieldsToWatch = [ 'select[name="customer"]', @@ -202,15 +190,13 @@ // Слушаем изменения в формах товаров (formset) observeFormsetChanges(); - - console.log('[Autosave] Event listeners attached'); } /** * Наблюдает за изменениями в формсете товаров */ function observeFormsetChanges() { - const formsetContainer = document.getElementById('order-items-formset'); + const formsetContainer = document.getElementById('order-items-container'); if (!formsetContainer) { return; } @@ -242,9 +228,15 @@ } const fields = form.querySelectorAll('select, input[type="number"], input[type="checkbox"]'); + fields.forEach(field => { if (field.tagName === 'SELECT' || field.type === 'checkbox') { field.addEventListener('change', scheduleAutosave); + + // Для Select2 добавляем дополнительный обработчик + if (window.jQuery && jQuery(field).data('select2')) { + jQuery(field).on('select2:select', scheduleAutosave); + } } else { field.addEventListener('input', scheduleAutosave); } @@ -267,8 +259,6 @@ autosaveTimer = setTimeout(() => { performAutosave(); }, CONFIG.AUTOSAVE_DELAY); - - console.log('[Autosave] Scheduled in ' + CONFIG.AUTOSAVE_DELAY + 'ms'); } /** @@ -276,7 +266,6 @@ */ async function performAutosave() { if (isAutosaving) { - console.log('[Autosave] Already in progress, skipping'); return; } @@ -303,15 +292,12 @@ if (response.ok && data.success) { const lastSaved = formatDateTime(data.last_saved); showStatus('success', 'Сохранено ' + lastSaved); - console.log('[Autosave] Success:', data); } else { showStatus('error', 'Ошибка: ' + (data.error || 'Неизвестная ошибка')); - console.error('[Autosave] Error:', data); } } catch (error) { showStatus('error', 'Ошибка соединения с сервером'); - console.error('[Autosave] Exception:', error); } finally { isAutosaving = false; } @@ -408,7 +394,7 @@ const items = []; const itemForms = document.querySelectorAll('.order-item-form'); - itemForms.forEach((form, index) => { + itemForms.forEach(form => { // Пропускаем удаленные формы const deleteCheckbox = form.querySelector('input[name$="-DELETE"]'); if (deleteCheckbox && deleteCheckbox.checked) {