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

tried adding functionality to top of home_view

TRIED bcs it not working, fixi dixi tomorrow, wenn ich nicht vergessen hab wie das alles funktioniert und was ich mir dabei gedacht hab
parent 2f140522
No related branches found
No related tags found
No related merge requests found
...@@ -29,7 +29,9 @@ class _TransactionListtileState extends State<TransactionListtile> { ...@@ -29,7 +29,9 @@ class _TransactionListtileState extends State<TransactionListtile> {
key: UniqueKey(), key: UniqueKey(),
direction: DismissDirection.startToEnd, direction: DismissDirection.startToEnd,
onDismissed: (_) => { onDismissed: (_) => {
locator.get<TransactionsController>().deleteTransaction(widget.transaction), setState(() {
locator.get<TransactionsController>().deleteTransaction(widget.transaction);
}),
ScaffoldMessenger.of(context).removeCurrentSnackBar(), ScaffoldMessenger.of(context).removeCurrentSnackBar(),
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
......
...@@ -3,7 +3,9 @@ import 'package:fl_chart/fl_chart.dart'; ...@@ -3,7 +3,9 @@ import 'package:fl_chart/fl_chart.dart';
import 'package:hive_flutter/hive_flutter.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/category.dart';
import 'package:trackeroo/logic/models/transaction.dart'; import 'package:trackeroo/logic/models/transaction.dart';
import 'package:trackeroo/logic/services/categories_controller.dart';
import 'package:trackeroo/logic/services/locator.dart'; import 'package:trackeroo/logic/services/locator.dart';
import 'package:trackeroo/logic/services/transactions_controller.dart'; import 'package:trackeroo/logic/services/transactions_controller.dart';
...@@ -28,176 +30,213 @@ class _HomeViewState extends State<HomeView> { ...@@ -28,176 +30,213 @@ class _HomeViewState extends State<HomeView> {
return SingleChildScrollView( return SingleChildScrollView(
child: Padding( child: Padding(
padding: const EdgeInsets.all(16.0), padding: const EdgeInsets.all(16.0),
child: Column( child: ValueListenableBuilder(
mainAxisAlignment: MainAxisAlignment.start, valueListenable: transContr.transactionsBox.listenable(),
crossAxisAlignment: CrossAxisAlignment.start, builder: (context, Box<Transaction> box, widget) {
children: <Widget>[ transContr.transactionsList = box.values.toList();
const Text( transContr.transactionsList.sort((b, a) => a.createdAt.compareTo(b.createdAt));
'Balance', return Column(
style: TextStyle( mainAxisAlignment: MainAxisAlignment.start,
fontSize: 14.0, crossAxisAlignment: CrossAxisAlignment.start,
fontWeight: FontWeight.bold children: <Widget>[
), const Text(
), 'Balance',
const SizedBox(height: 5.0), style: TextStyle(
const Text( fontSize: 14.0,
'4932.32 €', fontWeight: FontWeight.bold
style: TextStyle( ),
fontSize: 40.0, ),
fontWeight: FontWeight.w300 const SizedBox(height: 5.0),
), Text(
), transContr.balance.toStringAsFixed(2),
const SizedBox(height: 10.0), style: const TextStyle(
const Text( fontSize: 40.0,
'Overview', fontWeight: FontWeight.w300
style: TextStyle( ),
fontSize: 14.0, ),
fontWeight: FontWeight.bold const SizedBox(height: 10.0),
), const Text(
), 'Overview',
const SizedBox(height: 5.0), style: TextStyle(
Row( fontSize: 14.0,
mainAxisAlignment: MainAxisAlignment.spaceBetween, fontWeight: FontWeight.bold
children: [ ),
const Column( ),
crossAxisAlignment: CrossAxisAlignment.start, const SizedBox(height: 5.0),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Row( Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Icon(Icons.arrow_downward, color: Colors.green, size: 16.0), const Row(
Text('Income'), children: [
Icon(Icons.arrow_downward, color: Colors.green, size: 16.0),
Text('Income'),
],
),
Text('${transContr.income.toStringAsFixed(2)} €')
], ],
), ),
Text('1234.56€') Center(
], child: SizedBox(
), height: 200.0,
Center( width: 50.0,
child: SizedBox( child: PieChart(
height: 200.0, PieChartData(
width: 50.0, centerSpaceRadius: 0,
child: PieChart( sections: transContr.transactionsList.isNotEmpty ? buildPieChartSectionList(context) : null,
PieChartData( ),
centerSpaceRadius: 50.0, swapAnimationDuration: const Duration(milliseconds: 500),
sections: [ swapAnimationCurve: Curves.easeInOut,
buildPieChartSection(context, 93.302), ),
buildPieChartSection(context, 43.302), ),
buildPieChartSection(context, 104.302),
buildPieChartSection(context, 120.302),
buildPieChartSection(context, 110.302)
]
)
), ),
), Column(
), crossAxisAlignment: CrossAxisAlignment.start,
const Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [ children: [
Icon(Icons.arrow_upward, color: Colors.red, size: 16.0), const Row(
Text('Expenses'), children: [
Icon(Icons.arrow_upward, color: Colors.red, size: 16.0),
Text('Expenses'),
],
),
Text('${transContr.expenses.toStringAsFixed(2)} €')
], ],
), ),
Text('1234.56€')
], ],
), ),
], const SizedBox(height: 10.0),
), Row(
const SizedBox(height: 10.0), mainAxisAlignment: MainAxisAlignment.spaceBetween,
Row( children: [
mainAxisAlignment: MainAxisAlignment.spaceBetween, FilterChip(
children: [ onSelected: (value) => setState(() {
FilterChip( timespanView = Timespan.daily;
onSelected: (value) => setState(() { }),
timespanView = Timespan.daily; label: const Text('Daily'),
}), selected: timespanView == Timespan.daily,
label: const Text('Daily'), showCheckmark: false
selected: timespanView == Timespan.daily, ),
showCheckmark: false FilterChip(
), onSelected: (value) => setState(() {
FilterChip( timespanView = Timespan.weekly;
onSelected: (value) => setState(() { }),
timespanView = Timespan.weekly; label: const Text('Weekly'),
}), selected: timespanView == Timespan.weekly,
label: const Text('Weekly'), showCheckmark: false
selected: timespanView == Timespan.weekly, ),
showCheckmark: false FilterChip(
), onSelected: (value) => setState(() {
FilterChip( timespanView = Timespan.monthly;
onSelected: (value) => setState(() { }),
timespanView = Timespan.monthly; label: const Text('Montly'),
}), selected: timespanView == Timespan.monthly,
label: const Text('Montly'), showCheckmark: false
selected: timespanView == Timespan.monthly, ),
showCheckmark: false FilterChip(
onSelected: (value) => setState(() {
timespanView = Timespan.yearly;
}),
label: const Text('Yearly'),
selected: timespanView == Timespan.yearly,
showCheckmark: false
),
FilterChip(
onSelected: (value) => setState(() {
timespanView = Timespan.all;
}),
label: const Text('All'),
selected: timespanView == Timespan.all,
showCheckmark: false
)
],
), ),
FilterChip( const SizedBox(height: 20.0),
onSelected: (value) => setState(() { const Text(
timespanView = Timespan.yearly; 'Transactions',
}), style: TextStyle(
label: const Text('Yearly'), fontSize: 14.0,
selected: timespanView == Timespan.yearly, fontWeight: FontWeight.bold
showCheckmark: false ),
), ),
FilterChip( const SizedBox(height: 5.0),
onSelected: (value) => setState(() { box.isEmpty ? const SizedBox(
timespanView = Timespan.all; height: 200.0,
}), child: Center(
label: const Text('All'), child: Text('no existing transactions yet'),
selected: timespanView == Timespan.all, ),
showCheckmark: false ) : ListView.builder(
)
],
),
const SizedBox(height: 20.0),
const Text(
'Transactions',
style: TextStyle(
fontSize: 14.0,
fontWeight: FontWeight.bold
),
),
const SizedBox(height: 5.0),
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(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
itemCount: transContr.transactionsList.length <= 25 ? transContr.transactionsList.length : 25, itemCount: transContr.transactionsList.length <= 25 ? transContr.transactionsList.length : 25,
itemBuilder: (context, index) => TransactionListtile(transaction: transContr.transactionsList[index]) itemBuilder: (context, index) => TransactionListtile(transaction: transContr.transactionsList[index])
); ),
}, FilledButton(
), onPressed: () {
FilledButton( Navigator.push(
onPressed: () { context,
Navigator.push( MaterialPageRoute(builder: (context) => const OnboardingView())
context, );
MaterialPageRoute(builder: (context) => const OnboardingView()) },
); child: const Text('onboarding')
}, ),
child: const Text('onboarding') ],
), );
], }
), ),
), ),
); );
} }
PieChartSectionData buildPieChartSection(BuildContext context, double value) { List<PieChartSectionData> buildPieChartSectionList(BuildContext context) {
return PieChartSectionData( List<PieChartSectionData> sectionList = [];
value: value,
color: Theme.of(context).colorScheme.secondaryContainer int elapsedDays = transContr.transactionsList.last.createdAt.difference(DateTime.now()).inDays;
); if(elapsedDays <= 0) elapsedDays = 1;
double other = 0;
for (Category cat in locator.get<CategoriesController>().categories.values) {
double categorySum = 0;
double avg = 0;
for(Transaction tr in transContr.transactionsList) {
if(tr.categoryId == cat.id) {
categorySum += tr.amount;
}
}
if(timespanView == Timespan.daily) {
avg = categorySum / elapsedDays;
} else if(timespanView == Timespan.weekly) {
avg = categorySum / (elapsedDays / 7);
} else if(timespanView == Timespan.monthly) {
avg = categorySum / (elapsedDays / 30);
} else if(timespanView == Timespan.yearly) {
avg = categorySum / (elapsedDays / 365);
} else {
avg = categorySum;
}
bool meetsThreshold = (categorySum / transContr.balance) > 0.2;
if(!meetsThreshold) {
other += avg;
}
if(!avg.isNaN && meetsThreshold) {
sectionList.add(PieChartSectionData(
value: double.parse(avg.toStringAsFixed(2)),
color: Color(cat.colorValue),
radius: 100.0
));
}
}
sectionList.add(PieChartSectionData(
value: double.parse(other.toStringAsFixed(2)),
color: Colors.grey,
radius: 100.0
));
return sectionList;
} }
} }
...@@ -49,9 +49,23 @@ Future<void> setupLocatorService() async { ...@@ -49,9 +49,23 @@ 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');
double balance = 0;
double income = 0;
double expenses = 0;
for(Transaction tr in transactionsBox.values.toList()) {
balance += tr.amount;
if(tr.amount.isNegative) {
expenses += tr.amount;
} else {
income += tr.amount;
}
}
TransactionsController transactionsController = TransactionsController( TransactionsController transactionsController = TransactionsController(
transactionsBox: transactionsBox, transactionsBox: transactionsBox,
transactionsList: transactionsBox.values.toList() transactionsList: transactionsBox.values.toList(),
balance: balance,
income: income,
expenses: expenses
); );
locator.registerLazySingleton<TransactionsController>(() => transactionsController); locator.registerLazySingleton<TransactionsController>(() => transactionsController);
} }
...@@ -4,11 +4,14 @@ import 'package:trackeroo/logic/models/transaction.dart'; ...@@ -4,11 +4,14 @@ import 'package:trackeroo/logic/models/transaction.dart';
import 'package:trackeroo/logic/services/categories_controller.dart'; 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 extends ChangeNotifier {
TransactionsController({required this.transactionsBox, required this.transactionsList}); TransactionsController({required this.transactionsBox, required this.transactionsList, required this.balance, required this.income, required this.expenses});
Box<Transaction> transactionsBox; Box<Transaction> transactionsBox;
List<Transaction> transactionsList; List<Transaction> transactionsList;
double balance;
double income;
double expenses;
late Transaction lastDeletedTransaction; late Transaction lastDeletedTransaction;
Future<bool> saveTransaction(Transaction transaction) async { Future<bool> saveTransaction(Transaction transaction) async {
...@@ -18,6 +21,12 @@ class TransactionsController { ...@@ -18,6 +21,12 @@ class TransactionsController {
transaction.id = id; transaction.id = id;
await transactionsBox.put(transaction.id, transaction); await transactionsBox.put(transaction.id, transaction);
transactionsList = transactionsBox.values.toList(); transactionsList = transactionsBox.values.toList();
balance += transaction.amount;
if(transaction.amount.isNegative) {
expenses += transaction.amount;
} else {
income += transaction.amount;
}
} catch (e) { } catch (e) {
return false; return false;
} }
...@@ -39,6 +48,12 @@ class TransactionsController { ...@@ -39,6 +48,12 @@ class TransactionsController {
lastDeletedTransaction = transaction; lastDeletedTransaction = transaction;
await transactionsBox.delete(transaction.id); await transactionsBox.delete(transaction.id);
transactionsList = transactionsBox.values.toList(); transactionsList = transactionsBox.values.toList();
balance -= transaction.amount;
if(transaction.amount.isNegative) {
expenses -= transaction.amount;
} else {
income -= transaction.amount;
}
} catch (e) { } catch (e) {
return false; return false;
} }
...@@ -49,6 +64,13 @@ class TransactionsController { ...@@ -49,6 +64,13 @@ class TransactionsController {
try { try {
await transactionsBox.put(lastDeletedTransaction.id, lastDeletedTransaction); await transactionsBox.put(lastDeletedTransaction.id, lastDeletedTransaction);
transactionsList = transactionsBox.values.toList(); transactionsList = transactionsBox.values.toList();
balance += lastDeletedTransaction.amount;
if(lastDeletedTransaction.amount.isNegative) {
expenses += lastDeletedTransaction.amount;
} else {
income += lastDeletedTransaction.amount;
}
} catch (e) { } catch (e) {
return false; return false;
} }
......
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