From bc5d65024866650e83a95e8a6abf385e88fc7c14 Mon Sep 17 00:00:00 2001 From: gsxdsm Date: Sat, 14 Mar 2026 14:05:29 -0700 Subject: [PATCH 1/2] Add global toolbar slots to BreadcrumbBar component --- ui/src/components/BreadcrumbBar.tsx | 72 ++++++++++++++++++----------- 1 file changed, 46 insertions(+), 26 deletions(-) diff --git a/ui/src/components/BreadcrumbBar.tsx b/ui/src/components/BreadcrumbBar.tsx index a93d96c8..c4523d9f 100644 --- a/ui/src/components/BreadcrumbBar.tsx +++ b/ui/src/components/BreadcrumbBar.tsx @@ -2,6 +2,7 @@ import { Link } from "@/lib/router"; import { Menu } from "lucide-react"; import { useBreadcrumbs } from "../context/BreadcrumbContext"; import { useSidebar } from "../context/SidebarContext"; +import { useCompany } from "../context/CompanyContext"; import { Button } from "@/components/ui/button"; import { Breadcrumb, @@ -12,10 +13,12 @@ import { BreadcrumbSeparator, } from "@/components/ui/breadcrumb"; import { Fragment } from "react"; +import { PluginSlotOutlet } from "@/plugins/slots"; export function BreadcrumbBar() { const { breadcrumbs } = useBreadcrumbs(); const { toggleSidebar, isMobile } = useSidebar(); + const { selectedCompanyId, selectedCompany } = useCompany(); if (breadcrumbs.length === 0) return null; @@ -31,43 +34,60 @@ export function BreadcrumbBar() { ); + const globalToolbarSlots = ( + + ); + // Single breadcrumb = page title (uppercase) if (breadcrumbs.length === 1) { return ( -
+
{menuButton} -

- {breadcrumbs[0].label} -

+
+

+ {breadcrumbs[0].label} +

+
+ {globalToolbarSlots}
); } // Multiple breadcrumbs = breadcrumb trail return ( -
+
{menuButton} - - - {breadcrumbs.map((crumb, i) => { - const isLast = i === breadcrumbs.length - 1; - return ( - - {i > 0 && } - - {isLast || !crumb.href ? ( - {crumb.label} - ) : ( - - {crumb.label} - - )} - - - ); - })} - - +
+ + + {breadcrumbs.map((crumb, i) => { + const isLast = i === breadcrumbs.length - 1; + return ( + + {i > 0 && } + + {isLast || !crumb.href ? ( + {crumb.label} + ) : ( + + {crumb.label} + + )} + + + ); + })} + + +
+ {globalToolbarSlots}
); } From 7e3a04c76c71d11784d6a0929b8e2580b35623d1 Mon Sep 17 00:00:00 2001 From: gsxdsm Date: Sat, 14 Mar 2026 14:19:32 -0700 Subject: [PATCH 2/2] Refactor BreadcrumbBar to use useMemo for global toolbar slot context and improve rendering logic --- ui/src/components/BreadcrumbBar.tsx | 37 +++++++++++++++++++---------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/ui/src/components/BreadcrumbBar.tsx b/ui/src/components/BreadcrumbBar.tsx index c4523d9f..6f1f9bbf 100644 --- a/ui/src/components/BreadcrumbBar.tsx +++ b/ui/src/components/BreadcrumbBar.tsx @@ -12,7 +12,7 @@ import { BreadcrumbPage, BreadcrumbSeparator, } from "@/components/ui/breadcrumb"; -import { Fragment } from "react"; +import { Fragment, useMemo } from "react"; import { PluginSlotOutlet } from "@/plugins/slots"; export function BreadcrumbBar() { @@ -20,7 +20,29 @@ export function BreadcrumbBar() { const { toggleSidebar, isMobile } = useSidebar(); const { selectedCompanyId, selectedCompany } = useCompany(); - if (breadcrumbs.length === 0) return null; + const globalToolbarSlotContext = useMemo( + () => ({ + companyId: selectedCompanyId ?? null, + companyPrefix: selectedCompany?.issuePrefix ?? null, + }), + [selectedCompanyId, selectedCompany?.issuePrefix], + ); + + const globalToolbarSlots = ( + + ); + + if (breadcrumbs.length === 0) { + return ( +
+ {globalToolbarSlots} +
+ ); + } const menuButton = isMobile && (