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:
2025-11-02 20:10:52 +03:00
parent c228f80ffd
commit c7bf23c79c
2 changed files with 269 additions and 7 deletions

View File

@@ -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"]');