diff --git a/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserAuditLogsSection.tsx b/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserAuditLogsSection.tsx index 16540a8cf..1736e8333 100644 --- a/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserAuditLogsSection.tsx +++ b/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserAuditLogsSection.tsx @@ -1,9 +1,10 @@ import { useState } from "react"; +import Link from "next/link"; import { faFilter } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { IconButton, Tooltip } from "@app/components/v2"; -import { OrgPermissionActions, OrgPermissionSubjects } from "@app/context"; +import { EmptyState, IconButton, Tooltip } from "@app/components/v2"; +import { OrgPermissionActions, OrgPermissionSubjects, useSubscription } from "@app/context"; import { withPermission } from "@app/hoc"; import { OrgUser } from "@app/hooks/api/types"; import { LogsSection } from "@app/views/Project/AuditLogsPage/components"; @@ -15,8 +16,10 @@ type Props = { export const UserAuditLogsSection = withPermission( ({ orgMembership }: Props) => { const [showFilter, setShowFilter] = useState(false); + const { subscription, isLoading } = useSubscription(); - return ( + // eslint-disable-next-line no-nested-ternary + return subscription?.auditLogs ? (

Audit Logs

@@ -43,7 +46,39 @@ export const UserAuditLogsSection = withPermission( isOrgAuditLogs />
- ); + ) : !isLoading ? ( +
+
+

Audit Logs

+
+ +

+ Please{" "} + + + upgrade your subscription + + {" "} + to view audit logs. +

+
+ } + /> +
+ ) : null; }, { action: OrgPermissionActions.Read, subject: OrgPermissionSubjects.Member } ); diff --git a/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupProjectsModal.tsx b/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupProjectsModal.tsx deleted file mode 100644 index f0d021292..000000000 --- a/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupProjectsModal.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { useMemo, useState } from "react"; -import Link from "next/link"; -import { faFolder, faMagnifyingGlass } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; - -import { - EmptyState, - Input, - Modal, - ModalContent, - Table, - TableContainer, - TBody, - Td, - Th, - THead, - Tooltip, - Tr -} from "@app/components/v2"; -import { TGroupWithProjectMemberships } from "@app/hooks/api/groups/types"; -import { UsePopUpState } from "@app/hooks/usePopUp"; - -export type UserGroupsProjectsModalData = { - group: TGroupWithProjectMemberships; - groupSlug: string; - username: string; -}; - -export const UserGroupsProjectsModal = ({ - popUp, - handlePopUpToggle -}: { - popUp: UsePopUpState<["userGroupsProjects"]>; - handlePopUpToggle: ( - popUpName: keyof UsePopUpState<["userGroupsProjects"]>, - state?: boolean - ) => void; -}) => { - const popupData = popUp.userGroupsProjects.data as UserGroupsProjectsModalData; - - const [filteredProjectName, setFilteredProjectName] = useState(""); - - const filteredMemberships = useMemo(() => { - if (!popupData?.group) return []; - - return popupData.group.projectMemberships.filter(({ project }) => { - return project.name.toLowerCase().includes(filteredProjectName.toLowerCase()); - }); - }, [filteredProjectName, popupData?.group?.projectMemberships]); - - return ( - { - handlePopUpToggle("userGroupsProjects", open); - }} - > - - setFilteredProjectName(e.target.value)} - leftIcon={} - placeholder="Search projects..." - /> - - - - - - - - - - {filteredMemberships?.map(({ project, roles }) => { - return ( - - - - - ); - })} - -
ProjectRoles
- -

- {project.name} -

- -
- role.role.charAt(0).toUpperCase() + role.role.slice(1)) - .join(", ")} - > -

- {roles.length === 1 - ? roles[0].role - : `${roles[0].role} (+${roles.length - 1} more)`} -

-
-
- {!filteredMemberships.length && } -
-
-
- ); -}; diff --git a/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupsRow.tsx b/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupsRow.tsx index d3de7919a..712f8f0be 100644 --- a/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupsRow.tsx +++ b/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupsRow.tsx @@ -4,39 +4,21 @@ import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { IconButton, Td, Tooltip, Tr } from "@app/components/v2"; import { TGroupWithProjectMemberships } from "@app/hooks/api/groups/types"; -import { OrgUser } from "@app/hooks/api/types"; import { UsePopUpState } from "@app/hooks/usePopUp"; -import { UserGroupsProjectsModalData } from "./UserGroupProjectsModal"; - type Props = { group: TGroupWithProjectMemberships; - orgMembership: OrgUser; - handlePopUpOpen: ( - popUpName: keyof UsePopUpState<["removeUserFromGroup", "userGroupsProjects"]>, - data?: {} - ) => void; + handlePopUpOpen: (popUpName: keyof UsePopUpState<["removeUserFromGroup"]>, data?: {}) => void; }; -export const UserGroupsRow = ({ group, orgMembership, handlePopUpOpen }: Props) => { +export const UserGroupsRow = ({ group, handlePopUpOpen }: Props) => { return ( <> { - handlePopUpOpen("userGroupsProjects", { - groupSlug: group.slug, - username: orgMembership.user.username, - group - } as UserGroupsProjectsModalData); - }} > {group.name} - - {group.projectMemberships.length} Project - {group.projectMemberships.length > 1 || group.projectMemberships.length === 0 ? "s" : ""} - {true && (
diff --git a/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupsSection.tsx b/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupsSection.tsx index ace999286..41340aec4 100644 --- a/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupsSection.tsx +++ b/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupsSection.tsx @@ -6,7 +6,6 @@ import { useRemoveUserFromGroup } from "@app/hooks/api"; import { OrgUser } from "@app/hooks/api/users/types"; import { usePopUp } from "@app/hooks/usePopUp"; -import { UserGroupsProjectsModal } from "./UserGroupProjectsModal"; import { UserGroupsTable } from "./UserGroupsTable"; type Props = { @@ -15,8 +14,7 @@ type Props = { export const UserGroupsSection = ({ orgMembership }: Props) => { const { popUp, handlePopUpOpen, handlePopUpClose, handlePopUpToggle } = usePopUp([ - "removeUserFromGroup", - "userGroupsProjects" + "removeUserFromGroup" ] as const); const { mutateAsync: removeUserFromGroup } = useRemoveUserFromGroup(); @@ -65,8 +63,6 @@ export const UserGroupsSection = ({ orgMembership }: Props) => { return handleRemoveUserFromGroup(popupData.groupSlug); }} /> - - ); }; diff --git a/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupsTable.tsx b/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupsTable.tsx index 7cf1ff225..15299da26 100644 --- a/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupsTable.tsx +++ b/frontend/src/views/Org/UserPage/components/UserProjectsSection/UserGroupsTable.tsx @@ -9,10 +9,7 @@ import { UserGroupsRow } from "./UserGroupsRow"; type Props = { orgMembership: OrgUser; - handlePopUpOpen: ( - popUpName: keyof UsePopUpState<["removeUserFromGroup", "userGroupsProjects"]>, - data?: {} - ) => void; + handlePopUpOpen: (popUpName: keyof UsePopUpState<["removeUserFromGroup"]>, data?: {}) => void; }; export const UserGroupsTable = ({ handlePopUpOpen, orgMembership }: Props) => { @@ -24,14 +21,12 @@ export const UserGroupsTable = ({ handlePopUpOpen, orgMembership }: Props) => { Name - Projects {groups?.map((group) => (