added navigation and selection to new transaction manual tab

This commit is contained in:
Nickiel12 2023-08-13 20:20:10 -07:00
parent 3e247b98c4
commit dc4e3dfa33

View file

@ -5,7 +5,7 @@ use crate::{
use crossterm::event::{KeyCode, KeyEvent, KeyEventKind};
use ratatui::{
backend::Backend,
layout::{Constraint, Direction, Layout, Rect, Alignment},
layout::{Alignment, Constraint, Direction, Layout, Rect},
style::{Color, Style},
text::Text,
widgets::{Block, Borders, Paragraph},
@ -52,6 +52,21 @@ impl ManualData {
breakdowns: Vec::new(),
}
}
pub fn send_tab(&mut self) {
let next = if self.focus.is_some() {
match self.focus.unwrap() {
ManualDataFocus::Account => ManualDataFocus::Amount,
ManualDataFocus::Amount => ManualDataFocus::Date,
ManualDataFocus::Date => ManualDataFocus::Bucket,
ManualDataFocus::Bucket => ManualDataFocus::Description,
ManualDataFocus::Description => ManualDataFocus::Breakdowns,
ManualDataFocus::Breakdowns => ManualDataFocus::Account,
}
} else {
ManualDataFocus::Account
};
self.focus = Some(next);
}
}
pub struct NewTransactionTabState<'a> {
@ -75,10 +90,16 @@ impl<'a> NewTransactionTabState<'a> {
}
pub fn handle_event(event: KeyEvent, app: &mut App) {
let transact_state = &app.states.transactions;
if event.kind == KeyEventKind::Press {
match event.code {
KeyCode::Tab => app.states.transactions.next_tab(),
_ => {}
if transact_state.cur_tab_index == 1 {
handle_manual_event(event, app);
} else {
match event.code {
KeyCode::Tab => app.states.transactions.next_tab(),
_ => {}
}
}
}
}
@ -125,15 +146,48 @@ pub fn render_new_transaction_tab<B: Backend>(f: &mut Frame<B>, body_rect: Rect,
};
}
pub fn render_manual_entry<B: Backend>(f: &mut Frame<B>, area: Rect, app: &App) {
let num_can_show = (area.height / 3) as usize;
let mut constraints: Vec<Constraint> = Vec::new();
for _ in 0..num_can_show {
constraints.push(Constraint::Length(1));
fn handle_manual_event(event: KeyEvent, app: &mut App) {
if app.states.transactions.manual_data.focus.is_some() {
match event.code {
KeyCode::Tab => {
app.states.transactions.manual_data.send_tab();
}
KeyCode::Char(value) => {
match app.states.transactions.manual_data.focus.unwrap() {
_ => {}
}
}
_ => {}
}
} else {
match event.code {
KeyCode::Tab => {
app.states.transactions.next_tab();
}
KeyCode::Enter => {
app.states.transactions.manual_data.focus = Some(ManualDataFocus::Account);
}
_ => {}
};
}
}
debug!("Can show: {}", num_can_show);
debug!("saved {} constraints", constraints.len());
pub fn render_manual_entry<B: Backend>(f: &mut Frame<B>, area: Rect, app: &App) {
let constraints: Vec<Constraint> = vec![
Constraint::Length(1),
Constraint::Length(1), // account
Constraint::Length(1),
Constraint::Length(1), // amount
Constraint::Length(1),
Constraint::Length(1), // date
Constraint::Length(1),
Constraint::Length(1), // bucket
Constraint::Length(1),
Constraint::Max(5), // description
Constraint::Length(1),
Constraint::Length(1), // Breakdown
Constraint::Length(1),
];
let split_body = Layout::default()
.direction(Direction::Vertical)
@ -141,51 +195,61 @@ pub fn render_manual_entry<B: Backend>(f: &mut Frame<B>, area: Rect, app: &App)
.split(area);
{
let mut first_found = false;
let mut num_rendered = 0;
let manual_state = &app.states.transactions.manual_data;
if manual_state.focus.is_none()
|| matches!(manual_state.focus.unwrap(), ManualDataFocus::Account)
{
let right_text = match manual_state.account.clone() {
Some(val) => val.acnt_dsply_name,
None => "".to_string(),
};
render_manual_row(
f,
split_body[1],
"Account: ",
manual_state.account.as_ref().map(|val| val.acnt_dsply_name.clone()).unwrap_or_default(),
manual_state.focus,
ManualDataFocus::Account,
);
render_manual_row(
f,
split_body[num_rendered * 2],
"Account: ",
right_text,
manual_state.focus,
ManualDataFocus::Account
);
render_manual_row(
f,
split_body[3],
"Amount: ",
manual_state.amount.map(|val| val.to_string()).unwrap_or_default(),
manual_state.focus,
ManualDataFocus::Amount,
);
first_found = true;
num_rendered = 1;
}
render_manual_row(
f,
split_body[5],
"Date: ",
manual_state.date.as_ref().map(|val| val.to_string()).unwrap_or_default(),
manual_state.focus,
ManualDataFocus::Date,
);
if (first_found && num_rendered < num_can_show)
|| matches!(manual_state.focus.unwrap(), ManualDataFocus::Amount)
{
let right_text = match manual_state.amount {
Some(val) => val.to_string(),
None => "".to_string(),
};
render_manual_row(
f,
split_body[7],
"Bucket: ",
manual_state.bucket.as_ref().map(|val| val.bkt_dsply_code.clone()).unwrap_or_default(),
manual_state.focus,
ManualDataFocus::Bucket,
);
render_manual_row(
f,
split_body[num_rendered * 2],
"Amount: ",
right_text,
manual_state.focus,
ManualDataFocus::Amount
);
render_manual_row(
f,
split_body[split_body.len() - 4],
"Description: ",
manual_state.description.clone().unwrap_or("".to_string()),
manual_state.focus,
ManualDataFocus::Description,
);
first_found = true;
num_rendered += 1;
}
render_manual_row(
f,
split_body[split_body.len() - 2],
"Transaction Breakdown: ",
"[ + ]".to_string(),
manual_state.focus,
ManualDataFocus::Breakdowns,
);
}
}
@ -201,12 +265,16 @@ pub fn render_manual_row<B: Backend>(
let horizontal_pieces = Layout::default()
.direction(Direction::Horizontal)
.constraints([Constraint::Percentage(35), Constraint::Percentage(45), Constraint::Percentage(20)])
.constraints([
Constraint::Percentage(35),
Constraint::Percentage(45),
Constraint::Percentage(20),
])
.split(row_area);
f.render_widget(
Paragraph::new(Text::styled(left_text, Style::default().fg(Color::Yellow)))
.alignment(Alignment::Right),
.alignment(Alignment::Right),
horizontal_pieces[0],
);
@ -223,7 +291,7 @@ pub fn render_manual_row<B: Backend>(
Block::default()
.borders(Borders::NONE)
.style(Style::default().bg(right_bg_color)),
),
),
horizontal_pieces[1],
);
}