Fix the template page

This commit is contained in:
2025-05-10 22:33:20 +02:00
parent 60bfd9481f
commit 058291fa80
7 changed files with 211 additions and 80 deletions

View File

@@ -214,7 +214,7 @@ class _AddRecurringTransactionTemplateWidgetState
decimal: false,
),
decoration: InputDecoration(
hintText: "Amount",
hintText: "Amount",
icon: Icon(Icons.euro),
),
),

View File

@@ -4,6 +4,7 @@ import 'package:get_it/get_it.dart';
import 'package:okane/database/collections/account.dart';
import 'package:okane/database/collections/beneficiary.dart';
import 'package:okane/database/collections/expense_category.dart';
import 'package:okane/database/collections/recurrent.dart';
import 'package:okane/database/collections/template.dart';
import 'package:okane/database/database.dart';
import 'package:okane/ui/state/core.dart';
@@ -12,6 +13,8 @@ import 'package:okane/ui/utils.dart';
import 'package:okane/ui/widgets/add_expense_category.dart';
import 'package:searchfield/searchfield.dart';
enum Period { days, weeks, months, years }
class AddTransactionTemplateWidget extends StatefulWidget {
final VoidCallback onAdd;
@@ -41,6 +44,11 @@ class _AddTransactionTemplateWidgetState
ExpenseCategory? _expenseCategory;
bool _isRecurring = false;
Period _selectedPeriod = Period.weeks;
int _periodSize = 1;
String getBeneficiaryName(Beneficiary item) {
return switch (item.type) {
BeneficiaryType.account => "${item.name} (Account)",
@@ -51,6 +59,7 @@ class _AddTransactionTemplateWidgetState
Future<void> _submit(BuildContext context) async {
final beneficiaryName = _beneficiaryTextController.text;
if (_selectedBeneficiary == null && beneficiaryName.isEmpty) {
print("No beneficiary");
return;
}
if (_templateNameController.text.isEmpty) {
@@ -103,15 +112,31 @@ class _AddTransactionTemplateWidgetState
TransactionDirection.receive => 1,
};
final amount = factor * double.parse(_amountTextController.text).abs();
final transaction =
final template =
TransactionTemplate()
..name = _templateNameController.text
..account.value = widget.activeAccountItem
..beneficiary.value = beneficiary
..expenseCategory.value = _expenseCategory
..recurring = false
..recurring = _isRecurring
..amount = amount;
await upsertTransactionTemplate(transaction);
await upsertTransactionTemplate(template);
if (_isRecurring) {
final days = switch (_selectedPeriod) {
Period.days => _periodSize,
Period.weeks => _periodSize * 7,
Period.months => _periodSize * 31,
Period.years => _periodSize * 365,
};
final recurringTransaction =
RecurringTransaction()
..account.value = widget.activeAccountItem
..template.value = template
..lastExecution = null
..days = days;
await upsertRecurringTransaction(recurringTransaction);
}
widget.onAdd();
}
@@ -197,8 +222,8 @@ class _AddTransactionTemplateWidgetState
decimal: false,
),
decoration: InputDecoration(
hintText: "Amount",
icon: Icon(Icons.euro),
hintText: "Amount",
icon: Icon(Icons.euro),
),
),
),
@@ -209,20 +234,105 @@ class _AddTransactionTemplateWidgetState
Padding(
padding: EdgeInsets.only(left: 16),
child: OutlinedButton(
onPressed: () async {
final category = await showDialogOrModal(
context: context,
builder: (_) => AddExpenseCategory(),
);
if (category == null) {
return;
}
child: OutlinedButton(
onPressed: () async {
final category = await showDialogOrModal(
context: context,
builder: (_) => AddExpenseCategory(),
);
if (category == null) {
return;
}
setState(() => _expenseCategory = category);
},
child: Text(_expenseCategory?.name ?? "None"),
setState(() => _expenseCategory = category);
},
child: Text(_expenseCategory?.name ?? "None"),
),
),
],
),
Row(
children: [
Text("Is recurring"),
Padding(
padding: EdgeInsets.only(left: 16),
child: Switch(
value: _isRecurring,
onChanged: (value) {
setState(() {
_isRecurring = value;
});
},
),
),
],
),
Padding(
padding: EdgeInsets.only(left: 16, right: 16, top: 16),
child: SegmentedButton<Period>(
segments: [
ButtonSegment(value: Period.days, label: Text("Days")),
ButtonSegment(value: Period.weeks, label: Text("Weeks")),
ButtonSegment(value: Period.months, label: Text("Months")),
ButtonSegment(value: Period.years, label: Text("Years")),
],
selected: <Period>{_selectedPeriod},
multiSelectionEnabled: false,
onSelectionChanged:
_isRecurring
? (selection) {
setState(() => _selectedPeriod = selection.first);
}
: null,
),
),
Row(
children: [
IconButton(
icon: Icon(Icons.remove),
onPressed:
_isRecurring
? () {
if (_periodSize <= 1) {
return;
}
setState(() {
_periodSize--;
});
}
: null,
),
SizedBox(
width: 100,
child: Center(
child: Text(
switch (_selectedPeriod) {
Period.days => "$_periodSize days",
Period.weeks => "$_periodSize weeks",
Period.months => "$_periodSize months",
Period.years => "$_periodSize years",
},
style: TextStyle(
color: _isRecurring ? Colors.black : Colors.grey,
),
),
),
),
IconButton(
icon: Icon(Icons.add),
onPressed:
_isRecurring
? () {
setState(() {
_periodSize++;
});
}
: null,
),
],
),