From eedc5f533eb8dadda3071f45dabc2ef15eb7096e Mon Sep 17 00:00:00 2001 From: x032205 Date: Thu, 7 Aug 2025 18:39:57 -0400 Subject: [PATCH 1/3] feat(org-admin): Remove organization admin console --- backend/src/server/routes/index.ts | 2 - .../services/org-admin/org-admin-service.ts | 28 --- frontend/src/hooks/api/orgAdmin/index.tsx | 1 - frontend/src/hooks/api/orgAdmin/queries.tsx | 30 ---- frontend/src/hooks/api/orgAdmin/types.ts | 6 - .../components/OrgSidebar/OrgSidebar.tsx | 13 -- .../organization/AdminPage/AdminPage.tsx | 39 ---- .../OrgAdminProjects/OrgAdminProjects.tsx | 169 ------------------ .../components/OrgAdminProjects/index.tsx | 1 - .../pages/organization/AdminPage/route.tsx | 16 -- .../components/AllProjectView.tsx | 56 +++++- frontend/src/routeTree.gen.ts | 30 ---- frontend/src/routes.ts | 1 - 13 files changed, 54 insertions(+), 338 deletions(-) delete mode 100644 frontend/src/hooks/api/orgAdmin/queries.tsx delete mode 100644 frontend/src/pages/organization/AdminPage/AdminPage.tsx delete mode 100644 frontend/src/pages/organization/AdminPage/components/OrgAdminProjects/OrgAdminProjects.tsx delete mode 100644 frontend/src/pages/organization/AdminPage/components/OrgAdminProjects/index.tsx delete mode 100644 frontend/src/pages/organization/AdminPage/route.tsx diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts index c4f0de34a..90e961c29 100644 --- a/backend/src/server/routes/index.ts +++ b/backend/src/server/routes/index.ts @@ -849,8 +849,6 @@ export const registerRoutes = async ( projectDAL, permissionService, projectUserMembershipRoleDAL, - projectBotDAL, - projectKeyDAL, projectMembershipDAL }); diff --git a/backend/src/services/org-admin/org-admin-service.ts b/backend/src/services/org-admin/org-admin-service.ts index 3dec0c7f8..23005e52b 100644 --- a/backend/src/services/org-admin/org-admin-service.ts +++ b/backend/src/services/org-admin/org-admin-service.ts @@ -6,8 +6,6 @@ import { TPermissionServiceFactory } from "@app/ee/services/permission/permissio import { BadRequestError, NotFoundError } from "@app/lib/errors"; import { TProjectDALFactory } from "../project/project-dal"; -import { TProjectBotDALFactory } from "../project-bot/project-bot-dal"; -import { TProjectKeyDALFactory } from "../project-key/project-key-dal"; import { TProjectMembershipDALFactory } from "../project-membership/project-membership-dal"; import { TProjectUserMembershipRoleDALFactory } from "../project-membership/project-user-membership-role-dal"; import { SmtpTemplates, TSmtpService } from "../smtp/smtp-service"; @@ -20,8 +18,6 @@ type TOrgAdminServiceFactoryDep = { TProjectMembershipDALFactory, "findOne" | "create" | "transaction" | "delete" | "findAllProjectMembers" >; - projectKeyDAL: Pick; - projectBotDAL: Pick; projectUserMembershipRoleDAL: Pick; smtpService: Pick; }; @@ -32,8 +28,6 @@ export const orgAdminServiceFactory = ({ permissionService, projectDAL, projectMembershipDAL, - projectKeyDAL, - projectBotDAL, projectUserMembershipRoleDAL, smtpService }: TOrgAdminServiceFactoryDep) => { @@ -119,28 +113,6 @@ export const orgAdminServiceFactory = ({ return { isExistingMember: true, membership: projectMembership }; } - // missing membership thus add admin back as admin to project - const ghostUser = await projectDAL.findProjectGhostUser(projectId); - if (!ghostUser) { - throw new NotFoundError({ - message: `Project owner of project with ID '${projectId}' not found` - }); - } - - const ghostUserLatestKey = await projectKeyDAL.findLatestProjectKey(ghostUser.id, projectId); - if (!ghostUserLatestKey) { - throw new NotFoundError({ - message: `Project owner's latest key of project with ID '${projectId}' not found` - }); - } - - const bot = await projectBotDAL.findOne({ projectId }); - if (!bot) { - throw new NotFoundError({ - message: `Project bot for project with ID '${projectId}' not found` - }); - } - const updatedMembership = await projectMembershipDAL.transaction(async (tx) => { const newProjectMembership = await projectMembershipDAL.create( { diff --git a/frontend/src/hooks/api/orgAdmin/index.tsx b/frontend/src/hooks/api/orgAdmin/index.tsx index 57eed413a..c0fead35c 100644 --- a/frontend/src/hooks/api/orgAdmin/index.tsx +++ b/frontend/src/hooks/api/orgAdmin/index.tsx @@ -1,2 +1 @@ export { useOrgAdminAccessProject } from "./mutation"; -export { useOrgAdminGetProjects } from "./queries"; diff --git a/frontend/src/hooks/api/orgAdmin/queries.tsx b/frontend/src/hooks/api/orgAdmin/queries.tsx deleted file mode 100644 index 2856de0a2..000000000 --- a/frontend/src/hooks/api/orgAdmin/queries.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { useQuery } from "@tanstack/react-query"; - -import { apiRequest } from "@app/config/request"; - -import { Workspace } from "../types"; -import { TOrgAdminGetProjectsDTO } from "./types"; - -export const orgAdminQueryKeys = { - getProjects: (filter: TOrgAdminGetProjectsDTO) => ["org-admin-projects", filter] as const -}; - -export const useOrgAdminGetProjects = ({ search, offset, limit = 50 }: TOrgAdminGetProjectsDTO) => { - return useQuery({ - queryKey: orgAdminQueryKeys.getProjects({ search, offset, limit }), - queryFn: async () => { - const { data } = await apiRequest.get<{ projects: Workspace[]; count: number }>( - "/api/v1/organization-admin/projects", - { - params: { - limit, - offset, - search - } - } - ); - - return data; - } - }); -}; diff --git a/frontend/src/hooks/api/orgAdmin/types.ts b/frontend/src/hooks/api/orgAdmin/types.ts index 87626a466..f8138615b 100644 --- a/frontend/src/hooks/api/orgAdmin/types.ts +++ b/frontend/src/hooks/api/orgAdmin/types.ts @@ -1,9 +1,3 @@ -export type TOrgAdminGetProjectsDTO = { - limit?: number; - offset?: number; - search?: string; -}; - export type TOrgAdminAccessProjectDTO = { projectId: string; }; diff --git a/frontend/src/layouts/OrganizationLayout/components/OrgSidebar/OrgSidebar.tsx b/frontend/src/layouts/OrganizationLayout/components/OrgSidebar/OrgSidebar.tsx index 7b2e5f154..4ab5051f8 100644 --- a/frontend/src/layouts/OrganizationLayout/components/OrgSidebar/OrgSidebar.tsx +++ b/frontend/src/layouts/OrganizationLayout/components/OrgSidebar/OrgSidebar.tsx @@ -7,7 +7,6 @@ import { faPlug, faShare, faTable, - faUserCog, faUsers, faUserTie } from "@fortawesome/free-solid-svg-icons"; @@ -181,18 +180,6 @@ export const OrgSidebar = ({ isHidden }: Props) => { Share Secret - - - - - } - > - Organization Admin - - {user.superAdmin && ( { - const { t } = useTranslation(); - const [activeTab, setActiveTab] = useState(TabSections.Projects); - return ( - <> - - {t("common.head-title", { title: t("settings.org.title") })} - -
-
- - setActiveTab(el as TabSections)}> - - Projects - - - - - -
-
- - ); -}; diff --git a/frontend/src/pages/organization/AdminPage/components/OrgAdminProjects/OrgAdminProjects.tsx b/frontend/src/pages/organization/AdminPage/components/OrgAdminProjects/OrgAdminProjects.tsx deleted file mode 100644 index 5a9cac8bb..000000000 --- a/frontend/src/pages/organization/AdminPage/components/OrgAdminProjects/OrgAdminProjects.tsx +++ /dev/null @@ -1,169 +0,0 @@ -import { useState } from "react"; -import { faEllipsis, faMagnifyingGlass, faSignIn } from "@fortawesome/free-solid-svg-icons"; -import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { useNavigate } from "@tanstack/react-router"; -import { format } from "date-fns"; -import { motion } from "framer-motion"; - -import { createNotification } from "@app/components/notifications"; -import { - Button, - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, - EmptyState, - Input, - Pagination, - Spinner, - Table, - TableContainer, - TableSkeleton, - TBody, - Td, - Th, - THead, - Tr -} from "@app/components/v2"; -import { - OrgPermissionAdminConsoleAction, - OrgPermissionSubjects -} from "@app/context/OrgPermissionContext/types"; -import { getProjectHomePage } from "@app/helpers/project"; -import { withPermission } from "@app/hoc"; -import { useDebounce } from "@app/hooks"; -import { useOrgAdminAccessProject, useOrgAdminGetProjects } from "@app/hooks/api"; -import { ProjectType } from "@app/hooks/api/workspace/types"; - -export const OrgAdminProjects = withPermission( - () => { - const [page, setPage] = useState(1); - const [search, setSearch] = useState(""); - const [debouncedSearch] = useDebounce(search); - const [perPage, setPerPage] = useState(25); - const navigate = useNavigate(); - const orgAdminAccessProject = useOrgAdminAccessProject(); - - const { data, isPending: isProjectsLoading } = useOrgAdminGetProjects({ - offset: (page - 1) * perPage, - limit: perPage, - search: debouncedSearch || undefined - }); - - const projects = data?.projects || []; - const projectCount = data?.count || 0; - const isEmpty = !isProjectsLoading && projects.length === 0; - - const handleAccessProject = async (type: ProjectType, projectId: string) => { - try { - await orgAdminAccessProject.mutateAsync({ - projectId - }); - await navigate({ - to: getProjectHomePage(type), - params: { - projectId - } - }); - } catch { - createNotification({ - text: "Failed to access project", - type: "error" - }); - } - }; - - return ( - -
-
-

Projects

-
-
- setSearch(e.target.value)} - leftIcon={} - placeholder="Search by project name" - /> - - - - - - - - - - - {isProjectsLoading && } - {!isProjectsLoading && - projects?.map(({ name, slug, createdAt, id, type }) => ( - - - - - - - ))} - -
NameSlugCreated At -
{name}{slug}{format(new Date(createdAt), "yyyy-MM-dd, hh:mm aaa")} -
- - - - - - { - e.stopPropagation(); - e.preventDefault(); - handleAccessProject(type, id); - }} - icon={} - disabled={ - orgAdminAccessProject.variables?.projectId === id && - orgAdminAccessProject.isPending - } - > - Access{" "} - {orgAdminAccessProject.variables?.projectId === id && - orgAdminAccessProject.isPending && } - - - -
-
- {!isProjectsLoading && ( - setPage(newPage)} - onChangePerPage={(newPerPage) => setPerPage(newPerPage)} - /> - )} - {isEmpty && } -
-
-
-
- ); - }, - { - action: OrgPermissionAdminConsoleAction.AccessAllProjects, - subject: OrgPermissionSubjects.AdminConsole - } -); diff --git a/frontend/src/pages/organization/AdminPage/components/OrgAdminProjects/index.tsx b/frontend/src/pages/organization/AdminPage/components/OrgAdminProjects/index.tsx deleted file mode 100644 index b331589a4..000000000 --- a/frontend/src/pages/organization/AdminPage/components/OrgAdminProjects/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { OrgAdminProjects } from "./OrgAdminProjects"; diff --git a/frontend/src/pages/organization/AdminPage/route.tsx b/frontend/src/pages/organization/AdminPage/route.tsx deleted file mode 100644 index 1ed4e370e..000000000 --- a/frontend/src/pages/organization/AdminPage/route.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { createFileRoute } from "@tanstack/react-router"; - -import { AdminPage } from "./AdminPage"; - -export const Route = createFileRoute( - "/_authenticate/_inject-org-details/_org-layout/organization/admin" -)({ - component: AdminPage, - context: () => ({ - breadcrumbs: [ - { - label: "Admin Console" - } - ] - }) -}); diff --git a/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx b/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx index 52d8e5368..a5e3533c0 100644 --- a/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx +++ b/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx @@ -35,6 +35,7 @@ import { Tooltip } from "@app/components/v2"; import { OrgPermissionActions, OrgPermissionSubjects } from "@app/context"; +import { OrgPermissionAdminConsoleAction } from "@app/context/OrgPermissionContext/types"; import { getProjectHomePage, getProjectLottieIcon, getProjectTitle } from "@app/helpers/project"; import { getUserTablePreference, @@ -42,7 +43,11 @@ import { setUserTablePreference } from "@app/helpers/userTablePreferences"; import { useDebounce, usePagination, usePopUp, useResetPageHelper } from "@app/hooks"; -import { useRequestProjectAccess, useSearchProjects } from "@app/hooks/api"; +import { + useOrgAdminAccessProject, + useRequestProjectAccess, + useSearchProjects +} from "@app/hooks/api"; import { ProjectType, Workspace } from "@app/hooks/api/workspace/types"; type Props = { @@ -120,6 +125,8 @@ export const AllProjectView = ({ initPerPage: getUserTablePreference("allProjectsTable", PreferenceKey.PerPage, 50) }); + const orgAdminAccessProject = useOrgAdminAccessProject(); + const handlePerPageChange = (newPerPage: number) => { setPerPage(newPerPage); setUserTablePreference("allProjectsTable", PreferenceKey.PerPage, newPerPage); @@ -137,6 +144,25 @@ export const AllProjectView = ({ type: projectTypeFilter }); + const handleAccessProject = async (type: ProjectType, projectId: string) => { + try { + await orgAdminAccessProject.mutateAsync({ + projectId + }); + await navigate({ + to: getProjectHomePage(type), + params: { + projectId + } + }); + } catch { + createNotification({ + text: "Failed to access project", + type: "error" + }); + } + }; + useResetPageHelper({ setPage, offset, @@ -325,7 +351,7 @@ export const AllProjectView = ({ Joined ) : ( -
+
+ + + {(isAllowed) => + isAllowed && ( + + ) + } +
)}
diff --git a/frontend/src/routeTree.gen.ts b/frontend/src/routeTree.gen.ts index 0bdf2202d..c2f1f78a9 100644 --- a/frontend/src/routeTree.gen.ts +++ b/frontend/src/routeTree.gen.ts @@ -50,7 +50,6 @@ import { Route as adminAuthenticationPageRouteImport } from './pages/admin/Authe import { Route as organizationProjectsPageRouteImport } from './pages/organization/ProjectsPage/route' import { Route as organizationBillingPageRouteImport } from './pages/organization/BillingPage/route' import { Route as organizationAuditLogsPageRouteImport } from './pages/organization/AuditLogsPage/route' -import { Route as organizationAdminPageRouteImport } from './pages/organization/AdminPage/route' import { Route as organizationAccessManagementPageRouteImport } from './pages/organization/AccessManagementPage/route' import { Route as adminGeneralPageRouteImport } from './pages/admin/GeneralPage/route' import { Route as secretManagerRedirectsRedirectApprovalPageImport } from './pages/secret-manager/redirects/redirect-approval-page' @@ -631,15 +630,6 @@ const organizationAuditLogsPageRouteRoute = AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, } as any) -const organizationAdminPageRouteRoute = organizationAdminPageRouteImport.update( - { - id: '/admin', - path: '/admin', - getParentRoute: () => - AuthenticateInjectOrgDetailsOrgLayoutOrganizationRoute, - } as any, -) - const organizationAccessManagementPageRouteRoute = organizationAccessManagementPageRouteImport.update({ id: '/access-management', @@ -2293,13 +2283,6 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof organizationAccessManagementPageRouteImport parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport } - '/_authenticate/_inject-org-details/_org-layout/organization/admin': { - id: '/_authenticate/_inject-org-details/_org-layout/organization/admin' - path: '/admin' - fullPath: '/organization/admin' - preLoaderRoute: typeof organizationAdminPageRouteImport - parentRoute: typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationImport - } '/_authenticate/_inject-org-details/_org-layout/organization/audit-logs': { id: '/_authenticate/_inject-org-details/_org-layout/organization/audit-logs' path: '/audit-logs' @@ -3758,7 +3741,6 @@ const AuthenticateInjectOrgDetailsOrgLayoutOrganizationSettingsRouteWithChildren interface AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteChildren { organizationAccessManagementPageRouteRoute: typeof organizationAccessManagementPageRouteRoute - organizationAdminPageRouteRoute: typeof organizationAdminPageRouteRoute organizationAuditLogsPageRouteRoute: typeof organizationAuditLogsPageRouteRoute organizationBillingPageRouteRoute: typeof organizationBillingPageRouteRoute organizationProjectsPageRouteRoute: typeof organizationProjectsPageRouteRoute @@ -3776,7 +3758,6 @@ const AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteChildren: Authentica { organizationAccessManagementPageRouteRoute: organizationAccessManagementPageRouteRoute, - organizationAdminPageRouteRoute: organizationAdminPageRouteRoute, organizationAuditLogsPageRouteRoute: organizationAuditLogsPageRouteRoute, organizationBillingPageRouteRoute: organizationBillingPageRouteRoute, organizationProjectsPageRouteRoute: organizationProjectsPageRouteRoute, @@ -4668,7 +4649,6 @@ export interface FileRoutesByFullPath { '/organization': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteWithChildren '/admin/': typeof adminGeneralPageRouteRoute '/organization/access-management': typeof organizationAccessManagementPageRouteRoute - '/organization/admin': typeof organizationAdminPageRouteRoute '/organization/audit-logs': typeof organizationAuditLogsPageRouteRoute '/organization/billing': typeof organizationBillingPageRouteRoute '/organization/projects': typeof organizationProjectsPageRouteRoute @@ -4887,7 +4867,6 @@ export interface FileRoutesByTo { '/integrations': typeof AuthenticateInjectOrgDetailsOrgLayoutIntegrationsRouteWithChildren '/organization': typeof AuthenticateInjectOrgDetailsOrgLayoutOrganizationRouteWithChildren '/organization/access-management': typeof organizationAccessManagementPageRouteRoute - '/organization/admin': typeof organizationAdminPageRouteRoute '/organization/audit-logs': typeof organizationAuditLogsPageRouteRoute '/organization/billing': typeof organizationBillingPageRouteRoute '/organization/projects': typeof organizationProjectsPageRouteRoute @@ -5106,7 +5085,6 @@ export interface FileRoutesById { '/_authenticate/_inject-org-details/admin/_admin-layout': typeof adminLayoutRouteWithChildren '/_authenticate/_inject-org-details/admin/_admin-layout/': typeof adminGeneralPageRouteRoute '/_authenticate/_inject-org-details/_org-layout/organization/access-management': typeof organizationAccessManagementPageRouteRoute - '/_authenticate/_inject-org-details/_org-layout/organization/admin': typeof organizationAdminPageRouteRoute '/_authenticate/_inject-org-details/_org-layout/organization/audit-logs': typeof organizationAuditLogsPageRouteRoute '/_authenticate/_inject-org-details/_org-layout/organization/billing': typeof organizationBillingPageRouteRoute '/_authenticate/_inject-org-details/_org-layout/organization/projects': typeof organizationProjectsPageRouteRoute @@ -5336,7 +5314,6 @@ export interface FileRouteTypes { | '/organization' | '/admin/' | '/organization/access-management' - | '/organization/admin' | '/organization/audit-logs' | '/organization/billing' | '/organization/projects' @@ -5554,7 +5531,6 @@ export interface FileRouteTypes { | '/integrations' | '/organization' | '/organization/access-management' - | '/organization/admin' | '/organization/audit-logs' | '/organization/billing' | '/organization/projects' @@ -5771,7 +5747,6 @@ export interface FileRouteTypes { | '/_authenticate/_inject-org-details/admin/_admin-layout' | '/_authenticate/_inject-org-details/admin/_admin-layout/' | '/_authenticate/_inject-org-details/_org-layout/organization/access-management' - | '/_authenticate/_inject-org-details/_org-layout/organization/admin' | '/_authenticate/_inject-org-details/_org-layout/organization/audit-logs' | '/_authenticate/_inject-org-details/_org-layout/organization/billing' | '/_authenticate/_inject-org-details/_org-layout/organization/projects' @@ -6202,7 +6177,6 @@ export const routeTree = rootRoute "parent": "/_authenticate/_inject-org-details/_org-layout", "children": [ "/_authenticate/_inject-org-details/_org-layout/organization/access-management", - "/_authenticate/_inject-org-details/_org-layout/organization/admin", "/_authenticate/_inject-org-details/_org-layout/organization/audit-logs", "/_authenticate/_inject-org-details/_org-layout/organization/billing", "/_authenticate/_inject-org-details/_org-layout/organization/projects", @@ -6239,10 +6213,6 @@ export const routeTree = rootRoute "filePath": "organization/AccessManagementPage/route.tsx", "parent": "/_authenticate/_inject-org-details/_org-layout/organization" }, - "/_authenticate/_inject-org-details/_org-layout/organization/admin": { - "filePath": "organization/AdminPage/route.tsx", - "parent": "/_authenticate/_inject-org-details/_org-layout/organization" - }, "/_authenticate/_inject-org-details/_org-layout/organization/audit-logs": { "filePath": "organization/AuditLogsPage/route.tsx", "parent": "/_authenticate/_inject-org-details/_org-layout/organization" diff --git a/frontend/src/routes.ts b/frontend/src/routes.ts index 2e63be383..cca823f21 100644 --- a/frontend/src/routes.ts +++ b/frontend/src/routes.ts @@ -20,7 +20,6 @@ const adminRoute = route("/admin", [ const organizationRoutes = route("/organization", [ route("/projects", "organization/ProjectsPage/route.tsx"), route("/access-management", "organization/AccessManagementPage/route.tsx"), - route("/admin", "organization/AdminPage/route.tsx"), route("/audit-logs", "organization/AuditLogsPage/route.tsx"), route("/billing", "organization/BillingPage/route.tsx"), route("/secret-sharing", [ From 902a0b0c5634abaf7484011a59d427be0898c5bb Mon Sep 17 00:00:00 2001 From: x032205 Date: Fri, 8 Aug 2025 00:58:57 -0400 Subject: [PATCH 2/3] Improve style --- .../components/AllProjectView.tsx | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx b/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx index a5e3533c0..d4b44902f 100644 --- a/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx +++ b/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx @@ -351,25 +351,16 @@ export const AllProjectView = ({ Joined ) : ( -
- - +
{(isAllowed) => - isAllowed && ( + isAllowed ? ( + ) : ( + ) } From d5d67c82b20f1bb8cb7cd41d344531d4d23a3d59 Mon Sep 17 00:00:00 2001 From: x032205 Date: Fri, 8 Aug 2025 13:38:15 -0400 Subject: [PATCH 3/3] Make button always show and swap to "Join as Admin" --- .../components/AllProjectView.tsx | 66 +++++++++---------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx b/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx index d4b44902f..6b1edaf1f 100644 --- a/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx +++ b/frontend/src/pages/organization/ProjectsPage/components/AllProjectView.tsx @@ -351,40 +351,38 @@ export const AllProjectView = ({ Joined ) : ( -
- - {(isAllowed) => - isAllowed ? ( - - ) : ( - - ) - } - -
+ + {(isAllowed) => + isAllowed ? ( + + ) : ( + + ) + } + )}
))}