75 lines
2.6 KiB
Dart
75 lines
2.6 KiB
Dart
import 'package:drift/drift.dart' show Value;
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_bloc/flutter_bloc.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/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: t.common.expenseCategory.name,
|
|
),
|
|
controller: _categoryNameController,
|
|
),
|
|
Row(
|
|
children: [
|
|
Spacer(),
|
|
OutlinedButton(
|
|
onPressed: () async {
|
|
final category = await GetIt.I
|
|
.get<OkaneDatabase>()
|
|
.expenseCategoriesDao
|
|
.upsertCategory(
|
|
ExpenseCategoriesCompanion(
|
|
name: Value(_categoryNameController.text),
|
|
),
|
|
);
|
|
_categoryNameController.text = "";
|
|
Navigator.of(context).pop(category);
|
|
},
|
|
child: Text(t.modals.add),
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|