import { zodResolver } from "@hookform/resolvers/zod"; import { DialogTitle } from "@radix-ui/react-dialog"; import { useState } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { Button } from "./ui/button"; import { Calendar29 } from "./ui/DatePicker"; import { Dialog, DialogContent, DialogTrigger } from "./ui/dialog"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage } from "./ui/form"; import { Input } from "./ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./ui/select"; export enum Metric { qmprice = 'qmprice', rooms = 'rooms', qm = 'qm', price = 'total_price', } export enum ListingType { RENT = 'RENT', BUY = 'BUY' } export enum FurnishType { FURNISHED = 'furnished', PART_FURNISHED = 'partFurnished', UNFURNISHED = 'unfurnished', } export interface ParameterValues { metric: Metric listing_type: ListingType min_bedrooms?: number max_bedrooms?: number min_price?: number max_price?: number min_sqm?: number max_sqm?: number min_price_per_sqm?: number max_price_per_sqm?: number last_seen_days?: number available_from?: Date district: string furnish_types?: FurnishType[] } export function Parameters( props: { isOpen: boolean, onSubmit: (action: 'fetch-data' | 'visualize', fromValues: ParameterValues) => void, setIsOpen: (isOpen: boolean) => void } ) { const { register, } = useForm() const [action, setAction] = useState<'fetch-data' | 'visualize' | null>(null) const [availableFromRawInput, setAvailableFromRawInput] = useState("now"); const formSchema = z.object({ metric: z.nativeEnum(Metric, { required_error: "Metric is required" }), listing_type: z.nativeEnum(ListingType, { required_error: "Listing Type is required" }), min_bedrooms: z.number().min(1).max(10).optional(), max_bedrooms: z.number().min(1).max(10).optional(), max_price: z.number().optional(), min_price: z.number().min(0).optional(), min_sqm: z.number().optional(), last_seen_days: z.number().min(0).optional(), available_from: z.date(), district: z.string() }) const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { metric: Metric.qmprice, listing_type: ListingType.RENT, min_bedrooms: 1, max_bedrooms: 3, max_price: 3000, min_price: 2000, min_sqm: 50, last_seen_days: 28, available_from: new Date(), district: '' }, }) // 2. Define a submit handler. function onSubmit(values: z.infer) { // Do something with the form values. // ✅ This will be type-safe and validated. console.log(values) if (action) { props.onSubmit(action, values) } } return <> {/* */} Visualization Parameters
( Metric to visualize )} /> ( Listing Type )} /> ( Min square meters field.onChange(Number(e.target.value))} /> )} /> ( Minimum number of bedrooms field.onChange(Number(e.target.value))} /> )} /> ( Maximum number of bedrooms field.onChange(Number(e.target.value))} /> )} /> ( Min price field.onChange(Number(e.target.value))} /> )} /> ( Max price field.onChange(Number(e.target.value))} /> )} /> ( Available from Applicable for renting listings only )} /> ( Last seen days field.onChange(Number(e.target.value))} /> )} />
}