User.tsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. import React, { useContext, useEffect, useState } from 'react';
  2. import { useTranslation } from 'react-i18next';
  3. import { UserHttp } from '../../http/User';
  4. import AttuGrid from '../../components/grid/Grid';
  5. import { ColDefinitionsType, ToolBarConfig } from '../../components/grid/Types';
  6. import {
  7. CreateUserParams,
  8. DeleteUserParams,
  9. UpdateUserParams,
  10. UserData,
  11. } from './Types';
  12. import DeleteTemplate from '../../components/customDialog/DeleteDialogTemplate';
  13. import { rootContext } from '../../context/Root';
  14. import { useNavigationHook } from '../../hooks/Navigation';
  15. import { ALL_ROUTER_TYPES } from '../../router/Types';
  16. import CreateUser from './Create';
  17. import UpdateUser from './Update';
  18. const Users = () => {
  19. useNavigationHook(ALL_ROUTER_TYPES.USER);
  20. const [users, setUsers] = useState<UserData[]>([]);
  21. const [selectedUser, setSelectedUser] = useState<UserData[]>([]);
  22. const { setDialog, handleCloseDialog, openSnackBar } =
  23. useContext(rootContext);
  24. const { t: successTrans } = useTranslation('success');
  25. const { t: userTrans } = useTranslation('user');
  26. const { t: btnTrans } = useTranslation('btn');
  27. const { t: dialogTrans } = useTranslation('dialog');
  28. const fetchUsers = async () => {
  29. const res = await UserHttp.getUsers();
  30. setUsers(res.usernames.map((v: string) => ({ name: v })));
  31. };
  32. const handleCreate = async (data: CreateUserParams) => {
  33. await UserHttp.createUser(data);
  34. fetchUsers();
  35. openSnackBar(successTrans('create', { name: userTrans('user') }));
  36. handleCloseDialog();
  37. };
  38. const handleUpdate = async (data: UpdateUserParams) => {
  39. await UserHttp.updateUser(data);
  40. fetchUsers();
  41. openSnackBar(successTrans('update', { name: userTrans('user') }));
  42. handleCloseDialog();
  43. };
  44. const handleDelete = async () => {
  45. for (const user of selectedUser) {
  46. const param: DeleteUserParams = {
  47. username: user.name,
  48. };
  49. await UserHttp.deleteUser(param);
  50. }
  51. openSnackBar(successTrans('delete', { name: userTrans('user') }));
  52. fetchUsers();
  53. handleCloseDialog();
  54. };
  55. const toolbarConfigs: ToolBarConfig[] = [
  56. {
  57. label: 'Create user',
  58. onClick: () => {
  59. setDialog({
  60. open: true,
  61. type: 'custom',
  62. params: {
  63. component: (
  64. <CreateUser
  65. handleCreate={handleCreate}
  66. handleClose={handleCloseDialog}
  67. />
  68. ),
  69. },
  70. });
  71. },
  72. icon: 'add',
  73. },
  74. {
  75. type: 'iconBtn',
  76. onClick: () => {
  77. setDialog({
  78. open: true,
  79. type: 'custom',
  80. params: {
  81. component: (
  82. <DeleteTemplate
  83. label={btnTrans('drop')}
  84. title={dialogTrans('deleteTitle', { type: userTrans('user') })}
  85. text={userTrans('deleteWarning')}
  86. handleDelete={handleDelete}
  87. />
  88. ),
  89. },
  90. });
  91. },
  92. label: '',
  93. disabled: () =>
  94. selectedUser.length === 0 ||
  95. selectedUser.findIndex(v => v.name === 'root') > -1,
  96. disabledTooltip: userTrans('deleteTip'),
  97. icon: 'delete',
  98. },
  99. ];
  100. const colDefinitions: ColDefinitionsType[] = [
  101. {
  102. id: 'name',
  103. align: 'left',
  104. disablePadding: false,
  105. label: 'Name',
  106. },
  107. {
  108. id: 'action',
  109. disablePadding: false,
  110. label: 'Action',
  111. showActionCell: true,
  112. actionBarConfigs: [
  113. {
  114. onClick: (e: React.MouseEvent, row: UserData) => {
  115. setDialog({
  116. open: true,
  117. type: 'custom',
  118. params: {
  119. component: (
  120. <UpdateUser
  121. username={row.name}
  122. handleUpdate={handleUpdate}
  123. handleClose={handleCloseDialog}
  124. />
  125. ),
  126. },
  127. });
  128. },
  129. linkButton: true,
  130. text: 'Update password',
  131. },
  132. ],
  133. },
  134. ];
  135. const handleSelectChange = (value: UserData[]) => {
  136. setSelectedUser(value);
  137. };
  138. useEffect(() => {
  139. fetchUsers();
  140. }, []);
  141. return (
  142. <div className="page-wrapper">
  143. <AttuGrid
  144. toolbarConfigs={toolbarConfigs}
  145. colDefinitions={colDefinitions}
  146. rows={users}
  147. rowCount={users.length}
  148. primaryKey="name"
  149. showPagination={false}
  150. selected={selectedUser}
  151. setSelected={handleSelectChange}
  152. // page={currentPage}
  153. // onChangePage={handlePageChange}
  154. // rowsPerPage={pageSize}
  155. // setRowsPerPage={handlePageSize}
  156. // isLoading={loading}
  157. // order={order}
  158. // orderBy={orderBy}
  159. // handleSort={handleGridSort}
  160. />
  161. </div>
  162. );
  163. };
  164. export default Users;