diff --git a/frontend/src/hooks/api/secretImports/queries.tsx b/frontend/src/hooks/api/secretImports/queries.tsx index dfc8c6497..ea6ea68ef 100644 --- a/frontend/src/hooks/api/secretImports/queries.tsx +++ b/frontend/src/hooks/api/secretImports/queries.tsx @@ -182,7 +182,8 @@ export const useGetImportedSecretsAllEnvs = ({ comment: encSecret.secretComment, createdAt: encSecret.createdAt, updatedAt: encSecret.updatedAt, - version: encSecret.version + version: encSecret.version, + sourceEnv: env }; }) })), diff --git a/frontend/src/hooks/utils/secrets-overview.tsx b/frontend/src/hooks/utils/secrets-overview.tsx index 89fc679c4..75b389612 100644 --- a/frontend/src/hooks/utils/secrets-overview.tsx +++ b/frontend/src/hooks/utils/secrets-overview.tsx @@ -86,13 +86,5 @@ export const useSecretOverview = (secrets: DashboardProjectSecretsOverview["secr [secrets] ); - const getSecretByKey = useCallback( - (env: string, key: string) => { - const sec = secrets?.find((s) => s.env === env && s.key === key); - return sec; - }, - [secrets] - ); - - return { secKeys, getSecretByKey, getEnvSecretKeyCount }; + return { secKeys, getEnvSecretKeyCount }; }; diff --git a/frontend/src/pages/secret-manager/OverviewPage/OverviewPage.tsx b/frontend/src/pages/secret-manager/OverviewPage/OverviewPage.tsx index 8fb90243b..67baecb15 100644 --- a/frontend/src/pages/secret-manager/OverviewPage/OverviewPage.tsx +++ b/frontend/src/pages/secret-manager/OverviewPage/OverviewPage.tsx @@ -81,7 +81,6 @@ import { CreateSecretForm } from "./components/CreateSecretForm"; import { FolderBreadCrumbs } from "./components/FolderBreadCrumbs"; import { SecretOverviewDynamicSecretRow } from "./components/SecretOverviewDynamicSecretRow"; import { SecretOverviewFolderRow } from "./components/SecretOverviewFolderRow"; -import { SecretOverviewImportListView } from "./components/SecretOverviewImportListView"; import { SecretNoAccessOverviewTableRow, SecretOverviewTableRow @@ -203,12 +202,16 @@ export const OverviewPage = () => { setVisibleEnvs(userAvailableEnvs); }, [userAvailableEnvs]); - const { isImportedSecretPresentInEnv, getImportedSecretByKey, getEnvImportedSecretKeyCount } = - useGetImportedSecretsAllEnvs({ - projectId: workspaceId, - path: secretPath, - environments: (userAvailableEnvs || []).map(({ slug }) => slug) - }); + const { + secretImports, + isImportedSecretPresentInEnv, + getImportedSecretByKey, + getEnvImportedSecretKeyCount + } = useGetImportedSecretsAllEnvs({ + projectId: workspaceId, + path: secretPath, + environments: (userAvailableEnvs || []).map(({ slug }) => slug) + }); const { isPending: isOverviewLoading, data: overview } = useGetProjectSecretsOverview( { @@ -232,7 +235,6 @@ export const OverviewPage = () => { secrets, folders, dynamicSecrets, - imports, totalFolderCount, totalSecretCount, totalDynamicSecretCount, @@ -244,16 +246,20 @@ export const OverviewPage = () => { totalUniqueDynamicSecretsInPage } = overview ?? {}; - const importsShaped = imports - ?.filter((el) => !el.isReserved) - ?.map(({ importPath, importEnv }) => ({ importPath, importEnv })) - .filter( - (el, index, self) => - index === - self.findIndex( - (item) => item.importPath === el.importPath && item.importEnv.slug === el.importEnv.slug - ) - ); + const secretImportsShaped = secretImports + ?.flatMap(({ data }) => data) + .filter(Boolean) + .flatMap((item) => item?.secrets || []); + + const handleIsImportedSecretPresentInEnv = (envSlug: string, secretName: string) => { + if (secrets?.some((s) => s.key === secretName && s.env === envSlug)) { + return false; + } + if (secretImportsShaped.some((s) => s.key === secretName && s.sourceEnv === envSlug)) { + return true; + } + return isImportedSecretPresentInEnv(envSlug, secretName); + }; useResetPageHelper({ totalCount, @@ -267,7 +273,18 @@ export const OverviewPage = () => { const { dynamicSecretNames, isDynamicSecretPresentInEnv } = useDynamicSecretOverview(dynamicSecrets); - const { secKeys, getSecretByKey, getEnvSecretKeyCount } = useSecretOverview(secrets); + const { secKeys, getEnvSecretKeyCount } = useSecretOverview( + secrets?.concat(secretImportsShaped) || [] + ); + + const getSecretByKey = useCallback( + (env: string, key: string) => { + const sec = secrets?.find((s) => s.env === env && s.key === key); + return sec; + }, + [secrets] + ); + const { data: tags } = useGetWsTags( permission.can(ProjectPermissionActions.Read, ProjectPermissionSub.Tags) ? workspaceId : "" ); @@ -1124,24 +1141,13 @@ export const OverviewPage = () => { key={`overview-${dynamicSecretName}-${index + 1}`} /> ))} - {filter.import && - importsShaped && - importsShaped?.length > 0 && - importsShaped?.map((item, index) => ( - - ))} {secKeys.map((key, index) => ( toggleSelectedEntry(EntryType.SECRET, key)} secretPath={secretPath} getImportedSecretByKey={getImportedSecretByKey} - isImportedSecretPresentInEnv={isImportedSecretPresentInEnv} + isImportedSecretPresentInEnv={handleIsImportedSecretPresentInEnv} onSecretCreate={handleSecretCreate} onSecretDelete={handleSecretDelete} onSecretUpdate={handleSecretUpdate} diff --git a/frontend/src/pages/secret-manager/OverviewPage/components/SecretOverviewImportListView/SecretOverviewImportListView.tsx b/frontend/src/pages/secret-manager/OverviewPage/components/SecretOverviewImportListView/SecretOverviewImportListView.tsx deleted file mode 100644 index e646362b8..000000000 --- a/frontend/src/pages/secret-manager/OverviewPage/components/SecretOverviewImportListView/SecretOverviewImportListView.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { faCheck, faFileImport, faXmark } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { twMerge } from "tailwind-merge"; - -import { Td, Tr } from "@app/components/v2"; -import { TSecretImport, WorkspaceEnv } from "@app/hooks/api/types"; -import { EnvFolderIcon } from "@app/pages/secret-manager/SecretDashboardPage/components/SecretImportListView/SecretImportItem"; - -type Props = { - secretImport: { importPath: string; importEnv: WorkspaceEnv }; - environments: { name: string; slug: string }[]; - allSecretImports?: TSecretImport[]; -}; - -export const SecretOverviewImportListView = ({ - secretImport, - environments = [], - allSecretImports = [] -}: Props) => { - const isSecretPresentInEnv = (envSlug: string) => { - return allSecretImports.some((item) => { - if (item.isReplication) { - if ( - item.importPath === secretImport.importPath && - item.importEnv.slug === secretImport.importEnv.slug - ) { - const reservedItem = allSecretImports.find((element) => - element.importPath.includes(`__reserve_replication_${item.id}`) - ); - // If the reserved item exists, check if the envSlug matches - if (reservedItem) { - return reservedItem.environment === envSlug; - } - } - } else { - // If the item is not replication, check if the envSlug matches directly - return ( - item.environment === envSlug && - item.importPath === secretImport.importPath && - item.importEnv.slug === secretImport.importEnv.slug - ); - } - return false; - }); - }; - - return ( - - -
-
- -
-
- -
-
- - {environments.map(({ slug }, i) => { - const isPresent = isSecretPresentInEnv(slug); - return ( - -
-
- -
-
- - ); - })} - - ); -}; diff --git a/frontend/src/pages/secret-manager/OverviewPage/components/SecretOverviewImportListView/index.tsx b/frontend/src/pages/secret-manager/OverviewPage/components/SecretOverviewImportListView/index.tsx deleted file mode 100644 index daf7f71b4..000000000 --- a/frontend/src/pages/secret-manager/OverviewPage/components/SecretOverviewImportListView/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { SecretOverviewImportListView } from "./SecretOverviewImportListView"; diff --git a/frontend/src/pages/secret-manager/OverviewPage/components/SecretOverviewTableRow/SecretRenameRow.tsx b/frontend/src/pages/secret-manager/OverviewPage/components/SecretOverviewTableRow/SecretRenameRow.tsx index ce2e43f67..d15e96a91 100644 --- a/frontend/src/pages/secret-manager/OverviewPage/components/SecretOverviewTableRow/SecretRenameRow.tsx +++ b/frontend/src/pages/secret-manager/OverviewPage/components/SecretOverviewTableRow/SecretRenameRow.tsx @@ -162,7 +162,7 @@ function SecretRenameRow({ environments, getSecretByKey, secretKey, secretPath } render={({ field, fieldState: { error } }) => (