From b9244f6049c685c2b983632359676521506f8772 Mon Sep 17 00:00:00 2001 From: Joe Carstairs Date: Sun, 8 Feb 2026 15:22:50 +0000 Subject: task-085: fetches transactions from database --- schist_desktop_gui/src/gui.rs | 19 +++++++++++++++++-- .../src/gui/components/transactions_view.rs | 10 ++++++++++ .../src/gui/screens/main_screen/main_screen.rs | 9 ++++++++- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/schist_desktop_gui/src/gui.rs b/schist_desktop_gui/src/gui.rs index 26f147b..9648ff0 100644 --- a/schist_desktop_gui/src/gui.rs +++ b/schist_desktop_gui/src/gui.rs @@ -7,8 +7,10 @@ use std::{path::PathBuf, str::FromStr}; use diesel::SqliteConnection; use iced::{Element, Task}; -use schist_models::{Account, Bucket}; -use schist_queries::{accounts::get_all_accounts, buckets::get_all_buckets}; +use schist_models::{Account, Bucket, Transaction}; +use schist_queries::{ + accounts::get_all_accounts, buckets::get_all_buckets, transactions::get_all_transactions, +}; use crate::{ cache::{put_to_cache, remove_from_cache, CACHE_KEYS}, @@ -32,6 +34,7 @@ pub enum Message { MainScreenMessage(main_screen::Message), RefetchedAccounts(FetchResult>), RefetchedBuckets(FetchResult>), + RefetchedTransactions(FetchResult>), } pub type FetchResult = std::result::Result; @@ -185,6 +188,16 @@ impl Gui { } iced::Task::none() } + Message::RefetchedTransactions(transactions) => { + match transactions { + Ok(transactions) => { + self.main_screen + .update(main_screen::Message::SetTransactions(transactions)); + } + Err(err) => println!("Failed to get transactions: {:?}", err.message), + }; + Task::none() + } Message::FilesScreenMessage(message) => self.update_files_screen(message), Message::FailedToCreateFile(err) => { self.update_files_screen(files_screen::Message::ReportFailedToCreateFile(err)) @@ -226,6 +239,7 @@ impl Gui { ) -> Task { let buckets = get_all_buckets(&mut connection).map_err(FetchError::new); let accounts = get_all_accounts(&mut connection).map_err(FetchError::new); + let transactions = get_all_transactions(&mut connection).map_err(FetchError::new); self.connection = Some(connection); self.active_screen = Screen::MainScreen; if let Some(path) = path.to_str() { @@ -236,6 +250,7 @@ impl Gui { iced::Task::batch(vec![ self.update(Message::RefetchedBuckets(buckets)), self.update(Message::RefetchedAccounts(accounts)), + self.update(Message::RefetchedTransactions(transactions)), ]) } diff --git a/schist_desktop_gui/src/gui/components/transactions_view.rs b/schist_desktop_gui/src/gui/components/transactions_view.rs index d28629d..6f2ad44 100644 --- a/schist_desktop_gui/src/gui/components/transactions_view.rs +++ b/schist_desktop_gui/src/gui/components/transactions_view.rs @@ -26,6 +26,7 @@ pub enum Message { SelectNextAccount, SelectPrevAccount, SetAccounts(Vec), + SetTransactions(Vec), } pub enum Action { @@ -86,6 +87,7 @@ impl<'a> Component<'a, Message, Action> for TransactionsView { self.navigation.update(message); Action::None } + Message::SetAccounts(accounts) => { let account_navigation_entries: Vec = accounts .into_iter() @@ -95,10 +97,18 @@ impl<'a> Component<'a, Message, Action> for TransactionsView { .update(navigation::Message::SetOptions(account_navigation_entries)); Action::None } + + Message::SetTransactions(transactions) => { + self.transactions_by_account_id = + transactions.into_iter().into_group_map_by(|t| t.account_id); + Action::None + } + Message::SelectNextAccount => { self.navigation.update(navigation::Message::SelectNext); Action::None } + Message::SelectPrevAccount => { self.navigation.update(navigation::Message::SelectPrev); Action::None diff --git a/schist_desktop_gui/src/gui/screens/main_screen/main_screen.rs b/schist_desktop_gui/src/gui/screens/main_screen/main_screen.rs index 0e8d084..0a2c355 100644 --- a/schist_desktop_gui/src/gui/screens/main_screen/main_screen.rs +++ b/schist_desktop_gui/src/gui/screens/main_screen/main_screen.rs @@ -4,7 +4,7 @@ use iced::{ widget::{row, Container}, Element, Length, }; -use schist_models::{Account, Bucket}; +use schist_models::{Account, Bucket, Transaction}; use crate::{ gui::components::{ @@ -36,6 +36,7 @@ pub enum Message { SelectView(View), SetAccounts(Vec), SetBuckets(Vec), + SetTransactions(Vec), ViewNavigationMessage(navigation::Message), } @@ -118,6 +119,12 @@ impl<'a> Component<'a, Message, Action> for MainScreen { Action::None } + Message::SetTransactions(transactions) => { + self.transactions_view + .update(transactions_view::Message::SetTransactions(transactions)); + Action::None + } + Message::NextItem => match self.active_view { View::Balances => { self.balances_view -- cgit v1.2.3