ui(deploy): pending-deploy badge + Start/Stop in page header
1. Add a 'Pending deploy' Badge next to the app name when there are local edits or the saved state differs from the last deploy. Makes the undeployed-changes state visible even when the user isn't looking at the tab asterisks. 2. Move Start/Stop buttons from StatusCard into the page header, next to Delete. Runs off the latest deployment's status — Stop when RUNNING/STARTING/DEGRADED, Start (triggers a redeploy of the last version) when STOPPED. DeploymentTab and StatusCard shed their onStop/onStart props. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { Badge, StatusDot, MonoText, Button } from '@cameleer/design-system';
|
||||
import { Badge, StatusDot, MonoText } from '@cameleer/design-system';
|
||||
import type { Deployment, AppVersion } from '../../../../api/queries/admin/apps';
|
||||
import { timeAgo } from '../../../../utils/format-utils';
|
||||
import styles from '../AppDeploymentPage.module.css';
|
||||
@@ -13,21 +13,13 @@ const DEPLOY_STATUS_DOT = {
|
||||
STOPPING: 'stale', STOPPED: 'dead', FAILED: 'error',
|
||||
} as const;
|
||||
|
||||
function formatBytes(bytes: number): string {
|
||||
if (bytes >= 1_048_576) return `${(bytes / 1_048_576).toFixed(1)} MB`;
|
||||
if (bytes >= 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
||||
return `${bytes} B`;
|
||||
}
|
||||
|
||||
interface Props {
|
||||
deployment: Deployment;
|
||||
version: AppVersion | null;
|
||||
externalUrl: string;
|
||||
onStop: () => void;
|
||||
onStart: () => void;
|
||||
}
|
||||
|
||||
export function StatusCard({ deployment, version, externalUrl, onStop, onStart }: Props) {
|
||||
export function StatusCard({ deployment, version, externalUrl }: Props) {
|
||||
const running = deployment.replicaStates?.filter((r) => r.status === 'RUNNING').length ?? 0;
|
||||
const total = deployment.replicaStates?.length ?? 0;
|
||||
|
||||
@@ -56,12 +48,6 @@ export function StatusCard({ deployment, version, externalUrl, onStop, onStart }
|
||||
{deployment.errorMessage}
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className={styles.statusCardActions}>
|
||||
{(deployment.status === 'RUNNING' || deployment.status === 'STARTING' || deployment.status === 'DEGRADED')
|
||||
&& <Button size="sm" variant="danger" onClick={onStop}>Stop</Button>}
|
||||
{deployment.status === 'STOPPED' && <Button size="sm" variant="secondary" onClick={onStart}>Start</Button>}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user