fix: add secret settings tab to secret sharing page

This commit is contained in:
Scott Wilson
2025-10-21 09:45:21 -07:00
parent b6694b0356
commit bd57640313
16 changed files with 34 additions and 165 deletions
-4
View File
@@ -33,10 +33,6 @@ export const ROUTE_PATHS = Object.freeze({
"/organization/secret-sharing", "/organization/secret-sharing",
"/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/" "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/"
), ),
SecretSharingSettings: setRoute(
"/organization/secret-sharing/settings",
"/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings"
),
SettingsPage: setRoute( SettingsPage: setRoute(
"/organization/settings", "/organization/settings",
"/_authenticate/_inject-org-details/_org-layout/organization/settings/" "/_authenticate/_inject-org-details/_org-layout/organization/settings/"
@@ -6,11 +6,13 @@ import { ROUTE_PATHS } from "@app/const/routes";
import { useOrganization } from "@app/context"; import { useOrganization } from "@app/context";
import { RequestSecretTab } from "./components/RequestSecret/RequestSecretTab"; import { RequestSecretTab } from "./components/RequestSecret/RequestSecretTab";
import { SecretSharingSettingsTab } from "./components/SecretSharingSettings/SecretSharingSettingsTab";
import { ShareSecretTab } from "./components/ShareSecret/ShareSecretTab"; import { ShareSecretTab } from "./components/ShareSecret/ShareSecretTab";
enum SecretSharingPageTabs { enum SecretSharingPageTabs {
ShareSecret = "share-secret", ShareSecret = "share-secret",
RequestSecret = "request-secret" RequestSecret = "request-secret",
Settings = "settings"
} }
export const ShareSecretSection = () => { export const ShareSecretSection = () => {
@@ -46,6 +48,11 @@ export const ShareSecretSection = () => {
<Tab variant={tabVariant} value={SecretSharingPageTabs.RequestSecret}> <Tab variant={tabVariant} value={SecretSharingPageTabs.RequestSecret}>
Request Secrets Request Secrets
</Tab> </Tab>
{!isSubOrganization && (
<Tab variant={tabVariant} value={SecretSharingPageTabs.Settings}>
Settings
</Tab>
)}
</TabList> </TabList>
<TabPanel value={SecretSharingPageTabs.ShareSecret}> <TabPanel value={SecretSharingPageTabs.ShareSecret}>
<ShareSecretTab /> <ShareSecretTab />
@@ -53,6 +60,9 @@ export const ShareSecretSection = () => {
<TabPanel value={SecretSharingPageTabs.RequestSecret}> <TabPanel value={SecretSharingPageTabs.RequestSecret}>
<RequestSecretTab /> <RequestSecretTab />
</TabPanel> </TabPanel>
<TabPanel value={SecretSharingPageTabs.Settings}>
<SecretSharingSettingsTab />
</TabPanel>
</Tabs> </Tabs>
</div> </div>
); );
@@ -0,0 +1,21 @@
import { OrgPermissionSubjects } from "@app/context";
import { OrgPermissionSecretShareAction } from "@app/context/OrgPermissionContext/types";
import { withPermission } from "@app/hoc";
import { OrgSecretShareLimitSection } from "./OrgSecretShareLimitSection";
import { SecretSharingAllowShareToAnyone } from "./SecretSharingAllowShareToAnyone";
export const SecretSharingSettingsTab = withPermission(
() => {
return (
<div className="w-full">
<SecretSharingAllowShareToAnyone />
<OrgSecretShareLimitSection />
</div>
);
},
{
action: OrgPermissionSecretShareAction.ManageSettings,
subject: OrgPermissionSubjects.SecretShare
}
);
@@ -1,40 +0,0 @@
import { Helmet } from "react-helmet";
import { useTranslation } from "react-i18next";
import { PageHeader } from "@app/components/v2";
import { useOrganization } from "@app/context";
import {
OrgPermissionSecretShareAction,
OrgPermissionSubjects
} from "@app/context/OrgPermissionContext/types";
import { withPermission } from "@app/hoc";
import { SecretSharingSettingsTabGroup } from "./components";
export const SecretSharingSettingsPage = withPermission(
() => {
const { t } = useTranslation();
const { isSubOrganization } = useOrganization();
return (
<>
<Helmet>
<title>{t("common.head-title", { title: "Secret Share Settings" })}</title>
</Helmet>
<div className="flex w-full justify-center bg-bunker-800 text-white">
<div className="w-full max-w-8xl">
<PageHeader
scope={isSubOrganization ? "namespace" : "org"}
title="Secret Share Settings"
/>
<SecretSharingSettingsTabGroup />
</div>
</div>
</>
);
},
{
action: OrgPermissionSecretShareAction.ManageSettings,
subject: OrgPermissionSubjects.SecretShare
}
);
@@ -1 +0,0 @@
export { OrgSecretShareLimitSection } from "./OrgSecretShareLimitSection";
@@ -1 +0,0 @@
export { SecretSharingAllowShareToAnyone } from "./SecretSharingAllowShareToAnyone";
@@ -1,11 +0,0 @@
import { OrgSecretShareLimitSection } from "../OrgSecretShareLimitSection";
import { SecretSharingAllowShareToAnyone } from "../SecretSharingAllowShareToAnyone";
export const SecretSharingSettingsGeneralTab = () => {
return (
<div className="w-full">
<SecretSharingAllowShareToAnyone />
<OrgSecretShareLimitSection />
</div>
);
};
@@ -1 +0,0 @@
export { SecretSharingSettingsGeneralTab } from "./SecretSharingSettingsGeneralTab";
@@ -1,39 +0,0 @@
import { useState } from "react";
import { useSearch } from "@tanstack/react-router";
import { Tab, TabList, TabPanel, Tabs } from "@app/components/v2";
import { ROUTE_PATHS } from "@app/const/routes";
import { SecretSharingSettingsGeneralTab } from "../SecretSharingSettingsGeneralTab";
export const SecretSharingSettingsTabGroup = () => {
const search = useSearch({
from: ROUTE_PATHS.Organization.SecretSharingSettings.id
});
const tabs = [
{
name: "General",
key: "tab-secret-sharing-general",
component: SecretSharingSettingsGeneralTab
}
];
const [selectedTab, setSelectedTab] = useState(search.selectedTab || tabs[0].key);
return (
<Tabs value={selectedTab} onValueChange={setSelectedTab}>
<TabList>
{tabs.map((tab) => (
<Tab value={tab.key} key={tab.key}>
{tab.name}
</Tab>
))}
</TabList>
{tabs.map(({ key, component: Component }) => (
<TabPanel value={key} key={`tab-panel-${key}`}>
<Component />
</TabPanel>
))}
</Tabs>
);
};
@@ -1 +0,0 @@
export { SecretSharingSettingsTabGroup } from "./SecretSharingSettingsTabGroup";
@@ -1 +0,0 @@
export { SecretSharingSettingsTabGroup } from "./SecretSharingSettingsTabGroup";
@@ -1,30 +0,0 @@
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
import { zodValidator } from "@tanstack/zod-adapter";
import { z } from "zod";
import { SecretSharingSettingsPage } from "./SecretSharingSettingsPage";
const SettingsPageQueryParams = z.object({
selectedTab: z.string().catch("")
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings"
)({
component: SecretSharingSettingsPage,
validateSearch: zodValidator(SettingsPageQueryParams),
search: {
middlewares: [stripSearchParams({ selectedTab: "" })]
},
context: () => ({
breadcrumbs: [
{
label: "Secret Sharing",
link: linkOptions({ to: "/organization/secret-sharing" })
},
{
label: "Settings"
}
]
})
});
+1 -31
View File
@@ -56,7 +56,6 @@ import { Route as organizationAccessManagementPageRouteImport } from './pages/or
import { Route as adminGeneralPageRouteImport } from './pages/admin/GeneralPage/route' import { Route as adminGeneralPageRouteImport } from './pages/admin/GeneralPage/route'
import { Route as secretManagerRedirectsRedirectApprovalPageImport } from './pages/secret-manager/redirects/redirect-approval-page' import { Route as secretManagerRedirectsRedirectApprovalPageImport } from './pages/secret-manager/redirects/redirect-approval-page'
import { Route as adminResourceOverviewPageRouteImport } from './pages/admin/ResourceOverviewPage/route' import { Route as adminResourceOverviewPageRouteImport } from './pages/admin/ResourceOverviewPage/route'
import { Route as organizationSecretSharingSettingsPageRouteImport } from './pages/organization/SecretSharingSettingsPage/route'
import { Route as organizationRoleByIDPageRouteImport } from './pages/organization/RoleByIDPage/route' import { Route as organizationRoleByIDPageRouteImport } from './pages/organization/RoleByIDPage/route'
import { Route as organizationUserDetailsByIDPageRouteImport } from './pages/organization/UserDetailsByIDPage/route' import { Route as organizationUserDetailsByIDPageRouteImport } from './pages/organization/UserDetailsByIDPage/route'
import { Route as organizationIdentityDetailsByIDPageRouteImport } from './pages/organization/IdentityDetailsByIDPage/route' import { Route as organizationIdentityDetailsByIDPageRouteImport } from './pages/organization/IdentityDetailsByIDPage/route'
@@ -751,14 +750,6 @@ const adminResourceOverviewPageRouteRoute =
getParentRoute: () => adminLayoutRoute, getParentRoute: () => adminLayoutRoute,
} as any) } as any)
const organizationSecretSharingSettingsPageRouteRoute =
organizationSecretSharingSettingsPageRouteImport.update({
id: '/settings',
path: '/settings',
getParentRoute: () =>
AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRoute,
} as any)
const organizationRoleByIDPageRouteRoute = const organizationRoleByIDPageRouteRoute =
organizationRoleByIDPageRouteImport.update({ organizationRoleByIDPageRouteImport.update({
id: '/roles/$roleId', id: '/roles/$roleId',
@@ -2617,13 +2608,6 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof organizationRoleByIDPageRouteImport preLoaderRoute: typeof organizationRoleByIDPageRouteImport
parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport
} }
'/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings': {
id: '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings'
path: '/settings'
fullPath: '/organization/secret-sharing/settings'
preLoaderRoute: typeof organizationSecretSharingSettingsPageRouteImport
parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingImport
}
'/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview': { '/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview': {
id: '/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview' id: '/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview'
path: '/resources/overview' path: '/resources/overview'
@@ -4018,15 +4002,12 @@ const AuthenticateInjectOrgDetailsOrgLayoutOrganizationNetworkingRouteWithChildr
interface AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteChildren { interface AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteChildren {
organizationSecretSharingPageRouteRoute: typeof organizationSecretSharingPageRouteRoute organizationSecretSharingPageRouteRoute: typeof organizationSecretSharingPageRouteRoute
organizationSecretSharingSettingsPageRouteRoute: typeof organizationSecretSharingSettingsPageRouteRoute
} }
const AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteChildren = const AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteChildren: AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteChildren =
{ {
organizationSecretSharingPageRouteRoute: organizationSecretSharingPageRouteRoute:
organizationSecretSharingPageRouteRoute, organizationSecretSharingPageRouteRoute,
organizationSecretSharingSettingsPageRouteRoute:
organizationSecretSharingSettingsPageRouteRoute,
} }
const AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren = const AuthenticateInjectOrgDetailsOrgLayoutOrganizationSecretSharingRouteWithChildren =
@@ -5077,7 +5058,6 @@ export interface FileRoutesByFullPath {
'/organization/identities/$identityId': typeof organizationIdentityDetailsByIDPageRouteRoute '/organization/identities/$identityId': typeof organizationIdentityDetailsByIDPageRouteRoute
'/organization/members/$membershipId': typeof organizationUserDetailsByIDPageRouteRoute '/organization/members/$membershipId': typeof organizationUserDetailsByIDPageRouteRoute
'/organization/roles/$roleId': typeof organizationRoleByIDPageRouteRoute '/organization/roles/$roleId': typeof organizationRoleByIDPageRouteRoute
'/organization/secret-sharing/settings': typeof organizationSecretSharingSettingsPageRouteRoute
'/admin/resources/overview': typeof adminResourceOverviewPageRouteRoute '/admin/resources/overview': typeof adminResourceOverviewPageRouteRoute
'/projects/cert-management/$projectId': typeof certManagerLayoutRouteWithChildren '/projects/cert-management/$projectId': typeof certManagerLayoutRouteWithChildren
'/projects/kms/$projectId': typeof kmsLayoutRouteWithChildren '/projects/kms/$projectId': typeof kmsLayoutRouteWithChildren
@@ -5310,7 +5290,6 @@ export interface FileRoutesByTo {
'/organization/identities/$identityId': typeof organizationIdentityDetailsByIDPageRouteRoute '/organization/identities/$identityId': typeof organizationIdentityDetailsByIDPageRouteRoute
'/organization/members/$membershipId': typeof organizationUserDetailsByIDPageRouteRoute '/organization/members/$membershipId': typeof organizationUserDetailsByIDPageRouteRoute
'/organization/roles/$roleId': typeof organizationRoleByIDPageRouteRoute '/organization/roles/$roleId': typeof organizationRoleByIDPageRouteRoute
'/organization/secret-sharing/settings': typeof organizationSecretSharingSettingsPageRouteRoute
'/admin/resources/overview': typeof adminResourceOverviewPageRouteRoute '/admin/resources/overview': typeof adminResourceOverviewPageRouteRoute
'/projects/cert-management/$projectId': typeof certManagerLayoutRouteWithChildren '/projects/cert-management/$projectId': typeof certManagerLayoutRouteWithChildren
'/projects/kms/$projectId': typeof kmsLayoutRouteWithChildren '/projects/kms/$projectId': typeof kmsLayoutRouteWithChildren
@@ -5549,7 +5528,6 @@ export interface FileRoutesById {
'/_authenticate/_inject-org-details/_org-layout/organization/identities/$identityId': typeof organizationIdentityDetailsByIDPageRouteRoute '/_authenticate/_inject-org-details/_org-layout/organization/identities/$identityId': typeof organizationIdentityDetailsByIDPageRouteRoute
'/_authenticate/_inject-org-details/_org-layout/organization/members/$membershipId': typeof organizationUserDetailsByIDPageRouteRoute '/_authenticate/_inject-org-details/_org-layout/organization/members/$membershipId': typeof organizationUserDetailsByIDPageRouteRoute
'/_authenticate/_inject-org-details/_org-layout/organization/roles/$roleId': typeof organizationRoleByIDPageRouteRoute '/_authenticate/_inject-org-details/_org-layout/organization/roles/$roleId': typeof organizationRoleByIDPageRouteRoute
'/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings': typeof organizationSecretSharingSettingsPageRouteRoute
'/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview': typeof adminResourceOverviewPageRouteRoute '/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview': typeof adminResourceOverviewPageRouteRoute
'/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRouteWithChildren '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsCertManagementProjectIdRouteWithChildren
'/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRouteWithChildren '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId': typeof AuthenticateInjectOrgDetailsOrgLayoutProjectsKmsProjectIdRouteWithChildren
@@ -5798,7 +5776,6 @@ export interface FileRouteTypes {
| '/organization/identities/$identityId' | '/organization/identities/$identityId'
| '/organization/members/$membershipId' | '/organization/members/$membershipId'
| '/organization/roles/$roleId' | '/organization/roles/$roleId'
| '/organization/secret-sharing/settings'
| '/admin/resources/overview' | '/admin/resources/overview'
| '/projects/cert-management/$projectId' | '/projects/cert-management/$projectId'
| '/projects/kms/$projectId' | '/projects/kms/$projectId'
@@ -6030,7 +6007,6 @@ export interface FileRouteTypes {
| '/organization/identities/$identityId' | '/organization/identities/$identityId'
| '/organization/members/$membershipId' | '/organization/members/$membershipId'
| '/organization/roles/$roleId' | '/organization/roles/$roleId'
| '/organization/secret-sharing/settings'
| '/admin/resources/overview' | '/admin/resources/overview'
| '/projects/cert-management/$projectId' | '/projects/cert-management/$projectId'
| '/projects/kms/$projectId' | '/projects/kms/$projectId'
@@ -6267,7 +6243,6 @@ export interface FileRouteTypes {
| '/_authenticate/_inject-org-details/_org-layout/organization/identities/$identityId' | '/_authenticate/_inject-org-details/_org-layout/organization/identities/$identityId'
| '/_authenticate/_inject-org-details/_org-layout/organization/members/$membershipId' | '/_authenticate/_inject-org-details/_org-layout/organization/members/$membershipId'
| '/_authenticate/_inject-org-details/_org-layout/organization/roles/$roleId' | '/_authenticate/_inject-org-details/_org-layout/organization/roles/$roleId'
| '/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings'
| '/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview' | '/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview'
| '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId' | '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId'
| '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId' | '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId'
@@ -6791,8 +6766,7 @@ export const routeTree = rootRoute
"filePath": "", "filePath": "",
"parent": "/_authenticate/_inject-org-details/_org-layout/organization", "parent": "/_authenticate/_inject-org-details/_org-layout/organization",
"children": [ "children": [
"/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/", "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/"
"/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings"
] ]
}, },
"/_authenticate/_inject-org-details/_org-layout/organization/settings": { "/_authenticate/_inject-org-details/_org-layout/organization/settings": {
@@ -6842,10 +6816,6 @@ export const routeTree = rootRoute
"filePath": "organization/RoleByIDPage/route.tsx", "filePath": "organization/RoleByIDPage/route.tsx",
"parent": "/_authenticate/_inject-org-details/_org-layout/organization" "parent": "/_authenticate/_inject-org-details/_org-layout/organization"
}, },
"/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing/settings": {
"filePath": "organization/SecretSharingSettingsPage/route.tsx",
"parent": "/_authenticate/_inject-org-details/_org-layout/organization/secret-sharing"
},
"/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview": { "/_authenticate/_inject-org-details/admin/_admin-layout/resources/overview": {
"filePath": "admin/ResourceOverviewPage/route.tsx", "filePath": "admin/ResourceOverviewPage/route.tsx",
"parent": "/_authenticate/_inject-org-details/admin/_admin-layout" "parent": "/_authenticate/_inject-org-details/admin/_admin-layout"
+1 -4
View File
@@ -21,10 +21,7 @@ const organizationRoutes = route("/organization", [
route("/access-management", "organization/AccessManagementPage/route.tsx"), route("/access-management", "organization/AccessManagementPage/route.tsx"),
route("/audit-logs", "organization/AuditLogsPage/route.tsx"), route("/audit-logs", "organization/AuditLogsPage/route.tsx"),
route("/billing", "organization/BillingPage/route.tsx"), route("/billing", "organization/BillingPage/route.tsx"),
route("/secret-sharing", [ route("/secret-sharing", [index("organization/SecretSharingPage/route.tsx")]),
index("organization/SecretSharingPage/route.tsx"),
route("/settings", "organization/SecretSharingSettingsPage/route.tsx")
]),
route("/settings", [ route("/settings", [
index("organization/SettingsPage/route.tsx"), index("organization/SettingsPage/route.tsx"),
route("/oauth/callback", "organization/SettingsPage/OauthCallbackPage/route.tsx") route("/oauth/callback", "organization/SettingsPage/OauthCallbackPage/route.tsx")