dpresentation 0.7.1

Ticket management systems for solo players.
Documentation
use dapplication::dtos::ticket_dto::TicketDTO;
use ratatui::{
    Frame,
    crossterm::style::Color,
    layout::{Constraint, Rect},
    style::Style,
    widgets::{Block, Borders, Cell, Row, Table, TableState},
};

use crate::table_colors::TableColors;

pub fn view_table(
    frame: &mut Frame,
    area: Rect,
    selected_index: Option<usize>,
    tickets: &Vec<TicketDTO>,
    table_colors: &TableColors,
    state: &mut TableState,
) {
    let header_style = Style::default()
        .fg(Color::White.into())
        .bg(Color::Blue.into());
    let header = Row::new(
        [
            "ID",
            "Level",
            "Title",
            "Status",
            "Created At",
            "Resolved At",
        ]
        .iter()
        .map(|&s| Cell::from(s)),
    )
    .style(header_style)
    .height(1);

    let rows: Vec<Row> = tickets
        .iter()
        .enumerate()
        .map(|(i, ticket)| {
            let row_style = if selected_index == Some(i) {
                Style::default()
                    .fg(table_colors.selected_row_style_fg)
                    .bg(table_colors.header_bg)
            } else if i % 2 == 0 {
                Style::default()
                    .fg(table_colors.row_fg)
                    .bg(table_colors.normal_row_color)
            } else {
                Style::default()
                    .fg(table_colors.row_fg)
                    .bg(table_colors.alt_row_color)
            };

            Row::new([
                Cell::from(ticket.id.as_str()),
                Cell::from(ticket.level.as_str()),
                Cell::from(ticket.title.as_str()),
                Cell::from(ticket.status.as_str()),
                Cell::from(ticket.created_at.to_rfc3339()),
                Cell::from(
                    ticket
                        .resolved_at
                        .map(|dt| dt.to_rfc3339())
                        .unwrap_or_else(|| "".to_string()),
                ),
            ])
            .style(row_style)
        })
        .collect();

    let widths = vec![
        Constraint::Length(10),
        Constraint::Length(10),
        Constraint::Length(30),
        Constraint::Length(15),
        Constraint::Length(25),
        Constraint::Length(25),
    ];

    frame.render_stateful_widget(
        Table::new(std::iter::once(header).chain(rows), &widths)
            .block(Block::default().borders(Borders::ALL).title("Ticket List")),
        area,
        state,
    );
}