diff --git a/DISCUSSION.md b/DISCUSSION.md index e69de29..f3db593 100644 --- a/DISCUSSION.md +++ b/DISCUSSION.md @@ -0,0 +1,12 @@ +# Remaining improvements + +## Database +Instead of searching the whole database and then filtering it, we should use the search terms to search the database specifically for those terms. + +## Table width + +The table width needs to be reformatted to fit into window for phone and tablet sizes + +## Specialties field +The Specialties fields style can be improved by bullet-listing the specialties + diff --git a/src/app/page.tsx b/src/app/page.tsx index 11a598f..88e32c4 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,10 +1,23 @@ "use client"; -import { useEffect, useState } from "react"; +import { useEffect, useState, useRef } from "react"; + +interface Advocate { + id: number; + firstName: string; + lastName: string; + city: string; + degree: string; + specialties: string[]; + yearsOfExperience: number; + phoneNumber: number; + createdAt?: string; +} export default function Home() { - const [advocates, setAdvocates] = useState([]); - const [filteredAdvocates, setFilteredAdvocates] = useState([]); + const [advocates, setAdvocates] = useState([]); + const [filteredAdvocates, setFilteredAdvocates] = useState([]); + const inputRef = useRef(null); useEffect(() => { console.log("fetching advocates..."); @@ -16,20 +29,24 @@ export default function Home() { }); }, []); - const onChange = (e) => { + const onChange = (e: React.ChangeEvent) => { const searchTerm = e.target.value; - document.getElementById("search-term").innerHTML = searchTerm; + const searchTermElement = document.getElementById("search-term"); + if (searchTermElement) { + searchTermElement.innerHTML = searchTerm; + } console.log("filtering advocates..."); const filteredAdvocates = advocates.filter((advocate) => { + const lowerSearchTerm = searchTerm.toLowerCase(); return ( - advocate.firstName.includes(searchTerm) || - advocate.lastName.includes(searchTerm) || - advocate.city.includes(searchTerm) || - advocate.degree.includes(searchTerm) || - advocate.specialties.includes(searchTerm) || - advocate.yearsOfExperience.includes(searchTerm) + advocate.firstName.toLowerCase().includes(lowerSearchTerm) || + advocate.lastName.toLowerCase().includes(lowerSearchTerm) || + advocate.city.toLowerCase().includes(lowerSearchTerm) || + advocate.degree.toLowerCase().includes(lowerSearchTerm) || + advocate.specialties.some(specialty => specialty.toLowerCase().includes(lowerSearchTerm)) || + advocate.yearsOfExperience.toString().includes(searchTerm) ); }); @@ -39,48 +56,59 @@ export default function Home() { const onClick = () => { console.log(advocates); setFilteredAdvocates(advocates); + + // Clear the input field + if (inputRef.current) { + inputRef.current.value = ""; + } + + // Clear the search term display + const searchTermElement = document.getElementById("search-term"); + if (searchTermElement) { + searchTermElement.innerHTML = ""; + } }; return (
-

Solace Advocates

-
-
-
-

Search

-

+

+

Solace Advocates

+
+
+

Search

+

Searching for:

- - + +
-
-
- - - - - - - + + + + + + + + + - {filteredAdvocates.map((advocate) => { + {filteredAdvocates.map((advocate, index) => { return ( - - - - - - + + + + + - - + + ); })}
First NameLast NameCityDegreeSpecialtiesYears of ExperiencePhone Number
First NameLast NameCityDegreeSpecialtiesYears of ExperiencePhone Number
{advocate.firstName}{advocate.lastName}{advocate.city}{advocate.degree} - {advocate.specialties.map((s) => ( -
{s}
+
{advocate.firstName}{advocate.lastName}{advocate.city}{advocate.degree} + {advocate.specialties.map((s: string, index: number) => ( +
{s}
))}
{advocate.yearsOfExperience}{advocate.phoneNumber}{advocate.yearsOfExperience}{advocate.phoneNumber}