index.tsx 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. import { RootState } from "@/store";
  2. import { getRoleListAPI, roleRemoveAPI } from "@/store/action/A4Role";
  3. import { RoleTableType } from "@/types";
  4. import { MessageFu } from "@/utils/message";
  5. import { Button, Input, Popconfirm, Table } from "antd";
  6. import React, {
  7. useCallback,
  8. useEffect,
  9. useMemo,
  10. useRef,
  11. useState,
  12. } from "react";
  13. import { useDispatch, useSelector } from "react-redux";
  14. import styles from "./index.module.scss";
  15. import RoleAdd from "./RoleAdd";
  16. import A4Auth from "./A4Auth";
  17. function A4Role() {
  18. const dispatch = useDispatch();
  19. // 顶部筛选
  20. type TableListType = {
  21. pageNum: number;
  22. pageSize: number;
  23. searchKey: string;
  24. };
  25. const [tableSelect, setTableSelect] = useState<TableListType>({
  26. pageNum: 1,
  27. pageSize: 10,
  28. searchKey: "",
  29. });
  30. useEffect(() => {
  31. dispatch(getRoleListAPI(tableSelect));
  32. }, [dispatch, tableSelect]);
  33. // 角色名的输入
  34. const nameTime = useRef(-1);
  35. const nameChange = useCallback(
  36. (e: React.ChangeEvent<HTMLInputElement>) => {
  37. clearTimeout(nameTime.current);
  38. nameTime.current = window.setTimeout(() => {
  39. setTableSelect({
  40. ...tableSelect,
  41. searchKey: e.target.value,
  42. pageNum: 1,
  43. });
  44. }, 500);
  45. },
  46. [tableSelect]
  47. );
  48. // 角色名的重置
  49. const [inputKey, setInputKey] = useState(1);
  50. const resetSelectFu = useCallback(() => {
  51. // 把2个输入框和时间选择器清空
  52. setInputKey(Date.now());
  53. setTableSelect({
  54. pageNum: 1,
  55. pageSize: 10,
  56. searchKey: "",
  57. });
  58. }, []);
  59. // 点击删除
  60. const delTableFu = useCallback(
  61. async (id: number) => {
  62. const res: any = await roleRemoveAPI(id);
  63. if (res.code === 0) {
  64. MessageFu.success("删除成功!");
  65. dispatch(getRoleListAPI(tableSelect));
  66. }
  67. },
  68. [dispatch, tableSelect]
  69. );
  70. // 点击新增和编辑
  71. const [editPageShow, setEditPageShow] = useState(false);
  72. const editId = useRef(0);
  73. const openEditPageFu = useCallback((id: number) => {
  74. editId.current = id;
  75. setEditPageShow(true);
  76. }, []);
  77. // 从仓库中获取表格数据
  78. const tableInfo = useSelector((state: RootState) => state.A4Role.tableInfo);
  79. // 页码变化
  80. const paginationChange = useCallback(
  81. () => (pageNum: number, pageSize: number) => {
  82. setTableSelect({ ...tableSelect, pageNum, pageSize });
  83. },
  84. [tableSelect]
  85. );
  86. const columns = useMemo(() => {
  87. return [
  88. // {
  89. // width: 80,
  90. // title: "序号",
  91. // render: (text: any, record: any, index: any) =>
  92. // index + 1 + (pageNumRef.current - 1) * pagePageRef.current,
  93. // },
  94. {
  95. title: "角色名称",
  96. dataIndex: "roleName",
  97. },
  98. {
  99. title: "角色说明",
  100. render: (item: RoleTableType) =>
  101. item.roleDesc ? (
  102. item.roleDesc.length >= 30 ? (
  103. <span style={{ cursor: "pointer" }} title={item.roleDesc}>
  104. {item.roleDesc.substring(0, 30) + "..."}
  105. </span>
  106. ) : (
  107. item.roleDesc
  108. )
  109. ) : (
  110. "(空)"
  111. ),
  112. },
  113. {
  114. title: "功能权限",
  115. render: (item: RoleTableType) =>
  116. item.pcsPerm ? item.pcsPerm + "项" : "-",
  117. },
  118. {
  119. title: "数据权限",
  120. render: (item: RoleTableType) =>
  121. item.dataScope === 1
  122. ? "本部门-自己创建的项目"
  123. : item.dataScope === 2
  124. ? "本部门-所有用户创建的项目"
  125. : item.dataScope === 3
  126. ? "跨部门数据"
  127. : "-",
  128. },
  129. {
  130. title: "内控文件权限",
  131. render: (item: RoleTableType) =>
  132. item.pcsAttr ? item.pcsAttr + "项" : "-",
  133. },
  134. {
  135. title: "操作",
  136. render: (item: RoleTableType) => {
  137. return (
  138. <>
  139. <Button
  140. size="small"
  141. type="text"
  142. onClick={() => setAuthId(item.id)}
  143. >
  144. 授权
  145. </Button>
  146. <Button
  147. size="small"
  148. type="text"
  149. onClick={() => openEditPageFu(item.id)}
  150. >
  151. 编辑
  152. </Button>
  153. {item.roleKey === "sys_common" ? null : (
  154. <Popconfirm
  155. title="删除后无法恢复,是否删除?"
  156. okText="删除"
  157. cancelText="取消"
  158. onConfirm={() => delTableFu(item.id!)}
  159. okButtonProps={{ loading: false }}
  160. >
  161. <Button size="small" type="text" danger>
  162. 删除
  163. </Button>
  164. </Popconfirm>
  165. )}
  166. </>
  167. );
  168. },
  169. },
  170. ];
  171. }, [delTableFu, openEditPageFu]);
  172. // 点击授权出来的页面
  173. const [authId, setAuthId] = useState(0);
  174. return (
  175. <div className={styles.A4Role}>
  176. <div className="pageTitle">角色管理 {authId ? " > 授权" : null}</div>
  177. <div className="searchTop">
  178. <div className="searchTopRow">
  179. <span>角色名:</span>
  180. <Input
  181. key={inputKey}
  182. maxLength={8}
  183. style={{ width: 200 }}
  184. placeholder="请输入"
  185. allowClear
  186. onChange={(e) => nameChange(e)}
  187. />
  188. </div>
  189. <div className="searchTopRow">
  190. &emsp;&emsp;
  191. <Button type="primary" onClick={() => openEditPageFu(0)}>
  192. 新增
  193. </Button>
  194. </div>
  195. </div>
  196. <div className="tableBox">
  197. <Table
  198. scroll={{ y: 617 }}
  199. dataSource={tableInfo.list}
  200. columns={columns}
  201. rowKey="id"
  202. pagination={{
  203. showQuickJumper: true,
  204. position: ["bottomCenter"],
  205. showSizeChanger: true,
  206. current: tableSelect.pageNum,
  207. pageSize: tableSelect.pageSize,
  208. total: tableInfo.total,
  209. onChange: paginationChange(),
  210. }}
  211. />
  212. </div>
  213. {/* 点击新增或者编辑 */}
  214. {editPageShow ? (
  215. <RoleAdd
  216. id={editId.current}
  217. closePage={() => setEditPageShow(false)}
  218. upTableList={() => dispatch(getRoleListAPI(tableSelect))}
  219. addTableList={resetSelectFu}
  220. />
  221. ) : null}
  222. {/* 点击授权 */}
  223. {authId ? (
  224. <A4Auth
  225. mId={authId}
  226. authColseFu={() => setAuthId(0)}
  227. authEditFu={() => dispatch(getRoleListAPI(tableSelect))}
  228. />
  229. ) : null}
  230. </div>
  231. );
  232. }
  233. const MemoA4Role = React.memo(A4Role);
  234. export default MemoA4Role;