diff --git a/web/app/(dashboard)/dashboard/projects/[slug]/[env]/services/[serviceId]/page.tsx b/web/app/(dashboard)/dashboard/projects/[slug]/[env]/services/[serviceId]/page.tsx index 278395c..c0a41ea 100644 --- a/web/app/(dashboard)/dashboard/projects/[slug]/[env]/services/[serviceId]/page.tsx +++ b/web/app/(dashboard)/dashboard/projects/[slug]/[env]/services/[serviceId]/page.tsx @@ -126,6 +126,8 @@ export default function DeploymentsPage() { return (
+ + - -
0 ? Math.min((current + 1) / total, 1) : 0; + + return ( +
+
+
+ ); +} + interface DeploymentProgressProps { service: Service; changes: ConfigChange[]; @@ -253,19 +266,17 @@ export const DeploymentProgress = memo(function DeploymentProgress({ let content: React.ReactNode = null; if (barState.mode === "building") { + const buildStageIndex = ACTIVE_BUILD_STATUSES.indexOf(barState.buildStatus); + content = ( -
-
-
-
- -
-
-

Building

-

- {BUILD_STATUS_LABELS[barState.buildStatus] || "Building"} -

-
+
+
+
+ + Building + + {BUILD_STATUS_LABELS[barState.buildStatus] || "Building"} +
+
); } if (barState.mode === "deploying") { - const currentStage = STAGES[barState.stageIndex]; const isMigrating = !!service.migrationStatus; const isMigrationFailed = service.migrationStatus === "failed"; - let status = currentStage?.label || "Deploying"; - if (barState.stage === "health_check" && !service.healthCheckCmd) { - status = "Starting container"; - } - if (isMigrating && service.migrationStatus) { - status = - MIGRATION_STAGES[service.migrationStatus] || - service.migrationStatus || - "Migrating"; - } + const migrationStatus = + isMigrating && service.migrationStatus + ? MIGRATION_STAGES[service.migrationStatus] || service.migrationStatus + : null; content = ( -
-
-
- {isMigrationFailed ? ( -
- -
- ) : ( -
- -
- )} -
-

- {isMigrating ? "Migrating" : "Deploying"} -

-

{status}

-
+
+
+
+ + + {isMigrating ? "Migrating" : "Deploying"} + + {migrationStatus ? ( + + {migrationStatus} + + ) : null}
{isMigrating ? (
+ {!isMigrating ? ( + + ) : null}
); } @@ -351,9 +368,7 @@ export const DeploymentProgress = memo(function DeploymentProgress({ opacity: isVisible ? 1 : 0, }} > -
- {content &&
{content}
} -
+
{content}
); }); diff --git a/web/components/service/details/pending-changes-banner.tsx b/web/components/service/details/pending-changes-banner.tsx index e776a8e..b7ca45c 100644 --- a/web/components/service/details/pending-changes-banner.tsx +++ b/web/components/service/details/pending-changes-banner.tsx @@ -1,6 +1,6 @@ "use client"; -import { AlertTriangle, ArrowRight, Rocket } from "lucide-react"; +import { Rocket } from "lucide-react"; import { useRouter } from "next/navigation"; import { memo, useState } from "react"; import { useSWRConfig } from "swr"; @@ -72,60 +72,59 @@ export const PendingChangesBanner = memo(function PendingChangesBanner({ }} >
-
-
-
-
-
- -
-
-

- {hasChanges - ? `${changes.length} pending change${changes.length !== 1 ? "s" : ""}` - : "Ready to deploy"} -

- {hasChanges ? ( -
- {changes.map((change, index) => ( -
- - {change.field}: - - - {change.from} - - - - {change.to} - -
- ))} -
- ) : ( -

- This service has no active deployments. -

- )} -
-
- +
+
+
+ + + {hasChanges + ? `${changes.length} pending change${changes.length !== 1 ? "s" : ""}` + : "Ready to deploy"} +
+
+ {hasChanges ? ( +
+ {changes.map((change, index) => ( +
+ + {change.field} + + + + {change.from} + + + + {change.to} + + +
+ ))} +
+ ) : ( +

+ This service has no active deployments. +

+ )}
diff --git a/web/components/service/details/service-details-overview.tsx b/web/components/service/details/service-details-overview.tsx index 5bc2672..517dda7 100644 --- a/web/components/service/details/service-details-overview.tsx +++ b/web/components/service/details/service-details-overview.tsx @@ -440,16 +440,31 @@ function ServiceConfigPanel({ return (
-
-
- - - {overview.status.label} +
+
+
+ + + {overview.status.label} + +
+ + {formatInstanceSummary(overview)}
- - {formatInstanceSummary(overview)} - + {overview.serverSummaries.length === 0 ? ( +

No servers configured

+ ) : ( + overview.serverSummaries.map((server) => ( + + + {server.configured > 0 + ? `${server.running}/${server.configured} running` + : `${server.running} running`} + + + )) + )}
@@ -457,6 +472,13 @@ function ServiceConfigPanel({ + {service.volumes && service.volumes.length > 0 ? ( + + {service.volumes + .map((volume) => `${volume.name} → ${volume.containerPath}`) + .join(", ")} + + ) : null} {overview.source.branch ? ( {overview.source.branch} ) : null} @@ -465,31 +487,15 @@ function ServiceConfigPanel({ {service.githubRootDir} ) : null} - - {service.startCommand ? "Custom" : "Image default"} - - - {service.healthCheckCmd ? "Configured" : "None"} - - - {hasResourceLimits ? formatResources(service) : "Not set"} - -
- -
- {overview.serverSummaries.length === 0 ? ( -

No servers configured

- ) : ( - overview.serverSummaries.map((server) => ( - - - {server.configured > 0 - ? `${server.running}/${server.configured} running` - : `${server.running} running`} - - - )) - )} + {service.startCommand ? ( + Custom + ) : null} + {service.healthCheckCmd ? ( + Configured + ) : null} + {hasResourceLimits ? ( + {formatResources(service)} + ) : null}
@@ -513,21 +519,14 @@ function ServiceConfigPanel({ function ConfigRow({ label, children, - muted = false, }: { label: string; children: ReactNode; - muted?: boolean; }) { return (
{label} - + {children}