diff --git a/docs/todo.md b/docs/todo.md index add908cc..7d7c8e33 100644 --- a/docs/todo.md +++ b/docs/todo.md @@ -97,6 +97,14 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung ## ✅ Erledigt +- [x] **🆕 Kunden-Detail-Tabs: Pro-Tab-Link „in neuem Tab öffnen"** + - `Tabs`-Komponente um optionalen Prop `tabHrefBuilder(tabId)` erweitert. + Wenn gesetzt, erscheint neben jedem Tab-Label ein kleines + `ExternalLink`-Icon. CustomerDetail übergibt den Builder mit + `?tab=`-Query-Param, der eh schon vom URL-Sync genutzt wird. + - `target="_blank"` + `rel="noopener noreferrer"` + Klick-stopPropagation, + damit der Tab-Wechsel nicht parallel zur Tab-Aktivierung passiert. + - [x] **🆕 Vertrag: Kunden-/Vertragsnummer bei Vertriebsplattform** - Zwei neue optionale Felder `Contract.customerNumberAtSalesPlatform` + diff --git a/frontend/src/components/ui/Tabs.tsx b/frontend/src/components/ui/Tabs.tsx index 54b5412a..67b7867b 100644 --- a/frontend/src/components/ui/Tabs.tsx +++ b/frontend/src/components/ui/Tabs.tsx @@ -1,4 +1,5 @@ import { ReactNode, useState, useEffect } from 'react'; +import { ExternalLink } from 'lucide-react'; interface Tab { id: string; @@ -11,9 +12,21 @@ interface TabsProps { defaultTab?: string; activeTab?: string; onTabChange?: (tabId: string) => void; + /** + * Optional: liefert die URL, unter der ein einzelner Tab in einem + * neuen Tab geöffnet werden kann. Wenn gesetzt, erscheint neben jedem + * Tab-Label ein kleines „im neuen Tab öffnen"-Icon. + */ + tabHrefBuilder?: (tabId: string) => string; } -export default function Tabs({ tabs, defaultTab, activeTab: controlledTab, onTabChange }: TabsProps) { +export default function Tabs({ + tabs, + defaultTab, + activeTab: controlledTab, + onTabChange, + tabHrefBuilder, +}: TabsProps) { const [internalTab, setInternalTab] = useState(defaultTab || tabs[0]?.id); const activeTab = controlledTab ?? internalTab; @@ -31,19 +44,33 @@ export default function Tabs({ tabs, defaultTab, activeTab: controlledTab, onTab return (
-
diff --git a/frontend/src/pages/customers/CustomerDetail.tsx b/frontend/src/pages/customers/CustomerDetail.tsx index 7d77e75f..fbc3532f 100644 --- a/frontend/src/pages/customers/CustomerDetail.tsx +++ b/frontend/src/pages/customers/CustomerDetail.tsx @@ -411,7 +411,13 @@ export default function CustomerDetail({ portalCustomerId }: { portalCustomerId? )} - + `${location.pathname}?tab=${tabId}`} + />