Исправлен баг мультивыбора в 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

@@ -440,25 +440,20 @@
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) {
// Снять выбор
var oldProductId = this.state.selected.id;
this.state.selected = null;
this._updateProductUI(oldProductId);
this._clearAllSelections();
if (this.options.onDeselect) {
this.options.onDeselect(this);
}
} else {
// Сначала снимаем выбор со старого товара
if (this.state.selected) {
var oldProductId = this.state.selected.id;
this._updateProductUI(oldProductId);
}
// Выбираем новый товар
// ПРИНУДИТЕЛЬНО снимаем выбор со ВСЕХ товаров
this.state.selected = product;
this._clearAllSelections();
// Теперь выделяем только новый
this._updateProductUI(productId);
if (this.options.onSelect) {
this.options.onSelect(product, this);
@@ -469,6 +464,24 @@
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 товара
*/