import { ActionType, ProTable } from "@ant-design/pro-components";
import { useIntl } from "react-intl";
import { Link } from "react-router-dom";
import { Alert, Badge, Button, message, Modal, Popover } from "antd";
import { Dropdown } from "antd";
import {
ExclamationCircleOutlined,
DeleteOutlined,
PlusOutlined,
} from "@ant-design/icons";
import { delete_, get } from "../../request";
import { TChannelType } from "../api/Channel";
import { PublicityValueEnum } from "../studio/table";
import { IDeleteResponse } from "../api/Article";
import { useEffect, useRef, useState } from "react";
import { getSorterUrl } from "../../utils";
import { TransferOutLinedIcon } from "../../assets/icon";
import { IProjectData, IProjectListResponse } from "../api/task";
import ProjectCreate from "./ProjectCreate";
import ShareModal from "../share/ShareModal";
import { EResType } from "../share/Share";
export interface IResNumberResponse {
ok: boolean;
message: string;
data: {
my: number;
collaboration: number;
};
}
export const renderBadge = (count: number, active = false) => {
return (
);
};
interface IWidget {
studioName?: string;
type?: string;
disableChannels?: string[];
onSelect?: Function;
}
const ProjectTableWidget = ({
studioName,
disableChannels,
type,
onSelect,
}: IWidget) => {
const intl = useIntl();
const [activeKey, setActiveKey] = useState("studio");
const [openCreate, setOpenCreate] = useState(false);
const [shareId, setShareId] = useState();
const [shareOpen, setShareOpen] = useState(false);
useEffect(() => {
ref.current?.reload();
}, [disableChannels]);
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() {
const url = `/v2/channel/${id}`;
console.log("delete api request", url);
return delete_(url)
.then((json) => {
console.info("api response", json);
if (json.ok) {
message.success("删除成功");
ref.current?.reload();
} else {
message.error(json.message);
}
})
.catch((e) => console.log("Oops errors!", e));
},
});
};
const ref = useRef();
return (
<>
{shareId ? (
setShareOpen(false)}
resId={shareId}
resType={EResType.project}
/>
) : (
<>>
)}
actionRef={ref}
columns={[
{
title: intl.formatMessage({
id: "forms.fields.title.label",
}),
dataIndex: "title",
width: 250,
key: "title",
tooltip: "过长会自动收缩",
ellipsis: true,
render(dom, entity, index, action, schema) {
return (
{entity.title}
);
},
},
{
title: intl.formatMessage({
id: "forms.fields.executors.label",
}),
dataIndex: "executors",
key: "executors",
},
{
title: intl.formatMessage({
id: "forms.fields.milestone.label",
}),
dataIndex: "milestone",
key: "milestone",
width: 80,
search: false,
},
{
title: intl.formatMessage({
id: "forms.fields.status.label",
}),
dataIndex: "status",
key: "status",
width: 80,
search: false,
filters: true,
onFilter: true,
valueEnum: PublicityValueEnum(),
},
{
title: intl.formatMessage({
id: "forms.fields.updated-at.label",
}),
key: "updated_at",
width: 100,
search: false,
dataIndex: "updated_at",
valueType: "date",
sorter: true,
},
{
title: intl.formatMessage({ id: "buttons.option" }),
key: "option",
width: 100,
valueType: "option",
render: (text, row, index, action) => {
return [
,
},
{
key: "share",
label: intl.formatMessage({
id: "buttons.share",
}),
},
{
key: "remove",
label: intl.formatMessage({
id: "buttons.delete",
}),
icon: ,
danger: true,
},
],
onClick: (e) => {
switch (e.key) {
case "remove":
showDeleteConfirm(row.id, row.title);
break;
case "share":
setShareId(row.id);
setShareOpen(true);
break;
default:
break;
}
},
}}
>
{intl.formatMessage({
id: "buttons.setting",
})}
,
];
},
},
]}
request={async (params = {}, sorter, filter) => {
console.log(params, sorter, filter);
let url = `/v2/project?view=${activeKey}&type=instance`;
url += `&studio=${studioName}`;
const offset =
((params.current ? params.current : 1) - 1) *
(params.pageSize ? params.pageSize : 20);
url += `&limit=${params.pageSize}&offset=${offset}`;
url += params.keyword ? "&keyword=" + params.keyword : "";
url += getSorterUrl(sorter);
console.log("project list api request", url);
const res = await get(url);
console.info("project list api response", res);
return {
total: res.data.count,
succcess: res.ok,
data: res.data.rows,
};
}}
rowKey="id"
bordered
pagination={{
showQuickJumper: true,
showSizeChanger: true,
}}
search={false}
options={{
search: true,
}}
toolBarRender={() => [
{
setOpenCreate(false);
ref.current?.reload();
}}
/>
}
placement="bottomRight"
trigger="click"
open={openCreate}
onOpenChange={(open: boolean) => {
setOpenCreate(open);
}}
>
} type="primary">
{intl.formatMessage({ id: "buttons.create" })}
,
]}
toolbar={{
menu: {
activeKey,
items: [
{
key: "studio",
label: "我的项目",
},
{
key: "shared",
label: intl.formatMessage({ id: "labels.shared" }),
},
],
onChange(key) {
console.log("show course", key);
setActiveKey(key);
ref.current?.reload();
},
},
}}
/>
>
);
};
export default ProjectTableWidget;