list.tsx 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. import { useParams } from "react-router-dom";
  2. import { ProTable } from "@ant-design/pro-components";
  3. import { useIntl } from "react-intl";
  4. import { Button, Space, Table, Dropdown, Menu, MenuProps } from "antd";
  5. import {
  6. SearchOutlined,
  7. DeleteOutlined,
  8. ShareAltOutlined,
  9. } from "@ant-design/icons";
  10. import TermCreate from "../../../components/studio/term/TermCreate";
  11. import { ITermListResponse } from "../../../components/api/Term";
  12. import { get } from "../../../request";
  13. const onMenuClick: MenuProps["onClick"] = (e) => {
  14. console.log("click", e);
  15. };
  16. const menu = (
  17. <Menu
  18. onClick={onMenuClick}
  19. items={[
  20. {
  21. key: "1",
  22. label: "更多查询",
  23. icon: <SearchOutlined />,
  24. },
  25. {
  26. key: "2",
  27. label: "分享",
  28. icon: <ShareAltOutlined />,
  29. },
  30. {
  31. key: "3",
  32. label: "删除",
  33. icon: <DeleteOutlined />,
  34. },
  35. ]}
  36. />
  37. );
  38. interface IItem {
  39. sn: number;
  40. id: string;
  41. word: string;
  42. tag: string;
  43. channel: string;
  44. meaning: string;
  45. meaning2: string;
  46. note: string;
  47. createdAt: number;
  48. }
  49. const Widget = () => {
  50. const intl = useIntl();
  51. const { studioname } = useParams();
  52. return (
  53. <>
  54. <ProTable<IItem>
  55. columns={[
  56. {
  57. title: intl.formatMessage({
  58. id: "term.fields.sn.label",
  59. }),
  60. dataIndex: "sn",
  61. key: "sn",
  62. width: 30,
  63. search: false,
  64. },
  65. {
  66. title: intl.formatMessage({
  67. id: "term.fields.word.label",
  68. }),
  69. dataIndex: "word",
  70. key: "word",
  71. tip: "单词过长会自动收缩",
  72. ellipsis: true,
  73. formItemProps: {
  74. rules: [
  75. {
  76. required: true,
  77. message: "此项为必填项",
  78. },
  79. ],
  80. },
  81. },
  82. {
  83. title: intl.formatMessage({
  84. id: "term.fields.description.label",
  85. }),
  86. dataIndex: "tag",
  87. key: "description",
  88. search: false,
  89. },
  90. {
  91. title: intl.formatMessage({
  92. id: "term.fields.channel.label",
  93. }),
  94. dataIndex: "channel",
  95. valueType: "select",
  96. valueEnum: {
  97. all: { text: "全部" },
  98. 1: { text: "中文" },
  99. 2: { text: "中文草稿" },
  100. 3: { text: "英文" },
  101. 4: { text: "英文草稿" },
  102. 5: { text: "Visuddhinanda" },
  103. },
  104. },
  105. {
  106. title: intl.formatMessage({
  107. id: "term.fields.meaning.label",
  108. }),
  109. dataIndex: "meaning",
  110. key: "meaning",
  111. },
  112. {
  113. title: intl.formatMessage({
  114. id: "term.fields.meaning2.label",
  115. }),
  116. dataIndex: "meaning2",
  117. key: "meaning2",
  118. tip: "意思过长会自动收缩",
  119. ellipsis: true,
  120. },
  121. {
  122. title: intl.formatMessage({
  123. id: "term.fields.note.label",
  124. }),
  125. dataIndex: "note",
  126. key: "note",
  127. search: false,
  128. tip: "注释过长会自动收缩",
  129. ellipsis: true,
  130. },
  131. {
  132. title: intl.formatMessage({
  133. id: "forms.fields.created-at.label",
  134. }),
  135. key: "created-at",
  136. width: 200,
  137. search: false,
  138. dataIndex: "createdAt",
  139. valueType: "date",
  140. sorter: (a, b) => a.createdAt - b.createdAt,
  141. },
  142. {
  143. title: intl.formatMessage({ id: "buttons.option" }),
  144. key: "option",
  145. width: 120,
  146. valueType: "option",
  147. render: (text, row, index, action) => {
  148. return [
  149. <Dropdown.Button
  150. key={index}
  151. type="link"
  152. overlay={menu}
  153. onClick={() => {
  154. //setWordId(row.wordId);
  155. //setDrawerTitle(row.word);
  156. //setIsEditOpen(true);
  157. }}
  158. >
  159. <TermCreate
  160. studio={studioname}
  161. edit={true}
  162. wordId={row.id}
  163. />
  164. </Dropdown.Button>,
  165. ];
  166. },
  167. },
  168. ]}
  169. rowSelection={{
  170. // 自定义选择项参考: https://ant.design/components/table-cn/#components-table-demo-row-selection-custom
  171. // 注释该行则默认不显示下拉选项
  172. selections: [Table.SELECTION_ALL, Table.SELECTION_INVERT],
  173. }}
  174. tableAlertRender={({
  175. selectedRowKeys,
  176. selectedRows,
  177. onCleanSelected,
  178. }) => (
  179. <Space size={24}>
  180. <span>
  181. {intl.formatMessage({ id: "buttons.selected" })}
  182. {selectedRowKeys.length}
  183. <Button
  184. type="link"
  185. style={{ marginInlineStart: 8 }}
  186. onClick={onCleanSelected}
  187. >
  188. {intl.formatMessage({ id: "buttons.unselect" })}
  189. </Button>
  190. </span>
  191. </Space>
  192. )}
  193. tableAlertOptionRender={() => {
  194. return (
  195. <Space size={16}>
  196. <Button type="link">批量删除</Button>
  197. <Button type="link">导出数据</Button>
  198. </Space>
  199. );
  200. }}
  201. request={async (params = {}, sorter, filter) => {
  202. // TODO
  203. console.log(params, sorter, filter);
  204. const offset =
  205. ((params.current ? params.current : 1) - 1) *
  206. (params.pageSize ? params.pageSize : 20);
  207. let url = `/v2/terms?view=studio&name=${studioname}&limit=${params.pageSize}&offset=${offset}`;
  208. if (typeof params.keyword !== "undefined") {
  209. url +=
  210. "&search=" + (params.keyword ? params.keyword : "");
  211. }
  212. console.log(url);
  213. const res = await get<ITermListResponse>(url);
  214. const items: IItem[] = res.data.rows.map((item, id) => {
  215. const date = new Date(item.updated_at);
  216. const id2 =
  217. ((params.current || 1) - 1) *
  218. (params.pageSize || 20) +
  219. id +
  220. 1;
  221. return {
  222. sn: id2,
  223. id: item.guid,
  224. word: item.word,
  225. tag: item.tag,
  226. channel: item.channal,
  227. meaning: item.meaning,
  228. meaning2: item.other_meaning,
  229. note: item.note,
  230. createdAt: date.getTime(),
  231. };
  232. });
  233. return {
  234. total: res.data.count,
  235. success: true,
  236. data: items,
  237. };
  238. }}
  239. rowKey="id"
  240. //bordered
  241. pagination={{
  242. showQuickJumper: true,
  243. showSizeChanger: true,
  244. }}
  245. toolBarRender={() => [<TermCreate studio={studioname} />]}
  246. search={false}
  247. options={{
  248. search: true,
  249. }}
  250. dateFormatter="string"
  251. />
  252. </>
  253. );
  254. };
  255. export default Widget;