FPSMS-frontend
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.
 
 

97 lines
2.5 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. import UserSearchLoading from "./UserSearchLoading";
  13. interface Props {
  14. users: UserResult[];
  15. }
  16. type SearchQuery = Partial<Omit<UserResult, "id">>;
  17. type SearchParamNames = keyof SearchQuery;
  18. const UserSearch: React.FC<Props> = ({ users }) => {
  19. const { t } = useTranslation("user");
  20. const [filteredUser, setFilteredUser] = useState(users);
  21. const router = useRouter();
  22. const searchCriteria: Criterion<SearchParamNames>[] = useMemo(
  23. () => [
  24. {
  25. label: t("Username"),
  26. paramName: "username",
  27. type: "text",
  28. },
  29. ],
  30. [t],
  31. );
  32. const onUserClick = useCallback(
  33. (users: UserResult) => {
  34. console.log(users);
  35. router.push(`/settings/user/edit?id=${users.id}`);
  36. },
  37. [router, t],
  38. );
  39. const onDeleteClick = useCallback((users: UserResult) => {
  40. deleteDialog(async () => {
  41. await deleteUser(users.id);
  42. successDialog(t("Delete Success"), t);
  43. }, t);
  44. }, []);
  45. const columns = useMemo<Column<UserResult>[]>(
  46. () => [
  47. {
  48. name: "action",
  49. label: t("Edit"),
  50. onClick: onUserClick,
  51. buttonIcon: <EditNote />,
  52. },
  53. { name: "username", label: t("Username") },
  54. {
  55. name: "action",
  56. label: t("Delete"),
  57. onClick: onDeleteClick,
  58. buttonIcon: <DeleteIcon />,
  59. color: "error",
  60. },
  61. ],
  62. [t],
  63. );
  64. return (
  65. <>
  66. <SearchBox
  67. criteria={searchCriteria}
  68. onSearch={(query) => {
  69. // setFilteredUser(
  70. // users.filter(
  71. // (t) =>
  72. // t.name.toLowerCase().includes(query.name.toLowerCase()) &&
  73. // t.code.toLowerCase().includes(query.code.toLowerCase()) &&
  74. // t.description.toLowerCase().includes(query.description.toLowerCase())
  75. // )
  76. // )
  77. }}
  78. />
  79. <SearchResults<UserResult>
  80. items={filteredUser}
  81. columns={columns}
  82. pagingController={{ pageNum: 1, pageSize: 10 }}
  83. />
  84. </>
  85. );
  86. };
  87. export default UserSearch;