diff --git a/frontend/src/layouts/OrganizationLayout/components/OrgSidebar/OrgSidebar.tsx b/frontend/src/layouts/OrganizationLayout/components/OrgSidebar/OrgSidebar.tsx
index e1c1e89f9..5a08c2b30 100644
--- a/frontend/src/layouts/OrganizationLayout/components/OrgSidebar/OrgSidebar.tsx
+++ b/frontend/src/layouts/OrganizationLayout/components/OrgSidebar/OrgSidebar.tsx
@@ -1,11 +1,10 @@
import {
faBook,
faCog,
- faDoorClosed,
faInfinity,
faMoneyBill,
+ faNetworkWired,
faPlug,
- faRoute,
faShare,
faTable,
faUsers,
@@ -125,26 +124,14 @@ export const OrgSidebar = ({ isHidden }: Props) => {
)}
-
+
{({ isActive }) => (
- )}
-
-
- {({ isActive }) => (
-
)}
diff --git a/frontend/src/pages/organization/Gateways/GatewayListPage/GatewayListPage.tsx b/frontend/src/pages/organization/Gateways/GatewayListPage/GatewayListPage.tsx
deleted file mode 100644
index a0d440872..000000000
--- a/frontend/src/pages/organization/Gateways/GatewayListPage/GatewayListPage.tsx
+++ /dev/null
@@ -1,267 +0,0 @@
-import { useState } from "react";
-import { Helmet } from "react-helmet";
-import {
- faArrowUpRightFromSquare,
- faBookOpen,
- faCopy,
- faDoorClosed,
- faEdit,
- faEllipsisV,
- faInfoCircle,
- faMagnifyingGlass,
- faSearch,
- faTrash
-} from "@fortawesome/free-solid-svg-icons";
-import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { useQuery } from "@tanstack/react-query";
-import { formatRelative } from "date-fns";
-
-import { createNotification } from "@app/components/notifications";
-import { OrgPermissionCan } from "@app/components/permissions";
-import {
- DeleteActionModal,
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuTrigger,
- EmptyState,
- IconButton,
- Input,
- Modal,
- ModalContent,
- PageHeader,
- Table,
- TableContainer,
- TableSkeleton,
- TBody,
- Td,
- Th,
- THead,
- Tooltip,
- Tr
-} from "@app/components/v2";
-import {
- OrgGatewayPermissionActions,
- OrgPermissionAppConnectionActions,
- OrgPermissionSubjects
-} from "@app/context/OrgPermissionContext/types";
-import { withPermission } from "@app/hoc";
-import { usePopUp } from "@app/hooks";
-import { gatewaysQueryKeys, useDeleteGatewayById } from "@app/hooks/api/gateways";
-import { useDeleteGatewayV2ById } from "@app/hooks/api/gateways-v2";
-
-import { EditGatewayDetailsModal } from "./components/EditGatewayDetailsModal";
-
-export const GatewayListPage = withPermission(
- () => {
- const [search, setSearch] = useState("");
- const { data: gateways, isPending: isGatewaysLoading } = useQuery(gatewaysQueryKeys.list());
-
- const { popUp, handlePopUpOpen, handlePopUpToggle } = usePopUp([
- "deleteGateway",
- "editDetails"
- ] as const);
-
- const deleteGatewayById = useDeleteGatewayById();
- const deleteGatewayV2ById = useDeleteGatewayV2ById();
-
- const handleDeleteGateway = async () => {
- const data = popUp.deleteGateway.data as { id: string; isV1: boolean };
- if (data.isV1) {
- await deleteGatewayById.mutateAsync(data.id);
- } else {
- await deleteGatewayV2ById.mutateAsync(data.id);
- }
-
- handlePopUpToggle("deleteGateway");
- createNotification({
- type: "success",
- text: "Successfully deleted gateway"
- });
- };
-
- const filteredGateway = gateways?.filter((el) =>
- el.name.toLowerCase().includes(search.toLowerCase())
- );
-
- return (
-
-
- Infisical | Gateways
-
-
-
-
- }
- description="Create and configure gateway to access private network resources from Infisical"
- />
-
-
-
- setSearch(e.target.value)}
- leftIcon={}
- placeholder="Search gateway..."
- className="flex-1"
- />
-
-
-
-
-
- | Name |
- Identity |
-
- Health Check
-
-
-
- |
- |
-
-
-
- {isGatewaysLoading && (
-
- )}
- {filteredGateway?.map((el) => (
-
- |
-
- {el.name}
-
- Gateway v{el.isV1 ? "1" : "2"}
-
-
- |
- {el.identity.name} |
-
- {el.heartbeat
- ? formatRelative(new Date(el.heartbeat), new Date())
- : "-"}
- |
-
-
-
-
-
-
-
-
-
- }
- onClick={() => navigator.clipboard.writeText(el.id)}
- >
- Copy ID
-
- {el.isV1 && (
-
- {(isAllowed: boolean) => (
- }
- onClick={() => handlePopUpOpen("editDetails", el)}
- >
- Edit Details
-
- )}
-
- )}
-
- {(isAllowed: boolean) => (
- }
- className="text-red"
- onClick={() => handlePopUpOpen("deleteGateway", el)}
- >
- Delete Gateway
-
- )}
-
-
-
-
- |
-
- ))}
-
-
- handlePopUpToggle("editDetails", isOpen)}
- >
-
- handlePopUpToggle("editDetails")}
- />
-
-
- {!isGatewaysLoading && !filteredGateway?.length && (
-
- )}
- handlePopUpToggle("deleteGateway", isOpen)}
- deleteKey="confirm"
- onDeleteApproved={() => handleDeleteGateway()}
- />
-
-
-
-
-
-
- );
- },
- { action: OrgGatewayPermissionActions.ListGateways, subject: OrgPermissionSubjects.Gateway }
-);
diff --git a/frontend/src/pages/organization/Gateways/GatewayListPage/route.tsx b/frontend/src/pages/organization/Gateways/GatewayListPage/route.tsx
deleted file mode 100644
index 88a263b4c..000000000
--- a/frontend/src/pages/organization/Gateways/GatewayListPage/route.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { createFileRoute } from "@tanstack/react-router";
-
-import { GatewayListPage } from "./GatewayListPage";
-
-export const Route = createFileRoute(
- "/_authenticate/_inject-org-details/_org-layout/organization/gateways/"
-)({
- component: GatewayListPage,
- context: () => ({
- breadcrumbs: [
- {
- label: "Gateways"
- }
- ]
- })
-});
diff --git a/frontend/src/pages/organization/Gateways/Relay/RelayListPage/RelayListPage.tsx b/frontend/src/pages/organization/Gateways/Relay/RelayListPage/RelayListPage.tsx
deleted file mode 100644
index 255763182..000000000
--- a/frontend/src/pages/organization/Gateways/Relay/RelayListPage/RelayListPage.tsx
+++ /dev/null
@@ -1,214 +0,0 @@
-import { useState } from "react";
-import { Helmet } from "react-helmet";
-import {
- faArrowUpRightFromSquare,
- faBookOpen,
- faCopy,
- faDoorClosed,
- faEllipsisV,
- faMagnifyingGlass,
- faSearch,
- faTrash
-} from "@fortawesome/free-solid-svg-icons";
-import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { formatRelative } from "date-fns";
-
-import { createNotification } from "@app/components/notifications";
-import { OrgPermissionCan } from "@app/components/permissions";
-import {
- DeleteActionModal,
- DropdownMenu,
- DropdownMenuContent,
- DropdownMenuItem,
- DropdownMenuTrigger,
- EmptyState,
- IconButton,
- Input,
- PageHeader,
- Table,
- TableContainer,
- TableSkeleton,
- TBody,
- Td,
- Th,
- THead,
- Tooltip,
- Tr
-} from "@app/components/v2";
-import {
- OrgPermissionSubjects,
- OrgRelayPermissionActions
-} from "@app/context/OrgPermissionContext/types";
-import { withPermission } from "@app/hoc";
-import { usePopUp } from "@app/hooks";
-import { useDeleteRelayById, useGetRelays } from "@app/hooks/api/relays";
-
-export const RelayListPage = withPermission(
- () => {
- const [search, setSearch] = useState("");
- const { data: relays, isPending: isRelaysLoading } = useGetRelays();
-
- const { popUp, handlePopUpOpen, handlePopUpToggle } = usePopUp(["deleteRelay"] as const);
-
- const deleteRelayById = useDeleteRelayById();
-
- const handleDeleteRelay = async () => {
- const data = popUp.deleteRelay.data as { id: string };
- await deleteRelayById.mutateAsync(data.id);
-
- handlePopUpToggle("deleteRelay");
- createNotification({
- type: "success",
- text: "Successfully deleted relay"
- });
- };
-
- const filteredRelays = relays?.filter((el) =>
- el.name.toLowerCase().includes(search.toLowerCase())
- );
-
- return (
-
-
- Infisical | Relays
-
-
-
-
- }
- description="Create and configure relays to securely access private network resources from Infisical"
- />
-
-
-
- setSearch(e.target.value)}
- leftIcon={}
- placeholder="Search relay..."
- className="flex-1"
- />
-
-
-
-
-
- | Name |
- Host |
- Created |
- |
-
-
-
- {isRelaysLoading && (
-
- )}
- {filteredRelays?.map((el) => (
-
- |
-
- {el.name}
- {!el.orgId && (
-
-
- Managed
-
-
- )}
-
- |
- {el.host} |
- {formatRelative(new Date(el.createdAt), new Date())} |
-
-
-
-
-
-
-
-
-
- }
- onClick={() => navigator.clipboard.writeText(el.id)}
- >
- Copy ID
-
-
- {(isAllowed: boolean) => (
- }
- className="text-red"
- onClick={() => handlePopUpOpen("deleteRelay", el)}
- >
- Delete Relay
-
- )}
-
-
-
-
- |
-
- ))}
-
-
- {!isRelaysLoading && !filteredRelays?.length && (
-
- )}
- handlePopUpToggle("deleteRelay", isOpen)}
- deleteKey="confirm"
- onDeleteApproved={() => handleDeleteRelay()}
- />
-
-
-
-
-
-
- );
- },
- { action: OrgRelayPermissionActions.ListRelays, subject: OrgPermissionSubjects.Relay }
-);
diff --git a/frontend/src/pages/organization/Gateways/Relay/RelayListPage/route.tsx b/frontend/src/pages/organization/Gateways/Relay/RelayListPage/route.tsx
deleted file mode 100644
index 125f1c58c..000000000
--- a/frontend/src/pages/organization/Gateways/Relay/RelayListPage/route.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import { createFileRoute } from "@tanstack/react-router";
-
-import { RelayListPage } from "./RelayListPage";
-
-export const Route = createFileRoute(
- "/_authenticate/_inject-org-details/_org-layout/organization/relays/"
-)({
- component: RelayListPage,
- context: () => ({
- breadcrumbs: [
- {
- label: "Relays"
- }
- ]
- })
-});
diff --git a/frontend/src/pages/organization/NetworkingPage/NetworkingPage.tsx b/frontend/src/pages/organization/NetworkingPage/NetworkingPage.tsx
new file mode 100644
index 000000000..660e4b26d
--- /dev/null
+++ b/frontend/src/pages/organization/NetworkingPage/NetworkingPage.tsx
@@ -0,0 +1,25 @@
+import { Helmet } from "react-helmet";
+
+import { PageHeader } from "@app/components/v2";
+
+import { NetworkingTabGroup } from "./components/NetworkingTabGroup/NetworkingTabGroup";
+
+export const NetworkingPage = () => {
+ return (
+ <>
+
+ Infisical | Networking
+
+
+
+ >
+ );
+};
diff --git a/frontend/src/pages/organization/NetworkingPage/components/GatewayTab/GatewayTab.tsx b/frontend/src/pages/organization/NetworkingPage/components/GatewayTab/GatewayTab.tsx
new file mode 100644
index 000000000..0e3069aee
--- /dev/null
+++ b/frontend/src/pages/organization/NetworkingPage/components/GatewayTab/GatewayTab.tsx
@@ -0,0 +1,266 @@
+import { useState } from "react";
+import {
+ faArrowUpRightFromSquare,
+ faBookOpen,
+ faCopy,
+ faDoorClosed,
+ faEdit,
+ faEllipsisV,
+ faInfoCircle,
+ faMagnifyingGlass,
+ faSearch,
+ faTrash
+} from "@fortawesome/free-solid-svg-icons";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { useQuery } from "@tanstack/react-query";
+
+import { createNotification } from "@app/components/notifications";
+import { OrgPermissionCan } from "@app/components/permissions";
+import {
+ DeleteActionModal,
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+ EmptyState,
+ IconButton,
+ Input,
+ Modal,
+ ModalContent,
+ Table,
+ TableContainer,
+ TableSkeleton,
+ TBody,
+ Td,
+ Th,
+ THead,
+ Tooltip,
+ Tr
+} from "@app/components/v2";
+import {
+ OrgGatewayPermissionActions,
+ OrgPermissionSubjects
+} from "@app/context/OrgPermissionContext/types";
+import { withPermission } from "@app/hoc";
+import { usePopUp } from "@app/hooks";
+import { gatewaysQueryKeys, useDeleteGatewayById } from "@app/hooks/api/gateways";
+import { useDeleteGatewayV2ById } from "@app/hooks/api/gateways-v2";
+
+import { EditGatewayDetailsModal } from "./components/EditGatewayDetailsModal";
+
+const GatewayHealthStatus = ({ heartbeat }: { heartbeat?: string }) => {
+ const heartbeatDate = heartbeat ? new Date(heartbeat) : null;
+ const now = new Date();
+ const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000);
+
+ const isHealthy = heartbeatDate && heartbeatDate >= oneHourAgo;
+ const tooltipContent = heartbeatDate
+ ? `Last heartbeat: ${heartbeatDate.toLocaleString()}`
+ : "No heartbeat data available";
+
+ return (
+
+
+ {isHealthy ? "Healthy" : "Unreachable"}
+
+
+ );
+};
+
+export const GatewayTab = withPermission(
+ () => {
+ const [search, setSearch] = useState("");
+ const { data: gateways, isPending: isGatewaysLoading } = useQuery(gatewaysQueryKeys.list());
+
+ const { popUp, handlePopUpOpen, handlePopUpToggle } = usePopUp([
+ "deleteGateway",
+ "editDetails"
+ ] as const);
+
+ const deleteGatewayById = useDeleteGatewayById();
+ const deleteGatewayV2ById = useDeleteGatewayV2ById();
+
+ const handleDeleteGateway = async () => {
+ const data = popUp.deleteGateway.data as { id: string; isV1: boolean };
+ if (data.isV1) {
+ await deleteGatewayById.mutateAsync(data.id);
+ } else {
+ await deleteGatewayV2ById.mutateAsync(data.id);
+ }
+
+ handlePopUpToggle("deleteGateway");
+ createNotification({
+ type: "success",
+ text: "Successfully deleted gateway"
+ });
+ };
+
+ const filteredGateway = gateways?.filter((el) =>
+ el.name.toLowerCase().includes(search.toLowerCase())
+ );
+
+ return (
+
+
+
+ Create and configure gateway to access private network resources from Infisical
+
+
+
+ setSearch(e.target.value)}
+ leftIcon={}
+ placeholder="Search gateway..."
+ className="flex-1"
+ />
+
+
+
+
+
+ | Name |
+
+ Health Check
+
+
+
+ |
+ |
+
+
+
+ {isGatewaysLoading && (
+
+ )}
+ {filteredGateway?.map((el) => (
+
+ |
+
+ {el.name}
+
+ Gateway v{el.isV1 ? "1" : "2"}
+
+
+ |
+
+
+ |
+
+
+
+
+
+
+
+
+
+ }
+ onClick={() => navigator.clipboard.writeText(el.id)}
+ >
+ Copy ID
+
+ {el.isV1 && (
+
+ {(isAllowed: boolean) => (
+ }
+ onClick={() => handlePopUpOpen("editDetails", el)}
+ >
+ Edit Details
+
+ )}
+
+ )}
+
+ {(isAllowed: boolean) => (
+ }
+ className="text-red"
+ onClick={() => handlePopUpOpen("deleteGateway", el)}
+ >
+ Delete Gateway
+
+ )}
+
+
+
+
+ |
+
+ ))}
+
+
+ handlePopUpToggle("editDetails", isOpen)}
+ >
+
+ handlePopUpToggle("editDetails")}
+ />
+
+
+ {!isGatewaysLoading && !filteredGateway?.length && (
+
+ )}
+ handlePopUpToggle("deleteGateway", isOpen)}
+ deleteKey="confirm"
+ onDeleteApproved={() => handleDeleteGateway()}
+ />
+
+
+
+ );
+ },
+ { action: OrgGatewayPermissionActions.ListGateways, subject: OrgPermissionSubjects.Gateway }
+);
diff --git a/frontend/src/pages/organization/Gateways/GatewayListPage/components/EditGatewayDetailsModal.tsx b/frontend/src/pages/organization/NetworkingPage/components/GatewayTab/components/EditGatewayDetailsModal.tsx
similarity index 100%
rename from frontend/src/pages/organization/Gateways/GatewayListPage/components/EditGatewayDetailsModal.tsx
rename to frontend/src/pages/organization/NetworkingPage/components/GatewayTab/components/EditGatewayDetailsModal.tsx
diff --git a/frontend/src/pages/organization/NetworkingPage/components/GatewayTab/index.tsx b/frontend/src/pages/organization/NetworkingPage/components/GatewayTab/index.tsx
new file mode 100644
index 000000000..2bd4af1b2
--- /dev/null
+++ b/frontend/src/pages/organization/NetworkingPage/components/GatewayTab/index.tsx
@@ -0,0 +1 @@
+export { GatewayTab } from "./GatewayTab";
diff --git a/frontend/src/pages/organization/NetworkingPage/components/NetworkingTabGroup/NetworkingTabGroup.tsx b/frontend/src/pages/organization/NetworkingPage/components/NetworkingTabGroup/NetworkingTabGroup.tsx
new file mode 100644
index 000000000..c59d64e1b
--- /dev/null
+++ b/frontend/src/pages/organization/NetworkingPage/components/NetworkingTabGroup/NetworkingTabGroup.tsx
@@ -0,0 +1,37 @@
+import { useState } from "react";
+import { useSearch } from "@tanstack/react-router";
+
+import { Tab, TabList, TabPanel, Tabs } from "@app/components/v2";
+
+import { GatewayTab } from "../GatewayTab/GatewayTab";
+import { RelayTab } from "../RelayTab/RelayTab";
+
+export const NetworkingTabGroup = () => {
+ const search = useSearch({
+ from: "/_authenticate/_inject-org-details/_org-layout/organization/networking/"
+ });
+
+ const tabs = [
+ { name: "Gateways", key: "gateways", component: GatewayTab },
+ { name: "Relays", key: "relays", component: RelayTab }
+ ];
+
+ const [selectedTab, setSelectedTab] = useState(search.selectedTab || tabs[0].key);
+
+ return (
+
+
+ {tabs.map((tab) => (
+
+ {tab.name}
+
+ ))}
+
+ {tabs.map(({ key, component: Component }) => (
+
+
+
+ ))}
+
+ );
+};
diff --git a/frontend/src/pages/organization/NetworkingPage/components/NetworkingTabGroup/index.tsx b/frontend/src/pages/organization/NetworkingPage/components/NetworkingTabGroup/index.tsx
new file mode 100644
index 000000000..47fdae2d2
--- /dev/null
+++ b/frontend/src/pages/organization/NetworkingPage/components/NetworkingTabGroup/index.tsx
@@ -0,0 +1 @@
+export { NetworkingTabGroup } from "./NetworkingTabGroup";
diff --git a/frontend/src/pages/organization/NetworkingPage/components/RelayTab/RelayTab.tsx b/frontend/src/pages/organization/NetworkingPage/components/RelayTab/RelayTab.tsx
new file mode 100644
index 000000000..4eda269d5
--- /dev/null
+++ b/frontend/src/pages/organization/NetworkingPage/components/RelayTab/RelayTab.tsx
@@ -0,0 +1,198 @@
+import { useState } from "react";
+import {
+ faArrowUpRightFromSquare,
+ faBookOpen,
+ faCopy,
+ faDoorClosed,
+ faEllipsisV,
+ faMagnifyingGlass,
+ faSearch,
+ faTrash
+} from "@fortawesome/free-solid-svg-icons";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { formatRelative } from "date-fns";
+
+import { createNotification } from "@app/components/notifications";
+import { OrgPermissionCan } from "@app/components/permissions";
+import {
+ DeleteActionModal,
+ DropdownMenu,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuTrigger,
+ EmptyState,
+ IconButton,
+ Input,
+ Table,
+ TableContainer,
+ TableSkeleton,
+ TBody,
+ Td,
+ Th,
+ THead,
+ Tooltip,
+ Tr
+} from "@app/components/v2";
+import {
+ OrgPermissionSubjects,
+ OrgRelayPermissionActions
+} from "@app/context/OrgPermissionContext/types";
+import { withPermission } from "@app/hoc";
+import { usePopUp } from "@app/hooks";
+import { useDeleteRelayById, useGetRelays } from "@app/hooks/api/relays";
+
+export const RelayTab = withPermission(
+ () => {
+ const [search, setSearch] = useState("");
+ const { data: relays, isPending: isRelaysLoading } = useGetRelays();
+
+ const { popUp, handlePopUpOpen, handlePopUpToggle } = usePopUp(["deleteRelay"] as const);
+
+ const deleteRelayById = useDeleteRelayById();
+
+ const handleDeleteRelay = async () => {
+ const data = popUp.deleteRelay.data as { id: string };
+ await deleteRelayById.mutateAsync(data.id);
+
+ handlePopUpToggle("deleteRelay");
+ createNotification({
+ type: "success",
+ text: "Successfully deleted relay"
+ });
+ };
+
+ const filteredRelays = relays?.filter((el) =>
+ el.name.toLowerCase().includes(search.toLowerCase())
+ );
+
+ return (
+
+
+
+ Create and configure relays to securely access private network resources from Infisical
+
+
+
+ setSearch(e.target.value)}
+ leftIcon={}
+ placeholder="Search relay..."
+ className="flex-1"
+ />
+
+
+
+
+
+ | Name |
+ Host |
+ Created |
+ |
+
+
+
+ {isRelaysLoading && (
+
+ )}
+ {filteredRelays?.map((el) => (
+
+ |
+
+ {el.name}
+ {!el.orgId && (
+
+
+ Managed
+
+
+ )}
+
+ |
+ {el.host} |
+ {formatRelative(new Date(el.createdAt), new Date())} |
+
+
+
+
+
+
+
+
+
+ }
+ onClick={() => navigator.clipboard.writeText(el.id)}
+ >
+ Copy ID
+
+
+ {(isAllowed: boolean) => (
+ }
+ className="text-red"
+ onClick={() => handlePopUpOpen("deleteRelay", el)}
+ >
+ Delete Relay
+
+ )}
+
+
+
+
+ |
+
+ ))}
+
+
+ {!isRelaysLoading && !filteredRelays?.length && (
+
+ )}
+ handlePopUpToggle("deleteRelay", isOpen)}
+ deleteKey="confirm"
+ onDeleteApproved={() => handleDeleteRelay()}
+ />
+
+
+
+ );
+ },
+ { action: OrgRelayPermissionActions.ListRelays, subject: OrgPermissionSubjects.Relay }
+);
diff --git a/frontend/src/pages/organization/NetworkingPage/components/RelayTab/index.tsx b/frontend/src/pages/organization/NetworkingPage/components/RelayTab/index.tsx
new file mode 100644
index 000000000..743febde6
--- /dev/null
+++ b/frontend/src/pages/organization/NetworkingPage/components/RelayTab/index.tsx
@@ -0,0 +1 @@
+export { RelayTab } from "./RelayTab";
diff --git a/frontend/src/pages/organization/NetworkingPage/components/index.tsx b/frontend/src/pages/organization/NetworkingPage/components/index.tsx
new file mode 100644
index 000000000..1f7fa2ac0
--- /dev/null
+++ b/frontend/src/pages/organization/NetworkingPage/components/index.tsx
@@ -0,0 +1,3 @@
+export { GatewayTab } from "./GatewayTab/GatewayTab";
+export { NetworkingTabGroup } from "./NetworkingTabGroup/NetworkingTabGroup";
+export { RelayTab } from "./RelayTab/RelayTab";
diff --git a/frontend/src/pages/organization/NetworkingPage/route.tsx b/frontend/src/pages/organization/NetworkingPage/route.tsx
new file mode 100644
index 000000000..906b12806
--- /dev/null
+++ b/frontend/src/pages/organization/NetworkingPage/route.tsx
@@ -0,0 +1,26 @@
+import { createFileRoute, stripSearchParams } from "@tanstack/react-router";
+import { zodValidator } from "@tanstack/zod-adapter";
+import { z } from "zod";
+
+import { NetworkingPage } from "./NetworkingPage";
+
+const NetworkingPageQueryParams = z.object({
+ selectedTab: z.string().catch("")
+});
+
+export const Route = createFileRoute(
+ "/_authenticate/_inject-org-details/_org-layout/organization/networking/"
+)({
+ component: NetworkingPage,
+ validateSearch: zodValidator(NetworkingPageQueryParams),
+ search: {
+ middlewares: [stripSearchParams({ selectedTab: "" })]
+ },
+ context: () => ({
+ breadcrumbs: [
+ {
+ label: "Networking"
+ }
+ ]
+ })
+});
diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts
index 0b4ea1426..0cf7a92d6 100644
--- a/frontend/src/routeTree.gen.ts
+++ b/frontend/src/routeTree.gen.ts
@@ -62,8 +62,7 @@ import { Route as organizationIdentityDetailsByIDPageRouteImport } from './pages
import { Route as organizationGroupDetailsByIDPageRouteImport } from './pages/organization/GroupDetailsByIDPage/route'
import { Route as organizationSettingsPageRouteImport } from './pages/organization/SettingsPage/route'
import { Route as organizationSecretSharingPageRouteImport } from './pages/organization/SecretSharingPage/route'
-import { Route as organizationGatewaysRelayRelayListPageRouteImport } from './pages/organization/Gateways/Relay/RelayListPage/route'
-import { Route as organizationGatewaysGatewayListPageRouteImport } from './pages/organization/Gateways/GatewayListPage/route'
+import { Route as organizationNetworkingPageRouteImport } from './pages/organization/NetworkingPage/route'
import { Route as organizationAppConnectionsAppConnectionsPageRouteImport } from './pages/organization/AppConnections/AppConnectionsPage/route'
import { Route as sshLayoutImport } from './pages/ssh/layout'
import { Route as secretScanningLayoutImport } from './pages/secret-scanning/layout'
@@ -256,13 +255,9 @@ const AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingImport =
createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing',
)()
-const AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysImport =
+const AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingImport =
createFileRoute(
- '/_authenticate/_inject-org-details/_org-layout/organization/relays',
- )()
-const AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysImport =
- createFileRoute(
- '/_authenticate/_inject-org-details/_org-layout/organization/gateways',
+ '/_authenticate/_inject-org-details/_org-layout/organization/networking',
)()
const AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsImport =
createFileRoute(
@@ -564,18 +559,10 @@ const AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRoute =
AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute,
} as any)
-const AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRoute =
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysImport.update({
- id: '/relays',
- path: '/relays',
- getParentRoute: () =>
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute,
- } as any)
-
-const AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRoute =
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysImport.update({
- id: '/gateways',
- path: '/gateways',
+const AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRoute =
+ AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingImport.update({
+ id: '/networking',
+ path: '/networking',
getParentRoute: () =>
AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute,
} as any)
@@ -778,20 +765,12 @@ const organizationSecretSharingPageRouteRoute =
AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRoute,
} as any)
-const organizationGatewaysRelayRelayListPageRouteRoute =
- organizationGatewaysRelayRelayListPageRouteImport.update({
+const organizationNetworkingPageRouteRoute =
+ organizationNetworkingPageRouteImport.update({
id: '/',
path: '/',
getParentRoute: () =>
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRoute,
- } as any)
-
-const organizationGatewaysGatewayListPageRouteRoute =
- organizationGatewaysGatewayListPageRouteImport.update({
- id: '/',
- path: '/',
- getParentRoute: () =>
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRoute,
+ AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRoute,
} as any)
const organizationAppConnectionsAppConnectionsPageRouteRoute =
@@ -2390,18 +2369,11 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsImport
parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport
}
- '/_authenticate/_inject-org-details/_org-layout/organization/gateways': {
- id: '/_authenticate/_inject-org-details/_org-layout/organization/gateways'
- path: '/gateways'
- fullPath: '/organization/gateways'
- preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysImport
- parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport
- }
- '/_authenticate/_inject-org-details/_org-layout/organization/relays': {
- id: '/_authenticate/_inject-org-details/_org-layout/organization/relays'
- path: '/relays'
- fullPath: '/organization/relays'
- preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysImport
+ '/_authenticate/_inject-org-details/_org-layout/organization/networking': {
+ id: '/_authenticate/_inject-org-details/_org-layout/organization/networking'
+ path: '/networking'
+ fullPath: '/organization/networking'
+ preLoaderRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingImport
parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport
}
'/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing': {
@@ -2432,19 +2404,12 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof organizationAppConnectionsAppConnectionsPageRouteImport
parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsImport
}
- '/_authenticate/_inject-org-details/_org-layout/organization/gateways/': {
- id: '/_authenticate/_inject-org-details/_org-layout/organization/gateways/'
+ '/_authenticate/_inject-org-details/_org-layout/organization/networking/': {
+ id: '/_authenticate/_inject-org-details/_org-layout/organization/networking/'
path: '/'
- fullPath: '/organization/gateways/'
- preLoaderRoute: typeof organizationGatewaysGatewayListPageRouteImport
- parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysImport
- }
- '/_authenticate/_inject-org-details/_org-layout/organization/relays/': {
- id: '/_authenticate/_inject-org-details/_org-layout/organization/relays/'
- path: '/'
- fullPath: '/organization/relays/'
- preLoaderRoute: typeof organizationGatewaysRelayRelayListPageRouteImport
- parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysImport
+ fullPath: '/organization/networking/'
+ preLoaderRoute: typeof organizationNetworkingPageRouteImport
+ parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingImport
}
'/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/': {
id: '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/'
@@ -3754,34 +3719,18 @@ const AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteWithCh
AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteChildren,
)
-interface AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteChildren {
- organizationGatewaysGatewayListPageRouteRoute: typeof organizationGatewaysGatewayListPageRouteRoute
+interface AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRouteChildren {
+ organizationNetworkingPageRouteRoute: typeof organizationNetworkingPageRouteRoute
}
-const AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteChildren =
+const AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRouteChildren =
{
- organizationGatewaysGatewayListPageRouteRoute:
- organizationGatewaysGatewayListPageRouteRoute,
+ organizationNetworkingPageRouteRoute: organizationNetworkingPageRouteRoute,
}
-const AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteWithChildren =
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRoute._addFileChildren(
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteChildren,
- )
-
-interface AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRouteChildren {
- organizationGatewaysRelayRelayListPageRouteRoute: typeof organizationGatewaysRelayRelayListPageRouteRoute
-}
-
-const AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRouteChildren =
- {
- organizationGatewaysRelayRelayListPageRouteRoute:
- organizationGatewaysRelayRelayListPageRouteRoute,
- }
-
-const AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRouteWithChildren =
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRoute._addFileChildren(
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRouteChildren,
+const AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRouteWithChildren =
+ AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRoute._addFileChildren(
+ AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRouteChildren,
)
interface AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteChildren {
@@ -3825,8 +3774,7 @@ interface AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteChildren {
organizationBillingPageRouteRoute: typeof organizationBillingPageRouteRoute
organizationProjectsPageRouteRoute: typeof organizationProjectsPageRouteRoute
AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteWithChildren
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteWithChildren
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRouteWithChildren
+ AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRouteWithChildren
AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren
AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteWithChildren
organizationGroupDetailsByIDPageRouteRoute: typeof organizationGroupDetailsByIDPageRouteRoute
@@ -3844,10 +3792,8 @@ const AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteChildren: Authentica
organizationProjectsPageRouteRoute: organizationProjectsPageRouteRoute,
AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRoute:
AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteWithChildren,
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRoute:
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteWithChildren,
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRoute:
- AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRouteWithChildren,
+ AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRoute:
+ AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRouteWithChildren,
AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRoute:
AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren,
AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRoute:
@@ -4746,14 +4692,12 @@ export interface FileRoutesByFullPath {
'/admin/environment': typeof adminEnvironmentPageRouteRoute
'/admin/integrations': typeof adminIntegrationsPageRouteRoute
'/organization/app-connections': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteWithChildren
- '/organization/gateways': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteWithChildren
- '/organization/relays': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRouteWithChildren
+ '/organization/networking': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRouteWithChildren
'/organization/secret-sharing': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren
'/organization/settings': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteWithChildren
'/secret-manager/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteWithChildren
'/organization/app-connections/': typeof organizationAppConnectionsAppConnectionsPageRouteRoute
- '/organization/gateways/': typeof organizationGatewaysGatewayListPageRouteRoute
- '/organization/relays/': typeof organizationGatewaysRelayRelayListPageRouteRoute
+ '/organization/networking/': typeof organizationNetworkingPageRouteRoute
'/organization/secret-sharing/': typeof organizationSecretSharingPageRouteRoute
'/organization/settings/': typeof organizationSettingsPageRouteRoute
'/organization/groups/$groupId': typeof organizationGroupDetailsByIDPageRouteRoute
@@ -4969,8 +4913,7 @@ export interface FileRoutesByTo {
'/admin/integrations': typeof adminIntegrationsPageRouteRoute
'/secret-manager/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteWithChildren
'/organization/app-connections': typeof organizationAppConnectionsAppConnectionsPageRouteRoute
- '/organization/gateways': typeof organizationGatewaysGatewayListPageRouteRoute
- '/organization/relays': typeof organizationGatewaysRelayRelayListPageRouteRoute
+ '/organization/networking': typeof organizationNetworkingPageRouteRoute
'/organization/secret-sharing': typeof organizationSecretSharingPageRouteRoute
'/organization/settings': typeof organizationSettingsPageRouteRoute
'/organization/groups/$groupId': typeof organizationGroupDetailsByIDPageRouteRoute
@@ -5189,14 +5132,12 @@ export interface FileRoutesById {
'/_authenticate/_inject-org-details/admin/_admin-layout/environment': typeof adminEnvironmentPageRouteRoute
'/_authenticate/_inject-org-details/admin/_admin-layout/integrations': typeof adminIntegrationsPageRouteRoute
'/_authenticate/_inject-org-details/_org-layout/organization/app-connections': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationAppConnectionsRouteWithChildren
- '/_authenticate/_inject-org-details/_org-layout/organization/gateways': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationGatewaysRouteWithChildren
- '/_authenticate/_inject-org-details/_org-layout/organization/relays': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRelaysRouteWithChildren
+ '/_authenticate/_inject-org-details/_org-layout/organization/networking': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRouteWithChildren
'/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren
'/_authenticate/_inject-org-details/_org-layout/organization/settings': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteWithChildren
'/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutSecretManagerProjectIdRouteWithChildren
'/_authenticate/_inject-org-details/_org-layout/organization/app-connections/': typeof organizationAppConnectionsAppConnectionsPageRouteRoute
- '/_authenticate/_inject-org-details/_org-layout/organization/gateways/': typeof organizationGatewaysGatewayListPageRouteRoute
- '/_authenticate/_inject-org-details/_org-layout/organization/relays/': typeof organizationGatewaysRelayRelayListPageRouteRoute
+ '/_authenticate/_inject-org-details/_org-layout/organization/networking/': typeof organizationNetworkingPageRouteRoute
'/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/': typeof organizationSecretSharingPageRouteRoute
'/_authenticate/_inject-org-details/_org-layout/organization/settings/': typeof organizationSettingsPageRouteRoute
'/_authenticate/_inject-org-details/_org-layout/organization/groups/$groupId': typeof organizationGroupDetailsByIDPageRouteRoute
@@ -5422,14 +5363,12 @@ export interface FileRouteTypes {
| '/admin/environment'
| '/admin/integrations'
| '/organization/app-connections'
- | '/organization/gateways'
- | '/organization/relays'
+ | '/organization/networking'
| '/organization/secret-sharing'
| '/organization/settings'
| '/secret-manager/$projectId'
| '/organization/app-connections/'
- | '/organization/gateways/'
- | '/organization/relays/'
+ | '/organization/networking/'
| '/organization/secret-sharing/'
| '/organization/settings/'
| '/organization/groups/$groupId'
@@ -5644,8 +5583,7 @@ export interface FileRouteTypes {
| '/admin/integrations'
| '/secret-manager/$projectId'
| '/organization/app-connections'
- | '/organization/gateways'
- | '/organization/relays'
+ | '/organization/networking'
| '/organization/secret-sharing'
| '/organization/settings'
| '/organization/groups/$groupId'
@@ -5862,14 +5800,12 @@ export interface FileRouteTypes {
| '/_authenticate/_inject-org-details/admin/_admin-layout/environment'
| '/_authenticate/_inject-org-details/admin/_admin-layout/integrations'
| '/_authenticate/_inject-org-details/_org-layout/organization/app-connections'
- | '/_authenticate/_inject-org-details/_org-layout/organization/gateways'
- | '/_authenticate/_inject-org-details/_org-layout/organization/relays'
+ | '/_authenticate/_inject-org-details/_org-layout/organization/networking'
| '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing'
| '/_authenticate/_inject-org-details/_org-layout/organization/settings'
| '/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId'
| '/_authenticate/_inject-org-details/_org-layout/organization/app-connections/'
- | '/_authenticate/_inject-org-details/_org-layout/organization/gateways/'
- | '/_authenticate/_inject-org-details/_org-layout/organization/relays/'
+ | '/_authenticate/_inject-org-details/_org-layout/organization/networking/'
| '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/'
| '/_authenticate/_inject-org-details/_org-layout/organization/settings/'
| '/_authenticate/_inject-org-details/_org-layout/organization/groups/$groupId'
@@ -6290,8 +6226,7 @@ export const routeTree = rootRoute
"/_authenticate/_inject-org-details/_org-layout/organization/billing",
"/_authenticate/_inject-org-details/_org-layout/organization/projects",
"/_authenticate/_inject-org-details/_org-layout/organization/app-connections",
- "/_authenticate/_inject-org-details/_org-layout/organization/gateways",
- "/_authenticate/_inject-org-details/_org-layout/organization/relays",
+ "/_authenticate/_inject-org-details/_org-layout/organization/networking",
"/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing",
"/_authenticate/_inject-org-details/_org-layout/organization/settings",
"/_authenticate/_inject-org-details/_org-layout/organization/groups/$groupId",
@@ -6366,18 +6301,11 @@ export const routeTree = rootRoute
"/_authenticate/_inject-org-details/_org-layout/organization/app-connections/$appConnection/oauth/callback"
]
},
- "/_authenticate/_inject-org-details/_org-layout/organization/gateways": {
+ "/_authenticate/_inject-org-details/_org-layout/organization/networking": {
"filePath": "",
"parent": "/_authenticate/_inject-org-details/_org-layout/organization",
"children": [
- "/_authenticate/_inject-org-details/_org-layout/organization/gateways/"
- ]
- },
- "/_authenticate/_inject-org-details/_org-layout/organization/relays": {
- "filePath": "",
- "parent": "/_authenticate/_inject-org-details/_org-layout/organization",
- "children": [
- "/_authenticate/_inject-org-details/_org-layout/organization/relays/"
+ "/_authenticate/_inject-org-details/_org-layout/organization/networking/"
]
},
"/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing": {
@@ -6407,13 +6335,9 @@ export const routeTree = rootRoute
"filePath": "organization/AppConnections/AppConnectionsPage/route.tsx",
"parent": "/_authenticate/_inject-org-details/_org-layout/organization/app-connections"
},
- "/_authenticate/_inject-org-details/_org-layout/organization/gateways/": {
- "filePath": "organization/Gateways/GatewayListPage/route.tsx",
- "parent": "/_authenticate/_inject-org-details/_org-layout/organization/gateways"
- },
- "/_authenticate/_inject-org-details/_org-layout/organization/relays/": {
- "filePath": "organization/Gateways/Relay/RelayListPage/route.tsx",
- "parent": "/_authenticate/_inject-org-details/_org-layout/organization/relays"
+ "/_authenticate/_inject-org-details/_org-layout/organization/networking/": {
+ "filePath": "organization/NetworkingPage/route.tsx",
+ "parent": "/_authenticate/_inject-org-details/_org-layout/organization/networking"
},
"/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/": {
"filePath": "organization/SecretSharingPage/route.tsx",
diff --git a/frontend/src/routes.ts b/frontend/src/routes.ts
index a81e9a619..936f01885 100644
--- a/frontend/src/routes.ts
+++ b/frontend/src/routes.ts
@@ -40,8 +40,7 @@ const organizationRoutes = route("/organization", [
"organization/AppConnections/OauthCallbackPage/route.tsx"
)
]),
- route("/gateways", [index("organization/Gateways/GatewayListPage/route.tsx")]),
- route("/relays", [index("organization/Gateways/Relay/RelayListPage/route.tsx")])
+ route("/networking", [index("organization/NetworkingPage/route.tsx")])
]);
const secretManagerRoutes = route("/projects/secret-management/$projectId", [