mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-08 19:28:16 +00:00
feat: added project layout and project select in breadcrumb
This commit is contained in:
@@ -0,0 +1,28 @@
|
|||||||
|
import { Knex } from "knex";
|
||||||
|
import { TableName, ProjectType } from "../schemas";
|
||||||
|
|
||||||
|
export async function up(knex: Knex): Promise<void> {
|
||||||
|
const hasTypeColumn = await knex.schema.hasColumn(TableName.Project, "type");
|
||||||
|
const hasDefaultTypeColumn = await knex.schema.hasColumn(TableName.Project, "defaultType");
|
||||||
|
if (hasTypeColumn && !hasDefaultTypeColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.Project, (t) => {
|
||||||
|
t.string("type").nullable().alter();
|
||||||
|
t.string("defaultType").notNullable().defaultTo(ProjectType.SecretManager);
|
||||||
|
});
|
||||||
|
|
||||||
|
await knex(TableName.Project).update({
|
||||||
|
// eslint-disable-next-line
|
||||||
|
// @ts-ignore this is because this field is created later
|
||||||
|
defaultType: knex.raw("type")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(knex: Knex): Promise<void> {
|
||||||
|
const hasDefaultTypeColumn = await knex.schema.hasColumn(TableName.Project, "defaultType");
|
||||||
|
if (hasDefaultTypeColumn) {
|
||||||
|
await knex.schema.alterTable(TableName.Project, (t) => {
|
||||||
|
t.dropColumn("defaultType");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,11 +25,12 @@ export const ProjectsSchema = z.object({
|
|||||||
kmsSecretManagerKeyId: z.string().uuid().nullable().optional(),
|
kmsSecretManagerKeyId: z.string().uuid().nullable().optional(),
|
||||||
kmsSecretManagerEncryptedDataKey: zodBuffer.nullable().optional(),
|
kmsSecretManagerEncryptedDataKey: zodBuffer.nullable().optional(),
|
||||||
description: z.string().nullable().optional(),
|
description: z.string().nullable().optional(),
|
||||||
type: z.string(),
|
type: z.string().nullable().optional(),
|
||||||
enforceCapitalization: z.boolean().default(false),
|
enforceCapitalization: z.boolean().default(false),
|
||||||
hasDeleteProtection: z.boolean().default(false).nullable().optional(),
|
hasDeleteProtection: z.boolean().default(false).nullable().optional(),
|
||||||
secretSharing: z.boolean().default(true),
|
secretSharing: z.boolean().default(true),
|
||||||
showSnapshotsLegacy: z.boolean().default(false)
|
showSnapshotsLegacy: z.boolean().default(false),
|
||||||
|
defaultType: z.string().default("secret-manager")
|
||||||
});
|
});
|
||||||
|
|
||||||
export type TProjects = z.infer<typeof ProjectsSchema>;
|
export type TProjects = z.infer<typeof ProjectsSchema>;
|
||||||
|
|||||||
@@ -251,6 +251,7 @@ export const SanitizedProjectSchema = ProjectsSchema.pick({
|
|||||||
name: true,
|
name: true,
|
||||||
description: true,
|
description: true,
|
||||||
type: true,
|
type: true,
|
||||||
|
defaultType: true,
|
||||||
slug: true,
|
slug: true,
|
||||||
autoCapitalization: true,
|
autoCapitalization: true,
|
||||||
orgId: true,
|
orgId: true,
|
||||||
|
|||||||
@@ -158,17 +158,7 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => {
|
|||||||
includeRoles: z
|
includeRoles: z
|
||||||
.enum(["true", "false"])
|
.enum(["true", "false"])
|
||||||
.default("false")
|
.default("false")
|
||||||
.transform((value) => value === "true"),
|
.transform((value) => value === "true")
|
||||||
type: z
|
|
||||||
.enum([
|
|
||||||
ProjectType.SecretManager,
|
|
||||||
ProjectType.KMS,
|
|
||||||
ProjectType.CertificateManager,
|
|
||||||
ProjectType.SSH,
|
|
||||||
ProjectType.SecretScanning,
|
|
||||||
"all"
|
|
||||||
])
|
|
||||||
.optional()
|
|
||||||
}),
|
}),
|
||||||
response: {
|
response: {
|
||||||
200: z.object({
|
200: z.object({
|
||||||
@@ -187,8 +177,7 @@ export const registerProjectRouter = async (server: FastifyZodProvider) => {
|
|||||||
actorId: req.permission.id,
|
actorId: req.permission.id,
|
||||||
actorAuthMethod: req.permission.authMethod,
|
actorAuthMethod: req.permission.authMethod,
|
||||||
actor: req.permission.type,
|
actor: req.permission.type,
|
||||||
actorOrgId: req.permission.orgId,
|
actorOrgId: req.permission.orgId
|
||||||
type: req.query.type
|
|
||||||
});
|
});
|
||||||
return { workspaces };
|
return { workspaces };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -571,8 +571,8 @@ export const projectServiceFactory = ({
|
|||||||
const getProjects = async ({ actorId, actor, includeRoles, actorAuthMethod, actorOrgId }: TListProjectsDTO) => {
|
const getProjects = async ({ actorId, actor, includeRoles, actorAuthMethod, actorOrgId }: TListProjectsDTO) => {
|
||||||
const workspaces =
|
const workspaces =
|
||||||
actor === ActorType.IDENTITY
|
actor === ActorType.IDENTITY
|
||||||
? await projectDAL.findIdentityProjects(actorId, actorOrgId, type)
|
? await projectDAL.findIdentityProjects(actorId, actorOrgId)
|
||||||
: await projectDAL.findUserProjects(actorId, actorOrgId, type);
|
: await projectDAL.findUserProjects(actorId, actorOrgId);
|
||||||
|
|
||||||
if (includeRoles) {
|
if (includeRoles) {
|
||||||
const { permission } = await permissionService.getUserOrgPermission(
|
const { permission } = await permissionService.getUserOrgPermission(
|
||||||
|
|||||||
+132
-132
@@ -74,276 +74,276 @@ export const ROUTE_PATHS = Object.freeze({
|
|||||||
},
|
},
|
||||||
SecretManager: {
|
SecretManager: {
|
||||||
ApprovalPage: setRoute(
|
ApprovalPage: setRoute(
|
||||||
"/secret-manager/$projectId/approval",
|
"/projects/$projectId/secret-manager/approval",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/approval"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/approval"
|
||||||
),
|
),
|
||||||
SecretDashboardPage: setRoute(
|
SecretDashboardPage: setRoute(
|
||||||
"/secret-manager/$projectId/secrets/$envSlug",
|
"/projects/$projectId/secret-manager/secrets/$envSlug",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/secrets/$envSlug"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/secrets/$envSlug"
|
||||||
),
|
),
|
||||||
RollbackPreviewPage: setRoute(
|
RollbackPreviewPage: setRoute(
|
||||||
"/secret-manager/$projectId/commits/$environment/$folderId/$commitId/restore",
|
"/projects/$projectId/secret-manager/commits/$environment/$folderId/$commitId/restore",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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"
|
||||||
),
|
),
|
||||||
CommitDetailsPage: setRoute(
|
CommitDetailsPage: setRoute(
|
||||||
"/secret-manager/$projectId/commits/$environment/$folderId/$commitId",
|
"/projects/$projectId/secret-manager/commits/$environment/$folderId/$commitId",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/commits/$environment/$folderId/$commitId"
|
||||||
),
|
),
|
||||||
CommitsPage: setRoute(
|
CommitsPage: setRoute(
|
||||||
"/secret-manager/$projectId/commits/$environment/$folderId",
|
"/projects/$projectId/secret-manager/commits/$environment/$folderId",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/commits/$environment/$folderId"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/commits/$environment/$folderId"
|
||||||
),
|
),
|
||||||
OverviewPage: setRoute(
|
OverviewPage: setRoute(
|
||||||
"/secret-manager/$projectId/overview",
|
"/projects/$projectId/secret-manager/overview",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/overview"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/overview"
|
||||||
),
|
),
|
||||||
IntegrationsListPage: setRoute(
|
IntegrationsListPage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations",
|
"/projects/$projectId/secret-manager/integrations",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/"
|
||||||
),
|
),
|
||||||
IntegrationDetailsByIDPage: setRoute(
|
IntegrationDetailsByIDPage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/$integrationId",
|
"/projects/$projectId/secret-manager/integrations/$integrationId",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/$integrationId"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/$integrationId"
|
||||||
),
|
),
|
||||||
SecretSyncDetailsByIDPage: setRoute(
|
SecretSyncDetailsByIDPage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/secret-syncs/$destination/$syncId",
|
"/projects/$projectId/secret-manager/integrations/secret-syncs/$destination/$syncId",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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"
|
||||||
),
|
),
|
||||||
Integratons: {
|
Integratons: {
|
||||||
SelectIntegrationAuth: setRoute(
|
SelectIntegrationAuth: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/select-integration-auth",
|
"/projects/$projectId/secret-manager/integrations/select-integration-auth",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/select-integration-auth"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/select-integration-auth"
|
||||||
),
|
),
|
||||||
HerokuOauthCallbackPage: setRoute(
|
HerokuOauthCallbackPage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/heroku/oauth2/callback",
|
"/projects/$projectId/secret-manager/integrations/heroku/oauth2/callback",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/heroku/oauth2/callback"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/heroku/oauth2/callback"
|
||||||
),
|
),
|
||||||
HerokuConfigurePage: setRoute(
|
HerokuConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/heroku/create",
|
"/projects/$projectId/secret-manager/integrations/heroku/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/heroku/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/heroku/create"
|
||||||
),
|
),
|
||||||
AwsParameterStoreConfigurePage: setRoute(
|
AwsParameterStoreConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/aws-parameter-store/create",
|
"/projects/$projectId/secret-manager/integrations/aws-parameter-store/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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"
|
||||||
),
|
),
|
||||||
AwsSecretManagerConfigurePage: setRoute(
|
AwsSecretManagerConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/aws-secret-manager/create",
|
"/projects/$projectId/secret-manager/integrations/aws-secret-manager/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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"
|
||||||
),
|
),
|
||||||
AzureAppConfigurationsOauthCallbackPage: setRoute(
|
AzureAppConfigurationsOauthCallbackPage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/azure-app-configuration/oauth2/callback",
|
"/projects/$projectId/secret-manager/integrations/azure-app-configuration/oauth2/callback",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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"
|
||||||
),
|
),
|
||||||
AzureAppConfigurationsConfigurePage: setRoute(
|
AzureAppConfigurationsConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/azure-app-configuration/create",
|
"/projects/$projectId/secret-manager/integrations/azure-app-configuration/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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"
|
||||||
),
|
),
|
||||||
AzureDevopsConfigurePage: setRoute(
|
AzureDevopsConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/azure-devops/create",
|
"/projects/$projectId/secret-manager/integrations/azure-devops/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/azure-devops/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-devops/create"
|
||||||
),
|
),
|
||||||
AzureKeyVaultAuthorizePage: setRoute(
|
AzureKeyVaultAuthorizePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/azure-key-vault/authorize",
|
"/projects/$projectId/secret-manager/integrations/azure-key-vault/authorize",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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"
|
||||||
),
|
),
|
||||||
AzureKeyVaultOauthCallbackPage: setRoute(
|
AzureKeyVaultOauthCallbackPage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/azure-key-vault/oauth2/callback",
|
"/projects/$projectId/secret-manager/integrations/azure-key-vault/oauth2/callback",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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"
|
||||||
),
|
),
|
||||||
AzureKeyVaultConfigurePage: setRoute(
|
AzureKeyVaultConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/azure-key-vault/create",
|
"/projects/$projectId/secret-manager/integrations/azure-key-vault/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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"
|
||||||
),
|
),
|
||||||
BitbucketOauthCallbackPage: setRoute(
|
BitbucketOauthCallbackPage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/bitbucket/oauth2/callback",
|
"/projects/$projectId/secret-manager/integrations/bitbucket/oauth2/callback",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/bitbucket/oauth2/callback"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/bitbucket/oauth2/callback"
|
||||||
),
|
),
|
||||||
BitbucketConfigurePage: setRoute(
|
BitbucketConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/bitbucket/create",
|
"/projects/$projectId/secret-manager/integrations/bitbucket/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/bitbucket/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/bitbucket/create"
|
||||||
),
|
),
|
||||||
ChecklyConfigurePage: setRoute(
|
ChecklyConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/checkly/create",
|
"/projects/$projectId/secret-manager/integrations/checkly/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/checkly/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/checkly/create"
|
||||||
),
|
),
|
||||||
CircleConfigurePage: setRoute(
|
CircleConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/circleci/create",
|
"/projects/$projectId/secret-manager/integrations/circleci/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/circleci/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/circleci/create"
|
||||||
),
|
),
|
||||||
CloudflarePagesConfigurePage: setRoute(
|
CloudflarePagesConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/cloudflare-pages/create",
|
"/projects/$projectId/secret-manager/integrations/cloudflare-pages/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/cloudflare-pages/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloudflare-pages/create"
|
||||||
),
|
),
|
||||||
DigitalOceanAppPlatformConfigurePage: setRoute(
|
DigitalOceanAppPlatformConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/digital-ocean-app-platform/create",
|
"/projects/$projectId/secret-manager/integrations/digital-ocean-app-platform/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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"
|
||||||
),
|
),
|
||||||
CloudflareWorkersConfigurePage: setRoute(
|
CloudflareWorkersConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/cloudflare-workers/create",
|
"/projects/$projectId/secret-manager/integrations/cloudflare-workers/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/cloudflare-workers/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloudflare-workers/create"
|
||||||
),
|
),
|
||||||
CodefreshConfigurePage: setRoute(
|
CodefreshConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/codefresh/create",
|
"/projects/$projectId/secret-manager/integrations/codefresh/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/codefresh/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/codefresh/create"
|
||||||
),
|
),
|
||||||
GcpSecretManagerConfigurePage: setRoute(
|
GcpSecretManagerConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/gcp-secret-manager/create",
|
"/projects/$projectId/secret-manager/integrations/gcp-secret-manager/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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"
|
||||||
),
|
),
|
||||||
GcpSecretManagerOauthCallbackPage: setRoute(
|
GcpSecretManagerOauthCallbackPage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/gcp-secret-manager/oauth2/callback",
|
"/projects/$projectId/secret-manager/integrations/gcp-secret-manager/oauth2/callback",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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"
|
||||||
),
|
),
|
||||||
GithubConfigurePage: setRoute(
|
GithubConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/github/create",
|
"/projects/$projectId/secret-manager/integrations/github/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/github/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/github/create"
|
||||||
),
|
),
|
||||||
GithubOauthCallbackPage: setRoute(
|
GithubOauthCallbackPage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/github/oauth2/callback",
|
"/projects/$projectId/secret-manager/integrations/github/oauth2/callback",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/github/oauth2/callback"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/github/oauth2/callback"
|
||||||
),
|
),
|
||||||
GitlabConfigurePage: setRoute(
|
GitlabConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/gitlab/create",
|
"/projects/$projectId/secret-manager/integrations/gitlab/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/gitlab/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/gitlab/create"
|
||||||
),
|
),
|
||||||
GitlabOauthCallbackPage: setRoute(
|
GitlabOauthCallbackPage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/gitlab/oauth2/callback",
|
"/projects/$projectId/secret-manager/integrations/gitlab/oauth2/callback",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/gitlab/oauth2/callback"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/gitlab/oauth2/callback"
|
||||||
),
|
),
|
||||||
VercelOauthCallbackPage: setRoute(
|
VercelOauthCallbackPage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/vercel/oauth2/callback",
|
"/projects/$projectId/secret-manager/integrations/vercel/oauth2/callback",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/vercel/oauth2/callback"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/vercel/oauth2/callback"
|
||||||
),
|
),
|
||||||
VercelConfigurePage: setRoute(
|
VercelConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/vercel/create",
|
"/projects/$projectId/secret-manager/integrations/vercel/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/vercel/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/vercel/create"
|
||||||
),
|
),
|
||||||
FlyioConfigurePage: setRoute(
|
FlyioConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/flyio/create",
|
"/projects/$projectId/secret-manager/integrations/flyio/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/flyio/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/flyio/create"
|
||||||
),
|
),
|
||||||
HashicorpVaultConfigurePage: setRoute(
|
HashicorpVaultConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/hashicorp-vault/create",
|
"/projects/$projectId/secret-manager/integrations/hashicorp-vault/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/hashicorp-vault/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/hashicorp-vault/create"
|
||||||
),
|
),
|
||||||
HasuraCloudConfigurePage: setRoute(
|
HasuraCloudConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/hasura-cloud/create",
|
"/projects/$projectId/secret-manager/integrations/hasura-cloud/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/hasura-cloud/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/hasura-cloud/create"
|
||||||
),
|
),
|
||||||
LaravelForgeConfigurePage: setRoute(
|
LaravelForgeConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/laravel-forge/create",
|
"/projects/$projectId/secret-manager/integrations/laravel-forge/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/laravel-forge/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/laravel-forge/create"
|
||||||
),
|
),
|
||||||
NorthflankConfigurePage: setRoute(
|
NorthflankConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/northflank/create",
|
"/projects/$projectId/secret-manager/integrations/northflank/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/northflank/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/northflank/create"
|
||||||
),
|
),
|
||||||
RailwayConfigurePage: setRoute(
|
RailwayConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/railway/create",
|
"/projects/$projectId/secret-manager/integrations/railway/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/railway/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/railway/create"
|
||||||
),
|
),
|
||||||
RenderConfigurePage: setRoute(
|
RenderConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/render/create",
|
"/projects/$projectId/secret-manager/integrations/render/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/render/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/render/create"
|
||||||
),
|
),
|
||||||
RundeckConfigurePage: setRoute(
|
RundeckConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/rundeck/create",
|
"/projects/$projectId/secret-manager/integrations/rundeck/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/rundeck/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/rundeck/create"
|
||||||
),
|
),
|
||||||
WindmillConfigurePage: setRoute(
|
WindmillConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/windmill/create",
|
"/projects/$projectId/secret-manager/integrations/windmill/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/windmill/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/windmill/create"
|
||||||
),
|
),
|
||||||
TravisCIConfigurePage: setRoute(
|
TravisCIConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/travisci/create",
|
"/projects/$projectId/secret-manager/integrations/travisci/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/travisci/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/travisci/create"
|
||||||
),
|
),
|
||||||
TerraformCloudConfigurePage: setRoute(
|
TerraformCloudConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/terraform-cloud/create",
|
"/projects/$projectId/secret-manager/integrations/terraform-cloud/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/terraform-cloud/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/terraform-cloud/create"
|
||||||
),
|
),
|
||||||
TeamcityConfigurePage: setRoute(
|
TeamcityConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/teamcity/create",
|
"/projects/$projectId/secret-manager/integrations/teamcity/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/teamcity/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/teamcity/create"
|
||||||
),
|
),
|
||||||
SupabaseConfigurePage: setRoute(
|
SupabaseConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/supabase/create",
|
"/projects/$projectId/secret-manager/integrations/supabase/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/supabase/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/supabase/create"
|
||||||
),
|
),
|
||||||
OctopusDeployCloudConfigurePage: setRoute(
|
OctopusDeployCloudConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/octopus-deploy/create",
|
"/projects/$projectId/secret-manager/integrations/octopus-deploy/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/octopus-deploy/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/octopus-deploy/create"
|
||||||
),
|
),
|
||||||
DatabricksConfigurePage: setRoute(
|
DatabricksConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/databricks/create",
|
"/projects/$projectId/secret-manager/integrations/databricks/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/databricks/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/databricks/create"
|
||||||
),
|
),
|
||||||
QoveryConfigurePage: setRoute(
|
QoveryConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/qovery/create",
|
"/projects/$projectId/secret-manager/integrations/qovery/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/qovery/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/qovery/create"
|
||||||
),
|
),
|
||||||
Cloud66ConfigurePage: setRoute(
|
Cloud66ConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/cloud-66/create",
|
"/projects/$projectId/secret-manager/integrations/cloud-66/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/cloud-66/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloud-66/create"
|
||||||
),
|
),
|
||||||
NetlifyConfigurePage: setRoute(
|
NetlifyConfigurePage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/netlify/create",
|
"/projects/$projectId/secret-manager/integrations/netlify/create",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/netlify/create"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/netlify/create"
|
||||||
),
|
),
|
||||||
NetlifyOuathCallbackPage: setRoute(
|
NetlifyOuathCallbackPage: setRoute(
|
||||||
"/secret-manager/$projectId/integrations/netlify/oauth2/callback",
|
"/projects/$projectId/secret-manager/integrations/netlify/oauth2/callback",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/netlify/oauth2/callback"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/netlify/oauth2/callback"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
CertManager: {
|
CertManager: {
|
||||||
CertAuthDetailsByIDPage: setRoute(
|
CertAuthDetailsByIDPage: setRoute(
|
||||||
"/cert-manager/$projectId/ca/$caName",
|
"/projects/$projectId/cert-manager/ca/$caName",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/cert-manager/$projectId/_cert-manager-layout/ca/$caName"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/ca/$caName"
|
||||||
),
|
),
|
||||||
SubscribersPage: setRoute(
|
SubscribersPage: setRoute(
|
||||||
"/cert-manager/$projectId/subscribers",
|
"/projects/$projectId/cert-manager/subscribers",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/cert-manager/$projectId/_cert-manager-layout/subscribers"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/subscribers"
|
||||||
),
|
),
|
||||||
CertificatesPage: setRoute(
|
CertificatesPage: setRoute(
|
||||||
"/cert-manager/$projectId/certificates",
|
"/projects/$projectId/cert-manager/certificates",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/cert-manager/$projectId/_cert-manager-layout/certificates"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/certificates"
|
||||||
),
|
),
|
||||||
CertificateAuthoritiesPage: setRoute(
|
CertificateAuthoritiesPage: setRoute(
|
||||||
"/cert-manager/$projectId/certificate-authorities",
|
"/projects/$projectId/cert-manager/certificate-authorities",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/cert-manager/$projectId/_cert-manager-layout/certificate-authorities"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/certificate-authorities"
|
||||||
),
|
),
|
||||||
AlertingPage: setRoute(
|
AlertingPage: setRoute(
|
||||||
"/cert-manager/$projectId/alerting",
|
"/projects/$projectId/cert-manager/alerting",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/cert-manager/$projectId/_cert-manager-layout/alerting"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/alerting"
|
||||||
),
|
),
|
||||||
PkiCollectionDetailsByIDPage: setRoute(
|
PkiCollectionDetailsByIDPage: setRoute(
|
||||||
"/cert-manager/$projectId/pki-collections/$collectionId",
|
"/projects/$projectId/cert-manager/pki-collections/$collectionId",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/cert-manager/$projectId/_cert-manager-layout/pki-collections/$collectionId"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/pki-collections/$collectionId"
|
||||||
),
|
),
|
||||||
PkiSubscriberDetailsByIDPage: setRoute(
|
PkiSubscriberDetailsByIDPage: setRoute(
|
||||||
"/cert-manager/$projectId/subscribers/$subscriberName",
|
"/projects/$projectId/cert-manager/subscribers/$subscriberName",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/cert-manager/$projectId/_cert-manager-layout/subscribers/$subscriberName"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/subscribers/$subscriberName"
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
Ssh: {
|
Ssh: {
|
||||||
SshCaByIDPage: setRoute(
|
SshCaByIDPage: setRoute(
|
||||||
"/ssh/$projectId/ca/$caId",
|
"/projects/$projectId/ssh/ca/$caId",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/ssh/$projectId/_ssh-layout/ca/$caId"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/ssh/_ssh-layout/ca/$caId"
|
||||||
),
|
),
|
||||||
SshHostGroupDetailsByIDPage: setRoute(
|
SshHostGroupDetailsByIDPage: setRoute(
|
||||||
"/ssh/$projectId/ssh-host-groups/$sshHostGroupId",
|
"/projects/$projectId/ssh/ssh-host-groups/$sshHostGroupId",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/ssh/$projectId/_ssh-layout/ssh-host-groups/$sshHostGroupId"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/ssh/_ssh-layout/ssh-host-groups/$sshHostGroupId"
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
SecretScanning: {
|
SecretScanning: {
|
||||||
DataSourceByIdPage: setRoute(
|
DataSourceByIdPage: setRoute(
|
||||||
"/secret-scanning/$projectId/data-sources/$type/$dataSourceId",
|
"/projects/$projectId/secret-scanning/data-sources/$type/$dataSourceId",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-scanning/$projectId/_secret-scanning-layout/data-sources/$type/$dataSourceId"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-scanning/_secret-scanning-layout/data-sources/$type/$dataSourceId"
|
||||||
),
|
),
|
||||||
FindingsPage: setRoute(
|
FindingsPage: setRoute(
|
||||||
"/secret-scanning/$projectId/findings",
|
"/projects/$projectId/secret-scanning/findings",
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-scanning/$projectId/_secret-scanning-layout/findings"
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-scanning/_secret-scanning-layout/findings"
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
Public: {
|
Public: {
|
||||||
|
|||||||
@@ -59,14 +59,14 @@ export const initProjectHelper = async ({ projectName }: { projectName: string }
|
|||||||
|
|
||||||
return project;
|
return project;
|
||||||
};
|
};
|
||||||
export const getProjectHomePage = (workspace: Workspace) => {
|
export const getProjectHomePage = (type: ProjectType) => {
|
||||||
switch (workspace.type) {
|
switch (type) {
|
||||||
case ProjectType.CertificateManager:
|
case ProjectType.CertificateManager:
|
||||||
return `/${workspace.type}/$projectId/subscribers` as const;
|
return `/projects/$projectId/${type}/subscribers` as const;
|
||||||
case ProjectType.SecretScanning:
|
case ProjectType.SecretScanning:
|
||||||
return `/${workspace.type}/$projectId/data-sources` as const;
|
return `/projects/$projectId/${type}/data-sources` as const;
|
||||||
default:
|
default:
|
||||||
return `/${workspace.type}/$projectId/overview` as const;
|
return `/projects/$projectId/${type}/overview` as const;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -80,3 +80,8 @@ 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;
|
||||||
|
};
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ export type Workspace = {
|
|||||||
__v: number;
|
__v: number;
|
||||||
id: string;
|
id: string;
|
||||||
name: string;
|
name: string;
|
||||||
type: ProjectType;
|
defaultType: ProjectType;
|
||||||
description?: string;
|
description?: string;
|
||||||
orgId: string;
|
orgId: string;
|
||||||
version: ProjectVersion;
|
version: ProjectVersion;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { faMobile } from "@fortawesome/free-solid-svg-icons";
|
import { faMobile } from "@fortawesome/free-solid-svg-icons";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
import { Outlet } from "@tanstack/react-router";
|
import { Outlet, useLocation, useParams, useSearch } from "@tanstack/react-router";
|
||||||
|
|
||||||
import { CreateOrgModal } from "@app/components/organization/CreateOrgModal";
|
import { CreateOrgModal } from "@app/components/organization/CreateOrgModal";
|
||||||
import { Banner } from "@app/components/page-frames/Banner";
|
import { Banner } from "@app/components/page-frames/Banner";
|
||||||
@@ -12,10 +12,17 @@ import { usePopUp } from "@app/hooks";
|
|||||||
import { InsecureConnectionBanner } from "./components/InsecureConnectionBanner";
|
import { InsecureConnectionBanner } from "./components/InsecureConnectionBanner";
|
||||||
import { OrgSidebar } from "./components/OrgSidebar";
|
import { OrgSidebar } from "./components/OrgSidebar";
|
||||||
import { Navbar } from "./components/NavBar";
|
import { Navbar } from "./components/NavBar";
|
||||||
|
import { twMerge } from "tailwind-merge";
|
||||||
|
|
||||||
export const OrganizationLayout = () => {
|
export const OrganizationLayout = () => {
|
||||||
const { config } = useServerConfig();
|
const { config } = useServerConfig();
|
||||||
const { permission } = useOrgPermission();
|
const { permission } = useOrgPermission();
|
||||||
|
const projectId = useParams({
|
||||||
|
strict: false,
|
||||||
|
select: (el) => el?.projectId
|
||||||
|
});
|
||||||
|
const isInsideProject = Boolean(projectId);
|
||||||
|
console.log(isInsideProject);
|
||||||
|
|
||||||
const shouldShowProductsSidebar = permission.can(
|
const shouldShowProductsSidebar = permission.can(
|
||||||
OrgPermissionSecretShareAction.ManageSettings,
|
OrgPermissionSecretShareAction.ManageSettings,
|
||||||
@@ -37,8 +44,13 @@ export const OrganizationLayout = () => {
|
|||||||
<Navbar />
|
<Navbar />
|
||||||
{!window.isSecureContext && <InsecureConnectionBanner />}
|
{!window.isSecureContext && <InsecureConnectionBanner />}
|
||||||
<div className="flex flex-grow flex-col overflow-y-hidden md:flex-row">
|
<div className="flex flex-grow flex-col overflow-y-hidden md:flex-row">
|
||||||
<OrgSidebar />
|
<OrgSidebar isHidden={isInsideProject} />
|
||||||
<main className="flex-1 overflow-y-auto overflow-x-hidden bg-bunker-800 px-4 py-4 dark:[color-scheme:dark]">
|
<main
|
||||||
|
className={twMerge(
|
||||||
|
"flex-1 overflow-y-auto overflow-x-hidden bg-bunker-800 px-4 py-4 dark:[color-scheme:dark]",
|
||||||
|
isInsideProject && "p-0"
|
||||||
|
)}
|
||||||
|
>
|
||||||
<Outlet />
|
<Outlet />
|
||||||
</main>
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import {
|
|||||||
faArrowUpRightFromSquare,
|
faArrowUpRightFromSquare,
|
||||||
faBook,
|
faBook,
|
||||||
faCheck,
|
faCheck,
|
||||||
|
faCubes,
|
||||||
faEnvelope,
|
faEnvelope,
|
||||||
faInfo,
|
faInfo,
|
||||||
faSignOut,
|
faSignOut,
|
||||||
@@ -26,6 +27,7 @@ import {
|
|||||||
DropdownMenuContent,
|
DropdownMenuContent,
|
||||||
DropdownMenuItem,
|
DropdownMenuItem,
|
||||||
DropdownMenuTrigger,
|
DropdownMenuTrigger,
|
||||||
|
IconButton,
|
||||||
Lottie,
|
Lottie,
|
||||||
TBreadcrumbFormat
|
TBreadcrumbFormat
|
||||||
} from "@app/components/v2";
|
} from "@app/components/v2";
|
||||||
@@ -151,13 +153,28 @@ export const Navbar = () => {
|
|||||||
style={{ fontSize: "10px" }}
|
style={{ fontSize: "10px" }}
|
||||||
/>
|
/>
|
||||||
<DropdownMenu modal={false}>
|
<DropdownMenu modal={false}>
|
||||||
<DropdownMenuTrigger asChild>
|
<Link to="/organization/projects">
|
||||||
<div className="flex cursor-pointer items-center gap-2 text-sm text-white">
|
<div className="flex cursor-pointer items-center gap-2 text-sm text-white">
|
||||||
|
<div>
|
||||||
|
<FontAwesomeIcon icon={faCubes} className="text-xs" />
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="max-w-32 overflow-hidden text-ellipsis">{currentOrg?.name}</div>
|
<div className="max-w-32 overflow-hidden text-ellipsis">{currentOrg?.name}</div>
|
||||||
<div className="rounded border border-mineshaft-500 p-1 text-xs text-bunker-300">
|
<div className="rounded border border-mineshaft-500 p-1 text-xs text-bunker-300">
|
||||||
{getPlan(subscription)}
|
{getPlan(subscription)}
|
||||||
</div>
|
</div>
|
||||||
<FontAwesomeIcon icon={faSort} className="text-xs text-bunker-300" />
|
</div>
|
||||||
|
</Link>
|
||||||
|
<DropdownMenuTrigger asChild>
|
||||||
|
<div>
|
||||||
|
<IconButton
|
||||||
|
variant="plain"
|
||||||
|
colorSchema="secondary"
|
||||||
|
ariaLabel="switch-org"
|
||||||
|
className="px-2 py-1"
|
||||||
|
>
|
||||||
|
<FontAwesomeIcon icon={faSort} className="text-xs text-bunker-300" />
|
||||||
|
</IconButton>
|
||||||
</div>
|
</div>
|
||||||
</DropdownMenuTrigger>
|
</DropdownMenuTrigger>
|
||||||
<DropdownMenuContent
|
<DropdownMenuContent
|
||||||
|
|||||||
@@ -20,8 +20,13 @@ import { usePopUp } from "@app/hooks";
|
|||||||
import { useGetOrgTrialUrl } from "@app/hooks/api";
|
import { useGetOrgTrialUrl } from "@app/hooks/api";
|
||||||
|
|
||||||
import { ServerAdminsPanel } from "../ServerAdminsPanel/ServerAdminsPanel";
|
import { ServerAdminsPanel } from "../ServerAdminsPanel/ServerAdminsPanel";
|
||||||
|
import { AnimatePresence, motion } from "framer-motion";
|
||||||
|
|
||||||
export const OrgSidebar = () => {
|
type Props = {
|
||||||
|
isHidden?: boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const OrgSidebar = ({ isHidden }: Props) => {
|
||||||
const { subscription } = useSubscription();
|
const { subscription } = useSubscription();
|
||||||
const [showAdminsModal, setShowAdminsModal] = useState(false);
|
const [showAdminsModal, setShowAdminsModal] = useState(false);
|
||||||
|
|
||||||
@@ -34,158 +39,175 @@ export const OrgSidebar = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<aside className="dark z-10 w-60 border-r border-mineshaft-600 bg-gradient-to-tr from-mineshaft-700 via-mineshaft-800 to-mineshaft-900 transition-all duration-150">
|
<AnimatePresence mode="popLayout">
|
||||||
<nav className="items-between flex h-full flex-col justify-between overflow-y-auto dark:[color-scheme:dark]">
|
{!isHidden && (
|
||||||
<Menu>
|
<motion.aside
|
||||||
<MenuGroup title="Overview">
|
key="org-sidebar"
|
||||||
<Link to="/organization/projects">
|
transition={{ duration: 0.3 }}
|
||||||
{({ isActive }) => (
|
initial={{ opacity: 0, translateX: -240 }}
|
||||||
<MenuItem isSelected={isActive} icon="notification-bell">
|
animate={{ opacity: 1, translateX: 0 }}
|
||||||
Projects
|
exit={{ opacity: 0, translateX: -240 }}
|
||||||
</MenuItem>
|
layout
|
||||||
)}
|
className="dark z-10 w-60 border-r border-mineshaft-600 bg-gradient-to-tr from-mineshaft-700 via-mineshaft-800 to-mineshaft-900"
|
||||||
</Link>
|
|
||||||
<Link to="/organization/access-management">
|
|
||||||
{({ isActive }) => (
|
|
||||||
<MenuItem isSelected={isActive}>
|
|
||||||
<div className="mx-1">
|
|
||||||
<FontAwesomeIcon icon={faUsers} className="mr-4" />
|
|
||||||
Access Control
|
|
||||||
</div>
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
</Link>
|
|
||||||
<Link to="/organization/billing">
|
|
||||||
{({ isActive }) => (
|
|
||||||
<MenuItem isSelected={isActive}>
|
|
||||||
<div className="mx-1">
|
|
||||||
<FontAwesomeIcon icon={faMoneyBill} className="mr-4" />
|
|
||||||
Usage & Billing
|
|
||||||
</div>
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
</Link>
|
|
||||||
<Link to="/organization/audit-logs">
|
|
||||||
{({ isActive }) => (
|
|
||||||
<MenuItem isSelected={isActive}>
|
|
||||||
<div className="mx-1">
|
|
||||||
<FontAwesomeIcon icon={faBook} className="mr-4" />
|
|
||||||
Audit Logs
|
|
||||||
</div>
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
</Link>
|
|
||||||
<Link to="/organization/sso">
|
|
||||||
{({ isActive }) => (
|
|
||||||
<MenuItem isSelected={isActive}>
|
|
||||||
<div className="mx-1">
|
|
||||||
<FontAwesomeIcon icon={faCheckCircle} className="mr-4" />
|
|
||||||
SSO Settings
|
|
||||||
</div>
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
</Link>
|
|
||||||
<Link to="/organization/settings">
|
|
||||||
{({ isActive }) => (
|
|
||||||
<MenuItem isSelected={isActive}>
|
|
||||||
<div className="mx-1">
|
|
||||||
<FontAwesomeIcon icon={faCog} className="mr-4" />
|
|
||||||
Organization Settings
|
|
||||||
</div>
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
</Link>
|
|
||||||
</MenuGroup>
|
|
||||||
<MenuGroup title="Resources">
|
|
||||||
<Link to="/organization/app-connections">
|
|
||||||
{({ isActive }) => (
|
|
||||||
<MenuItem isSelected={isActive}>
|
|
||||||
<div className="mx-1">
|
|
||||||
<FontAwesomeIcon icon={faPlug} className="mr-4" />
|
|
||||||
App Connections
|
|
||||||
</div>
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
</Link>
|
|
||||||
<Link to="/organization/gateways">
|
|
||||||
{({ isActive }) => (
|
|
||||||
<MenuItem isSelected={isActive}>
|
|
||||||
<div className="mx-1">
|
|
||||||
<FontAwesomeIcon icon={faDoorClosed} className="mr-4" />
|
|
||||||
Gateways
|
|
||||||
</div>
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
</Link>
|
|
||||||
</MenuGroup>
|
|
||||||
<MenuGroup title="Admin Panels">
|
|
||||||
{user?.superAdmin && (
|
|
||||||
<Link to="/admin">
|
|
||||||
{({ isActive }) => (
|
|
||||||
<MenuItem isSelected={isActive}>
|
|
||||||
<div className="mx-1">
|
|
||||||
<FontAwesomeIcon icon={faUserCog} className="mr-4" />
|
|
||||||
Server Admin Console
|
|
||||||
</div>
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
</Link>
|
|
||||||
)}
|
|
||||||
<Link to="/organization/admin">
|
|
||||||
{({ isActive }) => (
|
|
||||||
<MenuItem isSelected={isActive}>
|
|
||||||
<div className="mx-1">
|
|
||||||
<FontAwesomeIcon icon={faCog} className="mr-4" />
|
|
||||||
Org Admin Console
|
|
||||||
</div>
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
</Link>
|
|
||||||
</MenuGroup>
|
|
||||||
<MenuGroup title="Others">
|
|
||||||
<Link to="/organization/secret-sharing">
|
|
||||||
{({ isActive }) => (
|
|
||||||
<MenuItem isSelected={isActive} icon="lock-closed">
|
|
||||||
Share Secret
|
|
||||||
</MenuItem>
|
|
||||||
)}
|
|
||||||
</Link>
|
|
||||||
</MenuGroup>
|
|
||||||
</Menu>
|
|
||||||
<div
|
|
||||||
className={`relative mt-10 ${
|
|
||||||
subscription && subscription.slug === "starter" && !subscription.has_used_trial
|
|
||||||
? "mb-2"
|
|
||||||
: "mb-4"
|
|
||||||
} flex w-full cursor-default flex-col items-center px-1 text-sm text-mineshaft-400`}
|
|
||||||
>
|
>
|
||||||
{subscription && subscription.slug === "starter" && !subscription.has_used_trial && (
|
<nav className="items-between flex h-full flex-col justify-between overflow-y-auto dark:[color-scheme:dark]">
|
||||||
<Tooltip content="Start Free Pro Trial" side="right">
|
<Menu>
|
||||||
<button
|
<MenuGroup title="Overview">
|
||||||
type="button"
|
<Link to="/organization/projects">
|
||||||
onClick={async () => {
|
{({ isActive }) => (
|
||||||
if (!subscription || !currentOrg) return;
|
<MenuItem isSelected={isActive} icon="notification-bell">
|
||||||
|
Projects
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
<Link to="/organization/access-management">
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive}>
|
||||||
|
<div className="mx-1">
|
||||||
|
<FontAwesomeIcon icon={faUsers} className="mr-4" />
|
||||||
|
Access Control
|
||||||
|
</div>
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
<Link to="/organization/billing">
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive}>
|
||||||
|
<div className="mx-1">
|
||||||
|
<FontAwesomeIcon icon={faMoneyBill} className="mr-4" />
|
||||||
|
Usage & Billing
|
||||||
|
</div>
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
<Link to="/organization/audit-logs">
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive}>
|
||||||
|
<div className="mx-1">
|
||||||
|
<FontAwesomeIcon icon={faBook} className="mr-4" />
|
||||||
|
Audit Logs
|
||||||
|
</div>
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
<Link to="/organization/sso">
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive}>
|
||||||
|
<div className="mx-1">
|
||||||
|
<FontAwesomeIcon icon={faCheckCircle} className="mr-4" />
|
||||||
|
SSO Settings
|
||||||
|
</div>
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
<Link to="/organization/settings">
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive}>
|
||||||
|
<div className="mx-1">
|
||||||
|
<FontAwesomeIcon icon={faCog} className="mr-4" />
|
||||||
|
Organization Settings
|
||||||
|
</div>
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
</MenuGroup>
|
||||||
|
<MenuGroup title="Resources">
|
||||||
|
<Link to="/organization/app-connections">
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive}>
|
||||||
|
<div className="mx-1">
|
||||||
|
<FontAwesomeIcon icon={faPlug} className="mr-4" />
|
||||||
|
App Connections
|
||||||
|
</div>
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
<Link to="/organization/gateways">
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive}>
|
||||||
|
<div className="mx-1">
|
||||||
|
<FontAwesomeIcon icon={faDoorClosed} className="mr-4" />
|
||||||
|
Gateways
|
||||||
|
</div>
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
</MenuGroup>
|
||||||
|
<MenuGroup title="Admin Panels">
|
||||||
|
{user?.superAdmin && (
|
||||||
|
<Link to="/admin">
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive}>
|
||||||
|
<div className="mx-1">
|
||||||
|
<FontAwesomeIcon icon={faUserCog} className="mr-4" />
|
||||||
|
Server Admin Console
|
||||||
|
</div>
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
<Link to="/organization/admin">
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive}>
|
||||||
|
<div className="mx-1">
|
||||||
|
<FontAwesomeIcon icon={faCog} className="mr-4" />
|
||||||
|
Org Admin Console
|
||||||
|
</div>
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
</MenuGroup>
|
||||||
|
<MenuGroup title="Others">
|
||||||
|
<Link to="/organization/secret-sharing">
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="lock-closed">
|
||||||
|
Share Secret
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
</MenuGroup>
|
||||||
|
</Menu>
|
||||||
|
<div
|
||||||
|
className={`relative mt-10 ${
|
||||||
|
subscription && subscription.slug === "starter" && !subscription.has_used_trial
|
||||||
|
? "mb-2"
|
||||||
|
: "mb-4"
|
||||||
|
} flex w-full cursor-default flex-col items-center px-1 text-sm text-mineshaft-400`}
|
||||||
|
>
|
||||||
|
{subscription &&
|
||||||
|
subscription.slug === "starter" &&
|
||||||
|
!subscription.has_used_trial && (
|
||||||
|
<Tooltip content="Start Free Pro Trial" side="right">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={async () => {
|
||||||
|
if (!subscription || !currentOrg) return;
|
||||||
|
|
||||||
// direct user to start pro trial
|
// direct user to start pro trial
|
||||||
const url = await mutateAsync({
|
const url = await mutateAsync({
|
||||||
orgId: currentOrg.id,
|
orgId: currentOrg.id,
|
||||||
success_url: window.location.href
|
success_url: window.location.href
|
||||||
});
|
});
|
||||||
|
|
||||||
window.location.href = url;
|
window.location.href = url;
|
||||||
}}
|
}}
|
||||||
className="mt-1.5 w-full"
|
className="mt-1.5 w-full"
|
||||||
>
|
>
|
||||||
<div className="justify-left mb-1.5 mt-1.5 flex w-full flex-col items-center rounded-md p-1 text-xs text-mineshaft-300 transition-all duration-150 hover:bg-mineshaft-500 hover:text-primary-400">
|
<div className="justify-left mb-1.5 mt-1.5 flex w-full flex-col items-center rounded-md p-1 text-xs text-mineshaft-300 transition-all duration-150 hover:bg-mineshaft-500 hover:text-primary-400">
|
||||||
<FontAwesomeIcon icon={faInfinity} className="py-2 text-lg text-primary" />
|
<FontAwesomeIcon
|
||||||
Pro Trial
|
icon={faInfinity}
|
||||||
</div>
|
className="py-2 text-lg text-primary"
|
||||||
</button>
|
/>
|
||||||
</Tooltip>
|
Pro Trial
|
||||||
)}
|
</div>
|
||||||
</div>
|
</button>
|
||||||
</nav>
|
</Tooltip>
|
||||||
</aside>
|
)}
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</motion.aside>
|
||||||
|
)}
|
||||||
|
</AnimatePresence>
|
||||||
<Modal isOpen={showAdminsModal} onOpenChange={setShowAdminsModal}>
|
<Modal isOpen={showAdminsModal} onOpenChange={setShowAdminsModal}>
|
||||||
<ModalContent title="Server Administrators" subTitle="View all server administrators">
|
<ModalContent title="Server Administrators" subTitle="View all server administrators">
|
||||||
<div className="mb-2">
|
<div className="mb-2">
|
||||||
|
|||||||
@@ -0,0 +1,411 @@
|
|||||||
|
import { useTranslation } from "react-i18next";
|
||||||
|
import { faMobile } from "@fortawesome/free-solid-svg-icons";
|
||||||
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
|
import { Link, Outlet, useRouterState } from "@tanstack/react-router";
|
||||||
|
import { motion } from "framer-motion";
|
||||||
|
|
||||||
|
import { ProjectPermissionCan } from "@app/components/permissions";
|
||||||
|
import {
|
||||||
|
Badge,
|
||||||
|
BreadcrumbContainer,
|
||||||
|
Menu,
|
||||||
|
MenuGroup,
|
||||||
|
MenuItem,
|
||||||
|
TBreadcrumbFormat
|
||||||
|
} from "@app/components/v2";
|
||||||
|
import {
|
||||||
|
ProjectPermissionActions,
|
||||||
|
ProjectPermissionSub,
|
||||||
|
useProjectPermission,
|
||||||
|
useSubscription,
|
||||||
|
useWorkspace
|
||||||
|
} from "@app/context";
|
||||||
|
import { ProjectPermissionSecretScanningFindingActions } from "@app/context/ProjectPermissionContext/types";
|
||||||
|
import {
|
||||||
|
useGetAccessRequestsCount,
|
||||||
|
useGetSecretApprovalRequestCount,
|
||||||
|
useGetSecretRotations
|
||||||
|
} from "@app/hooks/api";
|
||||||
|
import { useGetSecretScanningUnresolvedFindingCount } from "@app/hooks/api/secretScanningV2";
|
||||||
|
import { ProjectType } from "@app/hooks/api/workspace/types";
|
||||||
|
|
||||||
|
import { AssumePrivilegeModeBanner } from "./components/AssumePrivilegeModeBanner";
|
||||||
|
import { ProjectSelect } from "./components/ProjectSelect";
|
||||||
|
|
||||||
|
// This is a generic layout shared by all types of projects.
|
||||||
|
// If the product layout differs significantly, create a new layout as needed.
|
||||||
|
export const ProjectLayout = () => {
|
||||||
|
const { currentWorkspace } = useWorkspace();
|
||||||
|
const matches = useRouterState({ select: (s) => s.matches.at(-1)?.context });
|
||||||
|
const breadcrumbs = matches && "breadcrumbs" in matches ? matches.breadcrumbs : undefined;
|
||||||
|
|
||||||
|
const { permission } = useProjectPermission();
|
||||||
|
|
||||||
|
const { t } = useTranslation();
|
||||||
|
const { assumedPrivilegeDetails } = useProjectPermission();
|
||||||
|
const workspaceId = currentWorkspace?.id || "";
|
||||||
|
const projectSlug = currentWorkspace?.slug || "";
|
||||||
|
const { subscription } = useSubscription();
|
||||||
|
|
||||||
|
const isSecretManager = currentWorkspace?.type === ProjectType.SecretManager;
|
||||||
|
const isCertManager = currentWorkspace?.type === ProjectType.CertificateManager;
|
||||||
|
const isCmek = currentWorkspace?.type === ProjectType.KMS;
|
||||||
|
const isSSH = currentWorkspace?.type === ProjectType.SSH;
|
||||||
|
const isSecretScanning = currentWorkspace?.type === ProjectType.SecretScanning;
|
||||||
|
|
||||||
|
const { data: secretApprovalReqCount } = useGetSecretApprovalRequestCount({
|
||||||
|
workspaceId,
|
||||||
|
options: { enabled: isSecretManager }
|
||||||
|
});
|
||||||
|
const { data: accessApprovalRequestCount } = useGetAccessRequestsCount({
|
||||||
|
projectSlug,
|
||||||
|
options: { enabled: isSecretManager }
|
||||||
|
});
|
||||||
|
|
||||||
|
// we only show the secret rotations v1 tab if they have existing rotations
|
||||||
|
const { data: secretRotations } = useGetSecretRotations({
|
||||||
|
workspaceId,
|
||||||
|
options: {
|
||||||
|
enabled: isSecretManager && Boolean(subscription.secretRotation),
|
||||||
|
refetchOnMount: false
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const pendingRequestsCount =
|
||||||
|
(secretApprovalReqCount?.open || 0) + (accessApprovalRequestCount?.pendingCount || 0);
|
||||||
|
|
||||||
|
const { data: unresolvedFindings } = useGetSecretScanningUnresolvedFindingCount(workspaceId, {
|
||||||
|
enabled:
|
||||||
|
isSecretScanning &&
|
||||||
|
subscription.secretScanning &&
|
||||||
|
permission.can(
|
||||||
|
ProjectPermissionSecretScanningFindingActions.Read,
|
||||||
|
ProjectPermissionSub.SecretScanningFindings
|
||||||
|
),
|
||||||
|
refetchInterval: 30000
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div className="dark hidden h-screen w-full flex-col overflow-x-hidden md:flex">
|
||||||
|
{assumedPrivilegeDetails && <AssumePrivilegeModeBanner />}
|
||||||
|
<div className="flex flex-grow flex-col overflow-y-hidden md:flex-row">
|
||||||
|
<motion.div
|
||||||
|
key="menu-project-items"
|
||||||
|
initial={{ x: -150 }}
|
||||||
|
animate={{ x: 0 }}
|
||||||
|
exit={{ x: -150 }}
|
||||||
|
transition={{ duration: 0.2 }}
|
||||||
|
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 justify-between overflow-y-auto dark:[color-scheme:dark]">
|
||||||
|
<div>
|
||||||
|
<ProjectSelect />
|
||||||
|
<div className="px-1">
|
||||||
|
<Menu>
|
||||||
|
<MenuGroup title="Main Menu">
|
||||||
|
{isSecretManager && (
|
||||||
|
<Link
|
||||||
|
to={`/${ProjectType.SecretManager}/$projectId/overview` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="lock-closed">
|
||||||
|
{t("nav.menu.secrets")}
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
{isCertManager && (
|
||||||
|
<>
|
||||||
|
<Link
|
||||||
|
to={
|
||||||
|
`/${ProjectType.CertificateManager}/$projectId/subscribers` as const
|
||||||
|
}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="pki-subscriber">
|
||||||
|
Subscribers
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
to={
|
||||||
|
`/${ProjectType.CertificateManager}/$projectId/certificate-templates` as const
|
||||||
|
}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem
|
||||||
|
iconMode="reverse"
|
||||||
|
isSelected={isActive}
|
||||||
|
icon="pki-template"
|
||||||
|
>
|
||||||
|
Certificate Templates
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
to={
|
||||||
|
`/${ProjectType.CertificateManager}/$projectId/certificates` as const
|
||||||
|
}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="certificate">
|
||||||
|
Certificates
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
to={
|
||||||
|
`/${ProjectType.CertificateManager}/$projectId/certificate-authorities` as const
|
||||||
|
}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="certificate-authority">
|
||||||
|
Certificate Authorities
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
to={`/${ProjectType.CertificateManager}/$projectId/alerting` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="notification-bell">
|
||||||
|
Alerting
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{isCmek && (
|
||||||
|
<Link
|
||||||
|
to={`/${ProjectType.KMS}/$projectId/overview` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="lock-closed">
|
||||||
|
Overview
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
{isCmek && (
|
||||||
|
<Link
|
||||||
|
to={`/${ProjectType.KMS}/$projectId/kmip` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="key-user" iconMode="reverse">
|
||||||
|
KMIP
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
{isSSH && (
|
||||||
|
<>
|
||||||
|
<Link
|
||||||
|
to={`/${ProjectType.SSH}/$projectId/overview` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="server">
|
||||||
|
Hosts
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
{/* <Link
|
||||||
|
to={`/${ProjectType.SSH}/$projectId/certificates` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="certificate" iconMode="reverse">
|
||||||
|
Certificates
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link> */}
|
||||||
|
<ProjectPermissionCan
|
||||||
|
I={ProjectPermissionActions.Read}
|
||||||
|
a={ProjectPermissionSub.SshCertificateAuthorities}
|
||||||
|
>
|
||||||
|
{(isAllowed) =>
|
||||||
|
isAllowed && (
|
||||||
|
<Link
|
||||||
|
to={`/${ProjectType.SSH}/$projectId/cas` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem
|
||||||
|
isSelected={isActive}
|
||||||
|
icon="certificate-authority"
|
||||||
|
iconMode="reverse"
|
||||||
|
>
|
||||||
|
Certificate Authorities
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</ProjectPermissionCan>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{isSecretScanning && (
|
||||||
|
<Link
|
||||||
|
to={`/${ProjectType.SecretScanning}/$projectId/data-sources` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="blocks">
|
||||||
|
Data Sources
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
{isSecretScanning && (
|
||||||
|
<Link
|
||||||
|
to={`/${ProjectType.SecretScanning}/$projectId/findings` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="search">
|
||||||
|
<div className="flex w-full items-center justify-between">
|
||||||
|
<span>Findings</span>
|
||||||
|
{Boolean(unresolvedFindings) && (
|
||||||
|
<Badge variant="primary" className="mr-2">
|
||||||
|
{unresolvedFindings}
|
||||||
|
</Badge>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
{isSecretManager && (
|
||||||
|
<Link
|
||||||
|
to={`/${ProjectType.SecretManager}/$projectId/integrations` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="jigsaw-puzzle">
|
||||||
|
{t("nav.menu.integrations")}
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
{isSecretManager && Boolean(secretRotations?.length) && (
|
||||||
|
<Link
|
||||||
|
to={`/${ProjectType.SecretManager}/$projectId/secret-rotation` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="rotation">
|
||||||
|
Secret Rotation
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
{isSecretManager && (
|
||||||
|
<Link
|
||||||
|
to={`/${ProjectType.SecretManager}/$projectId/approval` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="circular-check">
|
||||||
|
Approvals
|
||||||
|
{Boolean(
|
||||||
|
secretApprovalReqCount?.open ||
|
||||||
|
accessApprovalRequestCount?.pendingCount
|
||||||
|
) && (
|
||||||
|
<Badge variant="primary" className="ml-1.5">
|
||||||
|
{pendingRequestsCount}
|
||||||
|
</Badge>
|
||||||
|
)}
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
)}
|
||||||
|
</MenuGroup>
|
||||||
|
<MenuGroup title="Other">
|
||||||
|
<Link
|
||||||
|
to={`/${currentWorkspace.type}/$projectId/access-management` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="groups">
|
||||||
|
Access Control
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
<Link
|
||||||
|
to={`/${currentWorkspace.type}/$projectId/settings` as const}
|
||||||
|
params={{
|
||||||
|
projectId: currentWorkspace.id
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{({ isActive }) => (
|
||||||
|
<MenuItem isSelected={isActive} icon="toggle-settings">
|
||||||
|
{t("nav.menu.project-settings")}
|
||||||
|
</MenuItem>
|
||||||
|
)}
|
||||||
|
</Link>
|
||||||
|
</MenuGroup>
|
||||||
|
</Menu>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
</motion.div>
|
||||||
|
<div className="flex-1 overflow-y-auto overflow-x-hidden bg-bunker-800 px-4 pb-4 dark:[color-scheme:dark]">
|
||||||
|
{breadcrumbs ? (
|
||||||
|
<BreadcrumbContainer breadcrumbs={breadcrumbs as TBreadcrumbFormat[]} />
|
||||||
|
) : null}
|
||||||
|
<Outlet />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="z-[200] flex h-screen w-screen flex-col items-center justify-center bg-bunker-800 md:hidden">
|
||||||
|
<FontAwesomeIcon icon={faMobile} className="mb-8 text-7xl text-gray-300" />
|
||||||
|
<p className="max-w-sm px-6 text-center text-lg text-gray-200">
|
||||||
|
{` ${t("common.no-mobile")} `}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { faMobile } from "@fortawesome/free-solid-svg-icons";
|
import { faMobile } from "@fortawesome/free-solid-svg-icons";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
import { Link, Outlet, useRouterState } from "@tanstack/react-router";
|
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";
|
||||||
@@ -36,8 +36,6 @@ import { ProjectSelect } from "./components/ProjectSelect";
|
|||||||
// 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 { currentWorkspace } = useWorkspace();
|
const { currentWorkspace } = useWorkspace();
|
||||||
const matches = useRouterState({ select: (s) => s.matches.at(-1)?.context });
|
|
||||||
const breadcrumbs = matches && "breadcrumbs" in matches ? matches.breadcrumbs : undefined;
|
|
||||||
|
|
||||||
const { permission } = useProjectPermission();
|
const { permission } = useProjectPermission();
|
||||||
|
|
||||||
@@ -392,10 +390,7 @@ export const ProjectLayout = () => {
|
|||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
</motion.div>
|
</motion.div>
|
||||||
<div className="flex-1 overflow-y-auto overflow-x-hidden bg-bunker-800 px-4 pb-4 dark:[color-scheme:dark]">
|
<div className="flex-1 overflow-y-auto overflow-x-hidden bg-bunker-800 px-4 py-4 dark:[color-scheme:dark]">
|
||||||
{breadcrumbs ? (
|
|
||||||
<BreadcrumbContainer breadcrumbs={breadcrumbs as TBreadcrumbFormat[]} />
|
|
||||||
) : null}
|
|
||||||
<Outlet />
|
<Outlet />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,15 +1,26 @@
|
|||||||
import { useMemo } from "react";
|
import { useMemo } from "react";
|
||||||
import { components, MenuProps, OptionProps } from "react-select";
|
|
||||||
import { faStar } from "@fortawesome/free-regular-svg-icons";
|
import { faStar } from "@fortawesome/free-regular-svg-icons";
|
||||||
import { faChevronRight, faPlus, faStar as faSolidStar } from "@fortawesome/free-solid-svg-icons";
|
import {
|
||||||
|
faCheck,
|
||||||
|
faCube,
|
||||||
|
faPlus,
|
||||||
|
faStar as faSolidStar,
|
||||||
|
faSort
|
||||||
|
} from "@fortawesome/free-solid-svg-icons";
|
||||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||||
import { twMerge } from "tailwind-merge";
|
|
||||||
|
|
||||||
import { UpgradePlanModal } from "@app/components/license/UpgradePlanModal";
|
import { UpgradePlanModal } from "@app/components/license/UpgradePlanModal";
|
||||||
import { createNotification } from "@app/components/notifications";
|
import { createNotification } from "@app/components/notifications";
|
||||||
import { OrgPermissionCan } from "@app/components/permissions";
|
import { OrgPermissionCan } from "@app/components/permissions";
|
||||||
import { NewProjectModal } from "@app/components/projects";
|
import { NewProjectModal } from "@app/components/projects";
|
||||||
import { Button, FilterableSelect } from "@app/components/v2";
|
import {
|
||||||
|
Button,
|
||||||
|
DropdownMenu,
|
||||||
|
DropdownMenuContent,
|
||||||
|
DropdownMenuItem,
|
||||||
|
DropdownMenuTrigger,
|
||||||
|
IconButton
|
||||||
|
} from "@app/components/v2";
|
||||||
import {
|
import {
|
||||||
OrgPermissionActions,
|
OrgPermissionActions,
|
||||||
OrgPermissionSubjects,
|
OrgPermissionSubjects,
|
||||||
@@ -17,49 +28,39 @@ import {
|
|||||||
useSubscription,
|
useSubscription,
|
||||||
useWorkspace
|
useWorkspace
|
||||||
} from "@app/context";
|
} from "@app/context";
|
||||||
import { getProjectTitle } 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 { ProjectType, Workspace } from "@app/hooks/api/workspace/types";
|
||||||
|
import { Link, linkOptions } from "@tanstack/react-router";
|
||||||
|
import { getCurrentProductFromUrl, getProjectHomePage } from "@app/helpers/project";
|
||||||
|
|
||||||
type TWorkspaceWithFaveProp = Workspace & { isFavorite: boolean };
|
// TODO(pta): add search to project select
|
||||||
|
export const ProjectSelect = () => {
|
||||||
const ProjectsMenu = ({ children, ...props }: MenuProps<TWorkspaceWithFaveProp>) => {
|
const { currentWorkspace } = useWorkspace();
|
||||||
return (
|
|
||||||
<components.Menu {...props}>
|
|
||||||
{children}
|
|
||||||
<hr className="mb-2 h-px border-0 bg-mineshaft-500" />
|
|
||||||
<OrgPermissionCan I={OrgPermissionActions.Create} a={OrgPermissionSubjects.Workspace}>
|
|
||||||
{(isAllowed) => (
|
|
||||||
<Button
|
|
||||||
className="w-full bg-mineshaft-700 pt-2 text-bunker-200"
|
|
||||||
colorSchema="primary"
|
|
||||||
variant="outline_bg"
|
|
||||||
size="xs"
|
|
||||||
isDisabled={!isAllowed}
|
|
||||||
onClick={() => props.clearValue()}
|
|
||||||
leftIcon={<FontAwesomeIcon icon={faPlus} />}
|
|
||||||
>
|
|
||||||
Add Project
|
|
||||||
</Button>
|
|
||||||
)}
|
|
||||||
</OrgPermissionCan>
|
|
||||||
</components.Menu>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const ProjectOption = ({
|
|
||||||
isSelected,
|
|
||||||
children,
|
|
||||||
data,
|
|
||||||
...props
|
|
||||||
}: OptionProps<TWorkspaceWithFaveProp>) => {
|
|
||||||
const { currentOrg } = useOrganization();
|
const { currentOrg } = useOrganization();
|
||||||
const { mutateAsync: updateUserProjectFavorites } = useUpdateUserProjectFavorites();
|
const { data: workspaces = [] } = useGetUserWorkspaces();
|
||||||
const { data: projectFavorites } = useGetUserProjectFavorites(currentOrg.id);
|
const { data: projectFavorites } = useGetUserProjectFavorites(currentOrg.id);
|
||||||
|
|
||||||
|
const { subscription } = useSubscription();
|
||||||
|
|
||||||
|
const { mutateAsync: updateUserProjectFavorites } = useUpdateUserProjectFavorites();
|
||||||
|
|
||||||
|
const addProjectToFavorites = async (projectId: string) => {
|
||||||
|
try {
|
||||||
|
await updateUserProjectFavorites({
|
||||||
|
orgId: currentOrg!.id,
|
||||||
|
projectFavorites: [...(projectFavorites || []), projectId]
|
||||||
|
});
|
||||||
|
} catch {
|
||||||
|
createNotification({
|
||||||
|
text: "Failed to add project to favorites.",
|
||||||
|
type: "error"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const removeProjectFromFavorites = async (projectId: string) => {
|
const removeProjectFromFavorites = async (projectId: string) => {
|
||||||
try {
|
try {
|
||||||
await updateUserProjectFavorites({
|
await updateUserProjectFavorites({
|
||||||
@@ -74,63 +75,6 @@ const ProjectOption = ({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const addProjectToFavorites = async (projectId: string) => {
|
|
||||||
try {
|
|
||||||
await updateUserProjectFavorites({
|
|
||||||
orgId: currentOrg!.id,
|
|
||||||
projectFavorites: [...(projectFavorites || []), projectId]
|
|
||||||
});
|
|
||||||
} catch {
|
|
||||||
createNotification({
|
|
||||||
text: "Failed to add project to favorites.",
|
|
||||||
type: "error"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return (
|
|
||||||
<components.Option
|
|
||||||
isSelected={isSelected}
|
|
||||||
data={data}
|
|
||||||
{...props}
|
|
||||||
className={twMerge(props.className, isSelected && "bg-mineshaft-500")}
|
|
||||||
>
|
|
||||||
<div className="flex w-full items-center">
|
|
||||||
{isSelected && (
|
|
||||||
<FontAwesomeIcon className="mr-2 text-primary" icon={faChevronRight} size="xs" />
|
|
||||||
)}
|
|
||||||
<p className="truncate">{children}</p>
|
|
||||||
{data.isFavorite ? (
|
|
||||||
<FontAwesomeIcon
|
|
||||||
icon={faSolidStar}
|
|
||||||
className="ml-auto text-sm text-yellow-600 hover:text-mineshaft-400"
|
|
||||||
onClick={async (e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
await removeProjectFromFavorites(data.id);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
) : (
|
|
||||||
<FontAwesomeIcon
|
|
||||||
icon={faStar}
|
|
||||||
className="ml-auto text-sm text-mineshaft-400 hover:text-mineshaft-300"
|
|
||||||
onClick={async (e) => {
|
|
||||||
e.stopPropagation();
|
|
||||||
await addProjectToFavorites(data.id);
|
|
||||||
}}
|
|
||||||
/>
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</components.Option>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const ProjectSelect = () => {
|
|
||||||
const { currentWorkspace } = useWorkspace();
|
|
||||||
const { currentOrg } = useOrganization();
|
|
||||||
const { data: workspaces = [] } = useGetUserWorkspaces();
|
|
||||||
const { data: projectFavorites } = useGetUserProjectFavorites(currentOrg.id!);
|
|
||||||
|
|
||||||
const { subscription } = useSubscription();
|
|
||||||
|
|
||||||
const isAddingProjectsAllowed = subscription?.workspaceLimit
|
const isAddingProjectsAllowed = subscription?.workspaceLimit
|
||||||
? subscription.workspacesUsed < subscription.workspaceLimit
|
? subscription.workspacesUsed < subscription.workspaceLimit
|
||||||
: true;
|
: true;
|
||||||
@@ -140,7 +84,7 @@ export const ProjectSelect = () => {
|
|||||||
"upgradePlan"
|
"upgradePlan"
|
||||||
] as const);
|
] as const);
|
||||||
|
|
||||||
const { options, value } = useMemo(() => {
|
const projects = useMemo(() => {
|
||||||
const projectOptions = workspaces
|
const projectOptions = workspaces
|
||||||
.map((w): Workspace & { isFavorite: boolean } => ({
|
.map((w): Workspace & { isFavorite: boolean } => ({
|
||||||
...w,
|
...w,
|
||||||
@@ -148,66 +92,107 @@ export const ProjectSelect = () => {
|
|||||||
}))
|
}))
|
||||||
.sort((a, b) => Number(b.isFavorite) - Number(a.isFavorite));
|
.sort((a, b) => Number(b.isFavorite) - Number(a.isFavorite));
|
||||||
|
|
||||||
const currentOption = projectOptions.find((option) => option.id === currentWorkspace?.id);
|
return projectOptions;
|
||||||
|
|
||||||
if (!currentOption) {
|
|
||||||
return {
|
|
||||||
options: projectOptions,
|
|
||||||
value: null
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
options: [
|
|
||||||
currentOption,
|
|
||||||
...projectOptions.filter((option) => option.id !== currentOption.id)
|
|
||||||
],
|
|
||||||
value: currentOption
|
|
||||||
};
|
|
||||||
}, [workspaces, projectFavorites, currentWorkspace]);
|
}, [workspaces, projectFavorites, currentWorkspace]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="mt-2 w-full p-3">
|
<div className="flex w-full items-center gap-2">
|
||||||
<p className="mb-1 ml-1.5 text-xs font-semibold uppercase text-gray-400">
|
<DropdownMenu modal={false}>
|
||||||
{currentWorkspace?.type ? getProjectTitle(currentWorkspace?.type) : "Project"}
|
<Link
|
||||||
</p>
|
to={getProjectHomePage(
|
||||||
<FilterableSelect
|
getCurrentProductFromUrl(window.location.href) || ProjectType.SecretManager
|
||||||
className="text-sm"
|
)}
|
||||||
value={value}
|
params={{
|
||||||
filterOption={(option, inputValue) =>
|
projectId: currentWorkspace.id
|
||||||
option.data.name.toLowerCase().includes(inputValue.toLowerCase())
|
}}
|
||||||
}
|
>
|
||||||
getOptionLabel={(option) => option.name}
|
<div className="flex cursor-pointer items-center gap-2 text-sm text-white">
|
||||||
getOptionValue={(option) => option.id}
|
<div>
|
||||||
onChange={(newValue) => {
|
<FontAwesomeIcon icon={faCube} className="text-xs" />
|
||||||
// hacky use of null as indication to create project
|
</div>
|
||||||
if (!newValue) {
|
<div className="max-w-32 overflow-hidden text-ellipsis">{currentWorkspace?.name}</div>
|
||||||
if (isAddingProjectsAllowed) {
|
</div>
|
||||||
handlePopUpOpen("addNewWs");
|
</Link>
|
||||||
} else {
|
<DropdownMenuTrigger asChild>
|
||||||
handlePopUpOpen("upgradePlan");
|
<div>
|
||||||
}
|
<IconButton
|
||||||
return;
|
variant="plain"
|
||||||
}
|
colorSchema="secondary"
|
||||||
|
ariaLabel="switch-org"
|
||||||
const project = newValue as TWorkspaceWithFaveProp;
|
className="px-2 py-1"
|
||||||
// todo(akhi): this is not using react query because react query in overview is throwing error when envs are not exact same count
|
>
|
||||||
// to reproduce change this back to router.push and switch between two projects with different env count
|
<FontAwesomeIcon icon={faSort} className="text-xs text-bunker-300" />
|
||||||
// look into this on dashboard revamp
|
</IconButton>
|
||||||
window.location.assign(`/${project.type}/${project.id}/overview`);
|
</div>
|
||||||
}}
|
</DropdownMenuTrigger>
|
||||||
options={options}
|
<DropdownMenuContent
|
||||||
components={{
|
align="start"
|
||||||
Option: ProjectOption,
|
side="bottom"
|
||||||
Menu: ProjectsMenu
|
className="mt-6 cursor-default p-1 shadow-mineshaft-600 drop-shadow-md"
|
||||||
}}
|
style={{ minWidth: "220px" }}
|
||||||
/>
|
>
|
||||||
|
<div className="px-2 py-1 text-xs capitalize text-mineshaft-400">Projects</div>
|
||||||
|
{projects?.map((workspace) => {
|
||||||
|
return (
|
||||||
|
<DropdownMenuItem
|
||||||
|
key={workspace.id}
|
||||||
|
onClick={async () => {
|
||||||
|
// todo(akhi): this is not using react query because react query in overview is throwing error when envs are not exact same count
|
||||||
|
// to reproduce change this back to router.push and switch between two projects with different env count
|
||||||
|
// look into this on dashboard revamp
|
||||||
|
const url = linkOptions({
|
||||||
|
to: getProjectHomePage(workspace.defaultType),
|
||||||
|
params: {
|
||||||
|
projectId: workspace.id
|
||||||
|
}
|
||||||
|
});
|
||||||
|
window.location.assign(url.to.replaceAll("$projectId", workspace.id));
|
||||||
|
}}
|
||||||
|
icon={
|
||||||
|
currentWorkspace?.id === workspace.id && (
|
||||||
|
<FontAwesomeIcon icon={faCheck} className="mr-3 text-primary" />
|
||||||
|
)
|
||||||
|
}
|
||||||
|
>
|
||||||
|
<div className="flex items-center">
|
||||||
|
<div className="flex max-w-[150px] flex-grow items-center justify-between truncate">
|
||||||
|
{workspace.name}
|
||||||
|
</div>
|
||||||
|
<FontAwesomeIcon
|
||||||
|
icon={workspace.isFavorite ? faSolidStar : faStar}
|
||||||
|
className="text-sm text-yellow-600 hover:text-mineshaft-400"
|
||||||
|
onClick={async (e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
await (
|
||||||
|
workspace.isFavorite ? removeProjectFromFavorites : addProjectToFavorites
|
||||||
|
)(workspace.id);
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</DropdownMenuItem>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
<div className="mt-1 h-1 border-t border-mineshaft-600" />
|
||||||
|
<OrgPermissionCan I={OrgPermissionActions.Create} a={OrgPermissionSubjects.Workspace}>
|
||||||
|
{(isAllowed) => (
|
||||||
|
<DropdownMenuItem
|
||||||
|
isDisabled={!isAllowed}
|
||||||
|
icon={<FontAwesomeIcon icon={faPlus} />}
|
||||||
|
onClick={() =>
|
||||||
|
handlePopUpOpen(isAddingProjectsAllowed ? "addNewWs" : "upgradePlan")
|
||||||
|
}
|
||||||
|
>
|
||||||
|
New Project
|
||||||
|
</DropdownMenuItem>
|
||||||
|
)}
|
||||||
|
</OrgPermissionCan>
|
||||||
|
</DropdownMenuContent>
|
||||||
|
</DropdownMenu>
|
||||||
<UpgradePlanModal
|
<UpgradePlanModal
|
||||||
isOpen={popUp.upgradePlan.isOpen}
|
isOpen={popUp.upgradePlan.isOpen}
|
||||||
onOpenChange={(isOpen) => handlePopUpToggle("upgradePlan", isOpen)}
|
onOpenChange={(isOpen) => handlePopUpToggle("upgradePlan", isOpen)}
|
||||||
text="You have exceeded the number of projects allowed on the free plan."
|
text="You have exceeded the number of projects allowed on the free plan."
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<NewProjectModal
|
<NewProjectModal
|
||||||
isOpen={popUp.addNewWs.isOpen}
|
isOpen={popUp.addNewWs.isOpen}
|
||||||
onOpenChange={(isOpen) => handlePopUpToggle("addNewWs", isOpen)}
|
onOpenChange={(isOpen) => handlePopUpToggle("addNewWs", isOpen)}
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute } from "@tanstack/react-router";
|
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/cert-manager/$projectId/_cert-manager-layout/alerting"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/alerting',
|
||||||
)({
|
)({
|
||||||
component: AlertingPage,
|
component: AlertingPage,
|
||||||
beforeLoad: ({ context }) => {
|
beforeLoad: ({ context }) => {
|
||||||
@@ -11,9 +11,9 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Alerting"
|
label: 'Alerting',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
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/cert-manager/$projectId/_cert-manager-layout/ca/$caName"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/ca/$caName',
|
||||||
)({
|
)({
|
||||||
component: CertAuthDetailsByIDPage,
|
component: CertAuthDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,15 +11,15 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Certificate Authorities",
|
label: 'Certificate Authorities',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/cert-manager/$projectId/certificate-authorities",
|
to: '/cert-manager/$projectId/certificate-authorities',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -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/cert-manager/$projectId/_cert-manager-layout/certificate-authorities"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_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/cert-manager/$projectId/_cert-manager-layout/certificates"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/certificates',
|
||||||
)({
|
)({
|
||||||
component: CertificatesPage
|
component: CertificatesPage,
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
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/cert-manager/$projectId/_cert-manager-layout/pki-collections/$collectionId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/pki-collections/$collectionId',
|
||||||
)({
|
)({
|
||||||
component: PkiCollectionDetailsByIDPage,
|
component: PkiCollectionDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,15 +11,15 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Certificate Collections",
|
label: 'Certificate Collections',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/cert-manager/$projectId/certificates",
|
to: '/cert-manager/$projectId/certificates',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
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/cert-manager/$projectId/_cert-manager-layout/subscribers/$subscriberName"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/subscribers/$subscriberName',
|
||||||
)({
|
)({
|
||||||
component: PkiSubscriberDetailsByIDPage,
|
component: PkiSubscriberDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,15 +11,15 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Subscribers",
|
label: 'Subscribers',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/cert-manager/$projectId/subscribers",
|
to: '/cert-manager/$projectId/subscribers',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -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/cert-manager/$projectId/_cert-manager-layout/subscribers/"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/subscribers/',
|
||||||
)({
|
)({
|
||||||
component: PkiSubscribersPage
|
component: PkiSubscribersPage,
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -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/cert-manager/$projectId/_cert-manager-layout/certificate-templates/"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/certificate-templates/',
|
||||||
)({
|
)({
|
||||||
component: PkiTemplateListPage
|
component: PkiTemplateListPage,
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -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/cert-manager/$projectId/_cert-manager-layout/settings"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_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',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,41 +1,45 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { workspaceKeys } from "@app/hooks/api";
|
import { workspaceKeys } from '@app/hooks/api'
|
||||||
import { fetchUserProjectPermissions, roleQueryKeys } from "@app/hooks/api/roles/queries";
|
import {
|
||||||
import { fetchWorkspaceById } from "@app/hooks/api/workspace/queries";
|
fetchUserProjectPermissions,
|
||||||
import { ProjectLayout } from "@app/layouts/ProjectLayout";
|
roleQueryKeys,
|
||||||
|
} from '@app/hooks/api/roles/queries'
|
||||||
|
import { fetchWorkspaceById } from '@app/hooks/api/workspace/queries'
|
||||||
|
import { ProjectLayout } from '@app/layouts/ProjectLayout'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/cert-manager/$projectId/_cert-manager-layout"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout',
|
||||||
)({
|
)({
|
||||||
component: ProjectLayout,
|
component: ProjectLayout,
|
||||||
beforeLoad: async ({ params, context }) => {
|
beforeLoad: async ({ params, context }) => {
|
||||||
const project = await context.queryClient.ensureQueryData({
|
const project = await context.queryClient.ensureQueryData({
|
||||||
queryKey: workspaceKeys.getWorkspaceById(params.projectId),
|
queryKey: workspaceKeys.getWorkspaceById(params.projectId),
|
||||||
queryFn: () => fetchWorkspaceById(params.projectId)
|
queryFn: () => fetchWorkspaceById(params.projectId),
|
||||||
});
|
})
|
||||||
|
|
||||||
await context.queryClient.ensureQueryData({
|
await context.queryClient.ensureQueryData({
|
||||||
queryKey: roleQueryKeys.getUserProjectPermissions({
|
queryKey: roleQueryKeys.getUserProjectPermissions({
|
||||||
workspaceId: params.projectId
|
workspaceId: params.projectId,
|
||||||
}),
|
}),
|
||||||
queryFn: () => fetchUserProjectPermissions({ workspaceId: params.projectId })
|
queryFn: () =>
|
||||||
});
|
fetchUserProjectPermissions({ workspaceId: params.projectId }),
|
||||||
|
})
|
||||||
|
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
{
|
||||||
label: "Cert Managers",
|
label: 'Cert Managers',
|
||||||
link: linkOptions({ to: "/organization/cert-manager/overview" })
|
link: linkOptions({ to: '/organization/cert-manager/overview' }),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: project.name,
|
label: project.name,
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/cert-manager/$projectId/subscribers",
|
to: '/cert-manager/$projectId/subscribers',
|
||||||
params: { projectId: project.id }
|
params: { projectId: project.id },
|
||||||
})
|
}),
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -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/kms/$projectId/_kms-layout/kmip"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/kms/_kms-layout/kmip',
|
||||||
)({
|
)({
|
||||||
component: KmipPage
|
component: KmipPage,
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -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/kms/$projectId/_kms-layout/overview"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/kms/_kms-layout/overview',
|
||||||
)({
|
)({
|
||||||
component: OverviewPage
|
component: OverviewPage,
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -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/kms/$projectId/_kms-layout/settings"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/kms/_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',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,41 +1,45 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { workspaceKeys } from "@app/hooks/api";
|
import { workspaceKeys } from '@app/hooks/api'
|
||||||
import { fetchUserProjectPermissions, roleQueryKeys } from "@app/hooks/api/roles/queries";
|
import {
|
||||||
import { fetchWorkspaceById } from "@app/hooks/api/workspace/queries";
|
fetchUserProjectPermissions,
|
||||||
import { ProjectLayout } from "@app/layouts/ProjectLayout";
|
roleQueryKeys,
|
||||||
|
} from '@app/hooks/api/roles/queries'
|
||||||
|
import { fetchWorkspaceById } from '@app/hooks/api/workspace/queries'
|
||||||
|
import { ProjectLayout } from '@app/layouts/ProjectLayout'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/kms/$projectId/_kms-layout"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/kms/_kms-layout',
|
||||||
)({
|
)({
|
||||||
component: ProjectLayout,
|
component: ProjectLayout,
|
||||||
beforeLoad: async ({ params, context }) => {
|
beforeLoad: async ({ params, context }) => {
|
||||||
const project = await context.queryClient.ensureQueryData({
|
const project = await context.queryClient.ensureQueryData({
|
||||||
queryKey: workspaceKeys.getWorkspaceById(params.projectId),
|
queryKey: workspaceKeys.getWorkspaceById(params.projectId),
|
||||||
queryFn: () => fetchWorkspaceById(params.projectId)
|
queryFn: () => fetchWorkspaceById(params.projectId),
|
||||||
});
|
})
|
||||||
|
|
||||||
await context.queryClient.ensureQueryData({
|
await context.queryClient.ensureQueryData({
|
||||||
queryKey: roleQueryKeys.getUserProjectPermissions({
|
queryKey: roleQueryKeys.getUserProjectPermissions({
|
||||||
workspaceId: params.projectId
|
workspaceId: params.projectId,
|
||||||
}),
|
}),
|
||||||
queryFn: () => fetchUserProjectPermissions({ workspaceId: params.projectId })
|
queryFn: () =>
|
||||||
});
|
fetchUserProjectPermissions({ workspaceId: params.projectId }),
|
||||||
|
})
|
||||||
|
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
{
|
{
|
||||||
label: "KMS",
|
label: 'KMS',
|
||||||
link: linkOptions({ to: "/organization/kms/overview" })
|
link: linkOptions({ to: '/organization/kms/overview' }),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: project.name,
|
label: project.name,
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/kms/$projectId/overview",
|
to: '/kms/$projectId/overview',
|
||||||
params: { projectId: project.id }
|
params: { projectId: project.id },
|
||||||
})
|
}),
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,38 +1,44 @@
|
|||||||
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
import {
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
createFileRoute,
|
||||||
import { z } from "zod";
|
linkOptions,
|
||||||
|
stripSearchParams,
|
||||||
|
} from '@tanstack/react-router'
|
||||||
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { ProjectAccessControlTabs } from "@app/types/project";
|
import { ProjectAccessControlTabs } from '@app/types/project'
|
||||||
|
|
||||||
import { AccessControlPage } from "./AccessControlPage";
|
import { AccessControlPage } from './AccessControlPage'
|
||||||
|
|
||||||
const AccessControlPageQuerySchema = z.object({
|
const AccessControlPageQuerySchema = z.object({
|
||||||
selectedTab: z.nativeEnum(ProjectAccessControlTabs).catch(ProjectAccessControlTabs.Member),
|
selectedTab: z
|
||||||
requesterEmail: z.string().catch("")
|
.nativeEnum(ProjectAccessControlTabs)
|
||||||
});
|
.catch(ProjectAccessControlTabs.Member),
|
||||||
|
requesterEmail: z.string().catch(''),
|
||||||
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/cert-manager/$projectId/_cert-manager-layout/access-management"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/access-management',
|
||||||
)({
|
)({
|
||||||
component: AccessControlPage,
|
component: AccessControlPage,
|
||||||
validateSearch: zodValidator(AccessControlPageQuerySchema),
|
validateSearch: zodValidator(AccessControlPageQuerySchema),
|
||||||
search: {
|
search: {
|
||||||
middlewares: [stripSearchParams({ requesterEmail: "" })]
|
middlewares: [stripSearchParams({ requesterEmail: '' })],
|
||||||
},
|
},
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/cert-manager/$projectId/access-management",
|
to: '/cert-manager/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,38 +1,44 @@
|
|||||||
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
import {
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
createFileRoute,
|
||||||
import { z } from "zod";
|
linkOptions,
|
||||||
|
stripSearchParams,
|
||||||
|
} from '@tanstack/react-router'
|
||||||
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { ProjectAccessControlTabs } from "@app/types/project";
|
import { ProjectAccessControlTabs } from '@app/types/project'
|
||||||
|
|
||||||
import { AccessControlPage } from "./AccessControlPage";
|
import { AccessControlPage } from './AccessControlPage'
|
||||||
|
|
||||||
const AccessControlPageQuerySchema = z.object({
|
const AccessControlPageQuerySchema = z.object({
|
||||||
selectedTab: z.nativeEnum(ProjectAccessControlTabs).catch(ProjectAccessControlTabs.Member),
|
selectedTab: z
|
||||||
requesterEmail: z.string().catch("")
|
.nativeEnum(ProjectAccessControlTabs)
|
||||||
});
|
.catch(ProjectAccessControlTabs.Member),
|
||||||
|
requesterEmail: z.string().catch(''),
|
||||||
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/kms/$projectId/_kms-layout/access-management"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/kms/_kms-layout/access-management',
|
||||||
)({
|
)({
|
||||||
component: AccessControlPage,
|
component: AccessControlPage,
|
||||||
validateSearch: zodValidator(AccessControlPageQuerySchema),
|
validateSearch: zodValidator(AccessControlPageQuerySchema),
|
||||||
search: {
|
search: {
|
||||||
middlewares: [stripSearchParams({ requesterEmail: "" })]
|
middlewares: [stripSearchParams({ requesterEmail: '' })],
|
||||||
},
|
},
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/kms/$projectId/access-management",
|
to: '/kms/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,38 +1,44 @@
|
|||||||
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
import {
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
createFileRoute,
|
||||||
import { z } from "zod";
|
linkOptions,
|
||||||
|
stripSearchParams,
|
||||||
|
} from '@tanstack/react-router'
|
||||||
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { ProjectAccessControlTabs } from "@app/types/project";
|
import { ProjectAccessControlTabs } from '@app/types/project'
|
||||||
|
|
||||||
import { AccessControlPage } from "./AccessControlPage";
|
import { AccessControlPage } from './AccessControlPage'
|
||||||
|
|
||||||
const AccessControlPageQuerySchema = z.object({
|
const AccessControlPageQuerySchema = z.object({
|
||||||
selectedTab: z.nativeEnum(ProjectAccessControlTabs).catch(ProjectAccessControlTabs.Member),
|
selectedTab: z
|
||||||
requesterEmail: z.string().catch("")
|
.nativeEnum(ProjectAccessControlTabs)
|
||||||
});
|
.catch(ProjectAccessControlTabs.Member),
|
||||||
|
requesterEmail: z.string().catch(''),
|
||||||
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/access-management"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/access-management',
|
||||||
)({
|
)({
|
||||||
component: AccessControlPage,
|
component: AccessControlPage,
|
||||||
validateSearch: zodValidator(AccessControlPageQuerySchema),
|
validateSearch: zodValidator(AccessControlPageQuerySchema),
|
||||||
search: {
|
search: {
|
||||||
middlewares: [stripSearchParams({ requesterEmail: "" })]
|
middlewares: [stripSearchParams({ requesterEmail: '' })],
|
||||||
},
|
},
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/access-management",
|
to: '/secret-manager/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,38 +1,44 @@
|
|||||||
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
import {
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
createFileRoute,
|
||||||
import { z } from "zod";
|
linkOptions,
|
||||||
|
stripSearchParams,
|
||||||
|
} from '@tanstack/react-router'
|
||||||
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { ProjectAccessControlTabs } from "@app/types/project";
|
import { ProjectAccessControlTabs } from '@app/types/project'
|
||||||
|
|
||||||
import { AccessControlPage } from "./AccessControlPage";
|
import { AccessControlPage } from './AccessControlPage'
|
||||||
|
|
||||||
const AccessControlPageQuerySchema = z.object({
|
const AccessControlPageQuerySchema = z.object({
|
||||||
selectedTab: z.nativeEnum(ProjectAccessControlTabs).catch(ProjectAccessControlTabs.Member),
|
selectedTab: z
|
||||||
requesterEmail: z.string().catch("")
|
.nativeEnum(ProjectAccessControlTabs)
|
||||||
});
|
.catch(ProjectAccessControlTabs.Member),
|
||||||
|
requesterEmail: z.string().catch(''),
|
||||||
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-scanning/$projectId/_secret-scanning-layout/access-management"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-scanning/_secret-scanning-layout/access-management',
|
||||||
)({
|
)({
|
||||||
component: AccessControlPage,
|
component: AccessControlPage,
|
||||||
validateSearch: zodValidator(AccessControlPageQuerySchema),
|
validateSearch: zodValidator(AccessControlPageQuerySchema),
|
||||||
search: {
|
search: {
|
||||||
middlewares: [stripSearchParams({ requesterEmail: "" })]
|
middlewares: [stripSearchParams({ requesterEmail: '' })],
|
||||||
},
|
},
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-scanning/$projectId/access-management",
|
to: '/secret-scanning/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,17 +1,19 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { ProjectAccessControlTabs } from "@app/types/project";
|
import { ProjectAccessControlTabs } from '@app/types/project'
|
||||||
|
|
||||||
import { AccessControlPage } from "./AccessControlPage";
|
import { AccessControlPage } from './AccessControlPage'
|
||||||
|
|
||||||
const AccessControlPageQuerySchema = z.object({
|
const AccessControlPageQuerySchema = z.object({
|
||||||
selectedTab: z.nativeEnum(ProjectAccessControlTabs).catch(ProjectAccessControlTabs.Member)
|
selectedTab: z
|
||||||
});
|
.nativeEnum(ProjectAccessControlTabs)
|
||||||
|
.catch(ProjectAccessControlTabs.Member),
|
||||||
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/ssh/$projectId/_ssh-layout/access-management"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/ssh/_ssh-layout/access-management',
|
||||||
)({
|
)({
|
||||||
component: AccessControlPage,
|
component: AccessControlPage,
|
||||||
validateSearch: zodValidator(AccessControlPageQuerySchema),
|
validateSearch: zodValidator(AccessControlPageQuerySchema),
|
||||||
@@ -20,15 +22,15 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/ssh/$projectId/access-management",
|
to: '/ssh/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { GroupDetailsByIDPage } from "./GroupDetailsByIDPage";
|
import { GroupDetailsByIDPage } from './GroupDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/cert-manager/$projectId/_cert-manager-layout/groups/$groupId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/groups/$groupId',
|
||||||
)({
|
)({
|
||||||
component: GroupDetailsByIDPage,
|
component: GroupDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/cert-manager/$projectId/access-management",
|
to: '/cert-manager/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Groups"
|
label: 'Groups',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { GroupDetailsByIDPage } from "./GroupDetailsByIDPage";
|
import { GroupDetailsByIDPage } from './GroupDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/kms/$projectId/_kms-layout/groups/$groupId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/kms/_kms-layout/groups/$groupId',
|
||||||
)({
|
)({
|
||||||
component: GroupDetailsByIDPage,
|
component: GroupDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/kms/$projectId/access-management",
|
to: '/kms/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Groups"
|
label: 'Groups',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { GroupDetailsByIDPage } from "./GroupDetailsByIDPage";
|
import { GroupDetailsByIDPage } from './GroupDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/groups/$groupId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/groups/$groupId',
|
||||||
)({
|
)({
|
||||||
component: GroupDetailsByIDPage,
|
component: GroupDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/access-management",
|
to: '/secret-manager/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Groups"
|
label: 'Groups',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { GroupDetailsByIDPage } from "./GroupDetailsByIDPage";
|
import { GroupDetailsByIDPage } from './GroupDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-scanning/$projectId/_secret-scanning-layout/groups/$groupId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-scanning/_secret-scanning-layout/groups/$groupId',
|
||||||
)({
|
)({
|
||||||
component: GroupDetailsByIDPage,
|
component: GroupDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-scanning/$projectId/access-management",
|
to: '/secret-scanning/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Groups"
|
label: 'Groups',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { GroupDetailsByIDPage } from "./GroupDetailsByIDPage";
|
import { GroupDetailsByIDPage } from './GroupDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/ssh/$projectId/_ssh-layout/groups/$groupId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/ssh/_ssh-layout/groups/$groupId',
|
||||||
)({
|
)({
|
||||||
component: GroupDetailsByIDPage,
|
component: GroupDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/ssh/$projectId/access-management",
|
to: '/ssh/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Groups"
|
label: 'Groups',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IdentityDetailsByIDPage } from "./IdentityDetailsByIDPage";
|
import { IdentityDetailsByIDPage } from './IdentityDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/cert-manager/$projectId/_cert-manager-layout/identities/$identityId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/identities/$identityId',
|
||||||
)({
|
)({
|
||||||
component: IdentityDetailsByIDPage,
|
component: IdentityDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/cert-manager/$projectId/access-management",
|
to: '/cert-manager/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Identities"
|
label: 'Identities',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IdentityDetailsByIDPage } from "./IdentityDetailsByIDPage";
|
import { IdentityDetailsByIDPage } from './IdentityDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/kms/$projectId/_kms-layout/identities/$identityId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/kms/_kms-layout/identities/$identityId',
|
||||||
)({
|
)({
|
||||||
component: IdentityDetailsByIDPage,
|
component: IdentityDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/kms/$projectId/access-management",
|
to: '/kms/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Identities"
|
label: 'Identities',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IdentityDetailsByIDPage } from "./IdentityDetailsByIDPage";
|
import { IdentityDetailsByIDPage } from './IdentityDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/identities/$identityId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/identities/$identityId',
|
||||||
)({
|
)({
|
||||||
component: IdentityDetailsByIDPage,
|
component: IdentityDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/access-management",
|
to: '/secret-manager/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Identities"
|
label: 'Identities',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IdentityDetailsByIDPage } from "./IdentityDetailsByIDPage";
|
import { IdentityDetailsByIDPage } from './IdentityDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-scanning/$projectId/_secret-scanning-layout/identities/$identityId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-scanning/_secret-scanning-layout/identities/$identityId',
|
||||||
)({
|
)({
|
||||||
component: IdentityDetailsByIDPage,
|
component: IdentityDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-scanning/$projectId/access-management",
|
to: '/secret-scanning/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Identities"
|
label: 'Identities',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IdentityDetailsByIDPage } from "./IdentityDetailsByIDPage";
|
import { IdentityDetailsByIDPage } from './IdentityDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/ssh/$projectId/_ssh-layout/identities/$identityId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/ssh/_ssh-layout/identities/$identityId',
|
||||||
)({
|
)({
|
||||||
component: IdentityDetailsByIDPage,
|
component: IdentityDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/ssh/$projectId/access-management",
|
to: '/ssh/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Identities"
|
label: 'Identities',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { MemberDetailsByIDPage } from "./MemberDetailsByIDPage";
|
import { MemberDetailsByIDPage } from './MemberDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/cert-manager/$projectId/_cert-manager-layout/members/$membershipId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/members/$membershipId',
|
||||||
)({
|
)({
|
||||||
component: MemberDetailsByIDPage,
|
component: MemberDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/cert-manager/$projectId/access-management",
|
to: '/cert-manager/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Users"
|
label: 'Users',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { MemberDetailsByIDPage } from "./MemberDetailsByIDPage";
|
import { MemberDetailsByIDPage } from './MemberDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/kms/$projectId/_kms-layout/members/$membershipId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/kms/_kms-layout/members/$membershipId',
|
||||||
)({
|
)({
|
||||||
component: MemberDetailsByIDPage,
|
component: MemberDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/kms/$projectId/access-management",
|
to: '/kms/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Users"
|
label: 'Users',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { MemberDetailsByIDPage } from "./MemberDetailsByIDPage";
|
import { MemberDetailsByIDPage } from './MemberDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/members/$membershipId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/members/$membershipId',
|
||||||
)({
|
)({
|
||||||
component: MemberDetailsByIDPage,
|
component: MemberDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/access-management",
|
to: '/secret-manager/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Users"
|
label: 'Users',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { MemberDetailsByIDPage } from "./MemberDetailsByIDPage";
|
import { MemberDetailsByIDPage } from './MemberDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-scanning/$projectId/_secret-scanning-layout/members/$membershipId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-scanning/_secret-scanning-layout/members/$membershipId',
|
||||||
)({
|
)({
|
||||||
component: MemberDetailsByIDPage,
|
component: MemberDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-scanning/$projectId/access-management",
|
to: '/secret-scanning/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Users"
|
label: 'Users',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { MemberDetailsByIDPage } from "./MemberDetailsByIDPage";
|
import { MemberDetailsByIDPage } from './MemberDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/ssh/$projectId/_ssh-layout/members/$membershipId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/ssh/_ssh-layout/members/$membershipId',
|
||||||
)({
|
)({
|
||||||
component: MemberDetailsByIDPage,
|
component: MemberDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/ssh/$projectId/access-management",
|
to: '/ssh/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Users"
|
label: 'Users',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { RoleDetailsBySlugPage } from "./RoleDetailsBySlugPage";
|
import { RoleDetailsBySlugPage } from './RoleDetailsBySlugPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/cert-manager/$projectId/_cert-manager-layout/roles/$roleSlug"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/cert-manager/_cert-manager-layout/roles/$roleSlug',
|
||||||
)({
|
)({
|
||||||
component: RoleDetailsBySlugPage,
|
component: RoleDetailsBySlugPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/cert-manager/$projectId/access-management",
|
to: '/cert-manager/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Roles"
|
label: 'Roles',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { RoleDetailsBySlugPage } from "./RoleDetailsBySlugPage";
|
import { RoleDetailsBySlugPage } from './RoleDetailsBySlugPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/kms/$projectId/_kms-layout/roles/$roleSlug"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/kms/_kms-layout/roles/$roleSlug',
|
||||||
)({
|
)({
|
||||||
component: RoleDetailsBySlugPage,
|
component: RoleDetailsBySlugPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/kms/$projectId/access-management",
|
to: '/kms/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Roles"
|
label: 'Roles',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { RoleDetailsBySlugPage } from "./RoleDetailsBySlugPage";
|
import { RoleDetailsBySlugPage } from './RoleDetailsBySlugPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/roles/$roleSlug"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/roles/$roleSlug',
|
||||||
)({
|
)({
|
||||||
component: RoleDetailsBySlugPage,
|
component: RoleDetailsBySlugPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/access-management",
|
to: '/secret-manager/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Roles"
|
label: 'Roles',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { RoleDetailsBySlugPage } from "./RoleDetailsBySlugPage";
|
import { RoleDetailsBySlugPage } from './RoleDetailsBySlugPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-scanning/$projectId/_secret-scanning-layout/roles/$roleSlug"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-scanning/_secret-scanning-layout/roles/$roleSlug',
|
||||||
)({
|
)({
|
||||||
component: RoleDetailsBySlugPage,
|
component: RoleDetailsBySlugPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-scanning/$projectId/access-management",
|
to: '/secret-scanning/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Roles"
|
label: 'Roles',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { RoleDetailsBySlugPage } from "./RoleDetailsBySlugPage";
|
import { RoleDetailsBySlugPage } from './RoleDetailsBySlugPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/ssh/$projectId/_ssh-layout/roles/$roleSlug"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/ssh/_ssh-layout/roles/$roleSlug',
|
||||||
)({
|
)({
|
||||||
component: RoleDetailsBySlugPage,
|
component: RoleDetailsBySlugPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -11,18 +11,18 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Access Control",
|
label: 'Access Control',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/ssh/$projectId/access-management",
|
to: '/ssh/$projectId/access-management',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId
|
projectId: params.projectId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Roles"
|
label: 'Roles',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import { createFileRoute } from "@tanstack/react-router";
|
||||||
|
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 { BreadcrumbTypes } from "@app/components/v2";
|
||||||
|
import { ProjectSelect } from "@app/layouts/ProjectLayout/components/ProjectSelect";
|
||||||
|
|
||||||
|
export const Route = createFileRoute(
|
||||||
|
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout"
|
||||||
|
)({
|
||||||
|
component: ProjectLayout,
|
||||||
|
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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
+51
-45
@@ -1,26 +1,30 @@
|
|||||||
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
import {
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
createFileRoute,
|
||||||
import { z } from "zod";
|
linkOptions,
|
||||||
|
stripSearchParams,
|
||||||
|
} from '@tanstack/react-router'
|
||||||
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { SecretDashboardPathBreadcrumb } from "@app/components/navigation/SecretDashboardPathBreadcrumb";
|
import { SecretDashboardPathBreadcrumb } from '@app/components/navigation/SecretDashboardPathBreadcrumb'
|
||||||
import { BreadcrumbTypes } from "@app/components/v2";
|
import { BreadcrumbTypes } from '@app/components/v2'
|
||||||
|
|
||||||
import { RollbackPreviewTab } from "./RollbackPreviewTab";
|
import { RollbackPreviewTab } from './RollbackPreviewTab'
|
||||||
|
|
||||||
const RollbackPreviewTabQueryParamsSchema = z.object({
|
const RollbackPreviewTabQueryParamsSchema = z.object({
|
||||||
secretPath: z.string().catch("/")
|
secretPath: z.string().catch('/'),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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',
|
||||||
)({
|
)({
|
||||||
component: RollbackPreviewTab,
|
component: RollbackPreviewTab,
|
||||||
validateSearch: zodValidator(RollbackPreviewTabQueryParamsSchema),
|
validateSearch: zodValidator(RollbackPreviewTabQueryParamsSchema),
|
||||||
search: {
|
search: {
|
||||||
middlewares: [stripSearchParams({ secretPath: "/" })]
|
middlewares: [stripSearchParams({ secretPath: '/' })],
|
||||||
},
|
},
|
||||||
beforeLoad: ({ context, params, search }) => {
|
beforeLoad: ({ context, params, search }) => {
|
||||||
const secretPathSegments = search.secretPath.split("/").filter(Boolean);
|
const secretPathSegments = search.secretPath.split('/').filter(Boolean)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
@@ -28,18 +32,20 @@ export const Route = createFileRoute(
|
|||||||
{
|
{
|
||||||
type: BreadcrumbTypes.Dropdown,
|
type: BreadcrumbTypes.Dropdown,
|
||||||
label:
|
label:
|
||||||
context.project.environments.find((el) => el.slug === params.environment)?.name || "",
|
context.project.environments.find(
|
||||||
dropdownTitle: "Environments",
|
(el) => el.slug === params.environment,
|
||||||
|
)?.name || '',
|
||||||
|
dropdownTitle: 'Environments',
|
||||||
links: context.project.environments.map((el) => ({
|
links: context.project.environments.map((el) => ({
|
||||||
label: el.name,
|
label: el.name,
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/secrets/$envSlug",
|
to: '/secret-manager/$projectId/secrets/$envSlug',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId,
|
projectId: params.projectId,
|
||||||
envSlug: el.slug
|
envSlug: el.slug,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}))
|
})),
|
||||||
},
|
},
|
||||||
...secretPathSegments.map((_, index) => ({
|
...secretPathSegments.map((_, index) => ({
|
||||||
type: BreadcrumbTypes.Component,
|
type: BreadcrumbTypes.Component,
|
||||||
@@ -51,41 +57,41 @@ export const Route = createFileRoute(
|
|||||||
projectId={params.projectId}
|
projectId={params.projectId}
|
||||||
disableCopy
|
disableCopy
|
||||||
/>
|
/>
|
||||||
)
|
),
|
||||||
})),
|
})),
|
||||||
{
|
{
|
||||||
label: "Commits",
|
label: 'Commits',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/commits/$environment/$folderId",
|
to: '/secret-manager/$projectId/commits/$environment/$folderId',
|
||||||
params: {
|
|
||||||
projectId: params.projectId,
|
|
||||||
environment: params.environment,
|
|
||||||
folderId: params.folderId
|
|
||||||
},
|
|
||||||
search: {
|
|
||||||
secretPath: search.secretPath
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: params.commitId,
|
|
||||||
link: linkOptions({
|
|
||||||
to: "/secret-manager/$projectId/commits/$environment/$folderId/$commitId",
|
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId,
|
projectId: params.projectId,
|
||||||
environment: params.environment,
|
environment: params.environment,
|
||||||
folderId: params.folderId,
|
folderId: params.folderId,
|
||||||
commitId: params.commitId
|
|
||||||
},
|
},
|
||||||
search: {
|
search: {
|
||||||
secretPath: search.secretPath
|
secretPath: search.secretPath,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Restore"
|
label: params.commitId,
|
||||||
}
|
link: linkOptions({
|
||||||
]
|
to: '/secret-manager/$projectId/commits/$environment/$folderId/$commitId',
|
||||||
};
|
params: {
|
||||||
}
|
projectId: params.projectId,
|
||||||
});
|
environment: params.environment,
|
||||||
|
folderId: params.folderId,
|
||||||
|
commitId: params.commitId,
|
||||||
|
},
|
||||||
|
search: {
|
||||||
|
secretPath: search.secretPath,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: 'Restore',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|||||||
@@ -1,26 +1,30 @@
|
|||||||
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
import {
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
createFileRoute,
|
||||||
import { z } from "zod";
|
linkOptions,
|
||||||
|
stripSearchParams,
|
||||||
|
} from '@tanstack/react-router'
|
||||||
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { SecretDashboardPathBreadcrumb } from "@app/components/navigation/SecretDashboardPathBreadcrumb";
|
import { SecretDashboardPathBreadcrumb } from '@app/components/navigation/SecretDashboardPathBreadcrumb'
|
||||||
import { BreadcrumbTypes } from "@app/components/v2";
|
import { BreadcrumbTypes } from '@app/components/v2'
|
||||||
|
|
||||||
import { CommitDetailsPage } from "./CommitDetailsPage";
|
import { CommitDetailsPage } from './CommitDetailsPage'
|
||||||
|
|
||||||
const CommitDetailsPageQueryParamsSchema = z.object({
|
const CommitDetailsPageQueryParamsSchema = z.object({
|
||||||
secretPath: z.string().catch("/")
|
secretPath: z.string().catch('/'),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/commits/$environment/$folderId/$commitId/',
|
||||||
)({
|
)({
|
||||||
component: CommitDetailsPage,
|
component: CommitDetailsPage,
|
||||||
validateSearch: zodValidator(CommitDetailsPageQueryParamsSchema),
|
validateSearch: zodValidator(CommitDetailsPageQueryParamsSchema),
|
||||||
search: {
|
search: {
|
||||||
middlewares: [stripSearchParams({ secretPath: "/" })]
|
middlewares: [stripSearchParams({ secretPath: '/' })],
|
||||||
},
|
},
|
||||||
beforeLoad: ({ context, params, search }) => {
|
beforeLoad: ({ context, params, search }) => {
|
||||||
const secretPathSegments = search.secretPath.split("/").filter(Boolean);
|
const secretPathSegments = search.secretPath.split('/').filter(Boolean)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
@@ -28,18 +32,20 @@ export const Route = createFileRoute(
|
|||||||
{
|
{
|
||||||
type: BreadcrumbTypes.Dropdown,
|
type: BreadcrumbTypes.Dropdown,
|
||||||
label:
|
label:
|
||||||
context.project.environments.find((el) => el.slug === params.environment)?.name || "",
|
context.project.environments.find(
|
||||||
dropdownTitle: "Environments",
|
(el) => el.slug === params.environment,
|
||||||
|
)?.name || '',
|
||||||
|
dropdownTitle: 'Environments',
|
||||||
links: context.project.environments.map((el) => ({
|
links: context.project.environments.map((el) => ({
|
||||||
label: el.name,
|
label: el.name,
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/secrets/$envSlug",
|
to: '/secret-manager/$projectId/secrets/$envSlug',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId,
|
projectId: params.projectId,
|
||||||
envSlug: el.slug
|
envSlug: el.slug,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}))
|
})),
|
||||||
},
|
},
|
||||||
...secretPathSegments.map((_, index) => ({
|
...secretPathSegments.map((_, index) => ({
|
||||||
type: BreadcrumbTypes.Component,
|
type: BreadcrumbTypes.Component,
|
||||||
@@ -51,26 +57,26 @@ export const Route = createFileRoute(
|
|||||||
projectId={params.projectId}
|
projectId={params.projectId}
|
||||||
disableCopy
|
disableCopy
|
||||||
/>
|
/>
|
||||||
)
|
),
|
||||||
})),
|
})),
|
||||||
{
|
{
|
||||||
label: "Commits",
|
label: 'Commits',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/commits/$environment/$folderId",
|
to: '/secret-manager/$projectId/commits/$environment/$folderId',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId,
|
projectId: params.projectId,
|
||||||
environment: params.environment,
|
environment: params.environment,
|
||||||
folderId: params.folderId
|
folderId: params.folderId,
|
||||||
},
|
},
|
||||||
search: {
|
search: {
|
||||||
secretPath: search.secretPath
|
secretPath: search.secretPath,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: params.commitId
|
label: params.commitId,
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,27 +1,31 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unused-vars */
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
||||||
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
import {
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
createFileRoute,
|
||||||
import { z } from "zod";
|
linkOptions,
|
||||||
|
stripSearchParams,
|
||||||
|
} from '@tanstack/react-router'
|
||||||
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { SecretDashboardPathBreadcrumb } from "@app/components/navigation/SecretDashboardPathBreadcrumb";
|
import { SecretDashboardPathBreadcrumb } from '@app/components/navigation/SecretDashboardPathBreadcrumb'
|
||||||
import { BreadcrumbTypes } from "@app/components/v2";
|
import { BreadcrumbTypes } from '@app/components/v2'
|
||||||
|
|
||||||
import { CommitsPage } from "./CommitsPage";
|
import { CommitsPage } from './CommitsPage'
|
||||||
|
|
||||||
const CommitsPageQueryParamsSchema = z.object({
|
const CommitsPageQueryParamsSchema = z.object({
|
||||||
secretPath: z.string().catch("/")
|
secretPath: z.string().catch('/'),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/commits/$environment/$folderId/"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/commits/$environment/$folderId/',
|
||||||
)({
|
)({
|
||||||
component: CommitsPage,
|
component: CommitsPage,
|
||||||
validateSearch: zodValidator(CommitsPageQueryParamsSchema),
|
validateSearch: zodValidator(CommitsPageQueryParamsSchema),
|
||||||
search: {
|
search: {
|
||||||
middlewares: [stripSearchParams({ secretPath: "/" })]
|
middlewares: [stripSearchParams({ secretPath: '/' })],
|
||||||
},
|
},
|
||||||
beforeLoad: ({ context, params, search }) => {
|
beforeLoad: ({ context, params, search }) => {
|
||||||
const secretPathSegments = search.secretPath.split("/").filter(Boolean);
|
const secretPathSegments = search.secretPath.split('/').filter(Boolean)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
@@ -29,18 +33,20 @@ export const Route = createFileRoute(
|
|||||||
{
|
{
|
||||||
type: BreadcrumbTypes.Dropdown,
|
type: BreadcrumbTypes.Dropdown,
|
||||||
label:
|
label:
|
||||||
context.project.environments.find((el) => el.slug === params.environment)?.name || "",
|
context.project.environments.find(
|
||||||
dropdownTitle: "Environments",
|
(el) => el.slug === params.environment,
|
||||||
|
)?.name || '',
|
||||||
|
dropdownTitle: 'Environments',
|
||||||
links: context.project.environments.map((el) => ({
|
links: context.project.environments.map((el) => ({
|
||||||
label: el.name,
|
label: el.name,
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/secrets/$envSlug",
|
to: '/secret-manager/$projectId/secrets/$envSlug',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId,
|
projectId: params.projectId,
|
||||||
envSlug: el.slug
|
envSlug: el.slug,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}))
|
})),
|
||||||
},
|
},
|
||||||
...secretPathSegments.map((_, index) => ({
|
...secretPathSegments.map((_, index) => ({
|
||||||
type: BreadcrumbTypes.Component,
|
type: BreadcrumbTypes.Component,
|
||||||
@@ -52,20 +58,20 @@ export const Route = createFileRoute(
|
|||||||
projectId={params.projectId}
|
projectId={params.projectId}
|
||||||
disableCopy
|
disableCopy
|
||||||
/>
|
/>
|
||||||
)
|
),
|
||||||
})),
|
})),
|
||||||
{
|
{
|
||||||
label: "Commits",
|
label: 'Commits',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/commits/$environment/$folderId",
|
to: '/secret-manager/$projectId/commits/$environment/$folderId',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId,
|
projectId: params.projectId,
|
||||||
environment: params.environment,
|
environment: params.environment,
|
||||||
folderId: params.folderId
|
folderId: params.folderId,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -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/secret-manager/$projectId/_secret-manager-layout/allowlist"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/allowlist',
|
||||||
)({
|
)({
|
||||||
component: () => IPAllowListPage
|
component: () => IPAllowListPage,
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
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/secret-manager/$projectId/_secret-manager-layout/integrations/$integrationId"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/$integrationId',
|
||||||
)({
|
)({
|
||||||
component: IntegrationDetailsByIDPage,
|
component: IntegrationDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Details"
|
label: 'Details',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,101 +1,101 @@
|
|||||||
import { createFileRoute, redirect } from "@tanstack/react-router";
|
import { createFileRoute, redirect } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { workspaceKeys } from "@app/hooks/api";
|
import { workspaceKeys } from '@app/hooks/api'
|
||||||
import { TIntegration } from "@app/hooks/api/integrations/types";
|
import { TIntegration } from '@app/hooks/api/integrations/types'
|
||||||
import {
|
import {
|
||||||
fetchSecretSyncsByProjectId,
|
fetchSecretSyncsByProjectId,
|
||||||
SecretSync,
|
SecretSync,
|
||||||
secretSyncKeys,
|
secretSyncKeys,
|
||||||
TSecretSync
|
TSecretSync,
|
||||||
} from "@app/hooks/api/secretSyncs";
|
} from '@app/hooks/api/secretSyncs'
|
||||||
import { fetchWorkspaceIntegrations } from "@app/hooks/api/workspace/queries";
|
import { fetchWorkspaceIntegrations } from '@app/hooks/api/workspace/queries'
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { IntegrationsListPage } from "./IntegrationsListPage";
|
import { IntegrationsListPage } from './IntegrationsListPage'
|
||||||
|
|
||||||
const IntegrationsListPageQuerySchema = z.object({
|
const IntegrationsListPageQuerySchema = z.object({
|
||||||
selectedTab: z.nativeEnum(IntegrationsListPageTabs).optional(),
|
selectedTab: z.nativeEnum(IntegrationsListPageTabs).optional(),
|
||||||
addSync: z.nativeEnum(SecretSync).optional()
|
addSync: z.nativeEnum(SecretSync).optional(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/',
|
||||||
)({
|
)({
|
||||||
component: IntegrationsListPage,
|
component: IntegrationsListPage,
|
||||||
validateSearch: zodValidator(IntegrationsListPageQuerySchema),
|
validateSearch: zodValidator(IntegrationsListPageQuerySchema),
|
||||||
beforeLoad: async ({ context, search, params: { projectId } }) => {
|
beforeLoad: async ({ context, search, params: { projectId } }) => {
|
||||||
if (!search.selectedTab) {
|
if (!search.selectedTab) {
|
||||||
let secretSyncs: TSecretSync[];
|
let secretSyncs: TSecretSync[]
|
||||||
|
|
||||||
try {
|
try {
|
||||||
secretSyncs = await context.queryClient.ensureQueryData({
|
secretSyncs = await context.queryClient.ensureQueryData({
|
||||||
queryKey: secretSyncKeys.list(projectId),
|
queryKey: secretSyncKeys.list(projectId),
|
||||||
queryFn: () => fetchSecretSyncsByProjectId(projectId)
|
queryFn: () => fetchSecretSyncsByProjectId(projectId),
|
||||||
});
|
})
|
||||||
} catch {
|
} catch {
|
||||||
throw redirect({
|
throw redirect({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params: {
|
params: {
|
||||||
projectId
|
projectId,
|
||||||
},
|
},
|
||||||
search: { selectedTab: IntegrationsListPageTabs.NativeIntegrations }
|
search: { selectedTab: IntegrationsListPageTabs.NativeIntegrations },
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (secretSyncs.length) {
|
if (secretSyncs.length) {
|
||||||
throw redirect({
|
throw redirect({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params: {
|
params: {
|
||||||
projectId
|
projectId,
|
||||||
},
|
},
|
||||||
search: { selectedTab: IntegrationsListPageTabs.SecretSyncs }
|
search: { selectedTab: IntegrationsListPageTabs.SecretSyncs },
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
let integrations: TIntegration[];
|
let integrations: TIntegration[]
|
||||||
try {
|
try {
|
||||||
integrations = await context.queryClient.ensureQueryData({
|
integrations = await context.queryClient.ensureQueryData({
|
||||||
queryKey: workspaceKeys.getWorkspaceIntegrations(projectId),
|
queryKey: workspaceKeys.getWorkspaceIntegrations(projectId),
|
||||||
queryFn: () => fetchWorkspaceIntegrations(projectId)
|
queryFn: () => fetchWorkspaceIntegrations(projectId),
|
||||||
});
|
})
|
||||||
} catch {
|
} catch {
|
||||||
throw redirect({
|
throw redirect({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params: {
|
params: {
|
||||||
projectId
|
projectId,
|
||||||
},
|
},
|
||||||
search: { selectedTab: IntegrationsListPageTabs.SecretSyncs }
|
search: { selectedTab: IntegrationsListPageTabs.SecretSyncs },
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (integrations.length) {
|
if (integrations.length) {
|
||||||
throw redirect({
|
throw redirect({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params: {
|
params: {
|
||||||
projectId
|
projectId,
|
||||||
},
|
},
|
||||||
search: { selectedTab: IntegrationsListPageTabs.NativeIntegrations }
|
search: { selectedTab: IntegrationsListPageTabs.NativeIntegrations },
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
throw redirect({
|
throw redirect({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params: {
|
params: {
|
||||||
projectId
|
projectId,
|
||||||
},
|
},
|
||||||
search: { selectedTab: IntegrationsListPageTabs.SecretSyncs }
|
search: { selectedTab: IntegrationsListPageTabs.SecretSyncs },
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations"
|
label: 'Integrations',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
import { createFileRoute, stripSearchParams } from "@tanstack/react-router";
|
import { createFileRoute, stripSearchParams } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { OverviewPage } from "./OverviewPage";
|
import { OverviewPage } from './OverviewPage'
|
||||||
|
|
||||||
const SecretOverviewPageQuerySchema = z.object({
|
const SecretOverviewPageQuerySchema = z.object({
|
||||||
search: z.string().catch(""),
|
search: z.string().catch(''),
|
||||||
secretPath: z.string().catch("/")
|
secretPath: z.string().catch('/'),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/overview"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/overview',
|
||||||
)({
|
)({
|
||||||
component: OverviewPage,
|
component: OverviewPage,
|
||||||
validateSearch: zodValidator(SecretOverviewPageQuerySchema),
|
validateSearch: zodValidator(SecretOverviewPageQuerySchema),
|
||||||
search: {
|
search: {
|
||||||
middlewares: [stripSearchParams({ secretPath: "/", search: "" })]
|
middlewares: [stripSearchParams({ secretPath: '/', search: '' })],
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
import { createFileRoute } from "@tanstack/react-router";
|
import { createFileRoute } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { SecretApprovalsPage } from "./SecretApprovalsPage";
|
import { SecretApprovalsPage } from './SecretApprovalsPage'
|
||||||
|
|
||||||
const SecretApprovalPageQueryParams = z.object({
|
const SecretApprovalPageQueryParams = z.object({
|
||||||
requestId: z.string().catch("")
|
requestId: z.string().catch(''),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/approval"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/approval',
|
||||||
)({
|
)({
|
||||||
component: SecretApprovalsPage,
|
component: SecretApprovalsPage,
|
||||||
validateSearch: zodValidator(SecretApprovalPageQueryParams),
|
validateSearch: zodValidator(SecretApprovalPageQueryParams),
|
||||||
@@ -18,9 +18,9 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Approvals"
|
label: 'Approvals',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,44 +1,51 @@
|
|||||||
import { createFileRoute, linkOptions, stripSearchParams } from "@tanstack/react-router";
|
import {
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
createFileRoute,
|
||||||
import { z } from "zod";
|
linkOptions,
|
||||||
|
stripSearchParams,
|
||||||
|
} from '@tanstack/react-router'
|
||||||
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { SecretDashboardPathBreadcrumb } from "@app/components/navigation/SecretDashboardPathBreadcrumb";
|
import { SecretDashboardPathBreadcrumb } from '@app/components/navigation/SecretDashboardPathBreadcrumb'
|
||||||
import { BreadcrumbTypes } from "@app/components/v2";
|
import { BreadcrumbTypes } from '@app/components/v2'
|
||||||
|
|
||||||
import { SecretDashboardPage } from "./SecretDashboardPage";
|
import { SecretDashboardPage } from './SecretDashboardPage'
|
||||||
|
|
||||||
const SecretDashboardPageQueryParamsSchema = z.object({
|
const SecretDashboardPageQueryParamsSchema = z.object({
|
||||||
secretPath: z.string().catch("/"),
|
secretPath: z.string().catch('/'),
|
||||||
search: z.string().catch(""),
|
search: z.string().catch(''),
|
||||||
tags: z.string().catch("")
|
tags: z.string().catch(''),
|
||||||
});
|
})
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/secrets/$envSlug"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/secrets/$envSlug',
|
||||||
)({
|
)({
|
||||||
component: SecretDashboardPage,
|
component: SecretDashboardPage,
|
||||||
validateSearch: zodValidator(SecretDashboardPageQueryParamsSchema),
|
validateSearch: zodValidator(SecretDashboardPageQueryParamsSchema),
|
||||||
search: {
|
search: {
|
||||||
middlewares: [stripSearchParams({ secretPath: "/", search: "", tags: "" })]
|
middlewares: [stripSearchParams({ secretPath: '/', search: '', tags: '' })],
|
||||||
},
|
},
|
||||||
beforeLoad: ({ context, params, search }) => {
|
beforeLoad: ({ context, params, search }) => {
|
||||||
const secretPathSegments = search.secretPath.split("/").filter(Boolean);
|
const secretPathSegments = search.secretPath.split('/').filter(Boolean)
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
type: BreadcrumbTypes.Dropdown,
|
type: BreadcrumbTypes.Dropdown,
|
||||||
label: context.project.environments.find((el) => el.slug === params.envSlug)?.name || "",
|
label:
|
||||||
dropdownTitle: "Environments",
|
context.project.environments.find(
|
||||||
|
(el) => el.slug === params.envSlug,
|
||||||
|
)?.name || '',
|
||||||
|
dropdownTitle: 'Environments',
|
||||||
links: context.project.environments.map((el) => ({
|
links: context.project.environments.map((el) => ({
|
||||||
label: el.name,
|
label: el.name,
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/secrets/$envSlug",
|
to: '/secret-manager/$projectId/secrets/$envSlug',
|
||||||
params: {
|
params: {
|
||||||
projectId: params.projectId,
|
projectId: params.projectId,
|
||||||
envSlug: el.slug
|
envSlug: el.slug,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
}))
|
})),
|
||||||
},
|
},
|
||||||
...secretPathSegments.map((_, index) => ({
|
...secretPathSegments.map((_, index) => ({
|
||||||
type: BreadcrumbTypes.Component,
|
type: BreadcrumbTypes.Component,
|
||||||
@@ -49,9 +56,9 @@ export const Route = createFileRoute(
|
|||||||
environmentSlug={params.envSlug}
|
environmentSlug={params.envSlug}
|
||||||
projectId={params.projectId}
|
projectId={params.projectId}
|
||||||
/>
|
/>
|
||||||
)
|
),
|
||||||
}))
|
})),
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import { createFileRoute } from "@tanstack/react-router";
|
import { createFileRoute } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { SecretRotationPage } from "./SecretRotationPage";
|
import { SecretRotationPage } from './SecretRotationPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/secret-rotation"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/secret-rotation',
|
||||||
)({
|
)({
|
||||||
component: SecretRotationPage,
|
component: SecretRotationPage,
|
||||||
beforeLoad: ({ context }) => {
|
beforeLoad: ({ context }) => {
|
||||||
@@ -11,9 +11,9 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Secret Rotation"
|
label: 'Secret Rotation',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { SecretSyncDetailsByIDPage } from "./SecretSyncDetailsByIDPage";
|
import { SecretSyncDetailsByIDPage } from './SecretSyncDetailsByIDPage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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',
|
||||||
)({
|
)({
|
||||||
component: SecretSyncDetailsByIDPage,
|
component: SecretSyncDetailsByIDPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.SecretSyncs
|
selectedTab: IntegrationsListPageTabs.SecretSyncs,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Secret Sync"
|
label: 'Secret Sync',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -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/secret-manager/$projectId/_secret-manager-layout/settings"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-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',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+15
-15
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { AWSParameterStoreAuthorizeIntegrationPage } from "./AwsParameterStoreAuthorizePage";
|
import { AWSParameterStoreAuthorizeIntegrationPage } from './AwsParameterStoreAuthorizePage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/aws-parameter-store/authorize"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/aws-parameter-store/authorize',
|
||||||
)({
|
)({
|
||||||
component: AWSParameterStoreAuthorizeIntegrationPage,
|
component: AWSParameterStoreAuthorizeIntegrationPage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "AWS Parameter Store"
|
label: 'AWS Parameter Store',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+19
-19
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { AWSParameterStoreConfigurePage } from "./AwsParamterStoreConfigurePage";
|
import { AWSParameterStoreConfigurePage } from './AwsParamterStoreConfigurePage'
|
||||||
|
|
||||||
const AwsParameterStoreConfigurePageQueryParamsSchema = z.object({
|
const AwsParameterStoreConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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',
|
||||||
)({
|
)({
|
||||||
component: AWSParameterStoreConfigurePage,
|
component: AWSParameterStoreConfigurePage,
|
||||||
validateSearch: zodValidator(AwsParameterStoreConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(AwsParameterStoreConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "AWS Parameter Store"
|
label: 'AWS Parameter Store',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+15
-15
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { AWSSecretManagerAuthorizePage } from "./AwsSecretManagerAuthorizePage";
|
import { AWSSecretManagerAuthorizePage } from './AwsSecretManagerAuthorizePage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/aws-secret-manager/authorize"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/aws-secret-manager/authorize',
|
||||||
)({
|
)({
|
||||||
component: AWSSecretManagerAuthorizePage,
|
component: AWSSecretManagerAuthorizePage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "AWS Secret Manager"
|
label: 'AWS Secret Manager',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+19
-19
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { AwsSecretManagerConfigurePage } from "./AwsSecretManagerConfigurePage";
|
import { AwsSecretManagerConfigurePage } from './AwsSecretManagerConfigurePage'
|
||||||
|
|
||||||
const AwsSecretManagerConfigurePageQueryParamsSchema = z.object({
|
const AwsSecretManagerConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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',
|
||||||
)({
|
)({
|
||||||
component: AwsSecretManagerConfigurePage,
|
component: AwsSecretManagerConfigurePage,
|
||||||
validateSearch: zodValidator(AwsSecretManagerConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(AwsSecretManagerConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "AWS Secret Manager"
|
label: 'AWS Secret Manager',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+19
-19
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { AzureAppConfigurationConfigurePage } from "./AzureAppConfigurationConfigurePage";
|
import { AzureAppConfigurationConfigurePage } from './AzureAppConfigurationConfigurePage'
|
||||||
|
|
||||||
const AzureAppConfigurationPageQueryParamsSchema = z.object({
|
const AzureAppConfigurationPageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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',
|
||||||
)({
|
)({
|
||||||
component: AzureAppConfigurationConfigurePage,
|
component: AzureAppConfigurationConfigurePage,
|
||||||
validateSearch: zodValidator(AzureAppConfigurationPageQueryParamsSchema),
|
validateSearch: zodValidator(AzureAppConfigurationPageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Azure App Configuration"
|
label: 'Azure App Configuration',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+26
-22
@@ -1,39 +1,43 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { AzureAppConfigurationOauthCallbackPage } from "./AzureAppConfigurationOauthCallbackPage";
|
import { AzureAppConfigurationOauthCallbackPage } from './AzureAppConfigurationOauthCallbackPage'
|
||||||
|
|
||||||
export const AzureAppConfigurationOauthCallbackPageQueryParamsSchema = z.object({
|
export const AzureAppConfigurationOauthCallbackPageQueryParamsSchema = z.object(
|
||||||
state: z.string().catch(""),
|
{
|
||||||
code: z.coerce.string().catch("")
|
state: z.string().catch(''),
|
||||||
});
|
code: z.coerce.string().catch(''),
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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',
|
||||||
)({
|
)({
|
||||||
component: AzureAppConfigurationOauthCallbackPage,
|
component: AzureAppConfigurationOauthCallbackPage,
|
||||||
validateSearch: zodValidator(AzureAppConfigurationOauthCallbackPageQueryParamsSchema),
|
validateSearch: zodValidator(
|
||||||
|
AzureAppConfigurationOauthCallbackPageQueryParamsSchema,
|
||||||
|
),
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Azure App Configuration"
|
label: 'Azure App Configuration',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { AzureDevopsAuthorizePage } from "./AzureDevopsAuthorizePage";
|
import { AzureDevopsAuthorizePage } from './AzureDevopsAuthorizePage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/azure-devops/authorize"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-devops/authorize',
|
||||||
)({
|
)({
|
||||||
component: AzureDevopsAuthorizePage,
|
component: AzureDevopsAuthorizePage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Azure Devops"
|
label: 'Azure Devops',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { AzureDevopsConfigurePage } from "./AzureDevopsConfigurePage";
|
import { AzureDevopsConfigurePage } from './AzureDevopsConfigurePage'
|
||||||
|
|
||||||
const AzureDevopsConfigurePageQueryParamsSchema = z.object({
|
const AzureDevopsConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/azure-devops/create"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-devops/create',
|
||||||
)({
|
)({
|
||||||
component: AzureDevopsConfigurePage,
|
component: AzureDevopsConfigurePage,
|
||||||
validateSearch: zodValidator(AzureDevopsConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(AzureDevopsConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Azure Devops"
|
label: 'Azure Devops',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+18
-18
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import z from "zod";
|
import z from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { AzureKeyVaultAuthorizePage } from "./AzureKeyVaultAuthorizePage";
|
import { AzureKeyVaultAuthorizePage } from './AzureKeyVaultAuthorizePage'
|
||||||
|
|
||||||
const PageQueryParamsSchema = z.object({
|
const PageQueryParamsSchema = z.object({
|
||||||
state: z.string(),
|
state: z.string(),
|
||||||
clientId: z.string().optional()
|
clientId: z.string().optional(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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',
|
||||||
)({
|
)({
|
||||||
component: AzureKeyVaultAuthorizePage,
|
component: AzureKeyVaultAuthorizePage,
|
||||||
validateSearch: PageQueryParamsSchema,
|
validateSearch: PageQueryParamsSchema,
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Azure Key Vault"
|
label: 'Azure Key Vault',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+19
-19
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { AzureKeyVaultConfigurePage } from "./AzureKeyVaultConfigurePage";
|
import { AzureKeyVaultConfigurePage } from './AzureKeyVaultConfigurePage'
|
||||||
|
|
||||||
const AzureKeyVaultConfigurePageQueryParamsSchema = z.object({
|
const AzureKeyVaultConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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',
|
||||||
)({
|
)({
|
||||||
component: AzureKeyVaultConfigurePage,
|
component: AzureKeyVaultConfigurePage,
|
||||||
validateSearch: zodValidator(AzureKeyVaultConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(AzureKeyVaultConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Azure Key Vault"
|
label: 'Azure Key Vault',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+20
-20
@@ -1,18 +1,18 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { AzureKeyVaultOauthCallbackPage } from "./AzureKeyVaultOauthCallback";
|
import { AzureKeyVaultOauthCallbackPage } from './AzureKeyVaultOauthCallback'
|
||||||
|
|
||||||
export const AzureKeyVaultOauthCallbackQueryParamsSchema = z.object({
|
export const AzureKeyVaultOauthCallbackQueryParamsSchema = z.object({
|
||||||
state: z.string().catch(""),
|
state: z.string().catch(''),
|
||||||
code: z.coerce.string().catch("")
|
code: z.coerce.string().catch(''),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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',
|
||||||
)({
|
)({
|
||||||
component: AzureKeyVaultOauthCallbackPage,
|
component: AzureKeyVaultOauthCallbackPage,
|
||||||
validateSearch: zodValidator(AzureKeyVaultOauthCallbackQueryParamsSchema),
|
validateSearch: zodValidator(AzureKeyVaultOauthCallbackQueryParamsSchema),
|
||||||
@@ -21,19 +21,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Azure Key Vault"
|
label: 'Azure Key Vault',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { BitbucketConfigurePage } from "./BitbucketConfigurePage";
|
import { BitbucketConfigurePage } from './BitbucketConfigurePage'
|
||||||
|
|
||||||
const BitbucketConfigurePageQueryParamsSchema = z.object({
|
const BitbucketConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/bitbucket/create"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/bitbucket/create',
|
||||||
)({
|
)({
|
||||||
component: BitbucketConfigurePage,
|
component: BitbucketConfigurePage,
|
||||||
validateSearch: zodValidator(BitbucketConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(BitbucketConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Bitbucket"
|
label: 'Bitbucket',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+20
-20
@@ -1,18 +1,18 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { BitbucketOauthCallbackPage } from "./BitbucketOauthCallbackPage";
|
import { BitbucketOauthCallbackPage } from './BitbucketOauthCallbackPage'
|
||||||
|
|
||||||
export const BitbucketOauthCallbackQueryParamsSchema = z.object({
|
export const BitbucketOauthCallbackQueryParamsSchema = z.object({
|
||||||
state: z.string().catch(""),
|
state: z.string().catch(''),
|
||||||
code: z.coerce.string().catch("")
|
code: z.coerce.string().catch(''),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/bitbucket/oauth2/callback"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/bitbucket/oauth2/callback',
|
||||||
)({
|
)({
|
||||||
component: BitbucketOauthCallbackPage,
|
component: BitbucketOauthCallbackPage,
|
||||||
validateSearch: zodValidator(BitbucketOauthCallbackQueryParamsSchema),
|
validateSearch: zodValidator(BitbucketOauthCallbackQueryParamsSchema),
|
||||||
@@ -21,19 +21,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Bitbucket"
|
label: 'Bitbucket',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { ChecklyAuthorizePage } from "./ChecklyAuthorizePage";
|
import { ChecklyAuthorizePage } from './ChecklyAuthorizePage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/checkly/authorize"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/checkly/authorize',
|
||||||
)({
|
)({
|
||||||
component: ChecklyAuthorizePage,
|
component: ChecklyAuthorizePage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Checkly"
|
label: 'Checkly',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { ChecklyConfigurePage } from "./ChecklyConfigurePage";
|
import { ChecklyConfigurePage } from './ChecklyConfigurePage'
|
||||||
|
|
||||||
const ChecklyConfigurePageQueryParamsSchema = z.object({
|
const ChecklyConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/checkly/create"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/checkly/create',
|
||||||
)({
|
)({
|
||||||
component: ChecklyConfigurePage,
|
component: ChecklyConfigurePage,
|
||||||
validateSearch: zodValidator(ChecklyConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(ChecklyConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Checkly"
|
label: 'Checkly',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { CircleCIAuthorizePage } from "./CircleCIAuthorizePage";
|
import { CircleCIAuthorizePage } from './CircleCIAuthorizePage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/circleci/authorize"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/circleci/authorize',
|
||||||
)({
|
)({
|
||||||
component: CircleCIAuthorizePage,
|
component: CircleCIAuthorizePage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Circle CI"
|
label: 'Circle CI',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { CircleCIConfigurePage } from "./CircleCIConfigurePage";
|
import { CircleCIConfigurePage } from './CircleCIConfigurePage'
|
||||||
|
|
||||||
const CircleCIConfigurePageQueryParamsSchema = z.object({
|
const CircleCIConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/circleci/create"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/circleci/create',
|
||||||
)({
|
)({
|
||||||
component: CircleCIConfigurePage,
|
component: CircleCIConfigurePage,
|
||||||
validateSearch: zodValidator(CircleCIConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(CircleCIConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Circle CI"
|
label: 'Circle CI',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { Cloud66AuthorizePage } from "./Cloud66AuthorizePage";
|
import { Cloud66AuthorizePage } from './Cloud66AuthorizePage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/cloud-66/authorize"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloud-66/authorize',
|
||||||
)({
|
)({
|
||||||
component: Cloud66AuthorizePage,
|
component: Cloud66AuthorizePage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Cloud 66"
|
label: 'Cloud 66',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { Cloud66ConfigurePage } from "./Cloud66ConfigurePage";
|
import { Cloud66ConfigurePage } from './Cloud66ConfigurePage'
|
||||||
|
|
||||||
const Cloud66ConfigurePageQueryParamsSchema = z.object({
|
const Cloud66ConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/cloud-66/create"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloud-66/create',
|
||||||
)({
|
)({
|
||||||
component: Cloud66ConfigurePage,
|
component: Cloud66ConfigurePage,
|
||||||
validateSearch: zodValidator(Cloud66ConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(Cloud66ConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Cloud 66"
|
label: 'Cloud 66',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+15
-15
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { CloudflarePagesAuthorizePage } from "./CloudflarePagesAuthorizePage";
|
import { CloudflarePagesAuthorizePage } from './CloudflarePagesAuthorizePage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/cloudflare-pages/authorize"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloudflare-pages/authorize',
|
||||||
)({
|
)({
|
||||||
component: CloudflarePagesAuthorizePage,
|
component: CloudflarePagesAuthorizePage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Cloudflare Pages"
|
label: 'Cloudflare Pages',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+19
-19
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { CloudflarePagesConfigurePage } from "./CloudflarePagesConfigurePage";
|
import { CloudflarePagesConfigurePage } from './CloudflarePagesConfigurePage'
|
||||||
|
|
||||||
const CloudflarePagesConfigurePageQueryParamsSchema = z.object({
|
const CloudflarePagesConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/cloudflare-pages/create"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloudflare-pages/create',
|
||||||
)({
|
)({
|
||||||
component: CloudflarePagesConfigurePage,
|
component: CloudflarePagesConfigurePage,
|
||||||
validateSearch: zodValidator(CloudflarePagesConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(CloudflarePagesConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Cloudflare Pages"
|
label: 'Cloudflare Pages',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+15
-15
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { CloudflareWorkersAuthorizePage } from "./CloudflareWorkersAuthorizePage";
|
import { CloudflareWorkersAuthorizePage } from './CloudflareWorkersAuthorizePage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/cloudflare-workers/authorize"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloudflare-workers/authorize',
|
||||||
)({
|
)({
|
||||||
component: CloudflareWorkersAuthorizePage,
|
component: CloudflareWorkersAuthorizePage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Cloudflare Workers"
|
label: 'Cloudflare Workers',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+19
-19
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { CloudflareWorkersConfigurePage } from "./CloudflareWorkersConfigurePage";
|
import { CloudflareWorkersConfigurePage } from './CloudflareWorkersConfigurePage'
|
||||||
|
|
||||||
const CloudflareWorkersConfigurePageQueryParamsSchema = z.object({
|
const CloudflareWorkersConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/cloudflare-workers/create"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloudflare-workers/create',
|
||||||
)({
|
)({
|
||||||
component: CloudflareWorkersConfigurePage,
|
component: CloudflareWorkersConfigurePage,
|
||||||
validateSearch: zodValidator(CloudflareWorkersConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(CloudflareWorkersConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Cloudflare Workers"
|
label: 'Cloudflare Workers',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { CodefreshAuthorizePage } from "./CodefreshAuthorizePage";
|
import { CodefreshAuthorizePage } from './CodefreshAuthorizePage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/codefresh/authorize"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/codefresh/authorize',
|
||||||
)({
|
)({
|
||||||
component: CodefreshAuthorizePage,
|
component: CodefreshAuthorizePage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Codefresh"
|
label: 'Codefresh',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { CodefreshConfigurePage } from "./CodefreshConfigurePage";
|
import { CodefreshConfigurePage } from './CodefreshConfigurePage'
|
||||||
|
|
||||||
const CodefreshConfigurePageQueryParamsSchema = z.object({
|
const CodefreshConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/codefresh/create"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/codefresh/create',
|
||||||
)({
|
)({
|
||||||
component: CodefreshConfigurePage,
|
component: CodefreshConfigurePage,
|
||||||
validateSearch: zodValidator(CodefreshConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(CodefreshConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Codefresh"
|
label: 'Codefresh',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { DatabricksAuthorizePage } from "./DatabricksAuthorizePage";
|
import { DatabricksAuthorizePage } from './DatabricksAuthorizePage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/databricks/authorize"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/databricks/authorize',
|
||||||
)({
|
)({
|
||||||
component: DatabricksAuthorizePage,
|
component: DatabricksAuthorizePage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Databricks"
|
label: 'Databricks',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { DatabricksConfigurePage } from "./DatabricksConfigurePage";
|
import { DatabricksConfigurePage } from './DatabricksConfigurePage'
|
||||||
|
|
||||||
const DatabricksConfigurePageQueryParamsSchema = z.object({
|
const DatabricksConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/databricks/create"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/databricks/create',
|
||||||
)({
|
)({
|
||||||
component: DatabricksConfigurePage,
|
component: DatabricksConfigurePage,
|
||||||
validateSearch: zodValidator(DatabricksConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(DatabricksConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Databricks"
|
label: 'Databricks',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+15
-15
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { DigitalOceanAppPlatformAuthorizePage } from "./DigitalOceanAppPlatformAuthorizePage";
|
import { DigitalOceanAppPlatformAuthorizePage } from './DigitalOceanAppPlatformAuthorizePage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/authorize"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/digital-ocean-app-platform/authorize',
|
||||||
)({
|
)({
|
||||||
component: DigitalOceanAppPlatformAuthorizePage,
|
component: DigitalOceanAppPlatformAuthorizePage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "DigitalOcean App Platform"
|
label: 'DigitalOcean App Platform',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+22
-20
@@ -1,38 +1,40 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { DigitalOceanAppPlatformConfigurePage } from "./DigitalOceanAppPlatformConfigurePage";
|
import { DigitalOceanAppPlatformConfigurePage } from './DigitalOceanAppPlatformConfigurePage'
|
||||||
|
|
||||||
const DigitalOceanAppPlatformConfigurePageQueryParamsSchema = z.object({
|
const DigitalOceanAppPlatformConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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',
|
||||||
)({
|
)({
|
||||||
component: DigitalOceanAppPlatformConfigurePage,
|
component: DigitalOceanAppPlatformConfigurePage,
|
||||||
validateSearch: zodValidator(DigitalOceanAppPlatformConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(
|
||||||
|
DigitalOceanAppPlatformConfigurePageQueryParamsSchema,
|
||||||
|
),
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "DigitalOcean App Platform"
|
label: 'DigitalOcean App Platform',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { FlyioAuthorizePage } from "./FlyioAuthorizePage";
|
import { FlyioAuthorizePage } from './FlyioAuthorizePage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/flyio/authorize"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/flyio/authorize',
|
||||||
)({
|
)({
|
||||||
component: FlyioAuthorizePage,
|
component: FlyioAuthorizePage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Fly IO"
|
label: 'Fly IO',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { FlyioConfigurePage } from "./FlyioConfigurePage";
|
import { FlyioConfigurePage } from './FlyioConfigurePage'
|
||||||
|
|
||||||
const FlyioConfigurePageQueryParamsSchema = z.object({
|
const FlyioConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/flyio/create"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/flyio/create',
|
||||||
)({
|
)({
|
||||||
component: FlyioConfigurePage,
|
component: FlyioConfigurePage,
|
||||||
validateSearch: zodValidator(FlyioConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(FlyioConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "Fly IO"
|
label: 'Fly IO',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+15
-15
@@ -1,11 +1,11 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { GcpSecretManagerAuthorizePage } from "./GcpSecretManagerAuthorizePage";
|
import { GcpSecretManagerAuthorizePage } from './GcpSecretManagerAuthorizePage'
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/integrations/gcp-secret-manager/authorize"
|
'/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/gcp-secret-manager/authorize',
|
||||||
)({
|
)({
|
||||||
component: GcpSecretManagerAuthorizePage,
|
component: GcpSecretManagerAuthorizePage,
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
@@ -13,19 +13,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "GCP Secret Manager"
|
label: 'GCP Secret Manager',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+19
-19
@@ -1,17 +1,17 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { GcpSecretManagerConfigurePage } from "./GcpSecretManagerConfigurePage";
|
import { GcpSecretManagerConfigurePage } from './GcpSecretManagerConfigurePage'
|
||||||
|
|
||||||
const GcpConfigurePageQueryParamsSchema = z.object({
|
const GcpConfigurePageQueryParamsSchema = z.object({
|
||||||
integrationAuthId: z.string()
|
integrationAuthId: z.string(),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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',
|
||||||
)({
|
)({
|
||||||
component: GcpSecretManagerConfigurePage,
|
component: GcpSecretManagerConfigurePage,
|
||||||
validateSearch: zodValidator(GcpConfigurePageQueryParamsSchema),
|
validateSearch: zodValidator(GcpConfigurePageQueryParamsSchema),
|
||||||
@@ -20,19 +20,19 @@ export const Route = createFileRoute(
|
|||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "GCP Secret Manager"
|
label: 'GCP Secret Manager',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
+23
-21
@@ -1,39 +1,41 @@
|
|||||||
import { createFileRoute, linkOptions } from "@tanstack/react-router";
|
import { createFileRoute, linkOptions } from '@tanstack/react-router'
|
||||||
import { zodValidator } from "@tanstack/zod-adapter";
|
import { zodValidator } from '@tanstack/zod-adapter'
|
||||||
import { z } from "zod";
|
import { z } from 'zod'
|
||||||
|
|
||||||
import { IntegrationsListPageTabs } from "@app/types/integrations";
|
import { IntegrationsListPageTabs } from '@app/types/integrations'
|
||||||
|
|
||||||
import { GcpSecretManagerOauthCallbackPage } from "./GcpSecretManagerOauthCallbackPage";
|
import { GcpSecretManagerOauthCallbackPage } from './GcpSecretManagerOauthCallbackPage'
|
||||||
|
|
||||||
export const GcpSecretManagerOAuthCallbackPageQueryParamsSchema = z.object({
|
export const GcpSecretManagerOAuthCallbackPageQueryParamsSchema = z.object({
|
||||||
state: z.string().catch(""),
|
state: z.string().catch(''),
|
||||||
code: z.coerce.string().catch("")
|
code: z.coerce.string().catch(''),
|
||||||
});
|
})
|
||||||
|
|
||||||
export const Route = createFileRoute(
|
export const Route = createFileRoute(
|
||||||
"/_authenticate/_inject-org-details/_org-layout/secret-manager/$projectId/_secret-manager-layout/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',
|
||||||
)({
|
)({
|
||||||
component: GcpSecretManagerOauthCallbackPage,
|
component: GcpSecretManagerOauthCallbackPage,
|
||||||
validateSearch: zodValidator(GcpSecretManagerOAuthCallbackPageQueryParamsSchema),
|
validateSearch: zodValidator(
|
||||||
|
GcpSecretManagerOAuthCallbackPageQueryParamsSchema,
|
||||||
|
),
|
||||||
beforeLoad: ({ context, params }) => {
|
beforeLoad: ({ context, params }) => {
|
||||||
return {
|
return {
|
||||||
breadcrumbs: [
|
breadcrumbs: [
|
||||||
...context.breadcrumbs,
|
...context.breadcrumbs,
|
||||||
{
|
{
|
||||||
label: "Integrations",
|
label: 'Integrations',
|
||||||
link: linkOptions({
|
link: linkOptions({
|
||||||
to: "/secret-manager/$projectId/integrations",
|
to: '/secret-manager/$projectId/integrations',
|
||||||
params,
|
params,
|
||||||
search: {
|
search: {
|
||||||
selectedTab: IntegrationsListPageTabs.NativeIntegrations
|
selectedTab: IntegrationsListPageTabs.NativeIntegrations,
|
||||||
}
|
},
|
||||||
})
|
}),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: "GCP Secret Manager"
|
label: 'GCP Secret Manager',
|
||||||
}
|
},
|
||||||
]
|
],
|
||||||
};
|
}
|
||||||
}
|
},
|
||||||
});
|
})
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user