@@ -14,6 +14,7 @@ import {
1414} from "@/lib/rbac" ;
1515import Link from "next/link" ;
1616import { ContainerDetailsActions } from "@/components/docker/ContainerDetailsActions" ;
17+ import { ContainerEditPanel } from "@/components/docker/ContainerEditPanel" ;
1718
1819type Params = { params : Promise < { id : string } > } ;
1920
@@ -29,20 +30,32 @@ export default async function ContainerInspectPage({ params }: Params) {
2930 redirect ( "/containers" ) ;
3031 }
3132
32- let inspect : unknown = null ;
33+ let inspect : Record < string , unknown > | null = null ;
3334 let error : string | null = null ;
3435
3536 try {
36- inspect = await getContainerInspect ( id ) ;
37+ inspect = ( await getContainerInspect ( id ) ) as unknown as Record < string , unknown > ;
3738 } catch ( cause ) {
3839 error = cause instanceof Error ? cause . message : "Failed to inspect container" ;
3940 }
4041
42+ const state = ( inspect ?. State as { Running ?: boolean ; Status ?: string } | undefined ) ?? { } ;
43+ const name =
44+ typeof inspect ?. Name === "string"
45+ ? inspect . Name . replace ( / ^ \/ / , "" )
46+ : id . substring ( 0 , 12 ) ;
47+ const image = ( inspect ?. Config as { Image ?: string } | undefined ) ?. Image ?? "unknown" ;
48+ const restartPolicy =
49+ ( inspect ?. HostConfig as { RestartPolicy ?: { Name ?: string } } | undefined ) ?. RestartPolicy
50+ ?. Name ?? "no" ;
51+
4152 return (
4253 < div className = "space-y-6" >
4354 < div >
4455 < h1 className = "text-2xl font-bold tracking-tight" > Container Details</ h1 >
45- < p className = "text-muted-foreground text-sm mt-1 font-mono break-all" > { id } </ p >
56+ < p className = "text-muted-foreground text-sm mt-1" >
57+ < span className = "font-mono break-all" > { id } </ span >
58+ </ p >
4659 </ div >
4760
4861 { error ? (
@@ -51,15 +64,42 @@ export default async function ContainerInspectPage({ params }: Params) {
5164 </ div >
5265 ) : (
5366 < >
67+ < div className = "grid gap-4 md:grid-cols-4" >
68+ < div className = "rounded-lg border border-border bg-card p-4" >
69+ < div className = "text-xs text-muted-foreground" > Name</ div >
70+ < div className = "mt-1 text-sm font-semibold text-foreground font-mono break-all" > { name } </ div >
71+ </ div >
72+ < div className = "rounded-lg border border-border bg-card p-4" >
73+ < div className = "text-xs text-muted-foreground" > Status</ div >
74+ < div className = "mt-1 text-sm font-semibold text-foreground" > { state . Status ?? ( state . Running ? "running" : "stopped" ) } </ div >
75+ </ div >
76+ < div className = "rounded-lg border border-border bg-card p-4" >
77+ < div className = "text-xs text-muted-foreground" > Image</ div >
78+ < div className = "mt-1 text-sm font-semibold text-foreground font-mono break-all" > { image } </ div >
79+ </ div >
80+ < div className = "rounded-lg border border-border bg-card p-4" >
81+ < div className = "text-xs text-muted-foreground" > Restart Policy</ div >
82+ < div className = "mt-1 text-sm font-semibold text-foreground" > { restartPolicy } </ div >
83+ </ div >
84+ </ div >
85+
5486 < ContainerDetailsActions
5587 id = { id }
88+ isRunning = { ! ! state . Running }
5689 canStart = { canStartContainer ( perms , id ) }
5790 canStop = { canStopContainer ( perms , id ) }
5891 canRestart = { canRestartContainer ( perms , id ) }
5992 canDelete = { canDeleteContainer ( perms , id ) }
6093 />
6194
62- < div className = "grid gap-4 md:grid-cols-3" >
95+ < ContainerEditPanel
96+ id = { id }
97+ currentName = { name }
98+ restartPolicy = { restartPolicy }
99+ canEdit = { canRestartContainer ( perms , id ) || canDeleteContainer ( perms , id ) }
100+ />
101+
102+ < div className = "grid gap-4 md:grid-cols-2" >
63103 < Link
64104 href = { `/containers/${ id } /logs` }
65105 className = { `rounded-lg border border-border bg-card p-4 text-sm transition ${ canViewLogs ( perms , id ) ? "hover:bg-accent" : "opacity-50 pointer-events-none" } ` }
@@ -74,15 +114,7 @@ export default async function ContainerInspectPage({ params }: Params) {
74114 < div className = "font-semibold text-foreground" > Console</ div >
75115 < div className = "text-muted-foreground mt-1" > Interactive shell inside container</ div >
76116 </ Link >
77- < div className = "rounded-lg border border-border bg-card p-4 text-sm" >
78- < div className = "font-semibold text-foreground" > Inspect JSON</ div >
79- < div className = "text-muted-foreground mt-1" > Low-level metadata below</ div >
80- </ div >
81117 </ div >
82-
83- < pre className = "overflow-auto rounded-xl border border-border bg-card p-4 text-xs text-foreground whitespace-pre-wrap break-all" >
84- { JSON . stringify ( inspect , null , 2 ) }
85- </ pre >
86118 </ >
87119 ) }
88120 </ div >
0 commit comments