use super::header_modal_block;
use crate::tui::state::{MissionControlState, ModalKind};
use ratatui::{
Frame,
layout::{Constraint, Layout, Rect},
text::Line,
widgets::{Clear, List, ListItem, ListState, Paragraph},
};
pub(super) fn draw(frame: &mut Frame<'_>, area: Rect, state: &MissionControlState) {
let modal = &state.modals.background_jobs;
let block = header_modal_block(
state,
ModalKind::BackgroundJobs,
"Background Jobs",
crate::tui::input::BACKGROUND_JOBS_HELP,
);
let inner = super::super::pane_text_area(block.inner(area));
frame.render_widget(Clear, area);
frame.render_widget(block, area);
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],
);
}