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

additional functionality

- swipe to delete
- edit
- fixed bug where the category would be the same across listtiles
parent e339715c
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/logic/models/category.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/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';
class TransactionListtile extends StatefulWidget { class TransactionListtile extends StatefulWidget {
const TransactionListtile({super.key, required this.transaction}); const TransactionListtile({super.key, required this.transaction});
...@@ -14,78 +16,108 @@ class TransactionListtile extends StatefulWidget { ...@@ -14,78 +16,108 @@ class TransactionListtile extends StatefulWidget {
} }
class _TransactionListtileState extends State<TransactionListtile> { class _TransactionListtileState extends State<TransactionListtile> {
late Category category;
final monthsGer = const ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember']; final monthsGer = const ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
@override
void initState() {
category = locator.get<CategoriesController>().categories[widget.transaction.categoryId] ??
Category(id: 'no_category', title: '', iconCodePoint: Icons.attach_money_rounded.codePoint, colorValue: Colors.transparent.value);
super.initState();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GestureDetector( Category category = locator.get<CategoriesController>().catBox.get(widget.transaction.categoryId)!;
onTap: () => showModalBottomSheet<void>( return Padding(
showDragHandle: true, padding: const EdgeInsets.only(bottom: 5.0),
context: context, child: ClipRRect(
builder: (BuildContext context) { borderRadius: const BorderRadius.all(Radius.circular(12.0)),
return buildModalContent(widget.transaction); child: Dismissible(
}, key: UniqueKey(),
), direction: DismissDirection.startToEnd,
child: Container( onDismissed: (_) => {
padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 12.0), locator.get<TransactionsController>().deleteTransaction(widget.transaction),
margin: const EdgeInsets.only(bottom: 5.0), ScaffoldMessenger.of(context).removeCurrentSnackBar(),
decoration: BoxDecoration( ScaffoldMessenger.of(context).showSnackBar(
color: Theme.of(context).colorScheme.secondaryContainer, SnackBar(
borderRadius: const BorderRadius.all(Radius.circular(12.0)) content: Text(
), 'Transaction deleted',
child: Row( style: TextStyle(
mainAxisAlignment: MainAxisAlignment.spaceBetween, color: Theme.of(context).colorScheme.onSecondary
children: [
Row(
children: [
Container(
width: 50.0,
height: 50.0,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(8.0)),
color: Theme.of(context).colorScheme.surface
), ),
child: Icon(IconData(category.iconCodePoint, fontFamily: category.iconFontFamily)),
), ),
const SizedBox(width: 17.0), backgroundColor: Theme.of(context).colorScheme.secondary,
Column( behavior: SnackBarBehavior.floating,
crossAxisAlignment: CrossAxisAlignment.start, shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(8.0))),
children: [ action: SnackBarAction(
Text( label: 'Undo',
widget.transaction.title, textColor: Theme.of(context).colorScheme.onSecondary,
style: const TextStyle( onPressed: () => locator.get<TransactionsController>().undoLastDeletion()
fontSize: 18.0,
fontWeight: FontWeight.bold
),
),
Text(
"${widget.transaction.createdAt.day}.${monthsGer[widget.transaction.createdAt.month]} · ${widget.transaction.createdAt.hour < 10 ? 0 : ''}${widget.transaction.createdAt.hour}:${widget.transaction.createdAt.minute < 10 ? 0 : ''}${widget.transaction.createdAt.minute}"
)
],
), ),
], )
)
},
background: Container(
padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 12.0),
color: Theme.of(context).colorScheme.errorContainer,
alignment: Alignment.centerLeft,
child: Icon(
Icons.delete,
color: Theme.of(context).colorScheme.error,
), ),
Text( ),
'${widget.transaction.amount.toString()} €', child: GestureDetector(
style: TextStyle( onTap: () => showModalBottomSheet<void>(
color: widget.transaction.amount.isNegative ? Colors.red[700] : Colors.green[700] showDragHandle: true,
context: context,
builder: (BuildContext context) {
return buildModalContent(widget.transaction, category, context);
},
),
child: Container(
padding: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 12.0),
color: Theme.of(context).colorScheme.secondaryContainer,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Row(
children: [
Container(
width: 50.0,
height: 50.0,
decoration: BoxDecoration(
borderRadius: const BorderRadius.all(Radius.circular(8.0)),
color: Theme.of(context).colorScheme.surface
),
child: Icon(IconData(category.iconCodePoint, fontFamily: category.iconFontFamily)),
),
const SizedBox(width: 17.0),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
widget.transaction.title,
style: const TextStyle(
fontSize: 18.0,
fontWeight: FontWeight.bold
),
),
Text(
"${widget.transaction.createdAt.day}.${monthsGer[widget.transaction.createdAt.month]} · ${widget.transaction.createdAt.hour < 10 ? 0 : ''}${widget.transaction.createdAt.hour}:${widget.transaction.createdAt.minute < 10 ? 0 : ''}${widget.transaction.createdAt.minute}"
)
],
),
],
),
Text(
'${widget.transaction.amount.toString()} €',
style: TextStyle(
color: widget.transaction.amount.isNegative ? Colors.red[700] : Colors.green[700]
),
),
],
), ),
), ),
], ),
), ),
), ),
); );
} }
Widget buildModalContent(Transaction transaction) { Widget buildModalContent(Transaction transaction, Category category, BuildContext context) {
return SizedBox( return SizedBox(
width: double.infinity, width: double.infinity,
child: SafeArea( child: SafeArea(
...@@ -164,7 +196,12 @@ class _TransactionListtileState extends State<TransactionListtile> { ...@@ -164,7 +196,12 @@ class _TransactionListtileState extends State<TransactionListtile> {
const SizedBox(width: 10.0), const SizedBox(width: 10.0),
Expanded( Expanded(
child: FilledButton.tonal( child: FilledButton.tonal(
onPressed: () => {}, onPressed: () => {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => EditTransactionView(transaction: transaction))
)
},
child: const Row( child: const Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
......
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