diff --git a/trackeroo/lib/app_scaffold.dart b/trackeroo/lib/app_scaffold.dart index 455d9f0fafe101b30e0cb9c9b2d933dd4b394e54..c5f3f88965b81ac5705f58483f7174754094ce8e 100644 --- a/trackeroo/lib/app_scaffold.dart +++ b/trackeroo/lib/app_scaffold.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:trackeroo/frontend/views/edit_transaction_view.dart'; import 'package:trackeroo/frontend/views/home_view.dart'; import 'package:trackeroo/frontend/views/details_view.dart'; import 'package:trackeroo/frontend/views/category_view.dart'; @@ -78,7 +79,10 @@ class _AppScaffoldState extends State<AppScaffold> { floatingActionButton: FloatingActionButton( onPressed: () { if(index == 0 || index == 1) { - // add tranaction + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const EditTransactionView()) + ); } if(index == 2) { // add category diff --git a/trackeroo/lib/frontend/views/home_view.dart b/trackeroo/lib/frontend/views/home_view.dart index 9b1b7028077ea37a90e28280dcb3c2aaa730cca4..9b9ccb417fd5695211927d19b53a89c3e50a7484 100644 --- a/trackeroo/lib/frontend/views/home_view.dart +++ b/trackeroo/lib/frontend/views/home_view.dart @@ -1,8 +1,11 @@ import 'package:flutter/material.dart'; import 'package:fl_chart/fl_chart.dart'; +import 'package:hive_flutter/hive_flutter.dart'; import 'package:trackeroo/frontend/utils/transaction_listtile.dart'; import 'package:trackeroo/frontend/views/onboarding_view.dart'; import 'package:trackeroo/logic/models/transaction.dart'; +import 'package:trackeroo/logic/services/locator.dart'; +import 'package:trackeroo/logic/services/transactions_controller.dart'; enum Timespan { daily, weekly, monthly, yearly, all } @@ -18,6 +21,7 @@ class _HomeViewState extends State<HomeView> { Transaction trp = Transaction(title: "Gehalt", amount: 1300, categoryId: 'leisure_and_entertainment', dueDate: DateTime.now()); Timespan timespanView = Timespan.monthly; + TransactionsController transContr = locator.get<TransactionsController>(); @override Widget build(BuildContext context) { @@ -154,11 +158,29 @@ class _HomeViewState extends State<HomeView> { ), ), const SizedBox(height: 5.0), - TransactionListtile(transaction: trn), - TransactionListtile(transaction: trn), - TransactionListtile(transaction: trn), - TransactionListtile(transaction: trp), - TransactionListtile(transaction: trn), + ValueListenableBuilder( + valueListenable: transContr.transactionsBox.listenable(), + builder: (context, Box<Transaction> box, widget) { + transContr.transactionsList = box.values.toList(); + transContr.transactionsList.sort((b, a) => a.createdAt.compareTo(b.createdAt)); + if(box.isEmpty) { + return const SizedBox( + height: 200.0, + child: Center( + child: Text('no existing transactions yet'), + ), + ); + } + return ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: transContr.transactionsList.length <= 25 ? transContr.transactionsList.length : 25, + itemBuilder: (context, index) { + return TransactionListtile(transaction: transContr.transactionsList[index]); + }, + ); + }, + ), FilledButton( onPressed: () { Navigator.push( diff --git a/trackeroo/lib/logic/services/locator.dart b/trackeroo/lib/logic/services/locator.dart index 70b733cce7e59a8352dc85f986a33cd21634be7d..5936372cf217405c94d6833e52af363a116290a9 100644 --- a/trackeroo/lib/logic/services/locator.dart +++ b/trackeroo/lib/logic/services/locator.dart @@ -49,10 +49,9 @@ Future<void> setupLocatorService() async { locator.registerLazySingleton<CategoriesController>(() => categoriesController); Box<Transaction> transactionsBox = await Hive.openBox<Transaction>('transactions_box'); - List<Transaction> transactionsList = HiveList(transactionsBox); TransactionsController transactionsController = TransactionsController( transactionsBox: transactionsBox, - transactions: transactionsList + transactionsList: transactionsBox.values.toList() ); locator.registerLazySingleton<TransactionsController>(() => transactionsController); } diff --git a/trackeroo/lib/logic/services/transactions_controller.dart b/trackeroo/lib/logic/services/transactions_controller.dart index 934fbba73cc9f631fc06268b35ec3563e79b1297..88a7cfcc4546ef8a793e2b1f202f0fafdc133cb6 100644 --- a/trackeroo/lib/logic/services/transactions_controller.dart +++ b/trackeroo/lib/logic/services/transactions_controller.dart @@ -5,25 +5,53 @@ import 'package:trackeroo/logic/services/categories_controller.dart'; import 'package:trackeroo/logic/services/locator.dart'; class TransactionsController { - TransactionsController({required this.transactionsBox, required this.transactions}); + TransactionsController({required this.transactionsBox, required this.transactionsList}); Box<Transaction> transactionsBox; - List<Transaction> transactions; + List<Transaction> transactionsList; + late Transaction lastDeletedTransaction; - void saveTransaction(Transaction transaction) { - locator.get<CategoriesController>().categories[transaction.categoryId]?.spendings += transaction.amount; - int id = UniqueKey().hashCode; - transaction.id = id; - transactionsBox.put(transaction.id, transaction); - transactions.add(transaction); + Future<bool> saveTransaction(Transaction transaction) async { + try { + locator.get<CategoriesController>().categories[transaction.categoryId]?.spendings += transaction.amount; + int id = UniqueKey().hashCode; + transaction.id = id; + await transactionsBox.put(transaction.id, transaction); + transactionsList = transactionsBox.values.toList(); + } catch (e) { + return false; + } + return true; } - void updateTransaction() { - // TODO: implement update transaction + Future<bool> updateTransaction(Transaction transaction) async { + try { + await transactionsBox.put(transaction.id, transaction); + transactionsList = transactionsBox.values.toList(); + } catch (e) { + return false; + } + return true; } - void deleteTransaction(Transaction transaction) { - transactionsBox.delete(transaction.id); - transactions.remove(transaction); + Future<bool> deleteTransaction(Transaction transaction) async { + try { + lastDeletedTransaction = transaction; + await transactionsBox.delete(transaction.id); + transactionsList = transactionsBox.values.toList(); + } catch (e) { + return false; + } + return true; + } + + Future<bool> undoLastDeletion() async { + try { + await transactionsBox.put(lastDeletedTransaction.id, lastDeletedTransaction); + transactionsList = transactionsBox.values.toList(); + } catch (e) { + return false; + } + return true; } }