|
|
@@ -3,7 +3,7 @@
|
|
|
import React from "react";
|
|
|
import Link from "next/link";
|
|
|
import { usePathname, useRouter } from "next/navigation";
|
|
|
-import { FolderOpen, Search as SearchIcon } from "lucide-react";
|
|
|
+import { FolderOpen, Search as SearchIcon, TriangleAlert } from "lucide-react";
|
|
|
|
|
|
import { useAuth } from "@/components/auth/authContext";
|
|
|
import { getBranches } from "@/lib/frontend/apiClient";
|
|
|
@@ -40,8 +40,15 @@ const BRANCH_LIST_STATE = Object.freeze({
|
|
|
ERROR: "error",
|
|
|
});
|
|
|
|
|
|
+// Header polish:
|
|
|
+// - outline buttons normally have a subtle shadow; remove it for crisp header UI
|
|
|
+// - normalize padding when an icon is present (avoid "uneven" look)
|
|
|
+const TOPNAV_BUTTON_CLASS = "shadow-none has-[>svg]:px-3";
|
|
|
+
|
|
|
+// Active nav style (blue like multi-branch selection)
|
|
|
const ACTIVE_NAV_BUTTON_CLASS =
|
|
|
- "border-blue-600 bg-blue-50 hover:bg-blue-50 dark:border-blue-900 dark:bg-blue-950 dark:hover:bg-blue-950";
|
|
|
+ "border-blue-600 bg-blue-50 text-blue-900 hover:bg-blue-50 " +
|
|
|
+ "dark:border-blue-900 dark:bg-blue-950 dark:text-blue-50 dark:hover:bg-blue-950";
|
|
|
|
|
|
export default function QuickNav() {
|
|
|
const router = useRouter();
|
|
|
@@ -80,11 +87,12 @@ export default function QuickNav() {
|
|
|
? branchList.branches
|
|
|
: null;
|
|
|
|
|
|
- const isKnownRouteBranch = React.useMemo(() => {
|
|
|
- if (!routeBranch) return false;
|
|
|
- if (!knownBranches) return false;
|
|
|
- return knownBranches.includes(routeBranch);
|
|
|
- }, [routeBranch, knownBranches]);
|
|
|
+ const hasInvalidRouteBranch = Boolean(
|
|
|
+ isAdminDev &&
|
|
|
+ routeBranch &&
|
|
|
+ knownBranches &&
|
|
|
+ !knownBranches.includes(routeBranch),
|
|
|
+ );
|
|
|
|
|
|
React.useEffect(() => {
|
|
|
if (!isAuthenticated) return;
|
|
|
@@ -141,14 +149,17 @@ export default function QuickNav() {
|
|
|
|
|
|
React.useEffect(() => {
|
|
|
if (!isAdminDev) return;
|
|
|
- if (!isKnownRouteBranch) return;
|
|
|
if (!routeBranch) return;
|
|
|
+ if (!knownBranches) return;
|
|
|
+
|
|
|
+ const isKnownRouteBranch = knownBranches.includes(routeBranch);
|
|
|
+ if (!isKnownRouteBranch) return;
|
|
|
|
|
|
if (routeBranch !== selectedBranch) {
|
|
|
setSelectedBranch(routeBranch);
|
|
|
safeWriteLocalStorageBranch(STORAGE_KEY_LAST_BRANCH, routeBranch);
|
|
|
}
|
|
|
- }, [isAdminDev, isKnownRouteBranch, routeBranch, selectedBranch]);
|
|
|
+ }, [isAdminDev, routeBranch, knownBranches, selectedBranch]);
|
|
|
|
|
|
React.useEffect(() => {
|
|
|
if (!isAdminDev) return;
|
|
|
@@ -188,6 +199,10 @@ export default function QuickNav() {
|
|
|
router.push(nextUrl);
|
|
|
}
|
|
|
|
|
|
+ const branchButtonTitle = hasInvalidRouteBranch
|
|
|
+ ? `Achtung: Die URL-Niederlassung ${routeBranch} existiert nicht. Bitte eine gültige Niederlassung wählen.`
|
|
|
+ : "Niederlassung auswählen";
|
|
|
+
|
|
|
return (
|
|
|
<div className="hidden items-center gap-2 md:flex">
|
|
|
{isAdminDev ? (
|
|
|
@@ -197,9 +212,16 @@ export default function QuickNav() {
|
|
|
variant="outline"
|
|
|
size="sm"
|
|
|
type="button"
|
|
|
- title="Niederlassung auswählen"
|
|
|
+ title={branchButtonTitle}
|
|
|
+ className={TOPNAV_BUTTON_CLASS}
|
|
|
>
|
|
|
{canNavigate ? effectiveBranch : "Niederlassung wählen"}
|
|
|
+ {hasInvalidRouteBranch ? (
|
|
|
+ <TriangleAlert
|
|
|
+ className="h-4 w-4 text-destructive"
|
|
|
+ aria-hidden="true"
|
|
|
+ />
|
|
|
+ ) : null}
|
|
|
</Button>
|
|
|
</DropdownMenuTrigger>
|
|
|
|
|
|
@@ -207,6 +229,16 @@ export default function QuickNav() {
|
|
|
<DropdownMenuLabel>Niederlassung</DropdownMenuLabel>
|
|
|
<DropdownMenuSeparator />
|
|
|
|
|
|
+ {hasInvalidRouteBranch ? (
|
|
|
+ <>
|
|
|
+ <div className="px-2 py-2 text-xs text-destructive">
|
|
|
+ Die URL-Niederlassung <strong>{routeBranch}</strong> existiert
|
|
|
+ nicht. Bitte wählen Sie eine gültige Niederlassung aus.
|
|
|
+ </div>
|
|
|
+ <DropdownMenuSeparator />
|
|
|
+ </>
|
|
|
+ ) : null}
|
|
|
+
|
|
|
{branchList.status === BRANCH_LIST_STATE.ERROR ? (
|
|
|
<div className="px-2 py-2 text-xs text-muted-foreground">
|
|
|
Konnte nicht geladen werden.
|
|
|
@@ -242,7 +274,10 @@ export default function QuickNav() {
|
|
|
size="sm"
|
|
|
asChild
|
|
|
disabled={!canNavigate}
|
|
|
- className={isExplorerActive ? ACTIVE_NAV_BUTTON_CLASS : ""}
|
|
|
+ className={[
|
|
|
+ TOPNAV_BUTTON_CLASS,
|
|
|
+ isExplorerActive ? ACTIVE_NAV_BUTTON_CLASS : "",
|
|
|
+ ].join(" ")}
|
|
|
>
|
|
|
<Link
|
|
|
href={canNavigate ? branchPath(effectiveBranch) : "#"}
|
|
|
@@ -259,7 +294,10 @@ export default function QuickNav() {
|
|
|
size="sm"
|
|
|
asChild
|
|
|
disabled={!canNavigate}
|
|
|
- className={isSearchActive ? ACTIVE_NAV_BUTTON_CLASS : ""}
|
|
|
+ className={[
|
|
|
+ TOPNAV_BUTTON_CLASS,
|
|
|
+ isSearchActive ? ACTIVE_NAV_BUTTON_CLASS : "",
|
|
|
+ ].join(" ")}
|
|
|
>
|
|
|
<Link
|
|
|
href={canNavigate ? searchPath(effectiveBranch) : "#"}
|