saga-time 0.1.0

A local-first time tracking application with CLI and TUI
Documentation
use ratatui::{
    Frame,
    layout::{Constraint, Rect},
    style::Style,
    widgets::{Block, Borders, Paragraph, Row, Table, TableState},
};
use crate::app::App;
use crate::ui::theme;

pub fn render(app: &mut App, frame: &mut Frame, area: Rect) {
    let block = Block::default()
        .title(format!(" Clients ({}) ", app.clients.len()))
        .borders(Borders::ALL)
        .border_style(Style::default().fg(theme::PRIMARY));

    if app.clients.is_empty() {
        let p = Paragraph::new(" No clients. Use 'saga clients add <name>' to create one.")
            .style(theme::muted_style())
            .block(block);
        frame.render_widget(p, area);
        return;
    }

    let rows: Vec<Row> = app.clients.iter().map(|client| {
        Row::new(vec![
            client.name.clone(),
            client.email.clone().unwrap_or_default(),
            client.contact.clone().unwrap_or_default(),
        ])
    }).collect();

    let header = Row::new(vec!["Name", "Email", "Contact"])
        .style(theme::header_style())
        .bottom_margin(1);

    let table = Table::new(
        rows,
        [
            Constraint::Percentage(30),
            Constraint::Percentage(35),
            Constraint::Percentage(35),
        ]
    )
    .header(header)
    .block(block)
    .row_highlight_style(theme::selected_style());

    let mut state = TableState::default();
    state.select(Some(app.clients_selected));
    frame.render_stateful_widget(table, area, &mut state);
}