Skip to content
Snippets Groups Projects
Commit 0c270824 authored by Florian Schindler's avatar Florian Schindler
Browse files

add transaction

ability to add and edit transaction
- transactions are now read from hive and saved to hive
parent e4f1f861
No related branches found
No related tags found
No related merge requests found
import 'package:flutter/material.dart'; 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/home_view.dart';
import 'package:trackeroo/frontend/views/details_view.dart'; import 'package:trackeroo/frontend/views/details_view.dart';
import 'package:trackeroo/frontend/views/category_view.dart'; import 'package:trackeroo/frontend/views/category_view.dart';
...@@ -78,7 +79,10 @@ class _AppScaffoldState extends State<AppScaffold> { ...@@ -78,7 +79,10 @@ class _AppScaffoldState extends State<AppScaffold> {
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
onPressed: () { onPressed: () {
if(index == 0 || index == 1) { if(index == 0 || index == 1) {
// add tranaction Navigator.push(
context,
MaterialPageRoute(builder: (context) => const EditTransactionView())
);
} }
if(index == 2) { if(index == 2) {
// add category // add category
......
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fl_chart/fl_chart.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/utils/transaction_listtile.dart';
import 'package:trackeroo/frontend/views/onboarding_view.dart'; import 'package:trackeroo/frontend/views/onboarding_view.dart';
import 'package:trackeroo/logic/models/transaction.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 } enum Timespan { daily, weekly, monthly, yearly, all }
...@@ -18,6 +21,7 @@ class _HomeViewState extends State<HomeView> { ...@@ -18,6 +21,7 @@ class _HomeViewState extends State<HomeView> {
Transaction trp = Transaction(title: "Gehalt", amount: 1300, categoryId: 'leisure_and_entertainment', dueDate: DateTime.now()); Transaction trp = Transaction(title: "Gehalt", amount: 1300, categoryId: 'leisure_and_entertainment', dueDate: DateTime.now());
Timespan timespanView = Timespan.monthly; Timespan timespanView = Timespan.monthly;
TransactionsController transContr = locator.get<TransactionsController>();
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
...@@ -154,11 +158,29 @@ class _HomeViewState extends State<HomeView> { ...@@ -154,11 +158,29 @@ class _HomeViewState extends State<HomeView> {
), ),
), ),
const SizedBox(height: 5.0), const SizedBox(height: 5.0),
TransactionListtile(transaction: trn), ValueListenableBuilder(
TransactionListtile(transaction: trn), valueListenable: transContr.transactionsBox.listenable(),
TransactionListtile(transaction: trn), builder: (context, Box<Transaction> box, widget) {
TransactionListtile(transaction: trp), transContr.transactionsList = box.values.toList();
TransactionListtile(transaction: trn), 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( FilledButton(
onPressed: () { onPressed: () {
Navigator.push( Navigator.push(
......
...@@ -49,10 +49,9 @@ Future<void> setupLocatorService() async { ...@@ -49,10 +49,9 @@ Future<void> setupLocatorService() async {
locator.registerLazySingleton<CategoriesController>(() => categoriesController); locator.registerLazySingleton<CategoriesController>(() => categoriesController);
Box<Transaction> transactionsBox = await Hive.openBox<Transaction>('transactions_box'); Box<Transaction> transactionsBox = await Hive.openBox<Transaction>('transactions_box');
List<Transaction> transactionsList = HiveList(transactionsBox);
TransactionsController transactionsController = TransactionsController( TransactionsController transactionsController = TransactionsController(
transactionsBox: transactionsBox, transactionsBox: transactionsBox,
transactions: transactionsList transactionsList: transactionsBox.values.toList()
); );
locator.registerLazySingleton<TransactionsController>(() => transactionsController); locator.registerLazySingleton<TransactionsController>(() => transactionsController);
} }
...@@ -5,25 +5,53 @@ import 'package:trackeroo/logic/services/categories_controller.dart'; ...@@ -5,25 +5,53 @@ import 'package:trackeroo/logic/services/categories_controller.dart';
import 'package:trackeroo/logic/services/locator.dart'; import 'package:trackeroo/logic/services/locator.dart';
class TransactionsController { class TransactionsController {
TransactionsController({required this.transactionsBox, required this.transactions}); TransactionsController({required this.transactionsBox, required this.transactionsList});
Box<Transaction> transactionsBox; Box<Transaction> transactionsBox;
List<Transaction> transactions; List<Transaction> transactionsList;
late Transaction lastDeletedTransaction;
void saveTransaction(Transaction transaction) { Future<bool> saveTransaction(Transaction transaction) async {
locator.get<CategoriesController>().categories[transaction.categoryId]?.spendings += transaction.amount; try {
int id = UniqueKey().hashCode; locator.get<CategoriesController>().categories[transaction.categoryId]?.spendings += transaction.amount;
transaction.id = id; int id = UniqueKey().hashCode;
transactionsBox.put(transaction.id, transaction); transaction.id = id;
transactions.add(transaction); await transactionsBox.put(transaction.id, transaction);
transactionsList = transactionsBox.values.toList();
} catch (e) {
return false;
}
return true;
} }
void updateTransaction() { Future<bool> updateTransaction(Transaction transaction) async {
// TODO: implement update transaction try {
await transactionsBox.put(transaction.id, transaction);
transactionsList = transactionsBox.values.toList();
} catch (e) {
return false;
}
return true;
} }
void deleteTransaction(Transaction transaction) { Future<bool> deleteTransaction(Transaction transaction) async {
transactionsBox.delete(transaction.id); try {
transactions.remove(transaction); 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;
} }
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment