From 8578208f2d8a69f26ac4b914a0025a17d4226b5f Mon Sep 17 00:00:00 2001 From: Scott Wilson Date: Sat, 14 Sep 2024 06:50:45 -0700 Subject: [PATCH 1/5] fix: hide environments that users does not have read access too --- .../IdentitySection/IdentityTable.tsx | 2 +- .../components/IdentityTab/IdentityTab.tsx | 2 +- .../views/SecretMainPage/SecretMainPage.tsx | 2 +- .../SecretOverviewPage/SecretOverviewPage.tsx | 26 ++++++++++++++++--- .../SecretOverviewTableRow.tsx | 13 ++++++---- 5 files changed, 34 insertions(+), 11 deletions(-) diff --git a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx index 8b55fab23..4c2671c9a 100644 --- a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx +++ b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx @@ -50,7 +50,7 @@ type Props = { ) => void; }; -const INIT_PER_PAGE = 10; +const INIT_PER_PAGE = 50; export const IdentityTable = ({ handlePopUpOpen }: Props) => { const router = useRouter(); diff --git a/frontend/src/views/Project/MembersPage/components/IdentityTab/IdentityTab.tsx b/frontend/src/views/Project/MembersPage/components/IdentityTab/IdentityTab.tsx index 500a1926a..4f120c649 100644 --- a/frontend/src/views/Project/MembersPage/components/IdentityTab/IdentityTab.tsx +++ b/frontend/src/views/Project/MembersPage/components/IdentityTab/IdentityTab.tsx @@ -56,7 +56,7 @@ import { IdentityModal } from "./components/IdentityModal"; import { IdentityRoleForm } from "./components/IdentityRoleForm"; const MAX_ROLES_TO_BE_SHOWN_IN_TABLE = 2; -const INIT_PER_PAGE = 10; +const INIT_PER_PAGE = 50; const formatRoleName = (role: string, customRoleName?: string) => { if (role === ProjectMembershipRole.Custom) return customRoleName; if (role === ProjectMembershipRole.Member) return "Developer"; diff --git a/frontend/src/views/SecretMainPage/SecretMainPage.tsx b/frontend/src/views/SecretMainPage/SecretMainPage.tsx index 9b3a04acc..bc4fb57bb 100644 --- a/frontend/src/views/SecretMainPage/SecretMainPage.tsx +++ b/frontend/src/views/SecretMainPage/SecretMainPage.tsx @@ -47,7 +47,7 @@ const LOADER_TEXT = [ "Getting secret import links..." ]; -const INIT_PER_PAGE = 10; +const INIT_PER_PAGE = 50; export const SecretMainPage = () => { const { t } = useTranslation(); const { currentWorkspace, isLoading: isWorkspaceLoading } = useWorkspace(); diff --git a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx index 44302467b..048848b68 100644 --- a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx +++ b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx @@ -85,7 +85,7 @@ enum RowType { Secret = "Secret" } -const INIT_PER_PAGE = 10; +const INIT_PER_PAGE = 50; export const SecretOverviewPage = () => { const { t } = useTranslation(); @@ -173,10 +173,30 @@ export const SecretOverviewPage = () => { }, [isWorkspaceLoading, workspaceId, router.isReady]); const userAvailableEnvs = currentWorkspace?.environments || []; - const [visibleEnvs, setVisibleEnvs] = useState(userAvailableEnvs); + const [visibleEnvs, setVisibleEnvs] = useState( + userAvailableEnvs?.filter(({ slug }) => + permission.can( + ProjectPermissionActions.Read, + subject(ProjectPermissionSub.Secrets, { + environment: slug, + secretPath + }) + ) + ) + ); useEffect(() => { - setVisibleEnvs(userAvailableEnvs); + setVisibleEnvs( + userAvailableEnvs?.filter(({ slug }) => + permission.can( + ProjectPermissionActions.Read, + subject(ProjectPermissionSub.Secrets, { + environment: slug, + secretPath + }) + ) + ) + ); }, [userAvailableEnvs]); const { diff --git a/frontend/src/views/SecretOverviewPage/components/SecretOverviewTableRow/SecretOverviewTableRow.tsx b/frontend/src/views/SecretOverviewPage/components/SecretOverviewTableRow/SecretOverviewTableRow.tsx index 6c6dc9662..287269838 100644 --- a/frontend/src/views/SecretOverviewPage/components/SecretOverviewTableRow/SecretOverviewTableRow.tsx +++ b/frontend/src/views/SecretOverviewPage/components/SecretOverviewTableRow/SecretOverviewTableRow.tsx @@ -13,7 +13,7 @@ import { twMerge } from "tailwind-merge"; import { Button, Checkbox, TableContainer, Td, Tooltip, Tr } from "@app/components/v2"; import { useToggle } from "@app/hooks"; -import { SecretType,SecretV3RawSanitized } from "@app/hooks/api/secrets/types"; +import { SecretType, SecretV3RawSanitized } from "@app/hooks/api/secrets/types"; import { WorkspaceEnv } from "@app/hooks/api/types"; import { SecretEditRow } from "./SecretEditRow"; @@ -53,6 +53,8 @@ export const SecretOverviewTableRow = ({ onSecretDelete, isImportedSecretPresentInEnv, getImportedSecretByKey, + // temporary until below todo is resolved + // eslint-disable-next-line @typescript-eslint/no-unused-vars expandableColWidth, onToggleSecretSelect, isSelected @@ -150,10 +152,11 @@ export const SecretOverviewTableRow = ({ }`} >
Date: Sat, 14 Sep 2024 07:01:02 -0700 Subject: [PATCH 2/5] include secret path in dependency array --- frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx index 048848b68..d119c1bc3 100644 --- a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx +++ b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx @@ -197,7 +197,7 @@ export const SecretOverviewPage = () => { ) ) ); - }, [userAvailableEnvs]); + }, [userAvailableEnvs, secretPath]); const { data: secrets, From ea480c222bcf177ea8cf2579ad7b946771f9cd84 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Sat, 14 Sep 2024 23:26:30 -0400 Subject: [PATCH 3/5] update default to 20 per page --- .../OrgIdentityTab/components/IdentitySection/IdentityTable.tsx | 2 +- .../Project/MembersPage/components/IdentityTab/IdentityTab.tsx | 2 +- frontend/src/views/SecretMainPage/SecretMainPage.tsx | 2 +- frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx index 4c2671c9a..a6e52f7c1 100644 --- a/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx +++ b/frontend/src/views/Org/MembersPage/components/OrgIdentityTab/components/IdentitySection/IdentityTable.tsx @@ -50,7 +50,7 @@ type Props = { ) => void; }; -const INIT_PER_PAGE = 50; +const INIT_PER_PAGE = 20; export const IdentityTable = ({ handlePopUpOpen }: Props) => { const router = useRouter(); diff --git a/frontend/src/views/Project/MembersPage/components/IdentityTab/IdentityTab.tsx b/frontend/src/views/Project/MembersPage/components/IdentityTab/IdentityTab.tsx index 4f120c649..96e1eee99 100644 --- a/frontend/src/views/Project/MembersPage/components/IdentityTab/IdentityTab.tsx +++ b/frontend/src/views/Project/MembersPage/components/IdentityTab/IdentityTab.tsx @@ -56,7 +56,7 @@ import { IdentityModal } from "./components/IdentityModal"; import { IdentityRoleForm } from "./components/IdentityRoleForm"; const MAX_ROLES_TO_BE_SHOWN_IN_TABLE = 2; -const INIT_PER_PAGE = 50; +const INIT_PER_PAGE = 20; const formatRoleName = (role: string, customRoleName?: string) => { if (role === ProjectMembershipRole.Custom) return customRoleName; if (role === ProjectMembershipRole.Member) return "Developer"; diff --git a/frontend/src/views/SecretMainPage/SecretMainPage.tsx b/frontend/src/views/SecretMainPage/SecretMainPage.tsx index bc4fb57bb..c4ee5e4e5 100644 --- a/frontend/src/views/SecretMainPage/SecretMainPage.tsx +++ b/frontend/src/views/SecretMainPage/SecretMainPage.tsx @@ -47,7 +47,7 @@ const LOADER_TEXT = [ "Getting secret import links..." ]; -const INIT_PER_PAGE = 50; +const INIT_PER_PAGE = 20; export const SecretMainPage = () => { const { t } = useTranslation(); const { currentWorkspace, isLoading: isWorkspaceLoading } = useWorkspace(); diff --git a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx index d119c1bc3..7c5aefc0a 100644 --- a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx +++ b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx @@ -85,7 +85,7 @@ enum RowType { Secret = "Secret" } -const INIT_PER_PAGE = 50; +const INIT_PER_PAGE = 20; export const SecretOverviewPage = () => { const { t } = useTranslation(); From e12ac6c07e3bae117e99f0df4329a3526729e7c2 Mon Sep 17 00:00:00 2001 From: Scott Wilson Date: Sun, 15 Sep 2024 12:29:24 -0700 Subject: [PATCH 4/5] fix: hide envs without read permission in the env filter dropdown --- .../SecretOverviewPage/SecretOverviewPage.tsx | 50 +++++++++++-------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx index 7c5aefc0a..97101b21a 100644 --- a/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx +++ b/frontend/src/views/SecretOverviewPage/SecretOverviewPage.tsx @@ -600,27 +600,37 @@ export const SecretOverviewPage = () => { Choose visible environments - {userAvailableEnvs.map((availableEnv) => { - const { id: envId, name } = availableEnv; + {userAvailableEnvs + .filter(({ slug }) => + permission.can( + ProjectPermissionActions.Read, + subject(ProjectPermissionSub.Secrets, { + environment: slug, + secretPath + }) + ) + ) + .map((availableEnv) => { + const { id: envId, name } = availableEnv; - const isEnvSelected = visibleEnvs.map((env) => env.id).includes(envId); - return ( - handleEnvSelect(envId)} - key={envId} - icon={ - isEnvSelected ? ( - - ) : ( - - ) - } - iconPos="left" - > -
{name}
-
- ); - })} + const isEnvSelected = visibleEnvs.map((env) => env.id).includes(envId); + return ( + handleEnvSelect(envId)} + key={envId} + icon={ + isEnvSelected ? ( + + ) : ( + + ) + } + iconPos="left" + > +
{name}
+
+ ); + })} {/*