Signed-off-by: NotAShelf <raf@notashelf.dev> Change-Id: I9a5114addcab5fbff430ab2b919b83466a6a6964
69 lines
2.4 KiB
Rust
69 lines
2.4 KiB
Rust
use ratatui::Frame;
|
|
use ratatui::layout::Rect;
|
|
use ratatui::style::{Color, Modifier, Style};
|
|
use ratatui::text::{Line, Span};
|
|
use ratatui::widgets::{Block, Borders, List, ListItem};
|
|
|
|
use crate::app::AppState;
|
|
|
|
pub fn render(f: &mut Frame, state: &AppState, area: Rect) {
|
|
let items: Vec<ListItem> = if state.scheduled_tasks.is_empty() {
|
|
vec![ListItem::new(Line::from(Span::styled(
|
|
" No scheduled tasks. Press T to refresh.",
|
|
Style::default().fg(Color::DarkGray),
|
|
)))]
|
|
} else {
|
|
state
|
|
.scheduled_tasks
|
|
.iter()
|
|
.enumerate()
|
|
.map(|(i, task)| {
|
|
let is_selected = state.scheduled_tasks_selected == Some(i);
|
|
let enabled_marker = if task.enabled { "[ON] " } else { "[OFF]" };
|
|
let enabled_color = if task.enabled {
|
|
Color::Green
|
|
} else {
|
|
Color::DarkGray
|
|
};
|
|
|
|
let last_run = task
|
|
.last_run
|
|
.as_deref()
|
|
.map(super::format_date)
|
|
.unwrap_or("-");
|
|
let next_run = task
|
|
.next_run
|
|
.as_deref()
|
|
.map(super::format_date)
|
|
.unwrap_or("-");
|
|
let status = task.last_status.as_deref().unwrap_or("-");
|
|
// Show abbreviated task ID (first 8 chars)
|
|
let task_id_short = if task.id.len() > 8 {
|
|
&task.id[..8]
|
|
} else {
|
|
&task.id
|
|
};
|
|
|
|
let text = format!(
|
|
" {enabled_marker} [{task_id_short}] {:<20} {:<16} Last: {:<12} Next: {:<12} Status: {}",
|
|
task.name, task.schedule, last_run, next_run, status
|
|
);
|
|
|
|
let style = if is_selected {
|
|
Style::default()
|
|
.fg(Color::Cyan)
|
|
.add_modifier(Modifier::BOLD)
|
|
} else {
|
|
Style::default().fg(enabled_color)
|
|
};
|
|
|
|
ListItem::new(Line::from(Span::styled(text, style)))
|
|
})
|
|
.collect()
|
|
};
|
|
|
|
let title = format!(" Scheduled Tasks ({}) ", state.scheduled_tasks.len());
|
|
let list = List::new(items).block(Block::default().borders(Borders::ALL).title(title));
|
|
|
|
f.render_widget(list, area);
|
|
}
|