Исправлен баг мультивыбора в single-select компоненте

Проблема: можно было выбрать несколько товаров одновременно
Причина: при смене выделения старый товар не всегда корректно находился в DOM

Решение:
- Добавлен метод _clearAllSelections() для принудительной очистки всех выделений
- Исправлено сравнение ID (добавлен String() в строке 443)
- При выборе нового товара сначала снимаются ВСЕ выделения через querySelectorAll
- Затем выделяется только новый выбранный товар
- Обновлена версия JS (v=3) для сброса кэша

Теперь гарантирован истинный single-select режим
This commit is contained in:
2025-12-11 00:35:25 +03:00
parent a573890895
commit 7dc54963d5
2 changed files with 24 additions and 11 deletions

View File

@@ -275,7 +275,7 @@
</div> </div>
<!-- JS для компонента поиска --> <!-- JS для компонента поиска -->
<script src="{% static 'products/js/product-search-picker.js' %}?v=2"></script> <script src="{% static 'products/js/product-search-picker.js' %}?v=3"></script>
<script> <script>
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
// Элементы формы // Элементы формы

View File

@@ -440,25 +440,20 @@
if (!product) return; if (!product) return;
var isSelected = this.state.selected && this.state.selected.id === productId; var isSelected = this.state.selected && String(this.state.selected.id) === String(productId);
if (isSelected) { if (isSelected) {
// Снять выбор // Снять выбор
var oldProductId = this.state.selected.id;
this.state.selected = null; this.state.selected = null;
this._updateProductUI(oldProductId); this._clearAllSelections();
if (this.options.onDeselect) { if (this.options.onDeselect) {
this.options.onDeselect(this); this.options.onDeselect(this);
} }
} else { } else {
// Сначала снимаем выбор со старого товара // ПРИНУДИТЕЛЬНО снимаем выбор со ВСЕХ товаров
if (this.state.selected) {
var oldProductId = this.state.selected.id;
this._updateProductUI(oldProductId);
}
// Выбираем новый товар
this.state.selected = product; this.state.selected = product;
this._clearAllSelections();
// Теперь выделяем только новый
this._updateProductUI(productId); this._updateProductUI(productId);
if (this.options.onSelect) { if (this.options.onSelect) {
this.options.onSelect(product, this); this.options.onSelect(product, this);
@@ -469,6 +464,24 @@
this._updateSelectionUI(); this._updateSelectionUI();
}; };
/**
* Принудительно снять выделение со всех товаров
*/
ProductSearchPicker.prototype._clearAllSelections = function() {
// Удаляем класс selected со всех товаров в DOM
if (this.elements.grid) {
var allItems = this.elements.grid.querySelectorAll('.product-picker-item');
allItems.forEach(function(item) {
item.classList.remove('selected');
// Удаляем галочку в grid view
var checkIcon = item.querySelector('.check-icon');
if (checkIcon) {
checkIcon.remove();
}
});
}
};
/** /**
* Обновление UI товара * Обновление UI товара
*/ */