diff --git a/public/scripts/components.js b/public/scripts/components.js
index 449a5c1..dea26ac 100644
--- a/public/scripts/components.js
+++ b/public/scripts/components.js
@@ -75,7 +75,7 @@ class PrimaryNodeComponent extends Component {
}, 1500);
} catch (error) {
- console.error('Failed to select random primary node:', error);
+ logger.error('Failed to select random primary node:', error);
this.setText('#primary-node-ip', '❌ Selection Failed');
this.setClass('#primary-node-ip', 'error', true);
this.setClass('#primary-node-ip', 'selecting', false);
@@ -106,7 +106,7 @@ class ClusterMembersComponent extends Component {
// Ensure initial render happens even if no data
setTimeout(() => {
if (this.isMounted && !this.renderInProgress) {
- console.log('ClusterMembersComponent: Performing initial render check');
+ logger.debug('ClusterMembersComponent: Performing initial render check');
this.render();
}
}, 200);
@@ -131,7 +131,7 @@ class ClusterMembersComponent extends Component {
this.loadingTimeout = setTimeout(() => {
const isLoading = this.viewModel.get('isLoading');
if (isLoading) {
- console.warn('ClusterMembersComponent: Loading timeout reached, forcing render check');
+ logger.warn('ClusterMembersComponent: Loading timeout reached, forcing render check');
this.forceRenderCheck();
}
}, 10000); // 10 second timeout
@@ -295,7 +295,7 @@ class ClusterMembersComponent extends Component {
// Update members partially to preserve UI state
updateMembersPartially(newMembers, previousMembers) {
- console.log('ClusterMembersComponent: Performing partial update to preserve UI state');
+ logger.debug('ClusterMembersComponent: Performing partial update to preserve UI state');
// Build previous map by IP for stable diffs
const prevByIp = new Map((previousMembers || []).map(m => [m.ip, m]));
@@ -344,7 +344,7 @@ class ClusterMembersComponent extends Component {
render() {
if (this.renderInProgress) {
- console.log('ClusterMembersComponent: Render already in progress, skipping');
+ logger.debug('ClusterMembersComponent: Render already in progress, skipping');
return;
}
@@ -356,35 +356,35 @@ class ClusterMembersComponent extends Component {
this.renderInProgress = true;
try {
- console.log('ClusterMembersComponent: render() called');
- console.log('ClusterMembersComponent: Container element:', this.container);
- console.log('ClusterMembersComponent: Is mounted:', this.isMounted);
+ logger.debug('ClusterMembersComponent: render() called');
+ logger.debug('ClusterMembersComponent: Container element:', this.container);
+ logger.debug('ClusterMembersComponent: Is mounted:', this.isMounted);
const members = this.viewModel.get('members');
const isLoading = this.viewModel.get('isLoading');
const error = this.viewModel.get('error');
- console.log('ClusterMembersComponent: render data:', { members, isLoading, error });
+ logger.debug('ClusterMembersComponent: render data:', { members, isLoading, error });
if (isLoading) {
- console.log('ClusterMembersComponent: Showing loading state');
+ logger.debug('ClusterMembersComponent: Showing loading state');
this.showLoadingState();
return;
}
if (error) {
- console.log('ClusterMembersComponent: Showing error state');
+ logger.debug('ClusterMembersComponent: Showing error state');
this.showErrorState(error);
return;
}
if (!members || members.length === 0) {
- console.log('ClusterMembersComponent: Showing empty state');
+ logger.debug('ClusterMembersComponent: Showing empty state');
this.showEmptyState();
return;
}
- console.log('ClusterMembersComponent: Rendering members:', members);
+ logger.debug('ClusterMembersComponent: Rendering members:', members);
this.renderMembers(members);
} finally {
@@ -543,7 +543,7 @@ class ClusterMembersComponent extends Component {
}
} catch (error) {
- console.error('Failed to expand card:', error);
+ logger.error('Failed to expand card:', error);
memberDetails.innerHTML = `
Error loading node details:
@@ -600,7 +600,7 @@ class ClusterMembersComponent extends Component {
const expandedCards = this.viewModel.get('expandedCards');
const activeTabs = this.viewModel.get('activeTabs');
- console.log('ClusterMembersComponent: Debug State:', {
+ logger.debug('ClusterMembersComponent: Debug State:', {
isMounted: this.isMounted,
container: this.container,
members: members,
@@ -617,7 +617,7 @@ class ClusterMembersComponent extends Component {
// Manual refresh method that bypasses potential state conflicts
async manualRefresh() {
- console.log('ClusterMembersComponent: Manual refresh called');
+ logger.debug('ClusterMembersComponent: Manual refresh called');
try {
// Clear any existing loading state
@@ -627,9 +627,9 @@ class ClusterMembersComponent extends Component {
// Force a fresh data load
await this.viewModel.updateClusterMembers();
- console.log('ClusterMembersComponent: Manual refresh completed');
+ logger.debug('ClusterMembersComponent: Manual refresh completed');
} catch (error) {
- console.error('ClusterMembersComponent: Manual refresh failed:', error);
+ logger.error('ClusterMembersComponent: Manual refresh failed:', error);
this.showErrorState(error.message);
}
}
@@ -656,12 +656,12 @@ class ClusterMembersComponent extends Component {
this.cleanupEventListeners();
this.cleanupViewModelListeners();
- console.log(`${this.constructor.name} unmounted`);
+ logger.debug(`${this.constructor.name} unmounted`);
}
// Override pause method to handle timeouts and operations
onPause() {
- console.log('ClusterMembersComponent: Pausing...');
+ logger.debug('ClusterMembersComponent: Pausing...');
// Clear any pending timeouts
if (this.loadingTimeout) {
@@ -680,7 +680,7 @@ class ClusterMembersComponent extends Component {
// Override resume method to restore functionality
onResume() {
- console.log('ClusterMembersComponent: Resuming...');
+ logger.debug('ClusterMembersComponent: Resuming...');
this.isPaused = false;
@@ -700,7 +700,7 @@ class ClusterMembersComponent extends Component {
// If we were loading and it completed while paused, handle the completion
if (!isLoading && members && members.length > 0) {
- console.log('ClusterMembersComponent: Handling pending loading completion after resume');
+ logger.debug('ClusterMembersComponent: Handling pending loading completion after resume');
this.handleLoadingCompletion();
}
}
@@ -799,7 +799,7 @@ class NodeDetailsComponent extends Component {
renderNodeDetails(nodeStatus, tasks, capabilities) {
// Use persisted active tab from the view model, default to 'status'
const activeTab = (this.viewModel && typeof this.viewModel.get === 'function' && this.viewModel.get('activeTab')) || 'status';
- console.log('NodeDetailsComponent: Rendering with activeTab:', activeTab);
+ logger.debug('NodeDetailsComponent: Rendering with activeTab:', activeTab);
const html = `
@@ -1215,10 +1215,10 @@ class NodeDetailsComponent extends Component {
`;
- console.log('Firmware upload successful:', result);
+ logger.debug('Firmware upload successful:', result);
} catch (error) {
- console.error('Firmware upload failed:', error);
+ logger.error('Firmware upload failed:', error);
// Show error
uploadStatus.innerHTML = `
@@ -1286,7 +1286,7 @@ class FirmwareComponent extends Component {
this.addEventListener(specificNodeSelect, 'change', this._boundNodeSelectHandler);
logger.debug('FirmwareComponent: Event listener added to specificNodeSelect');
} else {
- console.warn('FirmwareComponent: specificNodeSelect element not found during setupEventListeners');
+ logger.warn('FirmwareComponent: specificNodeSelect element not found during setupEventListeners');
}
// Setup label select change handler (single-select add-to-chips)
@@ -1362,7 +1362,7 @@ class FirmwareComponent extends Component {
this.populateLabelSelect();
this.updateAffectedNodesPreview();
} catch (e) {
- console.warn('FirmwareComponent: Initialization after mount failed:', e);
+ logger.warn('FirmwareComponent: Initialization after mount failed:', e);
}
logger.debug('FirmwareComponent: Mounted successfully');
@@ -1385,10 +1385,10 @@ class FirmwareComponent extends Component {
handleNodeSelect(event) {
const nodeIp = event.target.value;
- console.log('FirmwareComponent: handleNodeSelect called with nodeIp:', nodeIp);
- console.log('Event:', event);
- console.log('Event target:', event.target);
- console.log('Event target value:', event.target.value);
+ logger.debug('FirmwareComponent: handleNodeSelect called with nodeIp:', nodeIp);
+ logger.debug('Event:', event);
+ logger.debug('Event target:', event.target);
+ logger.debug('Event target value:', event.target.value);
this.viewModel.setSpecificNode(nodeIp);
@@ -1426,7 +1426,7 @@ class FirmwareComponent extends Component {
this.viewModel.resetUploadState();
} catch (error) {
- console.error('Firmware deployment failed:', error);
+ logger.error('Firmware deployment failed:', error);
alert(`Deployment failed: ${error.message}`);
} finally {
this.viewModel.completeUpload();
@@ -1457,7 +1457,7 @@ class FirmwareComponent extends Component {
this.displayUploadResults(results);
} catch (error) {
- console.error('Failed to upload firmware to all nodes:', error);
+ logger.error('Failed to upload firmware to all nodes:', error);
throw error;
}
}
@@ -1484,7 +1484,7 @@ class FirmwareComponent extends Component {
this.displayUploadResults([result]);
} catch (error) {
- console.error(`Failed to upload firmware to node ${nodeIp}:`, error);
+ logger.error(`Failed to upload firmware to node ${nodeIp}:`, error);
// Update progress to show failure
this.updateNodeProgress(1, 1, nodeIp, 'Failed');
@@ -1524,7 +1524,7 @@ class FirmwareComponent extends Component {
// Display results
this.displayUploadResults(results);
} catch (error) {
- console.error('Failed to upload firmware to label-filtered nodes:', error);
+ logger.error('Failed to upload firmware to label-filtered nodes:', error);
throw error;
}
}
@@ -1552,7 +1552,7 @@ class FirmwareComponent extends Component {
this.updateOverallProgress(successfulUploads, totalNodes);
} catch (error) {
- console.error(`Failed to upload to node ${nodeIp}:`, error);
+ logger.error(`Failed to upload to node ${nodeIp}:`, error);
const errorResult = {
nodeIp: nodeIp,
hostname: node.hostname || nodeIp,
@@ -1783,12 +1783,12 @@ class FirmwareComponent extends Component {
populateNodeSelect() {
const select = this.findElement('#specific-node-select');
if (!select) {
- console.warn('FirmwareComponent: populateNodeSelect - select element not found');
+ logger.warn('FirmwareComponent: populateNodeSelect - select element not found');
return;
}
if (select.tagName !== 'SELECT') {
- console.warn('FirmwareComponent: populateNodeSelect - element is not a SELECT:', select.tagName);
+ logger.warn('FirmwareComponent: populateNodeSelect - element is not a SELECT:', select.tagName);
return;
}
@@ -1838,7 +1838,7 @@ class FirmwareComponent extends Component {
select.removeEventListener('change', this._boundNodeSelectHandler);
select.addEventListener('change', this._boundNodeSelectHandler);
- console.log('FirmwareComponent: Node select event listener ensured');
+ logger.debug('FirmwareComponent: Node select event listener ensured');
}
updateUploadProgress() {
@@ -1942,18 +1942,18 @@ class ClusterViewComponent extends Component {
constructor(container, viewModel, eventBus) {
super(container, viewModel, eventBus);
- console.log('ClusterViewComponent: Constructor called');
- console.log('ClusterViewComponent: Container:', container);
- console.log('ClusterViewComponent: Container ID:', container?.id);
+ logger.debug('ClusterViewComponent: Constructor called');
+ logger.debug('ClusterViewComponent: Container:', container);
+ logger.debug('ClusterViewComponent: Container ID:', container?.id);
// Find elements for sub-components
const primaryNodeContainer = this.findElement('.primary-node-info');
const clusterMembersContainer = this.findElement('#cluster-members-container');
- console.log('ClusterViewComponent: Primary node container:', primaryNodeContainer);
- console.log('ClusterViewComponent: Cluster members container:', clusterMembersContainer);
- console.log('ClusterViewComponent: Cluster members container ID:', clusterMembersContainer?.id);
- console.log('ClusterViewComponent: Cluster members container innerHTML:', clusterMembersContainer?.innerHTML);
+ logger.debug('ClusterViewComponent: Primary node container:', primaryNodeContainer);
+ logger.debug('ClusterViewComponent: Cluster members container:', clusterMembersContainer);
+ logger.debug('ClusterViewComponent: Cluster members container ID:', clusterMembersContainer?.id);
+ logger.debug('ClusterViewComponent: Cluster members container innerHTML:', clusterMembersContainer?.innerHTML);
// Create sub-components
this.primaryNodeComponent = new PrimaryNodeComponent(
@@ -1968,17 +1968,17 @@ class ClusterViewComponent extends Component {
eventBus
);
- console.log('ClusterViewComponent: Sub-components created');
+ logger.debug('ClusterViewComponent: Sub-components created');
// Track if we've already loaded data to prevent unnecessary reloads
this.dataLoaded = false;
}
mount() {
- console.log('ClusterViewComponent: Mounting...');
+ logger.debug('ClusterViewComponent: Mounting...');
super.mount();
- console.log('ClusterViewComponent: Mounting sub-components...');
+ logger.debug('ClusterViewComponent: Mounting sub-components...');
// Mount sub-components
this.primaryNodeComponent.mount();
this.clusterMembersComponent.mount();
@@ -1991,51 +1991,51 @@ class ClusterViewComponent extends Component {
const shouldLoadData = !this.dataLoaded || !members || members.length === 0;
if (shouldLoadData) {
- console.log('ClusterViewComponent: Starting initial data load...');
+ logger.debug('ClusterViewComponent: Starting initial data load...');
// Initial data load - ensure it happens after mounting
setTimeout(() => {
this.viewModel.updateClusterMembers().then(() => {
this.dataLoaded = true;
}).catch(error => {
- console.error('ClusterViewComponent: Failed to load initial data:', error);
+ logger.error('ClusterViewComponent: Failed to load initial data:', error);
});
}, 100);
} else {
- console.log('ClusterViewComponent: Data already loaded, skipping initial load');
+ logger.debug('ClusterViewComponent: Data already loaded, skipping initial load');
}
// Set up periodic updates
// this.setupPeriodicUpdates(); // Disabled automatic refresh
- console.log('ClusterViewComponent: Mounted successfully');
+ logger.debug('ClusterViewComponent: Mounted successfully');
}
setupRefreshButton() {
- console.log('ClusterViewComponent: Setting up refresh button...');
+ logger.debug('ClusterViewComponent: Setting up refresh button...');
const refreshBtn = this.findElement('.refresh-btn');
- console.log('ClusterViewComponent: Found refresh button:', !!refreshBtn, refreshBtn);
+ logger.debug('ClusterViewComponent: Found refresh button:', !!refreshBtn, refreshBtn);
if (refreshBtn) {
- console.log('ClusterViewComponent: Adding click event listener to refresh button');
+ logger.debug('ClusterViewComponent: Adding click event listener to refresh button');
this.addEventListener(refreshBtn, 'click', this.handleRefresh.bind(this));
- console.log('ClusterViewComponent: Event listener added successfully');
+ logger.debug('ClusterViewComponent: Event listener added successfully');
} else {
- console.error('ClusterViewComponent: Refresh button not found!');
- console.log('ClusterViewComponent: Container HTML:', this.container.innerHTML);
- console.log('ClusterViewComponent: All buttons in container:', this.container.querySelectorAll('button'));
+ logger.error('ClusterViewComponent: Refresh button not found!');
+ logger.debug('ClusterViewComponent: Container HTML:', this.container.innerHTML);
+ logger.debug('ClusterViewComponent: All buttons in container:', this.container.querySelectorAll('button'));
}
}
async handleRefresh() {
- console.log('ClusterViewComponent: Refresh button clicked, performing full refresh...');
+ logger.debug('ClusterViewComponent: Refresh button clicked, performing full refresh...');
// Get the refresh button and show loading state
const refreshBtn = this.findElement('.refresh-btn');
- console.log('ClusterViewComponent: Found refresh button for loading state:', !!refreshBtn);
+ logger.debug('ClusterViewComponent: Found refresh button for loading state:', !!refreshBtn);
if (refreshBtn) {
const originalText = refreshBtn.innerHTML;
- console.log('ClusterViewComponent: Original button text:', originalText);
+ logger.debug('ClusterViewComponent: Original button text:', originalText);
refreshBtn.innerHTML = `