diff --git a/myproject/inventory/templates/inventory/writeoff_document/detail.html b/myproject/inventory/templates/inventory/writeoff_document/detail.html index 0b062c6..217b69c 100644 --- a/myproject/inventory/templates/inventory/writeoff_document/detail.html +++ b/myproject/inventory/templates/inventory/writeoff_document/detail.html @@ -189,24 +189,60 @@ {% for item in document.items.all %} - + {{ item.product.name }} - {{ item.quantity }} - - {{ item.get_reason_display }} + + {{ item.quantity }} + {% if document.can_edit %} + + {% endif %} - {% if item.notes %}{{ item.notes|truncatechars:50 }}{% else %}-{% endif %} + {{ item.get_reason_display }} + {% if document.can_edit %} + + {% endif %} + + + {% if item.notes %}{{ item.notes|truncatechars:50 }}{% else %}-{% endif %} + {% if document.can_edit %} + + {% endif %} {% if document.can_edit %} -
- {% csrf_token %} - + + + + + {% csrf_token %}
{% endif %} @@ -311,6 +347,149 @@ document.addEventListener('DOMContentLoaded', function() { if (clearSelectedBtn) { clearSelectedBtn.addEventListener('click', clearSelectedProduct); } + + // ============================================ + // Inline редактирование позиций в таблице + // ============================================ + + // Хранилище оригинальных значений при редактировании + const originalValues = {}; + + // Обработчики для кнопок редактирования + document.querySelectorAll('.btn-edit-item').forEach(btn => { + btn.addEventListener('click', function() { + const row = this.closest('tr'); + const itemId = row.dataset.itemId; + + // Сохраняем оригинальные значения + originalValues[itemId] = { + quantity: row.querySelector('.item-quantity-input').value, + reason: row.querySelector('.item-reason-input').value, + notes: row.querySelector('.item-notes-input').value + }; + + // Переключаем в режим редактирования + toggleEditMode(row, true); + }); + }); + + // Обработчики для кнопок сохранения + document.querySelectorAll('.btn-save-item').forEach(btn => { + btn.addEventListener('click', function() { + const row = this.closest('tr'); + const itemId = row.dataset.itemId; + saveItemChanges(itemId, row); + }); + }); + + // Обработчики для кнопок отмены + document.querySelectorAll('.btn-cancel-edit').forEach(btn => { + btn.addEventListener('click', function() { + const row = this.closest('tr'); + const itemId = row.dataset.itemId; + + // Восстанавливаем оригинальные значения + if (originalValues[itemId]) { + row.querySelector('.item-quantity-input').value = originalValues[itemId].quantity; + row.querySelector('.item-reason-input').value = originalValues[itemId].reason; + row.querySelector('.item-notes-input').value = originalValues[itemId].notes; + } + + // Выходим из режима редактирования + toggleEditMode(row, false); + }); + }); + + /** + * Переключение режима редактирования строки + */ + function toggleEditMode(row, isEditing) { + // Переключаем видимость полей отображения/ввода + row.querySelectorAll('.item-quantity-display, .item-reason-display, .item-notes-display').forEach(el => { + el.style.display = isEditing ? 'none' : ''; + }); + row.querySelectorAll('.item-quantity-input, .item-reason-input, .item-notes-input').forEach(el => { + el.style.display = isEditing ? '' : 'none'; + }); + + // Переключаем видимость кнопок + row.querySelector('.item-action-buttons').style.display = isEditing ? 'none' : ''; + row.querySelector('.item-edit-buttons').style.display = isEditing ? '' : 'none'; + + // Фокус на поле количества при входе в режим редактирования + if (isEditing) { + const qtyInput = row.querySelector('.item-quantity-input'); + if (qtyInput) { + qtyInput.focus(); + qtyInput.select(); + } + } + } + + /** + * Сохранение изменений позиции + */ + function saveItemChanges(itemId, row) { + const quantity = row.querySelector('.item-quantity-input').value; + const reason = row.querySelector('.item-reason-input').value; + const notes = row.querySelector('.item-notes-input').value; + + // Валидация + if (!quantity || parseFloat(quantity) <= 0) { + alert('Количество должно быть больше нуля'); + return; + } + + // Отправляем на сервер + const formData = new FormData(); + formData.append('quantity', quantity); + formData.append('reason', reason); + formData.append('notes', notes); + formData.append('csrfmiddlewaretoken', document.querySelector('[name=csrfmiddlewaretoken]').value); + + // Блокируем кнопки во время сохранения + const saveBtn = row.querySelector('.btn-save-item'); + const cancelBtn = row.querySelector('.btn-cancel-edit'); + saveBtn.disabled = true; + cancelBtn.disabled = true; + saveBtn.innerHTML = ''; + + fetch(`/inventory/writeoff-documents/{{ document.pk }}/update-item/${itemId}/`, { + method: 'POST', + body: formData, + headers: { + 'X-Requested-With': 'XMLHttpRequest' + } + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + // Обновляем отображение + row.querySelector('.item-quantity-display').textContent = quantity; + const reasonSelect = row.querySelector('.item-reason-input'); + const reasonLabel = reasonSelect.options[reasonSelect.selectedIndex].text; + row.querySelector('.item-reason-display').innerHTML = `${reasonLabel}`; + row.querySelector('.item-notes-display').textContent = notes || '-'; + + // Выходим из режима редактирования + toggleEditMode(row, false); + + // Показываем успешное сообщение (опционально) + // alert(data.message); + } else { + alert('Ошибка: ' + data.error); + } + }) + .catch(error => { + console.error('Error:', error); + alert('Произошла ошибка при сохранении'); + }) + .finally(() => { + saveBtn.disabled = false; + cancelBtn.disabled = false; + saveBtn.innerHTML = ''; + }); + } }); {% endblock %}