From 1781b7139927730b8f7d38863380875e2e4e1d3f Mon Sep 17 00:00:00 2001 From: Mohammed Date: Fri, 3 Feb 2023 22:33:39 +0100 Subject: [PATCH] add new modal to compare secrets across environments --- .../dashboard/CompareSecretsModal.tsx | 75 +++++++++++++++++++ frontend/src/components/dashboard/SideBar.tsx | 60 +++++++++++---- 2 files changed, 119 insertions(+), 16 deletions(-) create mode 100644 frontend/src/components/dashboard/CompareSecretsModal.tsx diff --git a/frontend/src/components/dashboard/CompareSecretsModal.tsx b/frontend/src/components/dashboard/CompareSecretsModal.tsx new file mode 100644 index 0000000000..8c41ae8cab --- /dev/null +++ b/frontend/src/components/dashboard/CompareSecretsModal.tsx @@ -0,0 +1,75 @@ +import { SetStateAction, useEffect, useState } from 'react'; + +import { WorkspaceEnv } from '~/pages/dashboard/[id]'; + +import getSecretsForProject from '../utilities/secrets/getSecretsForProject'; +import { Modal, ModalContent } from '../v2'; + +interface Secrets { + label: string; + secret: string; +} + +interface CompareSecretsModalProps { + compareModal: boolean; + setCompareModal: React.Dispatch>; + selectedEnv: WorkspaceEnv; + workspaceEnvs: WorkspaceEnv[]; + workspaceId: string; + currentSecret: { + key: string; + value: string; + }; +} + +const CompareSecretsModal = ({ + compareModal, + setCompareModal, + selectedEnv, + workspaceEnvs, + workspaceId, + currentSecret +}: CompareSecretsModalProps) => { + const [secrets, setSecrets] = useState([]); + + const getEnvSecrets = async () => { + const workspaceEnvironments = workspaceEnvs.filter((env) => env !== selectedEnv); + const newSecrets = await Promise.all( + workspaceEnvironments.map(async (env) => { + const allSecrets = await getSecretsForProject({ env: env.slug, workspaceId }); + const secret = + allSecrets.find((item) => item.key === currentSecret.key)?.value ?? 'Not found'; + return { label: env.name, secret }; + }) + ); + setSecrets([{ label: selectedEnv.name, secret: currentSecret.value }, ...newSecrets]); + }; + + useEffect(() => { + if (compareModal) { + (async () => { + await getEnvSecrets(); + })(); + } + }, [compareModal]); + + return ( + + e.preventDefault()}> +
+ {secrets.map((item) => ( +
+

{item.label}

+ +
+ ))} +
+
+
+ ); +}; +export default CompareSecretsModal; diff --git a/frontend/src/components/dashboard/SideBar.tsx b/frontend/src/components/dashboard/SideBar.tsx index 1a3f99a297..b6c20d8d63 100644 --- a/frontend/src/components/dashboard/SideBar.tsx +++ b/frontend/src/components/dashboard/SideBar.tsx @@ -7,9 +7,12 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import SecretVersionList from '@app/ee/components/SecretVersionList'; +import { WorkspaceEnv } from '~/pages/dashboard/[id]'; + import Button from '../basic/buttons/Button'; import Toggle from '../basic/Toggle'; import CommentField from './CommentField'; +import CompareSecretsModal from './CompareSecretsModal'; import DashboardInputField from './DashboardInputField'; import { DeleteActionButton } from './DeleteActionButton'; import GenerateSecretMenu from './GenerateSecretMenu'; @@ -40,6 +43,9 @@ interface SideBarProps { sharedToHide: string[]; setSharedToHide: (values: string[]) => void; deleteRow: (props: DeleteRowFunctionProps) => void; + workspaceEnvs: WorkspaceEnv[]; + selectedEnv: WorkspaceEnv; + workspaceId: string; } /** @@ -63,11 +69,15 @@ const SideBar = ({ modifyComment, buttonReady, savePush, - deleteRow + deleteRow, + workspaceEnvs, + selectedEnv, + workspaceId }: SideBarProps) => { // eslint-disable-next-line @typescript-eslint/no-unused-vars const [isLoading, setIsLoading] = useState(false); - const [overrideEnabled, setOverrideEnabled] = useState(data[0].valueOverride !== undefined); + const [overrideEnabled, setOverrideEnabled] = useState(data[0]?.valueOverride !== undefined); + const [compareModal, setCompareModal] = useState(false); const { t } = useTranslation(); return ( @@ -171,20 +181,38 @@ const SideBar = ({ /> )} -
-
+
+
);