From e2edc6ceb847bc7a90517c5d4575d1fe9fbdb90d Mon Sep 17 00:00:00 2001 From: Anso Date: Wed, 6 May 2026 21:18:31 -0400 Subject: [PATCH] chore(frontend): expose Routing and Deployments tabs by default (#955) Drop the SENCHO_EXPERIMENTAL gate from the Fleet Routing and Deployments tabs so they ship in the default UI. Both have been verified production-ready and promoted out of experimental. Routing trigger and content are now wrapped only by isAdmiral plus the existing AdmiralGate. Deployments trigger and content are wrapped by isPaid (Skipper+); Community users no longer see the tab at all, mirroring the Routing pattern. Federation and Secrets remain inside the experimental block as dev-only previews. Removes the SoonBadge component and "Coming soon" pill from the preview placeholder so the tab bar shows only ready, tier-appropriate tabs without ambiguous SOON labels. --- frontend/src/components/FleetView.tsx | 43 ++++++++----------- .../components/fleet/FleetSoonPlaceholder.tsx | 21 ++------- 2 files changed, 21 insertions(+), 43 deletions(-) diff --git a/frontend/src/components/FleetView.tsx b/frontend/src/components/FleetView.tsx index edcc82fb..2fd72584 100644 --- a/frontend/src/components/FleetView.tsx +++ b/frontend/src/components/FleetView.tsx @@ -20,7 +20,7 @@ import { useLicense } from '@/context/LicenseContext'; import { AdmiralGate } from './AdmiralGate'; import FleetSnapshots from './FleetSnapshots'; import { FleetConfiguration } from './fleet/FleetConfiguration'; -import { FleetSoonPlaceholder, SoonBadge } from './fleet/FleetSoonPlaceholder'; +import { FleetSoonPlaceholder } from './fleet/FleetSoonPlaceholder'; import { RoutingTab } from './fleet/RoutingTab'; import { DeploymentsTab } from './blueprints/DeploymentsTab'; @@ -73,7 +73,7 @@ export function FleetView({ onNavigateToNode }: FleetViewProps) { Snapshots - {isAdmiral && experimental && ( + {isAdmiral && ( Traffic · Routing @@ -85,25 +85,24 @@ export function FleetView({ onNavigateToNode }: FleetViewProps) { Status + {isPaid && ( + + + Deployments + + + )} {experimental && ( <> - - - Deployments - {!isPaid && } - - Federation - Secrets - @@ -163,7 +162,7 @@ export function FleetView({ onNavigateToNode }: FleetViewProps) { - {isAdmiral && experimental && ( + {isAdmiral && ( @@ -173,25 +172,17 @@ export function FleetView({ onNavigateToNode }: FleetViewProps) { + {isPaid && ( + + + + )} {experimental && ( <> - - {isPaid ? ( - - ) : ( - } - kicker="Deployments · Blueprints" - title="Declare once. Distribute everywhere." - description="Pick nodes by label, drop in a docker-compose, and Sencho keeps the matching nodes in sync. Drift detection always on; auto-fix optional." - plannedActions={['Author', 'Target', 'Reconcile', 'Snapshot+evict']} - /> - )} - } - kicker="Federation · Coming soon" + kicker="Federation" title="The fleet as one logical surface" description="Pin policies, drain a node for maintenance, weight-aware scheduling. This stack runs on whichever node has capacity." plannedActions={['Pin policy', 'Drain node', 'Cordon', 'Capacity plan']} @@ -200,7 +191,7 @@ export function FleetView({ onNavigateToNode }: FleetViewProps) { } - kicker="Secrets · Coming soon" + kicker="Secrets" title="One source of truth for env, creds and certs" description="Push to selected nodes, rotate centrally, audit who-saw-what. Solves silent drift across copies." plannedActions={['Sync env', 'Rotate', 'Audit', 'Pin to nodes']} diff --git a/frontend/src/components/fleet/FleetSoonPlaceholder.tsx b/frontend/src/components/fleet/FleetSoonPlaceholder.tsx index 24136477..f0572c68 100644 --- a/frontend/src/components/fleet/FleetSoonPlaceholder.tsx +++ b/frontend/src/components/fleet/FleetSoonPlaceholder.tsx @@ -1,13 +1,5 @@ import type { ReactNode } from 'react'; -export function SoonBadge() { - return ( - - SOON - - ); -} - interface FleetSoonPlaceholderProps { icon: ReactNode; kicker: string; @@ -26,16 +18,11 @@ export function FleetSoonPlaceholder({ return (
-
-
- - {icon} - - {kicker} -
- - Coming soon +
+ + {icon} + {kicker}