feat: resolved frontend url changes and resolved ts error

This commit is contained in:
=
2025-07-23 14:31:52 +05:30
parent 864be1deb7
commit 33256c3462
292 changed files with 5350 additions and 3939 deletions
@@ -6,7 +6,6 @@ import { twMerge } from "tailwind-merge";
import { useOrganization, useWorkspace } from "@app/context"; import { useOrganization, useWorkspace } from "@app/context";
import { useToggle } from "@app/hooks"; import { useToggle } from "@app/hooks";
import { ProjectType } from "@app/hooks/api/workspace/types";
import { createNotification } from "../notifications"; import { createNotification } from "../notifications";
import { IconButton, Select, SelectItem, Tooltip } from "../v2"; import { IconButton, Select, SelectItem, Tooltip } from "../v2";
@@ -93,7 +92,7 @@ export default function NavHeader({
<FontAwesomeIcon icon={faAngleRight} className="ml-3 mr-3 text-sm text-gray-400" /> <FontAwesomeIcon icon={faAngleRight} className="ml-3 mr-3 text-sm text-gray-400" />
{pageName === "Secrets" ? ( {pageName === "Secrets" ? (
<Link <Link
to="/projects/$projectId/secret-manager/overview" to="/projects/secret-management/$projectId/overview"
params={{ projectId: currentWorkspace.id }} params={{ projectId: currentWorkspace.id }}
className="text-sm font-semibold text-primary/80 hover:text-primary" className="text-sm font-semibold text-primary/80 hover:text-primary"
> >
@@ -129,7 +128,7 @@ export default function NavHeader({
<div className="flex items-center space-x-3"> <div className="flex items-center space-x-3">
<FontAwesomeIcon icon={faAngleRight} className="ml-3 mr-1.5 text-xs text-gray-400" /> <FontAwesomeIcon icon={faAngleRight} className="ml-3 mr-1.5 text-xs text-gray-400" />
<Link <Link
to={`/projects/$projectId/${ProjectType.SecretManager}/secrets/$envSlug` as const} to="/projects/secret-management/$projectId/secrets/$envSlug"
params={{ projectId: currentWorkspace.id, envSlug: routerEnvSlug }} params={{ projectId: currentWorkspace.id, envSlug: routerEnvSlug }}
className="text-sm font-semibold text-primary/80 hover:text-primary" className="text-sm font-semibold text-primary/80 hover:text-primary"
> >
@@ -191,7 +190,7 @@ export default function NavHeader({
</div> </div>
) : ( ) : (
<Link <Link
to={`/projects/$projectId/${ProjectType.SecretManager}/secrets/$envSlug` as const} to="/projects/secret-management/$projectId/secrets/$envSlug"
params={{ params={{
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
envSlug: routerEnvSlug || "" envSlug: routerEnvSlug || ""
@@ -4,7 +4,6 @@ import { Link } from "@tanstack/react-router";
import { twMerge } from "tailwind-merge"; import { twMerge } from "tailwind-merge";
import { useTimedReset } from "@app/hooks"; import { useTimedReset } from "@app/hooks";
import { ProjectType } from "@app/hooks/api/workspace/types";
import { createNotification } from "../notifications"; import { createNotification } from "../notifications";
import { IconButton, Tooltip } from "../v2"; import { IconButton, Tooltip } from "../v2";
@@ -70,7 +69,7 @@ export const SecretDashboardPathBreadcrumb = ({
</div> </div>
) : ( ) : (
<Link <Link
to={`/projects/$projectId/${ProjectType.SecretManager}/secrets/$envSlug` as const} to="/projects/secret-management/$projectId/secrets/$envSlug"
params={{ params={{
projectId, projectId,
envSlug: environmentSlug envSlug: environmentSlug
@@ -5,14 +5,12 @@ import { z } from "zod";
import { createNotification } from "@app/components/notifications"; import { createNotification } from "@app/components/notifications";
import { ProjectPermissionCan } from "@app/components/permissions"; import { ProjectPermissionCan } from "@app/components/permissions";
import { Button, FormControl, Input, Select, SelectItem, TextArea } from "@app/components/v2"; import { Button, FormControl, Input, TextArea } from "@app/components/v2";
import { ProjectPermissionActions, ProjectPermissionSub, useWorkspace } from "@app/context"; import { ProjectPermissionActions, ProjectPermissionSub, useWorkspace } from "@app/context";
import { useUpdateProject } from "@app/hooks/api"; import { useUpdateProject } from "@app/hooks/api";
import { ProjectType } from "@app/hooks/api/workspace/types";
const baseFormSchema = z.object({ const baseFormSchema = z.object({
name: z.string().min(1, "Required").max(64, "Too long, maximum length is 64 characters"), name: z.string().min(1, "Required").max(64, "Too long, maximum length is 64 characters"),
defaultProduct: z.nativeEnum(ProjectType).default(ProjectType.SecretManager),
description: z description: z
.string() .string()
.trim() .trim()
@@ -52,7 +50,6 @@ export const ProjectOverviewChangeSection = ({ showSlugField = false }: Props) =
reset({ reset({
name: currentWorkspace.name, name: currentWorkspace.name,
description: currentWorkspace.description ?? "", description: currentWorkspace.description ?? "",
defaultProduct: currentWorkspace.defaultProduct,
...(showSlugField && { slug: currentWorkspace.slug }) ...(showSlugField && { slug: currentWorkspace.slug })
}); });
} }
@@ -66,7 +63,6 @@ export const ProjectOverviewChangeSection = ({ showSlugField = false }: Props) =
projectID: currentWorkspace.id, projectID: currentWorkspace.id,
newProjectName: data.name, newProjectName: data.name,
newProjectDescription: data.description, newProjectDescription: data.description,
defaultProduct: data.defaultProduct,
...(showSlugField && ...(showSlugField &&
"slug" in data && { "slug" in data && {
newSlug: data.slug !== currentWorkspace.slug ? data.slug : undefined newSlug: data.slug !== currentWorkspace.slug ? data.slug : undefined
@@ -216,31 +212,6 @@ export const ProjectOverviewChangeSection = ({ showSlugField = false }: Props) =
</ProjectPermissionCan> </ProjectPermissionCan>
</div> </div>
</div> </div>
<Controller
control={control}
name="defaultProduct"
defaultValue={ProjectType.SecretManager}
render={({ field: { onChange, ...field }, fieldState: { error } }) => (
<FormControl
label="Default Product"
errorText={error?.message}
isError={Boolean(error)}
>
<Select
defaultValue={field.value}
{...field}
onValueChange={(e) => onChange(e)}
className="w-full max-w-md bg-mineshaft-800"
>
<SelectItem value={ProjectType.SecretManager}>Secrets Manager</SelectItem>
<SelectItem value={ProjectType.CertificateManager}>PKI Manager</SelectItem>
<SelectItem value={ProjectType.KMS}>KMS</SelectItem>
<SelectItem value={ProjectType.SSH}>SSH</SelectItem>
<SelectItem value={ProjectType.SecretScanning}>Secret Scanning</SelectItem>
</Select>
</FormControl>
)}
/>
<div> <div>
<ProjectPermissionCan <ProjectPermissionCan
I={ProjectPermissionActions.Edit} I={ProjectPermissionActions.Edit}
@@ -121,7 +121,7 @@ const NewProjectForm = ({ onOpenChange }: NewProjectFormProps) => {
reset(); reset();
onOpenChange(false); onOpenChange(false);
navigate({ navigate({
to: getProjectHomePage(project.defaultProduct), to: getProjectHomePage(project.type),
params: { projectId: project.id } params: { projectId: project.id }
}); });
} catch (err) { } catch (err) {
+132 -132
View File
@@ -70,276 +70,276 @@ export const ROUTE_PATHS = Object.freeze({
}, },
SecretManager: { SecretManager: {
ApprovalPage: setRoute( ApprovalPage: setRoute(
"/projects/$projectId/secret-manager/approval", "/projects/secret-management/$projectId/approval",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/approval" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/approval"
), ),
SecretDashboardPage: setRoute( SecretDashboardPage: setRoute(
"/projects/$projectId/secret-manager/secrets/$envSlug", "/projects/secret-management/$projectId/secrets/$envSlug",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/secrets/$envSlug" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secrets/$envSlug"
), ),
RollbackPreviewPage: setRoute( RollbackPreviewPage: setRoute(
"/projects/$projectId/secret-manager/commits/$environment/$folderId/$commitId/restore", "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/restore",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore"
), ),
CommitDetailsPage: setRoute( CommitDetailsPage: setRoute(
"/projects/$projectId/secret-manager/commits/$environment/$folderId/$commitId", "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/commits/$environment/$folderId/$commitId" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId"
), ),
CommitsPage: setRoute( CommitsPage: setRoute(
"/projects/$projectId/secret-manager/commits/$environment/$folderId", "/projects/secret-management/$projectId/commits/$environment/$folderId",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/commits/$environment/$folderId" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId"
), ),
OverviewPage: setRoute( OverviewPage: setRoute(
"/projects/$projectId/secret-manager/overview", "/projects/secret-management/$projectId/overview",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/overview" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/overview"
), ),
IntegrationsListPage: setRoute( IntegrationsListPage: setRoute(
"/projects/$projectId/secret-manager/integrations", "/projects/secret-management/$projectId/integrations",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/"
), ),
IntegrationDetailsByIDPage: setRoute( IntegrationDetailsByIDPage: setRoute(
"/projects/$projectId/secret-manager/integrations/$integrationId", "/projects/secret-management/$projectId/integrations/$integrationId",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/$integrationId" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/$integrationId"
), ),
SecretSyncDetailsByIDPage: setRoute( SecretSyncDetailsByIDPage: setRoute(
"/projects/$projectId/secret-manager/integrations/secret-syncs/$destination/$syncId", "/projects/secret-management/$projectId/integrations/secret-syncs/$destination/$syncId",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/secret-syncs/$destination/$syncId" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/secret-syncs/$destination/$syncId"
), ),
Integratons: { Integratons: {
SelectIntegrationAuth: setRoute( SelectIntegrationAuth: setRoute(
"/projects/$projectId/secret-manager/integrations/select-integration-auth", "/projects/secret-management/$projectId/integrations/select-integration-auth",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/select-integration-auth" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/select-integration-auth"
), ),
HerokuOauthCallbackPage: setRoute( HerokuOauthCallbackPage: setRoute(
"/projects/$projectId/secret-manager/integrations/heroku/oauth2/callback", "/projects/secret-management/$projectId/integrations/heroku/oauth2/callback",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/heroku/oauth2/callback" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/oauth2/callback"
), ),
HerokuConfigurePage: setRoute( HerokuConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/heroku/create", "/projects/secret-management/$projectId/integrations/heroku/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/heroku/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/heroku/create"
), ),
AwsParameterStoreConfigurePage: setRoute( AwsParameterStoreConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/aws-parameter-store/create", "/projects/secret-management/$projectId/integrations/aws-parameter-store/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/aws-parameter-store/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/create"
), ),
AwsSecretManagerConfigurePage: setRoute( AwsSecretManagerConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/aws-secret-manager/create", "/projects/secret-management/$projectId/integrations/aws-secret-manager/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/aws-secret-manager/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/create"
), ),
AzureAppConfigurationsOauthCallbackPage: setRoute( AzureAppConfigurationsOauthCallbackPage: setRoute(
"/projects/$projectId/secret-manager/integrations/azure-app-configuration/oauth2/callback", "/projects/secret-management/$projectId/integrations/azure-app-configuration/oauth2/callback",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-app-configuration/oauth2/callback" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/oauth2/callback"
), ),
AzureAppConfigurationsConfigurePage: setRoute( AzureAppConfigurationsConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/azure-app-configuration/create", "/projects/secret-management/$projectId/integrations/azure-app-configuration/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-app-configuration/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/create"
), ),
AzureDevopsConfigurePage: setRoute( AzureDevopsConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/azure-devops/create", "/projects/secret-management/$projectId/integrations/azure-devops/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-devops/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/create"
), ),
AzureKeyVaultAuthorizePage: setRoute( AzureKeyVaultAuthorizePage: setRoute(
"/projects/$projectId/secret-manager/integrations/azure-key-vault/authorize", "/projects/secret-management/$projectId/integrations/azure-key-vault/authorize",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-key-vault/authorize" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize"
), ),
AzureKeyVaultOauthCallbackPage: setRoute( AzureKeyVaultOauthCallbackPage: setRoute(
"/projects/$projectId/secret-manager/integrations/azure-key-vault/oauth2/callback", "/projects/secret-management/$projectId/integrations/azure-key-vault/oauth2/callback",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-key-vault/oauth2/callback" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/oauth2/callback"
), ),
AzureKeyVaultConfigurePage: setRoute( AzureKeyVaultConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/azure-key-vault/create", "/projects/secret-management/$projectId/integrations/azure-key-vault/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-key-vault/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/create"
), ),
BitbucketOauthCallbackPage: setRoute( BitbucketOauthCallbackPage: setRoute(
"/projects/$projectId/secret-manager/integrations/bitbucket/oauth2/callback", "/projects/secret-management/$projectId/integrations/bitbucket/oauth2/callback",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/bitbucket/oauth2/callback" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/oauth2/callback"
), ),
BitbucketConfigurePage: setRoute( BitbucketConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/bitbucket/create", "/projects/secret-management/$projectId/integrations/bitbucket/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/bitbucket/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/create"
), ),
ChecklyConfigurePage: setRoute( ChecklyConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/checkly/create", "/projects/secret-management/$projectId/integrations/checkly/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/checkly/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/create"
), ),
CircleConfigurePage: setRoute( CircleConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/circleci/create", "/projects/secret-management/$projectId/integrations/circleci/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/circleci/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/create"
), ),
CloudflarePagesConfigurePage: setRoute( CloudflarePagesConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/cloudflare-pages/create", "/projects/secret-management/$projectId/integrations/cloudflare-pages/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloudflare-pages/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/create"
), ),
DigitalOceanAppPlatformConfigurePage: setRoute( DigitalOceanAppPlatformConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/digital-ocean-app-platform/create", "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/digital-ocean-app-platform/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/create"
), ),
CloudflareWorkersConfigurePage: setRoute( CloudflareWorkersConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/cloudflare-workers/create", "/projects/secret-management/$projectId/integrations/cloudflare-workers/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloudflare-workers/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/create"
), ),
CodefreshConfigurePage: setRoute( CodefreshConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/codefresh/create", "/projects/secret-management/$projectId/integrations/codefresh/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/codefresh/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/create"
), ),
GcpSecretManagerConfigurePage: setRoute( GcpSecretManagerConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/gcp-secret-manager/create", "/projects/secret-management/$projectId/integrations/gcp-secret-manager/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/gcp-secret-manager/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/create"
), ),
GcpSecretManagerOauthCallbackPage: setRoute( GcpSecretManagerOauthCallbackPage: setRoute(
"/projects/$projectId/secret-manager/integrations/gcp-secret-manager/oauth2/callback", "/projects/secret-management/$projectId/integrations/gcp-secret-manager/oauth2/callback",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/gcp-secret-manager/oauth2/callback" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/oauth2/callback"
), ),
GithubConfigurePage: setRoute( GithubConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/github/create", "/projects/secret-management/$projectId/integrations/github/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/github/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/create"
), ),
GithubOauthCallbackPage: setRoute( GithubOauthCallbackPage: setRoute(
"/projects/$projectId/secret-manager/integrations/github/oauth2/callback", "/projects/secret-management/$projectId/integrations/github/oauth2/callback",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/github/oauth2/callback" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/github/oauth2/callback"
), ),
GitlabConfigurePage: setRoute( GitlabConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/gitlab/create", "/projects/secret-management/$projectId/integrations/gitlab/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/gitlab/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/create"
), ),
GitlabOauthCallbackPage: setRoute( GitlabOauthCallbackPage: setRoute(
"/projects/$projectId/secret-manager/integrations/gitlab/oauth2/callback", "/projects/secret-management/$projectId/integrations/gitlab/oauth2/callback",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/gitlab/oauth2/callback" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/gitlab/oauth2/callback"
), ),
VercelOauthCallbackPage: setRoute( VercelOauthCallbackPage: setRoute(
"/projects/$projectId/secret-manager/integrations/vercel/oauth2/callback", "/projects/secret-management/$projectId/integrations/vercel/oauth2/callback",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/vercel/oauth2/callback" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/oauth2/callback"
), ),
VercelConfigurePage: setRoute( VercelConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/vercel/create", "/projects/secret-management/$projectId/integrations/vercel/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/vercel/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/vercel/create"
), ),
FlyioConfigurePage: setRoute( FlyioConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/flyio/create", "/projects/secret-management/$projectId/integrations/flyio/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/flyio/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/create"
), ),
HashicorpVaultConfigurePage: setRoute( HashicorpVaultConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/hashicorp-vault/create", "/projects/secret-management/$projectId/integrations/hashicorp-vault/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/hashicorp-vault/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hashicorp-vault/create"
), ),
HasuraCloudConfigurePage: setRoute( HasuraCloudConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/hasura-cloud/create", "/projects/secret-management/$projectId/integrations/hasura-cloud/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/hasura-cloud/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/hasura-cloud/create"
), ),
LaravelForgeConfigurePage: setRoute( LaravelForgeConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/laravel-forge/create", "/projects/secret-management/$projectId/integrations/laravel-forge/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/laravel-forge/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/laravel-forge/create"
), ),
NorthflankConfigurePage: setRoute( NorthflankConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/northflank/create", "/projects/secret-management/$projectId/integrations/northflank/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/northflank/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/northflank/create"
), ),
RailwayConfigurePage: setRoute( RailwayConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/railway/create", "/projects/secret-management/$projectId/integrations/railway/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/railway/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/railway/create"
), ),
RenderConfigurePage: setRoute( RenderConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/render/create", "/projects/secret-management/$projectId/integrations/render/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/render/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/render/create"
), ),
RundeckConfigurePage: setRoute( RundeckConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/rundeck/create", "/projects/secret-management/$projectId/integrations/rundeck/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/rundeck/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/rundeck/create"
), ),
WindmillConfigurePage: setRoute( WindmillConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/windmill/create", "/projects/secret-management/$projectId/integrations/windmill/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/windmill/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/windmill/create"
), ),
TravisCIConfigurePage: setRoute( TravisCIConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/travisci/create", "/projects/secret-management/$projectId/integrations/travisci/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/travisci/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/travisci/create"
), ),
TerraformCloudConfigurePage: setRoute( TerraformCloudConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/terraform-cloud/create", "/projects/secret-management/$projectId/integrations/terraform-cloud/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/terraform-cloud/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/terraform-cloud/create"
), ),
TeamcityConfigurePage: setRoute( TeamcityConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/teamcity/create", "/projects/secret-management/$projectId/integrations/teamcity/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/teamcity/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/teamcity/create"
), ),
SupabaseConfigurePage: setRoute( SupabaseConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/supabase/create", "/projects/secret-management/$projectId/integrations/supabase/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/supabase/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/supabase/create"
), ),
OctopusDeployCloudConfigurePage: setRoute( OctopusDeployCloudConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/octopus-deploy/create", "/projects/secret-management/$projectId/integrations/octopus-deploy/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/octopus-deploy/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/octopus-deploy/create"
), ),
DatabricksConfigurePage: setRoute( DatabricksConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/databricks/create", "/projects/secret-management/$projectId/integrations/databricks/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/databricks/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/create"
), ),
QoveryConfigurePage: setRoute( QoveryConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/qovery/create", "/projects/secret-management/$projectId/integrations/qovery/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/qovery/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/qovery/create"
), ),
Cloud66ConfigurePage: setRoute( Cloud66ConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/cloud-66/create", "/projects/secret-management/$projectId/integrations/cloud-66/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloud-66/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/create"
), ),
NetlifyConfigurePage: setRoute( NetlifyConfigurePage: setRoute(
"/projects/$projectId/secret-manager/integrations/netlify/create", "/projects/secret-management/$projectId/integrations/netlify/create",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/netlify/create" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/create"
), ),
NetlifyOuathCallbackPage: setRoute( NetlifyOuathCallbackPage: setRoute(
"/projects/$projectId/secret-manager/integrations/netlify/oauth2/callback", "/projects/secret-management/$projectId/integrations/netlify/oauth2/callback",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/netlify/oauth2/callback" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/netlify/oauth2/callback"
) )
} }
}, },
CertManager: { CertManager: {
CertAuthDetailsByIDPage: setRoute( CertAuthDetailsByIDPage: setRoute(
"/projects/$projectId/cert-manager/ca/$caName", "/projects/cert-management/$projectId/ca/$caName",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/ca/$caName" "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/ca/$caName"
), ),
SubscribersPage: setRoute( SubscribersPage: setRoute(
"/projects/$projectId/cert-manager/subscribers", "/projects/cert-management/$projectId/subscribers",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/subscribers" "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers"
), ),
CertificatesPage: setRoute( CertificatesPage: setRoute(
"/projects/$projectId/cert-manager/certificates", "/projects/cert-management/$projectId/certificates",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/certificates" "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificates"
), ),
CertificateAuthoritiesPage: setRoute( CertificateAuthoritiesPage: setRoute(
"/projects/$projectId/cert-manager/certificate-authorities", "/projects/cert-management/$projectId/certificate-authorities",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/certificate-authorities" "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-authorities"
), ),
AlertingPage: setRoute( AlertingPage: setRoute(
"/projects/$projectId/cert-manager/alerting", "/projects/cert-management/$projectId/alerting",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/alerting" "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/alerting"
), ),
PkiCollectionDetailsByIDPage: setRoute( PkiCollectionDetailsByIDPage: setRoute(
"/projects/$projectId/cert-manager/pki-collections/$collectionId", "/projects/cert-management/$projectId/pki-collections/$collectionId",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/pki-collections/$collectionId" "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/pki-collections/$collectionId"
), ),
PkiSubscriberDetailsByIDPage: setRoute( PkiSubscriberDetailsByIDPage: setRoute(
"/projects/$projectId/cert-manager/subscribers/$subscriberName", "/projects/cert-management/$projectId/subscribers/$subscriberName",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/subscribers/$subscriberName" "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/$subscriberName"
) )
}, },
Ssh: { Ssh: {
SshCaByIDPage: setRoute( SshCaByIDPage: setRoute(
"/projects/$projectId/ssh/ca/$caId", "/projects/ssh/$projectId/ca/$caId",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/ssh/_ssh-layout/ca/$caId" "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ca/$caId"
), ),
SshHostGroupDetailsByIDPage: setRoute( SshHostGroupDetailsByIDPage: setRoute(
"/projects/$projectId/ssh/ssh-host-groups/$sshHostGroupId", "/projects/ssh/$projectId/ssh-host-groups/$sshHostGroupId",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/ssh/_ssh-layout/ssh-host-groups/$sshHostGroupId" "/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/ssh-host-groups/$sshHostGroupId"
) )
}, },
SecretScanning: { SecretScanning: {
DataSourceByIdPage: setRoute( DataSourceByIdPage: setRoute(
"/projects/$projectId/secret-scanning/data-sources/$type/$dataSourceId", "/projects/secret-scanning/$projectId/data-sources/$type/$dataSourceId",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-scanning/_secret-scanning-layout/data-sources/$type/$dataSourceId" "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/data-sources/$type/$dataSourceId"
), ),
FindingsPage: setRoute( FindingsPage: setRoute(
"/projects/$projectId/secret-scanning/findings", "/projects/secret-scanning/$projectId/findings",
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-scanning/_secret-scanning-layout/findings" "/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/findings"
) )
}, },
Public: { Public: {
+17 -8
View File
@@ -59,14 +59,28 @@ export const initProjectHelper = async ({ projectName }: { projectName: string }
return project; return project;
}; };
export const getProjectBaseURL = (type: ProjectType) => {
switch (type) {
case ProjectType.SecretManager:
return "/projects/secret-management/$projectId";
case ProjectType.CertificateManager:
return "/projects/cert-management/$projectId";
default:
return `/projects/${type}/$projectId` as const;
}
};
export const getProjectHomePage = (type: ProjectType) => { export const getProjectHomePage = (type: ProjectType) => {
switch (type) { switch (type) {
case ProjectType.SecretManager:
return "/projects/secret-management/$projectId/overview";
case ProjectType.CertificateManager: case ProjectType.CertificateManager:
return `/projects/$projectId/${type}/subscribers` as const; return "/projects/cert-management/$projectId/subscribers";
case ProjectType.SecretScanning: case ProjectType.SecretScanning:
return `/projects/$projectId/${type}/data-sources` as const; return `/projects/${type}/$projectId/data-sources` as const;
default: default:
return `/projects/$projectId/${type}/overview` as const; return `/projects/${type}/$projectId/overview` as const;
} }
}; };
@@ -80,8 +94,3 @@ export const getProjectTitle = (type: ProjectType) => {
}; };
return titleConvert[type]; return titleConvert[type];
}; };
export const getCurrentProductFromUrl = (location: string) => {
const type = Object.values(ProjectType).find((el) => location.includes(`/${el}`));
return type;
};
+1 -1
View File
@@ -51,7 +51,7 @@ export type IdentityMembershipOrg = {
export type IdentityMembership = { export type IdentityMembership = {
id: string; id: string;
identity: Identity; identity: Identity;
project: Pick<Workspace, "id" | "name" | "defaultProduct">; project: Pick<Workspace, "id" | "name">;
roles: Array< roles: Array<
{ {
id: string; id: string;
+4 -5
View File
@@ -255,12 +255,13 @@ export const useCreateWorkspace = () => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
return useMutation<{ data: { project: Workspace } }, object, CreateWorkspaceDTO>({ return useMutation<{ data: { project: Workspace } }, object, CreateWorkspaceDTO>({
mutationFn: async ({ projectName, projectDescription, kmsKeyId, template }) => mutationFn: async ({ projectName, projectDescription, kmsKeyId, template, type }) =>
createWorkspace({ createWorkspace({
projectName, projectName,
projectDescription, projectDescription,
kmsKeyId, kmsKeyId,
template template,
type
}), }),
onSuccess: () => { onSuccess: () => {
queryClient.invalidateQueries({ queryClient.invalidateQueries({
@@ -280,8 +281,7 @@ export const useUpdateProject = () => {
newProjectDescription, newProjectDescription,
newSlug, newSlug,
secretSharing, secretSharing,
showSnapshotsLegacy, showSnapshotsLegacy
defaultProduct
}) => { }) => {
const { data } = await apiRequest.patch<{ workspace: Workspace }>( const { data } = await apiRequest.patch<{ workspace: Workspace }>(
`/api/v1/workspace/${projectID}`, `/api/v1/workspace/${projectID}`,
@@ -289,7 +289,6 @@ export const useUpdateProject = () => {
name: newProjectName, name: newProjectName,
description: newProjectDescription, description: newProjectDescription,
slug: newSlug, slug: newSlug,
defaultProduct,
secretSharing, secretSharing,
showSnapshotsLegacy showSnapshotsLegacy
} }
+2 -2
View File
@@ -24,7 +24,7 @@ export type Workspace = {
__v: number; __v: number;
id: string; id: string;
name: string; name: string;
defaultProduct: ProjectType; type: ProjectType;
description?: string; description?: string;
orgId: string; orgId: string;
version: ProjectVersion; version: ProjectVersion;
@@ -68,6 +68,7 @@ export type TGetUpgradeProjectStatusDTO = {
// mutation dto // mutation dto
export type CreateWorkspaceDTO = { export type CreateWorkspaceDTO = {
projectName: string; projectName: string;
type: ProjectType;
projectDescription?: string; projectDescription?: string;
kmsKeyId?: string; kmsKeyId?: string;
template?: string; template?: string;
@@ -80,7 +81,6 @@ export type UpdateProjectDTO = {
newSlug?: string; newSlug?: string;
secretSharing?: boolean; secretSharing?: boolean;
showSnapshotsLegacy?: boolean; showSnapshotsLegacy?: boolean;
defaultProduct?: ProjectType;
}; };
export type UpdatePitVersionLimitDTO = { projectSlug: string; pitVersionLimit: number }; export type UpdatePitVersionLimitDTO = { projectSlug: string; pitVersionLimit: number };
+61 -28
View File
@@ -1,8 +1,10 @@
import { Link, Outlet } from "@tanstack/react-router"; import { Link, Outlet } from "@tanstack/react-router";
import { motion } from "framer-motion"; import { motion } from "framer-motion";
import { Menu, MenuItem } from "@app/components/v2"; import { Lottie, Menu, MenuGroup, MenuItem } from "@app/components/v2";
import { useWorkspace } from "@app/context"; import { useWorkspace } from "@app/context";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCog, faUsers } from "@fortawesome/free-solid-svg-icons";
export const KmsLayout = () => { export const KmsLayout = () => {
const { currentWorkspace } = useWorkspace(); const { currentWorkspace } = useWorkspace();
@@ -19,35 +21,66 @@ export const KmsLayout = () => {
className="dark w-full border-r border-mineshaft-600 bg-gradient-to-tr from-mineshaft-700 via-mineshaft-800 to-mineshaft-900 md:w-60" className="dark w-full border-r border-mineshaft-600 bg-gradient-to-tr from-mineshaft-700 via-mineshaft-800 to-mineshaft-900 md:w-60"
> >
<nav className="items-between flex h-full flex-col overflow-y-auto dark:[color-scheme:dark]"> <nav className="items-between flex h-full flex-col overflow-y-auto dark:[color-scheme:dark]">
<div className="border-b border-mineshaft-600 px-4 py-3.5 text-lg text-white">KMS</div> <div className="flex items-center gap-3 border-b border-mineshaft-600 px-4 py-3.5 text-lg text-white">
<Lottie className="inline-block h-5 w-5 shrink-0" icon="unlock" />
KMS
</div>
<div className="flex-1"> <div className="flex-1">
<Menu> <Menu>
<Link <MenuGroup title="Resources">
to="/projects/$projectId/kms/overview" <Link
params={{ to="/projects/kms/$projectId/overview"
projectId: currentWorkspace.id params={{
}} projectId: currentWorkspace.id
> }}
{({ isActive }) => <MenuItem isSelected={isActive}>Overview</MenuItem>} >
</Link> {({ isActive }) => <MenuItem isSelected={isActive}>Overview</MenuItem>}
<Link </Link>
to="/projects/$projectId/kms/kmip" <Link
params={{ to="/projects/kms/$projectId/kmip"
projectId: currentWorkspace.id params={{
}} projectId: currentWorkspace.id
> }}
{({ isActive }) => <MenuItem isSelected={isActive}>KMIP</MenuItem>} >
</Link> {({ isActive }) => <MenuItem isSelected={isActive}>KMIP</MenuItem>}
{ </Link>
// <Link </MenuGroup>
// to="/projects/$projectId/kms/settings" <MenuGroup title="Others">
// params={{ <Link
// projectId: currentWorkspace.id to="/projects/kms/$projectId/access-management"
// }} params={{
// > projectId: currentWorkspace.id
// {({ isActive }) => <MenuItem isSelected={isActive}>Settings</MenuItem>} }}
// </Link> >
} {({ isActive }) => (
<MenuItem isSelected={isActive}>
<div className="mx-1 flex gap-2">
<div className="w-6">
<FontAwesomeIcon icon={faUsers} />
</div>
Access Management
</div>
</MenuItem>
)}
</Link>
<Link
to="/projects/kms/$projectId/settings"
params={{
projectId: currentWorkspace.id
}}
>
{({ isActive }) => (
<MenuItem isSelected={isActive}>
<div className="mx-1 flex gap-2">
<div className="w-6">
<FontAwesomeIcon icon={faCog} />
</div>
Settings
</div>
</MenuItem>
)}
</Link>
</MenuGroup>
</Menu> </Menu>
</div> </div>
</nav> </nav>
@@ -1,10 +1,10 @@
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { faMobile } from "@fortawesome/free-solid-svg-icons"; import { faCog, faMobile, faUsers } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { Link, Outlet } from "@tanstack/react-router"; import { Link, Outlet } from "@tanstack/react-router";
import { motion } from "framer-motion"; import { motion } from "framer-motion";
import { Menu, MenuItem } from "@app/components/v2"; import { Lottie, Menu, MenuGroup, MenuItem } from "@app/components/v2";
import { useWorkspace } from "@app/context"; import { useWorkspace } from "@app/context";
export const PkiManagerLayout = () => { export const PkiManagerLayout = () => {
@@ -24,65 +24,94 @@ export const PkiManagerLayout = () => {
className="dark w-full border-r border-mineshaft-600 bg-gradient-to-tr from-mineshaft-700 via-mineshaft-800 to-mineshaft-900 md:w-60" className="dark w-full border-r border-mineshaft-600 bg-gradient-to-tr from-mineshaft-700 via-mineshaft-800 to-mineshaft-900 md:w-60"
> >
<nav className="items-between flex h-full flex-col overflow-y-auto dark:[color-scheme:dark]"> <nav className="items-between flex h-full flex-col overflow-y-auto dark:[color-scheme:dark]">
<div className="border-b border-mineshaft-600 px-4 py-3.5 text-lg text-white"> <div className="flex items-center gap-3 border-b border-mineshaft-600 px-4 py-3.5 text-lg text-white">
<Lottie className="inline-block h-5 w-5 shrink-0" icon="note" />
PKI Manager PKI Manager
</div> </div>
<div className="flex-1"> <div className="flex-1">
<Menu> <Menu>
<Link <MenuGroup title="Resources">
to="/projects/$projectId/cert-manager/subscribers" <Link
params={{ to="/projects/cert-management/$projectId/subscribers"
projectId: currentWorkspace.id params={{
}} projectId: currentWorkspace.id
> }}
{({ isActive }) => <MenuItem isSelected={isActive}>Subscribers</MenuItem>} >
</Link> {({ isActive }) => <MenuItem isSelected={isActive}>Subscribers</MenuItem>}
<Link </Link>
to="/projects/$projectId/cert-manager/certificate-templates" <Link
params={{ to="/projects/cert-management/$projectId/certificate-templates"
projectId: currentWorkspace.id params={{
}} projectId: currentWorkspace.id
> }}
{({ isActive }) => ( >
<MenuItem isSelected={isActive}> Certificate Templates</MenuItem> {({ isActive }) => (
)} <MenuItem isSelected={isActive}> Certificate Templates</MenuItem>
</Link> )}
<Link </Link>
to="/projects/$projectId/cert-manager/certificates" <Link
params={{ to="/projects/cert-management/$projectId/certificates"
projectId: currentWorkspace.id params={{
}} projectId: currentWorkspace.id
> }}
{({ isActive }) => <MenuItem isSelected={isActive}> Certificates</MenuItem>} >
</Link> {({ isActive }) => <MenuItem isSelected={isActive}> Certificates</MenuItem>}
<Link </Link>
to="/projects/$projectId/cert-manager/certificate-authorities" <Link
params={{ to="/projects/cert-management/$projectId/certificate-authorities"
projectId: currentWorkspace.id params={{
}} projectId: currentWorkspace.id
> }}
{({ isActive }) => ( >
<MenuItem isSelected={isActive}> Certificates Authorities</MenuItem> {({ isActive }) => (
)} <MenuItem isSelected={isActive}> Certificates Authorities</MenuItem>
</Link> )}
<Link </Link>
to="/projects/$projectId/cert-manager/alerting" <Link
params={{ to="/projects/cert-management/$projectId/alerting"
projectId: currentWorkspace.id params={{
}} projectId: currentWorkspace.id
> }}
{({ isActive }) => <MenuItem isSelected={isActive}>Alerting</MenuItem>} >
</Link> {({ isActive }) => <MenuItem isSelected={isActive}>Alerting</MenuItem>}
{ </Link>
// <Link </MenuGroup>
// to="/projects/$projectId/cert-manager/settings" <MenuGroup title="Others">
// params={{ <Link
// projectId: currentWorkspace.id to="/projects/cert-management/$projectId/access-management"
// }} params={{
// > projectId: currentWorkspace.id
// {({ isActive }) => <MenuItem isSelected={isActive}>Settings</MenuItem>} }}
// </Link> >
} {({ isActive }) => (
<MenuItem isSelected={isActive}>
<div className="mx-1 flex gap-2">
<div className="w-6">
<FontAwesomeIcon icon={faUsers} />
</div>
Access Management
</div>
</MenuItem>
)}
</Link>
<Link
to="/projects/cert-management/$projectId/settings"
params={{
projectId: currentWorkspace.id
}}
>
{({ isActive }) => (
<MenuItem isSelected={isActive}>
<div className="mx-1 flex gap-2">
<div className="w-6">
<FontAwesomeIcon icon={faCog} />
</div>
Settings
</div>
</MenuItem>
)}
</Link>
</MenuGroup>
</Menu> </Menu>
</div> </div>
</nav> </nav>
@@ -35,26 +35,11 @@ const MAX_SIDEBAR_SIZE = "220px";
// If the product layout differs significantly, create a new layout as needed. // If the product layout differs significantly, create a new layout as needed.
export const ProjectLayout = () => { export const ProjectLayout = () => {
const location = useLocation(); const location = useLocation();
const { currentWorkspace } = useWorkspace();
const [sidebarStyle, setSidebarStyle] = useLocalStorageState(
"project-sidebar-style",
SidebarStyle.ExpandOnHover
);
const { t } = useTranslation(); const { t } = useTranslation();
const { assumedPrivilegeDetails } = useProjectPermission(); const { assumedPrivilegeDetails } = useProjectPermission();
const minSidebarWidth =
sidebarStyle === SidebarStyle.Expanded ? MAX_SIDEBAR_SIZE : MIN_SIDEBAR_SIZE;
const maxSidebarWidth =
sidebarStyle === SidebarStyle.Collapsed ? MIN_SIDEBAR_SIZE : MAX_SIDEBAR_SIZE;
const currentProductType = getCurrentProductFromUrl(location.pathname); const currentProductType = getCurrentProductFromUrl(location.pathname);
const isSecretManager = currentProductType === ProjectType.SecretManager;
const isPki = currentProductType === ProjectType.CertificateManager;
const isKms = currentProductType === ProjectType.KMS;
const isSsh = currentProductType === ProjectType.SSH;
const isSecretScanning = currentProductType === ProjectType.SecretScanning;
return ( return (
<> <>
@@ -66,250 +51,6 @@ export const ProjectLayout = () => {
}} }}
> >
<div className="flex flex-grow flex-col overflow-y-auto overflow-x-hidden md:flex-row"> <div className="flex flex-grow flex-col overflow-y-auto overflow-x-hidden md:flex-row">
<motion.div
key="menu-project-items"
initial={{ x: -150 }}
animate={{ x: 0 }}
exit={{ x: -150 }}
transition={{ duration: 0.2 }}
style={{ width: minSidebarWidth, height: "calc(100vh - 3rem)" }}
whileHover={{
width: maxSidebarWidth
}}
className={twMerge(
"dark group z-10 w-full overflow-hidden border-r border-mineshaft-600 bg-gradient-to-tr from-mineshaft-700 via-mineshaft-800 to-mineshaft-900 md:w-60",
!(sidebarStyle === SidebarStyle.Expanded) && "absolute bottom-0 left-0"
)}
>
<nav className="items-between flex h-full flex-col justify-between">
<Menu>
<ShouldWrap
wrapper={Tooltip}
isWrapped={sidebarStyle === SidebarStyle.Collapsed}
content="Secret Manager"
position="right"
>
<Link
to="/projects/$projectId/secret-manager/overview"
params={{ projectId: currentWorkspace.id }}
>
<MenuItem
className="relative flex items-center gap-2 overflow-hidden rounded-none"
isSelected={isSecretManager}
leftIcon={<Lottie className="inline-block h-6 w-6 shrink-0" icon="vault" />}
>
{isSecretManager && (
<div className="absolute left-0 top-0 h-full w-0.5 bg-primary" />
)}
Secret Manager
</MenuItem>
</Link>
</ShouldWrap>
<ShouldWrap
wrapper={Tooltip}
isWrapped={sidebarStyle === SidebarStyle.Collapsed}
content="PKI Manager"
position="right"
>
<Link
to="/projects/$projectId/cert-manager/subscribers"
params={{ projectId: currentWorkspace.id }}
>
<MenuItem
className="relative flex items-center gap-2 overflow-hidden rounded-none"
isSelected={isPki}
leftIcon={<Lottie className="inline-block h-6 w-6 shrink-0" icon="note" />}
>
{isPki && <div className="absolute left-0 top-0 h-full w-0.5 bg-primary" />}
PKI Manager
</MenuItem>
</Link>
</ShouldWrap>
<ShouldWrap
wrapper={Tooltip}
isWrapped={sidebarStyle === SidebarStyle.Collapsed}
content="KMS"
position="right"
>
<Link
to="/projects/$projectId/kms/overview"
params={{ projectId: currentWorkspace.id }}
>
<MenuItem
className="relative flex items-center gap-2 overflow-hidden rounded-none"
isSelected={isKms}
leftIcon={<Lottie className="inline-block h-6 w-6 shrink-0" icon="unlock" />}
>
{isKms && <div className="absolute left-0 top-0 h-full w-0.5 bg-primary" />}
KMS
</MenuItem>
</Link>
</ShouldWrap>
<ShouldWrap
wrapper={Tooltip}
isWrapped={sidebarStyle === SidebarStyle.Collapsed}
content="SSH"
position="right"
>
<Link
to="/projects/$projectId/ssh/overview"
params={{ projectId: currentWorkspace.id }}
>
<MenuItem
className="relative flex items-center gap-2 overflow-hidden rounded-none"
isSelected={isSsh}
leftIcon={
<Lottie className="inline-block h-6 w-6 shrink-0" icon="terminal" />
}
>
{isSsh && <div className="absolute left-0 top-0 h-full w-0.5 bg-primary" />}
SSH
</MenuItem>
</Link>
</ShouldWrap>
<ShouldWrap
wrapper={Tooltip}
isWrapped={sidebarStyle === SidebarStyle.Collapsed}
content="Secret Scanning"
position="right"
>
<Link
to="/projects/$projectId/secret-scanning/data-sources"
params={{ projectId: currentWorkspace.id }}
>
<MenuItem
className="relative flex items-center gap-2 overflow-hidden rounded-none"
isSelected={isSecretScanning}
leftIcon={
<Lottie className="inline-block h-6 w-6 shrink-0" icon="secret-scan" />
}
>
{isSecretScanning && (
<div className="absolute left-0 top-0 h-full w-0.5 bg-primary" />
)}
Secret Scanning
</MenuItem>
</Link>
</ShouldWrap>
</Menu>
<Divider />
<Menu>
<ShouldWrap
wrapper={Tooltip}
isWrapped={sidebarStyle === SidebarStyle.Collapsed}
content="Access Control"
position="right"
>
<Link
to="/projects/$projectId/access-management"
params={{ projectId: currentWorkspace.id }}
>
{({ isActive }) => (
<MenuItem
className="relative flex items-center gap-2 overflow-hidden rounded-none"
isSelected={isActive}
leftIcon={
<Lottie className="inline-block h-6 w-6 shrink-0" icon="groups" />
}
>
{isActive && (
<div className="absolute left-0 top-0 h-full w-0.5 bg-primary" />
)}
Access Control
</MenuItem>
)}
</Link>
</ShouldWrap>
<ShouldWrap
wrapper={Tooltip}
isWrapped={sidebarStyle === SidebarStyle.Collapsed}
content="Project Settings"
position="right"
>
<Link
to="/projects/$projectId/settings"
params={{ projectId: currentWorkspace.id }}
>
{({ isActive }) => (
<MenuItem
className="relative flex items-center gap-2 overflow-hidden rounded-none"
isSelected={isActive}
leftIcon={
<Lottie className="inline-block h-6 w-6 shrink-0" icon="settings-cog" />
}
>
{isActive && (
<div className="absolute left-0 top-0 h-full w-0.5 bg-primary" />
)}
Project Settings
</MenuItem>
)}
</Link>
</ShouldWrap>
</Menu>
<div className="flex-grow" />
<Menu>
<DropdownMenu>
<ShouldWrap
wrapper={Tooltip}
isWrapped={sidebarStyle === SidebarStyle.Collapsed}
content="Sidebar Control"
position="right"
>
<DropdownMenuTrigger className="w-full">
<MenuItem
className="relative flex items-center gap-2 overflow-hidden text-sm text-mineshaft-400 hover:text-mineshaft-300"
leftIcon={
<FontAwesomeIcon
className="mx-1 inline-block shrink-0"
icon={faWindowMaximize}
flip="vertical"
/>
}
>
Sidebar Control
</MenuItem>
</DropdownMenuTrigger>
</ShouldWrap>
<DropdownMenuContent>
<DropdownMenuItem
iconPos="right"
icon={
sidebarStyle === SidebarStyle.Expanded && (
<FontAwesomeIcon icon={faDotCircle} size="sm" />
)
}
onClick={() => setSidebarStyle(SidebarStyle.Expanded)}
>
Expanded
</DropdownMenuItem>
<DropdownMenuItem
iconPos="right"
icon={
sidebarStyle === SidebarStyle.Collapsed && (
<FontAwesomeIcon icon={faDotCircle} size="sm" />
)
}
onClick={() => setSidebarStyle(SidebarStyle.Collapsed)}
>
Collapsed
</DropdownMenuItem>
<DropdownMenuItem
iconPos="right"
icon={
sidebarStyle === SidebarStyle.ExpandOnHover && (
<FontAwesomeIcon icon={faDotCircle} size="sm" />
)
}
onClick={() => setSidebarStyle(SidebarStyle.ExpandOnHover)}
>
Expand on hover
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
</Menu>
</nav>
</motion.div>
<div className="flex-1 overflow-y-auto overflow-x-hidden bg-bunker-800"> <div className="flex-1 overflow-y-auto overflow-x-hidden bg-bunker-800">
{assumedPrivilegeDetails && <AssumePrivilegeModeBanner />} {assumedPrivilegeDetails && <AssumePrivilegeModeBanner />}
<Outlet /> <Outlet />
@@ -31,14 +31,13 @@ import {
useSubscription, useSubscription,
useWorkspace useWorkspace
} from "@app/context"; } from "@app/context";
import { getCurrentProductFromUrl, getProjectHomePage } from "@app/helpers/project"; import { getProjectHomePage } from "@app/helpers/project";
import { usePopUp } from "@app/hooks"; import { usePopUp } from "@app/hooks";
import { useGetUserWorkspaces } from "@app/hooks/api"; import { useGetUserWorkspaces } from "@app/hooks/api";
import { useUpdateUserProjectFavorites } from "@app/hooks/api/users/mutation"; import { useUpdateUserProjectFavorites } from "@app/hooks/api/users/mutation";
import { useGetUserProjectFavorites } from "@app/hooks/api/users/queries"; import { useGetUserProjectFavorites } from "@app/hooks/api/users/queries";
import { Workspace } from "@app/hooks/api/workspace/types"; import { Workspace } from "@app/hooks/api/workspace/types";
// TODO(pta): add search to project select
export const ProjectSelect = () => { export const ProjectSelect = () => {
const [searchProject, setSearchProject] = useState(""); const [searchProject, setSearchProject] = useState("");
const { currentWorkspace } = useWorkspace(); const { currentWorkspace } = useWorkspace();
@@ -102,9 +101,7 @@ export const ProjectSelect = () => {
<div className="-mr-2 flex w-full items-center gap-1"> <div className="-mr-2 flex w-full items-center gap-1">
<DropdownMenu modal={false}> <DropdownMenu modal={false}>
<Link <Link
to={getProjectHomePage( to={getProjectHomePage(currentWorkspace.type)}
getCurrentProductFromUrl(window.location.href) || currentWorkspace.defaultProduct
)}
params={{ params={{
projectId: currentWorkspace.id projectId: currentWorkspace.id
}} }}
@@ -161,7 +158,7 @@ export const ProjectSelect = () => {
// to reproduce change this back to router.push and switch between two projects with different env count // to reproduce change this back to router.push and switch between two projects with different env count
// look into this on dashboard revamp // look into this on dashboard revamp
const url = linkOptions({ const url = linkOptions({
to: getProjectHomePage(workspace.defaultProduct), to: getProjectHomePage(workspace.type),
params: { params: {
projectId: workspace.id projectId: workspace.id
} }
@@ -1,10 +1,18 @@
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { faMobile } from "@fortawesome/free-solid-svg-icons"; import {
faArrowsSpin,
faCheckToSlot,
faCog,
faMobile,
faPuzzlePiece,
faUsers,
faVault
} from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { Link, Outlet } from "@tanstack/react-router"; import { Link, Outlet } from "@tanstack/react-router";
import { motion } from "framer-motion"; import { motion } from "framer-motion";
import { Badge, Menu, MenuItem } from "@app/components/v2"; import { Badge, Lottie, Menu, MenuGroup, MenuItem } from "@app/components/v2";
import { useWorkspace } from "@app/context"; import { useWorkspace } from "@app/context";
import { import {
useGetAccessRequestsCount, useGetAccessRequestsCount,
@@ -50,68 +58,128 @@ export const SecretManagerLayout = () => {
className="dark w-full border-r border-mineshaft-600 bg-gradient-to-tr from-mineshaft-700 via-mineshaft-800 to-mineshaft-900 md:w-60" className="dark w-full border-r border-mineshaft-600 bg-gradient-to-tr from-mineshaft-700 via-mineshaft-800 to-mineshaft-900 md:w-60"
> >
<nav className="items-between flex h-full flex-col overflow-y-auto dark:[color-scheme:dark]"> <nav className="items-between flex h-full flex-col overflow-y-auto dark:[color-scheme:dark]">
<div className="border-b border-mineshaft-600 px-4 py-3.5 text-lg text-white"> <div className="flex items-center gap-3 border-b border-mineshaft-600 px-4 py-3.5 text-lg text-white">
<Lottie className="inline-block h-5 w-5 shrink-0" icon="vault" />
Secrets Manager Secrets Manager
</div> </div>
<div className="flex-1"> <div className="flex-1">
<Menu> <Menu>
<Link <MenuGroup title="Resources">
to="/projects/$projectId/secret-manager/overview"
params={{
projectId: currentWorkspace.id
}}
>
{({ isActive }) => (
<MenuItem isSelected={isActive}>{t("nav.menu.secrets")}</MenuItem>
)}
</Link>
<Link
to="/projects/$projectId/secret-manager/integrations"
params={{
projectId: currentWorkspace.id
}}
>
{({ isActive }) => (
<MenuItem isSelected={isActive}>{t("nav.menu.integrations")}</MenuItem>
)}
</Link>
{Boolean(secretRotations?.length) && (
<Link <Link
to="/projects/$projectId/secret-manager/secret-rotation" to="/projects/secret-management/$projectId/overview"
params={{ params={{
projectId: currentWorkspace.id projectId: currentWorkspace.id
}} }}
> >
{({ isActive }) => <MenuItem isSelected={isActive}>Secret Rotation</MenuItem>} {({ isActive }) => (
<MenuItem isSelected={isActive}>
<div className="mx-1 flex gap-2">
<div className="w-6">
<FontAwesomeIcon icon={faVault} />
</div>
Secrets
</div>
</MenuItem>
)}
</Link> </Link>
)} <Link
<Link to="/projects/secret-management/$projectId/integrations"
to="/projects/$projectId/secret-manager/approval" params={{
params={{ projectId: currentWorkspace.id
projectId: currentWorkspace.id }}
}} >
> {({ isActive }) => (
{({ isActive }) => ( <MenuItem isSelected={isActive}>
<MenuItem isSelected={isActive}> <div className="mx-1 flex gap-2">
Approvals <div className="w-6">
{Boolean( <FontAwesomeIcon icon={faPuzzlePiece} />
secretApprovalReqCount?.open || accessApprovalRequestCount?.pendingCount </div>
) && ( Integrations
<Badge variant="primary" className="ml-1.5"> </div>
{pendingRequestsCount} </MenuItem>
</Badge> )}
</Link>
{Boolean(secretRotations?.length) && (
<Link
to="/projects/secret-management/$projectId/secret-rotation"
params={{
projectId: currentWorkspace.id
}}
>
{({ isActive }) => (
<MenuItem isSelected={isActive}>
<div className="mx-1 flex gap-2">
<div className="w-6">
<FontAwesomeIcon icon={faArrowsSpin} />
</div>
Secret Rotations
</div>
</MenuItem>
)} )}
</MenuItem> </Link>
)} )}
</Link> <Link
<Link to="/projects/secret-management/$projectId/approval"
to="/projects/$projectId/secret-manager/settings" params={{
params={{ projectId: currentWorkspace.id
projectId: currentWorkspace.id }}
}} >
> {({ isActive }) => (
{({ isActive }) => <MenuItem isSelected={isActive}>Settings</MenuItem>} <MenuItem isSelected={isActive}>
</Link> <div className="mx-1 flex gap-2">
<div className="w-6">
<FontAwesomeIcon icon={faCheckToSlot} />
</div>
Approvals
{Boolean(
secretApprovalReqCount?.open ||
accessApprovalRequestCount?.pendingCount
) && (
<Badge variant="primary" className="ml-1.5">
{pendingRequestsCount}
</Badge>
)}
</div>
</MenuItem>
)}
</Link>
</MenuGroup>
<MenuGroup title="Others">
<Link
to="/projects/secret-management/$projectId/access-management"
params={{
projectId: currentWorkspace.id
}}
>
{({ isActive }) => (
<MenuItem isSelected={isActive}>
<div className="mx-1 flex gap-2">
<div className="w-6">
<FontAwesomeIcon icon={faUsers} />
</div>
Access Management
</div>
</MenuItem>
)}
</Link>
<Link
to="/projects/secret-management/$projectId/settings"
params={{
projectId: currentWorkspace.id
}}
>
{({ isActive }) => (
<MenuItem isSelected={isActive}>
<div className="mx-1 flex gap-2">
<div className="w-6">
<FontAwesomeIcon icon={faCog} />
</div>
Settings
</div>
</MenuItem>
)}
</Link>
</MenuGroup>
</Menu> </Menu>
</div> </div>
</nav> </nav>
@@ -1,7 +1,9 @@
import { faCog, faUsers } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { Link, Outlet } from "@tanstack/react-router"; import { Link, Outlet } from "@tanstack/react-router";
import { motion } from "framer-motion"; import { motion } from "framer-motion";
import { Menu, MenuItem } from "@app/components/v2"; import { Menu, MenuGroup, MenuItem } from "@app/components/v2";
import { useWorkspace } from "@app/context"; import { useWorkspace } from "@app/context";
export const SecretScanningLayout = () => { export const SecretScanningLayout = () => {
@@ -24,30 +26,60 @@ export const SecretScanningLayout = () => {
</div> </div>
<div className="flex-1"> <div className="flex-1">
<Menu> <Menu>
<Link <MenuGroup title="Resources">
to="/projects/$projectId/secret-scanning/data-sources" <Link
params={{ to="/projects/secret-scanning/$projectId/data-sources"
projectId: currentWorkspace.id params={{
}} projectId: currentWorkspace.id
> }}
{({ isActive }) => <MenuItem isSelected={isActive}> Data Sources</MenuItem>} >
</Link> {({ isActive }) => <MenuItem isSelected={isActive}> Data Sources</MenuItem>}
<Link </Link>
to="/projects/$projectId/secret-scanning/findings" <Link
params={{ to="/projects/secret-scanning/$projectId/findings"
projectId: currentWorkspace.id params={{
}} projectId: currentWorkspace.id
> }}
{({ isActive }) => <MenuItem isSelected={isActive}>Findings</MenuItem>} >
</Link> {({ isActive }) => <MenuItem isSelected={isActive}>Findings</MenuItem>}
<Link </Link>
to="/projects/$projectId/secret-scanning/settings" </MenuGroup>
params={{ <MenuGroup title="Others">
projectId: currentWorkspace.id <Link
}} to="/projects/secret-scanning/$projectId/access-management"
> params={{
{({ isActive }) => <MenuItem isSelected={isActive}>Settings</MenuItem>} projectId: currentWorkspace.id
</Link> }}
>
{({ isActive }) => (
<MenuItem isSelected={isActive}>
<div className="mx-1 flex gap-2">
<div className="w-6">
<FontAwesomeIcon icon={faUsers} />
</div>
Access Management
</div>
</MenuItem>
)}
</Link>
<Link
to="/projects/secret-management/$projectId/settings"
params={{
projectId: currentWorkspace.id
}}
>
{({ isActive }) => (
<MenuItem isSelected={isActive}>
<div className="mx-1 flex gap-2">
<div className="w-6">
<FontAwesomeIcon icon={faCog} />
</div>
Settings
</div>
</MenuItem>
)}
</Link>
</MenuGroup>
</Menu> </Menu>
</div> </div>
</nav> </nav>
+69 -36
View File
@@ -2,8 +2,10 @@ import { Link, Outlet } from "@tanstack/react-router";
import { motion } from "framer-motion"; import { motion } from "framer-motion";
import { ProjectPermissionCan } from "@app/components/permissions"; import { ProjectPermissionCan } from "@app/components/permissions";
import { Menu, MenuItem } from "@app/components/v2"; import { Menu, MenuGroup, MenuItem } from "@app/components/v2";
import { ProjectPermissionActions, ProjectPermissionSub, useWorkspace } from "@app/context"; import { ProjectPermissionActions, ProjectPermissionSub, useWorkspace } from "@app/context";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCog, faUsers } from "@fortawesome/free-solid-svg-icons";
export const SshLayout = () => { export const SshLayout = () => {
const { currentWorkspace } = useWorkspace(); const { currentWorkspace } = useWorkspace();
@@ -23,41 +25,72 @@ export const SshLayout = () => {
<div className="border-b border-mineshaft-600 px-4 py-3.5 text-lg text-white">SSH</div> <div className="border-b border-mineshaft-600 px-4 py-3.5 text-lg text-white">SSH</div>
<div className="flex-1"> <div className="flex-1">
<Menu> <Menu>
<Link <MenuGroup title="Resources">
to="/projects/$projectId/ssh/overview" <Link
params={{ to="/projects/ssh/$projectId/overview"
projectId: currentWorkspace.id params={{
}} projectId: currentWorkspace.id
> }}
{({ isActive }) => <MenuItem isSelected={isActive}>Hosts</MenuItem>} >
</Link> {({ isActive }) => <MenuItem isSelected={isActive}>Hosts</MenuItem>}
<ProjectPermissionCan </Link>
I={ProjectPermissionActions.Read} <ProjectPermissionCan
a={ProjectPermissionSub.SshCertificateAuthorities} I={ProjectPermissionActions.Read}
> a={ProjectPermissionSub.SshCertificateAuthorities}
{(isAllowed) => >
isAllowed && ( {(isAllowed) =>
<Link isAllowed && (
to="/projects/$projectId/ssh/cas" <Link
params={{ to="/projects/ssh/$projectId/cas"
projectId: currentWorkspace.id params={{
}} projectId: currentWorkspace.id
> }}
{({ isActive }) => ( >
<MenuItem isSelected={isActive}>Certificate Authorities</MenuItem> {({ isActive }) => (
)} <MenuItem isSelected={isActive}>Certificate Authorities</MenuItem>
</Link> )}
) </Link>
} )
</ProjectPermissionCan> }
<Link </ProjectPermissionCan>
to="/projects/$projectId/ssh/settings" </MenuGroup>
params={{
projectId: currentWorkspace.id <MenuGroup title="Others">
}} <Link
> to="/projects/ssh/$projectId/access-management"
{({ isActive }) => <MenuItem isSelected={isActive}>Settings</MenuItem>} params={{
</Link> projectId: currentWorkspace.id
}}
>
{({ isActive }) => (
<MenuItem isSelected={isActive}>
<div className="mx-1 flex gap-2">
<div className="w-6">
<FontAwesomeIcon icon={faUsers} />
</div>
Access Management
</div>
</MenuItem>
)}
</Link>
<Link
to="/projects/ssh/$projectId/settings"
params={{
projectId: currentWorkspace.id
}}
>
{({ isActive }) => (
<MenuItem isSelected={isActive}>
<div className="mx-1 flex gap-2">
<div className="w-6">
<FontAwesomeIcon icon={faCog} />
</div>
Settings
</div>
</MenuItem>
)}
</Link>
</MenuGroup>
</Menu> </Menu>
</div> </div>
</nav> </nav>
@@ -82,7 +82,7 @@ export const PkiCollectionModal = ({ popUp, handlePopUpToggle }: Props) => {
}); });
navigate({ navigate({
to: "/projects/$projectId/cert-manager/pki-collections/$collectionId", to: "/projects/cert-management/$projectId/pki-collections/$collectionId",
params: { params: {
projectId, projectId,
collectionId collectionId
@@ -21,7 +21,6 @@ import {
} from "@app/components/v2"; } from "@app/components/v2";
import { ProjectPermissionActions, ProjectPermissionSub, useWorkspace } from "@app/context"; import { ProjectPermissionActions, ProjectPermissionSub, useWorkspace } from "@app/context";
import { useListWorkspacePkiCollections } from "@app/hooks/api"; import { useListWorkspacePkiCollections } from "@app/hooks/api";
import { ProjectType } from "@app/hooks/api/workspace/types";
import { UsePopUpState } from "@app/hooks/usePopUp"; import { UsePopUpState } from "@app/hooks/usePopUp";
type Props = { type Props = {
@@ -61,7 +60,7 @@ export const PkiCollectionTable = ({ handlePopUpOpen }: Props) => {
key={`pki-collection-${pkiCollection.id}`} key={`pki-collection-${pkiCollection.id}`}
onClick={() => onClick={() =>
navigate({ navigate({
to: `/projects/$projectId/${ProjectType.CertificateManager}/pki-collections/$collectionId` as const, to: "/projects/cert-management/$projectId/pki-collections/$collectionId",
params: { params: {
projectId, projectId,
collectionId: pkiCollection.id collectionId: pkiCollection.id
@@ -3,7 +3,7 @@ import { createFileRoute } from "@tanstack/react-router";
import { AlertingPage } from "./AlertingPage"; import { AlertingPage } from "./AlertingPage";
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/alerting" "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/alerting"
)({ )({
component: AlertingPage, component: AlertingPage,
beforeLoad: ({ context }) => { beforeLoad: ({ context }) => {
@@ -18,7 +18,6 @@ import { ROUTE_PATHS } from "@app/const/routes";
import { ProjectPermissionActions, ProjectPermissionSub, useWorkspace } from "@app/context"; import { ProjectPermissionActions, ProjectPermissionSub, useWorkspace } from "@app/context";
import { CaType, useDeleteCa, useGetCa } from "@app/hooks/api"; import { CaType, useDeleteCa, useGetCa } from "@app/hooks/api";
import { TInternalCertificateAuthority } from "@app/hooks/api/ca/types"; import { TInternalCertificateAuthority } from "@app/hooks/api/ca/types";
import { ProjectType } from "@app/hooks/api/workspace/types";
import { usePopUp } from "@app/hooks/usePopUp"; import { usePopUp } from "@app/hooks/usePopUp";
import { CaInstallCertModal } from "../CertificateAuthoritiesPage/components/CaInstallCertModal"; import { CaInstallCertModal } from "../CertificateAuthoritiesPage/components/CaInstallCertModal";
@@ -71,7 +70,7 @@ const Page = () => {
handlePopUpClose("deleteCa"); handlePopUpClose("deleteCa");
navigate({ navigate({
to: `/projects/$projectId/${ProjectType.CertificateManager}/certificate-authorities` as const, to: "/projects/cert-management/$projectId/certificate-authorities",
params: { params: {
projectId projectId
} }
@@ -3,7 +3,7 @@ import { createFileRoute, linkOptions } from "@tanstack/react-router";
import { CertAuthDetailsByIDPage } from "./CertAuthDetailsByIDPage"; import { CertAuthDetailsByIDPage } from "./CertAuthDetailsByIDPage";
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/ca/$caName" "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/ca/$caName"
)({ )({
component: CertAuthDetailsByIDPage, component: CertAuthDetailsByIDPage,
beforeLoad: ({ context, params }) => { beforeLoad: ({ context, params }) => {
@@ -13,7 +13,7 @@ export const Route = createFileRoute(
{ {
label: "Certificate Authorities", label: "Certificate Authorities",
link: linkOptions({ link: linkOptions({
to: "/projects/$projectId/cert-manager/certificate-authorities", to: "/projects/cert-management/$projectId/certificate-authorities",
params: { params: {
projectId: params.projectId projectId: params.projectId
} }
@@ -30,7 +30,6 @@ import {
getCaStatusBadgeVariant getCaStatusBadgeVariant
} from "@app/hooks/api/ca/constants"; } from "@app/hooks/api/ca/constants";
import { TInternalCertificateAuthority } from "@app/hooks/api/ca/types"; import { TInternalCertificateAuthority } from "@app/hooks/api/ca/types";
import { ProjectType } from "@app/hooks/api/workspace/types";
import { UsePopUpState } from "@app/hooks/usePopUp"; import { UsePopUpState } from "@app/hooks/usePopUp";
type Props = { type Props = {
@@ -79,7 +78,7 @@ export const CaTable = ({ handlePopUpOpen }: Props) => {
key={`ca-${ca.id}`} key={`ca-${ca.id}`}
onClick={() => onClick={() =>
navigate({ navigate({
to: `/projects/$projectId/${ProjectType.CertificateManager}/ca/$caName` as const, to: "/projects/cert-management/$projectId/ca/$caName",
params: { params: {
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
caName: ca.name caName: ca.name
@@ -1,9 +1,9 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from '@tanstack/react-router'
import { CertificateAuthoritiesPage } from "./CertificateAuthoritiesPage"; import { CertificateAuthoritiesPage } from './CertificateAuthoritiesPage'
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/certificate-authorities" '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-authorities',
)({ )({
component: CertificateAuthoritiesPage, component: CertificateAuthoritiesPage,
beforeLoad: ({ context }) => { beforeLoad: ({ context }) => {
@@ -11,9 +11,9 @@ export const Route = createFileRoute(
breadcrumbs: [ breadcrumbs: [
...context.breadcrumbs, ...context.breadcrumbs,
{ {
label: "Certificate Authorities" label: 'Certificate Authorities',
} },
] ],
}; }
} },
}); })
@@ -1,9 +1,9 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from '@tanstack/react-router'
import { CertificatesPage } from "./CertificatesPage"; import { CertificatesPage } from './CertificatesPage'
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/certificates" '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificates',
)({ )({
component: CertificatesPage, component: CertificatesPage,
beforeLoad: ({ context }) => { beforeLoad: ({ context }) => {
@@ -11,9 +11,9 @@ export const Route = createFileRoute(
breadcrumbs: [ breadcrumbs: [
...context.breadcrumbs, ...context.breadcrumbs,
{ {
label: "Certificates" label: 'Certificates',
} },
] ],
}; }
} },
}); })
@@ -19,7 +19,6 @@ import { ROUTE_PATHS } from "@app/const/routes";
import { ProjectPermissionActions, ProjectPermissionSub, useWorkspace } from "@app/context"; import { ProjectPermissionActions, ProjectPermissionSub, useWorkspace } from "@app/context";
import { useDeletePkiCollection, useGetPkiCollectionById } from "@app/hooks/api"; import { useDeletePkiCollection, useGetPkiCollectionById } from "@app/hooks/api";
import { PkiItemType } from "@app/hooks/api/pkiCollections/constants"; import { PkiItemType } from "@app/hooks/api/pkiCollections/constants";
import { ProjectType } from "@app/hooks/api/workspace/types";
import { usePopUp } from "@app/hooks/usePopUp"; import { usePopUp } from "@app/hooks/usePopUp";
import { PkiCollectionModal } from "../AlertingPage/components/PkiCollectionModal"; import { PkiCollectionModal } from "../AlertingPage/components/PkiCollectionModal";
@@ -57,7 +56,7 @@ export const PkiCollectionPage = () => {
}); });
handlePopUpClose("deletePkiCollection"); handlePopUpClose("deletePkiCollection");
navigate({ navigate({
to: `/projects/$projectId/${ProjectType.CertificateManager}/certificates` as const, to: "/projects/cert-management/$projectId/certificates",
params: { params: {
projectId projectId
} }
@@ -3,7 +3,7 @@ import { createFileRoute, linkOptions } from "@tanstack/react-router";
import { PkiCollectionDetailsByIDPage } from "./PkiCollectionDetailsByIDPage"; import { PkiCollectionDetailsByIDPage } from "./PkiCollectionDetailsByIDPage";
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/pki-collections/$collectionId" "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/pki-collections/$collectionId"
)({ )({
component: PkiCollectionDetailsByIDPage, component: PkiCollectionDetailsByIDPage,
beforeLoad: ({ context, params }) => { beforeLoad: ({ context, params }) => {
@@ -13,7 +13,7 @@ export const Route = createFileRoute(
{ {
label: "Certificate Collections", label: "Certificate Collections",
link: linkOptions({ link: linkOptions({
to: "/projects/$projectId/cert-manager/certificates", to: "/projects/cert-management/$projectId/certificates",
params: { params: {
projectId: params.projectId projectId: params.projectId
} }
@@ -22,7 +22,6 @@ import {
useWorkspace useWorkspace
} from "@app/context"; } from "@app/context";
import { useDeletePkiSubscriber, useGetPkiSubscriber } from "@app/hooks/api"; import { useDeletePkiSubscriber, useGetPkiSubscriber } from "@app/hooks/api";
import { ProjectType } from "@app/hooks/api/workspace/types";
import { usePopUp } from "@app/hooks/usePopUp"; import { usePopUp } from "@app/hooks/usePopUp";
import { PkiSubscriberModal } from "../PkiSubscribersPage/components/PkiSubscriberModal"; import { PkiSubscriberModal } from "../PkiSubscribersPage/components/PkiSubscriberModal";
@@ -61,7 +60,7 @@ const Page = () => {
handlePopUpClose("deletePkiSubscriber"); handlePopUpClose("deletePkiSubscriber");
navigate({ navigate({
to: `/projects/$projectId/${ProjectType.CertificateManager}/subscribers` as const, to: "/projects/cert-management/$projectId/subscribers",
params: { params: {
projectId projectId
} }
@@ -3,7 +3,7 @@ import { createFileRoute, linkOptions } from "@tanstack/react-router";
import { PkiSubscriberDetailsByIDPage } from "./PkiSubscriberDetailsByIDPage"; import { PkiSubscriberDetailsByIDPage } from "./PkiSubscriberDetailsByIDPage";
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/subscribers/$subscriberName" "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/$subscriberName"
)({ )({
component: PkiSubscriberDetailsByIDPage, component: PkiSubscriberDetailsByIDPage,
beforeLoad: ({ context, params }) => { beforeLoad: ({ context, params }) => {
@@ -13,7 +13,7 @@ export const Route = createFileRoute(
{ {
label: "Subscribers", label: "Subscribers",
link: linkOptions({ link: linkOptions({
to: "/projects/$projectId/cert-manager/subscribers", to: "/projects/cert-management/$projectId/subscribers",
params: { params: {
projectId: params.projectId projectId: params.projectId
} }
@@ -38,7 +38,6 @@ import {
PkiSubscriberStatus, PkiSubscriberStatus,
pkiSubscriberStatusToNameMap pkiSubscriberStatusToNameMap
} from "@app/hooks/api/pkiSubscriber/constants"; } from "@app/hooks/api/pkiSubscriber/constants";
import { ProjectType } from "@app/hooks/api/workspace/types";
import { UsePopUpState } from "@app/hooks/usePopUp"; import { UsePopUpState } from "@app/hooks/usePopUp";
type Props = { type Props = {
@@ -76,7 +75,7 @@ export const PkiSubscribersTable = ({ handlePopUpOpen }: Props) => {
key={`pki-subscriber-${subscriber.id}`} key={`pki-subscriber-${subscriber.id}`}
onClick={() => onClick={() =>
navigate({ navigate({
to: `/projects/$projectId/${ProjectType.CertificateManager}/subscribers/$subscriberName` as const, to: "/projects/cert-management/$projectId/subscribers/$subscriberName",
params: { params: {
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
subscriberName: subscriber.name subscriberName: subscriber.name
@@ -1,9 +1,9 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from '@tanstack/react-router'
import { PkiSubscribersPage } from "./PkiSubscribersPage"; import { PkiSubscribersPage } from './PkiSubscribersPage'
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/subscribers/" '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/subscribers/',
)({ )({
component: PkiSubscribersPage, component: PkiSubscribersPage,
beforeLoad: ({ context }) => { beforeLoad: ({ context }) => {
@@ -11,9 +11,9 @@ export const Route = createFileRoute(
breadcrumbs: [ breadcrumbs: [
...context.breadcrumbs, ...context.breadcrumbs,
{ {
label: "Subscribers" label: 'Subscribers',
} },
] ],
}; }
} },
}); })
@@ -1,9 +1,9 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from '@tanstack/react-router'
import { PkiTemplateListPage } from "./PkiTemplateListPage"; import { PkiTemplateListPage } from './PkiTemplateListPage'
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/certificate-templates/" '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/certificate-templates/',
)({ )({
component: PkiTemplateListPage, component: PkiTemplateListPage,
beforeLoad: ({ context }) => { beforeLoad: ({ context }) => {
@@ -11,9 +11,9 @@ export const Route = createFileRoute(
breadcrumbs: [ breadcrumbs: [
...context.breadcrumbs, ...context.breadcrumbs,
{ {
label: "Certificate Templates" label: 'Certificate Templates',
} },
] ],
}; }
} },
}); })
@@ -1,9 +1,9 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from '@tanstack/react-router'
import { SettingsPage } from "./SettingsPage"; import { SettingsPage } from './SettingsPage'
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/settings" '/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/settings',
)({ )({
component: SettingsPage, component: SettingsPage,
beforeLoad: ({ context }) => { beforeLoad: ({ context }) => {
@@ -11,9 +11,9 @@ export const Route = createFileRoute(
breadcrumbs: [ breadcrumbs: [
...context.breadcrumbs, ...context.breadcrumbs,
{ {
label: "Settings" label: 'Settings',
} },
] ],
}; }
} },
}); })
+30 -2
View File
@@ -1,9 +1,37 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import { PkiManagerLayout } from "@app/layouts/PkiManagerLayout"; import { PkiManagerLayout } from "@app/layouts/PkiManagerLayout";
import { workspaceKeys } from "@app/hooks/api";
import { fetchWorkspaceById } from "@app/hooks/api/workspace/queries";
import { fetchUserProjectPermissions, roleQueryKeys } from "@app/hooks/api/roles/queries";
import { BreadcrumbTypes } from "@app/components/v2";
import { ProjectSelect } from "@app/layouts/ProjectLayout/components/ProjectSelect";
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout" "/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout"
)({ )({
component: PkiManagerLayout component: PkiManagerLayout,
beforeLoad: async ({ params, context }) => {
const project = await context.queryClient.ensureQueryData({
queryKey: workspaceKeys.getWorkspaceById(params.projectId),
queryFn: () => fetchWorkspaceById(params.projectId)
});
await context.queryClient.ensureQueryData({
queryKey: roleQueryKeys.getUserProjectPermissions({
workspaceId: params.projectId
}),
queryFn: () => fetchUserProjectPermissions({ workspaceId: params.projectId })
});
return {
project,
breadcrumbs: [
{
type: BreadcrumbTypes.Component,
component: ProjectSelect
}
]
};
}
}); });
+9 -9
View File
@@ -1,9 +1,9 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from '@tanstack/react-router'
import { KmipPage } from "./KmipPage"; import { KmipPage } from './KmipPage'
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/kms/_kms-layout/kmip" '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/kmip',
)({ )({
component: KmipPage, component: KmipPage,
beforeLoad: ({ context }) => { beforeLoad: ({ context }) => {
@@ -11,9 +11,9 @@ export const Route = createFileRoute(
breadcrumbs: [ breadcrumbs: [
...context.breadcrumbs, ...context.breadcrumbs,
{ {
label: "KMIP" label: 'KMIP',
} },
] ],
}; }
} },
}); })
@@ -1,9 +1,9 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from '@tanstack/react-router'
import { OverviewPage } from "./OverviewPage"; import { OverviewPage } from './OverviewPage'
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/kms/_kms-layout/overview" '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/overview',
)({ )({
component: OverviewPage, component: OverviewPage,
beforeLoad: ({ context }) => { beforeLoad: ({ context }) => {
@@ -11,9 +11,9 @@ export const Route = createFileRoute(
breadcrumbs: [ breadcrumbs: [
...context.breadcrumbs, ...context.breadcrumbs,
{ {
label: "Overview" label: 'Overview',
} },
] ],
}; }
} },
}); })
@@ -1,9 +1,9 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from '@tanstack/react-router'
import { SettingsPage } from "./SettingsPage"; import { SettingsPage } from './SettingsPage'
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/kms/_kms-layout/settings" '/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/settings',
)({ )({
component: SettingsPage, component: SettingsPage,
beforeLoad: ({ context }) => { beforeLoad: ({ context }) => {
@@ -11,9 +11,9 @@ export const Route = createFileRoute(
breadcrumbs: [ breadcrumbs: [
...context.breadcrumbs, ...context.breadcrumbs,
{ {
label: "Settings" label: 'Settings',
} },
] ],
}; }
} },
}); })
+30 -2
View File
@@ -1,9 +1,37 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import { BreadcrumbTypes } from "@app/components/v2";
import { workspaceKeys } from "@app/hooks/api";
import { fetchUserProjectPermissions, roleQueryKeys } from "@app/hooks/api/roles/queries";
import { fetchWorkspaceById } from "@app/hooks/api/workspace/queries";
import { KmsLayout } from "@app/layouts/KmsLayout"; import { KmsLayout } from "@app/layouts/KmsLayout";
import { ProjectSelect } from "@app/layouts/ProjectLayout/components/ProjectSelect";
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/kms/_kms-layout" "/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout"
)({ )({
component: KmsLayout component: KmsLayout,
beforeLoad: async ({ params, context }) => {
const project = await context.queryClient.ensureQueryData({
queryKey: workspaceKeys.getWorkspaceById(params.projectId),
queryFn: () => fetchWorkspaceById(params.projectId)
});
await context.queryClient.ensureQueryData({
queryKey: roleQueryKeys.getUserProjectPermissions({
workspaceId: params.projectId
}),
queryFn: () => fetchUserProjectPermissions({ workspaceId: params.projectId })
});
return {
project,
breadcrumbs: [
{
type: BreadcrumbTypes.Component,
component: ProjectSelect
}
]
};
}
}); });
@@ -105,7 +105,7 @@ export const OrgAdminProjects = withPermission(
<TBody> <TBody>
{isProjectsLoading && <TableSkeleton columns={4} innerKey="projects" />} {isProjectsLoading && <TableSkeleton columns={4} innerKey="projects" />}
{!isProjectsLoading && {!isProjectsLoading &&
projects?.map(({ name, slug, createdAt, id, defaultProduct }) => ( projects?.map(({ name, slug, createdAt, id, type }) => (
<Tr key={`project-${id}`} className="group w-full"> <Tr key={`project-${id}`} className="group w-full">
<Td>{name}</Td> <Td>{name}</Td>
<Td>{slug}</Td> <Td>{slug}</Td>
@@ -126,7 +126,7 @@ export const OrgAdminProjects = withPermission(
onClick={(e) => { onClick={(e) => {
e.stopPropagation(); e.stopPropagation();
e.preventDefault(); e.preventDefault();
handleAccessProject(defaultProduct, id); handleAccessProject(type, id);
}} }}
icon={<FontAwesomeIcon icon={faSignIn} />} icon={<FontAwesomeIcon icon={faSignIn} />}
disabled={ disabled={
@@ -300,10 +300,10 @@ export const LogsFilter = ({ presets, setFilter, filter }: Props) => {
onChange(e); onChange(e);
}} }}
placeholder="All projects" placeholder="All projects"
options={workspacesInOrg.map(({ name, id, defaultProduct }) => ({ options={workspacesInOrg.map(({ name, id, type }) => ({
name, name,
id, id,
type: defaultProduct type
}))} }))}
getOptionValue={(option) => option.id} getOptionValue={(option) => option.id}
getOptionLabel={(option) => option.name} getOptionLabel={(option) => option.name}
@@ -6,6 +6,8 @@ import { format } from "date-fns";
import { createNotification } from "@app/components/notifications"; import { createNotification } from "@app/components/notifications";
import { IconButton, Td, Tooltip, Tr } from "@app/components/v2"; import { IconButton, Td, Tooltip, Tr } from "@app/components/v2";
import { useWorkspace } from "@app/context";
import { getProjectBaseURL } from "@app/helpers/project";
import { formatProjectRoleName } from "@app/helpers/roles"; import { formatProjectRoleName } from "@app/helpers/roles";
import { useGetUserWorkspaces } from "@app/hooks/api"; import { useGetUserWorkspaces } from "@app/hooks/api";
import { IdentityMembership } from "@app/hooks/api/identities/types"; import { IdentityMembership } from "@app/hooks/api/identities/types";
@@ -32,6 +34,7 @@ export const IdentityProjectRow = ({
}: Props) => { }: Props) => {
const { data: workspaces } = useGetUserWorkspaces(); const { data: workspaces } = useGetUserWorkspaces();
const navigate = useNavigate(); const navigate = useNavigate();
const { currentWorkspace } = useWorkspace();
const isAccessible = useMemo(() => { const isAccessible = useMemo(() => {
const workspaceIds = new Map(); const workspaceIds = new Map();
@@ -50,7 +53,7 @@ export const IdentityProjectRow = ({
onClick={() => { onClick={() => {
if (isAccessible) { if (isAccessible) {
navigate({ navigate({
to: "/projects/$projectId/access-management", to: `${getProjectBaseURL(currentWorkspace.type)}/access-management` as const,
params: { params: {
projectId: project.id projectId: project.id
}, },
@@ -222,7 +222,7 @@ export const AllProjectView = ({
onKeyDown={(evt) => { onKeyDown={(evt) => {
if (evt.key === "Enter" && workspace.isMember) { if (evt.key === "Enter" && workspace.isMember) {
navigate({ navigate({
to: getProjectHomePage(workspace.defaultProduct), to: getProjectHomePage(workspace.type),
params: { params: {
projectId: workspace.id projectId: workspace.id
} }
@@ -232,7 +232,7 @@ export const AllProjectView = ({
onClick={() => { onClick={() => {
if (workspace.isMember) { if (workspace.isMember) {
navigate({ navigate({
to: getProjectHomePage(workspace.defaultProduct), to: getProjectHomePage(workspace.type),
params: { params: {
projectId: workspace.id projectId: workspace.id
} }
@@ -153,7 +153,7 @@ export const MyProjectView = ({
<div <div
onClick={() => { onClick={() => {
navigate({ navigate({
to: getProjectHomePage(workspace.defaultProduct), to: getProjectHomePage(workspace.type),
params: { params: {
projectId: workspace.id projectId: workspace.id
} }
@@ -215,7 +215,7 @@ export const MyProjectView = ({
<div <div
onClick={() => { onClick={() => {
navigate({ navigate({
to: getProjectHomePage(workspace.defaultProduct), to: getProjectHomePage(workspace.type),
params: { params: {
projectId: workspace.id projectId: workspace.id
} }
@@ -10,6 +10,8 @@ import { useGetUserWorkspaces } from "@app/hooks/api";
import { TWorkspaceUser } from "@app/hooks/api/types"; import { TWorkspaceUser } from "@app/hooks/api/types";
import { UsePopUpState } from "@app/hooks/usePopUp"; import { UsePopUpState } from "@app/hooks/usePopUp";
import { OrgAccessControlTabSections } from "@app/types/org"; import { OrgAccessControlTabSections } from "@app/types/org";
import { getProjectBaseURL } from "@app/helpers/project";
import { useWorkspace } from "@app/context";
type Props = { type Props = {
membership: TWorkspaceUser; membership: TWorkspaceUser;
@@ -25,6 +27,7 @@ export const UserProjectRow = ({
}: Props) => { }: Props) => {
const { data: workspaces = [] } = useGetUserWorkspaces(); const { data: workspaces = [] } = useGetUserWorkspaces();
const navigate = useNavigate(); const navigate = useNavigate();
const { currentWorkspace } = useWorkspace();
const isAccessible = useMemo(() => { const isAccessible = useMemo(() => {
const workspaceIds = new Map(); const workspaceIds = new Map();
@@ -43,7 +46,7 @@ export const UserProjectRow = ({
onClick={() => { onClick={() => {
if (isAccessible) { if (isAccessible) {
navigate({ navigate({
to: "/projects/$projectId/access-management", to: `${getProjectBaseURL(currentWorkspace.type)}/access-management` as const,
params: { params: {
projectId: project.id projectId: project.id
}, },
@@ -4,6 +4,7 @@ import { useNavigate, useSearch } from "@tanstack/react-router";
import { PageHeader, Tab, TabList, TabPanel, Tabs } from "@app/components/v2"; import { PageHeader, Tab, TabList, TabPanel, Tabs } from "@app/components/v2";
import { useWorkspace } from "@app/context"; import { useWorkspace } from "@app/context";
import { getProjectBaseURL } from "@app/helpers/project";
import { ProjectAccessControlTabs } from "@app/types/project"; import { ProjectAccessControlTabs } from "@app/types/project";
import { import {
@@ -24,7 +25,7 @@ const Page = () => {
const updateSelectedTab = (tab: string) => { const updateSelectedTab = (tab: string) => {
navigate({ navigate({
to: "/projects/$projectId/access-management", to: `${getProjectBaseURL(currentWorkspace.type)}/access-management` as const,
search: (prev) => ({ ...prev, selectedTab: tab }), search: (prev) => ({ ...prev, selectedTab: tab }),
params: { params: {
projectId: currentWorkspace.id projectId: currentWorkspace.id
@@ -44,6 +44,7 @@ import { OrderByDirection } from "@app/hooks/api/generic/types";
import { UsePopUpState } from "@app/hooks/usePopUp"; import { UsePopUpState } from "@app/hooks/usePopUp";
import { GroupRoles } from "./GroupRoles"; import { GroupRoles } from "./GroupRoles";
import { getProjectBaseURL } from "@app/helpers/project";
type Props = { type Props = {
handlePopUpOpen: ( handlePopUpOpen: (
@@ -158,7 +159,7 @@ export const GroupTable = ({ handlePopUpOpen }: Props) => {
onKeyDown={(evt) => { onKeyDown={(evt) => {
if (evt.key === "Enter") { if (evt.key === "Enter") {
navigate({ navigate({
to: "/projects/$projectId/groups/$groupId", to: `${getProjectBaseURL(currentWorkspace.type)}/groups/$groupId` as const,
params: { params: {
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
groupId: id groupId: id
@@ -168,7 +169,7 @@ export const GroupTable = ({ handlePopUpOpen }: Props) => {
}} }}
onClick={() => onClick={() =>
navigate({ navigate({
to: "/projects/$projectId/groups/$groupId", to: `${getProjectBaseURL(currentWorkspace.type)}/groups/$groupId` as const,
params: { params: {
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
groupId: id groupId: id
@@ -60,6 +60,7 @@ import { ProjectIdentityOrderBy } from "@app/hooks/api/workspace/types";
import { usePopUp } from "@app/hooks/usePopUp"; import { usePopUp } from "@app/hooks/usePopUp";
import { IdentityModal } from "./components/IdentityModal"; import { IdentityModal } from "./components/IdentityModal";
import { getProjectBaseURL } from "@app/helpers/project";
const MAX_ROLES_TO_BE_SHOWN_IN_TABLE = 2; const MAX_ROLES_TO_BE_SHOWN_IN_TABLE = 2;
@@ -260,7 +261,7 @@ export const IdentityTab = withProjectPermission(
onKeyDown={(evt) => { onKeyDown={(evt) => {
if (evt.key === "Enter") { if (evt.key === "Enter") {
navigate({ navigate({
to: "/projects/$projectId/identities/$identityId", to: `${getProjectBaseURL(currentWorkspace.type)}/identities/$identityId` as const,
params: { params: {
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
identityId: id identityId: id
@@ -270,7 +271,7 @@ export const IdentityTab = withProjectPermission(
}} }}
onClick={() => onClick={() =>
navigate({ navigate({
to: "/projects/$projectId/identities/$identityId", to: `${getProjectBaseURL(currentWorkspace.type)}/identities/$identityId` as const,
params: { params: {
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
identityId: id identityId: id
@@ -5,6 +5,7 @@ import { useWorkspace } from "@app/context";
import { TWorkspaceUser } from "@app/hooks/api/types"; import { TWorkspaceUser } from "@app/hooks/api/types";
import { MemberRbacSection } from "./MemberRbacSection"; import { MemberRbacSection } from "./MemberRbacSection";
import { getProjectBaseURL } from "@app/helpers/project";
type Props = { type Props = {
projectMember: TWorkspaceUser; projectMember: TWorkspaceUser;
@@ -21,7 +22,7 @@ export const MemberRoleForm = ({ projectMember, onOpenUpgradeModal }: Props) =>
> >
<AlertDescription> <AlertDescription>
<Link <Link
to="/projects/$projectId/members/$membershipId" to={`${getProjectBaseURL(currentWorkspace.type)}/members/$membershipId` as const}
params={{ params={{
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
membershipId: projectMember.id membershipId: projectMember.id
@@ -60,6 +60,7 @@ import { usePagination, useResetPageHelper } from "@app/hooks";
import { useGetProjectRoles, useGetWorkspaceUsers } from "@app/hooks/api"; import { useGetProjectRoles, useGetWorkspaceUsers } from "@app/hooks/api";
import { OrderByDirection } from "@app/hooks/api/generic/types"; import { OrderByDirection } from "@app/hooks/api/generic/types";
import { UsePopUpState } from "@app/hooks/usePopUp"; import { UsePopUpState } from "@app/hooks/usePopUp";
import { getProjectBaseURL } from "@app/helpers/project";
const MAX_ROLES_TO_BE_SHOWN_IN_TABLE = 2; const MAX_ROLES_TO_BE_SHOWN_IN_TABLE = 2;
@@ -311,7 +312,7 @@ export const MembersTable = ({ handlePopUpOpen }: Props) => {
onKeyDown={(evt) => { onKeyDown={(evt) => {
if (evt.key === "Enter") { if (evt.key === "Enter") {
navigate({ navigate({
to: "/projects/$projectId/members/$membershipId", to: `${getProjectBaseURL(currentWorkspace.type)}/members/$membershipId`,
params: { params: {
projectId: workspaceId, projectId: workspaceId,
membershipId membershipId
@@ -321,7 +322,7 @@ export const MembersTable = ({ handlePopUpOpen }: Props) => {
}} }}
onClick={() => onClick={() =>
navigate({ navigate({
to: "/projects/$projectId/members/$membershipId", to: `${getProjectBaseURL(currentWorkspace.type)}/members/$membershipId`,
params: { params: {
projectId: workspaceId, projectId: workspaceId,
membershipId membershipId
@@ -52,6 +52,7 @@ import { OrderByDirection } from "@app/hooks/api/generic/types";
import { ProjectMembershipRole, TProjectRole } from "@app/hooks/api/roles/types"; import { ProjectMembershipRole, TProjectRole } from "@app/hooks/api/roles/types";
import { DuplicateProjectRoleModal } from "@app/pages/project/RoleDetailsBySlugPage/components/DuplicateProjectRoleModal"; import { DuplicateProjectRoleModal } from "@app/pages/project/RoleDetailsBySlugPage/components/DuplicateProjectRoleModal";
import { RoleModal } from "@app/pages/project/RoleDetailsBySlugPage/components/RoleModal"; import { RoleModal } from "@app/pages/project/RoleDetailsBySlugPage/components/RoleModal";
import { getProjectBaseURL } from "@app/helpers/project";
enum RolesOrderBy { enum RolesOrderBy {
Name = "name", Name = "name",
@@ -249,7 +250,7 @@ export const ProjectRoleList = () => {
className="h-10 cursor-pointer transition-colors duration-100 hover:bg-mineshaft-700" className="h-10 cursor-pointer transition-colors duration-100 hover:bg-mineshaft-700"
onClick={() => onClick={() =>
navigate({ navigate({
to: "/projects/$projectId/roles/$roleSlug", to: `${getProjectBaseURL(currentWorkspace.type)}/roles/$roleSlug`,
params: { params: {
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
roleSlug: slug roleSlug: slug
@@ -291,7 +292,7 @@ export const ProjectRoleList = () => {
onClick={(e) => { onClick={(e) => {
e.stopPropagation(); e.stopPropagation();
navigate({ navigate({
to: "/projects/$projectId/roles/$roleSlug", to: `${getProjectBaseURL(currentWorkspace.type)}/roles/$roleSlug`,
params: { params: {
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
roleSlug: slug roleSlug: slug
@@ -0,0 +1,34 @@
import { createFileRoute, stripSearchParams } from '@tanstack/react-router'
import { zodValidator } from '@tanstack/zod-adapter'
import { z } from 'zod'
import { ProjectAccessControlTabs } from '@app/types/project'
import { AccessControlPage } from './AccessControlPage'
const AccessControlPageQuerySchema = z.object({
selectedTab: z
.nativeEnum(ProjectAccessControlTabs)
.catch(ProjectAccessControlTabs.Member),
requesterEmail: z.string().catch(''),
})
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/access-management',
)({
component: AccessControlPage,
validateSearch: zodValidator(AccessControlPageQuerySchema),
search: {
middlewares: [stripSearchParams({ requesterEmail: '' })],
},
beforeLoad: ({ context }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
},
],
}
},
})
@@ -0,0 +1,34 @@
import { createFileRoute, stripSearchParams } from '@tanstack/react-router'
import { zodValidator } from '@tanstack/zod-adapter'
import { z } from 'zod'
import { ProjectAccessControlTabs } from '@app/types/project'
import { AccessControlPage } from './AccessControlPage'
const AccessControlPageQuerySchema = z.object({
selectedTab: z
.nativeEnum(ProjectAccessControlTabs)
.catch(ProjectAccessControlTabs.Member),
requesterEmail: z.string().catch(''),
})
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/access-management',
)({
component: AccessControlPage,
validateSearch: zodValidator(AccessControlPageQuerySchema),
search: {
middlewares: [stripSearchParams({ requesterEmail: '' })],
},
beforeLoad: ({ context }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
},
],
}
},
})
@@ -0,0 +1,34 @@
import { createFileRoute, stripSearchParams } from '@tanstack/react-router'
import { zodValidator } from '@tanstack/zod-adapter'
import { z } from 'zod'
import { ProjectAccessControlTabs } from '@app/types/project'
import { AccessControlPage } from './AccessControlPage'
const AccessControlPageQuerySchema = z.object({
selectedTab: z
.nativeEnum(ProjectAccessControlTabs)
.catch(ProjectAccessControlTabs.Member),
requesterEmail: z.string().catch(''),
})
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/access-management',
)({
component: AccessControlPage,
validateSearch: zodValidator(AccessControlPageQuerySchema),
search: {
middlewares: [stripSearchParams({ requesterEmail: '' })],
},
beforeLoad: ({ context }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
},
],
}
},
})
@@ -0,0 +1,34 @@
import { createFileRoute, stripSearchParams } from '@tanstack/react-router'
import { zodValidator } from '@tanstack/zod-adapter'
import { z } from 'zod'
import { ProjectAccessControlTabs } from '@app/types/project'
import { AccessControlPage } from './AccessControlPage'
const AccessControlPageQuerySchema = z.object({
selectedTab: z
.nativeEnum(ProjectAccessControlTabs)
.catch(ProjectAccessControlTabs.Member),
requesterEmail: z.string().catch(''),
})
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/access-management',
)({
component: AccessControlPage,
validateSearch: zodValidator(AccessControlPageQuerySchema),
search: {
middlewares: [stripSearchParams({ requesterEmail: '' })],
},
beforeLoad: ({ context }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
},
],
}
},
})
@@ -0,0 +1,34 @@
import { createFileRoute, stripSearchParams } from '@tanstack/react-router'
import { zodValidator } from '@tanstack/zod-adapter'
import { z } from 'zod'
import { ProjectAccessControlTabs } from '@app/types/project'
import { AccessControlPage } from './AccessControlPage'
const AccessControlPageQuerySchema = z.object({
selectedTab: z
.nativeEnum(ProjectAccessControlTabs)
.catch(ProjectAccessControlTabs.Member),
requesterEmail: z.string().catch(''),
})
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/access-management',
)({
component: AccessControlPage,
validateSearch: zodValidator(AccessControlPageQuerySchema),
search: {
middlewares: [stripSearchParams({ requesterEmail: '' })],
},
beforeLoad: ({ context }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
},
],
}
},
})
@@ -19,6 +19,7 @@ import { usePopUp } from "@app/hooks";
import { useDeleteGroupFromWorkspace } from "@app/hooks/api"; import { useDeleteGroupFromWorkspace } from "@app/hooks/api";
import { TGroupMembership } from "@app/hooks/api/groups/types"; import { TGroupMembership } from "@app/hooks/api/groups/types";
import { GroupRoles } from "@app/pages/project/AccessControlPage/components/GroupsTab/components/GroupsSection/GroupRoles"; import { GroupRoles } from "@app/pages/project/AccessControlPage/components/GroupsTab/components/GroupsSection/GroupRoles";
import { getProjectBaseURL } from "@app/helpers/project";
type Props = { type Props = {
groupMembership: TGroupMembership; groupMembership: TGroupMembership;
@@ -46,7 +47,7 @@ export const GroupDetailsSection = ({ groupMembership }: Props) => {
}); });
navigate({ navigate({
to: "/projects/$projectId/access-management", to: `${getProjectBaseURL(currentWorkspace.type)}/access-management`,
params: { params: {
projectId: currentWorkspace.id projectId: currentWorkspace.id
}, },
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { GroupDetailsByIDPage } from './GroupDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/groups/$groupId',
)({
component: GroupDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Groups,
},
}),
},
{
label: 'Group',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { GroupDetailsByIDPage } from './GroupDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/groups/$groupId',
)({
component: GroupDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Groups,
},
}),
},
{
label: 'Group',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { GroupDetailsByIDPage } from './GroupDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/groups/$groupId',
)({
component: GroupDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Groups,
},
}),
},
{
label: 'Group',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { GroupDetailsByIDPage } from './GroupDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/groups/$groupId',
)({
component: GroupDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Groups,
},
}),
},
{
label: 'Group',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { GroupDetailsByIDPage } from './GroupDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/groups/$groupId',
)({
component: GroupDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Groups,
},
}),
},
{
label: 'Group',
},
],
}
},
})
@@ -20,7 +20,7 @@ import {
ProjectPermissionSub, ProjectPermissionSub,
useWorkspace useWorkspace
} from "@app/context"; } from "@app/context";
import { getCurrentProductFromUrl, getProjectHomePage } from "@app/helpers/project"; import { getProjectBaseURL, getProjectHomePage } from "@app/helpers/project";
import { usePopUp } from "@app/hooks"; import { usePopUp } from "@app/hooks";
import { import {
useAssumeProjectPrivileges, useAssumeProjectPrivileges,
@@ -28,7 +28,6 @@ import {
useGetWorkspaceIdentityMembershipDetails useGetWorkspaceIdentityMembershipDetails
} from "@app/hooks/api"; } from "@app/hooks/api";
import { ActorType } from "@app/hooks/api/auditLogs/enums"; import { ActorType } from "@app/hooks/api/auditLogs/enums";
import { ProjectType } from "@app/hooks/api/workspace/types";
import { IdentityProjectAdditionalPrivilegeSection } from "./components/IdentityProjectAdditionalPrivilegeSection"; import { IdentityProjectAdditionalPrivilegeSection } from "./components/IdentityProjectAdditionalPrivilegeSection";
import { IdentityRoleDetailsSection } from "./components/IdentityRoleDetailsSection"; import { IdentityRoleDetailsSection } from "./components/IdentityRoleDetailsSection";
@@ -68,9 +67,7 @@ const Page = () => {
type: "success", type: "success",
text: "Identity privilege assumption has started" text: "Identity privilege assumption has started"
}); });
const url = getProjectHomePage( const url = getProjectHomePage(currentWorkspace.type);
getCurrentProductFromUrl(window.location.href) || ProjectType.SecretManager
);
window.location.href = url.replace("$projectId", currentWorkspace.id); window.location.href = url.replace("$projectId", currentWorkspace.id);
} }
} }
@@ -89,7 +86,7 @@ const Page = () => {
}); });
handlePopUpClose("deleteIdentity"); handlePopUpClose("deleteIdentity");
navigate({ navigate({
to: "/projects/$projectId/access-management", to: `${getProjectBaseURL(currentWorkspace.type)}/access-management` as const,
params: { params: {
projectId: workspaceId projectId: workspaceId
}, },
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { IdentityDetailsByIDPage } from './IdentityDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/identities/$identityId',
)({
component: IdentityDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Identities,
},
}),
},
{
label: 'Machine Identity',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { IdentityDetailsByIDPage } from './IdentityDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/identities/$identityId',
)({
component: IdentityDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Identities,
},
}),
},
{
label: 'Machine Identity',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { IdentityDetailsByIDPage } from './IdentityDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/identities/$identityId',
)({
component: IdentityDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Identities,
},
}),
},
{
label: 'Machine Identity',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { IdentityDetailsByIDPage } from './IdentityDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/identities/$identityId',
)({
component: IdentityDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Identities,
},
}),
},
{
label: 'Machine Identity',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { IdentityDetailsByIDPage } from './IdentityDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/identities/$identityId',
)({
component: IdentityDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Identities,
},
}),
},
{
label: 'Machine Identity',
},
],
}
},
})
@@ -21,7 +21,7 @@ import {
useOrganization, useOrganization,
useWorkspace useWorkspace
} from "@app/context"; } from "@app/context";
import { getCurrentProductFromUrl, getProjectHomePage } from "@app/helpers/project"; import { getProjectBaseURL, getProjectHomePage } from "@app/helpers/project";
import { usePopUp } from "@app/hooks"; import { usePopUp } from "@app/hooks";
import { import {
useAssumeProjectPrivileges, useAssumeProjectPrivileges,
@@ -29,7 +29,6 @@ import {
useGetWorkspaceUserDetails useGetWorkspaceUserDetails
} from "@app/hooks/api"; } from "@app/hooks/api";
import { ActorType } from "@app/hooks/api/auditLogs/enums"; import { ActorType } from "@app/hooks/api/auditLogs/enums";
import { ProjectType } from "@app/hooks/api/workspace/types";
import { MemberProjectAdditionalPrivilegeSection } from "./components/MemberProjectAdditionalPrivilegeSection"; import { MemberProjectAdditionalPrivilegeSection } from "./components/MemberProjectAdditionalPrivilegeSection";
import { MemberRoleDetailsSection } from "./components/MemberRoleDetailsSection"; import { MemberRoleDetailsSection } from "./components/MemberRoleDetailsSection";
@@ -73,9 +72,7 @@ export const Page = () => {
text: "User privilege assumption has started" text: "User privilege assumption has started"
}); });
const url = getProjectHomePage( const url = getProjectHomePage(currentWorkspace.type);
getCurrentProductFromUrl(window.location.href) || ProjectType.SecretManager
);
window.location.href = url.replace("$projectId", currentWorkspace.id); window.location.href = url.replace("$projectId", currentWorkspace.id);
} }
} }
@@ -96,7 +93,7 @@ export const Page = () => {
type: "success" type: "success"
}); });
navigate({ navigate({
to: "/projects/$projectId/access-management", to: `${getProjectBaseURL(currentWorkspace.type)}/access-management` as const,
params: { params: {
projectId: currentWorkspace.id projectId: currentWorkspace.id
} }
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { MemberDetailsByIDPage } from './MemberDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/members/$membershipId',
)({
component: MemberDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Member,
},
}),
},
{
label: 'User',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { MemberDetailsByIDPage } from './MemberDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/members/$membershipId',
)({
component: MemberDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Member,
},
}),
},
{
label: 'User',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { MemberDetailsByIDPage } from './MemberDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/members/$membershipId',
)({
component: MemberDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Member,
},
}),
},
{
label: 'User',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { MemberDetailsByIDPage } from './MemberDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/members/$membershipId',
)({
component: MemberDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Member,
},
}),
},
{
label: 'User',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { MemberDetailsByIDPage } from './MemberDetailsByIDPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/members/$membershipId',
)({
component: MemberDetailsByIDPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Member,
},
}),
},
{
label: 'User',
},
],
}
},
})
@@ -25,6 +25,7 @@ import { RolePermissionsSection } from "@app/pages/project/RoleDetailsBySlugPage
import { ProjectAccessControlTabs } from "@app/types/project"; import { ProjectAccessControlTabs } from "@app/types/project";
import { RoleModal } from "./components/RoleModal"; import { RoleModal } from "./components/RoleModal";
import { getProjectBaseURL } from "@app/helpers/project";
const Page = () => { const Page = () => {
const navigate = useNavigate(); const navigate = useNavigate();
@@ -60,7 +61,7 @@ const Page = () => {
}); });
handlePopUpClose("deleteRole"); handlePopUpClose("deleteRole");
navigate({ navigate({
to: "/projects/$projectId/access-management", to: `${getProjectBaseURL(currentWorkspace.type)}/access-management` as const,
params: { params: {
projectId projectId
}, },
@@ -10,6 +10,7 @@ import { ProjectPermissionSecretActions } from "@app/context/ProjectPermissionCo
import { useCreateProjectRole, useGetProjectRoleBySlug } from "@app/hooks/api"; import { useCreateProjectRole, useGetProjectRoleBySlug } from "@app/hooks/api";
import { TProjectRole } from "@app/hooks/api/roles/types"; import { TProjectRole } from "@app/hooks/api/roles/types";
import { slugSchema } from "@app/lib/schemas"; import { slugSchema } from "@app/lib/schemas";
import { getProjectBaseURL } from "@app/helpers/project";
type Props = { type Props = {
isOpen: boolean; isOpen: boolean;
@@ -80,7 +81,7 @@ const Content = ({ role, onClose }: ContentProps) => {
}); });
navigate({ navigate({
to: "/projects/$projectId/roles/$roleSlug", to: `${getProjectBaseURL(currentWorkspace.type)}/roles/$roleSlug` as const,
params: { params: {
roleSlug: newRole.slug, roleSlug: newRole.slug,
projectId: currentWorkspace.id projectId: currentWorkspace.id
@@ -14,6 +14,7 @@ import {
} from "@app/hooks/api"; } from "@app/hooks/api";
import { UsePopUpState } from "@app/hooks/usePopUp"; import { UsePopUpState } from "@app/hooks/usePopUp";
import { slugSchema } from "@app/lib/schemas"; import { slugSchema } from "@app/lib/schemas";
import { getProjectBaseURL } from "@app/helpers/project";
const schema = z const schema = z
.object({ .object({
@@ -100,7 +101,7 @@ export const RoleModal = ({ popUp, handlePopUpToggle }: Props) => {
}); });
navigate({ navigate({
to: "/projects/$projectId/roles/$roleSlug", to: `${getProjectBaseURL(currentWorkspace.type)}/roles/$roleSlug` as const,
params: { params: {
roleSlug: newRole.slug, roleSlug: newRole.slug,
projectId projectId
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { RoleDetailsBySlugPage } from './RoleDetailsBySlugPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/cert-management/$projectId/_cert-manager-layout/roles/$roleSlug',
)({
component: RoleDetailsBySlugPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Roles,
},
}),
},
{
label: 'Roles',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { RoleDetailsBySlugPage } from './RoleDetailsBySlugPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/kms/$projectId/_kms-layout/roles/$roleSlug',
)({
component: RoleDetailsBySlugPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Roles,
},
}),
},
{
label: 'Roles',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { RoleDetailsBySlugPage } from './RoleDetailsBySlugPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/roles/$roleSlug',
)({
component: RoleDetailsBySlugPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Roles,
},
}),
},
{
label: 'Roles',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { RoleDetailsBySlugPage } from './RoleDetailsBySlugPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/secret-scanning/$projectId/_secret-scanning-layout/roles/$roleSlug',
)({
component: RoleDetailsBySlugPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Roles,
},
}),
},
{
label: 'Roles',
},
],
}
},
})
@@ -0,0 +1,33 @@
import { createFileRoute, linkOptions } from '@tanstack/react-router'
import { ProjectAccessControlTabs } from '@app/types/project'
import { RoleDetailsBySlugPage } from './RoleDetailsBySlugPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/projects/ssh/$projectId/_ssh-layout/roles/$roleSlug',
)({
component: RoleDetailsBySlugPage,
beforeLoad: ({ context, params }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Access Control',
link: linkOptions({
to: '/projects/$projectId/access-management',
params: {
projectId: params.projectId,
},
search: {
selectedTab: ProjectAccessControlTabs.Roles,
},
}),
},
{
label: 'Roles',
},
],
}
},
})
@@ -0,0 +1,19 @@
import { createFileRoute } from "@tanstack/react-router";
import { SettingsPage } from "./SettingsPage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/_project-general-layout/settings"
)({
component: SettingsPage,
beforeLoad: ({ context }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: "Settings"
}
]
};
}
});
@@ -0,0 +1,19 @@
import { createFileRoute } from "@tanstack/react-router";
import { SettingsPage } from "./SettingsPage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/_project-general-layout/settings"
)({
component: SettingsPage,
beforeLoad: ({ context }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: "Settings"
}
]
};
}
});
@@ -0,0 +1,19 @@
import { createFileRoute } from "@tanstack/react-router";
import { SettingsPage } from "./SettingsPage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/_project-general-layout/settings"
)({
component: SettingsPage,
beforeLoad: ({ context }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: "Settings"
}
]
};
}
});
@@ -0,0 +1,19 @@
import { createFileRoute } from "@tanstack/react-router";
import { SettingsPage } from "./SettingsPage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/_project-general-layout/settings"
)({
component: SettingsPage,
beforeLoad: ({ context }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: "Settings"
}
]
};
}
});
@@ -0,0 +1,19 @@
import { createFileRoute } from '@tanstack/react-router'
import { SettingsPage } from './SettingsPage'
export const Route = createFileRoute(
'/_authenticate/_inject-org-details/_org-layout/_project-layout/projects/ssh/$projectId/_ssh-layout/settings',
)({
component: SettingsPage,
beforeLoad: ({ context }) => {
return {
breadcrumbs: [
...context.breadcrumbs,
{
label: 'Settings',
},
],
}
},
})
+2 -18
View File
@@ -1,31 +1,15 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from "@tanstack/react-router";
import { BreadcrumbTypes } from "@app/components/v2"; import { BreadcrumbTypes } from "@app/components/v2";
import { workspaceKeys } from "@app/hooks/api";
import { fetchUserProjectPermissions, roleQueryKeys } from "@app/hooks/api/roles/queries";
import { fetchWorkspaceById } from "@app/hooks/api/workspace/queries";
import { ProjectLayout } from "@app/layouts/ProjectLayout"; import { ProjectLayout } from "@app/layouts/ProjectLayout";
import { ProjectSelect } from "@app/layouts/ProjectLayout/components/ProjectSelect"; import { ProjectSelect } from "@app/layouts/ProjectLayout/components/ProjectSelect";
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout" "/_authenticate/_inject-org-details/_org-layout/_project-layout"
)({ )({
component: ProjectLayout, component: ProjectLayout,
beforeLoad: async ({ params, context }) => { beforeLoad: async () => {
const project = await context.queryClient.ensureQueryData({
queryKey: workspaceKeys.getWorkspaceById(params.projectId),
queryFn: () => fetchWorkspaceById(params.projectId)
});
await context.queryClient.ensureQueryData({
queryKey: roleQueryKeys.getUserProjectPermissions({
workspaceId: params.projectId
}),
queryFn: () => fetchUserProjectPermissions({ workspaceId: params.projectId })
});
return { return {
project,
breadcrumbs: [ breadcrumbs: [
{ {
type: BreadcrumbTypes.Component, type: BreadcrumbTypes.Component,
@@ -34,7 +34,7 @@ export const CommitDetailsPage = () => {
const handleGoBackToHistory = () => { const handleGoBackToHistory = () => {
navigate({ navigate({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId", to: "/projects/secret-management/$projectId/commits/$environment/$folderId",
params: { params: {
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
folderId, folderId,
@@ -49,7 +49,7 @@ export const CommitDetailsPage = () => {
const handleGoToRollbackPreview = () => { const handleGoToRollbackPreview = () => {
navigate({ navigate({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId/$commitId/restore", to: "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/restore",
params: { params: {
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
folderId, folderId,
@@ -102,7 +102,7 @@ export const RollbackPreviewTab = (): JSX.Element => {
const goBackToHistory = () => { const goBackToHistory = () => {
navigate({ navigate({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId", to: "/projects/secret-management/$projectId/commits/$environment/$folderId",
params: { params: {
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
folderId, folderId,
@@ -12,7 +12,7 @@ const RollbackPreviewTabQueryParamsSchema = z.object({
}); });
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore"
)({ )({
component: RollbackPreviewTab, component: RollbackPreviewTab,
validateSearch: zodValidator(RollbackPreviewTabQueryParamsSchema), validateSearch: zodValidator(RollbackPreviewTabQueryParamsSchema),
@@ -33,7 +33,7 @@ export const Route = createFileRoute(
links: context.project.environments.map((el) => ({ links: context.project.environments.map((el) => ({
label: el.name, label: el.name,
link: linkOptions({ link: linkOptions({
to: "/projects/$projectId/secret-manager/secrets/$envSlug", to: "/projects/secret-management/$projectId/secrets/$envSlug",
params: { params: {
projectId: params.projectId, projectId: params.projectId,
envSlug: el.slug envSlug: el.slug
@@ -56,7 +56,7 @@ export const Route = createFileRoute(
{ {
label: "Commits", label: "Commits",
link: linkOptions({ link: linkOptions({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId", to: "/projects/secret-management/$projectId/commits/$environment/$folderId",
params: { params: {
projectId: params.projectId, projectId: params.projectId,
environment: params.environment, environment: params.environment,
@@ -70,7 +70,7 @@ export const Route = createFileRoute(
{ {
label: params.commitId, label: params.commitId,
link: linkOptions({ link: linkOptions({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId/$commitId", to: "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId",
params: { params: {
projectId: params.projectId, projectId: params.projectId,
environment: params.environment, environment: params.environment,
@@ -12,7 +12,7 @@ const CommitDetailsPageQueryParamsSchema = z.object({
}); });
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/commits/$environment/$folderId/$commitId/" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/"
)({ )({
component: CommitDetailsPage, component: CommitDetailsPage,
validateSearch: zodValidator(CommitDetailsPageQueryParamsSchema), validateSearch: zodValidator(CommitDetailsPageQueryParamsSchema),
@@ -33,7 +33,7 @@ export const Route = createFileRoute(
links: context.project.environments.map((el) => ({ links: context.project.environments.map((el) => ({
label: el.name, label: el.name,
link: linkOptions({ link: linkOptions({
to: "/projects/$projectId/secret-manager/secrets/$envSlug", to: "/projects/secret-management/$projectId/secrets/$envSlug",
params: { params: {
projectId: params.projectId, projectId: params.projectId,
envSlug: el.slug envSlug: el.slug
@@ -56,7 +56,7 @@ export const Route = createFileRoute(
{ {
label: "Commits", label: "Commits",
link: linkOptions({ link: linkOptions({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId", to: "/projects/secret-management/$projectId/commits/$environment/$folderId",
params: { params: {
projectId: params.projectId, projectId: params.projectId,
environment: params.environment, environment: params.environment,
@@ -31,7 +31,7 @@ export const CommitsPage = () => {
const handleSelectCommit = (commitId: string) => { const handleSelectCommit = (commitId: string) => {
navigate({ navigate({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId/$commitId", to: "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId",
params: { params: {
projectId: currentWorkspace.id, projectId: currentWorkspace.id,
folderId, folderId,
@@ -13,7 +13,7 @@ const CommitsPageQueryParamsSchema = z.object({
}); });
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/commits/$environment/$folderId/" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/"
)({ )({
component: CommitsPage, component: CommitsPage,
validateSearch: zodValidator(CommitsPageQueryParamsSchema), validateSearch: zodValidator(CommitsPageQueryParamsSchema),
@@ -34,7 +34,7 @@ export const Route = createFileRoute(
links: context.project.environments.map((el) => ({ links: context.project.environments.map((el) => ({
label: el.name, label: el.name,
link: linkOptions({ link: linkOptions({
to: "/projects/$projectId/secret-manager/secrets/$envSlug", to: "/projects/secret-management/$projectId/secrets/$envSlug",
params: { params: {
projectId: params.projectId, projectId: params.projectId,
envSlug: el.slug envSlug: el.slug
@@ -57,7 +57,7 @@ export const Route = createFileRoute(
{ {
label: "Commits", label: "Commits",
link: linkOptions({ link: linkOptions({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId", to: "/projects/secret-management/$projectId/commits/$environment/$folderId",
params: { params: {
projectId: params.projectId, projectId: params.projectId,
environment: params.environment, environment: params.environment,
@@ -1,9 +1,9 @@
import { createFileRoute } from "@tanstack/react-router"; import { createFileRoute } from '@tanstack/react-router'
import { IPAllowListPage } from "./IPAllowlistPage"; import { IPAllowListPage } from './IPAllowlistPage'
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/allowlist" '/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/allowlist',
)({ )({
component: () => IPAllowListPage component: () => IPAllowListPage,
}); })
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { IntegrationDetailsByIDPage } from "./IntegrationsDetailsByIDPage"; import { IntegrationDetailsByIDPage } from "./IntegrationsDetailsByIDPage";
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/$integrationId" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/$integrationId"
)({ )({
component: IntegrationDetailsByIDPage, component: IntegrationDetailsByIDPage,
beforeLoad: ({ context, params }) => { beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{ {
label: "Integrations", label: "Integrations",
link: linkOptions({ link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations", to: "/projects/secret-management/$projectId/integrations",
params, params,
search: { search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -42,7 +42,7 @@ export const redirectForProviderAuth = (
switch (integrationOption.slug) { switch (integrationOption.slug) {
case "gcp-secret-manager": case "gcp-secret-manager":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/gcp-secret-manager/authorize", to: "/projects/secret-management/$projectId/integrations/gcp-secret-manager/authorize",
params: { params: {
projectId projectId
} }
@@ -54,7 +54,7 @@ export const redirectForProviderAuth = (
return; return;
} }
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/azure-key-vault/authorize", to: "/projects/secret-management/$projectId/integrations/azure-key-vault/authorize",
params: { params: {
projectId projectId
}, },
@@ -76,7 +76,7 @@ export const redirectForProviderAuth = (
} }
case "aws-parameter-store": case "aws-parameter-store":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/aws-parameter-store/authorize", to: "/projects/secret-management/$projectId/integrations/aws-parameter-store/authorize",
params: { params: {
projectId projectId
} }
@@ -84,7 +84,7 @@ export const redirectForProviderAuth = (
break; break;
case "aws-secret-manager": case "aws-secret-manager":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/aws-secret-manager/authorize", to: "/projects/secret-management/$projectId/integrations/aws-secret-manager/authorize",
params: { params: {
projectId projectId
} }
@@ -120,7 +120,7 @@ export const redirectForProviderAuth = (
} }
case "github": case "github":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/github/auth-mode-selection", to: "/projects/secret-management/$projectId/integrations/github/auth-mode-selection",
params: { params: {
projectId projectId
} }
@@ -128,7 +128,7 @@ export const redirectForProviderAuth = (
break; break;
case "gitlab": case "gitlab":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/gitlab/authorize", to: "/projects/secret-management/$projectId/integrations/gitlab/authorize",
params: { params: {
projectId projectId
} }
@@ -136,7 +136,7 @@ export const redirectForProviderAuth = (
break; break;
case "render": case "render":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/render/authorize", to: "/projects/secret-management/$projectId/integrations/render/authorize",
params: { params: {
projectId projectId
} }
@@ -144,7 +144,7 @@ export const redirectForProviderAuth = (
break; break;
case "flyio": case "flyio":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/flyio/authorize", to: "/projects/secret-management/$projectId/integrations/flyio/authorize",
params: { params: {
projectId projectId
} }
@@ -152,7 +152,7 @@ export const redirectForProviderAuth = (
break; break;
case "circleci": case "circleci":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/circleci/authorize", to: "/projects/secret-management/$projectId/integrations/circleci/authorize",
params: { params: {
projectId projectId
} }
@@ -160,7 +160,7 @@ export const redirectForProviderAuth = (
break; break;
case "databricks": case "databricks":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/databricks/authorize", to: "/projects/secret-management/$projectId/integrations/databricks/authorize",
params: { params: {
projectId projectId
} }
@@ -168,7 +168,7 @@ export const redirectForProviderAuth = (
break; break;
case "laravel-forge": case "laravel-forge":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/laravel-forge/authorize", to: "/projects/secret-management/$projectId/integrations/laravel-forge/authorize",
params: { params: {
projectId projectId
} }
@@ -176,7 +176,7 @@ export const redirectForProviderAuth = (
break; break;
case "travisci": case "travisci":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/travisci/authorize", to: "/projects/secret-management/$projectId/integrations/travisci/authorize",
params: { params: {
projectId projectId
} }
@@ -184,7 +184,7 @@ export const redirectForProviderAuth = (
break; break;
case "supabase": case "supabase":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/supabase/authorize", to: "/projects/secret-management/$projectId/integrations/supabase/authorize",
params: { params: {
projectId projectId
} }
@@ -192,7 +192,7 @@ export const redirectForProviderAuth = (
break; break;
case "checkly": case "checkly":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/checkly/authorize", to: "/projects/secret-management/$projectId/integrations/checkly/authorize",
params: { params: {
projectId projectId
} }
@@ -200,7 +200,7 @@ export const redirectForProviderAuth = (
break; break;
case "qovery": case "qovery":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/qovery/authorize", to: "/projects/secret-management/$projectId/integrations/qovery/authorize",
params: { params: {
projectId projectId
} }
@@ -208,7 +208,7 @@ export const redirectForProviderAuth = (
break; break;
case "railway": case "railway":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/railway/authorize", to: "/projects/secret-management/$projectId/integrations/railway/authorize",
params: { params: {
projectId projectId
} }
@@ -216,7 +216,7 @@ export const redirectForProviderAuth = (
break; break;
case "terraform-cloud": case "terraform-cloud":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/terraform-cloud/authorize", to: "/projects/secret-management/$projectId/integrations/terraform-cloud/authorize",
params: { params: {
projectId projectId
} }
@@ -224,7 +224,7 @@ export const redirectForProviderAuth = (
break; break;
case "hashicorp-vault": case "hashicorp-vault":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/hashicorp-vault/authorize", to: "/projects/secret-management/$projectId/integrations/hashicorp-vault/authorize",
params: { params: {
projectId projectId
} }
@@ -232,7 +232,7 @@ export const redirectForProviderAuth = (
break; break;
case "cloudflare-pages": case "cloudflare-pages":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/cloudflare-pages/authorize", to: "/projects/secret-management/$projectId/integrations/cloudflare-pages/authorize",
params: { params: {
projectId projectId
} }
@@ -240,7 +240,7 @@ export const redirectForProviderAuth = (
break; break;
case "cloudflare-workers": case "cloudflare-workers":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/cloudflare-workers/authorize", to: "/projects/secret-management/$projectId/integrations/cloudflare-workers/authorize",
params: { params: {
projectId projectId
} }
@@ -257,7 +257,7 @@ export const redirectForProviderAuth = (
} }
case "codefresh": case "codefresh":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/codefresh/authorize", to: "/projects/secret-management/$projectId/integrations/codefresh/authorize",
params: { params: {
projectId projectId
} }
@@ -265,7 +265,7 @@ export const redirectForProviderAuth = (
break; break;
case "digital-ocean-app-platform": case "digital-ocean-app-platform":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/digital-ocean-app-platform/authorize", to: "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/authorize",
params: { params: {
projectId projectId
} }
@@ -273,7 +273,7 @@ export const redirectForProviderAuth = (
break; break;
case "cloud-66": case "cloud-66":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/cloud-66/authorize", to: "/projects/secret-management/$projectId/integrations/cloud-66/authorize",
params: { params: {
projectId projectId
} }
@@ -281,7 +281,7 @@ export const redirectForProviderAuth = (
break; break;
case "northflank": case "northflank":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/northflank/authorize", to: "/projects/secret-management/$projectId/integrations/northflank/authorize",
params: { params: {
projectId projectId
} }
@@ -289,7 +289,7 @@ export const redirectForProviderAuth = (
break; break;
case "windmill": case "windmill":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/windmill/authorize", to: "/projects/secret-management/$projectId/integrations/windmill/authorize",
params: { params: {
projectId projectId
} }
@@ -297,7 +297,7 @@ export const redirectForProviderAuth = (
break; break;
case "teamcity": case "teamcity":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/teamcity/authorize", to: "/projects/secret-management/$projectId/integrations/teamcity/authorize",
params: { params: {
projectId projectId
} }
@@ -305,7 +305,7 @@ export const redirectForProviderAuth = (
break; break;
case "hasura-cloud": case "hasura-cloud":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/hasura-cloud/authorize", to: "/projects/secret-management/$projectId/integrations/hasura-cloud/authorize",
params: { params: {
projectId projectId
} }
@@ -313,7 +313,7 @@ export const redirectForProviderAuth = (
break; break;
case "rundeck": case "rundeck":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/rundeck/authorize", to: "/projects/secret-management/$projectId/integrations/rundeck/authorize",
params: { params: {
projectId projectId
} }
@@ -321,7 +321,7 @@ export const redirectForProviderAuth = (
break; break;
case "azure-devops": case "azure-devops":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/azure-devops/authorize", to: "/projects/secret-management/$projectId/integrations/azure-devops/authorize",
params: { params: {
projectId projectId
} }
@@ -329,7 +329,7 @@ export const redirectForProviderAuth = (
break; break;
case "octopus-deploy": case "octopus-deploy":
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/octopus-deploy/authorize", to: "/projects/secret-management/$projectId/integrations/octopus-deploy/authorize",
params: { params: {
projectId projectId
} }
@@ -59,7 +59,7 @@ export const IntegrationRow = ({
<Tr <Tr
onClick={() => onClick={() =>
navigate({ navigate({
to: "/projects/$projectId/secret-manager/integrations/$integrationId", to: "/projects/secret-management/$projectId/integrations/$integrationId",
params: { params: {
integrationId: integration.id, integrationId: integration.id,
projectId: currentWorkspace.id projectId: currentWorkspace.id
@@ -21,7 +21,7 @@ const IntegrationsListPageQuerySchema = z.object({
}); });
export const Route = createFileRoute( export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/" "/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/"
)({ )({
component: IntegrationsListPage, component: IntegrationsListPage,
validateSearch: zodValidator(IntegrationsListPageQuerySchema), validateSearch: zodValidator(IntegrationsListPageQuerySchema),
@@ -36,7 +36,7 @@ export const Route = createFileRoute(
}); });
} catch { } catch {
throw redirect({ throw redirect({
to: "/projects/$projectId/secret-manager/integrations", to: "/projects/secret-management/$projectId/integrations",
params: { params: {
projectId projectId
}, },
@@ -46,7 +46,7 @@ export const Route = createFileRoute(
if (secretSyncs.length) { if (secretSyncs.length) {
throw redirect({ throw redirect({
to: "/projects/$projectId/secret-manager/integrations", to: "/projects/secret-management/$projectId/integrations",
params: { params: {
projectId projectId
}, },
@@ -62,7 +62,7 @@ export const Route = createFileRoute(
}); });
} catch { } catch {
throw redirect({ throw redirect({
to: "/projects/$projectId/secret-manager/integrations", to: "/projects/secret-management/$projectId/integrations",
params: { params: {
projectId projectId
}, },
@@ -72,7 +72,7 @@ export const Route = createFileRoute(
if (integrations.length) { if (integrations.length) {
throw redirect({ throw redirect({
to: "/projects/$projectId/secret-manager/integrations", to: "/projects/secret-management/$projectId/integrations",
params: { params: {
projectId projectId
}, },
@@ -81,7 +81,7 @@ export const Route = createFileRoute(
} }
throw redirect({ throw redirect({
to: "/projects/$projectId/secret-manager/integrations", to: "/projects/secret-management/$projectId/integrations",
params: { params: {
projectId projectId
}, },
@@ -667,7 +667,7 @@ export const OverviewPage = () => {
const envIndex = visibleEnvs.findIndex((el) => slug === el.slug); const envIndex = visibleEnvs.findIndex((el) => slug === el.slug);
if (envIndex !== -1) { if (envIndex !== -1) {
navigate({ navigate({
to: "/projects/$projectId/secret-manager/secrets/$envSlug", to: "/projects/secret-management/$projectId/secrets/$envSlug",
params: { params: {
projectId: workspaceId, projectId: workspaceId,
envSlug: slug envSlug: slug
@@ -1420,7 +1420,7 @@ export const OverviewPage = () => {
iconSize="3x" iconSize="3x"
> >
<Link <Link
to="/projects/$projectId/secret-manager/settings" to="/projects/secret-management/$projectId/settings"
params={{ params={{
projectId: workspaceId projectId: workspaceId
}} }}
@@ -9,7 +9,7 @@ type Props = {
export const FolderBreadCrumbs = ({ secretPath = "/", onResetSearch }: Props) => { export const FolderBreadCrumbs = ({ secretPath = "/", onResetSearch }: Props) => {
const navigate = useNavigate({ const navigate = useNavigate({
from: "/projects/$projectId/secret-manager/overview" from: "/projects/secret-management/$projectId/overview"
}); });
const onFolderCrumbClick = (index: number) => { const onFolderCrumbClick = (index: number) => {
@@ -17,7 +17,7 @@ export const QuickSearchDynamicSecretItem = ({
onClose onClose
}: Props) => { }: Props) => {
const navigate = useNavigate({ const navigate = useNavigate({
from: "/projects/$projectId/secret-manager/overview" from: "/projects/secret-management/$projectId/overview"
}); });
const [groupDynamicSecret] = dynamicSecretGroup; const [groupDynamicSecret] = dynamicSecretGroup;

Some files were not shown because too many files have changed in this diff Show More