From 609ce8e5cc91ce98853032c4b12cee8981ee6bcf Mon Sep 17 00:00:00 2001 From: Daniel Hougaard <62331820+DanielHougaard@users.noreply.github.com> Date: Thu, 21 Mar 2024 03:06:14 +0100 Subject: [PATCH] Fix: Improved UI import indicators --- .../components/v2/SecretInput/SecretInput.tsx | 18 ++++++++++-- .../src/hooks/api/secretImports/queries.tsx | 4 +-- .../SecretOverviewPage/SecretOverviewPage.tsx | 7 ----- .../SecretOverviewFolderRow.tsx | 29 +++++++------------ .../SecretOverviewTableRow/SecretEditRow.tsx | 18 ++++++++++-- .../SecretOverviewTableRow.tsx | 9 +++++- 6 files changed, 52 insertions(+), 33 deletions(-) diff --git a/frontend/src/components/v2/SecretInput/SecretInput.tsx b/frontend/src/components/v2/SecretInput/SecretInput.tsx index 2dfafca74..7fe1c4829 100644 --- a/frontend/src/components/v2/SecretInput/SecretInput.tsx +++ b/frontend/src/components/v2/SecretInput/SecretInput.tsx @@ -14,7 +14,8 @@ const replaceContentWithDot = (str: string) => { return finalStr; }; -const syntaxHighlight = (content?: string | null, isVisible?: boolean) => { +const syntaxHighlight = (content?: string | null, isVisible?: boolean, isImport?: boolean) => { + if (isImport) return "IMPORTED"; if (content === "") return "EMPTY"; if (!content) return "EMPTY"; if (!isVisible) return replaceContentWithDot(content); @@ -46,6 +47,7 @@ const syntaxHighlight = (content?: string | null, isVisible?: boolean) => { type Props = TextareaHTMLAttributes & { value?: string | null; isVisible?: boolean; + isImport?: boolean; isReadOnly?: boolean; isDisabled?: boolean; containerClassName?: string; @@ -55,7 +57,17 @@ const commonClassName = "font-mono text-sm caret-white border-none outline-none export const SecretInput = forwardRef( ( - { value, isVisible, containerClassName, onBlur, isDisabled, isReadOnly, onFocus, ...props }, + { + value, + isVisible, + isImport, + containerClassName, + onBlur, + isDisabled, + isReadOnly, + onFocus, + ...props + }, ref ) => { const [isSecretFocused, setIsSecretFocused] = useToggle(); @@ -69,7 +81,7 @@ export const SecretInput = forwardRef(
             
               
-                {syntaxHighlight(value, isVisible || isSecretFocused)}
+                {syntaxHighlight(value, isVisible || isSecretFocused, isImport)}
               
             
           
diff --git a/frontend/src/hooks/api/secretImports/queries.tsx b/frontend/src/hooks/api/secretImports/queries.tsx index 1019c6c61..2879c859b 100644 --- a/frontend/src/hooks/api/secretImports/queries.tsx +++ b/frontend/src/hooks/api/secretImports/queries.tsx @@ -269,8 +269,8 @@ export const useGetImportedSecretsAllEnvs = ({ if (selectedEnvIndex !== -1) { const isPresent = secretImports?.[selectedEnvIndex]?.data?.find( - ({ secretPath, ...rest }) => - secretPath === secPath && rest.secrets.some((s) => s.key === secretName) + ({ secretPath, secrets }) => + secretPath === secPath && secrets.some((s) => s.key === secretName) ); return Boolean(isPresent); diff --git a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx index 02741cc9f..4b78411a9 100644 --- a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx +++ b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx @@ -55,7 +55,6 @@ import { useCreateSecretV3, useDeleteSecretV3, useGetFoldersByEnv, - useGetImportedFoldersByEnv, useGetImportedSecretsAllEnvs, useGetProjectSecretsAllEnv, useGetUserWsKey, @@ -133,11 +132,6 @@ export const SecretOverviewPage = () => { environments: userAvailableEnvs.map(({ slug }) => slug) }); - const { isImportedFolderPresentInEnv } = useGetImportedFoldersByEnv({ - projectId: workspaceId, - environments: userAvailableEnvs.map(({ slug }) => slug) - }); - const { isImportedSecretPresentInEnv } = useGetImportedSecretsAllEnvs({ projectId: workspaceId, decryptFileKey: latestFileKey!, @@ -652,7 +646,6 @@ export const SecretOverviewPage = () => { boolean; - isImportedFolderPresentInEnv: (name: string, env: string) => boolean; onClick: (path: string) => void; }; @@ -16,7 +15,7 @@ export const SecretOverviewFolderRow = ({ folderName, environments = [], isFolderPresentInEnv, - isImportedFolderPresentInEnv, + onClick }: Props) => { return ( @@ -31,27 +30,21 @@ export const SecretOverviewFolderRow = ({ {environments.map(({ slug }, i) => { const isPresent = isFolderPresentInEnv(folderName, slug); - const isImportPresent = isImportedFolderPresentInEnv(folderName, slug); + return ( - -
- -
-
+
+ +
); })} diff --git a/frontend/src/views/SecretOverviewPage/components/SecretOverviewTableRow/SecretEditRow.tsx b/frontend/src/views/SecretOverviewPage/components/SecretOverviewTableRow/SecretEditRow.tsx index 9653a9bd0..628e3d008 100644 --- a/frontend/src/views/SecretOverviewPage/components/SecretOverviewTableRow/SecretEditRow.tsx +++ b/frontend/src/views/SecretOverviewPage/components/SecretOverviewTableRow/SecretEditRow.tsx @@ -2,6 +2,7 @@ import { Controller, useForm } from "react-hook-form"; import { subject } from "@casl/ability"; import { faCheck, faCopy, faTrash, faXmark } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { twMerge } from "tailwind-merge"; import { useNotificationContext } from "@app/components/context/Notifications/NotificationProvider"; import { ProjectPermissionCan } from "@app/components/permissions"; @@ -15,6 +16,7 @@ type Props = { secretId?: string; isCreatable?: boolean; isVisible?: boolean; + isImportedSecret: boolean; environment: string; secretPath: string; onSecretCreate: (env: string, key: string, value: string) => Promise; @@ -25,6 +27,7 @@ type Props = { export const SecretEditRow = ({ defaultValue, isCreatable, + isImportedSecret, onSecretUpdate, secretName, onSecretCreate, @@ -90,14 +93,25 @@ export const SecretEditRow = ({
( - + )} />
-
+
{isDirty ? ( <> @@ -162,6 +162,12 @@ export const SecretOverviewTableRow = ({ const secret = getSecretByKey(slug, secretKey); const isCreatable = !secret; + const isImportedSecret = isImportedSecretPresentInEnv( + secretPath, + slug, + secretKey + ); + return (