feat(task): task detail

This commit is contained in:
2026-02-09 18:20:33 +08:00
parent f0298b91e3
commit 3f284d057c
19 changed files with 435 additions and 279 deletions

View File

@@ -26,7 +26,7 @@ import {
} from "@tabler/icons-react"
import { DataTable, DataTableColumn } from "mantine-datatable"
import { useSearchParams } from "next/navigation"
import { useCallback, useEffect, useMemo, useState } from "react"
import { JSX, useCallback, useEffect, useMemo, useState } from "react"
import DispatchModal from "./components/DispatchModal"
import ReleaseModal from "./components/ReleaseModal"
import TaskStatusTag from "./components/TaskStatusTag"
@@ -34,6 +34,7 @@ import WorkflowModal from "./components/WorkflowModal"
export default function TaskTableContainer(props: {
info: ProjectDetail.DataProps | undefined
menuAction?: () => JSX.Element
userEnums: {
allEnum: Map<any, any>
labelEnum: Map<any, any>
@@ -41,13 +42,17 @@ export default function TaskTableContainer(props: {
review2Enum: Map<any, any>
}
}) {
const { info, userEnums } = props
const { info, menuAction, userEnums } = props
false && console.log(info)
const urlParams = useSearchParams()
const id = urlParams.get("id")
const projectId =
typeof id === "string" && !isNaN(Number(id)) ? Number(id) : -1
const currentUid = usePermissionStore((s) => s.user_id)
false && console.log(currentUid)
const { params, total, setPagination, resetParams, setTotal } =
useAllTaskStore()
@@ -101,6 +106,7 @@ export default function TaskTableContainer(props: {
}, [form.search_id, form.search_status, params, projectId])
const load = useCallback(async () => {
if (!queryTrigger) return
if (projectId === -1) return
setLoading(true)
try {
@@ -211,61 +217,66 @@ export default function TaskTableContainer(props: {
p="sm"
radius="md"
style={{ borderColor: "rgba(0,0,0,0.06)" }}>
<Group justify="space-between" wrap="wrap" gap="sm">
<Group gap="sm" wrap="wrap">
<TextInput
size="xs"
label="任务ID"
value={form.search_id}
onChange={(e) =>
setForm((s) => ({ ...s, search_id: e.currentTarget.value }))
}
style={{ width: 160 }}
/>
<Select
size="xs"
label="状态"
data={Object.entries(TaskStatusOpts).map(([value, label]) => ({
value,
label,
}))}
value={form.search_status}
onChange={(v) =>
setForm((s) => ({ ...s, search_status: v ?? "0" }))
}
allowDeselect={false}
style={{ width: 160 }}
/>
<Button
size="xs"
leftSection={<IconRefresh size={16} />}
loading={loading}
onClick={() => setQueryTrigger((v) => v + 1)}>
</Button>
</Group>
<Stack gap="sm">
{menuAction ? <div>{menuAction()}</div> : null}
<Group justify="space-between" wrap="wrap" gap="sm">
<Group gap="sm" wrap="wrap">
<TextInput
size="xs"
label="任务ID"
value={form.search_id}
onChange={(e) =>
setForm((s) => ({ ...s, search_id: e.currentTarget.value }))
}
style={{ width: 160 }}
/>
<Select
size="xs"
label="状态"
data={Object.entries(TaskStatusOpts).map(
([value, label]) => ({
value,
label,
})
)}
value={form.search_status}
onChange={(v) =>
setForm((s) => ({ ...s, search_status: v ?? "0" }))
}
allowDeselect={false}
style={{ width: 160 }}
/>
<Button
size="xs"
leftSection={<IconRefresh size={16} />}
loading={loading}
onClick={() => setQueryTrigger((v) => v + 1)}>
</Button>
</Group>
<Group gap="xs" wrap="wrap">
<Button
size="xs"
variant="default"
onClick={() => {
resetParams()
setForm({ search_id: "", search_status: "0" })
setQueryTrigger((v) => v + 1)
}}>
</Button>
<Button
size="xs"
onClick={() => {
setPagination(1, params.page_size ?? 20)
setQueryTrigger((v) => v + 1)
}}>
</Button>
<Group gap="xs" wrap="wrap">
<Button
size="xs"
variant="default"
onClick={() => {
resetParams()
setForm({ search_id: "", search_status: "0" })
setQueryTrigger((v) => v + 1)
}}>
</Button>
<Button
size="xs"
onClick={() => {
setPagination(1, params.page_size ?? 20)
setQueryTrigger((v) => v + 1)
}}>
</Button>
</Group>
</Group>
</Group>
</Stack>
</Paper>
<Group gap={0} align="stretch" style={{ flex: 1, minHeight: 0 }}>
@@ -300,13 +311,13 @@ export default function TaskTableContainer(props: {
<WorkflowModal
opened={workflowTaskId !== null}
taskId={workflowTaskId}
onClose={() => setWorkflowTaskId(null)}
onCloseAction={() => setWorkflowTaskId(null)}
/>
<DispatchModal
opened={dispatchRecord !== null}
record={dispatchRecord}
userOptions={userOptions}
onClose={(refresh) => {
onCloseAction={(refresh) => {
setDispatchRecord(null)
if (refresh) setQueryTrigger((v) => v + 1)
}}
@@ -314,7 +325,7 @@ export default function TaskTableContainer(props: {
<ReleaseModal
opened={releaseRecord !== null}
record={releaseRecord}
onClose={(refresh) => {
onCloseAction={(refresh) => {
setReleaseRecord(null)
if (refresh) setQueryTrigger((v) => v + 1)
}}