Merge branch 'main' into feat/multipleApprovalEnvs

This commit is contained in:
Carlos Monastyrski
2025-07-24 12:03:07 -03:00
595 changed files with 12408 additions and 6322 deletions
@@ -34,7 +34,7 @@ export const CommitDetailsPage = () => {
const handleGoBackToHistory = () => {
navigate({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId",
to: "/projects/secret-management/$projectId/commits/$environment/$folderId",
params: {
projectId: currentWorkspace.id,
folderId,
@@ -49,7 +49,7 @@ export const CommitDetailsPage = () => {
const handleGoToRollbackPreview = () => {
navigate({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId/$commitId/restore",
to: "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId/restore",
params: {
projectId: currentWorkspace.id,
folderId,
@@ -102,7 +102,7 @@ export const RollbackPreviewTab = (): JSX.Element => {
const goBackToHistory = () => {
navigate({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId",
to: "/projects/secret-management/$projectId/commits/$environment/$folderId",
params: {
projectId: currentWorkspace.id,
folderId,
@@ -12,7 +12,7 @@ const RollbackPreviewTabQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/restore"
)({
component: RollbackPreviewTab,
validateSearch: zodValidator(RollbackPreviewTabQueryParamsSchema),
@@ -33,7 +33,7 @@ export const Route = createFileRoute(
links: context.project.environments.map((el) => ({
label: el.name,
link: linkOptions({
to: "/projects/$projectId/secret-manager/secrets/$envSlug",
to: "/projects/secret-management/$projectId/secrets/$envSlug",
params: {
projectId: params.projectId,
envSlug: el.slug
@@ -56,7 +56,7 @@ export const Route = createFileRoute(
{
label: "Commits",
link: linkOptions({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId",
to: "/projects/secret-management/$projectId/commits/$environment/$folderId",
params: {
projectId: params.projectId,
environment: params.environment,
@@ -70,7 +70,7 @@ export const Route = createFileRoute(
{
label: params.commitId,
link: linkOptions({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId/$commitId",
to: "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId",
params: {
projectId: params.projectId,
environment: params.environment,
@@ -12,7 +12,7 @@ const CommitDetailsPageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/commits/$environment/$folderId/$commitId/"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/$commitId/"
)({
component: CommitDetailsPage,
validateSearch: zodValidator(CommitDetailsPageQueryParamsSchema),
@@ -33,7 +33,7 @@ export const Route = createFileRoute(
links: context.project.environments.map((el) => ({
label: el.name,
link: linkOptions({
to: "/projects/$projectId/secret-manager/secrets/$envSlug",
to: "/projects/secret-management/$projectId/secrets/$envSlug",
params: {
projectId: params.projectId,
envSlug: el.slug
@@ -56,7 +56,7 @@ export const Route = createFileRoute(
{
label: "Commits",
link: linkOptions({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId",
to: "/projects/secret-management/$projectId/commits/$environment/$folderId",
params: {
projectId: params.projectId,
environment: params.environment,
@@ -31,7 +31,7 @@ export const CommitsPage = () => {
const handleSelectCommit = (commitId: string) => {
navigate({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId/$commitId",
to: "/projects/secret-management/$projectId/commits/$environment/$folderId/$commitId",
params: {
projectId: currentWorkspace.id,
folderId,
@@ -13,7 +13,7 @@ const CommitsPageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/commits/$environment/$folderId/"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/commits/$environment/$folderId/"
)({
component: CommitsPage,
validateSearch: zodValidator(CommitsPageQueryParamsSchema),
@@ -34,7 +34,7 @@ export const Route = createFileRoute(
links: context.project.environments.map((el) => ({
label: el.name,
link: linkOptions({
to: "/projects/$projectId/secret-manager/secrets/$envSlug",
to: "/projects/secret-management/$projectId/secrets/$envSlug",
params: {
projectId: params.projectId,
envSlug: el.slug
@@ -57,7 +57,7 @@ export const Route = createFileRoute(
{
label: "Commits",
link: linkOptions({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId",
to: "/projects/secret-management/$projectId/commits/$environment/$folderId",
params: {
projectId: params.projectId,
environment: params.environment,
@@ -3,7 +3,7 @@ import { createFileRoute } from "@tanstack/react-router";
import { IPAllowListPage } from "./IPAllowlistPage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/allowlist"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/allowlist"
)({
component: () => IPAllowListPage
});
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { IntegrationDetailsByIDPage } from "./IntegrationsDetailsByIDPage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/$integrationId"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/$integrationId"
)({
component: IntegrationDetailsByIDPage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -42,7 +42,7 @@ export const redirectForProviderAuth = (
switch (integrationOption.slug) {
case "gcp-secret-manager":
navigate({
to: "/projects/$projectId/secret-manager/integrations/gcp-secret-manager/authorize",
to: "/projects/secret-management/$projectId/integrations/gcp-secret-manager/authorize",
params: {
projectId
}
@@ -54,7 +54,7 @@ export const redirectForProviderAuth = (
return;
}
navigate({
to: "/projects/$projectId/secret-manager/integrations/azure-key-vault/authorize",
to: "/projects/secret-management/$projectId/integrations/azure-key-vault/authorize",
params: {
projectId
},
@@ -76,7 +76,7 @@ export const redirectForProviderAuth = (
}
case "aws-parameter-store":
navigate({
to: "/projects/$projectId/secret-manager/integrations/aws-parameter-store/authorize",
to: "/projects/secret-management/$projectId/integrations/aws-parameter-store/authorize",
params: {
projectId
}
@@ -84,7 +84,7 @@ export const redirectForProviderAuth = (
break;
case "aws-secret-manager":
navigate({
to: "/projects/$projectId/secret-manager/integrations/aws-secret-manager/authorize",
to: "/projects/secret-management/$projectId/integrations/aws-secret-manager/authorize",
params: {
projectId
}
@@ -120,7 +120,7 @@ export const redirectForProviderAuth = (
}
case "github":
navigate({
to: "/projects/$projectId/secret-manager/integrations/github/auth-mode-selection",
to: "/projects/secret-management/$projectId/integrations/github/auth-mode-selection",
params: {
projectId
}
@@ -128,7 +128,7 @@ export const redirectForProviderAuth = (
break;
case "gitlab":
navigate({
to: "/projects/$projectId/secret-manager/integrations/gitlab/authorize",
to: "/projects/secret-management/$projectId/integrations/gitlab/authorize",
params: {
projectId
}
@@ -136,7 +136,7 @@ export const redirectForProviderAuth = (
break;
case "render":
navigate({
to: "/projects/$projectId/secret-manager/integrations/render/authorize",
to: "/projects/secret-management/$projectId/integrations/render/authorize",
params: {
projectId
}
@@ -144,7 +144,7 @@ export const redirectForProviderAuth = (
break;
case "flyio":
navigate({
to: "/projects/$projectId/secret-manager/integrations/flyio/authorize",
to: "/projects/secret-management/$projectId/integrations/flyio/authorize",
params: {
projectId
}
@@ -152,7 +152,7 @@ export const redirectForProviderAuth = (
break;
case "circleci":
navigate({
to: "/projects/$projectId/secret-manager/integrations/circleci/authorize",
to: "/projects/secret-management/$projectId/integrations/circleci/authorize",
params: {
projectId
}
@@ -160,7 +160,7 @@ export const redirectForProviderAuth = (
break;
case "databricks":
navigate({
to: "/projects/$projectId/secret-manager/integrations/databricks/authorize",
to: "/projects/secret-management/$projectId/integrations/databricks/authorize",
params: {
projectId
}
@@ -168,7 +168,7 @@ export const redirectForProviderAuth = (
break;
case "laravel-forge":
navigate({
to: "/projects/$projectId/secret-manager/integrations/laravel-forge/authorize",
to: "/projects/secret-management/$projectId/integrations/laravel-forge/authorize",
params: {
projectId
}
@@ -176,7 +176,7 @@ export const redirectForProviderAuth = (
break;
case "travisci":
navigate({
to: "/projects/$projectId/secret-manager/integrations/travisci/authorize",
to: "/projects/secret-management/$projectId/integrations/travisci/authorize",
params: {
projectId
}
@@ -184,7 +184,7 @@ export const redirectForProviderAuth = (
break;
case "supabase":
navigate({
to: "/projects/$projectId/secret-manager/integrations/supabase/authorize",
to: "/projects/secret-management/$projectId/integrations/supabase/authorize",
params: {
projectId
}
@@ -192,7 +192,7 @@ export const redirectForProviderAuth = (
break;
case "checkly":
navigate({
to: "/projects/$projectId/secret-manager/integrations/checkly/authorize",
to: "/projects/secret-management/$projectId/integrations/checkly/authorize",
params: {
projectId
}
@@ -200,7 +200,7 @@ export const redirectForProviderAuth = (
break;
case "qovery":
navigate({
to: "/projects/$projectId/secret-manager/integrations/qovery/authorize",
to: "/projects/secret-management/$projectId/integrations/qovery/authorize",
params: {
projectId
}
@@ -208,7 +208,7 @@ export const redirectForProviderAuth = (
break;
case "railway":
navigate({
to: "/projects/$projectId/secret-manager/integrations/railway/authorize",
to: "/projects/secret-management/$projectId/integrations/railway/authorize",
params: {
projectId
}
@@ -216,7 +216,7 @@ export const redirectForProviderAuth = (
break;
case "terraform-cloud":
navigate({
to: "/projects/$projectId/secret-manager/integrations/terraform-cloud/authorize",
to: "/projects/secret-management/$projectId/integrations/terraform-cloud/authorize",
params: {
projectId
}
@@ -224,7 +224,7 @@ export const redirectForProviderAuth = (
break;
case "hashicorp-vault":
navigate({
to: "/projects/$projectId/secret-manager/integrations/hashicorp-vault/authorize",
to: "/projects/secret-management/$projectId/integrations/hashicorp-vault/authorize",
params: {
projectId
}
@@ -232,7 +232,7 @@ export const redirectForProviderAuth = (
break;
case "cloudflare-pages":
navigate({
to: "/projects/$projectId/secret-manager/integrations/cloudflare-pages/authorize",
to: "/projects/secret-management/$projectId/integrations/cloudflare-pages/authorize",
params: {
projectId
}
@@ -240,7 +240,7 @@ export const redirectForProviderAuth = (
break;
case "cloudflare-workers":
navigate({
to: "/projects/$projectId/secret-manager/integrations/cloudflare-workers/authorize",
to: "/projects/secret-management/$projectId/integrations/cloudflare-workers/authorize",
params: {
projectId
}
@@ -257,7 +257,7 @@ export const redirectForProviderAuth = (
}
case "codefresh":
navigate({
to: "/projects/$projectId/secret-manager/integrations/codefresh/authorize",
to: "/projects/secret-management/$projectId/integrations/codefresh/authorize",
params: {
projectId
}
@@ -265,7 +265,7 @@ export const redirectForProviderAuth = (
break;
case "digital-ocean-app-platform":
navigate({
to: "/projects/$projectId/secret-manager/integrations/digital-ocean-app-platform/authorize",
to: "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/authorize",
params: {
projectId
}
@@ -273,7 +273,7 @@ export const redirectForProviderAuth = (
break;
case "cloud-66":
navigate({
to: "/projects/$projectId/secret-manager/integrations/cloud-66/authorize",
to: "/projects/secret-management/$projectId/integrations/cloud-66/authorize",
params: {
projectId
}
@@ -281,7 +281,7 @@ export const redirectForProviderAuth = (
break;
case "northflank":
navigate({
to: "/projects/$projectId/secret-manager/integrations/northflank/authorize",
to: "/projects/secret-management/$projectId/integrations/northflank/authorize",
params: {
projectId
}
@@ -289,7 +289,7 @@ export const redirectForProviderAuth = (
break;
case "windmill":
navigate({
to: "/projects/$projectId/secret-manager/integrations/windmill/authorize",
to: "/projects/secret-management/$projectId/integrations/windmill/authorize",
params: {
projectId
}
@@ -297,7 +297,7 @@ export const redirectForProviderAuth = (
break;
case "teamcity":
navigate({
to: "/projects/$projectId/secret-manager/integrations/teamcity/authorize",
to: "/projects/secret-management/$projectId/integrations/teamcity/authorize",
params: {
projectId
}
@@ -305,7 +305,7 @@ export const redirectForProviderAuth = (
break;
case "hasura-cloud":
navigate({
to: "/projects/$projectId/secret-manager/integrations/hasura-cloud/authorize",
to: "/projects/secret-management/$projectId/integrations/hasura-cloud/authorize",
params: {
projectId
}
@@ -313,7 +313,7 @@ export const redirectForProviderAuth = (
break;
case "rundeck":
navigate({
to: "/projects/$projectId/secret-manager/integrations/rundeck/authorize",
to: "/projects/secret-management/$projectId/integrations/rundeck/authorize",
params: {
projectId
}
@@ -321,7 +321,7 @@ export const redirectForProviderAuth = (
break;
case "azure-devops":
navigate({
to: "/projects/$projectId/secret-manager/integrations/azure-devops/authorize",
to: "/projects/secret-management/$projectId/integrations/azure-devops/authorize",
params: {
projectId
}
@@ -329,7 +329,7 @@ export const redirectForProviderAuth = (
break;
case "octopus-deploy":
navigate({
to: "/projects/$projectId/secret-manager/integrations/octopus-deploy/authorize",
to: "/projects/secret-management/$projectId/integrations/octopus-deploy/authorize",
params: {
projectId
}
@@ -59,7 +59,7 @@ export const IntegrationRow = ({
<Tr
onClick={() =>
navigate({
to: "/projects/$projectId/secret-manager/integrations/$integrationId",
to: "/projects/secret-management/$projectId/integrations/$integrationId",
params: {
integrationId: integration.id,
projectId: currentWorkspace.id
@@ -0,0 +1,14 @@
import { TBitbucketSync } from "@app/hooks/api/secretSyncs/types/bitbucket-sync";
import { getSecretSyncDestinationColValues } from "../helpers";
import { SecretSyncTableCell } from "../SecretSyncTableCell";
type Props = {
secretSync: TBitbucketSync;
};
export const BitbucketSyncDestinationCol = ({ secretSync }: Props) => {
const { primaryText, secondaryText } = getSecretSyncDestinationColValues(secretSync);
return <SecretSyncTableCell primaryText={primaryText} secondaryText={secondaryText} />;
};
@@ -0,0 +1,14 @@
import { TDigitalOceanAppPlatformSync } from "@app/hooks/api/secretSyncs/types/digital-ocean-app-platform-sync";
import { getSecretSyncDestinationColValues } from "../helpers";
import { SecretSyncTableCell } from "../SecretSyncTableCell";
type Props = {
secretSync: TDigitalOceanAppPlatformSync;
};
export const DigitalOceanAppPlatformSyncDestinationCol = ({ secretSync }: Props) => {
const { primaryText, secondaryText } = getSecretSyncDestinationColValues(secretSync);
return <SecretSyncTableCell primaryText={primaryText} secondaryText={secondaryText} />;
};
@@ -6,11 +6,13 @@ import { AwsSecretsManagerSyncDestinationCol } from "./AwsSecretsManagerSyncDest
import { AzureAppConfigurationDestinationSyncCol } from "./AzureAppConfigurationDestinationSyncCol";
import { AzureDevOpsSyncDestinationCol } from "./AzureDevOpsSyncDestinationCol";
import { AzureKeyVaultDestinationSyncCol } from "./AzureKeyVaultDestinationSyncCol";
import { BitbucketSyncDestinationCol } from "./BitbucketSyncDestinationCol";
import { CamundaSyncDestinationCol } from "./CamundaSyncDestinationCol";
import { ChecklySyncDestinationCol } from "./ChecklySyncDestinationCol";
import { CloudflarePagesSyncDestinationCol } from "./CloudflarePagesSyncDestinationCol";
import { CloudflareWorkersSyncDestinationCol } from "./CloudflareWorkersSyncDestinationCol";
import { DatabricksSyncDestinationCol } from "./DatabricksSyncDestinationCol";
import { DigitalOceanAppPlatformSyncDestinationCol } from "./DigitalOceanAppPlatformSyncDestinationCol";
import { FlyioSyncDestinationCol } from "./FlyioSyncDestinationCol";
import { GcpSyncDestinationCol } from "./GcpSyncDestinationCol";
import { GitHubSyncDestinationCol } from "./GitHubSyncDestinationCol";
@@ -88,6 +90,10 @@ export const SecretSyncDestinationCol = ({ secretSync }: Props) => {
return <ChecklySyncDestinationCol secretSync={secretSync} />;
case SecretSync.Supabase:
return <SupabaseSyncDestinationCol secretSync={secretSync} />;
case SecretSync.DigitalOceanAppPlatform:
return <DigitalOceanAppPlatformSyncDestinationCol secretSync={secretSync} />;
case SecretSync.Bitbucket:
return <BitbucketSyncDestinationCol secretSync={secretSync} />;
default:
throw new Error(
`Unhandled Secret Sync Destination Col: ${(secretSync as TSecretSync).destination}`
@@ -174,6 +174,14 @@ export const getSecretSyncDestinationColValues = (secretSync: TSecretSync) => {
primaryText = destinationConfig.projectName;
secondaryText = "Supabase Project";
break;
case SecretSync.DigitalOceanAppPlatform:
primaryText = destinationConfig.appName;
secondaryText = "Digital Ocean App";
break;
case SecretSync.Bitbucket:
primaryText = destinationConfig.workspaceSlug;
secondaryText = destinationConfig.repositorySlug;
break;
default:
throw new Error(`Unhandled Destination Col Values ${destination}`);
}
@@ -21,7 +21,7 @@ const IntegrationsListPageQuerySchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/"
)({
component: IntegrationsListPage,
validateSearch: zodValidator(IntegrationsListPageQuerySchema),
@@ -36,7 +36,7 @@ export const Route = createFileRoute(
});
} catch {
throw redirect({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId
},
@@ -46,7 +46,7 @@ export const Route = createFileRoute(
if (secretSyncs.length) {
throw redirect({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId
},
@@ -62,7 +62,7 @@ export const Route = createFileRoute(
});
} catch {
throw redirect({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId
},
@@ -72,7 +72,7 @@ export const Route = createFileRoute(
if (integrations.length) {
throw redirect({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId
},
@@ -81,7 +81,7 @@ export const Route = createFileRoute(
}
throw redirect({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId
},
@@ -667,7 +667,7 @@ export const OverviewPage = () => {
const envIndex = visibleEnvs.findIndex((el) => slug === el.slug);
if (envIndex !== -1) {
navigate({
to: "/projects/$projectId/secret-manager/secrets/$envSlug",
to: "/projects/secret-management/$projectId/secrets/$envSlug",
params: {
projectId: workspaceId,
envSlug: slug
@@ -1420,7 +1420,7 @@ export const OverviewPage = () => {
iconSize="3x"
>
<Link
to="/projects/$projectId/secret-manager/settings"
to="/projects/secret-management/$projectId/settings"
params={{
projectId: workspaceId
}}
@@ -9,7 +9,7 @@ type Props = {
export const FolderBreadCrumbs = ({ secretPath = "/", onResetSearch }: Props) => {
const navigate = useNavigate({
from: "/projects/$projectId/secret-manager/overview"
from: "/projects/secret-management/$projectId/overview"
});
const onFolderCrumbClick = (index: number) => {
@@ -53,7 +53,7 @@ export const SecretSearchInput = ({
}}
autoComplete="off"
className="input text-md h-[2.3rem] w-full rounded-md rounded-l-none bg-mineshaft-800 py-[0.375rem] pl-2.5 pr-8 text-gray-400 placeholder-mineshaft-50 placeholder-opacity-50 outline-none duration-200 placeholder:text-sm hover:ring-bunker-400/60 focus:bg-mineshaft-700/80 focus:ring-1 focus:ring-primary-400/50"
placeholder="Search by secret/folder name..."
placeholder="Search by secret, folder, tag or metadata..."
value={value}
onChange={(e) => onChange(e.target.value)}
/>
@@ -17,7 +17,7 @@ export const QuickSearchDynamicSecretItem = ({
onClose
}: Props) => {
const navigate = useNavigate({
from: "/projects/$projectId/secret-manager/overview"
from: "/projects/secret-management/$projectId/overview"
});
const [groupDynamicSecret] = dynamicSecretGroup;
@@ -13,7 +13,7 @@ type Props = {
export const QuickSearchFolderItem = ({ folderGroup, onClose }: Props) => {
const navigate = useNavigate({
from: "/projects/$projectId/secret-manager/overview"
from: "/projects/secret-management/$projectId/overview"
});
const [groupFolder] = folderGroup;
@@ -1,6 +1,7 @@
import {
faCheck,
faChevronRight,
faCode,
faCopy,
faEye,
faFolder,
@@ -46,7 +47,7 @@ export const QuickSearchSecretItem = ({
isSingleEnv,
search
}: Props) => {
const navigate = useNavigate({ from: "/projects/$projectId/secret-manager/overview" });
const navigate = useNavigate({ from: "/projects/secret-management/$projectId/overview" });
const envSlugMap = new Map(environments.map((env) => [env.slug, env]));
const [isUrlCopied, , setIsUrlCopied] = useTimedReset<boolean>({
initialState: false
@@ -82,6 +83,17 @@ export const QuickSearchSecretItem = ({
search.trim() &&
secretGroupTags?.find((tag) => tag && tag.slug.toLowerCase().includes(search.toLowerCase()));
const secretGroupMetadata = secretGroup.flatMap((secret) => secret.secretMetadata);
const metadataMatch =
search.trim() &&
secretGroupMetadata?.find(
(metadata) =>
metadata &&
(metadata.key.toLowerCase().includes(search.toLowerCase()) ||
metadata.value.toLowerCase().includes(search.toLowerCase()))
);
return (
<Tr
className="hover cursor-pointer bg-mineshaft-700 hover:bg-mineshaft-600"
@@ -109,6 +121,12 @@ export const QuickSearchSecretItem = ({
{tagMatch.slug}
</Badge>
)}
{metadataMatch && !tagMatch && (
<Badge variant="primary" className="flex items-center gap-1 whitespace-nowrap">
<FontAwesomeIcon size="xs" icon={faCode} />
<p className="truncate">Metadata Match</p>
</Badge>
)}
{isSingleEnv ? (
<Tooltip
isDisabled={!groupSecret?.secretValueHidden}
@@ -13,7 +13,7 @@ type Props = {
export const QuickSearchSecretRotationItem = ({ secretRotationGroup, onClose }: Props) => {
const navigate = useNavigate({
from: "/projects/$projectId/secret-manager/overview"
from: "/projects/secret-management/$projectId/overview"
});
const [groupSecretRotation] = secretRotationGroup;
@@ -1,6 +1,6 @@
export const getExpandedRowStyle = (scrollOffset: number) => ({
marginLeft: scrollOffset,
width: "calc(100vw - 355px)", // 350px accounts for sidebar and margin
width: "calc(100vw - 275px)", // accounts for sidebar and margin
maxWidth: "1270px" // largest width of table on ultra-wide
});
@@ -10,7 +10,7 @@ const SecretOverviewPageQuerySchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/overview"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/overview"
)({
component: OverviewPage,
validateSearch: zodValidator(SecretOverviewPageQuerySchema),
@@ -24,7 +24,7 @@ export const Route = createFileRoute(
{
label: "Secrets",
link: linkOptions({
to: "/projects/$projectId/secret-manager/overview",
to: "/projects/secret-management/$projectId/overview",
params
})
}
@@ -9,7 +9,7 @@ const SecretApprovalPageQueryParams = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/approval"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/approval"
)({
component: SecretApprovalsPage,
validateSearch: zodValidator(SecretApprovalPageQueryParams),
@@ -234,7 +234,7 @@ const Page = () => {
type: "error"
});
navigate({
to: "/projects/$projectId/secret-manager/overview",
to: "/projects/secret-management/$projectId/overview",
params: {
projectId: workspaceId
}
@@ -386,7 +386,7 @@ const Page = () => {
const handleOnClickRollbackMode = () => {
if (isPITEnabled) {
navigate({
to: "/projects/$projectId/secret-manager/commits/$environment/$folderId",
to: "/projects/secret-management/$projectId/commits/$environment/$folderId",
params: {
projectId: workspaceId,
folderId,
@@ -1,6 +1,6 @@
/* eslint-disable jsx-a11y/label-has-associated-control */
import React, { useCallback, useState } from "react";
import { faCodeCommit, faEye, faFolder, faKey, faTrash } from "@fortawesome/free-solid-svg-icons";
import { faCodeCommit, faEye, faFolder, faKey } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { Badge, Button, Input, Modal, ModalContent } from "@app/components/v2";
@@ -296,39 +296,46 @@ export const CommitForm: React.FC<CommitFormProps> = ({
<>
{/* Floating Panel */}
{!isModalOpen && (
<div className="fixed bottom-4 z-40 w-64 self-center rounded-lg border border-mineshaft-600 bg-mineshaft-800 shadow-2xl">
<div className="flex w-full justify-center border-b border-mineshaft-600 p-2">
<div className="flex w-full items-center justify-between">
<div className="fixed bottom-4 left-1/2 z-40 w-full max-w-3xl -translate-x-1/2 self-center rounded-lg border border-yellow/30 bg-mineshaft-800 shadow-2xl lg:left-auto lg:translate-x-0">
<div className="flex items-center justify-between p-4">
{/* Left Content */}
<div className="flex-1">
{/* Header */}
<div className="flex items-center gap-2">
<FontAwesomeIcon icon={faCodeCommit} className="text-mineshaft-400" />
<div className="h-2 w-2 rounded-full bg-yellow-500" />
<span className="font-medium text-mineshaft-100">Pending Changes</span>
<Badge variant="primary" className="text-xs">
{totalChangesCount} Change{totalChangesCount !== 1 ? "s" : ""}
</Badge>
</div>
<Badge variant="primary" className="text-xs">
{totalChangesCount} Change{totalChangesCount !== 1 ? "s" : ""}
</Badge>
</div>
</div>
<div className="flex justify-center gap-2 p-2">
<Button
size="sm"
leftIcon={<FontAwesomeIcon icon={faTrash} />}
onClick={() => clearAllPendingChanges({ workspaceId, environment, secretPath })}
isDisabled={totalChangesCount === 0}
variant="outline_bg"
className="h-8 flex-1 hover:border-red/40 hover:bg-red/[0.1]"
>
Discard
</Button>
<Button
variant="outline_bg"
leftIcon={<FontAwesomeIcon icon={faEye} />}
onClick={() => setIsModalOpen(true)}
isDisabled={totalChangesCount === 0}
className="h-8 flex-1"
>
Review
</Button>
{/* Description */}
<p className="text-sm leading-5 text-mineshaft-400">
Review pending changes and commit them to apply the updates.
</p>
</div>
{/* Right Buttons */}
<div className="ml-6 mt-0.5 flex items-center gap-3">
<Button
size="sm"
onClick={() => clearAllPendingChanges({ workspaceId, environment, secretPath })}
isDisabled={totalChangesCount === 0}
variant="outline_bg"
className="px-4 hover:border-red/40 hover:bg-red/[0.1]"
>
Discard
</Button>
<Button
variant="solid"
leftIcon={<FontAwesomeIcon icon={faEye} />}
onClick={() => setIsModalOpen(true)}
isDisabled={totalChangesCount === 0}
className="px-6"
>
Review Changes
</Button>
</div>
</div>
</div>
)}
@@ -1,25 +1,65 @@
import { useEffect } from "react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { Controller, useForm } from "react-hook-form";
import { faClock, faTrash } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { zodResolver } from "@hookform/resolvers/zod";
import { useQueryClient } from "@tanstack/react-query";
import { twMerge } from "tailwind-merge";
import { z } from "zod";
import { createNotification } from "@app/components/notifications";
import {
Button,
DatePicker,
FilterableSelect,
FormControl,
Input,
Modal,
ModalContent,
Select,
SelectItem,
TextArea
} from "@app/components/v2";
import { useWorkspace } from "@app/context";
import { useGetWorkspaceUsers } from "@app/hooks/api";
import { dashboardKeys } from "@app/hooks/api/dashboard/queries";
import { useCreateReminder, useDeleteReminder } from "@app/hooks/api/reminders";
import { reminderKeys } from "@app/hooks/api/reminders/queries";
import { Reminder } from "@app/hooks/api/reminders/types";
import { secretKeys } from "@app/hooks/api/secrets/queries";
// Constants
const MIN_REPEAT_DAYS = 1;
const MAX_REPEAT_DAYS = 365;
const DEFAULT_REPEAT_DAYS = 30;
const DEFAULT_TEXTAREA_ROWS = 8;
// Enums
enum ReminderType {
Recurring = "Recurring",
OneTime = "One Time"
}
// Types
interface RecipientOption {
label: string;
value: string;
}
interface ReminderFormProps {
isOpen: boolean;
reminderId?: string;
onOpenChange: () => void;
workspaceId: string;
environment: string;
secretPath: string;
secretId: string;
reminder?: Reminder;
}
// Validation Schema
const ReminderFormSchema = z.object({
note: z.string().optional().nullable(),
message: z.string().optional().nullable(),
recipients: z
.array(
z.object({
@@ -28,182 +68,404 @@ const ReminderFormSchema = z.object({
})
)
.optional(),
days: z
repeatDays: z
.number()
.min(1, { message: "Must be at least 1 day" })
.max(365, { message: "Must be less than 365 days" })
.min(MIN_REPEAT_DAYS, { message: `Must be at least ${MIN_REPEAT_DAYS} day` })
.max(MAX_REPEAT_DAYS, { message: `Must be less than ${MAX_REPEAT_DAYS} days` })
.nullable()
.optional(),
nextReminderDate: z.coerce
.date()
.refine((data) => data > new Date(), { message: "Reminder date must be in the future" })
.nullable()
.optional(),
reminderType: z.enum(["Recurring", "One Time"])
});
export type TReminderFormSchema = z.infer<typeof ReminderFormSchema>;
interface ReminderFormProps {
isOpen: boolean;
repeatDays?: number | null;
note?: string | null;
recipients?: string[] | null;
onOpenChange: (isOpen: boolean, data?: TReminderFormSchema) => void;
}
// Custom hook for form state management
const useReminderForm = (reminderData?: Reminder) => {
const { repeatDays, message, nextReminderDate } = reminderData || {};
const isEditMode = Boolean(reminderData);
const defaultValues = useMemo(
() => ({
repeatDays: repeatDays || null,
message: message || "",
nextReminderDate: nextReminderDate || null,
reminderType: repeatDays ? ReminderType.Recurring : ReminderType.OneTime,
recipients: []
}),
[repeatDays, message, nextReminderDate]
);
return {
isEditMode,
reminderData,
defaultValues
};
};
// Custom hook for workspace members
const useWorkspaceMembers = () => {
const { currentWorkspace } = useWorkspace();
const { data: members = [] } = useGetWorkspaceUsers(currentWorkspace?.id);
const memberOptions = useMemo(
(): RecipientOption[] =>
members.map((member) => ({
label: member.user.username || member.user.email,
value: member.user.id
})),
[members]
);
return { members, memberOptions };
};
// Main component
export const CreateReminderForm = ({
isOpen,
onOpenChange,
repeatDays,
note,
recipients
workspaceId,
environment,
secretPath,
secretId,
reminder
}: ReminderFormProps) => {
const { currentWorkspace } = useWorkspace();
const queryClient = useQueryClient();
const [isDatePickerOpen, setIsDatePickerOpen] = useState(false);
const { data: members = [] } = useGetWorkspaceUsers(currentWorkspace?.id);
// Custom hooks
const { isEditMode, reminderData } = useReminderForm(reminder);
const { memberOptions } = useWorkspaceMembers();
// API mutations
const { mutateAsync: createReminder } = useCreateReminder(secretId);
const { mutateAsync: deleteReminder } = useDeleteReminder(secretId);
// Form setup
const form = useForm<TReminderFormSchema>({
defaultValues: {
repeatDays: reminderData?.repeatDays || null,
message: reminderData?.message || "",
nextReminderDate: reminderData?.nextReminderDate || null,
reminderType: reminderData?.repeatDays ? ReminderType.Recurring : ReminderType.OneTime,
recipients: []
},
resolver: zodResolver(ReminderFormSchema)
});
const {
register,
control,
setValue,
handleSubmit,
reset,
watch,
formState: { isSubmitting }
} = useForm<TReminderFormSchema>({
defaultValues: {
days: repeatDays || undefined,
note: note || ""
},
resolver: zodResolver(ReminderFormSchema)
});
} = form;
const handleFormSubmit = async (data: TReminderFormSchema) => {
onOpenChange(false, data);
// Watch form values
const reminderType = watch("reminderType");
// Invalidate queries helper
const invalidateQueries = () => {
queryClient.invalidateQueries({
queryKey: dashboardKeys.getDashboardSecrets({
projectId: workspaceId,
secretPath
})
});
queryClient.invalidateQueries({
queryKey: secretKeys.getProjectSecret({ workspaceId, environment, secretPath })
});
queryClient.invalidateQueries({
queryKey: reminderKeys.getReminder(secretId)
});
};
useEffect(() => {
// On initial load, filter the members to only include the recipients
if (members.length) {
const filteredMembers = members.filter((m) => recipients?.find((r) => r === m.user.id));
setValue(
"recipients",
filteredMembers.map((m) => ({
label: m.user.username || m.user.email,
value: m.user.id
}))
);
}
}, [members, isOpen, recipients]);
// Form submission handler
const handleFormSubmit = async (data: TReminderFormSchema) => {
try {
await createReminder({
repeatDays: data.repeatDays,
message: data.message,
recipients: data.recipients?.map((r) => r.value) || [],
secretId,
nextReminderDate: data.nextReminderDate
});
invalidateQueries();
createNotification({
type: "success",
text: `Successfully ${isEditMode ? "updated" : "created"} secret reminder`
});
reset();
onOpenChange();
} catch (error) {
console.error("Failed to save reminder:", error);
createNotification({
type: "error",
text: "Failed to save reminder. Please try again."
});
}
};
// Delete reminder handler
const handleDeleteReminder = async () => {
try {
await deleteReminder({ reminderId: reminder?.id || "", secretId });
invalidateQueries();
reset();
onOpenChange();
createNotification({
type: "success",
text: "Successfully deleted reminder"
});
} catch (error) {
console.error("Failed to delete reminder:", error);
createNotification({
type: "error",
text: "Failed to delete reminder. Please try again."
});
}
};
// Handle reminder type change
const handleReminderTypeChange = useCallback(
(newType: string) => {
if (newType === ReminderType.Recurring) {
setValue("repeatDays", DEFAULT_REPEAT_DAYS);
setValue("nextReminderDate", null);
} else if (newType === ReminderType.OneTime) {
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
setValue("nextReminderDate", tomorrow);
setValue("repeatDays", null);
}
},
[setValue]
);
// Initialize form with existing data
useEffect(() => {
if (repeatDays) setValue("days", repeatDays);
if (note) setValue("note", note);
}, [repeatDays, note]);
if (!reminderData) return;
const {
repeatDays: repeatDaysInitial,
message,
recipients,
nextReminderDate: nextReminderDateInitial
} = reminderData;
if (repeatDaysInitial) {
setValue("repeatDays", repeatDaysInitial);
setValue("reminderType", ReminderType.Recurring);
} else {
setValue("reminderType", ReminderType.OneTime);
}
if (message) setValue("message", message);
if (nextReminderDateInitial) setValue("nextReminderDate", nextReminderDateInitial);
// Set recipients
if (recipients?.length && memberOptions.length) {
const selectedRecipients = memberOptions.filter((option) =>
recipients.includes(option.value)
);
setValue("recipients", selectedRecipients);
}
}, [reminderData, memberOptions, setValue]);
return (
<Modal isOpen={isOpen} onOpenChange={onOpenChange}>
<ModalContent
title={`${repeatDays ? "Update" : "Create"} reminder`}
title={`${isEditMode ? "Update" : "Create"} reminder`}
subTitle="Set up a reminder for when this secret should be rotated. Everyone with access to this project will be notified when the reminder is triggered."
>
<form onSubmit={handleSubmit(handleFormSubmit)}>
<div className="space-y-2">
<div>
<Controller
control={control}
name="days"
render={({ field, fieldState }) => (
<>
<FormControl
isRequired
className="mb-0"
label="Reminder Interval (in days)"
isError={Boolean(fieldState.error)}
errorText={fieldState.error?.message || ""}
>
<Input
onChange={(el) => setValue("days", parseInt(el.target.value, 10))}
type="number"
placeholder="31"
defaultValue={repeatDays || undefined}
value={field.value || undefined}
/>
</FormControl>
<div
className={twMerge(
"ml-1 mt-2 text-xs",
field.value ? "opacity-60" : "opacity-0"
)}
>
A reminder will be sent every{" "}
{field.value && field.value > 1 ? `${field.value} days` : "day"}
</div>
</>
)}
/>
</div>
<FormControl label="Note" className="mb-0">
<TextArea
placeholder="Remember to rotate the AWS secret every month."
className="border border-mineshaft-600 text-sm"
rows={8}
defaultValue={note || ""}
reSize="none"
cols={30}
{...register("note")}
/>
</FormControl>
<form onSubmit={handleSubmit(handleFormSubmit)} className="space-y-6">
{/* Reminder Type Selection */}
<Controller
name="reminderType"
control={control}
render={({ field: { value, onChange }, fieldState: { error } }) => (
<FormControl
errorText={error?.message}
isError={Boolean(error?.message)}
label="Recurrence"
>
<Select
value={value}
onValueChange={(val) => {
onChange(val);
handleReminderTypeChange(val);
}}
className="w-full border border-mineshaft-500 capitalize"
position="popper"
placeholder="Select reminder recurrence"
dropdownContainerClassName="max-w-none"
>
{Object.values(ReminderType).map((type) => (
<SelectItem value={type} key={type}>
{type}
</SelectItem>
))}
</Select>
</FormControl>
)}
/>
{/* Conditional Fields Based on Reminder Type */}
{reminderType === ReminderType.Recurring ? (
<Controller
control={control}
name="recipients"
render={({ field }) => (
<FormControl
tooltipText={
<div>
Select users to receive reminders.
<br />
<br /> If none are selected, all project members will receive the reminder.
</div>
}
label="Recipients"
className="mb-0"
>
<FilterableSelect
className="w-full"
placeholder="Select reminder recipients..."
isMulti
name="recipients"
options={members.map((member) => ({
label: member.user.username || member.user.email,
value: member.user.id
}))}
value={field.value}
onChange={field.onChange}
/>
</FormControl>
name="repeatDays"
render={({ field, fieldState }) => (
<div>
<FormControl
isRequired
className="mb-0"
label="Reminder Interval (in days)"
isError={Boolean(fieldState.error)}
errorText={fieldState.error?.message || ""}
>
<Input
onChange={(el) => {
const value = parseInt(el.target.value, 10);
setValue("repeatDays", Number.isNaN(value) ? null : value);
}}
type="number"
placeholder={DEFAULT_REPEAT_DAYS.toString()}
value={field.value || ""}
min={MIN_REPEAT_DAYS}
max={MAX_REPEAT_DAYS}
/>
</FormControl>
{/* Interval description */}
<div
className={twMerge(
"ml-1 mt-2 text-xs",
field.value ? "opacity-60" : "opacity-0"
)}
>
A reminder will be sent every{" "}
{field.value && field.value > 1 ? `${field.value} days` : "day"}
</div>
</div>
)}
/>
</div>
<div className="mt-7 flex items-center space-x-4">
) : (
<Controller
control={control}
name="nextReminderDate"
render={({ field, fieldState }) => (
<div>
<FormControl
isRequired
className="mb-0"
label="Reminder Date"
isError={Boolean(fieldState.error)}
errorText={fieldState.error?.message || ""}
>
<DatePicker
value={field.value || undefined}
className="w-full"
onChange={field.onChange}
dateFormat="P"
popUpProps={{
open: isDatePickerOpen,
onOpenChange: setIsDatePickerOpen
}}
popUpContentProps={{}}
hideTime
hidden={{ before: new Date(Date.now() + 86400000) }}
/>
</FormControl>
</div>
)}
/>
)}
{/* Message/Note Field */}
<FormControl label="Note" className="mb-0">
<TextArea
placeholder="Remember to rotate the AWS secret every month."
className="border border-mineshaft-600 text-sm"
rows={DEFAULT_TEXTAREA_ROWS}
reSize="none"
cols={30}
{...register("message")}
/>
</FormControl>
{/* Recipients Selection */}
<Controller
control={control}
name="recipients"
render={({ field }) => (
<FormControl
tooltipText={
<div>
Select users to receive reminders.
<br />
<br /> If none are selected, all project members will receive the reminder.
</div>
}
label="Recipients"
className="mb-0"
>
<FilterableSelect
menuPlacement="top"
className="w-full"
placeholder="Select reminder recipients..."
isMulti
name="recipients"
options={memberOptions}
value={field.value}
onChange={field.onChange}
/>
</FormControl>
)}
/>
{/* Action Buttons */}
<div className="flex items-center space-x-4 pt-4">
<Button
isDisabled={isSubmitting}
isLoading={isSubmitting}
key="layout-create-project-submit"
className=""
leftIcon={<FontAwesomeIcon icon={faClock} />}
type="submit"
>
{repeatDays ? "Update" : "Create"} reminder
{isEditMode ? "Update" : "Create"} reminder
</Button>
{repeatDays && (
{isEditMode && (
<Button
key="layout-cancel-create-project"
onClick={() => onOpenChange(false, { days: null, note: null })}
onClick={handleDeleteReminder}
colorSchema="danger"
variant="outline"
leftIcon={<FontAwesomeIcon icon={faTrash} />}
type="button"
isDisabled={isSubmitting}
>
Delete reminder
</Button>
)}
<Button
key="layout-cancel-create-project"
onClick={() => onOpenChange(false)}
onClick={onOpenChange}
variant="plain"
colorSchema="secondary"
type="button"
isDisabled={isSubmitting}
>
Cancel
</Button>
@@ -1,4 +1,4 @@
import { useEffect } from "react";
import { useEffect, useMemo } from "react";
import { Controller, useFieldArray, useForm } from "react-hook-form";
import { subject } from "@casl/ability";
import { faCircleQuestion, faEye } from "@fortawesome/free-regular-svg-icons";
@@ -52,9 +52,11 @@ import {
useWorkspace
} from "@app/context";
import { ProjectPermissionSecretActions } from "@app/context/ProjectPermissionContext/types";
import { getProjectBaseURL } from "@app/helpers/project";
import { usePopUp, useToggle } from "@app/hooks";
import { useGetSecretVersion } from "@app/hooks/api";
import { ActorType } from "@app/hooks/api/auditLogs/enums";
import { useGetReminder } from "@app/hooks/api/reminders";
import { useGetSecretAccessList } from "@app/hooks/api/secrets/queries";
import { SecretV3RawSanitized, WsTag } from "@app/hooks/api/types";
import { ProjectType } from "@app/hooks/api/workspace/types";
@@ -114,6 +116,7 @@ export const SecretDetailSidebar = ({
const { permission } = useProjectPermission();
const { currentWorkspace } = useWorkspace();
const { data: reminderData } = useGetReminder(secret?.id);
const tagFields = useFieldArray({
control,
@@ -220,23 +223,8 @@ export const SecretDetailSidebar = ({
await onSaveSecret(secret, { ...secret, ...data }, () => reset());
};
const handleReminderSubmit = async (
reminderRepeatDays: number | null | undefined,
reminderNote: string | null | undefined,
reminderRecipients: string[] | undefined
) => {
await onSaveSecret(
secret,
{ ...secret, reminderRepeatDays, reminderNote, isReminderEvent: true, reminderRecipients },
() => {}
);
};
const [createReminderFormOpen, setCreateReminderFormOpen] = useToggle(false);
const secretReminderRepeatDays = watch("reminderRepeatDays");
const secretReminderNote = watch("reminderNote");
const secretReminderRecipients = watch("reminderRecipients");
useEffect(() => {
setValue(
"reminderRecipients",
@@ -302,27 +290,33 @@ export const SecretDetailSidebar = ({
}
};
const getDaysUntilReminder = useMemo(() => {
return (): string => {
const now = new Date();
now.setHours(0, 0, 0, 0);
const target = new Date(reminderData?.nextReminderDate || "");
target.setHours(0, 0, 0, 0);
const diffTime = target.getTime() - now.getTime();
const daysRemaining = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
return `Days until next reminder: ${daysRemaining}`;
};
}, [reminderData]);
return (
<>
<CreateReminderForm
repeatDays={secretReminderRepeatDays}
note={secretReminderNote}
recipients={secretReminderRecipients}
isOpen={createReminderFormOpen}
onOpenChange={(_, data) => {
onOpenChange={() => {
setCreateReminderFormOpen.toggle();
if (data) {
const recipients = data.recipients?.length
? data.recipients.map((recipient) => recipient.value)
: undefined;
setValue("reminderRepeatDays", data.days, { shouldDirty: false });
setValue("reminderNote", data.note, { shouldDirty: false });
setValue("reminderRecipients", recipients, { shouldDirty: false });
handleReminderSubmit(data.days, data.note, recipients);
}
}}
workspaceId={currentWorkspace.id}
environment={environment}
secretPath={secretPath}
secretId={secret?.id}
reminder={reminderData}
/>
<UpgradePlanModal
isOpen={popUp.secretAccessUpgradePlan.isOpen}
@@ -734,14 +728,11 @@ export const SecretDetailSidebar = ({
)}
/>
<FormControl>
{secretReminderRepeatDays && secretReminderRepeatDays > 0 ? (
{reminderData && reminderData.nextReminderDate ? (
<div className="flex items-center justify-between px-2">
<div className="flex items-center space-x-2">
<FontAwesomeIcon className="text-primary-500" icon={faClock} />
<span className="text-sm text-bunker-300">
Reminder every {secretReminderRepeatDays}{" "}
{secretReminderRepeatDays > 1 ? "days" : "day"}
</span>
<span className="text-sm text-bunker-300">{getDaysUntilReminder()}</span>
</div>
<div>
<Button
@@ -990,7 +981,9 @@ export const SecretDetailSidebar = ({
className="z-[100] capitalize"
>
<Link
to="/projects/$projectId/members/$membershipId"
to={
`${getProjectBaseURL(currentWorkspace.type)}/members/$membershipId` as const
}
params={{
projectId: currentWorkspace.id,
membershipId: user.membershipId
@@ -1021,7 +1014,9 @@ export const SecretDetailSidebar = ({
className="z-[100]"
>
<Link
to="/projects/$projectId/identities/$identityId"
to={
`${getProjectBaseURL(currentWorkspace.type)}/identities/$identityId` as const
}
params={{
projectId: currentWorkspace.id,
identityId: identity.id
@@ -13,7 +13,7 @@ const SecretDashboardPageQueryParamsSchema = z.object({
tags: z.string().catch("")
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/secrets/$envSlug"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secrets/$envSlug"
)({
component: SecretDashboardPage,
validateSearch: zodValidator(SecretDashboardPageQueryParamsSchema),
@@ -28,7 +28,7 @@ export const Route = createFileRoute(
{
label: "Secrets",
link: linkOptions({
to: "/projects/$projectId/secret-manager/overview",
to: "/projects/secret-management/$projectId/overview",
params
})
},
@@ -39,7 +39,7 @@ export const Route = createFileRoute(
links: context.project.environments.map((el) => ({
label: el.name,
link: linkOptions({
to: "/projects/$projectId/secret-manager/secrets/$envSlug",
to: "/projects/secret-management/$projectId/secrets/$envSlug",
params: {
projectId: params.projectId,
envSlug: el.slug
@@ -172,7 +172,7 @@ const Page = () => {
PostgreSQL and Microsoft SQL Server Rotations can now be created from the{" "}
<Link
className="text-mineshaft-100 underline decoration-primary underline-offset-2 hover:text-mineshaft-200"
to="/projects/$projectId/secret-manager/overview"
to="/projects/secret-management/$projectId/overview"
params={{ projectId: currentWorkspace.id }}
>
Secret Manager Dashboard
@@ -407,7 +407,7 @@ const Page = () => {
Infisical is revamping its Secret Rotation experience. Navigate to the{" "}
<Link
className="text-mineshaft-100 underline decoration-primary underline-offset-2 hover:text-mineshaft-200"
to="/projects/$projectId/secret-manager/overview"
to="/projects/secret-management/$projectId/overview"
params={{ projectId: currentWorkspace.id }}
>
Secret Manager Dashboard
@@ -424,7 +424,7 @@ const Page = () => {
<Button
onClick={() =>
navigate({
to: "/projects/$projectId/secret-manager/overview",
to: "/projects/secret-management/$projectId/overview",
params: { projectId: currentWorkspace.id }
})
}
@@ -3,7 +3,7 @@ import { createFileRoute } from "@tanstack/react-router";
import { SecretRotationPage } from "./SecretRotationPage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/secret-rotation"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/secret-rotation"
)({
component: SecretRotationPage,
beforeLoad: ({ context }) => {
@@ -0,0 +1,22 @@
import { GenericFieldLabel } from "@app/components/secret-syncs";
import { TBitbucketSync } from "@app/hooks/api/secretSyncs/types/bitbucket-sync";
type Props = {
secretSync: TBitbucketSync;
};
export const BitbucketSyncDestinationSection = ({ secretSync }: Props) => {
const {
destinationConfig: { workspaceSlug, repositorySlug, environmentId }
} = secretSync;
return (
<>
<GenericFieldLabel label="Workspace">{workspaceSlug}</GenericFieldLabel>
<GenericFieldLabel label="Repository">{repositorySlug}</GenericFieldLabel>
{environmentId && (
<GenericFieldLabel label="Deployment Environment">{environmentId}</GenericFieldLabel>
)}
</>
);
};
@@ -0,0 +1,12 @@
import { GenericFieldLabel } from "@app/components/secret-syncs";
import { TDigitalOceanAppPlatformSync } from "@app/hooks/api/secretSyncs/types/digital-ocean-app-platform-sync";
type Props = {
secretSync: TDigitalOceanAppPlatformSync;
};
export const DigitalOceanAppPlatformSyncDestinationSection = ({ secretSync }: Props) => {
const { destinationConfig } = secretSync;
return <GenericFieldLabel label="App">{destinationConfig.appName}</GenericFieldLabel>;
};
@@ -17,11 +17,13 @@ import { AwsSecretsManagerSyncDestinationSection } from "./AwsSecretsManagerSync
import { AzureAppConfigurationSyncDestinationSection } from "./AzureAppConfigurationSyncDestinationSection";
import { AzureDevOpsSyncDestinationSection } from "./AzureDevOpsSyncDestinationSection";
import { AzureKeyVaultSyncDestinationSection } from "./AzureKeyVaultSyncDestinationSection";
import { BitbucketSyncDestinationSection } from "./BitbucketSyncDestinationSection";
import { CamundaSyncDestinationSection } from "./CamundaSyncDestinationSection";
import { ChecklySyncDestinationSection } from "./ChecklySyncDestinationSection";
import { CloudflarePagesSyncDestinationSection } from "./CloudflarePagesSyncDestinationSection";
import { CloudflareWorkersSyncDestinationSection } from "./CloudflareWorkersSyncDestinationSection";
import { DatabricksSyncDestinationSection } from "./DatabricksSyncDestinationSection";
import { DigitalOceanAppPlatformSyncDestinationSection } from "./DigitalOceanAppPlatformSyncDestinationSection";
import { FlyioSyncDestinationSection } from "./FlyioSyncDestinationSection";
import { GcpSyncDestinationSection } from "./GcpSyncDestinationSection";
import { GitHubSyncDestinationSection } from "./GitHubSyncDestinationSection";
@@ -134,6 +136,14 @@ export const SecretSyncDestinationSection = ({ secretSync, onEditDestination }:
case SecretSync.Supabase:
DestinationComponents = <SupabaseSyncDestinationSection secretSync={secretSync} />;
break;
case SecretSync.DigitalOceanAppPlatform:
DestinationComponents = (
<DigitalOceanAppPlatformSyncDestinationSection secretSync={secretSync} />
);
break;
case SecretSync.Bitbucket:
DestinationComponents = <BitbucketSyncDestinationSection secretSync={secretSync} />;
break;
default:
throw new Error(`Unhandled Destination Section components: ${destination}`);
}
@@ -65,6 +65,8 @@ export const SecretSyncOptionsSection = ({ secretSync, onEditOptions }: Props) =
case SecretSync.Railway:
case SecretSync.Supabase:
case SecretSync.Checkly:
case SecretSync.DigitalOceanAppPlatform:
case SecretSync.Bitbucket:
AdditionalSyncOptionsComponent = null;
break;
default:
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { SecretSyncDetailsByIDPage } from "./SecretSyncDetailsByIDPage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/secret-syncs/$destination/$syncId"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/secret-syncs/$destination/$syncId"
)({
component: SecretSyncDetailsByIDPage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.SecretSyncs
@@ -4,9 +4,10 @@ import { useTranslation } from "react-i18next";
import { PageHeader, Tab, TabList, TabPanel, Tabs } from "@app/components/v2";
import { useWorkspace } from "@app/context";
import { ProjectVersion } from "@app/hooks/api/workspace/types";
import { ProjectGeneralTab } from "@app/pages/project/SettingsPage/components/ProjectGeneralTab";
import { EncryptionTab } from "./components/EncryptionTab";
import { ProjectGeneralTab } from "./components/ProjectGeneralTab";
import { SecretSettingsTab } from "./components/ProjectGeneralTab";
import { WebhooksTab } from "./components/WebhooksTab";
import { WorkflowIntegrationTab } from "./components/WorkflowIntegrationSection";
@@ -15,6 +16,7 @@ export const SettingsPage = () => {
const { currentWorkspace } = useWorkspace();
const tabs = [
{ name: "General", key: "tab-project-general", Component: ProjectGeneralTab },
{ name: "Secrets Management", key: "tab-secret-general", Component: SecretSettingsTab },
{
name: "Encryption",
key: "tab-project-encryption",
@@ -6,7 +6,7 @@ import { SecretSharingSection } from "../SecretSharingSection";
import { SecretSnapshotsLegacySection } from "../SecretSnapshotsLegacySection";
import { SecretTagsSection } from "../SecretTagsSection";
export const ProjectGeneralTab = () => {
export const SecretSettingsTab = () => {
return (
<div>
<EnvironmentSection />
@@ -1 +1 @@
export { ProjectGeneralTab } from "./ProjectGeneralTab";
export { SecretSettingsTab } from "./ProjectGeneralTab";
@@ -3,7 +3,7 @@ import { createFileRoute } from "@tanstack/react-router";
import { SettingsPage } from "./SettingsPage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/settings"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/settings"
)({
component: SettingsPage,
beforeLoad: ({ context }) => {
@@ -68,7 +68,7 @@ export const AWSParameterStoreAuthorizeIntegrationPage = () => {
});
navigate({
to: "/projects/$projectId/secret-manager/integrations/aws-parameter-store/create",
to: "/projects/secret-management/$projectId/integrations/aws-parameter-store/create",
params: {
projectId: currentWorkspace.id
},
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { AWSParameterStoreAuthorizeIntegrationPage } from "./AwsParameterStoreAuthorizePage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/aws-parameter-store/authorize"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/authorize"
)({
component: AWSParameterStoreAuthorizeIntegrationPage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -156,7 +156,7 @@ export const AWSParameterStoreConfigurePage = () => {
setPathErrorText("");
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const AwsParameterStoreConfigurePageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/aws-parameter-store/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-parameter-store/create"
)({
component: AWSParameterStoreConfigurePage,
validateSearch: zodValidator(AwsParameterStoreConfigurePageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -66,7 +66,7 @@ export const AWSSecretManagerAuthorizePage = () => {
})
});
navigate({
to: "/projects/$projectId/secret-manager/integrations/aws-secret-manager/create",
to: "/projects/secret-management/$projectId/integrations/aws-secret-manager/create",
params: {
projectId: currentWorkspace.id
},
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { AWSSecretManagerAuthorizePage } from "./AwsSecretManagerAuthorizePage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/aws-secret-manager/authorize"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/authorize"
)({
component: AWSSecretManagerAuthorizePage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -204,7 +204,7 @@ export const AwsSecretManagerConfigurePage = () => {
});
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const AwsSecretManagerConfigurePageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/aws-secret-manager/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/aws-secret-manager/create"
)({
component: AwsSecretManagerConfigurePage,
validateSearch: zodValidator(AwsSecretManagerConfigurePageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -131,7 +131,7 @@ export const AzureAppConfigurationConfigurePage = () => {
});
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const AzureAppConfigurationPageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-app-configuration/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/create"
)({
component: AzureAppConfigurationConfigurePage,
validateSearch: zodValidator(AzureAppConfigurationPageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -28,7 +28,7 @@ export const AzureAppConfigurationOauthCallbackPage = () => {
});
navigate({
to: "/projects/$projectId/secret-manager/integrations/azure-app-configuration/create",
to: "/projects/secret-management/$projectId/integrations/azure-app-configuration/create",
params: {
projectId: currentWorkspace.id
},
@@ -12,7 +12,7 @@ export const AzureAppConfigurationOauthCallbackPageQueryParamsSchema = z.object(
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-app-configuration/oauth2/callback"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-app-configuration/oauth2/callback"
)({
component: AzureAppConfigurationOauthCallbackPage,
validateSearch: zodValidator(AzureAppConfigurationOauthCallbackPageQueryParamsSchema),
@@ -23,7 +23,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -39,7 +39,7 @@ export const AzureDevopsAuthorizePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations/azure-devops/create",
to: "/projects/secret-management/$projectId/integrations/azure-devops/create",
params: {
projectId: currentWorkspace.id
},
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { AzureDevopsAuthorizePage } from "./AzureDevopsAuthorizePage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-devops/authorize"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/authorize"
)({
component: AzureDevopsAuthorizePage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -80,7 +80,7 @@ export const AzureDevopsConfigurePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const AzureDevopsConfigurePageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-devops/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-devops/create"
)({
component: AzureDevopsConfigurePage,
validateSearch: zodValidator(AzureDevopsConfigurePageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -11,7 +11,7 @@ const PageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-key-vault/authorize"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/authorize"
)({
component: AzureKeyVaultAuthorizePage,
validateSearch: PageQueryParamsSchema,
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -88,7 +88,7 @@ export const AzureKeyVaultConfigurePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const AzureKeyVaultConfigurePageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-key-vault/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/create"
)({
component: AzureKeyVaultConfigurePage,
validateSearch: zodValidator(AzureKeyVaultConfigurePageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -28,7 +28,7 @@ export const AzureKeyVaultOauthCallbackPage = () => {
});
navigate({
to: "/projects/$projectId/secret-manager/integrations/azure-key-vault/create",
to: "/projects/secret-management/$projectId/integrations/azure-key-vault/create",
params: {
projectId: currentWorkspace.id
},
@@ -12,7 +12,7 @@ export const AzureKeyVaultOauthCallbackQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/azure-key-vault/oauth2/callback"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/azure-key-vault/oauth2/callback"
)({
component: AzureKeyVaultOauthCallbackPage,
validateSearch: zodValidator(AzureKeyVaultOauthCallbackQueryParamsSchema),
@@ -23,7 +23,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -148,7 +148,7 @@ export const BitbucketConfigurePage = () => {
text: "Successfully created integration"
});
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const BitbucketConfigurePageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/bitbucket/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/create"
)({
component: BitbucketConfigurePage,
validateSearch: zodValidator(BitbucketConfigurePageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -27,7 +27,7 @@ export const BitbucketOauthCallbackPage = () => {
});
navigate({
to: "/projects/$projectId/secret-manager/integrations/bitbucket/create",
to: "/projects/secret-management/$projectId/integrations/bitbucket/create",
params: {
projectId: currentWorkspace.id
},
@@ -12,7 +12,7 @@ export const BitbucketOauthCallbackQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/bitbucket/oauth2/callback"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/bitbucket/oauth2/callback"
)({
component: BitbucketOauthCallbackPage,
validateSearch: zodValidator(BitbucketOauthCallbackQueryParamsSchema),
@@ -23,7 +23,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -36,7 +36,7 @@ export const ChecklyAuthorizePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations/checkly/create",
to: "/projects/secret-management/$projectId/integrations/checkly/create",
params: {
projectId: currentWorkspace.id
},
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { ChecklyAuthorizePage } from "./ChecklyAuthorizePage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/checkly/authorize"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/authorize"
)({
component: ChecklyAuthorizePage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -113,7 +113,7 @@ export const ChecklyConfigurePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const ChecklyConfigurePageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/checkly/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/checkly/create"
)({
component: ChecklyConfigurePage,
validateSearch: zodValidator(ChecklyConfigurePageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -36,7 +36,7 @@ export const CircleCIAuthorizePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations/circleci/create",
to: "/projects/secret-management/$projectId/integrations/circleci/create",
params: {
projectId: currentWorkspace.id
},
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { CircleCIAuthorizePage } from "./CircleCIAuthorizePage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/circleci/authorize"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/authorize"
)({
component: CircleCIAuthorizePage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -103,7 +103,7 @@ export const CircleCIConfigurePage = () => {
text: "Successfully created integration"
});
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const CircleCIConfigurePageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/circleci/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/circleci/create"
)({
component: CircleCIConfigurePage,
validateSearch: zodValidator(CircleCIConfigurePageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -34,7 +34,7 @@ export const Cloud66AuthorizePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations/cloud-66/create",
to: "/projects/secret-management/$projectId/integrations/cloud-66/create",
params: {
projectId: currentWorkspace.id
},
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { Cloud66AuthorizePage } from "./Cloud66AuthorizePage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloud-66/authorize"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/authorize"
)({
component: Cloud66AuthorizePage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -75,7 +75,7 @@ export const Cloud66ConfigurePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const Cloud66ConfigurePageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloud-66/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloud-66/create"
)({
component: Cloud66ConfigurePage,
validateSearch: zodValidator(Cloud66ConfigurePageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -41,7 +41,7 @@ export const CloudflarePagesAuthorizePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations/cloudflare-pages/create",
to: "/projects/secret-management/$projectId/integrations/cloudflare-pages/create",
params: {
projectId: currentWorkspace.id
},
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { CloudflarePagesAuthorizePage } from "./CloudflarePagesAuthorizePage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloudflare-pages/authorize"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/authorize"
)({
component: CloudflarePagesAuthorizePage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -94,7 +94,7 @@ export const CloudflarePagesConfigurePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const CloudflarePagesConfigurePageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloudflare-pages/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-pages/create"
)({
component: CloudflarePagesConfigurePage,
validateSearch: zodValidator(CloudflarePagesConfigurePageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -41,7 +41,7 @@ export const CloudflareWorkersAuthorizePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations/cloudflare-workers/create",
to: "/projects/secret-management/$projectId/integrations/cloudflare-workers/create",
params: {
projectId: currentWorkspace.id
},
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { CloudflareWorkersAuthorizePage } from "./CloudflareWorkersAuthorizePage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloudflare-workers/authorize"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/authorize"
)({
component: CloudflareWorkersAuthorizePage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -67,7 +67,7 @@ export const CloudflareWorkersConfigurePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const CloudflareWorkersConfigurePageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/cloudflare-workers/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/cloudflare-workers/create"
)({
component: CloudflareWorkersConfigurePage,
validateSearch: zodValidator(CloudflareWorkersConfigurePageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -33,7 +33,7 @@ export const CodefreshAuthorizePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations/codefresh/create",
to: "/projects/secret-management/$projectId/integrations/codefresh/create",
params: {
projectId: currentWorkspace.id
},
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { CodefreshAuthorizePage } from "./CodefreshAuthorizePage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/codefresh/authorize"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/authorize"
)({
component: CodefreshAuthorizePage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -71,7 +71,7 @@ export const CodefreshConfigurePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const CodefreshConfigurePageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/codefresh/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/codefresh/create"
)({
component: CodefreshConfigurePage,
validateSearch: zodValidator(CodefreshConfigurePageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -40,7 +40,7 @@ export const DatabricksAuthorizePage = () => {
});
navigate({
to: "/projects/$projectId/secret-manager/integrations/databricks/create",
to: "/projects/secret-management/$projectId/integrations/databricks/create",
params: {
projectId: currentWorkspace.id
},
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { DatabricksAuthorizePage } from "./DatabricksAuthorizePage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/databricks/authorize"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/authorize"
)({
component: DatabricksAuthorizePage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -87,7 +87,7 @@ export const DatabricksConfigurePage = () => {
});
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const DatabricksConfigurePageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/databricks/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/databricks/create"
)({
component: DatabricksConfigurePage,
validateSearch: zodValidator(DatabricksConfigurePageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -33,7 +33,7 @@ export const DigitalOceanAppPlatformAuthorizePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations/digital-ocean-app-platform/create",
to: "/projects/secret-management/$projectId/integrations/digital-ocean-app-platform/create",
params: {
projectId: currentWorkspace.id
},
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { DigitalOceanAppPlatformAuthorizePage } from "./DigitalOceanAppPlatformAuthorizePage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/digital-ocean-app-platform/authorize"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/authorize"
)({
component: DigitalOceanAppPlatformAuthorizePage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -72,7 +72,7 @@ export const DigitalOceanAppPlatformConfigurePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params: {
projectId: currentWorkspace.id
},
@@ -11,7 +11,7 @@ const DigitalOceanAppPlatformConfigurePageQueryParamsSchema = z.object({
});
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/digital-ocean-app-platform/create"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/digital-ocean-app-platform/create"
)({
component: DigitalOceanAppPlatformConfigurePage,
validateSearch: zodValidator(DigitalOceanAppPlatformConfigurePageQueryParamsSchema),
@@ -22,7 +22,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations
@@ -44,7 +44,7 @@ export const FlyioAuthorizePage = () => {
setIsLoading(false);
navigate({
to: "/projects/$projectId/secret-manager/integrations/flyio/create",
to: "/projects/secret-management/$projectId/integrations/flyio/create",
params: {
projectId: currentWorkspace.id
},
@@ -5,7 +5,7 @@ import { IntegrationsListPageTabs } from "@app/types/integrations";
import { FlyioAuthorizePage } from "./FlyioAuthorizePage";
export const Route = createFileRoute(
"/_authenticate/_inject-org-details/_org-layout/projects/$projectId/_project-layout/secret-manager/_secret-manager-layout/integrations/flyio/authorize"
"/_authenticate/_inject-org-details/_org-layout/projects/secret-management/$projectId/_secret-manager-layout/integrations/flyio/authorize"
)({
component: FlyioAuthorizePage,
beforeLoad: ({ context, params }) => {
@@ -15,7 +15,7 @@ export const Route = createFileRoute(
{
label: "Integrations",
link: linkOptions({
to: "/projects/$projectId/secret-manager/integrations",
to: "/projects/secret-management/$projectId/integrations",
params,
search: {
selectedTab: IntegrationsListPageTabs.NativeIntegrations

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