fix: Улучшить загрузку сохранённых значений корректировки цены на странице редактирования
Исправлена критическая проблема, когда сохранённые значения корректировки цены не отображались надёжно на странице редактирования (отображались только в 1 из 10 случаев). Причина проблемы: - При загрузке значений в поля input, срабатывают события input/change - Эти события вызывают calculateFinalPrice() и validateSingleAdjustment() - calculateFinalPrice() перезаписывает скрытые поля со значениями по умолчанию Решение: - Добавлен флаг isLoadingAdjustmentValues для подавления событий input/change - Во время загрузки значений: флаг = true, события игнорируются - После загрузки: флаг = false, события обрабатываются нормально - Использование requestAnimationFrame для более надёжной синхронизации Файлы изменены: - productkit_edit.html (добавлены флаги и логика подавления событий) 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -153,8 +153,8 @@
|
||||
</div>
|
||||
|
||||
<!-- Скрытые поля для формы (автоматически заполняются JavaScript) -->
|
||||
<input type="hidden" id="id_price_adjustment_type" name="price_adjustment_type" value="{{ form.price_adjustment_type.value }}">
|
||||
<input type="hidden" id="id_price_adjustment_value" name="price_adjustment_value" value="{{ form.price_adjustment_value.value }}"}
|
||||
<input type="hidden" id="id_price_adjustment_type" name="price_adjustment_type" value="{{ object.price_adjustment_type|default:'none' }}">
|
||||
<input type="hidden" id="id_price_adjustment_value" name="price_adjustment_value" value="{{ object.price_adjustment_value|default:0 }}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -431,6 +431,8 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
const finalPriceDisplay = document.getElementById('finalPriceDisplay');
|
||||
|
||||
let basePrice = 0;
|
||||
let isInitializing = true; // Флаг чтобы не перезаписывать значения во время инициализации
|
||||
let isLoadingAdjustmentValues = false; // Флаг для подавления событий input/change при загрузке сохранённых значений
|
||||
|
||||
// Кэш цен товаров для быстрого доступа
|
||||
const priceCache = {};
|
||||
@@ -581,9 +583,12 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
adjustmentValue = decreaseAmount;
|
||||
}
|
||||
|
||||
// Обновляем скрытые поля (автоматически, без очистки пользовательского ввода)
|
||||
adjustmentTypeInput.value = adjustmentType;
|
||||
adjustmentValueInput.value = adjustmentValue;
|
||||
// Обновляем скрытые поля только если инициализация завершена
|
||||
// Во время инициализации не перезаписываем сохранённые значения
|
||||
if (!isInitializing) {
|
||||
adjustmentTypeInput.value = adjustmentType;
|
||||
adjustmentValueInput.value = adjustmentValue;
|
||||
}
|
||||
|
||||
// Рассчитываем финальную цену
|
||||
let finalPrice = basePrice;
|
||||
@@ -676,10 +681,20 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
[increasePercentInput, increaseAmountInput, decreasePercentInput, decreaseAmountInput].forEach(input => {
|
||||
if (input) {
|
||||
input.addEventListener('input', () => {
|
||||
// Пропускаем обработку во время загрузки сохранённых значений
|
||||
if (isLoadingAdjustmentValues) {
|
||||
console.log('Skipping event during adjustment value loading');
|
||||
return;
|
||||
}
|
||||
validateSingleAdjustment();
|
||||
calculateFinalPrice();
|
||||
});
|
||||
input.addEventListener('change', () => {
|
||||
// Пропускаем обработку во время загрузки сохранённых значений
|
||||
if (isLoadingAdjustmentValues) {
|
||||
console.log('Skipping event during adjustment value loading');
|
||||
return;
|
||||
}
|
||||
validateSingleAdjustment();
|
||||
calculateFinalPrice();
|
||||
});
|
||||
@@ -893,6 +908,10 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
});
|
||||
|
||||
if (currentAdjustmentType && currentAdjustmentType !== 'none' && currentAdjustmentValue > 0) {
|
||||
// Устанавливаем флаг подавления событий перед заполнением полей
|
||||
isLoadingAdjustmentValues = true;
|
||||
console.log('isLoadingAdjustmentValues = true, suppressing input/change events');
|
||||
|
||||
// Заполняем соответствующее поле ввода в зависимости от сохранённого типа
|
||||
if (currentAdjustmentType === 'increase_percent') {
|
||||
increasePercentInput.value = currentAdjustmentValue;
|
||||
@@ -910,11 +929,24 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
|
||||
// Обновляем состояние полей (отключаем остальные, помечаем как валидные)
|
||||
validateSingleAdjustment();
|
||||
|
||||
// Отключаем флаг подавления событий после загрузки
|
||||
isLoadingAdjustmentValues = false;
|
||||
console.log('isLoadingAdjustmentValues = false, events are enabled again');
|
||||
}
|
||||
|
||||
// Пересчитываем цену после загрузки значений
|
||||
// Пересчитываем цену после загрузки значений (isInitializing всё ещё true, поэтому не перепишет скрытые поля)
|
||||
await calculateFinalPrice();
|
||||
}, 100);
|
||||
|
||||
// Даем время на завершение всех событий, затем завершаем инициализацию
|
||||
// Используем requestAnimationFrame для более надежной синхронизации
|
||||
requestAnimationFrame(() => {
|
||||
requestAnimationFrame(() => {
|
||||
isInitializing = false;
|
||||
console.log('Initialization complete, isInitializing =', isInitializing);
|
||||
});
|
||||
});
|
||||
}, 500); // Увеличили timeout чтобы дать время на полную инициализацию
|
||||
|
||||
// ========== ВАЛИДАЦИЯ ПЕРЕД ОТПРАВКОЙ ==========
|
||||
const kitForm = document.querySelector('form[method="post"]');
|
||||
|
||||
Reference in New Issue
Block a user