import { Server, Search, RotateCcw } from 'lucide-react'; import { Skeleton } from '@/components/ui/skeleton'; import { Button } from '@/components/ui/button'; import { FleetTopology } from '../fleet/FleetTopology'; import { NodeCard } from './NodeCard'; import { OverviewToolbar } from './OverviewToolbar'; import type { FleetTopologyNode, LayoutMode, SavedPositions } from '@/lib/fleet-topology-layout'; import type { Label as StackLabel } from '../label-types'; import type { Node } from '@/context/NodeContext'; import type { FleetNode, NodeUpdateStatus, ViewMode, FleetPreferences, FleetPaletteEntry } from './types'; interface OverviewTabProps { loading: boolean; nodes: FleetNode[]; processedNodes: FleetNode[]; allNodes: FleetNode[]; topologyNodes: FleetTopologyNode[]; viewMode: ViewMode; onViewModeChange: (mode: ViewMode) => void; searchQuery: string; onSearchQueryChange: (q: string) => void; prefs: FleetPreferences; onPrefsChange: (update: Partial) => void; fleetPalette: FleetPaletteEntry[]; labelFilters: Set; onLabelFiltersChange: (filters: Set) => void; onClearFilters: () => void; fleetStackLabelMap: Record>; updateStatusMap: Map; onNavigateToNode: (nodeId: number, stackName: string) => void; onUpdate?: (nodeId: number) => void; updatingNodeId: number | null; onRetryUpdate?: (nodeId: number) => void; onDismissUpdate?: (nodeId: number) => void; onCordonChange?: () => void; onEditNode?: (node: Node) => void; onDeleteNode?: (node: Node) => void; isPaid: boolean; topologyMode: LayoutMode; onTopologyModeChange: (mode: LayoutMode) => void; topologyPositions: SavedPositions; onTopologyPositionsChange: (positions: SavedPositions) => void; } export function OverviewTab({ loading, nodes, processedNodes, allNodes, topologyNodes, viewMode, onViewModeChange, searchQuery, onSearchQueryChange, prefs, onPrefsChange, fleetPalette, labelFilters, onLabelFiltersChange, onClearFilters, fleetStackLabelMap, updateStatusMap, onNavigateToNode, onUpdate, updatingNodeId, onRetryUpdate, onDismissUpdate, onCordonChange, onEditNode, onDeleteNode, isPaid, topologyMode, onTopologyModeChange, topologyPositions, onTopologyPositionsChange, }: OverviewTabProps) { return ( <> {loading && (
{Array.from({ length: 3 }).map((_, i) => (
))}
)} {!loading && nodes.length === 0 && (

No nodes configured

Add a node to see your fleet here.

)} {!loading && nodes.length > 0 && ( <> {viewMode === 'topology' && processedNodes.length > 0 ? ( onNavigateToNode(id, '')} isPaid={isPaid} mode={topologyMode} onModeChange={onTopologyModeChange} savedPositions={topologyPositions} onPositionsChange={onTopologyPositionsChange} /> ) : processedNodes.length > 0 ? (
{allNodes.map(node => ( ))}
) : (

No nodes match your filters

Try adjusting your search or filter criteria.

)}

Auto-refreshing every 30 seconds

)} ); }