From fe05e13d3f9d5a9f1fa873b2b8548f67ecc23951 Mon Sep 17 00:00:00 2001 From: DanielS Date: Thu, 25 Jun 2026 12:51:17 +0200 Subject: [PATCH] feat: add Kaufprodukte and Mietprodukte filter checkboxes in products view --- shop/components/admin/product-list.tsx | 61 +++++++++++++++++++------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/shop/components/admin/product-list.tsx b/shop/components/admin/product-list.tsx index c4dd7a8..54b4ac4 100644 --- a/shop/components/admin/product-list.tsx +++ b/shop/components/admin/product-list.tsx @@ -13,6 +13,7 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/com import { Badge } from '@/components/ui/badge' import { Edit2, Trash2, Layers, ArrowUpDown } from 'lucide-react' import { Button } from '@/components/ui/button' +import { Checkbox } from '@/components/ui/checkbox' import { deleteProduct } from '@/lib/actions/products' import { useState, useEffect, useMemo, Fragment } from 'react' import { CreateProductDialog } from './create-product-dialog' @@ -20,6 +21,8 @@ import { CreateProductDialog } from './create-product-dialog' export function ProductList({ initialProducts, categories }: { initialProducts: Product[], categories: Category[] }) { const [products, setProducts] = useState(initialProducts) const [isGroupedByCategory, setIsGroupedByCategory] = useState(false) + const [showKauf, setShowKauf] = useState(true) + const [showAbo, setShowAbo] = useState(true) useEffect(() => { setProducts(initialProducts) @@ -36,9 +39,17 @@ export function ProductList({ initialProducts, categories }: { initialProducts: setIsGroupedByCategory(!isGroupedByCategory) } + const filteredProducts = useMemo(() => { + return products.filter(p => { + if (p.billing_interval === 'one_time') return showKauf + if (p.billing_interval === 'monthly') return showAbo + return true + }) + }, [products, showKauf, showAbo]) + const groupedProducts = useMemo(() => { const groups: Record = {} - products.forEach(p => { + filteredProducts.forEach(p => { const catId = p.category_id || 'no-category' if (!groups[catId]) { groups[catId] = { @@ -53,7 +64,7 @@ export function ProductList({ initialProducts, categories }: { initialProducts: const orderB = b.category?.sort_order ?? 9999 return orderA - orderB }) - }, [products]) + }, [filteredProducts]) const renderProductRow = (product: Product) => ( @@ -110,24 +121,40 @@ export function ProductList({ initialProducts, categories }: { initialProducts: return ( - +
Produktübersicht Alle konfigurierten Software-Lösungen und Erweiterungen.
- +
+ + + +
@@ -153,12 +180,12 @@ export function ProductList({ initialProducts, categories }: { initialProducts: )) ) : ( - products.map((product) => renderProductRow(product)) + filteredProducts.map((product) => renderProductRow(product)) )} - {products.length === 0 && ( + {filteredProducts.length === 0 && ( - Keine Produkte gefunden. Erstellen Sie Ihr erstes Produkt! + Keine Produkte gefunden. Passen Sie Ihre Filter an. )}