Skip to main content

git_same/tui/widgets/
repo_table.rs

1//! Reusable repo table widget.
2
3use ratatui::{
4    layout::{Constraint, Rect},
5    style::{Color, Modifier, Style},
6    widgets::{Block, Borders, Row, Table},
7    Frame,
8};
9
10use crate::types::OwnedRepo;
11
12/// Render a table of OwnedRepo entries.
13pub fn render_owned_repos(
14    frame: &mut Frame,
15    area: Rect,
16    title: &str,
17    repos: &[&OwnedRepo],
18    selected: usize,
19) {
20    let header = Row::new(vec!["Name", "Default Branch", "Visibility"])
21        .style(
22            Style::default()
23                .fg(Color::Cyan)
24                .add_modifier(Modifier::BOLD),
25        )
26        .bottom_margin(1);
27
28    let rows: Vec<Row> = repos
29        .iter()
30        .enumerate()
31        .map(|(i, repo)| {
32            let style = if i == selected {
33                Style::default()
34                    .fg(Color::Cyan)
35                    .add_modifier(Modifier::BOLD)
36            } else {
37                Style::default()
38            };
39
40            let visibility = if repo.repo.private {
41                "private"
42            } else {
43                "public"
44            };
45
46            Row::new(vec![
47                repo.repo.name.clone(),
48                repo.repo.default_branch.clone(),
49                visibility.to_string(),
50            ])
51            .style(style)
52        })
53        .collect();
54
55    let widths = [
56        Constraint::Percentage(50),
57        Constraint::Percentage(25),
58        Constraint::Percentage(25),
59    ];
60
61    let table = Table::new(rows, widths).header(header).block(
62        Block::default()
63            .title(title)
64            .borders(Borders::ALL)
65            .border_style(Style::default().fg(Color::DarkGray)),
66    );
67    frame.render_widget(table, area);
68}
69
70#[cfg(test)]
71#[path = "repo_table_tests.rs"]
72mod tests;