InviteList.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. import { useIntl } from "react-intl";
  2. import { Button, Popover } from "antd";
  3. import { type ActionType, ProTable } from "@ant-design/pro-components";
  4. import { UserAddOutlined } from "@ant-design/icons";
  5. import { get } from "../../request";
  6. import { RoleValueEnum } from "../studio/table";
  7. import { useRef, useState } from "react";
  8. import InviteCreate from "./InviteCreate";
  9. import { getSorterUrl } from "../../utils";
  10. import type { IInviteListResponse } from "../../api/Auth";
  11. interface DataItem {
  12. sn: number;
  13. id: string;
  14. email: string;
  15. status: string;
  16. created_at: string;
  17. }
  18. interface IWidget {
  19. studioName?: string;
  20. }
  21. const InviteListWidget = ({ studioName }: IWidget) => {
  22. const intl = useIntl(); //i18n
  23. const [openCreate, setOpenCreate] = useState(false);
  24. const ref = useRef<ActionType | null>(null);
  25. return (
  26. <>
  27. <ProTable<DataItem>
  28. actionRef={ref}
  29. columns={[
  30. {
  31. title: intl.formatMessage({
  32. id: "dict.fields.sn.label",
  33. }),
  34. dataIndex: "sn",
  35. key: "sn",
  36. width: 50,
  37. search: false,
  38. },
  39. {
  40. title: intl.formatMessage({
  41. id: "forms.fields.email.label",
  42. }),
  43. dataIndex: "email",
  44. key: "email",
  45. },
  46. {
  47. title: intl.formatMessage({
  48. id: "forms.fields.status.label",
  49. }),
  50. dataIndex: "status",
  51. key: "status",
  52. width: 100,
  53. search: false,
  54. filters: true,
  55. onFilter: true,
  56. valueEnum: RoleValueEnum(),
  57. },
  58. {
  59. title: intl.formatMessage({
  60. id: "forms.fields.created-at.label",
  61. }),
  62. key: "created_at",
  63. width: 100,
  64. search: false,
  65. dataIndex: "created_at",
  66. valueType: "date",
  67. },
  68. ]}
  69. request={async (params = {}, sorter, filter) => {
  70. console.log(params, sorter, filter);
  71. let url = `/v2/invite?`;
  72. if (studioName) {
  73. url += `view=studio&studio=${studioName}`;
  74. } else {
  75. url += `view=all`;
  76. }
  77. const offset =
  78. ((params.current ? params.current : 1) - 1) *
  79. (params.pageSize ? params.pageSize : 20);
  80. url += `&limit=${params.pageSize}&offset=${offset}`;
  81. url += params.keyword ? "&search=" + params.keyword : "";
  82. url += getSorterUrl(sorter);
  83. console.log(url);
  84. const res = await get<IInviteListResponse>(url);
  85. const items: DataItem[] = res.data.rows.map((item, id) => {
  86. return {
  87. sn: id + offset + 1,
  88. id: item.id,
  89. email: item.email,
  90. status: item.status,
  91. created_at: item.created_at,
  92. };
  93. });
  94. console.log(items);
  95. return {
  96. total: res.data.count,
  97. succcess: true,
  98. data: items,
  99. };
  100. }}
  101. rowKey="id"
  102. bordered
  103. pagination={{
  104. showQuickJumper: true,
  105. showSizeChanger: true,
  106. }}
  107. search={false}
  108. options={{
  109. search: true,
  110. }}
  111. toolBarRender={
  112. studioName
  113. ? () => [
  114. <Popover
  115. content={
  116. <InviteCreate
  117. studio={studioName}
  118. onCreate={() => {
  119. setOpenCreate(false);
  120. ref.current?.reload();
  121. }}
  122. />
  123. }
  124. placement="bottomRight"
  125. trigger="click"
  126. open={openCreate}
  127. onOpenChange={(open: boolean) => {
  128. setOpenCreate(open);
  129. }}
  130. >
  131. <Button
  132. key="button"
  133. icon={<UserAddOutlined />}
  134. type="primary"
  135. >
  136. {intl.formatMessage({ id: "buttons.invite" })}
  137. </Button>
  138. </Popover>,
  139. ]
  140. : undefined
  141. }
  142. />
  143. </>
  144. );
  145. };
  146. export default InviteListWidget;