import { useEffect, useState } from "react"; import { Divider, Skeleton, Space, Tag, Typography, message } from "antd"; import { CodeSandboxOutlined } from "@ant-design/icons"; import type { ITaskData, ITaskResponse, ITaskUpdateRequest, } from "../../api/task"; import { get, patch } from "../../request"; import User from "../auth/User"; import TimeShow from "../general/TimeShow"; import TaskEditButton, { type TRelation } from "./TaskEditButton"; import PreTask from "./PreTask"; import Like from "../like/Like"; import Assignees from "./Assignees"; import PlanDate from "./PlanDate"; import TaskTitle from "./TaskTitle"; import TaskStatus from "./TaskStatus"; import Description from "./Description"; import Category from "./Category"; import { useIntl } from "react-intl"; import TaskLog from "./TaskLog"; import DiscussionDrawer from "../discussion/DiscussionDrawer"; const { Text } = Typography; export const Milestone = ({ task }: { task?: ITaskData }) => { const intl = useIntl(); return task?.is_milestone ? ( } color="error"> {intl.formatMessage({ id: "labels.milestone" })} ) : null; }; interface IWidget { taskId?: string; onChange?: (data: ITaskData[]) => void; onDiscussion?: () => void; } const TaskReader = ({ taskId, onChange }: IWidget) => { const [openPreTask, setOpenPreTask] = useState(false); const [openNextTask, setOpenNextTask] = useState(false); const [task, setTask] = useState(); const [loading, setLoading] = useState(true); const [open, setOpen] = useState(false); useEffect(() => { async function load() { const url = `/v2/task/${taskId}`; console.info("task api request", url); setLoading(true); get(url) .then((json) => { console.info("task api response", json); if (json.ok) { setTask(json.data); } }) .finally(() => setLoading(false)); } load(); }, [taskId]); const updatePreTask = (type: TRelation, data: ITaskData, has: boolean) => { if (!taskId || !data) { return; } const setting: ITaskUpdateRequest = { id: taskId, studio_name: "", }; if (type === "pre") { let newPre = task?.pre_task?.filter((value) => value.id !== data.id) ?? []; if (has) { newPre = [...newPre, data]; } setting.pre_task_id = newPre?.map((item) => item.id).join(); } else if (type === "next") { let newNext = task?.next_task?.filter((value) => value.id !== data.id) ?? []; if (has) { newNext = [...newNext, data]; } setting.next_task_id = newNext?.map((item) => item.id).join(); } const url = `/v2/task/${setting.id}`; console.info("api request", url, setting); patch(url, setting).then((json) => { console.info("api response", json); if (json.ok) { message.success("Success"); setTask(json.data); onChange?.([json.data]); } else { message.error(json.message); } }); }; return loading ? ( ) : (
{ updatePreTask("pre", data, has); setOpenPreTask(false); }} onTagClick={() => setOpenPreTask(true)} onClose={() => setOpenPreTask(false)} /> { updatePreTask("next", data, has); setOpenNextTask(false); }} onClose={() => setOpenNextTask(false)} onTagClick={() => setOpenNextTask(true)} />
{ setTask(tasks.find((value) => value.id === taskId)); onChange?.(tasks); }} onPreTask={(type: TRelation) => { if (type === "pre") { setOpenPreTask(true); } else if (type === "next") { setOpenNextTask(true); } }} />
{ setTask(data[0]); onChange?.(data); }} />
执行人 指派给 { setTask(data[0]); onChange?.(data); }} /> 起止日期
类别 { setTask(data[0]); onChange?.(data); }} />
setOpen(true)} /> { setTask(data[0]); onChange?.(data); }} onDiscussion={() => setOpen(true)} /> setOpen(false)} resId={taskId} resType="task" />
); }; export default TaskReader;