Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 

166 řádky
5.1 KiB

  1. "use client";
  2. import { useRouter, useSearchParams } from "next/navigation";
  3. import { useCallback, useEffect, useMemo, useState } from "react";
  4. import SearchResults, { Column } from "../SearchResults";
  5. // import { TeamResult } from "@/app/api/team";
  6. import { useTranslation } from "react-i18next";
  7. import { Button, Stack, Tab, Tabs, TabsProps, Typography } from "@mui/material";
  8. import { CreateTeamInputs, saveTeam } from "@/app/api/team/actions";
  9. import {
  10. FieldErrors,
  11. FormProvider,
  12. SubmitHandler,
  13. useForm,
  14. useFormContext,
  15. } from "react-hook-form";
  16. import { Check, Close, Error } from "@mui/icons-material";
  17. import { StaffResult } from "@/app/api/staff";
  18. import { CreateGroupInputs, auth, fetchAuth, saveGroup } from "@/app/api/group/actions";
  19. import { UserGroupResult } from "@/app/api/group";
  20. import { UserResult } from "@/app/api/user";
  21. import GroupInfo from "./GroupInfo";
  22. import AuthorityAllocation from "./AuthorityAllocation";
  23. import UserAllocation from "./UserAllocation";
  24. interface Props {
  25. groups: UserGroupResult[];
  26. // auths: auth[];
  27. users: UserResult[];
  28. }
  29. const EditUserGroup: React.FC<Props> = ({ groups, users }) => {
  30. // console.log(users)
  31. const { t } = useTranslation();
  32. const [serverError, setServerError] = useState("");
  33. const formProps = useForm<CreateGroupInputs>();
  34. const searchParams = useSearchParams();
  35. const id = parseInt(searchParams.get("id") || "0");
  36. const router = useRouter();
  37. const [tabIndex, setTabIndex] = useState(0);
  38. const [auths, setAuths] = useState<auth[]>();
  39. const errors = formProps.formState.errors;
  40. const handleTabChange = useCallback<NonNullable<TabsProps["onChange"]>>(
  41. (_e, newValue) => {
  42. setTabIndex(newValue);
  43. },
  44. []
  45. );
  46. const hasErrorsInTab = (
  47. tabIndex: number,
  48. errors: FieldErrors<CreateGroupInputs>
  49. ) => {
  50. switch (tabIndex) {
  51. case 0:
  52. return Object.keys(errors).length > 0;
  53. default:
  54. false;
  55. }
  56. };
  57. const onSubmit = useCallback<SubmitHandler<CreateGroupInputs>>(
  58. async (data) => {
  59. try {
  60. console.log(data);
  61. const tempData = {
  62. ...data,
  63. removeUserIds: data.removeUserIds ?? [],
  64. removeAuthIds: data.removeAuthIds ?? [],
  65. id: id
  66. }
  67. console.log(tempData)
  68. await saveGroup(tempData);
  69. router.replace("/settings/group");
  70. } catch (e) {
  71. console.log(e);
  72. setServerError(t("An error has occurred. Please try again later."));
  73. }
  74. },
  75. [router]
  76. );
  77. useEffect(() => {
  78. const thisGroup = groups.filter((item) => item.id === id)[0];
  79. const addUserIds = users.filter((item) => item.groupId === id).map((data) => data.id)
  80. let addAuthIds: number[] = []
  81. fetchAuth("group", id).then((data) => {
  82. setAuths(data.records)
  83. addAuthIds = data.records.filter((data) => data.v === 1).map((data) => data.id).sort((a, b) => a - b);
  84. formProps.reset({
  85. name: thisGroup.name,
  86. description: thisGroup.description,
  87. addAuthIds: addAuthIds,
  88. addUserIds: addUserIds,
  89. });
  90. });
  91. // console.log(auths)
  92. }, [groups, users]);
  93. return (
  94. <>
  95. <FormProvider {...formProps}>
  96. <Stack
  97. spacing={2}
  98. component="form"
  99. onSubmit={formProps.handleSubmit(onSubmit)}
  100. >
  101. <Typography variant="h4" marginInlineEnd={2}>
  102. {t("Edit User Group")}
  103. </Typography>
  104. <Stack
  105. direction="row"
  106. justifyContent="space-between"
  107. flexWrap="wrap"
  108. rowGap={2}
  109. >
  110. <Tabs
  111. value={tabIndex}
  112. onChange={handleTabChange}
  113. variant="scrollable"
  114. >
  115. <Tab
  116. label={t("Group Info")}
  117. icon={
  118. hasErrorsInTab(0, errors) ? (
  119. <Error sx={{ marginInlineEnd: 1 }} color="error" />
  120. ) : undefined
  121. }
  122. iconPosition="end"
  123. />
  124. <Tab label={t("Authority Allocation")} iconPosition="end" />
  125. <Tab label={t("User Allocation")} iconPosition="end" />
  126. </Tabs>
  127. </Stack>
  128. {serverError && (
  129. <Typography variant="body2" color="error" alignSelf="flex-end">
  130. {serverError}
  131. </Typography>
  132. )}
  133. {tabIndex === 0 && <GroupInfo />}
  134. {tabIndex === 1 && <AuthorityAllocation auth={auths!!}/>}
  135. {tabIndex === 2 && <UserAllocation users={users!!} />}
  136. <Stack direction="row" justifyContent="flex-end" gap={1}>
  137. <Button
  138. variant="outlined"
  139. startIcon={<Close />}
  140. // onClick={handleCancel}
  141. >
  142. {t("Cancel")}
  143. </Button>
  144. <Button
  145. variant="contained"
  146. startIcon={<Check />}
  147. type="submit"
  148. // disabled={Boolean(formProps.watch("isGridEditing"))}
  149. >
  150. {t("Confirm")}
  151. </Button>
  152. </Stack>
  153. </Stack>
  154. </FormProvider>
  155. </>
  156. );
  157. };
  158. export default EditUserGroup;