You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

96 regels
2.6 KiB

  1. "use client";
  2. import SearchBox, { Criterion } from "../SearchBox";
  3. import { useCallback, useMemo, useState } from "react";
  4. import { useTranslation } from "react-i18next";
  5. import SearchResults, { Column } from "../SearchResults/index";
  6. import EditNote from "@mui/icons-material/EditNote";
  7. import DeleteIcon from "@mui/icons-material/Delete";
  8. import { useRouter } from "next/navigation";
  9. import { deleteDialog, successDialog } from "../Swal/CustomAlerts";
  10. import { UserResult } from "@/app/api/user";
  11. import { deleteUser } from "@/app/api/user/actions";
  12. interface Props {
  13. users: UserResult[];
  14. }
  15. type SearchQuery = Partial<Omit<UserResult, "id">>;
  16. type SearchParamNames = keyof SearchQuery;
  17. const UserSearch: React.FC<Props> = ({ users }) => {
  18. const { t } = useTranslation();
  19. const [filteredUser, setFilteredUser] = useState(users);
  20. const router = useRouter();
  21. const searchCriteria: Criterion<SearchParamNames>[] = useMemo(
  22. () => [
  23. {
  24. label: t("User Name"),
  25. paramName: "title",
  26. type: "text",
  27. },
  28. ],
  29. [t]
  30. );
  31. const onUserClick = useCallback(
  32. (users: UserResult) => {
  33. console.log(users);
  34. router.push(`/settings/user/edit?id=${users.id}`)
  35. },
  36. [router, t]
  37. );
  38. const onDeleteClick = useCallback((users: UserResult) => {
  39. deleteDialog(async () => {
  40. await deleteUser(users.id);
  41. successDialog(t("Delete Success"), t);
  42. }, t);
  43. }, []);
  44. const columns = useMemo<Column<UserResult>[]>(
  45. () => [
  46. {
  47. name: "action",
  48. label: t("Edit"),
  49. onClick: onUserClick,
  50. buttonIcon: <EditNote />,
  51. },
  52. { name: "name", label: t("UserName") },
  53. { name: "fullName", label: t("FullName") },
  54. { name: "title", label: t("Title") },
  55. { name: "department", label: t("Department") },
  56. { name: "email", label: t("Email") },
  57. { name: "phone1", label: t("Phone") },
  58. {
  59. name: "action",
  60. label: t("Delete"),
  61. onClick: onDeleteClick,
  62. buttonIcon: <DeleteIcon />,
  63. color: "error"
  64. },
  65. ],
  66. [t]
  67. );
  68. return (
  69. <>
  70. <SearchBox
  71. criteria={searchCriteria}
  72. onSearch={(query) => {
  73. // setFilteredUser(
  74. // users.filter(
  75. // (t) =>
  76. // t.name.toLowerCase().includes(query.name.toLowerCase()) &&
  77. // t.code.toLowerCase().includes(query.code.toLowerCase()) &&
  78. // t.description.toLowerCase().includes(query.description.toLowerCase())
  79. // )
  80. // )
  81. }}
  82. />
  83. <SearchResults<UserResult> items={filteredUser} columns={columns} />
  84. </>
  85. );
  86. };
  87. export default UserSearch;