67 lines
2.3 KiB
Dart
67 lines
2.3 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
|
import 'package:okane/database/collections/expense_category.dart';
|
|
import 'package:okane/database/database.dart';
|
|
import 'package:okane/ui/state/core.dart';
|
|
|
|
class AddExpenseCategory extends StatefulWidget {
|
|
const AddExpenseCategory({super.key});
|
|
|
|
@override
|
|
AddExpenseCategoryState createState() => AddExpenseCategoryState();
|
|
}
|
|
|
|
class AddExpenseCategoryState extends State<AddExpenseCategory> {
|
|
final TextEditingController _categoryNameController = TextEditingController();
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return BlocBuilder<CoreCubit, CoreState>(
|
|
builder:
|
|
(context, state) => ConstrainedBox(
|
|
constraints: BoxConstraints(maxHeight: 300),
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
ListView.builder(
|
|
itemCount: state.expenseCategories.length,
|
|
shrinkWrap: true,
|
|
itemBuilder:
|
|
(context, index) => ListTile(
|
|
title: Text(state.expenseCategories[index].name),
|
|
onTap: () {
|
|
_categoryNameController.text = "";
|
|
Navigator.of(
|
|
context,
|
|
).pop(state.expenseCategories[index]);
|
|
},
|
|
),
|
|
),
|
|
|
|
TextField(
|
|
decoration: InputDecoration(hintText: "Category name"),
|
|
controller: _categoryNameController,
|
|
),
|
|
Row(
|
|
children: [
|
|
Spacer(),
|
|
OutlinedButton(
|
|
onPressed: () async {
|
|
final category =
|
|
ExpenseCategory()
|
|
..name = _categoryNameController.text;
|
|
await upsertExpenseCategory(category);
|
|
_categoryNameController.text = "";
|
|
Navigator.of(context).pop(category);
|
|
},
|
|
child: Text("Add"),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|