From ab9f8f93bef1765b6ed0ff8b283c85f3aff2b7f7 Mon Sep 17 00:00:00 2001 From: DanielS Date: Thu, 25 Jun 2026 09:15:39 +0200 Subject: [PATCH] feat: add sort by category button to products list view --- shop/components/admin/product-list.tsx | 52 +++++++++++++++++++++----- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/shop/components/admin/product-list.tsx b/shop/components/admin/product-list.tsx index 944e595..f627ff4 100644 --- a/shop/components/admin/product-list.tsx +++ b/shop/components/admin/product-list.tsx @@ -11,14 +11,15 @@ import { } from '@/components/ui/table' import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' import { Badge } from '@/components/ui/badge' -import { Edit2, Trash2, Layers } from 'lucide-react' +import { Edit2, Trash2, Layers, ArrowUpDown } from 'lucide-react' import { Button } from '@/components/ui/button' import { deleteProduct } from '@/lib/actions/products' -import { useState, useEffect } from 'react' +import { useState, useEffect, useMemo } from 'react' import { CreateProductDialog } from './create-product-dialog' export function ProductList({ initialProducts, categories }: { initialProducts: Product[], categories: Category[] }) { const [products, setProducts] = useState(initialProducts) + const [isSortedByCategory, setIsSortedByCategory] = useState(false) useEffect(() => { setProducts(initialProducts) @@ -31,13 +32,46 @@ export function ProductList({ initialProducts, categories }: { initialProducts: } } + const toggleSortByCategory = () => { + setIsSortedByCategory(!isSortedByCategory) + } + + const displayedProducts = useMemo(() => { + if (!isSortedByCategory) return products + + return [...products].sort((a, b) => { + const orderA = a.category?.sort_order ?? 9999 + const orderB = b.category?.sort_order ?? 9999 + if (orderA !== orderB) return orderA - orderB + + const catA = a.category?.name || '' + const catB = b.category?.name || '' + if (catA !== catB) return catA.localeCompare(catB) + + return a.name.localeCompare(b.name) + }) + }, [products, isSortedByCategory]) + return ( - - Produktübersicht - - Alle konfigurierten Software-Lösungen und Erweiterungen. - + +
+ Produktübersicht + + Alle konfigurierten Software-Lösungen und Erweiterungen. + +
+
@@ -51,7 +85,7 @@ export function ProductList({ initialProducts, categories }: { initialProducts: - {products.map((product) => ( + {displayedProducts.map((product) => (
@@ -103,7 +137,7 @@ export function ProductList({ initialProducts, categories }: { initialProducts: ))} - {products.length === 0 && ( + {displayedProducts.length === 0 && ( Keine Produkte gefunden. Erstellen Sie Ihr erstes Produkt!