From c7428be21bf10c28480a16e7ba24c718e1e2e30d Mon Sep 17 00:00:00 2001 From: Colin Dawson Date: Sat, 31 Jan 2026 23:46:08 +0000 Subject: [PATCH] Top level hortizontal tab can now be loaded using the #tab id in the url --- src/components/common/HorizionalTabs.tsx | 16 ++++++++++------ src/components/common/Tab.tsx | 9 +++++++-- src/modules/manager/domains/DomainsDetails.tsx | 6 +++--- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/components/common/HorizionalTabs.tsx b/src/components/common/HorizionalTabs.tsx index 7ae4296..53b92d3 100644 --- a/src/components/common/HorizionalTabs.tsx +++ b/src/components/common/HorizionalTabs.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useState, useCallback, useMemo } from "react"; +import { useLocation } from "react-router-dom"; import TabHeader from "./TabHeader"; interface HorizontalTabsProps { @@ -10,22 +11,25 @@ const HorizontalTabs: React.FC = ({ children, initialTab, }) => { + const location = useLocation(); const [activeTab, setActiveTab] = useState(""); // Set initial tab on mount useEffect(() => { if (children.length > 0) { - const tabToSelect = initialTab || children[0].props.label; + // Check for hash in URL first, then fall back to initialTab prop + const hashTab = location.hash.slice(1); // Remove the # character + const tabToSelect = hashTab || initialTab || children[0].props.id; setActiveTab(tabToSelect); } - }, [children, initialTab]); + }, [children, initialTab, location.hash]); const onClickTabItem = useCallback((tab: string) => { setActiveTab((prev) => (prev !== tab ? tab : prev)); }, []); const activeTabChildren = useMemo(() => { - const match = children.find((child) => child.props.label === activeTab); + const match = children.find((child) => child.props.id === activeTab); return match ? match.props.children : <>; }, [children, activeTab]); @@ -38,13 +42,13 @@ const HorizontalTabs: React.FC = ({
    {children.map((child) => { - const { label } = child.props; + const { id, label } = child.props; return ( onClickTabItem(id)} /> ); })} diff --git a/src/components/common/Tab.tsx b/src/components/common/Tab.tsx index 5b1c4a6..fd34f69 100644 --- a/src/components/common/Tab.tsx +++ b/src/components/common/Tab.tsx @@ -1,10 +1,15 @@ import React from "react"; interface TabProps { + id?: string; label: string; children: React.ReactNode; } -export default function Tab({ label, children }: TabProps): JSX.Element { - return
    {children}
    ; +export default function Tab({ id, label, children }: TabProps): JSX.Element { + return ( +
    + {children} +
    + ); } diff --git a/src/modules/manager/domains/DomainsDetails.tsx b/src/modules/manager/domains/DomainsDetails.tsx index 2554e18..cab7661 100644 --- a/src/modules/manager/domains/DomainsDetails.tsx +++ b/src/modules/manager/domains/DomainsDetails.tsx @@ -28,7 +28,7 @@ const DomainsDetails: React.FC = ({ isEditMode }) => { const tabs: JSX.Element[] = []; tabs.push( - + , ); @@ -36,14 +36,14 @@ const DomainsDetails: React.FC = ({ isEditMode }) => { if (isEditMode) { if (canViewMailTemplates) { tabs.push( - + , ); } if (canViewSecurityRoles) { tabs.push( - + , );