okane/lib/ui/pages/budgets/add_budget_item.dart

106 lines
3.0 KiB
Dart

import 'package:drift/drift.dart' show Value;
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:okane/database/sqlite.dart';
import 'package:okane/i18n/strings.g.dart';
import 'package:okane/ui/utils.dart';
import 'package:okane/ui/widgets/add_expense_category.dart';
class AddBudgetItemPopup extends StatefulWidget {
final VoidCallback onDone;
final BudgetsDto budget;
final List<BudgetItemDto> items;
const AddBudgetItemPopup({
super.key,
required this.onDone,
required this.budget,
required this.items,
});
@override
AddBudgetItemState createState() => AddBudgetItemState();
}
class AddBudgetItemState extends State<AddBudgetItemPopup> {
final _budgetItemAmountEditController = TextEditingController();
ExpenseCategory? _expenseCategory;
@override
Widget build(BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
Row(
children: [
Text(t.common.expenseCategory.name),
OutlinedButton(
onPressed: () async {
final category = await showDialogOrModal(
context: context,
builder: (_) => AddExpenseCategory(),
);
if (category == null) {
return;
}
setState(() => _expenseCategory = category);
},
child: Text(
_expenseCategory?.name ?? t.common.expenseCategory.none,
),
),
],
),
TextField(
decoration: InputDecoration(
hintText: t.pages.budgets.addBudgetItem.amountHint,
),
controller: _budgetItemAmountEditController,
keyboardType: TextInputType.numberWithOptions(
signed: false,
decimal: true,
),
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
OutlinedButton(
onPressed: () async {
if (_budgetItemAmountEditController.text.isEmpty ||
_expenseCategory == null) {
return;
}
if (widget.items
.where(
(i) =>
i.expenseCategory.name == _expenseCategory!.name,
)
.firstOrNull !=
null) {
return;
}
await GetIt.I.get<OkaneDatabase>().budgetsDao.upsertBudgetItem(
BudgetItemsCompanion(
amount: Value(
double.parse(_budgetItemAmountEditController.text),
),
expenseCategoryId: Value(_expenseCategory!.id),
budgetId: Value(widget.budget.budget.id),
),
);
widget.onDone();
},
child: Text(t.modals.add),
),
],
),
],
);
}
}