squash parametrs form to take less space

This commit is contained in:
Viktor Barzin 2025-06-23 21:16:07 +00:00
parent a526f81517
commit 8ab79b7c72
No known key found for this signature in database
GPG key ID: 4056458DBDBF8863
2 changed files with 70 additions and 10 deletions

View file

@ -39,6 +39,9 @@ const fetchData = async (user: User, baseQueyrUri: string, parameters: Parameter
if (parameters.available_from) { if (parameters.available_from) {
queryString.append("let_date_available_from", parameters.available_from.toISOString()); queryString.append("let_date_available_from", parameters.available_from.toISOString());
} }
if (parameters.district) {
queryString.append("district_names", parameters.district);
}
const response = await fetch(baseQueyrUri + '?' + queryString, const response = await fetch(baseQueyrUri + '?' + queryString,
{ {

View file

@ -1,6 +1,8 @@
import { getUser } from "@/auth/authService";
import { zodResolver } from "@hookform/resolvers/zod"; import { zodResolver } from "@hookform/resolvers/zod";
import { DialogTitle } from "@radix-ui/react-dialog"; import { DialogTitle } from "@radix-ui/react-dialog";
import { useState } from "react"; import type { User } from "oidc-client-ts";
import { useEffect, useState } from "react";
import { useForm } from "react-hook-form"; import { useForm } from "react-hook-form";
import { z } from "zod"; import { z } from "zod";
import { Button } from "./ui/button"; import { Button } from "./ui/button";
@ -33,8 +35,28 @@ export interface ParameterValues {
min_sqm?: number min_sqm?: number
last_seen_days?: number last_seen_days?: number
available_from?: Date available_from?: Date
district: string
} }
const fetchDistricts = async (user: User | null) => {
const accessToken = user?.access_token;
const response = await fetch('/api/get_districts',
{
method: 'GET',
headers: {
'Authorization': `Bearer ${accessToken}`, // Pass the token
'Content-Type': 'application/json',
},
}
);
if (!response.ok) {
throw new Error('Error: ' + response.status);
}
const data: Response = await response.json();
return data;
};
export function Parameters( export function Parameters(
props: { props: {
isOpen: boolean, isOpen: boolean,
@ -47,6 +69,16 @@ export function Parameters(
} = useForm<ParameterValues>() } = useForm<ParameterValues>()
const [action, setAction] = useState<'fetch-data' | 'visualize' | null>(null) const [action, setAction] = useState<'fetch-data' | 'visualize' | null>(null)
const [availableFromRawInput, setAvailableFromRawInput] = useState("now"); const [availableFromRawInput, setAvailableFromRawInput] = useState("now");
const [districts, setDistricts] = useState<string[]>([]);
console.log(districts)
useEffect(() => {
getUser().then(user => {
fetchDistricts(user).then(data => {
setDistricts(Object.keys(data));
})
})
}, []);
const formSchema = z.object({ const formSchema = z.object({
metric: z.nativeEnum(Metric, { required_error: "Metric is required" }), metric: z.nativeEnum(Metric, { required_error: "Metric is required" }),
@ -58,6 +90,7 @@ export function Parameters(
min_sqm: z.number().optional(), min_sqm: z.number().optional(),
last_seen_days: z.number().min(0).optional(), last_seen_days: z.number().min(0).optional(),
available_from: z.date(), available_from: z.date(),
district: z.string()
}) })
const form = useForm<z.infer<typeof formSchema>>({ const form = useForm<z.infer<typeof formSchema>>({
resolver: zodResolver(formSchema), resolver: zodResolver(formSchema),
@ -71,6 +104,7 @@ export function Parameters(
min_sqm: 50, min_sqm: 50,
last_seen_days: 7, last_seen_days: 7,
available_from: new Date(), available_from: new Date(),
district: ''
}, },
}) })
// 2. Define a submit handler. // 2. Define a submit handler.
@ -97,12 +131,12 @@ export function Parameters(
</DialogTitle> </DialogTitle>
<Form {...form}> <Form {...form}>
<form onSubmit={form.handleSubmit(onSubmit)} className="space-y-8"> <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4">
<FormField <FormField
control={form.control} control={form.control}
name="metric" name="metric"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem className="flex flex-row items-center gap-4">
<FormLabel>Metric to visualize</FormLabel> <FormLabel>Metric to visualize</FormLabel>
<Select onValueChange={field.onChange} defaultValue={field.value}> <Select onValueChange={field.onChange} defaultValue={field.value}>
<FormControl> <FormControl>
@ -125,7 +159,7 @@ export function Parameters(
control={form.control} control={form.control}
name="listing_type" name="listing_type"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem className="flex flex-row items-center gap-4">
<FormLabel>Listing Type</FormLabel> <FormLabel>Listing Type</FormLabel>
<FormControl > <FormControl >
<Select onValueChange={field.onChange} defaultValue={field.value}> <Select onValueChange={field.onChange} defaultValue={field.value}>
@ -144,11 +178,34 @@ export function Parameters(
</FormItem> </FormItem>
)} )}
/> />
{/* <FormField # listings don't have district stored as metadata; so only useful in rightmove querying
control={form.control}
name="district"
render={({ field }) => (
<FormItem className="flex flex-row items-center gap-4">
<FormLabel>District</FormLabel>
<Select onValueChange={field.onChange} defaultValue={field.value}>
<FormControl>
<SelectTrigger className="w-[180px]">
<SelectValue placeholder="District" />
</SelectTrigger>
</FormControl>
<SelectContent {...register('district')} >
{districts.map((district, index) => (
<SelectItem key={index} value={district}>{district}
</SelectItem>
))}
</SelectContent>
</Select>
<FormMessage />
</FormItem>
)}
/> */}
<FormField <FormField
control={form.control} control={form.control}
name="min_sqm" name="min_sqm"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem className="flex flex-row items-center gap-4">
<FormLabel>Min square meters</FormLabel> <FormLabel>Min square meters</FormLabel>
<FormControl > <FormControl >
<Input type="number" placeholder={"m²"} {...field} onChange={(e) => field.onChange(Number(e.target.value))} /> <Input type="number" placeholder={"m²"} {...field} onChange={(e) => field.onChange(Number(e.target.value))} />
@ -161,7 +218,7 @@ export function Parameters(
control={form.control} control={form.control}
name="min_bedrooms" name="min_bedrooms"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem className="flex flex-row items-center gap-4">
<FormLabel>Minimum number of bedrooms</FormLabel> <FormLabel>Minimum number of bedrooms</FormLabel>
<FormControl > <FormControl >
<Input type="number" placeholder={"# bedrooms"} {...field} onChange={(e) => field.onChange(Number(e.target.value))} /> <Input type="number" placeholder={"# bedrooms"} {...field} onChange={(e) => field.onChange(Number(e.target.value))} />
@ -174,7 +231,7 @@ export function Parameters(
control={form.control} control={form.control}
name="max_bedrooms" name="max_bedrooms"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem className="flex flex-row items-center gap-4">
<FormLabel>Maximum number of bedrooms</FormLabel> <FormLabel>Maximum number of bedrooms</FormLabel>
<FormControl > <FormControl >
<Input type="number" placeholder={"# bedrooms"} {...field} onChange={(e) => field.onChange(Number(e.target.value))} /> <Input type="number" placeholder={"# bedrooms"} {...field} onChange={(e) => field.onChange(Number(e.target.value))} />
@ -187,7 +244,7 @@ export function Parameters(
control={form.control} control={form.control}
name="min_price" name="min_price"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem className="flex flex-row items-center gap-4">
<FormLabel>Min price</FormLabel> <FormLabel>Min price</FormLabel>
<FormControl > <FormControl >
<Input type="number" placeholder={"£"} {...field} onChange={(e) => field.onChange(Number(e.target.value))} /> <Input type="number" placeholder={"£"} {...field} onChange={(e) => field.onChange(Number(e.target.value))} />
@ -200,7 +257,7 @@ export function Parameters(
control={form.control} control={form.control}
name="max_price" name="max_price"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem className="flex flex-row items-center gap-4">
<FormLabel>Max price</FormLabel> <FormLabel>Max price</FormLabel>
<FormControl > <FormControl >
<Input type="number" placeholder={"£"} {...field} onChange={(e) => field.onChange(Number(e.target.value))} /> <Input type="number" placeholder={"£"} {...field} onChange={(e) => field.onChange(Number(e.target.value))} />
@ -229,7 +286,7 @@ export function Parameters(
control={form.control} control={form.control}
name="last_seen_days" name="last_seen_days"
render={({ field }) => ( render={({ field }) => (
<FormItem> <FormItem className="flex flex-row items-center gap-4">
<FormLabel>Last seen days</FormLabel> <FormLabel>Last seen days</FormLabel>
<FormControl > <FormControl >
<Input type="number" placeholder={"days"} {...field} onChange={(e) => field.onChange(Number(e.target.value))} /> <Input type="number" placeholder={"days"} {...field} onChange={(e) => field.onChange(Number(e.target.value))} />