// Monitoring View Component class MonitoringViewComponent extends Component { constructor(container, viewModel, eventBus) { super(container, viewModel, eventBus); logger.debug('MonitoringViewComponent: Constructor called'); logger.debug('MonitoringViewComponent: Container:', container); logger.debug('MonitoringViewComponent: Container ID:', container?.id); // Track if we've already loaded data to prevent unnecessary reloads this.dataLoaded = false; } mount() { logger.debug('MonitoringViewComponent: Mounting...'); super.mount(); // Set up refresh button event listener this.setupRefreshButton(); // Only load data if we haven't already or if the view model is empty const clusterMembers = this.viewModel.get('clusterMembers'); if (!this.dataLoaded || !clusterMembers || clusterMembers.length === 0) { this.loadData(); } // Subscribe to view model changes this.setupSubscriptions(); } setupRefreshButton() { const refreshBtn = this.findElement('#refresh-monitoring-btn'); if (refreshBtn) { refreshBtn.addEventListener('click', () => { this.refreshData(); }); } } setupSubscriptions() { // Subscribe to cluster members changes this.viewModel.subscribe('clusterMembers', () => { this.render(); }); // Subscribe to node resources changes this.viewModel.subscribe('nodeResources', () => { this.render(); }); // Subscribe to cluster summary changes this.viewModel.subscribe('clusterSummary', () => { this.render(); }); // Subscribe to loading state changes this.viewModel.subscribe('isLoading', () => { this.render(); }); // Subscribe to error changes this.viewModel.subscribe('error', () => { this.render(); }); } async loadData() { logger.debug('MonitoringViewComponent: Loading data...'); this.dataLoaded = true; await this.viewModel.loadClusterData(); } async refreshData() { logger.debug('MonitoringViewComponent: Refreshing data...'); await this.viewModel.refresh(); } render() { logger.debug('MonitoringViewComponent: Rendering...'); const isLoading = this.viewModel.get('isLoading'); const error = this.viewModel.get('error'); const clusterSummary = this.viewModel.get('clusterSummary'); const nodeResources = this.viewModel.get('nodeResources'); const lastUpdated = this.viewModel.get('lastUpdated'); // Render cluster summary this.renderClusterSummary(isLoading, error, clusterSummary, lastUpdated); // Render nodes monitoring this.renderNodesMonitoring(isLoading, error, nodeResources); } renderClusterSummary(isLoading, error, clusterSummary, lastUpdated) { const container = this.findElement('#cluster-summary'); if (!container) return; if (isLoading) { container.innerHTML = `