|
|
@@ -0,0 +1,77 @@ |
|
|
|
"use client"; |
|
|
|
|
|
|
|
import React, { useCallback, useMemo, useState } from "react"; |
|
|
|
import SearchBox, { Criterion } from "../SearchBox"; |
|
|
|
import { useTranslation } from "react-i18next"; |
|
|
|
import SearchResults, { Column } from "../SearchResults"; |
|
|
|
import EditNote from "@mui/icons-material/EditNote"; |
|
|
|
import { SalaryResult } from "@/app/api/salarys"; |
|
|
|
|
|
|
|
interface Props { |
|
|
|
salarys: SalaryResult[]; |
|
|
|
} |
|
|
|
|
|
|
|
type SearchQuery = Partial<Omit<SalaryResult, "id">>; |
|
|
|
type SearchParamNames = keyof SearchQuery; |
|
|
|
|
|
|
|
const SalarySearch: React.FC<Props> = ({ salarys }) => { |
|
|
|
const { t } = useTranslation("salarys"); |
|
|
|
|
|
|
|
const [filteredSalarys, setFilteredSalarys] = useState(salarys); |
|
|
|
|
|
|
|
const searchCriteria: Criterion<SearchParamNames>[] = useMemo( |
|
|
|
() => [ |
|
|
|
{ label: t("Salary"), paramName: "salary", type: "text" }, |
|
|
|
{ label: t("Salary Point"), paramName: "salaryPoint", type: "text" }, |
|
|
|
], |
|
|
|
[t, salarys], |
|
|
|
); |
|
|
|
|
|
|
|
const onReset = useCallback(() => { |
|
|
|
setFilteredSalarys(salarys); |
|
|
|
}, [salarys]); |
|
|
|
|
|
|
|
const onSalaryClick = useCallback((project: SalaryResult) => { |
|
|
|
console.log(project); |
|
|
|
}, []); |
|
|
|
|
|
|
|
const columns = useMemo<Column<SalaryResult>[]>( |
|
|
|
() => [ |
|
|
|
{ |
|
|
|
name: "id", |
|
|
|
label: t("Details"), |
|
|
|
onClick: onSalaryClick, |
|
|
|
buttonIcon: <EditNote />, |
|
|
|
}, |
|
|
|
{ name: "salaryPoint", label: t("Salary Point") }, |
|
|
|
{ name: "lowerLimit", label: t("Lower Limit") }, |
|
|
|
{ name: "upperLimit", label: t("Upper Limit") }, |
|
|
|
], |
|
|
|
[t, onSalaryClick], |
|
|
|
); |
|
|
|
|
|
|
|
return ( |
|
|
|
<> |
|
|
|
<SearchBox |
|
|
|
criteria={searchCriteria} |
|
|
|
onSearch={(query) => { |
|
|
|
setFilteredSalarys( |
|
|
|
salarys.filter( |
|
|
|
(s) => |
|
|
|
((s.lowerLimit <= Number(query.salary))&& |
|
|
|
(s.upperLimit >= Number(query.salary)))|| |
|
|
|
(s.salaryPoint === Number(query.salaryPoint)) |
|
|
|
), |
|
|
|
); |
|
|
|
}} |
|
|
|
onReset={onReset} |
|
|
|
/> |
|
|
|
<SearchResults<SalaryResult> |
|
|
|
items={filteredSalarys} |
|
|
|
columns={columns} |
|
|
|
/> |
|
|
|
</> |
|
|
|
); |
|
|
|
}; |
|
|
|
|
|
|
|
export default SalarySearch; |