git_same/tui/widgets/
repo_table.rs1use 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
12pub 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;