From 6d237eccf75bd5032c71d0b917bdfef5216ae427 Mon Sep 17 00:00:00 2001 From: Tomas Dvorak Date: Thu, 17 Sep 2026 18:28:26 +0200 Subject: [PATCH] feat: demo-data parity for databases and cron tab Adds demoDatabases fixtures (postgres/redis/clickhouse) wired into /databases?demo=1 and demoCronJobsByService fixtures for the service Cron tab, so demo mode no longer renders empty sections on the new surfaces. Authored By: TDvorak Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- ROADMAP.md | 8 +- app/frontend/src/features/secondary/pages.tsx | 6 +- .../service/pages/ServiceDetailPage.tsx | 6 +- app/frontend/src/lib/demo-data.ts | 100 +++++++++++++++++- 4 files changed, 112 insertions(+), 8 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index a3dcaa7..a926cc9 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -440,9 +440,11 @@ security scans produce real reports, not empty tables. events live in process memory — a backend restart wipes them and reverts replicas to policy minimums on next registration. Persist to Postgres before leaving beta. -- [ ] **Demo-data parity for new pages**: `demo-data.ts` covers Projects/ - Templates but the new Databases page and service Cron tab have no demo - fixtures — add them so `?demo=1` doesn't show empty sections. +- [x] **Demo-data parity for new pages**: `demoDatabases` fixture wired + into `/databases?demo=1`; `demoCronJobsByService` fixtures wired into + the service Cron tab (worker + api demo services). Scaling, Previews, + HA and Security sections still show empty in demo mode — acceptable: + those are interaction surfaces, not dashboards. - [ ] **CI**: GitHub Actions — build, lint, typecheck, tests, compose boot smoke; publish container images to GHCR with semver tags. - [ ] **Release**: `v1.0.0` tag, changelog, release notes, screenshots refresh diff --git a/app/frontend/src/features/secondary/pages.tsx b/app/frontend/src/features/secondary/pages.tsx index e68379d..6578109 100644 --- a/app/frontend/src/features/secondary/pages.tsx +++ b/app/frontend/src/features/secondary/pages.tsx @@ -47,6 +47,7 @@ import { type DatabaseEntity, type FailoverPolicy, } from '@/lib/api-client'; +import { demoDatabases } from '@/lib/demo-data'; import { formatRelative } from '@/lib/time'; import { getAuthBaseUrl, signOutAuthSession } from '@/lib/auth-client'; import { useBuildUpdates } from '@/lib/use-build-updates'; @@ -1535,12 +1536,15 @@ const dbStatusClass: Record = { export function DatabasesPage() { const queryClient = useQueryClient(); + const [searchParams] = useSearchParams(); + const isDemoMode = searchParams.get('demo') === '1'; const [expandedId, setExpandedId] = useState(null); const [bindDb, setBindDb] = useState(null); const databasesQuery = useQuery({ queryKey: ['databases'], queryFn: listDatabases, refetchInterval: 15_000, + enabled: !isDemoMode, }); const invalidate = () => queryClient.invalidateQueries({ queryKey: ['databases'] }); @@ -1559,7 +1563,7 @@ export function DatabasesPage() { onSuccess: () => window.setTimeout(invalidate, 3000), }); - const databases = databasesQuery.data ?? []; + const databases = isDemoMode ? demoDatabases : databasesQuery.data ?? []; return (
diff --git a/app/frontend/src/features/service/pages/ServiceDetailPage.tsx b/app/frontend/src/features/service/pages/ServiceDetailPage.tsx index fadb41f..5b40144 100644 --- a/app/frontend/src/features/service/pages/ServiceDetailPage.tsx +++ b/app/frontend/src/features/service/pages/ServiceDetailPage.tsx @@ -30,7 +30,7 @@ import { updateServiceVariables, type CronJobEntity, } from '@/lib/api-client'; -import { getDemoProjectById, getDemoServiceById } from '@/lib/demo-data'; +import { getDemoProjectById, getDemoServiceById, getDemoCronJobsByService } from '@/lib/demo-data'; import { parseDotenv, validateVariableRows, type VariableDraft } from '../variable-utils'; import { formatBytes, formatDate, formatRelative, seededMetric } from '@/lib/time'; import { EnhancedMetricCard, LineAreaChart, DonutChart } from '@/shared/components'; @@ -1290,14 +1290,14 @@ export function ServiceDetailPage() {
- ) : (cronJobsQuery.data ?? []).length === 0 ? ( + ) : (isDemoMode ? getDemoCronJobsByService(serviceId) : cronJobsQuery.data ?? []).length === 0 ? (

No cron jobs configured.

Create a job to run commands on a schedule inside this service's container.

) : (
- {(cronJobsQuery.data ?? []).map((job) => ( + {(isDemoMode ? getDemoCronJobsByService(serviceId) : cronJobsQuery.data ?? []).map((job) => (