This commit is contained in:
Marco De Araujo 2025-12-24 10:42:07 -04:00
parent ae9065a1e0
commit f2296ec82d
7 changed files with 196 additions and 25 deletions

View file

@ -1,5 +1,6 @@
use crate::i18n::t;
use crate::ui::dashboard::model::{DashboardViewState, MonitorStatus};
use crate::ui::dashboard::MonitorStatus;
use crate::ui::dashboard::model::DashboardViewState;
use ratatui::style::Modifier;
use ratatui::widgets::{List, ListItem, ListState};
use ratatui::{
@ -10,6 +11,8 @@ use ratatui::{
widgets::{Block, Borders},
};
const STATUS_LINE_LENGTH: usize = 20;
pub fn render_monitor_list(
frame: &mut Frame,
area: Rect,
@ -25,22 +28,16 @@ pub fn render_monitor_list(
.monitors
.iter()
.map(|monitor| {
let status_icon = match monitor.status {
MonitorStatus::Up => "",
MonitorStatus::Down => "",
MonitorStatus::Unknown => "",
};
let status_icon = get_status_emoji(&monitor.status);
let status_color = get_status_color(&monitor.status);
let status_line = create_status_line_spans(&monitor.status_history);
let status_color = match monitor.status {
MonitorStatus::Up => Color::Green,
MonitorStatus::Down => Color::Red,
MonitorStatus::Unknown => Color::Yellow,
};
let line = Line::from(vec![
let mut spans = vec![
Span::styled(
format!("{} ", status_icon),
Style::default().fg(status_color),
Style::default()
.fg(status_color)
.add_modifier(Modifier::BOLD),
),
Span::styled(
&monitor.name,
@ -56,9 +53,14 @@ pub fn render_monitor_list(
format!(" | {}%", monitor.uptime_24h),
Style::default().fg(Color::Magenta),
),
]);
Span::raw(" | "),
];
ListItem::new(line)
spans.extend(status_line);
let line = Line::from(spans);
let lines = vec![line];
ListItem::new(lines)
})
.collect();
@ -69,3 +71,55 @@ pub fn render_monitor_list(
frame.render_stateful_widget(list, area, list_state);
}
fn create_status_line_spans(status_history: &[MonitorStatus]) -> Vec<Span<'static>> {
let mut spans = Vec::new();
let recent_status: Vec<_> = status_history
.iter()
.rev()
.take(STATUS_LINE_LENGTH)
.collect();
for status in recent_status.iter().rev() {
let c = get_status_char(status);
let color = get_status_color(status);
spans.push(Span::styled(c.to_string(), Style::default().fg(color)));
}
if !spans.is_empty() {
spans.push(Span::raw(" "));
spans.push(Span::styled(
"(24)",
Style::default()
.fg(Color::Gray)
.add_modifier(Modifier::ITALIC),
));
}
spans
}
pub fn get_status_char(status: &MonitorStatus) -> char {
match status {
MonitorStatus::Up => '█',
MonitorStatus::Down => '█',
MonitorStatus::Unknown => '░',
}
}
pub fn get_status_color(status: &MonitorStatus) -> Color {
match status {
MonitorStatus::Up => Color::Green,
MonitorStatus::Down => Color::Red,
MonitorStatus::Unknown => Color::Yellow,
}
}
pub fn get_status_emoji(status: &MonitorStatus) -> &str {
match status {
MonitorStatus::Up => "",
MonitorStatus::Down => "",
MonitorStatus::Unknown => "",
}
}