@@ -10,15 +10,15 @@ import type {
1010 RequirementMap ,
1111 Task ,
1212} from "@comp/db/types" ;
13- import { Card , CardContent , CardDescription , CardHeader , CardTitle } from "@comp/ui/card" ;
1413import { Button } from "@comp/ui/button" ;
14+ import { Tabs , TabsContent , TabsList , TabsTrigger } from "@comp/ui/tabs" ;
1515import {
1616 DropdownMenu ,
1717 DropdownMenuContent ,
1818 DropdownMenuItem ,
1919 DropdownMenuTrigger ,
2020} from "@comp/ui/dropdown-menu" ;
21- import { MoreVertical , PencilIcon , Trash2 } from "lucide-react" ;
21+ import { MoreVertical , Trash2 } from "lucide-react" ;
2222import { useState } from "react" ;
2323import { ControlDeleteDialog } from "./ControlDeleteDialog" ;
2424import { useParams } from "next/navigation" ;
@@ -79,67 +79,99 @@ export function SingleControl({
7979
8080 return (
8181 < div className = "space-y-6" >
82- < Card >
83- < CardHeader >
84- < CardTitle >
85- < div className = "flex items-center justify-between gap-2" >
86- < div className = "flex items-center gap-2" >
87- { control . name }
88- </ div >
89- < div className = "flex items-center gap-2" >
90- < StatusIndicator status = { progressStatus } />
91- < DropdownMenu open = { dropdownOpen } onOpenChange = { setDropdownOpen } >
92- < DropdownMenuTrigger asChild >
93- < Button
94- size = "icon"
95- variant = "ghost"
96- className = "p-2 m-0 size-auto"
97- >
98- < MoreVertical className = "h-4 w-4" />
99- </ Button >
100- </ DropdownMenuTrigger >
101- < DropdownMenuContent align = "end" >
102- < DropdownMenuItem
103- onClick = { ( ) => {
104- setDropdownOpen ( false ) ;
105- setDeleteDialogOpen ( true ) ;
106- } }
107- className = "text-destructive focus:text-destructive"
108- >
109- < Trash2 className = "h-4 w-4 mr-2" />
110- Delete
111- </ DropdownMenuItem >
112- </ DropdownMenuContent >
113- </ DropdownMenu >
114- </ div >
82+ { /* Control Header */ }
83+ < div className = "space-y-3" >
84+ < div className = "flex items-start justify-between gap-4" >
85+ < div className = "min-w-0 flex-1" >
86+ < div className = "flex items-center gap-2 mb-2" >
87+ < h1 className = "text-xl font-semibold truncate" > { control . name } </ h1 >
88+ < StatusIndicator status = { progressStatus } />
11589 </ div >
116- </ CardTitle >
117- < CardDescription >
118- { control . description }
119- </ CardDescription >
120- </ CardHeader >
121- </ Card >
122- < RequirementsTable
123- requirements = { control . requirementsMapped }
124- orgId = { orgIdFromParams }
125- />
126- < PoliciesTable
127- policies = { relatedPolicies }
128- orgId = { orgIdFromParams }
129- controlId = { controlIdFromParams }
130- />
131- < TasksTable
132- tasks = { relatedTasks }
133- orgId = { orgIdFromParams }
134- controlId = { controlIdFromParams }
135- />
90+ { control . description && (
91+ < p className = "text-sm text-muted-foreground leading-relaxed" >
92+ { control . description }
93+ </ p >
94+ ) }
95+ </ div >
96+ < DropdownMenu open = { dropdownOpen } onOpenChange = { setDropdownOpen } >
97+ < DropdownMenuTrigger asChild >
98+ < Button
99+ size = "sm"
100+ variant = "ghost"
101+ className = "shrink-0"
102+ >
103+ < MoreVertical className = "h-4 w-4" />
104+ </ Button >
105+ </ DropdownMenuTrigger >
106+ < DropdownMenuContent align = "end" >
107+ < DropdownMenuItem
108+ onClick = { ( ) => {
109+ setDropdownOpen ( false ) ;
110+ setDeleteDialogOpen ( true ) ;
111+ } }
112+ className = "text-destructive focus:text-destructive"
113+ >
114+ < Trash2 className = "h-4 w-4 mr-2" />
115+ Delete
116+ </ DropdownMenuItem >
117+ </ DropdownMenuContent >
118+ </ DropdownMenu >
119+ </ div >
120+ </ div >
121+
122+ { /* Tabbed Content */ }
123+ < Tabs defaultValue = "requirements" className = "space-y-4" >
124+ < TabsList className = "grid w-full grid-cols-3" >
125+ < TabsTrigger value = "requirements" className = "flex items-center gap-2" >
126+ < span > Requirements</ span >
127+ < span className = "text-xs bg-muted/50 px-1.5 py-0.5 rounded-xs tabular-nums" >
128+ { control . requirementsMapped . length }
129+ </ span >
130+ </ TabsTrigger >
131+ < TabsTrigger value = "policies" className = "flex items-center gap-2" >
132+ < span > Policies</ span >
133+ < span className = "text-xs bg-muted/50 px-1.5 py-0.5 rounded-xs tabular-nums" >
134+ { relatedPolicies . length }
135+ </ span >
136+ </ TabsTrigger >
137+ < TabsTrigger value = "tasks" className = "flex items-center gap-2" >
138+ < span > Tasks</ span >
139+ < span className = "text-xs bg-muted/50 px-1.5 py-0.5 rounded-xs tabular-nums" >
140+ { relatedTasks . length }
141+ </ span >
142+ </ TabsTrigger >
143+ </ TabsList >
144+
145+ < TabsContent value = "requirements" className = "space-y-0" >
146+ < RequirementsTable
147+ requirements = { control . requirementsMapped }
148+ orgId = { orgIdFromParams }
149+ />
150+ </ TabsContent >
151+
152+ < TabsContent value = "policies" className = "space-y-0" >
153+ < PoliciesTable
154+ policies = { relatedPolicies }
155+ orgId = { orgIdFromParams }
156+ controlId = { controlIdFromParams }
157+ />
158+ </ TabsContent >
159+
160+ < TabsContent value = "tasks" className = "space-y-0" >
161+ < TasksTable
162+ tasks = { relatedTasks }
163+ orgId = { orgIdFromParams }
164+ controlId = { controlIdFromParams }
165+ />
166+ </ TabsContent >
167+ </ Tabs >
136168
137169 { /* Delete Dialog */ }
138170 < ControlDeleteDialog
139171 isOpen = { deleteDialogOpen }
140172 onClose = { ( ) => setDeleteDialogOpen ( false ) }
141173 control = { control }
142174 />
143- </ div >
175+ </ div >
144176 ) ;
145177}
0 commit comments