feat: Добавлена функциональность управления заказами и улучшен поиск товаров
Заказы: - Добавлены миграции для исторических записей с полями оплаты и получателя - Расширен admin для заказов с инлайнами товаров/комплектов - Реализованы представления списка, создания, редактирования и удаления заказов - Добавлен шаблон подтверждения удаления заказа - Настроены URL-маршруты для работы с заказами Клиенты: - Добавлена миграция с новыми полями адресов и подтверждений - Обновлена модель клиентов с дополнительными полями - Улучшен admin для работы с клиентами Товары: - Значительно улучшен API поиска товаров с поддержкой фильтрации - Добавлен Select2 виджет для динамического поиска товаров - Создан статический JS файл для интеграции Select2 - Оптимизирована обработка запросов и ответов API Прочее: - Добавлены новые настройки в settings.py - Обновлена навигация в navbar.html - Обновлены URL-маршруты проекта 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -10,11 +10,44 @@
|
||||
function formatSelectResult(item) {
|
||||
if (item.loading) return item.text;
|
||||
|
||||
var $container = $('<div class="select2-result-item">');
|
||||
$container.text(item.text);
|
||||
// Если это группа (header для товаров/комплектов), просто возвращаем текст
|
||||
if (item.children) {
|
||||
return item.text;
|
||||
}
|
||||
|
||||
if (item.price) {
|
||||
$container.append($('<div class="text-muted small">').text(item.price + ' руб.'));
|
||||
var $container = $('<div class="select2-result-item d-flex justify-content-between align-items-center">');
|
||||
|
||||
// Левая часть: иконка + название
|
||||
var $left = $('<div class="d-flex align-items-center">');
|
||||
|
||||
// Добавляем иконку в зависимости от типа
|
||||
if (item.type === 'product') {
|
||||
$left.append($('<span class="me-2">').text('🌹'));
|
||||
} else if (item.type === 'kit') {
|
||||
$left.append($('<span class="me-2">').text('💐'));
|
||||
} else if (item.type === 'variant') {
|
||||
$left.append($('<span class="me-2">').text('🔄'));
|
||||
}
|
||||
|
||||
// Название
|
||||
var $name = $('<span>').text(item.text);
|
||||
$left.append($name);
|
||||
$container.append($left);
|
||||
|
||||
// Правая часть: цена и статус наличия
|
||||
if (item.actual_price || item.price) {
|
||||
var priceText = item.actual_price || item.price;
|
||||
var $price = $('<span class="text-muted small">').text(priceText + ' руб.');
|
||||
$container.append($price);
|
||||
}
|
||||
|
||||
// Индикатор наличия для товаров
|
||||
if (item.type === 'product' && item.in_stock !== undefined) {
|
||||
if (item.in_stock) {
|
||||
$container.append($('<span class="badge bg-success ms-2 small">').text('В наличии'));
|
||||
} else {
|
||||
$container.append($('<span class="badge bg-secondary ms-2 small">').text('Нет'));
|
||||
}
|
||||
}
|
||||
|
||||
return $container;
|
||||
@@ -22,13 +55,21 @@
|
||||
|
||||
// Форматирование выбранного элемента
|
||||
function formatSelectSelection(item) {
|
||||
// Добавляем иконку для выбранного элемента
|
||||
if (item.type === 'product') {
|
||||
return '🌹 ' + item.text;
|
||||
} else if (item.type === 'kit') {
|
||||
return '💐 ' + item.text;
|
||||
} else if (item.type === 'variant') {
|
||||
return '🔄 ' + item.text;
|
||||
}
|
||||
return item.text || item.id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Инициализирует Select2 для элемента с AJAX поиском товаров
|
||||
* @param {Element|jQuery} element - DOM элемент или jQuery объект select
|
||||
* @param {string} type - Тип поиска ('product' или 'variant')
|
||||
* @param {string} type - Тип поиска ('product', 'variant', 'kit' или 'all')
|
||||
* @param {string} apiUrl - URL API для поиска
|
||||
* @param {Object} preloadedData - Предзагруженные данные товара
|
||||
*/
|
||||
@@ -45,7 +86,9 @@
|
||||
|
||||
var placeholders = {
|
||||
'product': 'Начните вводить название товара...',
|
||||
'variant': 'Начните вводить название группы...'
|
||||
'variant': 'Начните вводить название группы...',
|
||||
'kit': 'Начните вводить название комплекта...',
|
||||
'all': 'Начните вводить название товара или комплекта...'
|
||||
};
|
||||
|
||||
var config = {
|
||||
@@ -82,6 +125,8 @@
|
||||
// Если есть предзагруженные данные, создаем option с ними
|
||||
if (preloadedData) {
|
||||
var option = new Option(preloadedData.text, preloadedData.id, true, true);
|
||||
// Сохраняем дополнительные данные для форматирования
|
||||
$(option).data('data', preloadedData);
|
||||
$element.append(option);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user