GroupMember.tsx 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import { useIntl } from "react-intl";
  2. import { useRef, useState } from "react";
  3. import { type ActionType, ProList } from "@ant-design/pro-components";
  4. import { Space, Tag, Button, Layout, Popconfirm } from "antd";
  5. import GroupAddMember from "./AddMember";
  6. import { delete_, get } from "../../request";
  7. import type {
  8. IGroupMemberDeleteResponse,
  9. IGroupMemberListResponse,
  10. } from "../../api/Group";
  11. import User, { type IUser } from "../auth/User";
  12. const { Content } = Layout;
  13. interface IRoleTag {
  14. title: string;
  15. color: string;
  16. }
  17. interface DataItem {
  18. id: number;
  19. userId: string;
  20. name?: string;
  21. user: IUser;
  22. tag: IRoleTag[];
  23. image: string;
  24. }
  25. interface IWidgetGroupFile {
  26. groupId?: string;
  27. }
  28. const GroupMemberWidget = ({ groupId }: IWidgetGroupFile) => {
  29. const intl = useIntl(); //i18n
  30. const [canManage, setCanManage] = useState(false);
  31. const [memberCount, setMemberCount] = useState<number>();
  32. const ref = useRef<ActionType | null>(null);
  33. return (
  34. <Content>
  35. <ProList<DataItem>
  36. rowKey="id"
  37. actionRef={ref}
  38. headerTitle={
  39. intl.formatMessage({ id: "group.member" }) +
  40. "-" +
  41. memberCount?.toString()
  42. }
  43. toolBarRender={() => {
  44. return [
  45. canManage ? (
  46. <GroupAddMember
  47. groupId={groupId}
  48. onCreated={() => {
  49. ref.current?.reload();
  50. }}
  51. />
  52. ) : undefined,
  53. ];
  54. }}
  55. showActions="hover"
  56. request={async (params = {}, sorter, filter) => {
  57. console.log(params, sorter, filter);
  58. let url = `/v2/group-member?view=group&id=${groupId}`;
  59. const offset =
  60. ((params.current ? params.current : 1) - 1) *
  61. (params.pageSize ? params.pageSize : 20);
  62. url += `&limit=${params.pageSize}&offset=${offset}`;
  63. if (typeof params.keyword !== "undefined") {
  64. url += "&search=" + (params.keyword ? params.keyword : "");
  65. }
  66. const res = await get<IGroupMemberListResponse>(url);
  67. if (res.ok) {
  68. console.log(res.data.rows);
  69. setMemberCount(res.data.count);
  70. switch (res.data.role) {
  71. case "owner":
  72. setCanManage(true);
  73. break;
  74. case "manager":
  75. setCanManage(true);
  76. break;
  77. }
  78. const items: DataItem[] = res.data.rows.map((item, _id) => {
  79. const member: DataItem = {
  80. id: item.id ? item.id : 0,
  81. userId: item.user_id,
  82. name: item.user?.nickName,
  83. user: item.user,
  84. tag: [],
  85. image: "",
  86. };
  87. switch (item.power) {
  88. case 0:
  89. member.tag.push({ title: "拥有者", color: "success" });
  90. break;
  91. case 1:
  92. member.tag.push({ title: "管理员", color: "default" });
  93. break;
  94. }
  95. return member;
  96. });
  97. console.log(items);
  98. return {
  99. total: res.data.count,
  100. succcess: true,
  101. data: items,
  102. };
  103. } else {
  104. console.error(res.message);
  105. return {
  106. total: 0,
  107. succcess: false,
  108. data: [],
  109. };
  110. }
  111. }}
  112. pagination={{
  113. showQuickJumper: true,
  114. showSizeChanger: true,
  115. }}
  116. metas={{
  117. title: {
  118. dataIndex: "name",
  119. },
  120. avatar: {
  121. dataIndex: "image",
  122. editable: false,
  123. render(_dom, entity, _index, _action, _schema) {
  124. return <User {...entity.user} showName={false} />;
  125. },
  126. },
  127. subTitle: {
  128. render: (_text, row, index, _action) => {
  129. const showtag = row.tag.map((item, id) => {
  130. return (
  131. <Tag color={item.color} key={id}>
  132. {item.title}
  133. </Tag>
  134. );
  135. });
  136. return (
  137. <Space size={0} key={index}>
  138. {showtag}
  139. </Space>
  140. );
  141. },
  142. },
  143. actions: {
  144. render: (_text, row, index, _action) => [
  145. canManage ? (
  146. <Popconfirm
  147. key={index}
  148. title={intl.formatMessage({
  149. id: "forms.message.member.remove",
  150. })}
  151. onConfirm={(
  152. _e?: React.MouseEvent<HTMLElement, MouseEvent>
  153. ) => {
  154. console.log("delete", row.id);
  155. delete_<IGroupMemberDeleteResponse>(
  156. "/v2/group-member/" + row.id
  157. ).then((json) => {
  158. if (json.ok) {
  159. console.log("delete ok");
  160. ref.current?.reload();
  161. }
  162. });
  163. }}
  164. okText={intl.formatMessage({ id: "buttons.ok" })}
  165. cancelText={intl.formatMessage({ id: "buttons.cancel" })}
  166. >
  167. <Button size="small" type="link" danger key="link">
  168. {intl.formatMessage({ id: "buttons.remove" })}
  169. </Button>
  170. </Popconfirm>
  171. ) : (
  172. <></>
  173. ),
  174. ],
  175. },
  176. }}
  177. />
  178. </Content>
  179. );
  180. };
  181. export default GroupMemberWidget;