mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-11 17:27:31 +02:00
Improve product search functionality and data caching
Add server-side search and filtering for DLC products, and implement client-side debouncing for search terms. Optimize data fetching with extended stale times for stores, suppliers, and DLC stats to improve performance. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 78d55416-09d3-4c00-b411-444299b0da00 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/78d55416-09d3-4c00-b411-444299b0da00/WSwf4nZ
This commit is contained in:
1 parent
b172870ef9
commit
48bfc884ed
3 files changed
+86
-66
No files matched your search
+2
-3
@@ -986,7 +986,7 @@ export async function registerRoutes(app: Express): Promise<Server> {
|
||||
return res.status(404).json({ message: "User not found" });
|
||||
}
|
||||
|
||||
const { storeId, status, supplierId } = req.query;
|
||||
const { storeId, status, supplierId, search } = req.query;
|
||||
let groupIds: number[] | undefined;
|
||||
|
||||
if (user.role === 'admin') {
|
||||
@@ -1003,10 +1003,9 @@ export async function registerRoutes(app: Express): Promise<Server> {
|
||||
const filters: any = {};
|
||||
if (status && status !== 'all') filters.status = status as string;
|
||||
if (supplierId && supplierId !== 'all') filters.supplierId = parseInt(supplierId as string);
|
||||
if (search) filters.search = search as string;
|
||||
|
||||
console.log('DLC Products API called with:', { groupIds, filters, userRole: user.role });
|
||||
const dlcProducts = await storage.getDlcProducts(groupIds, filters);
|
||||
console.log('DLC Products returned:', dlcProducts.length, 'items');
|
||||
res.json(dlcProducts);
|
||||
} catch (error) {
|
||||
console.error("Error fetching DLC products:", error);
|
||||
|
||||
+35
-4
@@ -149,7 +149,7 @@ export interface IStorage {
|
||||
deleteCustomerOrder(id: number): Promise<void>;
|
||||
|
||||
// DLC Product operations
|
||||
getDlcProducts(groupIds?: number[], filters?: { status?: string; supplierId?: number; }): Promise<DlcProductWithRelations[]>;
|
||||
getDlcProducts(groupIds?: number[], filters?: { status?: string; supplierId?: number; search?: string; }): Promise<DlcProductWithRelations[]>;
|
||||
getDlcProduct(id: number): Promise<DlcProductWithRelations | undefined>;
|
||||
createDlcProduct(dlcProduct: InsertDlcProduct): Promise<DlcProductFrontend>;
|
||||
updateDlcProduct(id: number, dlcProduct: Partial<InsertDlcProduct>): Promise<DlcProductFrontend>;
|
||||
@@ -1350,7 +1350,7 @@ export class DatabaseStorage implements IStorage {
|
||||
await db.delete(customerOrders).where(eq(customerOrders.id, id));
|
||||
}
|
||||
|
||||
async getDlcProducts(groupIds?: number[]): Promise<DlcProductWithRelations[]> {
|
||||
async getDlcProducts(groupIds?: number[], filters?: { status?: string; supplierId?: number; search?: string; }): Promise<DlcProductWithRelations[]> {
|
||||
let query = db
|
||||
.select({
|
||||
dlcProduct: dlcProducts,
|
||||
@@ -1361,8 +1361,31 @@ export class DatabaseStorage implements IStorage {
|
||||
.leftJoin(suppliers, eq(dlcProducts.supplierId, suppliers.id))
|
||||
.leftJoin(groups, eq(dlcProducts.groupId, groups.id));
|
||||
|
||||
const conditions = [];
|
||||
|
||||
if (groupIds && groupIds.length > 0) {
|
||||
query = query.where(inArray(dlcProducts.groupId, groupIds));
|
||||
conditions.push(inArray(dlcProducts.groupId, groupIds));
|
||||
}
|
||||
|
||||
if (filters) {
|
||||
if (filters.status) {
|
||||
conditions.push(eq(dlcProducts.status, filters.status));
|
||||
}
|
||||
if (filters.supplierId) {
|
||||
conditions.push(eq(dlcProducts.supplierId, filters.supplierId));
|
||||
}
|
||||
if (filters.search) {
|
||||
conditions.push(
|
||||
or(
|
||||
sql`LOWER(${dlcProducts.productName}) LIKE LOWER(${'%' + filters.search + '%'})`,
|
||||
sql`LOWER(${suppliers.name}) LIKE LOWER(${'%' + filters.search + '%'})`
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (conditions.length > 0) {
|
||||
query = query.where(and(...conditions));
|
||||
}
|
||||
|
||||
const results = await query.orderBy(asc(dlcProducts.expiryDate));
|
||||
@@ -2409,7 +2432,7 @@ export class MemStorage implements IStorage {
|
||||
this.customerOrders.delete(id);
|
||||
}
|
||||
|
||||
async getDlcProducts(groupIds?: number[], filters?: { status?: string; supplierId?: number; }): Promise<DlcProductWithRelations[]> {
|
||||
async getDlcProducts(groupIds?: number[], filters?: { status?: string; supplierId?: number; search?: string; }): Promise<DlcProductWithRelations[]> {
|
||||
let products = Array.from(this.dlcProducts.values());
|
||||
|
||||
if (groupIds && groupIds.length > 0) {
|
||||
@@ -2423,6 +2446,14 @@ export class MemStorage implements IStorage {
|
||||
if (filters.supplierId) {
|
||||
products = products.filter(product => product.supplierId === filters.supplierId);
|
||||
}
|
||||
if (filters.search) {
|
||||
const searchTerm = filters.search.toLowerCase();
|
||||
products = products.filter(product => {
|
||||
const supplier = this.suppliers.get(product.supplierId);
|
||||
return product.productName.toLowerCase().includes(searchTerm) ||
|
||||
(supplier && supplier.name.toLowerCase().includes(searchTerm));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return products.map(product => ({
|
||||
|
||||
Reference in new issue
Block a user