Исправлен Select2 поиск товаров при создании группы вариантов
Проблема: при создании новой группы вариантов (VariantGroup) поиск товаров через Select2 не работал. При редактировании существующих групп всё работало корректно. Причина: отсутствовали проверки инициализации Select2, обработка ошибок AJAX запросов и валидация параметров. Изменения: 1. select2-product-init.html - улучшена функция initProductSelect2: - Добавлена валидация входных параметров (element, apiUrl) - Добавлена проверка загрузки jQuery и Select2 - Улучшена проверка повторной инициализации - Добавлен try-catch для обработки ошибок - Функция возвращает boolean (успех/неудача) - Добавлено логирование для отладки 2. variantgroup_form.html - улучшены все функции работы с формой: initSelect2ForRow: - Добавлена проверка существования row и select элемента - Удаление старых обработчиков перед инициализацией - Проверка результата инициализации Select2 updateRowData: - Добавлен timeout (5 сек) для fetch запросов - Добавлена проверка статуса HTTP ответа - Улучшена обработка ошибок с fallback данными - Добавлено логирование ошибок DOMContentLoaded инициализация: - Добавлена валидация контейнера, totalFormsInput и apiUrl - Задержка перед инициализацией существующих строк (100ms) - Проверка успешности инициализации перед updateRowData Добавление нового товара: - Задержка (50ms) перед инициализацией Select2 - Повторная попытка при неудаче (через 500ms) - Улучшена надежность работы с динамическими элементами Результат: Select2 поиск работает корректно как при создании новых групп, так и при редактировании существующих. Добавлена надежная обработка ошибок и логирование для отладки. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -40,10 +40,32 @@
|
||||
* @param {Element} element - DOM элемент select
|
||||
* @param {string} type - Тип поиска ('product' или 'variant')
|
||||
* @param {string} apiUrl - URL API для поиска
|
||||
* @returns {boolean} - true если инициализация прошла успешно, false иначе
|
||||
*/
|
||||
window.initProductSelect2 = function(element, type, apiUrl) {
|
||||
if (!element || $(element).data('select2')) {
|
||||
return; // Уже инициализирован
|
||||
// Валидация входных параметров
|
||||
if (!element) {
|
||||
console.error('initProductSelect2: element is null or undefined');
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!apiUrl || typeof apiUrl !== 'string') {
|
||||
console.error('initProductSelect2: invalid apiUrl', apiUrl);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Проверка загрузки jQuery и Select2
|
||||
if (typeof $ === 'undefined' || typeof $.fn.select2 === 'undefined') {
|
||||
console.error('initProductSelect2: jQuery or Select2 not loaded');
|
||||
return false;
|
||||
}
|
||||
|
||||
var $element = $(element);
|
||||
|
||||
// Улучшенная проверка инициализации
|
||||
if ($element.hasClass('select2-hidden-accessible')) {
|
||||
console.log('initProductSelect2: already initialized, skipping', element.name);
|
||||
return true; // Уже инициализирован - это не ошибка
|
||||
}
|
||||
|
||||
var placeholders = {
|
||||
@@ -51,38 +73,45 @@
|
||||
'variant': 'Начните вводить название группы...'
|
||||
};
|
||||
|
||||
$(element).select2({
|
||||
theme: 'bootstrap-5',
|
||||
placeholder: placeholders[type] || 'Выберите...',
|
||||
allowClear: true,
|
||||
width: '100%',
|
||||
language: 'ru',
|
||||
minimumInputLength: 0,
|
||||
dropdownAutoWidth: false,
|
||||
ajax: {
|
||||
url: apiUrl,
|
||||
dataType: 'json',
|
||||
delay: 250,
|
||||
data: function (params) {
|
||||
return {
|
||||
q: params.term || '',
|
||||
type: type,
|
||||
page: params.page || 1
|
||||
};
|
||||
try {
|
||||
$element.select2({
|
||||
theme: 'bootstrap-5',
|
||||
placeholder: placeholders[type] || 'Выберите...',
|
||||
allowClear: true,
|
||||
width: '100%',
|
||||
language: 'ru',
|
||||
minimumInputLength: 0,
|
||||
dropdownAutoWidth: false,
|
||||
ajax: {
|
||||
url: apiUrl,
|
||||
dataType: 'json',
|
||||
delay: 250,
|
||||
data: function (params) {
|
||||
return {
|
||||
q: params.term || '',
|
||||
type: type,
|
||||
page: params.page || 1
|
||||
};
|
||||
},
|
||||
processResults: function (data) {
|
||||
return {
|
||||
results: data.results,
|
||||
pagination: {
|
||||
more: data.pagination.more
|
||||
}
|
||||
};
|
||||
},
|
||||
cache: true
|
||||
},
|
||||
processResults: function (data) {
|
||||
return {
|
||||
results: data.results,
|
||||
pagination: {
|
||||
more: data.pagination.more
|
||||
}
|
||||
};
|
||||
},
|
||||
cache: true
|
||||
},
|
||||
templateResult: formatSelectResult,
|
||||
templateSelection: formatSelectSelection
|
||||
});
|
||||
templateResult: formatSelectResult,
|
||||
templateSelection: formatSelectSelection
|
||||
});
|
||||
console.log('initProductSelect2: successfully initialized for', element.name);
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error('initProductSelect2: initialization error', error);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user