envelope_cli/tui/views/
mod.rs

1//! TUI Views module
2//!
3//! Contains all the main views: accounts, register, budget, reports, reconcile,
4//! as well as the sidebar and status bar.
5
6pub mod account_list;
7pub mod budget;
8pub mod reconcile;
9pub mod register;
10pub mod sidebar;
11pub mod status_bar;
12
13use ratatui::Frame;
14
15use super::app::{ActiveDialog, ActiveView, App};
16use super::dialogs;
17use super::layout::AppLayout;
18
19/// Render the entire application
20pub fn render(frame: &mut Frame, app: &mut App) {
21    let layout = AppLayout::new(frame.area());
22
23    // Render sidebar
24    sidebar::render(frame, app, layout.sidebar);
25
26    // Render main view based on active view
27    match app.active_view {
28        ActiveView::Accounts => {
29            account_list::render_main(frame, app, layout.main);
30        }
31        ActiveView::Register => {
32            register::render(frame, app, layout.main);
33        }
34        ActiveView::Budget => {
35            budget::render(frame, app, layout.main);
36        }
37        ActiveView::Reports => {
38            // Reports view placeholder
39            render_placeholder(frame, layout.main, "Reports");
40        }
41        ActiveView::Reconcile => {
42            reconcile::render(frame, app, layout.main);
43        }
44    }
45
46    // Render status bar
47    status_bar::render(frame, app, layout.status_bar);
48
49    // Render dialog if active
50    if app.has_dialog() {
51        render_dialog(frame, app);
52    }
53}
54
55/// Render active dialog
56fn render_dialog(frame: &mut Frame, app: &mut App) {
57    match &app.active_dialog {
58        ActiveDialog::Help => {
59            dialogs::help::render(frame, app);
60        }
61        ActiveDialog::CommandPalette => {
62            dialogs::command_palette::render(frame, app);
63        }
64        ActiveDialog::Confirm(message) => {
65            dialogs::confirm::render(frame, message);
66        }
67        ActiveDialog::AddTransaction | ActiveDialog::EditTransaction(_) => {
68            dialogs::transaction::render(frame, app);
69        }
70        ActiveDialog::MoveFunds => {
71            dialogs::move_funds::render(frame, app);
72        }
73        ActiveDialog::BulkCategorize => {
74            dialogs::bulk_categorize::render(frame, app);
75        }
76        ActiveDialog::ReconcileStart => {
77            dialogs::reconcile_start::render(frame, app);
78        }
79        ActiveDialog::UnlockConfirm(state) => {
80            dialogs::unlock_confirm::render(frame, state);
81        }
82        ActiveDialog::Adjustment => {
83            dialogs::adjustment::render(frame, app);
84        }
85        ActiveDialog::Budget => {
86            dialogs::budget::render(frame, app);
87        }
88        ActiveDialog::Income => {
89            dialogs::income::render(frame, app);
90        }
91        ActiveDialog::AddAccount | ActiveDialog::EditAccount(_) => {
92            dialogs::account::render(frame, app);
93        }
94        ActiveDialog::AddCategory | ActiveDialog::EditCategory(_) => {
95            dialogs::category::render(frame, app);
96        }
97        ActiveDialog::AddGroup | ActiveDialog::EditGroup(_) => {
98            dialogs::group::render(frame, app);
99        }
100        ActiveDialog::None => {}
101    }
102}
103
104/// Render a placeholder for unimplemented views
105fn render_placeholder(frame: &mut Frame, area: ratatui::layout::Rect, name: &str) {
106    use ratatui::style::{Color, Style};
107    use ratatui::widgets::{Block, Borders, Paragraph};
108
109    let block = Block::default()
110        .title(name)
111        .borders(Borders::ALL)
112        .border_style(Style::default().fg(Color::White));
113
114    let text = Paragraph::new(format!("{} view - Coming soon!", name))
115        .block(block)
116        .style(Style::default().fg(Color::White));
117
118    frame.render_widget(text, area);
119}