import { type ActionType, ProTable } from "@ant-design/pro-components"; import { useIntl } from "react-intl"; import { Button, Space, Table, Dropdown, Modal, message } from "antd"; import { ExclamationCircleOutlined, DeleteOutlined, ImportOutlined, PlusOutlined, } from "@ant-design/icons"; import type { ITermDeleteRequest, ITermListResponse } from "../../api/Term"; import { delete_2, get } from "../../request"; import type { IDeleteResponse } from "../../api/Article"; import { useRef } from "react"; import type { IChannel } from "../channel/Channel"; import TermExport from "./TermExport"; import DataImport from "../admin/relation/DataImport"; import TermModal from "./TermModal"; import { getSorterUrl } from "../../utils"; import { useAppSelector } from "../../hooks"; import { currentUser } from "../../reducers/current-user"; interface IItem { sn: number; id: string; word: string; tag: string; channel?: IChannel; meaning: string; meaning2: string; note: string | null; updated_at: string; } interface IWidget { studioName?: string; channelId?: string; } const TermListWidget = ({ studioName, channelId }: IWidget) => { const intl = useIntl(); const currUser = useAppSelector(currentUser); const showDeleteConfirm = (id: string[], title: string) => { Modal.confirm({ icon: , title: intl.formatMessage({ id: "message.delete.confirm", }) + intl.formatMessage({ id: "message.irrevocable", }), content: title, okText: intl.formatMessage({ id: "buttons.delete", }), okType: "danger", cancelText: intl.formatMessage({ id: "buttons.no", }), onOk() { console.log("delete", id); return delete_2( `/v2/terms/${id}`, { uuid: true, id: id, } ) .then((json: unknown) => { if (json.ok) { message.success("删除成功"); ref.current?.reload(); } else { message.error(json.message); } }) .catch((e: unknown) => console.log("Oops errors!", e)); }, }); }; const ref = useRef(null); return ( <> actionRef={ref} columns={[ { title: intl.formatMessage({ id: "term.fields.sn.label", }), dataIndex: "sn", key: "sn", width: 80, search: false, }, { title: intl.formatMessage({ id: "term.fields.word.label", }), dataIndex: "word", key: "word", tooltip: "单词过长会自动收缩", ellipsis: true, }, { title: intl.formatMessage({ id: "term.fields.description.label", }), dataIndex: "tag", key: "tag", search: false, }, { title: intl.formatMessage({ id: "term.fields.channel.label", }), dataIndex: "channel", key: "channel", render(_dom, entity, _index, _action, _schema) { return entity.channel?.name; }, }, { title: intl.formatMessage({ id: "term.fields.meaning.label", }), dataIndex: "meaning", key: "meaning", }, { title: intl.formatMessage({ id: "term.fields.meaning2.label", }), dataIndex: "meaning2", key: "meaning2", tooltip: "意思过长会自动收缩", ellipsis: true, }, { title: intl.formatMessage({ id: "term.fields.note.label", }), dataIndex: "note", key: "note", search: false, tooltip: "注释过长会自动收缩", ellipsis: true, }, { title: intl.formatMessage({ id: "forms.fields.updated-at.label", }), key: "updated_at", width: 200, search: false, dataIndex: "updated_at", valueType: "date", sorter: true, }, { title: intl.formatMessage({ id: "buttons.option" }), key: "option", width: 120, valueType: "option", render: (_text, row, index, _action) => { return [ , danger: true, }, ], onClick: (e) => { switch (e.key) { case "remove": showDeleteConfirm([row.id], row.word); break; default: break; } }, }} > ref.current?.reload()} /> , ]; }, }, ]} rowSelection={{ // 自定义选择项参考: https://ant.design/components/table-cn/#components-table-demo-row-selection-custom // 注释该行则默认不显示下拉选项 selections: [Table.SELECTION_ALL, Table.SELECTION_INVERT], }} tableAlertRender={({ selectedRowKeys, ___selectedRows, onCleanSelected, }) => ( {intl.formatMessage({ id: "buttons.selected" })} {selectedRowKeys.length} )} tableAlertOptionRender={({ ___intl, selectedRowKeys, ___selectedRows, onCleanSelected, }) => { return ( ); }} request={async (params = {}, sorter, filter) => { console.log(params, sorter, filter); const offset = ((params.current ? params.current : 1) - 1) * (params.pageSize ? params.pageSize : 20); let url = `/v2/terms?`; if (typeof channelId === "string") { url += `view=channel&id=${channelId}`; } else { url += `view=studio&name=${studioName}`; } url += `&limit=${params.pageSize}&offset=${offset}`; if (typeof params.keyword !== "undefined") { url += "&search=" + (params.keyword ? params.keyword : ""); } url += getSorterUrl(sorter); const res = await get(url); console.log(res); const items: IItem[] = res.data.rows.map((item, id) => { return { sn: id + offset + 1, id: item.guid, word: item.word, tag: item.tag, channel: item.channel, meaning: item.meaning, meaning2: item.other_meaning, note: item.note, updated_at: item.updated_at, }; }); return { total: res.data.count, success: true, data: items, }; }} rowKey="id" //bordered pagination={{ showQuickJumper: true, showSizeChanger: true, }} toolBarRender={() => [ }> {intl.formatMessage({ id: "buttons.import" })} } onSuccess={() => { ref.current?.reload(); }} />, , } type="primary" disabled={currUser?.roles?.includes("basic")} > {intl.formatMessage({ id: "buttons.create" })} } studioName={studioName} channelId={channelId} onUpdate={() => ref.current?.reload()} />, ]} search={false} options={{ search: true, }} dateFormatter="string" /> ); }; export default TermListWidget;