"use client"; import Grid from "@mui/material/Grid"; import Card from "@mui/material/Card"; import CardContent from "@mui/material/CardContent"; import Typography from "@mui/material/Typography"; import React, { useCallback, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import TextField from "@mui/material/TextField"; import FormControl from "@mui/material/FormControl"; import InputLabel from "@mui/material/InputLabel"; import Select, { SelectChangeEvent } from "@mui/material/Select"; import MenuItem from "@mui/material/MenuItem"; import CardActions from "@mui/material/CardActions"; import Button from "@mui/material/Button"; import RestartAlt from "@mui/icons-material/RestartAlt"; import Search from "@mui/icons-material/Search"; import dayjs from "dayjs"; import "dayjs/locale/zh-hk"; import { DatePicker } from "@mui/x-date-pickers/DatePicker"; import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider"; import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs"; import { Box } from "@mui/material"; interface BaseCriterion { label: string; label2?: string; paramName: T; paramName2?: T; } interface TextCriterion extends BaseCriterion { type: "text"; } interface SelectCriterion extends BaseCriterion { type: "select"; options: string[]; } interface DateRangeCriterion extends BaseCriterion { type: "dateRange"; } export type Criterion = | TextCriterion | SelectCriterion | DateRangeCriterion; interface Props { criteria: Criterion[]; onSearch: (inputs: Record) => void; onReset?: () => void; } function SearchBox({ criteria, onSearch, onReset, }: Props) { const { t } = useTranslation("common"); const defaultInputs = useMemo( () => criteria.reduce>( (acc, c) => { return { ...acc, [c.paramName]: c.type === "select" ? "All" : "" }; }, {} as Record, ), [criteria], ); const [inputs, setInputs] = useState(defaultInputs); const makeInputChangeHandler = useCallback( (paramName: T): React.ChangeEventHandler => { return (e) => { setInputs((i) => ({ ...i, [paramName]: e.target.value })); }; }, [], ); const makeSelectChangeHandler = useCallback((paramName: T) => { return (e: SelectChangeEvent) => { setInputs((i) => ({ ...i, [paramName]: e.target.value })); }; }, []); const makeDateChangeHandler = useCallback((paramName: T) => { return (e: any) => { setInputs((i) => ({ ...i, [paramName]: dayjs(e).format("YYYY-MM-DD") })); }; }, []); const makeDateToChangeHandler = useCallback((paramName: T) => { return (e: any) => { setInputs((i) => ({ ...i, [paramName + "To"]: dayjs(e).format("YYYY-MM-DD"), })); }; }, []); const handleReset = () => { setInputs(defaultInputs); onReset?.(); }; const handleSearch = () => { onSearch(inputs); }; return ( {t("Search Criteria")} {criteria.map((c) => { return ( {c.type === "text" && ( )} {c.type === "select" && ( {c.label} )} {c.type === "dateRange" && ( {"-"} )} ); })} ); } export default SearchBox;