search by name

This commit is contained in:
Fox 2026-06-24 12:49:27 +01:00
parent fd46b9c42c
commit e728c1511d
5 changed files with 48 additions and 3 deletions

View File

@ -27,7 +27,7 @@ public static class SolicitorsEndpoints
IFilter<Solicitor>? filter = null;
if (!string.IsNullOrEmpty(nameFilter))
filter = new WrapperFilter<Solicitor>(filter, solicitor => solicitor.Name.Contains(nameFilter));
filter = new WrapperFilter<Solicitor>(filter, solicitor => solicitor.Name.Contains(nameFilter, StringComparison.CurrentCultureIgnoreCase));
if (cities is not null && cities.Length > 0)
filter = new WrapperFilter<Solicitor>(filter, solicitor => cities.Any(city => solicitor.Cities.Any(solCity => solCity.Name == city)));

View File

@ -8,7 +8,16 @@ import ResultsList from "./resultsList";
export default function Results() {
const [results, setResults] = useState<ResultsType>(waitingResults);
const [filters, setFilters] = useState<FilterState>({cities: [], minRating: 3, resultsPerPage: 20, currentPage: 1, ratingsProvider: 'Solicitors.com', sortBy: 'RatingDescending'});
const [filters, setFilters] = useState<FilterState>({
cities: [],
minRating: 3,
resultsPerPage: 20,
currentPage: 1,
ratingsProvider: 'Solicitors.com',
sortBy: 'RatingDescending',
namePart: '',
nameOnly: false});
useEffect(() => {
if (results.type == 'Waiting') {
GetSolicitors(filters)

View File

@ -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) {
<Box sx={{p: 2}}>
<Typography variant='h5' component='h2'>Filter Conveyancers</Typography>
</Box>
<Box sx={{ p: 2}}>
<Grid container spacing={1} sx={{width: '100%'}}>
<Grid size={6}>
<Typography component='legend'>Firm Name</Typography>
<TextField
label='Firm Name'
variant='standard'
value={props.filters.namePart}
onChange={e => props.onChange(Object.assign({}, {...props.filters}, {namePart: (e.target as any).value}))}
/>
</Grid>
<Grid size={6}>
<Typography component='legend'>Search by Name Only</Typography>
<ToggleButton
value="check"
selected={props.filters.nameOnly}
onChange={() => props.onChange(Object.assign({}, {...props.filters}, {nameOnly: !props.filters.nameOnly}))}
>
{props.filters.nameOnly
? <CheckIcon color='success' />
: <ClearIcon color='error' />}
</ToggleButton>
</Grid>
</Grid>
</Box>
<Divider />
<Box sx={{ p: 2}}>
<Typography component='legend'>Cities</Typography>
<Autocomplete

View File

@ -13,9 +13,15 @@ export default async function GetSolicitors(filters : FilterState) {
if (filters.cities.length > 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<SolicitorSummary>;
}

View File

@ -5,4 +5,6 @@ export default interface FilterState {
currentPage : number;
ratingsProvider : string;
sortBy : string;
namePart : string;
nameOnly : boolean;
};