diff --git a/ui/web/src/pages/agents/agent-detail/agent-detail-page.tsx b/ui/web/src/pages/agents/agent-detail/agent-detail-page.tsx index 10afa384..e8c52f1a 100644 --- a/ui/web/src/pages/agents/agent-detail/agent-detail-page.tsx +++ b/ui/web/src/pages/agents/agent-detail/agent-detail-page.tsx @@ -109,7 +109,7 @@ export function AgentDetailPage({ agentId, onBack }: AgentDetailPageProps) { {/* Tabs */} -
+
General diff --git a/ui/web/src/pages/channels/channel-detail/channel-detail-page.tsx b/ui/web/src/pages/channels/channel-detail/channel-detail-page.tsx index 6d741e8f..da47ab5e 100644 --- a/ui/web/src/pages/channels/channel-detail/channel-detail-page.tsx +++ b/ui/web/src/pages/channels/channel-detail/channel-detail-page.tsx @@ -93,7 +93,7 @@ export function ChannelDetailPage({ instanceId, onBack }: ChannelDetailPageProps
{/* Tabs */} -
+
General diff --git a/ui/web/src/pages/teams/task-sections/task-detail-dialog.tsx b/ui/web/src/pages/teams/task-sections/task-detail-dialog.tsx new file mode 100644 index 00000000..86d52d9d --- /dev/null +++ b/ui/web/src/pages/teams/task-sections/task-detail-dialog.tsx @@ -0,0 +1,91 @@ +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; +import { Badge } from "@/components/ui/badge"; +import { formatDate } from "@/lib/format"; +import type { TeamTaskData } from "@/types/team"; +import { taskStatusBadgeVariant } from "./task-utils"; + +interface TaskDetailDialogProps { + task: TeamTaskData; + onClose: () => void; +} + +export function TaskDetailDialog({ task, onClose }: TaskDetailDialogProps) { + return ( + onClose()}> + + + Task Detail + + +
+ {/* Subject */} +
+

Subject

+

{task.subject}

+
+ + {/* Summary grid */} +
+
+ Status:{" "} + + {task.status.replace("_", " ")} + +
+
+ Priority:{" "} + {task.priority} +
+
+ Owner:{" "} + {task.owner_agent_key || "—"} +
+ {task.created_at && ( +
+ Created:{" "} + {formatDate(task.created_at)} +
+ )} + {task.updated_at && ( +
+ Updated:{" "} + {formatDate(task.updated_at)} +
+ )} +
+ + {/* Blocked by */} + {task.blocked_by && task.blocked_by.length > 0 && ( +
+ Blocked by:{" "} + {task.blocked_by.join(", ")} +
+ )} + + {/* Description */} + {task.description && ( +
+

Description

+
{task.description}
+
+ )} + + {/* Result */} + {task.result && ( +
+

Result

+
+                {task.result}
+              
+
+ )} +
+
+
+ ); +} diff --git a/ui/web/src/pages/teams/task-sections/task-list.tsx b/ui/web/src/pages/teams/task-sections/task-list.tsx index d3889fa9..85713c06 100644 --- a/ui/web/src/pages/teams/task-sections/task-list.tsx +++ b/ui/web/src/pages/teams/task-sections/task-list.tsx @@ -1,7 +1,9 @@ +import { useState } from "react"; import { ClipboardList } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import type { TeamTaskData } from "@/types/team"; import { taskStatusBadgeVariant } from "./task-utils"; +import { TaskDetailDialog } from "./task-detail-dialog"; interface TaskListProps { tasks: TeamTaskData[]; @@ -9,6 +11,8 @@ interface TaskListProps { } export function TaskList({ tasks, loading }: TaskListProps) { + const [selectedTask, setSelectedTask] = useState(null); + if (loading && tasks.length === 0) { return (
@@ -30,42 +34,52 @@ export function TaskList({ tasks, loading }: TaskListProps) { } return ( -
-
- Subject - Status - Owner - Priority -
- {tasks.map((task) => ( -
-
-

{task.subject}

- {task.description && ( -

- {task.description} -

- )} - {task.result && ( -

- {task.result} -

- )} -
- - {task.status.replace("_", " ")} - - - {task.owner_agent_key || "—"} - - - {task.priority} - + <> +
+
+ Subject + Status + Owner + Priority
- ))} -
+ {tasks.map((task) => ( +
setSelectedTask(task)} + > +
+

{task.subject}

+ {task.description && ( +

+ {task.description} +

+ )} + {task.result && ( +

+ {task.result} +

+ )} +
+ + {task.status.replace("_", " ")} + + + {task.owner_agent_key || "—"} + + + {task.priority} + +
+ ))} +
+ + {selectedTask && ( + setSelectedTask(null)} + /> + )} + ); } diff --git a/ui/web/src/pages/teams/team-delegations-tab.tsx b/ui/web/src/pages/teams/team-delegations-tab.tsx index 8335b6bb..047f020e 100644 --- a/ui/web/src/pages/teams/team-delegations-tab.tsx +++ b/ui/web/src/pages/teams/team-delegations-tab.tsx @@ -1,9 +1,13 @@ +import { useState } from "react"; import { ArrowRightLeft } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { EmptyState } from "@/components/shared/empty-state"; import { DeferredSpinner } from "@/components/shared/loading-skeleton"; import { formatDate, formatDuration } from "@/lib/format"; import { useTeamDelegations } from "./hooks/use-team-delegations"; +import { useDelegations } from "@/pages/delegations/hooks/use-delegations"; +import { useTraces } from "@/pages/traces/hooks/use-traces"; +import { DelegationDetailDialog } from "@/pages/delegations/delegation-detail-dialog"; interface TeamDelegationsTabProps { teamId: string; @@ -11,6 +15,9 @@ interface TeamDelegationsTabProps { export function TeamDelegationsTab({ teamId }: TeamDelegationsTabProps) { const { records, loading } = useTeamDelegations(teamId); + const { getDelegation } = useDelegations(); + const { getTrace } = useTraces(); + const [selectedId, setSelectedId] = useState(null); if (loading) return ; @@ -25,42 +32,57 @@ export function TeamDelegationsTab({ teamId }: TeamDelegationsTabProps) { } return ( -
- - - - - - - - - - - - {records.map((d) => ( - - - - - - + <> +
+
Source / TargetTaskStatusDurationTime
- {d.source_agent_key || d.source_agent_id.slice(0, 8)} - → - {d.target_agent_key || d.target_agent_id.slice(0, 8)} - - {d.task} - - - - {formatDuration(d.duration_ms)} - - {formatDate(d.created_at)} -
+ + + + + + + - ))} - -
Source / TargetTaskStatusDurationTime
-
+ + + {records.map((d) => ( + setSelectedId(d.id)} + > + + {d.source_agent_key || d.source_agent_id.slice(0, 8)} + → + {d.target_agent_key || d.target_agent_id.slice(0, 8)} + + + {d.task} + + + + + + {formatDuration(d.duration_ms)} + + + {formatDate(d.created_at)} + + + ))} + + +
+ + {selectedId && ( + setSelectedId(null)} + getDelegation={getDelegation} + getTrace={getTrace} + /> + )} + ); } diff --git a/ui/web/src/pages/teams/team-detail-page.tsx b/ui/web/src/pages/teams/team-detail-page.tsx index 9273cdfd..f600d72d 100644 --- a/ui/web/src/pages/teams/team-detail-page.tsx +++ b/ui/web/src/pages/teams/team-detail-page.tsx @@ -105,7 +105,7 @@ export function TeamDetailPage({ teamId, onBack }: TeamDetailPageProps) {
{/* Tabs */} -
+
Members