Fix the template page
This commit is contained in:
@@ -214,7 +214,7 @@ class _AddRecurringTransactionTemplateWidgetState
|
||||
decimal: false,
|
||||
),
|
||||
decoration: InputDecoration(
|
||||
hintText: "Amount",
|
||||
hintText: "Amount",
|
||||
icon: Icon(Icons.euro),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -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,
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user