From d76302e1c44f289f10aa1a5fde707f5b514690e9 Mon Sep 17 00:00:00 2001 From: Christoffer Martinsson Date: Mon, 13 Oct 2025 08:45:12 +0200 Subject: [PATCH] Testing --- agent/src/collectors/service.rs | 10 ++------ dashboard/src/ui/services.rs | 3 ++- dashboard/src/ui/widget.rs | 41 +++++++++++++++++++++++++++++++-- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/agent/src/collectors/service.rs b/agent/src/collectors/service.rs index 9047700..0b9210c 100644 --- a/agent/src/collectors/service.rs +++ b/agent/src/collectors/service.rs @@ -818,15 +818,9 @@ impl Collector for ServiceCollector { // Add nginx sites as individual sub-services if let Some(sites) = self.get_nginx_sites().await { - for (i, site) in sites.iter().enumerate() { - let site_name = if i == sites.len() - 1 { - format!("└─ {}", site) - } else { - format!("├─ {}", site) - }; - + for site in sites.iter() { services.push(ServiceData { - name: site_name, + name: site.clone(), status: ServiceStatus::Running, // Assume sites are running if nginx is running memory_used_mb: 0.0, memory_quota_mb: 0.0, diff --git a/dashboard/src/ui/services.rs b/dashboard/src/ui/services.rs index 15a8cf8..f7142be 100644 --- a/dashboard/src/ui/services.rs +++ b/dashboard/src/ui/services.rs @@ -106,7 +106,7 @@ fn render_metrics( if svc.sub_service.is_some() { // Sub-services only show name and status, no memory/CPU/disk data - data.add_row( + data.add_row_with_sub_service( Some(WidgetStatus::new(status_level)), description, vec![ @@ -115,6 +115,7 @@ fn render_metrics( "".to_string(), "".to_string(), ], + svc.sub_service.clone(), ); } else { // Regular services show all columns diff --git a/dashboard/src/ui/widget.rs b/dashboard/src/ui/widget.rs index ebb1e5c..b0ce07e 100644 --- a/dashboard/src/ui/widget.rs +++ b/dashboard/src/ui/widget.rs @@ -77,6 +77,22 @@ pub fn render_placeholder(frame: &mut Frame, area: Rect, title: &str, message: & ); } +fn is_last_sub_service_in_group(rows: &[WidgetRow], current_idx: usize, parent_service: &Option) -> bool { + if let Some(parent) = parent_service { + // Look ahead to see if there are any more sub-services for this parent + for i in (current_idx + 1)..rows.len() { + if let Some(ref other_parent) = rows[i].sub_service { + if other_parent == parent { + return false; // Found another sub-service for same parent + } + } + } + true // No more sub-services found for this parent + } else { + false // Not a sub-service + } +} + pub fn render_widget_data(frame: &mut Frame, area: Rect, data: WidgetData) { render_combined_widget_data(frame, area, data.title, data.status, vec![data.dataset]); } @@ -265,7 +281,7 @@ fn render_dataset_with_wrapping(frame: &mut Frame, dataset: &WidgetDataSet, inne current_y += 1; // Render data rows for this section - for row in &dataset.rows { + for (row_idx, row) in dataset.rows.iter().enumerate() { if current_y >= inner.y + inner.height { break; } @@ -295,8 +311,18 @@ fn render_dataset_with_wrapping(frame: &mut Frame, dataset: &WidgetDataSet, inne if content.is_empty() { cells.push(Cell::from("")); } else { + // Check if this is the first column (service name) and if it's a sub-service + let display_content = if col_idx == 0 && row.sub_service.is_some() { + // Determine if this is the last sub-service for this parent + let is_last_sub_service = is_last_sub_service_in_group(&dataset.rows, row_idx, &row.sub_service); + let tree_char = if is_last_sub_service { "└─" } else { "├─" }; + format!("{} {}", tree_char, content) + } else { + content.to_string() + }; + cells.push(Cell::from(Line::from(vec![Span::styled( - content.to_string(), + display_content, neutral_text_style(), )]))); } @@ -375,6 +401,7 @@ pub struct WidgetRow { pub status: Option, pub values: Vec, pub description: Vec, + pub sub_service: Option, } #[derive(Clone, Copy, Debug)] @@ -404,10 +431,15 @@ impl WidgetData { } pub fn add_row(&mut self, status: Option, description: Vec, values: Vec) -> &mut Self { + self.add_row_with_sub_service(status, description, values, None) + } + + pub fn add_row_with_sub_service(&mut self, status: Option, description: Vec, values: Vec, sub_service: Option) -> &mut Self { self.dataset.rows.push(WidgetRow { status, values, description, + sub_service, }); self } @@ -423,10 +455,15 @@ impl WidgetDataSet { } pub fn add_row(&mut self, status: Option, description: Vec, values: Vec) -> &mut Self { + self.add_row_with_sub_service(status, description, values, None) + } + + pub fn add_row_with_sub_service(&mut self, status: Option, description: Vec, values: Vec, sub_service: Option) -> &mut Self { self.rows.push(WidgetRow { status, values, description, + sub_service, }); self }