summaryrefslogtreecommitdiff
path: root/schist_desktop_gui/src/gui/components
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2026-02-22 09:32:21 +0000
committerJoe Carstairs <me@joeac.net>2026-02-22 09:32:21 +0000
commit96e1b8a6158e5ac3b56c03718de5650ff805d41b (patch)
tree7fb37d9acc354488b611cec5da76e02ce78439f6 /schist_desktop_gui/src/gui/components
parent6137e4bec5fd7f34c66162b32424343a30b3c5f2 (diff)
task-085: displays running balances
Diffstat (limited to 'schist_desktop_gui/src/gui/components')
-rw-r--r--schist_desktop_gui/src/gui/components/transactions_view.rs33
-rw-r--r--schist_desktop_gui/src/gui/components/transactions_view/view_transactions_view.rs22
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()
}