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.
 
 

100 regels
2.6 KiB

  1. "use client";
  2. import SearchBox, { Criterion } from "../SearchBox";
  3. import { useCallback, useEffect, 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 { UserGroupResult } from "@/app/api/group";
  11. import { deleteGroup } from "@/app/api/group/actions";
  12. interface Props {
  13. groups: UserGroupResult[];
  14. }
  15. type SearchQuery = Partial<Omit<UserGroupResult, "id">>;
  16. type SearchParamNames = keyof SearchQuery;
  17. const UserGroupSearch: React.FC<Props> = ({ groups }) => {
  18. const { t } = useTranslation();
  19. const [filteredGroups, setFilteredGroups] = useState(groups);
  20. const router = useRouter();
  21. const searchCriteria: Criterion<SearchParamNames>[] = useMemo(
  22. () => [
  23. {
  24. label: t("Group Name"),
  25. paramName: "name",
  26. type: "text",
  27. },
  28. {
  29. label: t("Description"),
  30. paramName: "description",
  31. type: "text",
  32. },
  33. ],
  34. [t]
  35. );
  36. const onUserClick = useCallback(
  37. (group: UserGroupResult) => {
  38. router.push(`/settings/group/edit?id=${group.id}`)
  39. },
  40. [router, t]
  41. );
  42. const onDeleteClick = useCallback((group: UserGroupResult) => {
  43. deleteDialog(async () => {
  44. await deleteGroup(group.id);
  45. successDialog(t("Delete Success"), t);
  46. }, t);
  47. }, []);
  48. useEffect(() => {
  49. setFilteredGroups(groups)
  50. }, [groups]);
  51. const columns = useMemo<Column<UserGroupResult>[]>(
  52. () => [
  53. {
  54. name: "action",
  55. label: t("Edit"),
  56. onClick: onUserClick,
  57. buttonIcon: <EditNote />,
  58. },
  59. { name: "name", label: t("Group Name") },
  60. { name: "description", label: t("Description") },
  61. {
  62. name: "action",
  63. label: t("Delete"),
  64. onClick: onDeleteClick,
  65. buttonIcon: <DeleteIcon />,
  66. color: "error"
  67. },
  68. ],
  69. [t]
  70. );
  71. return (
  72. <>
  73. <SearchBox
  74. criteria={searchCriteria}
  75. onSearch={(query) => {
  76. setFilteredGroups(
  77. groups.filter(
  78. (u) =>
  79. u.name.toLowerCase().includes(query.name.toLowerCase()) &&
  80. u.description.toLowerCase().includes(query.description.toLowerCase())
  81. )
  82. )
  83. }}
  84. />
  85. <SearchResults<UserGroupResult> items={filteredGroups} columns={columns} />
  86. </>
  87. );
  88. };
  89. export default UserGroupSearch;