Change filter sort to client side for vendors/cats
This commit is contained in:
@@ -1,66 +1,10 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
|
||||
// Get categories with pagination, filtering, and sorting
|
||||
// Get all categories
|
||||
router.get('/', async (req, res) => {
|
||||
const pool = req.app.locals.pool;
|
||||
try {
|
||||
const page = parseInt(req.query.page) || 1;
|
||||
const limit = parseInt(req.query.limit) || 50;
|
||||
const offset = (page - 1) * limit;
|
||||
const search = req.query.search || '';
|
||||
const parent = req.query.parent || 'all';
|
||||
const performance = req.query.performance || 'all';
|
||||
const sortColumn = req.query.sortColumn || 'name';
|
||||
const sortDirection = req.query.sortDirection || 'asc';
|
||||
|
||||
// Build the WHERE clause based on filters
|
||||
const whereConditions = [];
|
||||
const params = [];
|
||||
|
||||
if (search) {
|
||||
whereConditions.push('(LOWER(c.name) LIKE LOWER(?) OR LOWER(c.description) LIKE LOWER(?))');
|
||||
params.push(`%${search}%`, `%${search}%`);
|
||||
}
|
||||
|
||||
if (parent !== 'all') {
|
||||
if (parent === 'none') {
|
||||
whereConditions.push('c.parent_category IS NULL');
|
||||
} else {
|
||||
whereConditions.push('c.parent_category = ?');
|
||||
params.push(parent);
|
||||
}
|
||||
}
|
||||
|
||||
if (performance !== 'all') {
|
||||
switch (performance) {
|
||||
case 'high_growth':
|
||||
whereConditions.push('cm.growth_rate >= 20');
|
||||
break;
|
||||
case 'growing':
|
||||
whereConditions.push('cm.growth_rate >= 5 AND cm.growth_rate < 20');
|
||||
break;
|
||||
case 'stable':
|
||||
whereConditions.push('cm.growth_rate >= -5 AND cm.growth_rate < 5');
|
||||
break;
|
||||
case 'declining':
|
||||
whereConditions.push('cm.growth_rate < -5');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const whereClause = whereConditions.length > 0
|
||||
? 'WHERE ' + whereConditions.join(' AND ')
|
||||
: '';
|
||||
|
||||
// Get total count for pagination
|
||||
const [countResult] = await pool.query(`
|
||||
SELECT COUNT(DISTINCT c.id) as total
|
||||
FROM categories c
|
||||
LEFT JOIN category_metrics cm ON c.id = cm.category_id
|
||||
${whereClause}
|
||||
`, params);
|
||||
|
||||
// Get parent categories for filter dropdown
|
||||
const [parentCategories] = await pool.query(`
|
||||
SELECT DISTINCT parent_category
|
||||
@@ -69,7 +13,7 @@ router.get('/', async (req, res) => {
|
||||
ORDER BY parent_category
|
||||
`);
|
||||
|
||||
// Get categories with metrics
|
||||
// Get all categories with metrics
|
||||
const [categories] = await pool.query(`
|
||||
SELECT
|
||||
c.id as category_id,
|
||||
@@ -84,10 +28,8 @@ router.get('/', async (req, res) => {
|
||||
cm.status
|
||||
FROM categories c
|
||||
LEFT JOIN category_metrics cm ON c.id = cm.category_id
|
||||
${whereClause}
|
||||
ORDER BY ${sortColumn} ${sortDirection}
|
||||
LIMIT ? OFFSET ?
|
||||
`, [...params, limit, offset]);
|
||||
ORDER BY c.name ASC
|
||||
`);
|
||||
|
||||
// Get overall stats
|
||||
const [stats] = await pool.query(`
|
||||
@@ -116,11 +58,6 @@ router.get('/', async (req, res) => {
|
||||
totalValue: parseFloat(stats[0].totalValue || 0),
|
||||
avgMargin: parseFloat(stats[0].avgMargin || 0),
|
||||
avgGrowth: parseFloat(stats[0].avgGrowth || 0)
|
||||
},
|
||||
pagination: {
|
||||
total: countResult[0].total,
|
||||
pages: Math.ceil(countResult[0].total / limit),
|
||||
current: page,
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
|
||||
Reference in New Issue
Block a user