diff --git a/apps/web/features/issues/components/issue-detail.tsx b/apps/web/features/issues/components/issue-detail.tsx index 6be48bf8..63963fa3 100644 --- a/apps/web/features/issues/components/issue-detail.tsx +++ b/apps/web/features/issues/components/issue-detail.tsx @@ -16,6 +16,7 @@ import { Pencil, Trash2, UserMinus, + Users, X, } from "lucide-react"; import { toast } from "sonner"; @@ -53,6 +54,8 @@ import { TooltipTrigger, TooltipContent, } from "@/components/ui/tooltip"; +import { Popover, PopoverTrigger, PopoverContent } from "@/components/ui/popover"; +import { Checkbox } from "@/components/ui/checkbox"; import { ActorAvatar } from "@/components/common/actor-avatar"; import type { Issue, Comment, IssueSubscriber, UpdateIssueRequest, IssueStatus, IssuePriority } from "@/shared/types"; import { ALL_STATUSES, STATUS_CONFIG, PRIORITY_ORDER, PRIORITY_CONFIG } from "@/features/issues/config"; @@ -663,7 +666,69 @@ export function IssueDetail({ issueId, onDelete }: IssueDetailProps) { {/* Activity / Comments */}
-

Activity

+
+

Activity

+
+ + + + {subscribers.slice(0, 5).map((sub) => ( + + ))} + {subscribers.length > 5 && ( + + +{subscribers.length - 5} + + )} + {subscribers.length === 0 && ( + + + + )} + + +
+

Subscribers

+
+
+ {subscribers.map((sub) => { + const subName = getActorName(sub.user_type, sub.user_id); + return ( +
+ + + {subName} + {sub.reason !== "manual" && ( + {sub.reason} + )} +
+ ); + })} + {members + .filter((m) => !subscribers.some((s) => s.user_id === m.user_id)) + .map((m) => ( +
+ + + {m.name} +
+ ))} +
+
+
+
+
{comments.map((comment) => { @@ -941,27 +1006,6 @@ export function IssueDetail({ issueId, onDelete }: IssueDetailProps) {
}
- {/* Subscribers section */} -
-

Subscribers

-
- {subscribers.map((sub) => ( -
- - {getActorName(sub.user_type, sub.user_id)} - ({sub.reason}) -
- ))} -
- -