diff --git a/apps/web/app/(dashboard)/issues/[id]/page.tsx b/apps/web/app/(dashboard)/issues/[id]/page.tsx index 47f615f6..06441140 100644 --- a/apps/web/app/(dashboard)/issues/[id]/page.tsx +++ b/apps/web/app/(dashboard)/issues/[id]/page.tsx @@ -7,7 +7,6 @@ import { Bot, Calendar, ChevronRight, - Circle, User, } from "lucide-react"; import { @@ -16,6 +15,7 @@ import { PRIORITY_CONFIG, } from "../_data/mock"; import type { MockAssignee } from "../_data/mock"; +import { StatusIcon, PriorityIcon } from "../page"; // --------------------------------------------------------------------------- // Helpers @@ -32,7 +32,7 @@ function timeAgo(dateStr: string): string { } function formatDate(date: string | null): string { - if (!date) return "—"; + if (!date) return "None"; return new Date(date).toLocaleDateString("en-US", { month: "short", day: "numeric", @@ -40,16 +40,41 @@ function formatDate(date: string | null): string { }); } -function ActorBadge({ actor }: { actor: MockAssignee }) { +function ActorAvatar({ actor, size = "sm" }: { actor: MockAssignee; size?: "sm" | "md" }) { + const sizeClass = size === "sm" ? "h-5 w-5 text-[10px]" : "h-6 w-6 text-xs"; return ( - - {actor.type === "agent" && } - {actor.name} - + {actor.type === "agent" ? ( + + ) : ( + actor.avatar.charAt(0) + )} + + ); +} + +// --------------------------------------------------------------------------- +// Properties Sidebar +// --------------------------------------------------------------------------- + +function PropertyRow({ + label, + children, +}: { + label: string; + children: React.ReactNode; +}) { + return ( +
+ {label} +
{children}
+
); } @@ -67,7 +92,7 @@ export default function IssueDetailPage({ if (!issue) { return ( -
+
Issue not found
); @@ -78,18 +103,17 @@ export default function IssueDetailPage({ const isOverdue = issue.dueDate && new Date(issue.dueDate) < new Date() && issue.status !== "done"; - // Merge comments + activity into a single timeline sorted by time const timeline = [ ...issue.activity.map((a) => ({ id: a.id, - type: "activity" as const, + kind: "activity" as const, actor: a.actor, content: a.action, createdAt: a.createdAt, })), ...issue.comments.map((c) => ({ id: c.id, - type: "comment" as const, + kind: "comment" as const, actor: c.author, content: c.body, createdAt: c.createdAt, @@ -100,60 +124,54 @@ export default function IssueDetailPage({ return (
- {/* Left column — content */} + {/* ---- Left: Content ---- */}
- {/* Breadcrumb */} -
+ {/* Breadcrumb bar */} +
- Issues - - {issue.key} + + {issue.key}
-
+
{/* Title */} -

{issue.title}

+

{issue.title}

{/* Description */} {issue.description && ( -
+
{issue.description}
)} - {/* Activity section */} + {/* Activity */}
-

Activity

-
+
+

+ Activity +

+
+ +
{timeline.map((entry) => - entry.type === "comment" ? ( -
-
- {entry.actor.type === "agent" ? ( - - ) : ( - entry.actor.avatar.charAt(0) - )} -
+ entry.kind === "comment" ? ( +
+
- - + + {entry.actor.name} + + {timeAgo(entry.createdAt)}
-
+
{entry.content}
@@ -161,24 +179,28 @@ export default function IssueDetailPage({ ) : (
-
- +
+
- + + {entry.actor.name} + {entry.content} - {timeAgo(entry.createdAt)} + + {timeAgo(entry.createdAt)} +
) )} - {/* Comment input placeholder */} -
-
- + {/* Comment placeholder */} +
+
+
-
+
Leave a comment...
@@ -187,102 +209,57 @@ export default function IssueDetailPage({
- {/* Right column — properties sidebar */} -
-
- {/* Status */} -
-
Status
-
- - - {statusCfg.label} - -
-
+ {/* ---- Right: Properties ---- */} +
+
+ Properties +
- {/* Priority */} -
-
Priority
-
- - {priorityCfg.shortLabel} - - {priorityCfg.label} -
-
+
+ + + + {statusCfg.label} + + - {/* Assignee */} -
-
Assignee
+ + + {priorityCfg.label} + + + {issue.assignee ? ( -
-
- {issue.assignee.type === "agent" ? ( - - ) : ( - issue.assignee.avatar.charAt(0) - )} -
- {issue.assignee.name} - {issue.assignee.type === "agent" && ( - Agent - )} -
+ <> + + {issue.assignee.name} + ) : ( - Unassigned + Unassigned )} -
+ - {/* Due Date */} -
-
Due Date
-
- - - {formatDate(issue.dueDate)} - -
-
+ + + + {formatDate(issue.dueDate)} + + - {/* Creator */} -
-
Created by
-
-
- {issue.creator.type === "agent" ? ( - - ) : ( - issue.creator.avatar.charAt(0) - )} -
- {issue.creator.name} -
-
+ + + {issue.creator.name} + - {/* Dates */} -
-
Created
- {formatDate(issue.createdAt)} -
-
-
Updated
- {formatDate(issue.updatedAt)} -
+ + {formatDate(issue.createdAt)} + + + + {formatDate(issue.updatedAt)} +