Compare commits

..

3 Commits

Author SHA1 Message Date
d692de5f83 Bump version to v0.1.215
All checks were successful
Build and Release / build-and-release (push) Successful in 1m11s
2025-11-29 17:41:49 +01:00
f5913dbd43 Add archive count to backup disk display 2025-11-29 17:41:11 +01:00
faa30a7839 Sort backup repositories and disks for stable display
All checks were successful
Build and Release / build-and-release (push) Successful in 1m21s
- Sort repositories alphabetically before rendering
- Sort backup disks by serial number
- Prevents display jumping between different orderings on updates
- Consistent display order across refreshes

Bump version to v0.1.214

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 17:15:17 +01:00
7 changed files with 26 additions and 12 deletions

6
Cargo.lock generated
View File

@@ -279,7 +279,7 @@ checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d"
[[package]] [[package]]
name = "cm-dashboard" name = "cm-dashboard"
version = "0.1.212" version = "0.1.214"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"chrono", "chrono",
@@ -301,7 +301,7 @@ dependencies = [
[[package]] [[package]]
name = "cm-dashboard-agent" name = "cm-dashboard-agent"
version = "0.1.212" version = "0.1.214"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
@@ -324,7 +324,7 @@ dependencies = [
[[package]] [[package]]
name = "cm-dashboard-shared" name = "cm-dashboard-shared"
version = "0.1.212" version = "0.1.214"
dependencies = [ dependencies = [
"chrono", "chrono",
"serde", "serde",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "cm-dashboard-agent" name = "cm-dashboard-agent"
version = "0.1.213" version = "0.1.215"
edition = "2021" edition = "2021"
[dependencies] [dependencies]

View File

@@ -142,6 +142,11 @@ impl BackupCollector {
// Build service list for this disk // Build service list for this disk
let services: Vec<String> = backup_status.services.keys().cloned().collect(); let services: Vec<String> = backup_status.services.keys().cloned().collect();
// Calculate total archives across all services on this disk
let total_archives: i64 = backup_status.services.values()
.map(|service| service.archive_count)
.sum();
// Create disk data // Create disk data
let disk_data = BackupDiskData { let disk_data = BackupDiskData {
serial: backup_status.disk_serial_number.unwrap_or_else(|| "Unknown".to_string()), serial: backup_status.disk_serial_number.unwrap_or_else(|| "Unknown".to_string()),
@@ -155,6 +160,7 @@ impl BackupCollector {
disk_total_gb: total_gb, disk_total_gb: total_gb,
usage_status, usage_status,
services, services,
total_archives,
}; };
disks.push(disk_data); disks.push(disk_data);

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "cm-dashboard" name = "cm-dashboard"
version = "0.1.213" version = "0.1.215"
edition = "2021" edition = "2021"
[dependencies] [dependencies]

View File

@@ -517,19 +517,23 @@ impl SystemWidget {
let repo_spans = StatusIcons::create_status_spans(self.backup_repository_status, &repo_text); let repo_spans = StatusIcons::create_status_spans(self.backup_repository_status, &repo_text);
lines.push(Line::from(repo_spans)); lines.push(Line::from(repo_spans));
// List all repositories // List all repositories (sorted for consistent display)
let repo_count = self.backup_repositories.len(); let mut sorted_repos = self.backup_repositories.clone();
for (idx, repo) in self.backup_repositories.iter().enumerate() { sorted_repos.sort();
let repo_count = sorted_repos.len();
for (idx, repo) in sorted_repos.iter().enumerate() {
let tree_char = if idx == repo_count - 1 { "└─" } else { "├─" }; let tree_char = if idx == repo_count - 1 { "└─" } else { "├─" };
lines.push(Line::from(vec![ lines.push(Line::from(vec![
Span::styled(format!(" {} ", tree_char), Typography::tree()), Span::styled(format!(" {} ", tree_char), Typography::tree()),
Span::styled(repo, Typography::secondary()), Span::styled(repo.clone(), Typography::secondary()),
])); ]));
} }
} }
// Second section: Per-disk backup information // Second section: Per-disk backup information (sorted by serial for consistent display)
for disk in &self.backup_disks { let mut sorted_disks = self.backup_disks.clone();
sorted_disks.sort_by(|a, b| a.serial.cmp(&b.serial));
for disk in &sorted_disks {
let truncated_serial = truncate_serial(&disk.serial); let truncated_serial = truncate_serial(&disk.serial);
let mut details = Vec::new(); let mut details = Vec::new();
@@ -540,6 +544,9 @@ impl SystemWidget {
details.push(format!("W: {}%", wear as i32)); details.push(format!("W: {}%", wear as i32));
} }
// Add archive count
details.push(format!("Archives: {}", disk.total_archives));
let disk_text = if !details.is_empty() { let disk_text = if !details.is_empty() {
format!("{} {}", truncated_serial, details.join(" ")) format!("{} {}", truncated_serial, details.join(" "))
} else { } else {

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "cm-dashboard-shared" name = "cm-dashboard-shared"
version = "0.1.213" version = "0.1.215"
edition = "2021" edition = "2021"
[dependencies] [dependencies]

View File

@@ -195,6 +195,7 @@ pub struct BackupDiskData {
pub disk_total_gb: f32, pub disk_total_gb: f32,
pub usage_status: Status, pub usage_status: Status,
pub services: Vec<String>, pub services: Vec<String>,
pub total_archives: i64,
} }
impl AgentData { impl AgentData {