From 6a2fc16f75d8ac2f68bf079b37eb4369efef4ed7 Mon Sep 17 00:00:00 2001 From: DanielS Date: Thu, 25 Jun 2026 02:18:53 +0200 Subject: [PATCH] feat: Add group by partner option to company end customers list --- .../admin/companies/[id]/customers/page.tsx | 177 +++++++++++------- 1 file changed, 109 insertions(+), 68 deletions(-) diff --git a/shop/app/admin/companies/[id]/customers/page.tsx b/shop/app/admin/companies/[id]/customers/page.tsx index 9ca347e..9011502 100644 --- a/shop/app/admin/companies/[id]/customers/page.tsx +++ b/shop/app/admin/companies/[id]/customers/page.tsx @@ -1,6 +1,6 @@ 'use client' -import { useState, useEffect } from 'react' +import { useState, useEffect, Fragment } from 'react' import { useParams, useRouter } from 'next/navigation' import Link from 'next/link' import { @@ -48,6 +48,7 @@ export default function CompanyCustomersPage() { const [loading, setLoading] = useState(true) const [loadingAction, setLoadingAction] = useState(false) const [searchQuery, setSearchQuery] = useState('') + const [groupByPartner, setGroupByPartner] = useState(false) // Dialog State const [isOpen, setIsOpen] = useState(false) @@ -158,6 +159,14 @@ export default function CompanyCustomersPage() { return nameMatch || personMatch || addressMatch || partnerMatch }) + const displayCustomers = groupByPartner + ? [...filteredCustomers].sort((a, b) => { + const nameA = a.partner_name || 'Unbekannt' + const nameB = b.partner_name || 'Unbekannt' + return nameA.localeCompare(nameB) + }) + : filteredCustomers + return (
{/* Back Link */} @@ -208,15 +217,29 @@ export default function CompanyCustomersPage() { {/* Table Section */}
-
- - setSearchQuery(e.target.value)} - className="w-full pl-9 pr-4 py-2 text-sm bg-slate-50 dark:bg-white/5 border border-slate-200 dark:border-white/10 rounded-md text-slate-900 dark:text-slate-200 placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-indigo-500 transition-all" - /> +
+
+ + setSearchQuery(e.target.value)} + className="w-full pl-9 pr-4 py-2 text-sm bg-slate-50 dark:bg-white/5 border border-slate-200 dark:border-white/10 rounded-md text-slate-900 dark:text-slate-200 placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-indigo-500 transition-all" + /> +
+
+ setGroupByPartner(e.target.checked)} + className="h-4 w-4 rounded border-slate-200 dark:border-white/10 bg-white dark:bg-slate-950 text-indigo-600 focus:ring-indigo-500 accent-indigo-600 cursor-pointer" + /> + +
{loading ? ( @@ -241,64 +264,82 @@ export default function CompanyCustomersPage() { - {filteredCustomers.map((customer) => ( - - -
- {customer.company_name} -
- {(customer.first_name || customer.last_name) && ( -
- - {customer.first_name || ''} {customer.last_name || ''} -
- )} - - - {customer.street ? ( -
- - - {customer.street}, {customer.zip} {customer.city} - -
- ) : ( - - )} - - - {customer.vat_id || } - - - - {customer.partner_name || 'Unbekannt'} - - - -
- - -
- - - ))} + {(() => { + let lastPartnerName: string | null = null + return displayCustomers.map((customer) => { + const currentPartnerName = customer.partner_name || 'Unbekannt' + const showGroupHeader = groupByPartner && currentPartnerName !== lastPartnerName + lastPartnerName = currentPartnerName + + return ( + + {showGroupHeader && ( + + + Partner: {currentPartnerName} + + + )} + + +
+ {customer.company_name} +
+ {(customer.first_name || customer.last_name) && ( +
+ + {customer.first_name || ''} {customer.last_name || ''} +
+ )} + + + {customer.street ? ( +
+ + + {customer.street}, {customer.zip} {customer.city} + +
+ ) : ( + + )} + + + {customer.vat_id || } + + + + {customer.partner_name || 'Unbekannt'} + + + +
+ + +
+ + +
+ ) + }) + })()} )}