import { useRef, useState } from "react"; import { Button, Space, Tag, Typography, message, notification } from "antd"; import { get, put } from "../../request"; import { type ActionType, ProList } from "@ant-design/pro-components"; import { renderBadge } from "../channel/ChannelTable"; import User, { type IUser } from "../auth/User"; import type { IChannel } from "../channel/Channel"; import type { IStudio } from "../auth/Studio"; import TimeShow from "../general/TimeShow"; import type { ITransferRequest, ITransferResponse, ITransferResponseList, ITransferStatus, } from "../../api/Transfer"; import { useIntl } from "react-intl"; import type { BaseType } from "antd/lib/typography/Base"; import type { TResType } from "../discussion/DiscussionListCard"; const { Text } = Typography; interface ITransfer { id: string; origin_owner: IStudio; res_type: TResType; res_id: string; channel?: IChannel; transferor: IUser; new_owner: IStudio; status: ITransferStatus; editor?: IUser | null; created_at: string; updated_at: string; } interface IWidget { studioName?: string; } const TransferListWidget = ({ studioName }: IWidget) => { const ref = useRef(null); const [activeKey, setActiveKey] = useState("in"); const [activeNumber, setActiveNumber] = useState(0); const [closeNumber, setCloseNumber] = useState(0); const intl = useIntl(); const openNotification = (description: string) => { const args = { message: intl.formatMessage({ id: `columns.studio.transfer.title`, }), description: description, duration: 0, }; notification.open(args); }; const setStatus = (status: ITransferStatus, id: string) => { const data: ITransferRequest = { status: status, }; put(`/v2/transfer/${id}`, data) .then((json) => { if (json.ok) { ref.current?.reload(); openNotification( `已经` + intl.formatMessage({ id: `forms.status.${status}.label` }) ); } else { message.error(json.message); } }) .catch((e) => { console.error(e); }); }; return ( <> rowKey="id" actionRef={ref} metas={{ avatar: { render(_dom, entity, _index, _action, _schema) { return ( <> ); }, }, title: { render(_dom, entity, _index, _action, _schema) { return ( <> {entity.origin_owner.studioName}/{entity.channel?.name} ); }, }, subTitle: { render(_dom, entity, _index, _action, _schema) { return {entity.res_type}; }, }, description: { search: false, render(_dom, entity, _index, _action, _schema) { return ( {"transfer at"} ); }, }, content: { render(_dom, entity, _index, _action, _schema) { let style: BaseType | undefined; switch (entity.status) { case "accept": style = "success"; break; case "refuse": style = "warning"; break; case "cancel": style = "danger"; break; default: style = undefined; break; } return ( {intl.formatMessage({ id: `forms.status.${entity.status}.label`, })} ); }, }, actions: { render: (_text, row, _index, _action) => [ activeKey === "in" ? ( <> ) : ( <> ), ], }, }} request={async (params = {}, _sorter, _filter) => { let url = `/v2/transfer?view=studio&name=${studioName}&view2=${activeKey}`; const offset = ((params.current ? params.current : 1) - 1) * (params.pageSize ? params.pageSize : 20); url += `&limit=${params.pageSize}&offset=${offset}`; url += params.keyword ? "&search=" + params.keyword : ""; console.log("url", url); const res = await get(url); const items: ITransfer[] = res.data.rows.map((item, _id) => { return item; }); setActiveNumber(res.data.in); setCloseNumber(res.data.out); return { total: res.data.count, succcess: true, data: items, }; }} bordered pagination={{ showQuickJumper: true, showSizeChanger: true, pageSize: 10, }} search={false} options={{ search: false, }} toolbar={{ menu: { activeKey, items: [ { key: "in", label: ( 转入 {renderBadge(activeNumber, activeKey === "in")} ), }, { key: "out", label: ( 转出 {renderBadge(closeNumber, activeKey === "out")} ), }, ], onChange(key) { setActiveKey(key); ref.current?.reload(); }, }, }} /> ); }; export default TransferListWidget;