From 4aeb6b7c9b5879bada2c12b476420fb06c6393ad Mon Sep 17 00:00:00 2001 From: sean-brydon <55134778+sean-brydon@users.noreply.github.com> Date: Wed, 17 Apr 2024 10:38:12 +0100 Subject: [PATCH] fix: Hide org tab when you are team admin (#14627) * fix: hide-tab-on-fe * fix: backend pulling back info if the user dont have perms --- .../components/MemberInvitationModal.tsx | 23 ++++++++++++++----- .../organizations/getMembers.handler.ts | 5 ++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/packages/features/ee/teams/components/MemberInvitationModal.tsx b/packages/features/ee/teams/components/MemberInvitationModal.tsx index 6c5391298b..1af54a09f8 100644 --- a/packages/features/ee/teams/components/MemberInvitationModal.tsx +++ b/packages/features/ee/teams/components/MemberInvitationModal.tsx @@ -74,10 +74,21 @@ export default function MemberInvitationModal(props: MemberInvitationModalProps) const { data: currentOrg } = trpc.viewer.organizations.listCurrent.useQuery(undefined, { enabled: !!session.data?.user?.org, }); - const isOrgOwner = currentOrg && currentOrg.user.role === MembershipRole.OWNER; + + // Check current org role and not team role + const isOrgAdminOrOwner = + currentOrg && + (currentOrg.user.role === MembershipRole.OWNER || currentOrg.user.role === MembershipRole.ADMIN); + + const canSeeOrganization = !!( + props?.orgMembers && + props.orgMembers?.length > 0 && + currentOrg?.isPrivate && + isOrgAdminOrOwner + ); const [modalImportMode, setModalInputMode] = useState( - props?.orgMembers && props.orgMembers?.length > 0 ? "ORGANIZATION" : "INDIVIDUAL" + canSeeOrganization ? "ORGANIZATION" : "INDIVIDUAL" ); const createInviteMutation = trpc.viewer.teams.createInvite.useMutation({ @@ -98,12 +109,12 @@ export default function MemberInvitationModal(props: MemberInvitationModalProps) ]; // Adjust options for organizations where the user isn't the owner - if (isOrg && !isOrgOwner) { + if (isOrg && !isOrgAdminOrOwner) { return options.filter((option) => option.value !== MembershipRole.OWNER); } return options; - }, [t, isOrgOwner, isOrg]); + }, [t, isOrgAdminOrOwner, isOrg]); const toggleGroupOptions = useMemo(() => { const array = [ @@ -114,7 +125,7 @@ export default function MemberInvitationModal(props: MemberInvitationModalProps) }, { value: "BULK", label: t("invite_team_bulk_segment"), iconLeft: }, ]; - if (props?.orgMembers && props.orgMembers?.length > 0) { + if (canSeeOrganization) { array.unshift({ value: "ORGANIZATION", label: t("organization"), @@ -122,7 +133,7 @@ export default function MemberInvitationModal(props: MemberInvitationModalProps) }); } return array; - }, [t, props.orgMembers]); + }, [t, canSeeOrganization]); const newMemberFormMethods = useForm(); diff --git a/packages/trpc/server/routers/viewer/organizations/getMembers.handler.ts b/packages/trpc/server/routers/viewer/organizations/getMembers.handler.ts index 2a29b001d0..30390d3bec 100644 --- a/packages/trpc/server/routers/viewer/organizations/getMembers.handler.ts +++ b/packages/trpc/server/routers/viewer/organizations/getMembers.handler.ts @@ -15,6 +15,11 @@ export const getMembersHandler = async ({ input, ctx }: CreateOptions) => { if (!ctx.user.organizationId) return []; + const isOrgPrivate = ctx.user.organization.isPrivate; + const isOrgAdmin = ctx.user.organization.isOrgAdmin; + + if (isOrgPrivate && !isOrgAdmin) return []; + const teamQuery = await prisma.team.findUnique({ where: { id: ctx.user.organizationId,