diff --git a/ui/client-app/src/pages/NodesPage.js b/ui/client-app/src/pages/NodesPage.js index 75362a5..cf1d679 100644 --- a/ui/client-app/src/pages/NodesPage.js +++ b/ui/client-app/src/pages/NodesPage.js @@ -1,7 +1,6 @@ import React, { useState, useEffect, useCallback } from 'react'; import { getAdminNodes, adminCreateNode, adminUpdateNode, adminDeleteNode, - adminGrantNodeAccess, adminRevokeNodeAccess, adminDownloadNodeBundle, getUserAccessibleNodes, getAdminGroups, getNodeStreamUrl } from '../services/apiService'; @@ -9,7 +8,6 @@ import FileSystemNavigator from '../components/FileSystemNavigator'; const NodesPage = ({ user }) => { - const [activeTab, setActiveTab] = useState(user?.role === 'admin' ? 'manage' : 'status'); const [nodes, setNodes] = useState([]); const [groups, setGroups] = useState([]); const [loading, setLoading] = useState(true); @@ -70,7 +68,6 @@ }); setMeshStatus(statusMap); } else if (['task_start', 'task_complete', 'task_error', 'info'].includes(msg.event)) { - // Add to recent events log setRecentEvents(prev => [msg, ...prev].slice(0, 50)); } }; @@ -128,7 +125,8 @@ }; const NodeHealthMetrics = ({ nodeId, stats, compact = false }) => { - const isOnline = meshStatus[nodeId]?.status === 'online' || meshStatus[nodeId]?.status === 'idle' || meshStatus[nodeId]?.status === 'busy'; + const live = meshStatus[nodeId]; + const isOnline = live?.status === 'online' || live?.status === 'idle' || live?.status === 'busy'; if (!isOnline && compact) return null; const cpu = stats?.cpu_usage_percent || 0; @@ -199,24 +197,6 @@ )} - - {/* Tabs */} -
- {isAdmin && ( - - )} - -
{/* Main Content */} @@ -229,47 +209,48 @@
Error: {error}
- ) : activeTab === 'manage' ? ( - /* ADMIN MANAGEMENT VIEW */ -
+ ) : ( +
{nodes.map(node => (
{/* Top Row: Basic Info & Actions */}
-
- - - -
-
+
+
+
+ + {meshStatus[node.node_id]?.status || node.last_status || 'offline'} + +

{node.display_name}

-
- - {node.is_active ? 'Active' : 'Disabled'} - - - {node.node_id} +
+ ID: {node.node_id}
-
- +
+ {/* Active Toggle Switch */} +
+ + +
+
)} - {/* File System Explorer Section (Modular Navigator) */} {expandedFiles[node.node_id] && ( -
+
-
-

Node File Explorer

-
-
- Live gRPC -
-
+

Node File Explorer

Browse & synchronize files

@@ -421,9 +375,8 @@
)} - {/* Terminal Section */} {expandedTerminals[node.node_id] && ( -
+

Node Interactive Shell

Direct gRPC Proxy @@ -436,68 +389,27 @@
))}
-
- ) : ( - /* LIVE MONITOR VIEW (M6) */ -
- {/* Status Cards */} -
- {nodes.map(node => { - const live = meshStatus[node.node_id]; - const isOnline = live?.status === 'online' || live?.status === 'idle' || live?.status === 'busy'; - return ( -
-
- -
-
-

{node.display_name}

-

{node.node_id}

-
-
- - - {live?.status || (node.last_status || 'offline')} - -
-
- -
-
-
Tasks Running
-
{live?.stats?.active_worker_count || 0}
-
-
-
Uptime Score
-
{(live?.stats?.success_rate ? (live.stats.success_rate * 100).toFixed(1) : "100")}%
-
-
- - -
- ); - })} -
- - {/* Event Timeline */} -
-
-

+ {/* Event Timeline (Execution Live Bus) */} +
+
+

Execution Live Bus

+ Subscribed to task stream...
-
+
{recentEvents.length === 0 && (
Listening for mesh events...
)} {recentEvents.map((evt, i) => ( -
- [{evt.timestamp?.split('T')[1].split('.')[0]}] - {evt.node_id?.slice(0, 8)} - - {evt.label || evt.event}: {JSON.stringify(evt.data)} +
+ [{evt.timestamp?.split('T')[1].split('.')[0]}] + {evt.node_id?.slice(0, 8)} + + {evt.label || evt.event}: + {JSON.stringify(evt.data)}
))}