Перестроена структура формы доставки: создана секция Получатель
- Удален выбор режима адреса (История/Новый/Пусто) - Поля адреса теперь показаны сразу под кнопками доставки - Создана новая секция "Получатель" под полями адреса с бордюром сверху - Перемещен чекбокс "Покупатель является получателем" в секцию Получатель - Поля получателя (имя и телефон) теперь в той же секции - Удалены CSS стили для скрытого/видимого режимов адреса - Удалена функция initAddressModeToggle() - Упрощена UX: доставка → адрес → получатель 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -16,23 +16,6 @@
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/* Явное управление видимостью режимов адреса */
|
||||
#address-history-mode {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
#address-new-mode {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
#address-history-mode.visible {
|
||||
display: block !important;
|
||||
}
|
||||
|
||||
#address-new-mode.visible {
|
||||
display: block !important;
|
||||
}
|
||||
|
||||
/* Стили для поиска клиента */
|
||||
.customer-option {
|
||||
padding: 5px 0;
|
||||
@@ -225,77 +208,7 @@
|
||||
|
||||
<!-- Поля доставки (показываются только если выбрана доставка) -->
|
||||
<div id="delivery-mode-fields" style="display: block;">
|
||||
<!-- Чекбокс "Покупатель = получатель" -->
|
||||
<div class="mb-3 form-check">
|
||||
{{ form.customer_is_recipient }}
|
||||
<label class="form-check-label" for="{{ form.customer_is_recipient.id_for_label }}">
|
||||
Покупатель является получателем
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Поля получателя (показываются когда покупатель != получатель) -->
|
||||
<div class="row" id="recipient-fields" style="display: none;">
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.recipient_name.id_for_label }}" class="form-label">
|
||||
Имя получателя <span class="text-danger">*</span>
|
||||
</label>
|
||||
{{ form.recipient_name }}
|
||||
{% if form.recipient_name.errors %}
|
||||
<div class="text-danger">{{ form.recipient_name.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.recipient_phone.id_for_label }}" class="form-label">
|
||||
Телефон получателя <span class="text-danger">*</span>
|
||||
</label>
|
||||
{{ form.recipient_phone }}
|
||||
{% if form.recipient_phone.errors %}
|
||||
<div class="text-danger">{{ form.recipient_phone.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Способ указания адреса -->
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="mb-3">
|
||||
<label class="form-label">{{ form.address_mode.label }}</label>
|
||||
<div class="mt-2">
|
||||
{% for choice in form.address_mode %}
|
||||
<div class="form-check">
|
||||
{{ choice.tag }}
|
||||
<label class="form-check-label" for="{{ choice.id_for_label }}">
|
||||
{{ choice.choice_label }}
|
||||
</label>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% if form.address_mode.errors %}
|
||||
<div class="text-danger">{{ form.address_mode.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Режим 1: Выбор из истории -->
|
||||
<div class="col-md-6" id="address-history-mode">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.address_from_history.id_for_label }}" class="form-label">
|
||||
{{ form.address_from_history.label }}
|
||||
</label>
|
||||
{{ form.address_from_history }}
|
||||
{% if form.address_from_history.errors %}
|
||||
<div class="text-danger">{{ form.address_from_history.errors }}</div>
|
||||
{% endif %}
|
||||
<small class="text-muted d-block mt-2">Загрузка адресов из истории...</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Режим 2: Ввод нового адреса -->
|
||||
<div class="col-12" id="address-new-mode">
|
||||
<!-- Поля ввода адреса доставки -->
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
@@ -392,9 +305,48 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Получатель -->
|
||||
<div class="border-top pt-3 mt-3">
|
||||
<h6 class="mb-3">Получатель</h6>
|
||||
|
||||
<!-- Чекбокс "Покупатель = получатель" -->
|
||||
<div class="mb-3 form-check">
|
||||
{{ form.customer_is_recipient }}
|
||||
<label class="form-check-label" for="{{ form.customer_is_recipient.id_for_label }}">
|
||||
Покупатель является получателем
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Поля получателя (показываются когда покупатель != получатель) -->
|
||||
<div class="row" id="recipient-fields" style="display: none;">
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.recipient_name.id_for_label }}" class="form-label">
|
||||
Имя получателя <span class="text-danger">*</span>
|
||||
</label>
|
||||
{{ form.recipient_name }}
|
||||
{% if form.recipient_name.errors %}
|
||||
<div class="text-danger">{{ form.recipient_name.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.recipient_phone.id_for_label }}" class="form-label">
|
||||
Телефон получателя <span class="text-danger">*</span>
|
||||
</label>
|
||||
{{ form.recipient_phone }}
|
||||
{% if form.recipient_phone.errors %}
|
||||
<div class="text-danger">{{ form.recipient_phone.errors }}</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Стоимость доставки -->
|
||||
<div class="row mt-3">
|
||||
<div class="col-md-6">
|
||||
<div class="mb-3">
|
||||
<label for="{{ form.delivery_cost.id_for_label }}" class="form-label">Стоимость доставки</label>
|
||||
@@ -405,6 +357,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row" id="pickup-fields" style="display: none;">
|
||||
<div class="col-md-6">
|
||||
@@ -859,115 +812,6 @@ window.openCreateCustomerModal = function(searchText = '') {
|
||||
createCustomerModal.show();
|
||||
};
|
||||
|
||||
// === ИНИЦИАЛИЗАЦИЯ РЕЖИМОВ АДРЕСА (вне jQuery зависимости) ===
|
||||
function initAddressModeToggle() {
|
||||
console.log('[ADDRESS MODE] Initializing address mode toggle');
|
||||
|
||||
const addressModeRadios = document.querySelectorAll('input[name="address_mode"]');
|
||||
const addressHistoryMode = document.getElementById('address-history-mode');
|
||||
const addressNewMode = document.getElementById('address-new-mode');
|
||||
const customerSelect = document.getElementById('id_customer');
|
||||
|
||||
if (!addressHistoryMode || !addressNewMode) {
|
||||
console.error('[ADDRESS MODE] address-history-mode or address-new-mode not found in DOM');
|
||||
return;
|
||||
}
|
||||
|
||||
function toggleAddressMode() {
|
||||
console.log('[ADDRESS MODE] toggleAddressMode() called');
|
||||
const checkedRadio = document.querySelector('input[name="address_mode"]:checked');
|
||||
if (!checkedRadio) {
|
||||
console.log('[ADDRESS MODE] No radio checked, setting default to "empty"');
|
||||
const emptyRadio = document.querySelector('input[name="address_mode"][value="empty"]');
|
||||
if (emptyRadio) {
|
||||
emptyRadio.checked = true;
|
||||
}
|
||||
}
|
||||
|
||||
const selectedMode = document.querySelector('input[name="address_mode"]:checked').value;
|
||||
console.log('[ADDRESS MODE] Selected mode:', selectedMode);
|
||||
|
||||
// Убираем класс visible со всех режимов
|
||||
addressHistoryMode.classList.remove('visible');
|
||||
addressNewMode.classList.remove('visible');
|
||||
|
||||
if (selectedMode === 'history') {
|
||||
console.log('[ADDRESS MODE] Showing history mode');
|
||||
addressHistoryMode.classList.add('visible');
|
||||
loadAddressHistory();
|
||||
} else if (selectedMode === 'new') {
|
||||
console.log('[ADDRESS MODE] Showing new address mode');
|
||||
addressNewMode.classList.add('visible');
|
||||
} else {
|
||||
console.log('[ADDRESS MODE] Empty mode - hiding all sections');
|
||||
}
|
||||
}
|
||||
|
||||
function loadAddressHistory() {
|
||||
console.log('[ADDRESS MODE] loadAddressHistory() called');
|
||||
const customerId = customerSelect.value;
|
||||
console.log('[ADDRESS MODE] Customer ID:', customerId);
|
||||
|
||||
if (!customerId) {
|
||||
const addressSelect = document.getElementById('id_address_from_history');
|
||||
addressSelect.innerHTML = '<option value="">-- История недоступна (клиент не выбран) --</option>';
|
||||
return;
|
||||
}
|
||||
|
||||
fetch(`{% url 'orders:api-customer-address-history' %}?customer_id=${customerId}`)
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
console.log('[ADDRESS MODE] Address history data:', data);
|
||||
const addressSelect = document.getElementById('id_address_from_history');
|
||||
|
||||
if (!data.success || data.count === 0) {
|
||||
addressSelect.innerHTML = '<option value="">-- История адресов не найдена --</option>';
|
||||
return;
|
||||
}
|
||||
|
||||
let optionsHTML = '<option value="">-- Выберите адрес --</option>';
|
||||
data.addresses.forEach(addr => {
|
||||
optionsHTML += `<option value="${addr.id}">${addr.display}</option>`;
|
||||
});
|
||||
addressSelect.innerHTML = optionsHTML;
|
||||
|
||||
// Если есть Select2, обновляем его
|
||||
if (typeof $ !== 'undefined' && $(addressSelect).data('select2')) {
|
||||
$(addressSelect).trigger('change');
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('[ADDRESS MODE] Error loading address history:', error);
|
||||
const addressSelect = document.getElementById('id_address_from_history');
|
||||
addressSelect.innerHTML = '<option value="">-- Ошибка загрузки --</option>';
|
||||
});
|
||||
}
|
||||
|
||||
// Добавляем обработчики на radio кнопки
|
||||
addressModeRadios.forEach(radio => {
|
||||
console.log('[ADDRESS MODE] Adding listener to radio:', radio.value);
|
||||
radio.addEventListener('change', function() {
|
||||
console.log('[ADDRESS MODE] Radio changed to:', this.value);
|
||||
toggleAddressMode();
|
||||
});
|
||||
});
|
||||
|
||||
// Загружаем адреса при изменении клиента
|
||||
if (customerSelect) {
|
||||
customerSelect.addEventListener('change', function() {
|
||||
console.log('[ADDRESS MODE] Customer changed');
|
||||
loadAddressHistory();
|
||||
});
|
||||
}
|
||||
|
||||
// Инициализация при загрузке
|
||||
console.log('[ADDRESS MODE] Initial toggle call');
|
||||
toggleAddressMode();
|
||||
}
|
||||
|
||||
// Вызываем инициализацию адреса СРАЗУ (не зависит от jQuery)
|
||||
initAddressModeToggle();
|
||||
|
||||
// Вызываем инициализацию Select2 для customer
|
||||
initCustomerSelect2();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user