diff --git a/frontend/src/main-page/MainPage.tsx b/frontend/src/main-page/MainPage.tsx index 424deca..9d57c19 100644 --- a/frontend/src/main-page/MainPage.tsx +++ b/frontend/src/main-page/MainPage.tsx @@ -4,6 +4,7 @@ import GrantPage from "./grants/GrantPage"; import Header from "./header/Header"; import Users from "./users/Users"; + function MainPage() { @@ -12,7 +13,8 @@ function MainPage() { } /> - } /> + } /> + } /> } /> {/* fallback route */} } /> diff --git a/frontend/src/main-page/grants/GrantPage.tsx b/frontend/src/main-page/grants/GrantPage.tsx index c443193..962042e 100644 --- a/frontend/src/main-page/grants/GrantPage.tsx +++ b/frontend/src/main-page/grants/GrantPage.tsx @@ -7,12 +7,24 @@ import NewGrantModal from "./new-grant/NewGrantModal.tsx"; import { useEffect, useState } from "react"; import { Grant } from "../../../../middle-layer/types/Grant.ts"; import FilterBar from "./filter-bar/FilterBar.tsx"; +import { useAuthContext } from "../../context/auth/authContext"; import { updateEndDateFilter, updateFilter, updateStartDateFilter, updateYearFilter } from "../../external/bcanSatchel/actions.ts"; -function GrantPage() { + +interface GrantPageProps { + showOnlyMyGrants?: boolean; //if true, filters grants by user email +} + + +function GrantPage({ showOnlyMyGrants = false }: GrantPageProps) { const [showNewGrantModal, setShowNewGrantModal] = useState(false); const [selectedGrant, setSelectedGrant] = useState(null); + const { user } = useAuthContext(); //gets current logged in user + + const currentUserEmail = user?.email || ""; //safe fallback + + console.log("Current logged-in user:", user); // reset filters on initial render useEffect(() => { updateYearFilter(null); @@ -40,6 +52,8 @@ function GrantPage() { selectedGrant ? selectedGrant.grantId : undefined } onClearSelectedGrant={() => setSelectedGrant(null)} + currentUserEmail={currentUserEmail} + showOnlyMyGrants={showOnlyMyGrants} /> diff --git a/frontend/src/main-page/grants/grant-list/MyGrantList.tsx b/frontend/src/main-page/grants/grant-list/MyGrantList.tsx new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/main-page/grants/grant-list/index.tsx b/frontend/src/main-page/grants/grant-list/index.tsx index d504146..9cd4e03 100644 --- a/frontend/src/main-page/grants/grant-list/index.tsx +++ b/frontend/src/main-page/grants/grant-list/index.tsx @@ -7,106 +7,109 @@ import { ButtonGroup, IconButton, Pagination } from "@chakra-ui/react"; import { HiChevronLeft, HiChevronRight } from "react-icons/hi"; import { ProcessGrantData } from "../filter-bar/processGrantData.ts"; import NewGrantModal from "../new-grant/NewGrantModal.tsx"; +import { Grant } from "../../../../../middle-layer/types/Grant.ts"; const ITEMS_PER_PAGE = 6; interface GrantListProps { - selectedGrantId?: number; - onClearSelectedGrant?: () => void; + selectedGrantId?: number; + onClearSelectedGrant?: () => void; + showOnlyMyGrants?: boolean; + currentUserEmail?: string; } -const GrantList: React.FC = observer( - ({ selectedGrantId, onClearSelectedGrant }) => { +const GrantList: React.FC = observer(({ selectedGrantId, onClearSelectedGrant, showOnlyMyGrants = false, currentUserEmail }) => { const { grants, onSort } = ProcessGrantData(); const [currentPage, setPage] = useState(1); const [showNewGrantModal, setShowNewGrantModal] = useState(false); - useEffect(() => { - if (selectedGrantId !== undefined && grants.length > 0) { - const index = grants.findIndex( - (grant) => grant.grantId === Number(selectedGrantId) - ); - if (index !== -1) { - const targetPage = Math.floor(index / ITEMS_PER_PAGE) + 1; - if (targetPage !== currentPage) { - setPage(targetPage); - } - } - } - }, [selectedGrantId, grants, currentPage]); + const displayedGrants = showOnlyMyGrants ? grants.filter( + (grant: Grant) => grant.bcan_poc?.POC_email?.toLowerCase() === currentUserEmail?.toLowerCase() + ) + : grants; - const count = grants.length; + useEffect(() => { + if (selectedGrantId !== undefined && grants.length > 0) { + const index = grants.findIndex(grant => grant.grantId === Number(selectedGrantId)); + if (index !== -1) { + const targetPage = Math.floor(index / ITEMS_PER_PAGE) + 1; + if (targetPage !== currentPage) { + setPage(targetPage); + } + } + } + }, [selectedGrantId, grants, currentPage]); + + const count = displayedGrants.length; const startRange = (currentPage - 1) * ITEMS_PER_PAGE; const endRange = startRange + ITEMS_PER_PAGE; - const visibleItems = grants.slice(startRange, endRange); + const visibleItems = displayedGrants.slice(startRange, endRange); return ( - - - - - {visibleItems.map((grant) => ( - - ))} - + + + + + {visibleItems.map((grant) => ( + + ))} + {visibleItems.length === 0 && ( + + {showOnlyMyGrants + ? "You currently have no grants assigned as BCAN POC." + : "No grants found>"} + + )} + + + { + if (onClearSelectedGrant) { onClearSelectedGrant();}}} + onPageChange={(e) => { + setPage(e.page);}} + > + + + + + + + + {({ pages }) => + pages.map((page, index) => + page.type === "page" ? ( + setPage(page.value)} + aria-label={`Go to page ${page.value}`} + > + {page.value} + + ) : ( + "..." + ) + ) + } + + + + + + + + + {showNewGrantModal && ( + setShowNewGrantModal(false)} /> + )} - { - if (onClearSelectedGrant) { - onClearSelectedGrant(); - } - }} - onPageChange={(e) => { - setPage(e.page); - }} - > - - - - - - - - {({ pages }) => - pages.map((page, index) => - page.type === "page" ? ( - setPage(page.value)} - aria-label={`Go to page ${page.value}`} - > - {page.value} - - ) : ( - "..." - ) - ) - } - - - - - - - - - {showNewGrantModal && ( - setShowNewGrantModal(false)} /> - )} - + ); } );
+ {showOnlyMyGrants + ? "You currently have no grants assigned as BCAN POC." + : "No grants found>"} +