magi-code 0.104.0

Repository-aware CLI coding agent for terminal work
Documentation
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],
    );
}