import { useForm } from 'react-hook-form'; import DatasetsGrid from './DatasetsGrid'; import { Project } from '../lib/project.interface'; import { Index } from 'flexsearch'; import { ChevronDoubleLeftIcon, ChevronDoubleRightIcon, ChevronLeftIcon, ChevronRightIcon, } from '@heroicons/react/24/solid'; import { useState } from 'react'; export default function DatasetsSearch({ datasets, availableCountries, }: { datasets: Project[]; availableCountries; }) { const itemsPerPage = 6; const [page, setPage] = useState(1); const index = new Index({ tokenize: 'full' }); datasets.forEach((dataset: Project) => index.add( dataset.name, `${dataset.repo} ${dataset.name} ${dataset.title} ${dataset.author} ${dataset.title} ${dataset.cityCode} ${dataset.fiscalPeriod?.start} ${dataset.fiscalPeriod?.end}` ) ); const { register, watch, handleSubmit, reset, resetField } = useForm({ defaultValues: { searchTerm: '', country: '', minDate: '', maxDate: '', }, }); const filteredDatasets = datasets .filter((dataset: Project) => watch().searchTerm && watch().searchTerm !== '' ? index.search(watch().searchTerm).includes(dataset.name) : true ) .filter((dataset) => watch().country && watch().country !== '' ? dataset.countryCode === watch().country : true ) // TODO: Does that really makes sense? // What if the fiscalPeriod is 2015-2017 and inputs are // set to 2015-2016. It's going to be filtered out but // it shouldn't. .filter((dataset) => watch().minDate && watch().minDate !== '' ? dataset.fiscalPeriod?.start >= watch().minDate : true ) .filter((dataset) => watch().maxDate && watch().maxDate !== '' ? dataset.fiscalPeriod?.end <= watch().maxDate : true ); const paginatedDatasets = filteredDatasets.slice( (page - 1) * itemsPerPage, (page - 1) * itemsPerPage + itemsPerPage ); const pageCount = Math.ceil(filteredDatasets.length / itemsPerPage) || 1; return ( <>

setPage(1) })} className="h-[3em] relative w-full rounded-lg bg-white py-2 pl-3 pr-10 text-left shadow-md focus:outline-none focus-visible:border-emerald-500 focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75 focus-visible:ring-offset-2 focus-visible:ring-offset-emerald-400 sm:text-sm" /> {watch().searchTerm !== '' && ( )}
{/* TODO: nicer select e.g. headlessui example */}
setPage(1) })} className="h-[3em] w-full rounded-lg bg-white py-2 pl-3 pr-10 text-left shadow-md focus:outline-none focus-visible:border-emerald-500 focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75 focus-visible:ring-offset-2 focus-visible:ring-offset-emerald-400 sm:text-sm" />
setPage(1) })} className="h-[3em] w-full rounded-lg bg-white py-2 pl-3 pr-10 text-left shadow-md focus:outline-none focus-visible:border-emerald-500 focus-visible:ring-2 focus-visible:ring-white focus-visible:ring-opacity-75 focus-visible:ring-offset-2 focus-visible:ring-offset-emerald-400 sm:text-sm" />
{filteredDatasets.length} datasets found
Page {page} of {pageCount}
); } const CloseIcon = () => { return ( ); };