Исправлено отображение выбранного клиента при редактировании черновика

Проблема: При редактировании черновика заказа клиент не отображался на форме.
Решение:
- Не очищаем select если уже есть выбранный клиент (не вызываем empty())
- Оставляем option элемент в DOM, позволяя Select2 его видеть
- Просто устанавливаем значение через .val() после инициализации Select2
- Исправлена formatCustomerSelection чтобы обрабатывала option.text если option.name отсутствует

Ключевое изменение: Select2 AJAX mode корректно работает с pre-rendered option элементами,
если мы их не очищаем перед инициализацией.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-10 23:40:34 +03:00
parent 7df5988222
commit 3c0ba70bc8

View File

@@ -461,8 +461,10 @@ function initCustomerSelect2() {
const currentText = $customerSelect.find(':selected').text();
console.log('Сохраняем текущее значение:', currentValue, currentText);
// Очищаем существующие опции
$customerSelect.empty();
// НЕ очищаем, если у нас есть текущий выбранный клиент
if (!currentValue) {
$customerSelect.empty();
}
// Инициализируем Select2 с AJAX
$customerSelect.select2({
@@ -495,40 +497,32 @@ function initCustomerSelect2() {
},
templateResult: formatCustomerOption,
templateSelection: formatCustomerSelection,
escapeMarkup: function(markup) { return markup; }
escapeMarkup: function(markup) { return markup; },
// Очень важно: указываем как отображать уже выбранное значение
matcher: function(params, data) {
// Если нет поискового термина, показываем все результаты
if ($.trim(params.term) === '') {
return data;
}
// Иначе ищем совпадение
if (data.text.toUpperCase().indexOf(params.term.toUpperCase()) > -1) {
return data;
}
return null;
}
});
console.log('6. Select2 инициализирован');
// Восстанавливаем значение если оно было (для редактирования черновика)
if (currentValue) {
if (currentValue && currentText) {
console.log('Восстанавливаем значение:', currentValue, 'Текст:', currentText);
// Загружаем информацию о клиенте через AJAX
fetch(ajaxUrl + '?q=' + encodeURIComponent(currentText))
.then(response => response.json())
.then(data => {
// Ищем клиента в результатах
const customer = data.results.find(r => r.id == currentValue);
if (customer) {
console.log('Найден клиент:', customer);
const option = new Option(customer.text, customer.id, true, true);
$customerSelect.append(option).val(customer.id);
} else {
// Если не найден, создаем опцию с сохраненным текстом
console.log('Клиент не найден в результатах, используем сохраненный текст');
const option = new Option(currentText, currentValue, true, true);
$customerSelect.append(option).val(currentValue);
}
// Обновляем Select2
$customerSelect.trigger('change');
})
.catch(error => {
console.error('Ошибка при загрузке клиента:', error);
// Создаем option с сохраненным текстом в любом случае
const option = new Option(currentText, currentValue, true, true);
$customerSelect.append(option).val(currentValue).trigger('change');
});
// Select2 видит option элемент в DOM (так как мы его не очищали)
// Просто устанавливаем значение через Select2 API
$customerSelect.val(currentValue);
console.log('Значение восстановлено:', $customerSelect.val());
}
// Слушаем события
@@ -593,7 +587,8 @@ function initCustomerSelect2() {
if (option.is_create_option) {
return option.text;
}
return option.name;
// Возвращаем name если есть (из AJAX), иначе text (из DOM опции)
return option.name || option.text;
}
}