diff options
| author | Joe Carstairs <me@joeac.net> | 2026-02-22 09:32:21 +0000 |
|---|---|---|
| committer | Joe Carstairs <me@joeac.net> | 2026-02-22 09:32:21 +0000 |
| commit | 96e1b8a6158e5ac3b56c03718de5650ff805d41b (patch) | |
| tree | 7fb37d9acc354488b611cec5da76e02ce78439f6 /schist_desktop_gui/src | |
| parent | 6137e4bec5fd7f34c66162b32424343a30b3c5f2 (diff) | |
task-085: displays running balances
Diffstat (limited to 'schist_desktop_gui/src')
| -rw-r--r-- | schist_desktop_gui/src/gui/components/transactions_view.rs | 33 | ||||
| -rw-r--r-- | schist_desktop_gui/src/gui/components/transactions_view/view_transactions_view.rs | 22 |
2 files changed, 41 insertions, 14 deletions
diff --git a/schist_desktop_gui/src/gui/components/transactions_view.rs b/schist_desktop_gui/src/gui/components/transactions_view.rs index 11249a1..27e18cd 100644 --- a/schist_desktop_gui/src/gui/components/transactions_view.rs +++ b/schist_desktop_gui/src/gui/components/transactions_view.rs @@ -1,6 +1,6 @@ mod view_transactions_view; -use std::collections::HashMap; +use std::{collections::HashMap, mem::transmute}; use itertools::Itertools; use schist_models::{Account, Bucket, Transaction}; @@ -12,6 +12,7 @@ use crate::{ #[derive(Clone, Debug)] pub struct TransactionsView { + account_balances_by_transaction_id: HashMap<i32, i32>, buckets: Vec<Bucket>, navigation: Navigation<AccountNavigationEntry>, transactions_by_account_id: HashMap<i32, Vec<Transaction>>, @@ -42,13 +43,30 @@ impl TransactionsView { account_navigation_entries.first().cloned(), account_navigation_entries, ); - Self { + let mut transactions_view = Self { + account_balances_by_transaction_id: HashMap::with_capacity(transactions.len()), buckets: buckets.to_vec(), navigation: navigation, - transactions_by_account_id: transactions - .into_iter() - .cloned() - .into_group_map_by(|t| t.account_id), + transactions_by_account_id: HashMap::with_capacity(accounts.len()), + }; + transactions_view.set_transactions(transactions); + transactions_view + } + + fn set_transactions(&mut self, transactions: &[Transaction]) { + self.transactions_by_account_id = transactions + .into_iter() + .cloned() + .into_group_map_by(|t| t.account_id); + self.account_balances_by_transaction_id = HashMap::new(); + for entry in self.transactions_by_account_id.iter_mut() { + entry.1.sort_by(|t1, t2| t2.date.cmp(&t1.date)); + let mut running_balance = 0; + for transaction in entry.1.iter().rev() { + running_balance += transaction.amount; + self.account_balances_by_transaction_id + .insert(transaction.id, running_balance); + } } } } @@ -72,8 +90,7 @@ impl<'a> Component<'a, Message, Action> for TransactionsView { } Message::SetTransactions(transactions) => { - self.transactions_by_account_id = - transactions.into_iter().into_group_map_by(|t| t.account_id); + self.set_transactions(&transactions); Action::None } diff --git a/schist_desktop_gui/src/gui/components/transactions_view/view_transactions_view.rs b/schist_desktop_gui/src/gui/components/transactions_view/view_transactions_view.rs index f43ee48..4f61493 100644 --- a/schist_desktop_gui/src/gui/components/transactions_view/view_transactions_view.rs +++ b/schist_desktop_gui/src/gui/components/transactions_view/view_transactions_view.rs @@ -1,3 +1,5 @@ +use std::collections::HashMap; + use iced::{ alignment, widget::{ @@ -38,7 +40,7 @@ impl<'a> Viewable<'a, Message> for TransactionsView { ), column( Text::default("Balance").width(iced::Length::Fixed(96.0)), - |_t: Transaction| view_balance_cell(), + |t: Transaction| view_balance_cell(t, &self.account_balances_by_transaction_id), ), ]; @@ -106,9 +108,17 @@ fn view_quantity_cell(t: Transaction) -> Text { .align_right() } -fn view_balance_cell() -> Text { - Text::default("TODO") - .width(iced::Length::Fixed(96.0)) - .small() - .clip() +fn view_balance_cell( + transaction: Transaction, + account_balances_by_transaction_id: &HashMap<i32, i32>, +) -> Text { + (account_balances_by_transaction_id + .get(&transaction.id) + .map_or_else( + || Text::default("Error").danger(), + |&balance| Text::currency(balance), + )) + .width(iced::Length::Fixed(96.0)) + .small() + .clip() } |
