您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

243 行
8.8 KiB

  1. // material-ui
  2. import {
  3. Button,
  4. Grid, Typography
  5. } from '@mui/material';
  6. import {useEffect, useState} from "react";
  7. import * as React from "react";
  8. import axios from "axios";
  9. import {apiPath} from "../../auth/utils";
  10. import {useParams} from "react-router-dom";
  11. import {
  12. GeneralConfirmWindow,
  13. getDeletedRecordWithRefList,
  14. getIdList,
  15. // notifyDeleteSuccess,
  16. // notifySaveSuccess
  17. } from "../../utils/CommonFunction";
  18. import {POST_AND_UPDATE_USER_GROUP,GET_GROUP_LIST_PATH } from "../../utils/ApiPathConst";
  19. import Loadable from 'components/Loadable';
  20. import { lazy } from 'react';
  21. const LoadingComponent = Loadable(lazy(() => import('../extra-pages/LoadingComponent')));
  22. const GroupAuthCard = Loadable(lazy(() => import('./GroupAuthCard')));
  23. const UserGroupInfoCard = Loadable(lazy(() => import('./UserGroupInfoCard')));
  24. const UserAddCard = Loadable(lazy(() => import('./UserAddCard')));
  25. import {useNavigate} from "react-router";
  26. // ==============================|| DASHBOARD - DEFAULT ||============================== //
  27. const UserMaintainPage = () => {
  28. const params = useParams();
  29. const navigate = useNavigate();
  30. const [onReady, setOnReady] = useState(false);
  31. const [isCollectData, setIsCollectData] = useState(false);
  32. const [editedGroupData, setEditedGroupData] = useState({});
  33. const [userGroupData,setUserGroupData] = useState([]);
  34. const [userAuthData,setUserAuthData] = useState([]);
  35. const [userConfirm, setUserConfirm] = useState(false);
  36. const [groupMember, setGroupMember] = useState([]);
  37. const [isNewRecord, setIsNewRecord] = useState(false);
  38. const [deletedUserList, setDeletedUserList] = React.useState([]);
  39. const [deletedAuthList, setDeletedAuthList] = React.useState([]);
  40. const [isWindowOpen, setIsWindowOpen] = React.useState(false);
  41. const handleClose = () => {
  42. setIsWindowOpen(false);
  43. };
  44. const handleDeleteClick = () => {
  45. setIsWindowOpen(true);
  46. };
  47. function deleteData(){
  48. axios.delete(`${apiPath}${GET_GROUP_LIST_PATH}/${params.id}`,
  49. )
  50. .then((response) => {
  51. if (response.status === 204) {
  52. // notifyDeleteSuccess();
  53. setIsWindowOpen(false);
  54. navigate('/usergroupSearchview');
  55. }
  56. })
  57. .catch(error => {
  58. console.log(error);
  59. return false;
  60. });
  61. }
  62. function updateGroupObject(groupData) {
  63. setEditedGroupData(groupData);
  64. }
  65. function updateGroupMember(groupMember){
  66. setGroupMember(groupMember.currentList);
  67. setDeletedUserList(groupMember.deletedList);
  68. }
  69. function updateUserAuthList(userAuthData){
  70. setUserAuthData(userAuthData.currentList);
  71. setDeletedAuthList(userAuthData.deletedList);
  72. }
  73. const submitData = () => {
  74. setUserConfirm(true);
  75. setIsCollectData(!isCollectData);
  76. }
  77. useEffect(() => {
  78. if(params.id > 0 ){
  79. axios.get(`${apiPath}${GET_GROUP_LIST_PATH}/${params.id}`)
  80. .then((response) => {
  81. if (response.status === 200) {
  82. setUserGroupData(response.data);
  83. }
  84. })
  85. .catch(error => {
  86. console.log(error);
  87. return false;
  88. });
  89. }
  90. else{
  91. //new record case
  92. setUserGroupData(
  93. {
  94. "authIds": [],
  95. "data": {},
  96. "userIds": []
  97. }
  98. );
  99. setIsNewRecord(true);
  100. }
  101. }, []);
  102. useEffect(() => {
  103. if (Object.keys(userGroupData).length > 0 && userGroupData !== undefined) {
  104. setOnReady(true);
  105. }
  106. else if(isNewRecord){
  107. setOnReady(true);
  108. }
  109. }, [userGroupData]);
  110. useEffect(() => {
  111. if(userConfirm && onReady){
  112. //avoid delete and add user at the same time
  113. let finalDeletedUserList = getDeletedRecordWithRefList(deletedUserList, getIdList(groupMember));
  114. console.log(finalDeletedUserList)
  115. axios.post(POST_AND_UPDATE_USER_GROUP,
  116. {
  117. "id": parseInt(params.id) !== -1? parseInt(params.id) : null,
  118. "name": editedGroupData.userGroupName,
  119. "description": editedGroupData.description,
  120. "addUserIds": getIdList(groupMember),
  121. "removeUserIds": finalDeletedUserList,
  122. "addAuthIds": userAuthData,
  123. "removeAuthIds": deletedAuthList,
  124. },
  125. )
  126. .then((response) => {
  127. if (response.status === 200) {
  128. // notifySaveSuccess();
  129. navigate('/usergroupSearchview');
  130. }
  131. })
  132. .catch(error => {
  133. console.log(error);
  134. return false;
  135. });
  136. }
  137. setUserConfirm(false);
  138. }, [editedGroupData,userGroupData,userAuthData]);
  139. return (
  140. !onReady ?
  141. <LoadingComponent/>
  142. :
  143. <Grid container rowSpacing={4.5} columnSpacing={2.75}>
  144. <Grid item xs={12} sx={{mb: -2.25}}>
  145. <Typography variant="h5">{isNewRecord? "Create User Group" : "Maintain User Group"}</Typography>
  146. </Grid>
  147. {/*col 1*/}
  148. <Grid item xs={12} md={5} lg={5}>
  149. <Grid container>
  150. <Grid item xs={12} md={12} lg={12}>
  151. <UserGroupInfoCard
  152. updateGroupObject={updateGroupObject}
  153. userGroupData={userGroupData}
  154. isCollectData={isCollectData}
  155. isNewRecord={isNewRecord}
  156. />
  157. </Grid>
  158. <Grid item xs={12} md={12} lg={12} sx={{mt:3}}>
  159. <UserAddCard
  160. updateGroupMember={updateGroupMember}
  161. userGroupData={userGroupData}
  162. isCollectData={isCollectData}
  163. isNewRecord={isNewRecord}
  164. />
  165. </Grid>
  166. </Grid>
  167. </Grid>
  168. {/*col 2*/}
  169. <Grid item xs={12} md={7} lg={7}>
  170. <GroupAuthCard
  171. updateUserAuthList={updateUserAuthList}
  172. userGroupData={userGroupData}
  173. isCollectData={isCollectData}
  174. isNewRecord={isNewRecord}
  175. />
  176. </Grid>
  177. {/*bottom button*/}
  178. <Grid item s={12} md={12} lg={12} sx={{mb: 3}} alignItems={"end"} justifyContent="center">
  179. <Grid container maxWidth justifyContent="flex-end">
  180. <Grid item sx={{ml:3, mr:3, mb:3}}>
  181. <Button
  182. size="large"
  183. variant="contained"
  184. sx={{
  185. textTransform: 'capitalize',
  186. alignItems: 'end'
  187. }}
  188. disabled={isNewRecord}
  189. onClick={handleDeleteClick}
  190. >
  191. Delete User Group
  192. </Button>
  193. <GeneralConfirmWindow
  194. isWindowOpen={isWindowOpen}
  195. title={"Attention"}
  196. content={`Confirm to delete User Group "${userGroupData.data.name}" ?`}
  197. onNormalClose={handleClose}
  198. onConfirmClose={deleteData}
  199. />
  200. </Grid>
  201. <Grid item sx={{ml: 3, mr: 3}}>
  202. <Button
  203. size="large"
  204. variant="contained"
  205. type="submit"
  206. sx={{
  207. textTransform: 'capitalize',
  208. alignItems: 'end'
  209. }}
  210. onClick={submitData}
  211. >
  212. Save
  213. </Button>
  214. </Grid>
  215. </Grid>
  216. </Grid>
  217. </Grid>
  218. );
  219. };
  220. export default UserMaintainPage;