From e728c1511d9f0e6251482f65994c7c15f71dfee3 Mon Sep 17 00:00:00 2001 From: Fox Date: Wed, 24 Jun 2026 12:49:27 +0100 Subject: [PATCH] search by name --- .../Endpoints/SolicitorsEndpoints.cs | 2 +- frontend/src/components/results.tsx | 11 ++++++- frontend/src/components/sidebar.tsx | 30 ++++++++++++++++++- frontend/src/functions/getSolicitors.ts | 6 ++++ frontend/src/models/filterState.ts | 2 ++ 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/backend/app/Solicitors.Api/Endpoints/SolicitorsEndpoints.cs b/backend/app/Solicitors.Api/Endpoints/SolicitorsEndpoints.cs index df673da..6e07503 100644 --- a/backend/app/Solicitors.Api/Endpoints/SolicitorsEndpoints.cs +++ b/backend/app/Solicitors.Api/Endpoints/SolicitorsEndpoints.cs @@ -27,7 +27,7 @@ public static class SolicitorsEndpoints IFilter? filter = null; if (!string.IsNullOrEmpty(nameFilter)) - filter = new WrapperFilter(filter, solicitor => solicitor.Name.Contains(nameFilter)); + filter = new WrapperFilter(filter, solicitor => solicitor.Name.Contains(nameFilter, StringComparison.CurrentCultureIgnoreCase)); if (cities is not null && cities.Length > 0) filter = new WrapperFilter(filter, solicitor => cities.Any(city => solicitor.Cities.Any(solCity => solCity.Name == city))); diff --git a/frontend/src/components/results.tsx b/frontend/src/components/results.tsx index 768ecb8..4085579 100644 --- a/frontend/src/components/results.tsx +++ b/frontend/src/components/results.tsx @@ -8,7 +8,16 @@ import ResultsList from "./resultsList"; export default function Results() { const [results, setResults] = useState(waitingResults); - const [filters, setFilters] = useState({cities: [], minRating: 3, resultsPerPage: 20, currentPage: 1, ratingsProvider: 'Solicitors.com', sortBy: 'RatingDescending'}); + const [filters, setFilters] = useState({ + cities: [], + minRating: 3, + resultsPerPage: 20, + currentPage: 1, + ratingsProvider: 'Solicitors.com', + sortBy: 'RatingDescending', + namePart: '', + nameOnly: false}); + useEffect(() => { if (results.type == 'Waiting') { GetSolicitors(filters) diff --git a/frontend/src/components/sidebar.tsx b/frontend/src/components/sidebar.tsx index 9b7cb43..09d9c41 100644 --- a/frontend/src/components/sidebar.tsx +++ b/frontend/src/components/sidebar.tsx @@ -1,10 +1,12 @@ -import { Autocomplete, Box, Divider, Grid, InputLabel, MenuItem, Paper, Rating, Select, SelectChangeEvent, TextField, Typography } from "@mui/material"; +import { Autocomplete, Box, Divider, Grid, InputLabel, MenuItem, Paper, Rating, Select, SelectChangeEvent, TextField, ToggleButton, Typography } from "@mui/material"; import getCities from "../functions/getCities"; import FilterState from "../models/filterState"; import { useEffect, useState } from "react"; import NumberField from "./numberField"; import getRatingsProviders from "../functions/getRatingsProviders"; import capitaliseFirstLetter from "../functions/capitaliseFirstLetter"; +import CheckIcon from '@mui/icons-material/Check'; +import ClearIcon from '@mui/icons-material/Clear'; interface SidebarProps { filters : FilterState; @@ -32,6 +34,32 @@ export default function Sidebar(props : SidebarProps) { Filter Conveyancers + + + + Firm Name + props.onChange(Object.assign({}, {...props.filters}, {namePart: (e.target as any).value}))} + /> + + + Search by Name Only + props.onChange(Object.assign({}, {...props.filters}, {nameOnly: !props.filters.nameOnly}))} + > + {props.filters.nameOnly + ? + : } + + + + + Cities 0) { queryString += '&cities=' + filters.cities.join('&cities='); } + if (filters.sortBy != null) { queryString += `&orderingType=${filters.sortBy}`; } + + if (filters.namePart != null && filters.namePart !== '') { + queryString += `&nameFilter=${filters.namePart}`; + } + const response = await api.get(`/solicitors?${queryString}`); return response.data as PaginationResponse; } \ No newline at end of file diff --git a/frontend/src/models/filterState.ts b/frontend/src/models/filterState.ts index 6d1bd34..25e351f 100644 --- a/frontend/src/models/filterState.ts +++ b/frontend/src/models/filterState.ts @@ -5,4 +5,6 @@ export default interface FilterState { currentPage : number; ratingsProvider : string; sortBy : string; + namePart : string; + nameOnly : boolean; }; \ No newline at end of file