diff --git a/src/app/projects/[projectId]/environments/[environmentId]/components/toolbar/EnvironmentContainersToolbar.tsx b/src/app/projects/[projectId]/environments/[environmentId]/components/toolbar/EnvironmentContainersToolbar.tsx index 5e0adf1..afecba4 100644 --- a/src/app/projects/[projectId]/environments/[environmentId]/components/toolbar/EnvironmentContainersToolbar.tsx +++ b/src/app/projects/[projectId]/environments/[environmentId]/components/toolbar/EnvironmentContainersToolbar.tsx @@ -2,6 +2,7 @@ import SearchField from "@/components/SearchField"; import { Box, ChevronDown, + CloudSyncIcon, Database, Loader2, Plus, @@ -163,6 +164,23 @@ export default function EnvironmentContainersToolbar({ Deploy Database + ) : null} diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/advanced/AdvancedSummaryCard.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/advanced/AdvancedSummaryCard.tsx index 1f07898..f7e7a0f 100644 --- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/advanced/AdvancedSummaryCard.tsx +++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/advanced/AdvancedSummaryCard.tsx @@ -12,7 +12,9 @@ interface AdvancedSummaryCardProps { item: AdvancedSummary; } -export default function AdvancedSummaryCard({ item }: AdvancedSummaryCardProps) { +export default function AdvancedSummaryCard({ + item, +}: AdvancedSummaryCardProps) { return (
-
-
+ */} -
@@ -355,90 +351,7 @@ export default function AdvancedTabPanel({ ))}
- - - -
- - - -
-

- Destructive actions require confirmation -

-

- Remove, reset, and cleanup operations stay behind explicit - confirmation dialogs before they execute. -

-
-
- - -
-
-
+ */}
); } diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/deployments/DeploymentsTabPanel.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/deployments/DeploymentsTabPanel.tsx index b44a219..4e022b3 100644 --- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/deployments/DeploymentsTabPanel.tsx +++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/deployments/DeploymentsTabPanel.tsx @@ -9,7 +9,6 @@ import { ExternalLink, GitBranch, GitCommit, - Package, Rocket, XCircle, } from "lucide-react"; @@ -242,7 +241,6 @@ export default function DeploymentsTabPanel({ Branch Duration Deployed At - Actions @@ -269,16 +267,6 @@ export default function DeploymentsTabPanel({ {deployment.duration} {deployment.deployedAt} - - - ))} @@ -356,27 +344,6 @@ export default function DeploymentsTabPanel({ - - -
- -

- Deployment history is currently derived from the real container - record. A permanent deployment history API is not available yet, so - only the current deployment snapshot is shown here. -

-
-
); } diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/environment/EnvironmentTabPanel.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/environment/EnvironmentTabPanel.tsx index 251a658..c572361 100644 --- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/environment/EnvironmentTabPanel.tsx +++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/environment/EnvironmentTabPanel.tsx @@ -1,14 +1,11 @@ "use client"; import { useMemo, useState } from "react"; -import TablePagination from "@/components/TablePagination"; import { useTablePagination } from "@/lib/use-table-pagination"; import { CheckCircle2, ClipboardCheck, - KeyRound, Loader2, - LockKeyhole, RotateCcw, Save, ShieldAlert, @@ -178,7 +175,7 @@ export default function EnvironmentTabPanel({ return (
-
( ))} -
+ */}
@@ -444,245 +442,6 @@ export default function EnvironmentTabPanel({
- -
- - {environment.variables.length > 0 ? ( - <> -
- - - - - - - - - - - - - {pagination.paginatedItems.map((variable) => ( - - - - - - - - - ))} - -
KeyValueScopeSourceRequiredSensitive
- - {variable.key} - - {variable.value} - {variable.scope}{variable.source} - - {variable.required ? "Required" : "Optional"} - - - - {variable.sensitive ? "Masked" : "Plain"} - -
-
- - - ) : ( -
- -
-

- No environment variables detected -

-

- This container has no stored deploy variables or runtime - inspect variables available. -

-
-
- )} -
- - -
- {environment.checks.map((check) => ( -
- - {check.status === "Ready" ? ( - - ) : check.status === "Missing" ? ( - - ) : ( - - )} - -
-
-

- {check.label} -

- - {check.status} - -
-

- {check.description} -

-
-
- ))} -
-
-
- -
- {environment.groups.map((group) => ( - -

- {group.description} -

-
- {group.items.map((item) => ( -
- - {item.label} - - - {item.value} - -
- ))} -
-
- ))} -
); } diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/logs/LogsTabPanel.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/logs/LogsTabPanel.tsx index 545be23..7fc0908 100644 --- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/logs/LogsTabPanel.tsx +++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/logs/LogsTabPanel.tsx @@ -28,21 +28,25 @@ const levelColor: Record = { DEBUG: "#38bdf8", }; -const sourceStatusClass: Record = - { - Streaming: "badge-online", - Paused: "badge-warning", - Unavailable: "badge-danger", - }; +const sourceStatusClass: Record< + LogsTabData["sources"][number]["status"], + string +> = { + Streaming: "badge-online", + Paused: "badge-warning", + Unavailable: "badge-danger", +}; -const summaryToneColor: Record = - { - blue: "var(--accent-blue)", - green: "var(--accent-green)", - purple: "var(--accent-purple)", - amber: "var(--accent-yellow)", - cyan: "var(--accent-cyan)", - }; +const summaryToneColor: Record< + LogsTabData["summaries"][number]["tone"], + string +> = { + blue: "var(--accent-blue)", + green: "var(--accent-green)", + purple: "var(--accent-purple)", + amber: "var(--accent-yellow)", + cyan: "var(--accent-cyan)", +}; export default function LogsTabPanel({ logs, @@ -198,8 +202,7 @@ export default function LogsTabPanel({
{line.level} - - {line.source} - + {line.source} {line.message} {line.traceId ?? ""} @@ -356,7 +357,7 @@ export default function LogsTabPanel({
-
- + {source.status} @@ -455,7 +458,7 @@ export default function LogsTabPanel({ ))} - + */} ); } diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/AppOverview.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/AppOverview.tsx index 30a1be9..ede0fb1 100644 --- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/AppOverview.tsx +++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/AppOverview.tsx @@ -22,13 +22,19 @@ export default function AppOverview({
-
+
-
-
+
-
); diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/RecentLogsPanel.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/RecentLogsPanel.tsx index f066fc7..ae0d9b4 100644 --- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/RecentLogsPanel.tsx +++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/overview/RecentLogsPanel.tsx @@ -79,13 +79,13 @@ export default function RecentLogsPanel({ ))} - + */} ); } diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/runtime/RuntimeTabPanel.tsx b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/runtime/RuntimeTabPanel.tsx index 37e5d5d..559e88b 100644 --- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/runtime/RuntimeTabPanel.tsx +++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/components/runtime/RuntimeTabPanel.tsx @@ -181,7 +181,7 @@ export default function RuntimeTabPanel({ runtime }: RuntimeTabPanelProps) { ) : (
-
))} -
+ */} -
-
+ */} -
-
+ */} ); } diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/advanced-data.ts b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/advanced-data.ts index 43659f2..2c0e2b4 100644 --- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/advanced-data.ts +++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/advanced-data.ts @@ -40,7 +40,8 @@ function formatBytes(value: number | null) { } function formatCpu(nanoCpus: number | null, cpuQuota: number | null) { - if (nanoCpus && nanoCpus > 0) return `${(nanoCpus / 1_000_000_000).toFixed(2)} vCPU`; + if (nanoCpus && nanoCpus > 0) + return `${(nanoCpus / 1_000_000_000).toFixed(2)} vCPU`; if (cpuQuota && cpuQuota > 0) return `${cpuQuota} quota`; return "Unlimited"; } @@ -105,16 +106,16 @@ export function createAdvancedData( tone: restartName === "no" ? "amber" : "green", }, { - label: "Runtime Guard", - value: runtimeLoaded ? "Loaded" : "Unavailable", - subvalue: runtimeLoaded ? "Docker inspect available" : "Using DB record", - tone: runtimeLoaded ? "cyan" : "amber", + label: "Root Filesystem", + value: readOnlyRootfs ? "Read-only" : "Writable", + subvalue: "Docker HostConfig.ReadonlyRootfs", + tone: readOnlyRootfs ? "green" : "amber", }, { - label: "Danger Zone", - value: "Protected", - subvalue: "Confirmation required", - tone: "purple", + label: "Auto Remove", + value: autoRemove ? "Enabled" : "Disabled", + subvalue: "Docker HostConfig.AutoRemove", + tone: autoRemove ? "amber" : "blue", }, ], metadata: [ @@ -134,7 +135,9 @@ export function createAdvancedData( label: "CPU Limit", value: formatCpu(nanoCpus, cpuQuota), usage: detail ? Math.min(100, Math.round(detail.stats.cpuPercent)) : 0, - helper: runtimeLoaded ? "Current Docker CPU sampling" : "Runtime unavailable", + helper: runtimeLoaded + ? "Current Docker CPU sampling" + : "Runtime unavailable", }, { label: "Memory Limit", @@ -147,7 +150,10 @@ export function createAdvancedData( value: pidsLimit && pidsLimit > 0 ? String(pidsLimit) : "Unlimited", usage: pidsLimit && pidsLimit > 0 - ? Math.min(100, Math.round((detail?.stats.pids ?? 0) / pidsLimit * 100)) + ? Math.min( + 100, + Math.round(((detail?.stats.pids ?? 0) / pidsLimit) * 100), + ) : 0, helper: `${detail?.stats.pids ?? 0} process ID(s) currently visible`, }, @@ -202,7 +208,8 @@ export function createAdvancedData( { id: "reconcile-runtime", label: "Reconcile runtime state", - description: "Stored metadata can be refreshed from Docker runtime data.", + description: + "Stored metadata can be refreshed from Docker runtime data.", enabled: true, }, ], diff --git a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/deployments-data.ts b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/deployments-data.ts index cdc9884..03d197a 100644 --- a/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/deployments-data.ts +++ b/src/app/projects/[projectId]/environments/[environmentId]/containers/[containerId]/data/deployments-data.ts @@ -53,6 +53,16 @@ function getBranch(container: Container) { return "-"; } +function getImageTag(image: string) { + if (!image.trim()) return "-"; + if (image.includes("@")) return "digest"; + + const lastSegment = image.split("/").at(-1) ?? image; + const tagIndex = lastSegment.lastIndexOf(":"); + + return tagIndex >= 0 ? lastSegment.slice(tagIndex + 1) || "latest" : "latest"; +} + export function createDeploymentsData( container: Container, detail: ContainerDetails | null, @@ -88,10 +98,10 @@ export function createDeploymentsData( tone: isSuccessful ? "green" : "amber", }, { - label: "Success Rate", - value: isSuccessful ? "100%" : "0%", - subvalue: "Based on current container record", - tone: isSuccessful ? "green" : "amber", + label: "Image Tag", + value: getImageTag(container.image), + subvalue: container.image, + tone: "purple", }, { label: "Deploy Mode",