From 04787495a3cc6c4c3f1553bf346abc3b5439ce67 Mon Sep 17 00:00:00 2001 From: prooflesben Date: Sun, 19 Oct 2025 15:58:54 -0400 Subject: [PATCH 1/5] updates --- .../main-page/dashboard/CsvExportButton.tsx | 4 +- .../grants/filter-bar/GrantSearch.tsx | 101 +++++++++--------- .../grants/new-grant/NewGrantModal.tsx | 24 ++++- .../main-page/grants/styles/NewGrantModal.css | 5 +- 4 files changed, 79 insertions(+), 55 deletions(-) diff --git a/frontend/src/main-page/dashboard/CsvExportButton.tsx b/frontend/src/main-page/dashboard/CsvExportButton.tsx index cb8d0b2..650883d 100644 --- a/frontend/src/main-page/dashboard/CsvExportButton.tsx +++ b/frontend/src/main-page/dashboard/CsvExportButton.tsx @@ -1,7 +1,7 @@ import { useState } from "react"; import { downloadCsv, CsvColumn } from "../../utils/csvUtils"; import { Grant } from "../../../../middle-layer/types/Grant"; -import { useProcessGrantData } from "../../main-page/grants/filter-bar/processGrantData"; +import { ProcessGrantData } from "../../main-page/grants/filter-bar/processGrantData"; import { observer } from "mobx-react-lite"; import "../grants/styles/GrantButton.css"; import { getAppStore } from "../../external/bcanSatchel/store"; @@ -77,7 +77,7 @@ const columns: CsvColumn[] = [ const CsvExportButton: React.FC = observer(() => { const { yearFilter } = getAppStore(); const [isProcessing, setIsProcessing] = useState(false); - const { grants } = useProcessGrantData(); + const { grants } = ProcessGrantData(); const onClickDownload = async () => { setIsProcessing(true); diff --git a/frontend/src/main-page/grants/filter-bar/GrantSearch.tsx b/frontend/src/main-page/grants/filter-bar/GrantSearch.tsx index 5bd6300..75cbf0e 100644 --- a/frontend/src/main-page/grants/filter-bar/GrantSearch.tsx +++ b/frontend/src/main-page/grants/filter-bar/GrantSearch.tsx @@ -1,39 +1,41 @@ import { IoIosSearch } from "react-icons/io"; -import { useEffect, useState } from "react"; +import { + // useEffect, + useState } from "react"; import Fuse from "fuse.js"; import { updateSearchQuery } from "../../../external/bcanSatchel/actions"; import { Grant } from "../../../../../middle-layer/types/Grant"; -import { api } from "../../../api"; +// import { api } from "../../../api"; import { Input } from "@chakra-ui/react"; -function GrantSearch({ onGrantSelect }: any) { +function GrantSearch() { const [userInput, setUserInput] = useState(""); const [grants, setGrants] = useState([]); - const [showDropdown, setShowDropdown] = useState(false); - const [dropdownGrants, setDropdownGrants] = useState([]); + // const [showDropdown, setShowDropdown] = useState(false); + // const [dropdownGrants, setDropdownGrants] = useState([]); - useEffect(() => { - fetchGrants(); - document.addEventListener("click", handleClickOutside); - return () => { - document.removeEventListener("click", handleClickOutside); - }; - }, []); + // useEffect(() => { + // fetchGrants(); + // document.addEventListener("click", handleClickOutside); + // return () => { + // document.removeEventListener("click", handleClickOutside); + // }; + // }, []); - const fetchGrants = async () => { - try { - const response = await api(`/grant`, { method: "GET" }); - const data: Grant[] = await response.json(); - const formattedData: Grant[] = data.map((grant: any) => ({ - ...grant, - organization_name: grant.organization || "Unknown Organization", - })); - setGrants(formattedData); - } catch (error) { - console.error("Error fetching grants:", error); - } - }; + // const fetchGrants = async () => { + // try { + // const response = await api(`/grant`, { method: "GET" }); + // const data: Grant[] = await response.json(); + // const formattedData: Grant[] = data.map((grant: any) => ({ + // ...grant, + // organization_name: grant.organization || "Unknown Organization", + // })); + // setGrants(formattedData); + // } catch (error) { + // console.error("Error fetching grants:", error); + // } + // }; const handleInputChange = (e: React.ChangeEvent) => { setUserInput(e.target.value); @@ -42,8 +44,8 @@ function GrantSearch({ onGrantSelect }: any) { const performSearch = (query: string) => { if (!query) { - setDropdownGrants([]); - setShowDropdown(false); + // setDropdownGrants([]); + // setShowDropdown(false); updateSearchQuery(""); return; } @@ -51,29 +53,30 @@ function GrantSearch({ onGrantSelect }: any) { keys: ["organization_name"], threshold: 0.3, }); - const results = fuse.search(query).map((res) => res.item); + // const results = + fuse.search(query).map((res) => res.item); updateSearchQuery(query); - setDropdownGrants(results.slice(0, 5)); - setShowDropdown(true); + // setDropdownGrants(results.slice(0, 5)); + // setShowDropdown(true); }; - const handleSelectGrant = (selectedGrant: Grant) => { - setUserInput(selectedGrant.organization); - updateSearchQuery(selectedGrant.organization); - setShowDropdown(false); - onGrantSelect?.(selectedGrant); - }; + // const handleSelectGrant = (selectedGrant: Grant) => { + // setUserInput(selectedGrant.organization); + // updateSearchQuery(selectedGrant.organization); + // // setShowDropdown(false); + // onGrantSelect?.(selectedGrant); + // }; - const handleClickOutside = (event: MouseEvent) => { - const target = event.target as HTMLElement; - if ( - !target.closest(".search-container") && - !target.closest(".dropdown-container") - ) { - setShowDropdown(false); - } - }; + // const handleClickOutside = (event: MouseEvent) => { + // const target = event.target as HTMLElement; + // // if ( + // // !target.closest(".search-container") && + // // !target.closest(".dropdown-container") + // // ) { + // // setShowDropdown(false); + // // } + // }; return (
@@ -101,17 +104,17 @@ function GrantSearch({ onGrantSelect }: any) { className="search-input" onChange={handleInputChange} value={userInput} - onFocus={() => setShowDropdown(dropdownGrants.length > 0)} + // onFocus={() => setShowDropdown(dropdownGrants.length > 0)} style={{ paddingLeft: "2rem" }} // make room for the icon onKeyDown={(e) => { if (e.key === "Enter") { e.preventDefault(); - setShowDropdown(false); + // setShowDropdown(false); } }} /> - {showDropdown && ( + {/* {showDropdown && (
{dropdownGrants.length > 0 ? ( dropdownGrants.map((grant, index) => ( @@ -127,7 +130,7 @@ function GrantSearch({ onGrantSelect }: any) {
No results found
)}
- )} + )} */}
diff --git a/frontend/src/main-page/grants/new-grant/NewGrantModal.tsx b/frontend/src/main-page/grants/new-grant/NewGrantModal.tsx index 3371484..998f1ba 100644 --- a/frontend/src/main-page/grants/new-grant/NewGrantModal.tsx +++ b/frontend/src/main-page/grants/new-grant/NewGrantModal.tsx @@ -1,6 +1,6 @@ // frontend/src/grant-info/components/NewGrantModal.tsx import React, { useState, createRef, RefObject } from "react"; -import { fetchAllGrants } from "../../../external/bcanSatchel/actions"; +// import { fetchAllGrants } from "../../../external/bcanSatchel/actions"; import "../styles/NewGrantModal.css"; import POCEntry from "./POCEntry"; import { MdOutlinePerson2 } from "react-icons/md"; @@ -47,6 +47,7 @@ const NewGrantModal: React.FC<{ onClose: () => void }> = ({ onClose }) => { restricted_or_unrestricted: string; // "restricted" or "unrestricted" */ // Form fields, renamed to match your screenshot + // @ts-expect-error - Keeping for future use const [organization, setOrganization] = useState(""); const [bcanPocComponents, setBcanPocComponents] = useState([]); const [bcanPocRefs, setBcanPocRefs] = useState[]>([]); @@ -54,26 +55,36 @@ const NewGrantModal: React.FC<{ onClose: () => void }> = ({ onClose }) => { const [grantProviderPocComponents, setGrantProviderPocComponents] = useState([]); const [grantProviderPocRefs, setGrantProviderPocRefs] = useState[]>([]); + // @ts-expect-error - Keeping for future use const [applicationDate, setApplicationDate] = useState(""); + // @ts-expect-error - Keeping for future use const [grantStartDate, setGrantStartDate] = useState(""); const [reportDates, setReportDates] = useState([]); + // @ts-expect-error - Keeping for future use const [timelineInYears, setTimelineInYears] = useState(0); + // @ts-expect-error - Keeping for future use const [estimatedCompletionTimeInHours, setEstimatedCompletionTimeInHours] = useState(0); + // @ts-expect-error - Keeping for future use const [doesBcanQualify, setDoesBcanQualify] = useState(false); + // @ts-expect-error - Keeping for future use const [status, setStatus] = useState(Status.Potential); + // @ts-expect-error - Keeping for future use const [amount, setAmount] = useState(0); + // @ts-expect-error - Keeping for future use const [description, setDescription] = useState(""); // Attachments array const [attachments, setAttachments] = useState([]); // For error handling + // @ts-expect-error - Keeping for future use const [errorMessage, setErrorMessage] = useState(""); /** Add a new BCAN POC entry */ + // @ts-expect-error - Keeping for future use const addBcanPoc = () => { const newRef = createRef(); const newPOC = ; @@ -82,6 +93,7 @@ const NewGrantModal: React.FC<{ onClose: () => void }> = ({ onClose }) => { }; /** Add a new Grant Provider POC entry */ + // @ts-expect-error - Keeping for future use const addGrantProviderPoc = () => { const newRef = createRef(); const newPOC = ; @@ -90,11 +102,13 @@ const NewGrantModal: React.FC<{ onClose: () => void }> = ({ onClose }) => { }; /* Add a new blank report date to the list */ + // @ts-expect-error - Keeping for future use const addReportDate = () => { setReportDates([...reportDates, ""]); - };0 + }; // Add an empty attachment row + // @ts-expect-error - Keeping for future use const addAttachment = () => { setAttachments([ ...attachments, @@ -107,6 +121,7 @@ const NewGrantModal: React.FC<{ onClose: () => void }> = ({ onClose }) => { }; // Remove a specific attachment row + // @ts-expect-error - Keeping for future use const removeAttachment = (index: number) => { const updated = [...attachments]; updated.splice(index, 1); @@ -114,22 +129,25 @@ const NewGrantModal: React.FC<{ onClose: () => void }> = ({ onClose }) => { }; // Update a field in one attachment + // @ts-expect-error - Keeping for future use const handleAttachmentChange = ( index: number, field: keyof Attachment, value: string | AttachmentType ) => { const updated = [...attachments]; - // @ts-ignore + // @ts-expect-error - Keeping for future use updated[index][field] = value; setAttachments(updated); }; + // @ts-expect-error - Keeping for future use const removeReportDate = (index: number) => { const updated = [...reportDates]; updated.splice(index, 1); setReportDates(updated); }; + // @ts-expect-error - Keeping for future use const handleReportDateChange = (index: number, value: string) => { const updated = [...reportDates]; updated[index] = value; diff --git a/frontend/src/main-page/grants/styles/NewGrantModal.css b/frontend/src/main-page/grants/styles/NewGrantModal.css index f55e0df..9af0436 100644 --- a/frontend/src/main-page/grants/styles/NewGrantModal.css +++ b/frontend/src/main-page/grants/styles/NewGrantModal.css @@ -26,10 +26,13 @@ .modal-content { background: white; /* Peach background */ width: 100%; - max-width: 1200px; /* More width to accommodate multiple columns */ + max-width: 80%; + max-height: 80%; /* More width to accommodate multiple columns */ padding: 2rem; border: 3px solid black; border-radius: 5px; + flex: 1 1 auto; + overflow-y: auto; /* Scroll if content exceeds max height */ } /* From a59f4883ffe3998137c10d4937095e1c9cdbf2e4 Mon Sep 17 00:00:00 2001 From: prooflesben Date: Sun, 19 Oct 2025 21:22:32 -0400 Subject: [PATCH 2/5] fixed new modal build errors --- .../grants/new-grant/NewGrantModal.tsx | 129 +++++++++--------- 1 file changed, 65 insertions(+), 64 deletions(-) diff --git a/frontend/src/main-page/grants/new-grant/NewGrantModal.tsx b/frontend/src/main-page/grants/new-grant/NewGrantModal.tsx index 998f1ba..e775613 100644 --- a/frontend/src/main-page/grants/new-grant/NewGrantModal.tsx +++ b/frontend/src/main-page/grants/new-grant/NewGrantModal.tsx @@ -7,7 +7,7 @@ import { MdOutlinePerson2 } from "react-icons/md"; import { Grant } from "../../../../../middle-layer/types/Grant"; import { TDateISO } from "../../../../../backend/src/utils/date"; import { Status } from "../../../../../middle-layer/types/Status"; -//import { api } from "@/api"; +import { api } from "../../../api"; /** Attachment type from your middle layer */ enum AttachmentType { @@ -47,45 +47,46 @@ const NewGrantModal: React.FC<{ onClose: () => void }> = ({ onClose }) => { restricted_or_unrestricted: string; // "restricted" or "unrestricted" */ // Form fields, renamed to match your screenshot - // @ts-expect-error - Keeping for future use - const [organization, setOrganization] = useState(""); + // @ts-ignore + const [organization, _setOrganization] = useState(""); const [bcanPocComponents, setBcanPocComponents] = useState([]); const [bcanPocRefs, setBcanPocRefs] = useState[]>([]); const [grantProviderPocComponents, setGrantProviderPocComponents] = useState([]); const [grantProviderPocRefs, setGrantProviderPocRefs] = useState[]>([]); - // @ts-expect-error - Keeping for future use - const [applicationDate, setApplicationDate] = useState(""); - // @ts-expect-error - Keeping for future use - const [grantStartDate, setGrantStartDate] = useState(""); + // @ts-ignore + const [applicationDate, _setApplicationDate] = useState(""); + // @ts-ignore + const [grantStartDate, _setGrantStartDate] = useState(""); const [reportDates, setReportDates] = useState([]); - // @ts-expect-error - Keeping for future use - const [timelineInYears, setTimelineInYears] = useState(0); - // @ts-expect-error - Keeping for future use - const [estimatedCompletionTimeInHours, setEstimatedCompletionTimeInHours] = useState(0); + // @ts-ignore + const [timelineInYears, _setTimelineInYears] = useState(0); + // @ts-ignore + const [estimatedCompletionTimeInHours, _setEstimatedCompletionTimeInHours] = useState(0); - // @ts-expect-error - Keeping for future use - const [doesBcanQualify, setDoesBcanQualify] = useState(false); - // @ts-expect-error - Keeping for future use - const [status, setStatus] = useState(Status.Potential); + // @ts-ignore + const [doesBcanQualify, _setDoesBcanQualify] = useState(false); + // @ts-ignore + const [status, _setStatus] = useState(Status.Potential); - // @ts-expect-error - Keeping for future use - const [amount, setAmount] = useState(0); - // @ts-expect-error - Keeping for future use - const [description, setDescription] = useState(""); + // @ts-ignore + const [amount, _setAmount] = useState(0); + // @ts-ignore + const [description, _setDescription] = useState(""); // Attachments array + // @ts-ignore const [attachments, setAttachments] = useState([]); // For error handling - // @ts-expect-error - Keeping for future use - const [errorMessage, setErrorMessage] = useState(""); + // @ts-ignore + const [_errorMessage, setErrorMessage] = useState(""); /** Add a new BCAN POC entry */ - // @ts-expect-error - Keeping for future use - const addBcanPoc = () => { + // @ts-ignore + const _addBcanPoc = () => { const newRef = createRef(); const newPOC = ; setBcanPocComponents([...bcanPocComponents, newPOC]); @@ -93,8 +94,8 @@ const NewGrantModal: React.FC<{ onClose: () => void }> = ({ onClose }) => { }; /** Add a new Grant Provider POC entry */ - // @ts-expect-error - Keeping for future use - const addGrantProviderPoc = () => { + // @ts-ignore + const _addGrantProviderPoc = () => { const newRef = createRef(); const newPOC = ; setGrantProviderPocComponents([...grantProviderPocComponents, newPOC]); @@ -102,14 +103,14 @@ const NewGrantModal: React.FC<{ onClose: () => void }> = ({ onClose }) => { }; /* Add a new blank report date to the list */ - // @ts-expect-error - Keeping for future use - const addReportDate = () => { + // @ts-ignore + const _addReportDate = () => { setReportDates([...reportDates, ""]); }; // Add an empty attachment row - // @ts-expect-error - Keeping for future use - const addAttachment = () => { + // @ts-ignore + const _addAttachment = () => { setAttachments([ ...attachments, { @@ -121,16 +122,16 @@ const NewGrantModal: React.FC<{ onClose: () => void }> = ({ onClose }) => { }; // Remove a specific attachment row - // @ts-expect-error - Keeping for future use - const removeAttachment = (index: number) => { + // @ts-ignore + const _removeAttachment = (index: number) => { const updated = [...attachments]; updated.splice(index, 1); setAttachments(updated); }; // Update a field in one attachment - // @ts-expect-error - Keeping for future use - const handleAttachmentChange = ( + // @ts-ignore + const _handleAttachmentChange = ( index: number, field: keyof Attachment, value: string | AttachmentType @@ -141,14 +142,14 @@ const NewGrantModal: React.FC<{ onClose: () => void }> = ({ onClose }) => { setAttachments(updated); }; - // @ts-expect-error - Keeping for future use - const removeReportDate = (index: number) => { + // @ts-ignore + const _removeReportDate = (index: number) => { const updated = [...reportDates]; updated.splice(index, 1); setReportDates(updated); }; - // @ts-expect-error - Keeping for future use - const handleReportDateChange = (index: number, value: string) => { + // @ts-ignore + const _handleReportDateChange = (index: number, value: string) => { const updated = [...reportDates]; updated[index] = value; setReportDates(updated); @@ -218,33 +219,33 @@ const NewGrantModal: React.FC<{ onClose: () => void }> = ({ onClose }) => { isRestricted: false, // Default to unrestricted for now }; console.log(newGrant); - // try { - // const response = await api("/grant/new-grant", { - // method: "POST", - // headers: { "Content-Type": "application/json" }, - // body: JSON.stringify(newGrant), - // }); - - // if (!response.ok) { - // const errorData = await response.json(); - // setErrorMessage(errorData.errMessage || "Failed to add grant."); - // return; - // } - - // // Re-fetch the full list of grants - // //const grantsResponse = await api("/grant"); - // // if (!grantsResponse.ok) { - // // throw new Error("Failed to re-fetch grants."); - // // } - // // const updatedGrants = await grantsResponse.json(); - // // // Update the store - // // fetchAllGrants(updatedGrants); - - // onClose(); - // } catch (error) { - // setErrorMessage("Server error. Please try again."); - // console.error(error); - // } + try { + const response = await api("/grant/new-grant", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(newGrant), + }); + + if (!response.ok) { + const errorData = await response.json(); + setErrorMessage(errorData.errMessage || "Failed to add grant."); + return; + } + + // Re-fetch the full list of grants + const grantsResponse = await api("/grant"); + if (!grantsResponse.ok) { + throw new Error("Failed to re-fetch grants."); + } + const updatedGrants = await grantsResponse.json(); + // Update the store + fetchAllGrants(updatedGrants); + + onClose(); + } catch (error) { + setErrorMessage("Server error. Please try again."); + console.error(error); + } }; return ( From d9710b956dc46200b1943d945976a2571b30c9d5 Mon Sep 17 00:00:00 2001 From: prooflesben Date: Sun, 19 Oct 2025 21:33:00 -0400 Subject: [PATCH 3/5] Fixed build error --- frontend/src/main-page/grants/GrantPage.tsx | 2 +- frontend/src/main-page/grants/filter-bar/GrantSearch.tsx | 3 ++- frontend/src/main-page/grants/new-grant/NewGrantModal.tsx | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/frontend/src/main-page/grants/GrantPage.tsx b/frontend/src/main-page/grants/GrantPage.tsx index 64f24a5..c443193 100644 --- a/frontend/src/main-page/grants/GrantPage.tsx +++ b/frontend/src/main-page/grants/GrantPage.tsx @@ -26,7 +26,7 @@ function GrantPage() {
- + setShowNewGrantModal(true)} />
diff --git a/frontend/src/main-page/grants/filter-bar/GrantSearch.tsx b/frontend/src/main-page/grants/filter-bar/GrantSearch.tsx index 75cbf0e..0110a53 100644 --- a/frontend/src/main-page/grants/filter-bar/GrantSearch.tsx +++ b/frontend/src/main-page/grants/filter-bar/GrantSearch.tsx @@ -11,7 +11,8 @@ import { Input } from "@chakra-ui/react"; function GrantSearch() { const [userInput, setUserInput] = useState(""); - const [grants, setGrants] = useState([]); + // @ts-ignore + const [grants, _setGrants] = useState([]); // const [showDropdown, setShowDropdown] = useState(false); // const [dropdownGrants, setDropdownGrants] = useState([]); diff --git a/frontend/src/main-page/grants/new-grant/NewGrantModal.tsx b/frontend/src/main-page/grants/new-grant/NewGrantModal.tsx index e775613..e9b168f 100644 --- a/frontend/src/main-page/grants/new-grant/NewGrantModal.tsx +++ b/frontend/src/main-page/grants/new-grant/NewGrantModal.tsx @@ -1,6 +1,6 @@ // frontend/src/grant-info/components/NewGrantModal.tsx import React, { useState, createRef, RefObject } from "react"; -// import { fetchAllGrants } from "../../../external/bcanSatchel/actions"; +import { fetchAllGrants } from "../../../external/bcanSatchel/actions"; import "../styles/NewGrantModal.css"; import POCEntry from "./POCEntry"; import { MdOutlinePerson2 } from "react-icons/md"; From 7f802d343eb686c98cfbba4226c364641161ad1c Mon Sep 17 00:00:00 2001 From: prooflesben Date: Sun, 19 Oct 2025 21:58:21 -0400 Subject: [PATCH 4/5] Added janes changes back in --- .../grants/filter-bar/processGrantData.ts | 42 +++++++------------ 1 file changed, 14 insertions(+), 28 deletions(-) diff --git a/frontend/src/main-page/grants/filter-bar/processGrantData.ts b/frontend/src/main-page/grants/filter-bar/processGrantData.ts index 61cd2ff..32012c0 100644 --- a/frontend/src/main-page/grants/filter-bar/processGrantData.ts +++ b/frontend/src/main-page/grants/filter-bar/processGrantData.ts @@ -5,7 +5,7 @@ import { Grant } from "../../../../../middle-layer/types/Grant"; import { dateRangeFilter, filterGrants, - searchFilter, + yearFilterer, statusFilter, } from "./grantFilters"; import { sortGrants } from "./grantSorter.ts"; @@ -28,38 +28,24 @@ const fetchGrants = async () => { // contains callbacks for sorting and filtering grants // stores state for list of grants/filter export const ProcessGrantData = () => { - const { - allGrants, - filterStatus, - startDateFilter, - endDateFilter, - searchQuery, - } = getAppStore(); - const [grants, setGrants] = useState([]); + const { allGrants, filterStatus, startDateFilter, endDateFilter, yearFilter } = getAppStore(); - // init grant list + // fetch grants on mount if empty useEffect(() => { - fetchGrants(); - }, []); + if (allGrants.length === 0) fetchGrants(); + }, [allGrants.length]); - // when filter changes, update grant list state - useEffect(() => { - const filters = [ - statusFilter(filterStatus), - dateRangeFilter(startDateFilter, endDateFilter), - searchFilter(searchQuery), - ]; - const filtered = filterGrants(allGrants, filters); - setGrants(filtered); - // current brute force update everything when an attribute changes - }, [allGrants, filterStatus, startDateFilter, endDateFilter, searchQuery]); + // compute filtered grants dynamically — no useState needed + const filteredGrants = filterGrants(allGrants, [ + statusFilter(filterStatus), + dateRangeFilter(startDateFilter, endDateFilter), + yearFilterer(yearFilter), + ]); - // sorts grants based on attribute given, updates grant list state + // sorting callback const onSort = (header: keyof Grant, asc: boolean) => { - const sorted = sortGrants(grants, header, asc); - setGrants(sorted); + return sortGrants(filteredGrants, header, asc); }; - // calculates total # of pages for pagination - return { grants, onSort }; + return { grants: filteredGrants, onSort }; }; From a18fa3002a4beadd64cd9ecbb6140ffe53c86afd Mon Sep 17 00:00:00 2001 From: prooflesben Date: Sun, 19 Oct 2025 21:59:55 -0400 Subject: [PATCH 5/5] Fixed errors --- frontend/src/main-page/grants/filter-bar/processGrantData.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/main-page/grants/filter-bar/processGrantData.ts b/frontend/src/main-page/grants/filter-bar/processGrantData.ts index 32012c0..7bac0cd 100644 --- a/frontend/src/main-page/grants/filter-bar/processGrantData.ts +++ b/frontend/src/main-page/grants/filter-bar/processGrantData.ts @@ -1,4 +1,4 @@ -import { useEffect, useState } from "react"; +import { useEffect } from "react"; import { getAppStore } from "../../../external/bcanSatchel/store"; import { fetchAllGrants } from "../../../external/bcanSatchel/actions"; import { Grant } from "../../../../../middle-layer/types/Grant";