mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-05 05:26:25 +00:00
feat: moved org breadcrumbs to top level
This commit is contained in:
@@ -1,6 +1,11 @@
|
|||||||
/* eslint-disable react/prop-types */
|
/* eslint-disable react/prop-types */
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { faCaretDown, faChevronRight, faEllipsis } from "@fortawesome/free-solid-svg-icons";
|
import {
|
||||||
|
faCaretDown,
|
||||||
|
faChevronRight,
|
||||||
|
faEllipsis,
|
||||||
|
faSlash
|
||||||
|
} from "@fortawesome/free-solid-svg-icons";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
import { Link, ReactNode } from "@tanstack/react-router";
|
import { Link, ReactNode } from "@tanstack/react-router";
|
||||||
import { LinkComponentProps } from "node_modules/@tanstack/react-router/dist/esm/link";
|
import { LinkComponentProps } from "node_modules/@tanstack/react-router/dist/esm/link";
|
||||||
@@ -78,13 +83,14 @@ const BreadcrumbPage = React.forwardRef<HTMLSpanElement, React.ComponentPropsWit
|
|||||||
BreadcrumbPage.displayName = "BreadcrumbPage";
|
BreadcrumbPage.displayName = "BreadcrumbPage";
|
||||||
|
|
||||||
const BreadcrumbSeparator = ({ children, className, ...props }: React.ComponentProps<"li">) => (
|
const BreadcrumbSeparator = ({ children, className, ...props }: React.ComponentProps<"li">) => (
|
||||||
<li
|
<li role="presentation" aria-hidden="true" className={twMerge("", className)} {...props}>
|
||||||
role="presentation"
|
{children ?? (
|
||||||
aria-hidden="true"
|
<FontAwesomeIcon
|
||||||
className={twMerge("[&>svg]:h-3.5 [&>svg]:w-3.5", className)}
|
icon={faSlash}
|
||||||
{...props}
|
className="rotate-90 font-medium text-bunker-300"
|
||||||
>
|
style={{ fontSize: "10px" }}
|
||||||
{children ?? <FontAwesomeIcon icon={faChevronRight} />}
|
/>
|
||||||
|
)}
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
|
BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ export type MenuGroupProps = {
|
|||||||
|
|
||||||
export const MenuGroup = ({ children, title }: MenuGroupProps): JSX.Element => (
|
export const MenuGroup = ({ children, title }: MenuGroupProps): JSX.Element => (
|
||||||
<>
|
<>
|
||||||
<li className="px-2 pt-3 text-xs uppercase text-gray-400">{title}</li>
|
<li className="px-2 pt-3 text-xs font-medium uppercase text-gray-400">{title}</li>
|
||||||
{children}
|
{children}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import {
|
|||||||
import { envConfig } from "@app/config/env";
|
import { envConfig } from "@app/config/env";
|
||||||
import { ProjectType } from "@app/hooks/api/workspace/types";
|
import { ProjectType } from "@app/hooks/api/workspace/types";
|
||||||
|
|
||||||
import { INFISICAL_SUPPORT_OPTIONS } from "../OrganizationLayout/components/MinimizedOrgSidebar/MinimizedOrgSidebar";
|
import { INFISICAL_SUPPORT_OPTIONS } from "../OrganizationLayout/components/NavBar/Navbar";
|
||||||
|
|
||||||
const generalTabs = [
|
const generalTabs = [
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,25 +1,20 @@
|
|||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { faMobile } from "@fortawesome/free-solid-svg-icons";
|
import { faMobile } from "@fortawesome/free-solid-svg-icons";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
import { linkOptions, Outlet, useLocation, useRouterState } from "@tanstack/react-router";
|
import { Outlet } from "@tanstack/react-router";
|
||||||
import { twMerge } from "tailwind-merge";
|
import { twMerge } from "tailwind-merge";
|
||||||
|
|
||||||
import { CreateOrgModal } from "@app/components/organization/CreateOrgModal";
|
import { CreateOrgModal } from "@app/components/organization/CreateOrgModal";
|
||||||
import { Banner } from "@app/components/page-frames/Banner";
|
import { Banner } from "@app/components/page-frames/Banner";
|
||||||
import { BreadcrumbContainer, TBreadcrumbFormat } from "@app/components/v2";
|
|
||||||
import { OrgPermissionSubjects, useOrgPermission, useServerConfig } from "@app/context";
|
import { OrgPermissionSubjects, useOrgPermission, useServerConfig } from "@app/context";
|
||||||
import { OrgPermissionSecretShareAction } from "@app/context/OrgPermissionContext/types";
|
import { OrgPermissionSecretShareAction } from "@app/context/OrgPermissionContext/types";
|
||||||
import { usePopUp } from "@app/hooks";
|
import { usePopUp } from "@app/hooks";
|
||||||
import { ProjectType } from "@app/hooks/api/workspace/types";
|
|
||||||
|
|
||||||
import { InsecureConnectionBanner } from "./components/InsecureConnectionBanner";
|
import { InsecureConnectionBanner } from "./components/InsecureConnectionBanner";
|
||||||
import { OrgSidebar } from "./components/OrgSidebar";
|
import { OrgSidebar } from "./components/OrgSidebar";
|
||||||
import { DefaultSideBar, ProjectOverviewSideBar, SecretSharingSideBar } from "./ProductsSideBar";
|
|
||||||
import { Navbar } from "./components/NavBar";
|
import { Navbar } from "./components/NavBar";
|
||||||
|
|
||||||
export const OrganizationLayout = () => {
|
export const OrganizationLayout = () => {
|
||||||
const matches = useRouterState({ select: (s) => s.matches.at(-1)?.context });
|
|
||||||
const location = useLocation();
|
|
||||||
const { config } = useServerConfig();
|
const { config } = useServerConfig();
|
||||||
const { permission } = useOrgPermission();
|
const { permission } = useOrgPermission();
|
||||||
|
|
||||||
@@ -28,12 +23,6 @@ export const OrganizationLayout = () => {
|
|||||||
OrgPermissionSubjects.SecretShare
|
OrgPermissionSubjects.SecretShare
|
||||||
);
|
);
|
||||||
|
|
||||||
const isOrganizationSpecificPage = location.pathname.startsWith("/organization");
|
|
||||||
const breadcrumbs =
|
|
||||||
isOrganizationSpecificPage && matches && "breadcrumbs" in matches
|
|
||||||
? matches.breadcrumbs
|
|
||||||
: undefined;
|
|
||||||
|
|
||||||
const { popUp, handlePopUpToggle } = usePopUp(["createOrg"] as const);
|
const { popUp, handlePopUpToggle } = usePopUp(["createOrg"] as const);
|
||||||
|
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -50,15 +39,7 @@ export const OrganizationLayout = () => {
|
|||||||
{!window.isSecureContext && <InsecureConnectionBanner />}
|
{!window.isSecureContext && <InsecureConnectionBanner />}
|
||||||
<div className="flex flex-grow flex-col overflow-y-hidden md:flex-row">
|
<div className="flex flex-grow flex-col overflow-y-hidden md:flex-row">
|
||||||
<OrgSidebar />
|
<OrgSidebar />
|
||||||
<main
|
<main className="flex-1 overflow-y-auto overflow-x-hidden bg-bunker-800 px-4 py-4 dark:[color-scheme:dark]">
|
||||||
className={twMerge(
|
|
||||||
"flex-1 overflow-y-auto overflow-x-hidden bg-bunker-800 px-4 pb-4 dark:[color-scheme:dark]",
|
|
||||||
!isOrganizationSpecificPage && "overflow-hidden p-0"
|
|
||||||
)}
|
|
||||||
>
|
|
||||||
{breadcrumbs ? (
|
|
||||||
<BreadcrumbContainer breadcrumbs={breadcrumbs as TBreadcrumbFormat[]} />
|
|
||||||
) : null}
|
|
||||||
<Outlet />
|
<Outlet />
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -15,28 +15,25 @@ import {
|
|||||||
import { faCircleQuestion } from "@fortawesome/free-regular-svg-icons";
|
import { faCircleQuestion } from "@fortawesome/free-regular-svg-icons";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
import { useQueryClient } from "@tanstack/react-query";
|
import { useQueryClient } from "@tanstack/react-query";
|
||||||
import { Link, useNavigate, useRouter } from "@tanstack/react-router";
|
import { Link, useNavigate, useRouter, useRouterState } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { Mfa } from "@app/components/auth/Mfa";
|
import { Mfa } from "@app/components/auth/Mfa";
|
||||||
import SecurityClient from "@app/components/utilities/SecurityClient";
|
import SecurityClient from "@app/components/utilities/SecurityClient";
|
||||||
import {
|
import {
|
||||||
|
BreadcrumbContainer,
|
||||||
Button,
|
Button,
|
||||||
DropdownMenu,
|
DropdownMenu,
|
||||||
DropdownMenuContent,
|
DropdownMenuContent,
|
||||||
DropdownMenuItem,
|
DropdownMenuItem,
|
||||||
DropdownMenuTrigger,
|
DropdownMenuTrigger,
|
||||||
Lottie
|
Lottie,
|
||||||
|
TBreadcrumbFormat
|
||||||
} from "@app/components/v2";
|
} from "@app/components/v2";
|
||||||
import { envConfig } from "@app/config/env";
|
import { envConfig } from "@app/config/env";
|
||||||
import { useOrganization, useSubscription, useUser } from "@app/context";
|
import { useOrganization, useSubscription, useUser } from "@app/context";
|
||||||
import { isInfisicalCloud } from "@app/helpers/platform";
|
import { isInfisicalCloud } from "@app/helpers/platform";
|
||||||
import { useToggle } from "@app/hooks";
|
import { useToggle } from "@app/hooks";
|
||||||
import {
|
import { useGetOrganizations, useLogoutUser, workspaceKeys } from "@app/hooks/api";
|
||||||
useGetOrganizations,
|
|
||||||
useGetOrgTrialUrl,
|
|
||||||
useLogoutUser,
|
|
||||||
workspaceKeys
|
|
||||||
} from "@app/hooks/api";
|
|
||||||
import { authKeys, selectOrganization } from "@app/hooks/api/auth/queries";
|
import { authKeys, selectOrganization } from "@app/hooks/api/auth/queries";
|
||||||
import { MfaMethod } from "@app/hooks/api/auth/types";
|
import { MfaMethod } from "@app/hooks/api/auth/types";
|
||||||
import { SubscriptionPlan } from "@app/hooks/api/types";
|
import { SubscriptionPlan } from "@app/hooks/api/types";
|
||||||
@@ -83,8 +80,6 @@ export const Navbar = () => {
|
|||||||
const { currentOrg } = useOrganization();
|
const { currentOrg } = useOrganization();
|
||||||
const [openSupport, setOpenSupport] = useState(false);
|
const [openSupport, setOpenSupport] = useState(false);
|
||||||
const [openUser, setOpenUser] = useState(false);
|
const [openUser, setOpenUser] = useState(false);
|
||||||
const [showAdminsModal, setShowAdminsModal] = useState(false);
|
|
||||||
const { mutateAsync } = useGetOrgTrialUrl();
|
|
||||||
|
|
||||||
const { data: orgs } = useGetOrganizations();
|
const { data: orgs } = useGetOrganizations();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -94,6 +89,9 @@ export const Navbar = () => {
|
|||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const queryClient = useQueryClient();
|
const queryClient = useQueryClient();
|
||||||
|
|
||||||
|
const matches = useRouterState({ select: (s) => s.matches.at(-1)?.context });
|
||||||
|
const breadcrumbs = matches && "breadcrumbs" in matches ? matches.breadcrumbs : undefined;
|
||||||
|
|
||||||
const handleOrgChange = async (orgId: string) => {
|
const handleOrgChange = async (orgId: string) => {
|
||||||
queryClient.removeQueries({ queryKey: authKeys.getAuthToken });
|
queryClient.removeQueries({ queryKey: authKeys.getAuthToken });
|
||||||
queryClient.removeQueries({ queryKey: workspaceKeys.getAllUserWorkspace() });
|
queryClient.removeQueries({ queryKey: workspaceKeys.getAllUserWorkspace() });
|
||||||
@@ -140,7 +138,7 @@ export const Navbar = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="dark z-10 flex h-12 items-center gap-1 border-b border-mineshaft-600 bg-gradient-to-tr from-mineshaft-700 via-mineshaft-800 to-mineshaft-900 px-4 py-2">
|
<div className="z-10 flex h-12 items-center gap-1 border-b border-mineshaft-600 bg-mineshaft-800 px-4 py-2">
|
||||||
<div>
|
<div>
|
||||||
<Link to="/organization/secret-manager/overview">
|
<Link to="/organization/secret-manager/overview">
|
||||||
<img alt="infisical logo" src="/images/logotransparent.png" className="h-4" />
|
<img alt="infisical logo" src="/images/logotransparent.png" className="h-4" />
|
||||||
@@ -159,9 +157,7 @@ export const Navbar = () => {
|
|||||||
<div className="rounded border border-mineshaft-500 p-1 text-xs text-bunker-300">
|
<div className="rounded border border-mineshaft-500 p-1 text-xs text-bunker-300">
|
||||||
{getPlan(subscription)}
|
{getPlan(subscription)}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<FontAwesomeIcon icon={faSort} className="text-xs text-bunker-300" />
|
||||||
<FontAwesomeIcon icon={faSort} className="text-xs text-bunker-300" />
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent
|
<DropdownMenuContent
|
||||||
@@ -217,6 +213,16 @@ export const Navbar = () => {
|
|||||||
</DropdownMenuItem>
|
</DropdownMenuItem>
|
||||||
</DropdownMenuContent>
|
</DropdownMenuContent>
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
|
<FontAwesomeIcon
|
||||||
|
icon={faSlash}
|
||||||
|
className="mr-1 rotate-90 font-medium text-bunker-300"
|
||||||
|
style={{ fontSize: "10px" }}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
{breadcrumbs ? (
|
||||||
|
<BreadcrumbContainer breadcrumbs={breadcrumbs as TBreadcrumbFormat[]} />
|
||||||
|
) : null}
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-grow" />
|
<div className="flex-grow" />
|
||||||
<DropdownMenu modal={false} open={openSupport} onOpenChange={setOpenSupport}>
|
<DropdownMenu modal={false} open={openSupport} onOpenChange={setOpenSupport}>
|
||||||
|
|||||||
@@ -1,179 +1,36 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { faGithub, faSlack } from "@fortawesome/free-brands-svg-icons";
|
|
||||||
import {
|
import {
|
||||||
faArrowUpRightFromSquare,
|
|
||||||
faBook,
|
faBook,
|
||||||
faCheck,
|
|
||||||
faCheckCircle,
|
faCheckCircle,
|
||||||
faCog,
|
faCog,
|
||||||
faDoorClosed,
|
faDoorClosed,
|
||||||
faEnvelope,
|
|
||||||
faInfinity,
|
faInfinity,
|
||||||
faInfo,
|
|
||||||
faInfoCircle,
|
|
||||||
faMoneyBill,
|
faMoneyBill,
|
||||||
faPlug,
|
faPlug,
|
||||||
faSignOut,
|
|
||||||
faUser,
|
|
||||||
faUserCog,
|
faUserCog,
|
||||||
faUsers
|
faUsers
|
||||||
} from "@fortawesome/free-solid-svg-icons";
|
} from "@fortawesome/free-solid-svg-icons";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
import { useQueryClient } from "@tanstack/react-query";
|
import { Link } from "@tanstack/react-router";
|
||||||
import { Link, linkOptions, useLocation, useNavigate, useRouter } from "@tanstack/react-router";
|
|
||||||
|
|
||||||
import { Mfa } from "@app/components/auth/Mfa";
|
|
||||||
import { CreateOrgModal } from "@app/components/organization/CreateOrgModal";
|
import { CreateOrgModal } from "@app/components/organization/CreateOrgModal";
|
||||||
import SecurityClient from "@app/components/utilities/SecurityClient";
|
import { Menu, MenuGroup, MenuItem, Modal, ModalContent, Tooltip } from "@app/components/v2";
|
||||||
import {
|
|
||||||
Button,
|
|
||||||
DropdownMenu,
|
|
||||||
DropdownMenuContent,
|
|
||||||
DropdownMenuItem,
|
|
||||||
DropdownMenuLabel,
|
|
||||||
DropdownMenuTrigger,
|
|
||||||
Menu,
|
|
||||||
MenuGroup,
|
|
||||||
MenuItem,
|
|
||||||
Modal,
|
|
||||||
ModalContent,
|
|
||||||
Tooltip
|
|
||||||
} from "@app/components/v2";
|
|
||||||
import { envConfig } from "@app/config/env";
|
|
||||||
import { useOrganization, useSubscription, useUser } from "@app/context";
|
import { useOrganization, useSubscription, useUser } from "@app/context";
|
||||||
import { isInfisicalCloud } from "@app/helpers/platform";
|
import { usePopUp } from "@app/hooks";
|
||||||
import { usePopUp, useToggle } from "@app/hooks";
|
import { useGetOrgTrialUrl } from "@app/hooks/api";
|
||||||
import {
|
|
||||||
useGetOrganizations,
|
|
||||||
useGetOrgTrialUrl,
|
|
||||||
useLogoutUser,
|
|
||||||
useSelectOrganization,
|
|
||||||
workspaceKeys
|
|
||||||
} from "@app/hooks/api";
|
|
||||||
import { authKeys } from "@app/hooks/api/auth/queries";
|
|
||||||
import { MfaMethod } from "@app/hooks/api/auth/types";
|
|
||||||
import { SubscriptionPlan } from "@app/hooks/api/types";
|
|
||||||
import { AuthMethod } from "@app/hooks/api/users/types";
|
|
||||||
import { ProjectType } from "@app/hooks/api/workspace/types";
|
|
||||||
import { navigateUserToOrg } from "@app/pages/auth/LoginPage/Login.utils";
|
|
||||||
|
|
||||||
import { MenuIconButton } from "../MenuIconButton";
|
|
||||||
import { ServerAdminsPanel } from "../ServerAdminsPanel/ServerAdminsPanel";
|
import { ServerAdminsPanel } from "../ServerAdminsPanel/ServerAdminsPanel";
|
||||||
|
|
||||||
const getPlan = (subscription: SubscriptionPlan) => {
|
|
||||||
if (subscription.groups) return "Enterprise Plan";
|
|
||||||
if (subscription.pitRecovery) return "Pro Plan";
|
|
||||||
return "Free Plan";
|
|
||||||
};
|
|
||||||
|
|
||||||
export const INFISICAL_SUPPORT_OPTIONS = [
|
|
||||||
[
|
|
||||||
<FontAwesomeIcon key={1} className="pr-4 text-sm" icon={faSlack} />,
|
|
||||||
"Support Forum",
|
|
||||||
"https://infisical.com/slack"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
<FontAwesomeIcon key={2} className="pr-4 text-sm" icon={faBook} />,
|
|
||||||
"Read Docs",
|
|
||||||
"https://infisical.com/docs/documentation/getting-started/introduction"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
<FontAwesomeIcon key={3} className="pr-4 text-sm" icon={faGithub} />,
|
|
||||||
"GitHub Issues",
|
|
||||||
"https://github.com/Infisical/infisical/issues"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
<FontAwesomeIcon key={4} className="pr-4 text-sm" icon={faEnvelope} />,
|
|
||||||
"Email Support",
|
|
||||||
"mailto:[email protected]"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
<FontAwesomeIcon key={5} className="pr-4 text-sm" icon={faUsers} />,
|
|
||||||
"Instance Admins",
|
|
||||||
"server-admins"
|
|
||||||
]
|
|
||||||
];
|
|
||||||
|
|
||||||
export const OrgSidebar = () => {
|
export const OrgSidebar = () => {
|
||||||
const [shouldShowMfa, toggleShowMfa] = useToggle(false);
|
|
||||||
const [requiredMfaMethod, setRequiredMfaMethod] = useState(MfaMethod.EMAIL);
|
|
||||||
const [mfaSuccessCallback, setMfaSuccessCallback] = useState<() => void>(() => {});
|
|
||||||
const { subscription } = useSubscription();
|
const { subscription } = useSubscription();
|
||||||
const [open, setOpen] = useState(false);
|
|
||||||
const [openSupport, setOpenSupport] = useState(false);
|
|
||||||
const [openUser, setOpenUser] = useState(false);
|
|
||||||
const [openOrg, setOpenOrg] = useState(false);
|
|
||||||
const [showAdminsModal, setShowAdminsModal] = useState(false);
|
const [showAdminsModal, setShowAdminsModal] = useState(false);
|
||||||
|
|
||||||
const { user } = useUser();
|
const { user } = useUser();
|
||||||
const { mutateAsync } = useGetOrgTrialUrl();
|
const { mutateAsync } = useGetOrgTrialUrl();
|
||||||
|
|
||||||
const { currentOrg } = useOrganization();
|
const { currentOrg } = useOrganization();
|
||||||
const { data: orgs } = useGetOrganizations();
|
|
||||||
|
|
||||||
const { popUp, handlePopUpToggle } = usePopUp(["createOrg"] as const);
|
const { popUp, handlePopUpToggle } = usePopUp(["createOrg"] as const);
|
||||||
const { mutateAsync: selectOrganization } = useSelectOrganization();
|
|
||||||
const navigate = useNavigate();
|
|
||||||
const router = useRouter();
|
|
||||||
const location = useLocation();
|
|
||||||
const queryClient = useQueryClient();
|
|
||||||
|
|
||||||
const isMoreSelected = (
|
|
||||||
[
|
|
||||||
linkOptions({ to: "/organization/access-management" }).to,
|
|
||||||
linkOptions({ to: "/organization/app-connections" }).to,
|
|
||||||
linkOptions({ to: "/organization/billing" }).to,
|
|
||||||
linkOptions({ to: "/organization/sso" }).to,
|
|
||||||
linkOptions({ to: "/organization/gateways" }).to,
|
|
||||||
linkOptions({ to: "/organization/settings" }).to,
|
|
||||||
linkOptions({ to: "/organization/audit-logs" }).to
|
|
||||||
] as string[]
|
|
||||||
).includes(location.pathname);
|
|
||||||
|
|
||||||
const handleOrgChange = async (orgId: string) => {
|
|
||||||
queryClient.removeQueries({ queryKey: authKeys.getAuthToken });
|
|
||||||
queryClient.removeQueries({ queryKey: workspaceKeys.getAllUserWorkspace() });
|
|
||||||
|
|
||||||
const { token, isMfaEnabled, mfaMethod } = await selectOrganization({
|
|
||||||
organizationId: orgId
|
|
||||||
});
|
|
||||||
|
|
||||||
if (isMfaEnabled) {
|
|
||||||
SecurityClient.setMfaToken(token);
|
|
||||||
if (mfaMethod) {
|
|
||||||
setRequiredMfaMethod(mfaMethod);
|
|
||||||
}
|
|
||||||
toggleShowMfa.on();
|
|
||||||
setMfaSuccessCallback(() => () => handleOrgChange(orgId));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
await router.invalidate();
|
|
||||||
await navigateUserToOrg(navigate, orgId);
|
|
||||||
};
|
|
||||||
|
|
||||||
const logout = useLogoutUser();
|
|
||||||
const logOutUser = async () => {
|
|
||||||
try {
|
|
||||||
console.log("Logging out...");
|
|
||||||
await logout.mutateAsync();
|
|
||||||
navigate({ to: "/login" });
|
|
||||||
} catch (error) {
|
|
||||||
console.error(error);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (shouldShowMfa) {
|
|
||||||
return (
|
|
||||||
<div className="flex max-h-screen min-h-screen flex-col items-center justify-center gap-2 overflow-y-auto bg-gradient-to-tr from-mineshaft-600 via-mineshaft-800 to-bunker-700">
|
|
||||||
<Mfa
|
|
||||||
email={user.email as string}
|
|
||||||
method={requiredMfaMethod}
|
|
||||||
successCallback={mfaSuccessCallback}
|
|
||||||
closeMfa={() => toggleShowMfa.off()}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@@ -188,13 +45,6 @@ export const OrgSidebar = () => {
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
)}
|
)}
|
||||||
</Link>
|
</Link>
|
||||||
<Link to="/organization/secret-sharing">
|
|
||||||
{({ isActive }) => (
|
|
||||||
<MenuItem isSelected={isActive} icon="lock-closed">
|
|
||||||
Share Secret
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
</Link>
|
|
||||||
<Link to="/organization/access-management">
|
<Link to="/organization/access-management">
|
||||||
{({ isActive }) => (
|
{({ isActive }) => (
|
||||||
<MenuItem isSelected={isActive}>
|
<MenuItem isSelected={isActive}>
|
||||||
@@ -205,26 +55,6 @@ export const OrgSidebar = () => {
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
)}
|
)}
|
||||||
</Link>
|
</Link>
|
||||||
<Link to="/organization/app-connections">
|
|
||||||
{({ isActive }) => (
|
|
||||||
<MenuItem isSelected={isActive}>
|
|
||||||
<div className="mx-1">
|
|
||||||
<FontAwesomeIcon icon={faPlug} className="mr-4" />
|
|
||||||
App Connections
|
|
||||||
</div>
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
</Link>
|
|
||||||
<Link to="/organization/gateways">
|
|
||||||
{({ isActive }) => (
|
|
||||||
<MenuItem isSelected={isActive}>
|
|
||||||
<div className="mx-1">
|
|
||||||
<FontAwesomeIcon icon={faDoorClosed} className="mr-4" />
|
|
||||||
Gateways
|
|
||||||
</div>
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
</Link>
|
|
||||||
<Link to="/organization/billing">
|
<Link to="/organization/billing">
|
||||||
{({ isActive }) => (
|
{({ isActive }) => (
|
||||||
<MenuItem isSelected={isActive}>
|
<MenuItem isSelected={isActive}>
|
||||||
@@ -266,6 +96,28 @@ export const OrgSidebar = () => {
|
|||||||
)}
|
)}
|
||||||
</Link>
|
</Link>
|
||||||
</MenuGroup>
|
</MenuGroup>
|
||||||
|
<MenuGroup title="Resources">
|
||||||
|
<Link to="/organization/app-connections">
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive}>
|
||||||
|
<div className="mx-1">
|
||||||
|
<FontAwesomeIcon icon={faPlug} className="mr-4" />
|
||||||
|
App Connections
|
||||||
|
</div>
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
<Link to="/organization/gateways">
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive}>
|
||||||
|
<div className="mx-1">
|
||||||
|
<FontAwesomeIcon icon={faDoorClosed} className="mr-4" />
|
||||||
|
Gateways
|
||||||
|
</div>
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
</MenuGroup>
|
||||||
<MenuGroup title="Admin Panels">
|
<MenuGroup title="Admin Panels">
|
||||||
{user?.superAdmin && (
|
{user?.superAdmin && (
|
||||||
<Link to="/admin">
|
<Link to="/admin">
|
||||||
@@ -290,6 +142,15 @@ export const OrgSidebar = () => {
|
|||||||
)}
|
)}
|
||||||
</Link>
|
</Link>
|
||||||
</MenuGroup>
|
</MenuGroup>
|
||||||
|
<MenuGroup title="Others">
|
||||||
|
<Link to="/organization/secret-sharing">
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="lock-closed">
|
||||||
|
Share Secret
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
</MenuGroup>
|
||||||
</Menu>
|
</Menu>
|
||||||
<div
|
<div
|
||||||
className={`relative mt-10 ${
|
className={`relative mt-10 ${
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
import { createFileRoute, stripSearchParams } from "@tanstack/react-router";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from "@tanstack/zod-adapter";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
@@ -24,11 +22,6 @@ export const Route = createFileRoute(
|
|||||||
},
|
},
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Access Control"
|
label: "Access Control"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
import { createFileRoute } from "@tanstack/react-router";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
|
||||||
|
|
||||||
import { AdminPage } from "./AdminPage";
|
import { AdminPage } from "./AdminPage";
|
||||||
|
|
||||||
@@ -10,11 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: AdminPage,
|
component: AdminPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/organization/secret-manager/overview" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Admin Console"
|
label: "Admin Console"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
import { createFileRoute } from "@tanstack/react-router";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
|
||||||
|
|
||||||
import { AppConnectionsPage } from "./AppConnectionsPage";
|
import { AppConnectionsPage } from "./AppConnectionsPage";
|
||||||
|
|
||||||
@@ -10,11 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: AppConnectionsPage,
|
component: AppConnectionsPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/organization/secret-manager/overview" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "App Connections"
|
label: "App Connections"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
import { createFileRoute } from "@tanstack/react-router";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
|
||||||
|
|
||||||
import { AuditLogsPage } from "./AuditLogsPage";
|
import { AuditLogsPage } from "./AuditLogsPage";
|
||||||
|
|
||||||
@@ -10,11 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: AuditLogsPage,
|
component: AuditLogsPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/organization/secret-manager/overview" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Audit Logs"
|
label: "Audit Logs"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { CertManagerOverviewPage } from "./CertManagerOverviewPage";
|
import { CertManagerOverviewPage } from "./CertManagerOverviewPage";
|
||||||
@@ -10,10 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: CertManagerOverviewPage,
|
component: CertManagerOverviewPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Products",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Cert Management",
|
label: "Cert Management",
|
||||||
link: linkOptions({ to: "/organization/cert-manager/overview" })
|
link: linkOptions({ to: "/organization/cert-manager/overview" })
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { CertManagerSettingsPage } from "./CertManagerSettingsPage";
|
import { CertManagerSettingsPage } from "./CertManagerSettingsPage";
|
||||||
@@ -10,10 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: CertManagerSettingsPage,
|
component: CertManagerSettingsPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Products",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Cert Management",
|
label: "Cert Management",
|
||||||
link: linkOptions({ to: "/organization/cert-manager/overview" })
|
link: linkOptions({ to: "/organization/cert-manager/overview" })
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
import { createFileRoute } from "@tanstack/react-router";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
|
||||||
|
|
||||||
import { GatewayListPage } from "./GatewayListPage";
|
import { GatewayListPage } from "./GatewayListPage";
|
||||||
|
|
||||||
@@ -10,11 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: GatewayListPage,
|
component: GatewayListPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/organization/secret-manager/overview" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Gateways"
|
label: "Gateways"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { GroupDetailsByIDPage } from "./GroupDetailsByIDPage";
|
import { GroupDetailsByIDPage } from "./GroupDetailsByIDPage";
|
||||||
@@ -10,11 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: GroupDetailsByIDPage,
|
component: GroupDetailsByIDPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/organization/secret-manager/overview" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: "Access Control",
|
||||||
link: linkOptions({ to: "/organization/access-management" })
|
link: linkOptions({ to: "/organization/access-management" })
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { IdentityDetailsByIDPage } from "./IdentityDetailsByIDPage";
|
import { IdentityDetailsByIDPage } from "./IdentityDetailsByIDPage";
|
||||||
@@ -10,11 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: IdentityDetailsByIDPage,
|
component: IdentityDetailsByIDPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/organization/secret-manager/overview" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: "Access Control",
|
||||||
link: linkOptions({ to: "/organization/access-management" })
|
link: linkOptions({ to: "/organization/access-management" })
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { KmsOverviewPage } from "./KmsOverviewPage";
|
import { KmsOverviewPage } from "./KmsOverviewPage";
|
||||||
@@ -10,10 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: KmsOverviewPage,
|
component: KmsOverviewPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Products",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "KMS",
|
label: "KMS",
|
||||||
link: linkOptions({ to: "/organization/kms/overview" })
|
link: linkOptions({ to: "/organization/kms/overview" })
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { KmsSettingsPage } from "./KmsSettingsPage";
|
import { KmsSettingsPage } from "./KmsSettingsPage";
|
||||||
@@ -10,10 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: KmsSettingsPage,
|
component: KmsSettingsPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Products",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "KMS",
|
label: "KMS",
|
||||||
link: linkOptions({ to: "/organization/kms/overview" })
|
link: linkOptions({ to: "/organization/kms/overview" })
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { RoleByIDPage } from "./RoleByIDPage";
|
import { RoleByIDPage } from "./RoleByIDPage";
|
||||||
@@ -10,11 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: RoleByIDPage,
|
component: RoleByIDPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/organization/secret-manager/overview" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: "Access Control",
|
||||||
link: linkOptions({ to: "/organization/access-management" })
|
link: linkOptions({ to: "/organization/access-management" })
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute } from "@tanstack/react-router";
|
import { createFileRoute } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { SecretManagerOverviewPage } from "./SecretManagerOverviewPage";
|
import { SecretManagerOverviewPage } from "./SecretManagerOverviewPage";
|
||||||
@@ -10,10 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: SecretManagerOverviewPage,
|
component: SecretManagerOverviewPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Products",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Secret Management"
|
label: "Secret Management"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { SecretManagerSettingsPage } from "./SecretManagerSettingsPage";
|
import { SecretManagerSettingsPage } from "./SecretManagerSettingsPage";
|
||||||
@@ -10,10 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: SecretManagerSettingsPage,
|
component: SecretManagerSettingsPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Products",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Secret Management",
|
label: "Secret Management",
|
||||||
link: linkOptions({ to: "/organization/secret-manager/overview" })
|
link: linkOptions({ to: "/organization/secret-manager/overview" })
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { SecretScanningOverviewPage } from "./SecretScanningOverviewPage";
|
import { SecretScanningOverviewPage } from "./SecretScanningOverviewPage";
|
||||||
@@ -10,10 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: SecretScanningOverviewPage,
|
component: SecretScanningOverviewPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Products",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Secret Scanning",
|
label: "Secret Scanning",
|
||||||
link: linkOptions({ to: "/organization/secret-scanning/overview" })
|
link: linkOptions({ to: "/organization/secret-scanning/overview" })
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { SecretScanningSettingsPage } from "./SecretScanningSettingsPage";
|
import { SecretScanningSettingsPage } from "./SecretScanningSettingsPage";
|
||||||
@@ -10,10 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: SecretScanningSettingsPage,
|
component: SecretScanningSettingsPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Products",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Secret Scanning",
|
label: "Secret Scanning",
|
||||||
link: linkOptions({ to: "/organization/secret-scanning/overview" })
|
link: linkOptions({ to: "/organization/secret-scanning/overview" })
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
import { createFileRoute, stripSearchParams } from "@tanstack/react-router";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from "@tanstack/zod-adapter";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
@@ -21,11 +19,6 @@ export const Route = createFileRoute(
|
|||||||
},
|
},
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Secret Sharing"
|
label: "Secret Sharing"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from "@tanstack/zod-adapter";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
@@ -20,11 +18,6 @@ export const Route = createFileRoute(
|
|||||||
},
|
},
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Secret Sharing",
|
label: "Secret Sharing",
|
||||||
link: linkOptions({ to: "/organization/secret-sharing" })
|
link: linkOptions({ to: "/organization/secret-sharing" })
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
import { createFileRoute, stripSearchParams } from "@tanstack/react-router";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from "@tanstack/zod-adapter";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
@@ -20,11 +18,6 @@ export const Route = createFileRoute(
|
|||||||
},
|
},
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Settings"
|
label: "Settings"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { SshOverviewPage } from "./SshOverviewPage";
|
import { SshOverviewPage } from "./SshOverviewPage";
|
||||||
@@ -10,10 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: SshOverviewPage,
|
component: SshOverviewPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Products",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "SSH",
|
label: "SSH",
|
||||||
link: linkOptions({ to: "/organization/ssh/overview" })
|
link: linkOptions({ to: "/organization/ssh/overview" })
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { SshSettingsPage } from "./SshSettingsPage";
|
import { SshSettingsPage } from "./SshSettingsPage";
|
||||||
@@ -10,10 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: SshSettingsPage,
|
component: SshSettingsPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Products",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "SSH",
|
label: "SSH",
|
||||||
link: linkOptions({ to: "/organization/ssh/overview" })
|
link: linkOptions({ to: "/organization/ssh/overview" })
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
import { createFileRoute, stripSearchParams } from "@tanstack/react-router";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from "@tanstack/zod-adapter";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
@@ -20,11 +18,6 @@ export const Route = createFileRoute(
|
|||||||
},
|
},
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Single Sign-On (SSO)"
|
label: "Single Sign-On (SSO)"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { UserDetailsByIDPage } from "./UserDetailsByIDPage";
|
import { UserDetailsByIDPage } from "./UserDetailsByIDPage";
|
||||||
@@ -10,11 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: UserDetailsByIDPage,
|
component: UserDetailsByIDPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/organization/secret-manager/overview" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: "Access Control",
|
||||||
link: linkOptions({ to: "/organization/access-management" })
|
link: linkOptions({ to: "/organization/access-management" })
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
import { faHome } from "@fortawesome/free-solid-svg-icons";
|
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
|
||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { GroupDetailsByIDPage } from "./GroupDetailsByIDPage";
|
import { GroupDetailsByIDPage } from "./GroupDetailsByIDPage";
|
||||||
@@ -10,11 +8,6 @@ export const Route = createFileRoute(
|
|||||||
component: GroupDetailsByIDPage,
|
component: GroupDetailsByIDPage,
|
||||||
context: () => ({
|
context: () => ({
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
|
||||||
label: "Home",
|
|
||||||
icon: () => <FontAwesomeIcon icon={faHome} />,
|
|
||||||
link: linkOptions({ to: "/organization/secret-manager/overview" })
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: "Access Control",
|
||||||
link: linkOptions({ to: "/organization/access-management" })
|
link: linkOptions({ to: "/organization/access-management" })
|
||||||
|
|||||||
Reference in New Issue
Block a user