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 ) .filter((dataset) => { const filterMinDate = watch().minDate; const filterMaxDate = watch().maxDate; const datasetMinDate = dataset.fiscalPeriod?.start; const datasetMaxDate = dataset.fiscalPeriod?.end; let datasetStartOverlaps = false; if (datasetMinDate) { datasetStartOverlaps = datasetMinDate >= filterMinDate && datasetMinDate <= filterMaxDate; } let datasetEndOverlaps = false; if (datasetMaxDate) { datasetEndOverlaps = datasetMaxDate >= filterMinDate && datasetMaxDate <= filterMaxDate; } if (filterMinDate && filterMaxDate) { return datasetStartOverlaps || datasetEndOverlaps; } else if (filterMinDate) { return datasetMinDate >= filterMinDate; } else if (filterMaxDate) { return datasetMinDate <= filterMaxDate; } return 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 ( ); };