From 782ad055583e500f6041922ce197bbf407022286 Mon Sep 17 00:00:00 2001 From: Lisheng Guan Date: Mon, 7 Oct 2024 21:22:17 +0800 Subject: [PATCH] TxnListView with year filter for performance --- .../Transaction/TransactionListView.swift | 40 +++++++++++++++---- MMEX/ViewModel/TransactionViewModel.swift | 4 +- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/MMEX/View/Transaction/TransactionListView.swift b/MMEX/View/Transaction/TransactionListView.swift index 13fa4ae0..a9b7cb80 100644 --- a/MMEX/View/Transaction/TransactionListView.swift +++ b/MMEX/View/Transaction/TransactionListView.swift @@ -14,6 +14,9 @@ struct TransactionListView: View { @State private var newTxn = TransactionData() @State private var isPresentingTransactionAddView = false + // State variables for date filtering + @State private var selectedYear = Calendar.current.component(.year, from: Date()) + var body: some View { Group { List($viewModel.txns) { $txn in @@ -57,19 +60,34 @@ struct TransactionListView: View { } } .toolbar { - Button(action: { - isPresentingTransactionAddView = true - }, label: { - Image(systemName: "plus") - }) - .accessibilityLabel("New Transaction") + // Year Picker + ToolbarItem(placement: .navigation) { + Picker("Year", selection: $selectedYear) { + ForEach((2010...Calendar.current.component(.year, from: Date())).reversed(), id: \.self) { year in + Text(String(format: "%d", year)).tag(year) // Correct year format + } + } + .pickerStyle(MenuPickerStyle()) // Show as a menu + .onChange(of: selectedYear) { + filterTransactions() + } + } + + ToolbarItem(placement: .navigation) { + Button(action: { + isPresentingTransactionAddView = true + }, label: { + Image(systemName: "plus") + }) + .accessibilityLabel("New Transaction") + } } } .onAppear { viewModel.loadAccounts() viewModel.loadCategories() viewModel.loadPayees() - viewModel.loadTransactions() + filterTransactions() // database level setting let repository = env.infotableRepository @@ -116,6 +134,14 @@ struct TransactionListView: View { return isoDate */ } + + // Filter transactions based on selected year + func filterTransactions() { + let startDate = Calendar.current.date(from: DateComponents(year: selectedYear, month: 1, day: 1)) ?? Date() + let endDate = Calendar.current.date(from: DateComponents(year: selectedYear + 1, month: 1, day: 1))?.addingTimeInterval(-1) ?? Date() + + viewModel.loadTransactions(for: nil, startDate: startDate, endDate: endDate) + } } #Preview { diff --git a/MMEX/ViewModel/TransactionViewModel.swift b/MMEX/ViewModel/TransactionViewModel.swift index 8d66febc..b9ac96a2 100644 --- a/MMEX/ViewModel/TransactionViewModel.swift +++ b/MMEX/ViewModel/TransactionViewModel.swift @@ -177,9 +177,9 @@ class TransactionViewModel: ObservableObject { } } - func loadTransactions(for accountId: Int64? = nil) { + func loadTransactions(for accountId: Int64? = nil, startDate: Date? = nil, endDate: Date? = nil) { DispatchQueue.global(qos: .background).async { - var loadedTransactions = self.transactionRepo?.loadRecent(accountId: accountId) ?? [] + var loadedTransactions = self.transactionRepo?.loadRecent(accountId: accountId, startDate: startDate, endDate: endDate) ?? [] for i in loadedTransactions.indices { // TODO other better indicator if loadedTransactions[i].categId <= 0 {