use crate::tui::{
modal_container::{draw_modal_container, modal_area},
state::MissionControlState,
};
use ratatui::{
Frame,
layout::{Constraint, Layout, Rect},
text::Line,
widgets::{List, ListItem, ListState, Paragraph},
};
pub(super) fn draw(frame: &mut Frame<'_>, area: Rect, state: &MissionControlState) {
let Some(modal) = &state.modals.background_jobs else {
return;
};
let inner = draw_modal_container(
frame,
modal_area(area, 60, 60),
"Background jobs · primary conversation",
crate::tui::input::BACKGROUND_JOBS_HELP,
state.theme,
Some("[Esc] close"),
);
let areas = Layout::vertical([Constraint::Min(0), Constraint::Length(1)]).split(inner);
if modal.jobs.is_empty() {
frame.render_widget(
Paragraph::new(if modal.loaded {
"No running background jobs"
} else {
"Refreshing background jobs…"
})
.style(state.theme.muted(false)),
areas[0],
);
} else {
let rows = modal.jobs.iter().map(|job| {
ListItem::new(vec![
Line::from(format!(
"PID {} · {}s · {} · {}",
job.pid,
job.uptime_seconds,
if job.stopping { "stopping" } else { "running" },
job.id
)),
Line::from(job.command.as_str()),
])
});
let list = List::new(rows)
.style(state.theme.app())
.highlight_style(state.theme.accent(true))
.highlight_symbol("› ");
frame.render_stateful_widget(
list,
areas[0],
&mut ListState::default().with_selected(Some(modal.selected)),
);
}
frame.render_widget(
Paragraph::new(modal.notice.as_str()).style(state.theme.muted(false)),
areas[1],
);
}