Исправлен баг мультивыбора в single-select компоненте
Проблема: можно было выбрать несколько товаров одновременно Причина: при смене выделения старый товар не всегда корректно находился в DOM Решение: - Добавлен метод _clearAllSelections() для принудительной очистки всех выделений - Исправлено сравнение ID (добавлен String() в строке 443) - При выборе нового товара сначала снимаются ВСЕ выделения через querySelectorAll - Затем выделяется только новый выбранный товар - Обновлена версия JS (v=3) для сброса кэша Теперь гарантирован истинный single-select режим
This commit is contained in:
@@ -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() {
|
||||||
// Элементы формы
|
// Элементы формы
|
||||||
|
|||||||
@@ -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 товара
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user