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 = 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); }