fix: nice-to-have polish — breadcrumbs, close button, status badges
Some checks failed
CI / cleanup-branch (push) Has been skipped
CI / build (push) Failing after 40s
CI / docker (push) Has been skipped
CI / deploy (push) Has been skipped
CI / deploy-feature (push) Has been skipped
CI / cleanup-branch (pull_request) Has been skipped
CI / build (pull_request) Failing after 35s
CI / docker (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / deploy-feature (pull_request) Has been skipped
Some checks failed
CI / cleanup-branch (push) Has been skipped
CI / build (push) Failing after 40s
CI / docker (push) Has been skipped
CI / deploy (push) Has been skipped
CI / deploy-feature (push) Has been skipped
CI / cleanup-branch (pull_request) Has been skipped
CI / build (pull_request) Failing after 35s
CI / docker (pull_request) Has been skipped
CI / deploy (pull_request) Has been skipped
CI / deploy-feature (pull_request) Has been skipped
- 7.1: Add deployment status badge (StatusDot + Badge) to AppsTab app
list, sourced from catalog.deployment.status via slug lookup
- 7.3: Add X close button to top-right of exchange detail right panel
in ExchangesPage (position:absolute, triggers handleClearSelection)
- 7.5: PunchcardHeatmap shows "Requires at least 2 days of data"
when timeRangeMs < 2 days; DashboardL1 passes the range down
- 7.6: Command palette exchange results truncate IDs to ...{last8}
matching the exchanges table display
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -36,7 +36,7 @@ import type { Environment } from '../../api/queries/admin/environments';
|
||||
import { useApplicationConfig, useUpdateApplicationConfig, useProcessorRouteMapping } from '../../api/queries/commands';
|
||||
import type { ApplicationConfig, TapDefinition } from '../../api/queries/commands';
|
||||
import { useCatalog } from '../../api/queries/catalog';
|
||||
import type { CatalogApp, CatalogRoute } from '../../api/queries/catalog';
|
||||
import type { CatalogApp } from '../../api/queries/catalog';
|
||||
import { DeploymentProgress } from '../../components/DeploymentProgress';
|
||||
import { timeAgo } from '../../utils/format-utils';
|
||||
import { applyTracedProcessorUpdate, applyRouteRecordingUpdate } from '../../utils/config-draft-utils';
|
||||
@@ -89,12 +89,22 @@ function AppListView({ selectedEnv, environments }: { selectedEnv: string | unde
|
||||
const { data: allApps = [], isLoading: allLoading } = useAllApps();
|
||||
const envId = useMemo(() => environments.find((e) => e.slug === selectedEnv)?.id, [environments, selectedEnv]);
|
||||
const { data: envApps = [], isLoading: envLoading } = useApps(envId);
|
||||
const { data: catalog = [] } = useCatalog(selectedEnv);
|
||||
|
||||
const apps = selectedEnv ? envApps : allApps;
|
||||
const isLoading = selectedEnv ? envLoading : allLoading;
|
||||
|
||||
const envMap = useMemo(() => new Map(environments.map((e) => [e.id, e])), [environments]);
|
||||
|
||||
// Build slug → deployment status map from catalog
|
||||
const deployStatusMap = useMemo(() => {
|
||||
const map = new Map<string, string>();
|
||||
for (const app of catalog as CatalogApp[]) {
|
||||
if (app.deployment) map.set(app.slug, app.deployment.status);
|
||||
}
|
||||
return map;
|
||||
}, [catalog]);
|
||||
|
||||
type AppRow = App & { id: string; envName: string };
|
||||
const rows: AppRow[] = useMemo(
|
||||
() => apps.map((a) => ({ ...a, envName: envMap.get(a.environmentId)?.displayName ?? '?' })),
|
||||
@@ -110,13 +120,27 @@ function AppListView({ selectedEnv, environments }: { selectedEnv: string | unde
|
||||
...(!selectedEnv ? [{ key: 'envName', header: 'Environment', sortable: true,
|
||||
render: (_v: unknown, row: AppRow) => <Badge label={row.envName} color={'auto' as const} />,
|
||||
}] : []),
|
||||
{ key: 'slug', header: 'Status', sortable: false,
|
||||
render: (_v: unknown, row: AppRow) => {
|
||||
const status = deployStatusMap.get(row.slug);
|
||||
if (!status) return <span className={styles.cellMeta}>—</span>;
|
||||
const dotVariant = DEPLOY_STATUS_DOT[status] ?? 'dead';
|
||||
const badgeColor = STATUS_COLORS[status] ?? 'auto';
|
||||
return (
|
||||
<span style={{ display: 'inline-flex', alignItems: 'center', gap: 5 }}>
|
||||
<StatusDot variant={dotVariant} />
|
||||
<Badge label={status} color={badgeColor} />
|
||||
</span>
|
||||
);
|
||||
},
|
||||
},
|
||||
{ key: 'updatedAt', header: 'Updated', sortable: true,
|
||||
render: (_v: unknown, row: AppRow) => <span className={styles.cellMeta}>{timeAgo(row.updatedAt)}</span>,
|
||||
},
|
||||
{ key: 'createdAt', header: 'Created', sortable: true,
|
||||
render: (_v: unknown, row: AppRow) => <span className={styles.cellMeta}>{new Date(row.createdAt).toLocaleDateString()}</span>,
|
||||
},
|
||||
], [selectedEnv]);
|
||||
], [selectedEnv, deployStatusMap]);
|
||||
|
||||
if (isLoading) return <PageLoader />;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user