Fix: Enable autosave for delivery address fields with partial data
Исправлена проблема с автосохранением полей адреса доставки. Теперь адрес сохраняется при заполнении любого поля, а не только при наличии улицы и номера дома. Изменения в Backend (address_service.py): - Изменена логика валидации в process_address_from_form() - Теперь адрес сохраняется если заполнено хотя бы одно поле - Удалено жёсткое требование заполнения street и building_number - Проверяем наличие данных во всех полях адреса Изменения в Frontend (autosave.js): - Переработана логика сбора данных адреса - address_mode='new' устанавливается при заполнении любого поля адреса - Все непустые поля адреса отправляются на сервер - Используется более элегантный подход с Object.values() и .some() Теперь автосохранение работает корректно: - Заполнение поля "Улица" → автосохранение срабатывает - Заполнение "Номер дома" → автосохранение срабатывает - Заполнение любого другого поля адреса → автосохранение срабатывает - После перезагрузки страницы все данные восстанавливаются 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -74,11 +74,23 @@ class AddressService:
|
|||||||
street = form_data.get('address_street', '').strip()
|
street = form_data.get('address_street', '').strip()
|
||||||
building_number = form_data.get('address_building_number', '').strip()
|
building_number = form_data.get('address_building_number', '').strip()
|
||||||
|
|
||||||
if not street or not building_number:
|
# Для автосохранения разрешаем сохранять адрес даже если не все поля заполнены
|
||||||
# Если обязательные поля не заполнены, возвращаем None
|
# Проверяем только что хотя бы одно поле адреса заполнено
|
||||||
|
has_any_address_data = any([
|
||||||
|
street,
|
||||||
|
building_number,
|
||||||
|
form_data.get('address_apartment_number', '').strip(),
|
||||||
|
form_data.get('address_entrance', '').strip(),
|
||||||
|
form_data.get('address_floor', '').strip(),
|
||||||
|
form_data.get('address_intercom_code', '').strip(),
|
||||||
|
form_data.get('address_delivery_instructions', '').strip(),
|
||||||
|
])
|
||||||
|
|
||||||
|
if not has_any_address_data:
|
||||||
|
# Если все поля адреса пустые, возвращаем None
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# Создаем новый адрес
|
# Создаем новый адрес (даже если не все обязательные поля заполнены)
|
||||||
address = AddressService.create_address_from_form_data(form_data)
|
address = AddressService.create_address_from_form_data(form_data)
|
||||||
return address
|
return address
|
||||||
|
|
||||||
|
|||||||
@@ -371,40 +371,37 @@
|
|||||||
|
|
||||||
// Поля адреса доставки (новая логика с прямым вводом)
|
// Поля адреса доставки (новая логика с прямым вводом)
|
||||||
const addressStreetField = form.querySelector('input[name="address_street"]');
|
const addressStreetField = form.querySelector('input[name="address_street"]');
|
||||||
if (addressStreetField && addressStreetField.value) {
|
|
||||||
data.address_street = addressStreetField.value;
|
|
||||||
// Указываем режим "новый адрес" если есть улица
|
|
||||||
data.address_mode = 'new';
|
|
||||||
}
|
|
||||||
|
|
||||||
const addressBuildingField = form.querySelector('input[name="address_building_number"]');
|
const addressBuildingField = form.querySelector('input[name="address_building_number"]');
|
||||||
if (addressBuildingField && addressBuildingField.value) {
|
|
||||||
data.address_building_number = addressBuildingField.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
const addressApartmentField = form.querySelector('input[name="address_apartment_number"]');
|
const addressApartmentField = form.querySelector('input[name="address_apartment_number"]');
|
||||||
if (addressApartmentField && addressApartmentField.value) {
|
|
||||||
data.address_apartment_number = addressApartmentField.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
const addressEntranceField = form.querySelector('input[name="address_entrance"]');
|
const addressEntranceField = form.querySelector('input[name="address_entrance"]');
|
||||||
if (addressEntranceField && addressEntranceField.value) {
|
|
||||||
data.address_entrance = addressEntranceField.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
const addressFloorField = form.querySelector('input[name="address_floor"]');
|
const addressFloorField = form.querySelector('input[name="address_floor"]');
|
||||||
if (addressFloorField && addressFloorField.value) {
|
|
||||||
data.address_floor = addressFloorField.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
const addressIntercomField = form.querySelector('input[name="address_intercom_code"]');
|
const addressIntercomField = form.querySelector('input[name="address_intercom_code"]');
|
||||||
if (addressIntercomField && addressIntercomField.value) {
|
|
||||||
data.address_intercom_code = addressIntercomField.value;
|
|
||||||
}
|
|
||||||
|
|
||||||
const addressInstructionsField = form.querySelector('textarea[name="address_delivery_instructions"]');
|
const addressInstructionsField = form.querySelector('textarea[name="address_delivery_instructions"]');
|
||||||
if (addressInstructionsField && addressInstructionsField.value) {
|
|
||||||
data.address_delivery_instructions = addressInstructionsField.value;
|
// Собираем все поля адреса
|
||||||
|
const addressFields = {
|
||||||
|
address_street: addressStreetField?.value || '',
|
||||||
|
address_building_number: addressBuildingField?.value || '',
|
||||||
|
address_apartment_number: addressApartmentField?.value || '',
|
||||||
|
address_entrance: addressEntranceField?.value || '',
|
||||||
|
address_floor: addressFloorField?.value || '',
|
||||||
|
address_intercom_code: addressIntercomField?.value || '',
|
||||||
|
address_delivery_instructions: addressInstructionsField?.value || '',
|
||||||
|
};
|
||||||
|
|
||||||
|
// Проверяем, заполнено ли хотя бы одно поле адреса
|
||||||
|
const hasAnyAddressData = Object.values(addressFields).some(value => value.trim() !== '');
|
||||||
|
|
||||||
|
if (hasAnyAddressData) {
|
||||||
|
// Указываем режим "новый адрес" если заполнено хотя бы одно поле
|
||||||
|
data.address_mode = 'new';
|
||||||
|
|
||||||
|
// Добавляем все непустые поля в данные
|
||||||
|
Object.entries(addressFields).forEach(([key, value]) => {
|
||||||
|
if (value.trim() !== '') {
|
||||||
|
data[key] = value;
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const addressConfirmField = form.querySelector('input[name="address_confirm_with_recipient"]');
|
const addressConfirmField = form.querySelector('input[name="address_confirm_with_recipient"]');
|
||||||
|
|||||||
Reference in New Issue
Block a user