Make budgets work again

This commit is contained in:
PapaTutuWawa 2025-05-18 14:42:42 +02:00
parent 5dc474407c
commit 42b1bbd438
9 changed files with 3601 additions and 4917 deletions

View File

@ -26,3 +26,8 @@ linter:
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
analyzer:
exclude:
- "**/*.g.dart"
- build/**
- .dart_tool/**

View File

@ -56,9 +56,8 @@ class Budgets extends Table {
class BudgetsDto {
final Budget budget;
final List<BudgetItemDto> budgetItems;
BudgetsDto({required this.budget, required this.budgetItems});
BudgetsDto({required this.budget});
}
class Loans extends Table {
@ -373,6 +372,12 @@ class ExpenseCategoriesDao extends DatabaseAccessor<OkaneDatabase>
return select(expenseCategories).get();
}
Future<ExpenseCategory> upsertCategory(ExpenseCategoriesCompanion category) {
return into(
expenseCategories,
).insertReturning(category, mode: InsertMode.insertOrReplace);
}
}
@DriftAccessor(tables: [Budgets, BudgetItems])
@ -391,11 +396,7 @@ class BudgetsDao extends DatabaseAccessor<OkaneDatabase>
.watch()
.map((rows) {
return rows.map((row) {
return BudgetsDto(
budget: row.readTable(budgets),
// TODO
budgetItems: List.empty(),
);
return BudgetsDto(budget: row.readTable(budgets));
}).toList();
});
}
@ -405,20 +406,28 @@ class BudgetsDao extends DatabaseAccessor<OkaneDatabase>
return Future.value(List.empty());
}
return (select(budgets)..where((b) => b.accountId.equals(account.id)))
return (select(budgets)
..where((b) => b.accountId.equals(account.id))).get().then((rows) {
return rows.map((row) {
return BudgetsDto(budget: row);
}).toList();
});
}
Stream<List<BudgetItemDto>> watchBudgetItems(Budget budget) {
return (select(budgetItems)..where((b) => b.budgetId.equals(budget.id)))
.join([
leftOuterJoin(
budgetItems,
budgetItems.budgetId.equalsExp(budgets.id),
expenseCategories,
expenseCategories.id.equalsExp(budgetItems.expenseCategoryId),
),
])
.get()
.then((rows) {
.watch()
.map((rows) {
return rows.map((row) {
return BudgetsDto(
budget: row.readTable(budgets),
// TODO
budgetItems: List.empty(),
return BudgetItemDto(
expenseCategory: row.readTable(expenseCategories),
item: row.readTable(budgetItems),
);
}).toList();
});

File diff suppressed because it is too large Load Diff

View File

@ -80,7 +80,6 @@ class AccountBalanceGraphCard extends StatelessWidget {
child: FutureBuilder(
future: getAccountBalance(),
builder: (context, snapshot) {
print("SNAPSHOT: ${snapshot.data}");
if (!snapshot.hasData) {
return CircularProgressIndicator();
}

View File

@ -9,11 +9,13 @@ 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
@ -72,7 +74,7 @@ class AddBudgetItemState extends State<AddBudgetItemPopup> {
_expenseCategory == null) {
return;
}
if (widget.budget.budgetItems
if (widget.items
.where(
(i) =>
i.expenseCategory.name == _expenseCategory!.name,
@ -84,10 +86,11 @@ class AddBudgetItemState extends State<AddBudgetItemPopup> {
await GetIt.I.get<OkaneDatabase>().budgetsDao.upsertBudgetItem(
BudgetItemsCompanion(
expenseCategoryId: Value(_expenseCategory!.id),
amount: Value(
double.parse(_budgetItemAmountEditController.text),
),
expenseCategoryId: Value(_expenseCategory!.id),
budgetId: Value(widget.budget.budget.id),
),
);
widget.onDone();

View File

@ -22,6 +22,7 @@ class BudgetDetailsPage extends StatelessWidget {
builder:
(_) => AddBudgetItemPopup(
budget: state.activeBudget!,
items: state.budgetItems,
onDone: () {
Navigator.of(context).pop();
},
@ -55,7 +56,7 @@ class BudgetDetailsPage extends StatelessWidget {
return Text(t.pages.budgets.details.noBudgetSelected);
}
if (state.activeBudget!.budgetItems.isEmpty) {
if (state.budgetItems.isEmpty) {
return Row(
children: [
Text(t.pages.budgets.details.noBudgetItems),
@ -95,10 +96,9 @@ class BudgetDetailsPage extends StatelessWidget {
),
ListView.builder(
shrinkWrap: true,
itemCount: state.activeBudget!.budgetItems.length,
itemCount: state.budgetItems.length,
itemBuilder: (context, index) {
final item = state.activeBudget!.budgetItems
.elementAt(index);
final item = state.budgetItems.elementAt(index);
final amount = formatCurrency(item.item.amount);
return ListTile(
title: Text(
@ -120,7 +120,7 @@ class BudgetDetailsPage extends StatelessWidget {
}
final categories =
state.activeBudget!.budgetItems
state.budgetItems
// TODO
//.map((i) => i.expenseCategory.value!.name)
.map((i) => "lol")
@ -149,7 +149,7 @@ class BudgetDetailsPage extends StatelessWidget {
spending.isEmpty
? 0
: spending.values.reduce((acc, val) => acc + val);
final budgetTotal = state.activeBudget!.budgetItems
final budgetTotal = state.budgetItems
.map((i) => i.item.amount)
.reduce((acc, val) => acc + val);
return Column(
@ -271,7 +271,7 @@ class BudgetDetailsPage extends StatelessWidget {
fallbackText: "",
valueConverter: formatCurrency,
items:
state.activeBudget!.budgetItems
state.budgetItems
.map(
(i) => (
title: i.expenseCategory.name,
@ -342,10 +342,9 @@ class BudgetDetailsPage extends StatelessWidget {
padding: EdgeInsets.all(8),
child: ListView.builder(
shrinkWrap: true,
itemCount: state.activeBudget!.budgetItems.length,
itemCount: state.budgetItems.length,
itemBuilder: (context, index) {
final item = state.activeBudget!.budgetItems
.elementAt(index);
final item = state.budgetItems.elementAt(index);
final amount = formatCurrency(item.item.amount);
final spent = spending[item.expenseCategory.name];
final left =

View File

@ -20,6 +20,7 @@ abstract class CoreState with _$CoreState {
@Default([]) List<Beneficiary> beneficiaries,
@Default([]) List<ExpenseCategory> expenseCategories,
@Default([]) List<BudgetsDto> budgets,
@Default([]) List<BudgetItemDto> budgetItems,
@Default(null) BudgetsDto? activeBudget,
@Default([]) List<LoanDto> loans,
@Default(null) LoanDto? activeLoan,
@ -37,6 +38,7 @@ class CoreCubit extends Cubit<CoreState> {
StreamSubscription<void>? _beneficiariesStreamSubscription;
StreamSubscription<void>? _expenseCategoryStreamSubscription;
StreamSubscription<void>? _budgetsStreamSubscription;
StreamSubscription<void>? _budgetItemsStreamSubscription;
StreamSubscription<void>? _loanStreamSubscription;
void setupAccountStream() {
@ -179,7 +181,17 @@ class CoreCubit extends Cubit<CoreState> {
}
void setActiveBudget(BudgetsDto? budget) {
emit(state.copyWith(activeBudget: budget));
emit(state.copyWith(activeBudget: budget, budgetItems: []));
_budgetItemsStreamSubscription?.cancel();
if (budget != null) {
_budgetItemsStreamSubscription = GetIt.I
.get<OkaneDatabase>()
.budgetsDao
.watchBudgetItems(budget.budget)
.listen((items) {
emit(state.copyWith(budgetItems: items));
});
}
}
Future<void> deleteAccount(Account account) async {

View File

@ -12,8 +12,7 @@ part of 'core.dart';
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models',
);
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
/// @nodoc
mixin _$CoreState {
@ -30,6 +29,7 @@ mixin _$CoreState {
List<ExpenseCategory> get expenseCategories =>
throw _privateConstructorUsedError;
List<BudgetsDto> get budgets => throw _privateConstructorUsedError;
List<BudgetItemDto> get budgetItems => throw _privateConstructorUsedError;
BudgetsDto? get activeBudget => throw _privateConstructorUsedError;
List<LoanDto> get loans => throw _privateConstructorUsedError;
LoanDto? get activeLoan => throw _privateConstructorUsedError;
@ -45,22 +45,22 @@ abstract class $CoreStateCopyWith<$Res> {
factory $CoreStateCopyWith(CoreState value, $Res Function(CoreState) then) =
_$CoreStateCopyWithImpl<$Res, CoreState>;
@useResult
$Res call({
OkanePage activePage,
int? activeAccountIndex,
TransactionDto? activeTransaction,
List<Account> accounts,
List<RecurringTransactionDto> recurringTransactions,
List<TransactionDto> transactions,
List<TransactionTemplateDto> transactionTemplates,
List<Beneficiary> beneficiaries,
List<ExpenseCategory> expenseCategories,
List<BudgetsDto> budgets,
BudgetsDto? activeBudget,
List<LoanDto> loans,
LoanDto? activeLoan,
bool isDeletingAccount,
});
$Res call(
{OkanePage activePage,
int? activeAccountIndex,
TransactionDto? activeTransaction,
List<Account> accounts,
List<RecurringTransactionDto> recurringTransactions,
List<TransactionDto> transactions,
List<TransactionTemplateDto> transactionTemplates,
List<Beneficiary> beneficiaries,
List<ExpenseCategory> expenseCategories,
List<BudgetsDto> budgets,
List<BudgetItemDto> budgetItems,
BudgetsDto? activeBudget,
List<LoanDto> loans,
LoanDto? activeLoan,
bool isDeletingAccount});
}
/// @nodoc
@ -86,86 +86,74 @@ class _$CoreStateCopyWithImpl<$Res, $Val extends CoreState>
Object? beneficiaries = null,
Object? expenseCategories = null,
Object? budgets = null,
Object? budgetItems = null,
Object? activeBudget = freezed,
Object? loans = null,
Object? activeLoan = freezed,
Object? isDeletingAccount = null,
}) {
return _then(
_value.copyWith(
activePage:
null == activePage
? _value.activePage
: activePage // ignore: cast_nullable_to_non_nullable
as OkanePage,
activeAccountIndex:
freezed == activeAccountIndex
? _value.activeAccountIndex
: activeAccountIndex // ignore: cast_nullable_to_non_nullable
as int?,
activeTransaction:
freezed == activeTransaction
? _value.activeTransaction
: activeTransaction // ignore: cast_nullable_to_non_nullable
as TransactionDto?,
accounts:
null == accounts
? _value.accounts
: accounts // ignore: cast_nullable_to_non_nullable
as List<Account>,
recurringTransactions:
null == recurringTransactions
? _value.recurringTransactions
: recurringTransactions // ignore: cast_nullable_to_non_nullable
as List<RecurringTransactionDto>,
transactions:
null == transactions
? _value.transactions
: transactions // ignore: cast_nullable_to_non_nullable
as List<TransactionDto>,
transactionTemplates:
null == transactionTemplates
? _value.transactionTemplates
: transactionTemplates // ignore: cast_nullable_to_non_nullable
as List<TransactionTemplateDto>,
beneficiaries:
null == beneficiaries
? _value.beneficiaries
: beneficiaries // ignore: cast_nullable_to_non_nullable
as List<Beneficiary>,
expenseCategories:
null == expenseCategories
? _value.expenseCategories
: expenseCategories // ignore: cast_nullable_to_non_nullable
as List<ExpenseCategory>,
budgets:
null == budgets
? _value.budgets
: budgets // ignore: cast_nullable_to_non_nullable
as List<BudgetsDto>,
activeBudget:
freezed == activeBudget
? _value.activeBudget
: activeBudget // ignore: cast_nullable_to_non_nullable
as BudgetsDto?,
loans:
null == loans
? _value.loans
: loans // ignore: cast_nullable_to_non_nullable
as List<LoanDto>,
activeLoan:
freezed == activeLoan
? _value.activeLoan
: activeLoan // ignore: cast_nullable_to_non_nullable
as LoanDto?,
isDeletingAccount:
null == isDeletingAccount
? _value.isDeletingAccount
: isDeletingAccount // ignore: cast_nullable_to_non_nullable
as bool,
)
as $Val,
);
return _then(_value.copyWith(
activePage: null == activePage
? _value.activePage
: activePage // ignore: cast_nullable_to_non_nullable
as OkanePage,
activeAccountIndex: freezed == activeAccountIndex
? _value.activeAccountIndex
: activeAccountIndex // ignore: cast_nullable_to_non_nullable
as int?,
activeTransaction: freezed == activeTransaction
? _value.activeTransaction
: activeTransaction // ignore: cast_nullable_to_non_nullable
as TransactionDto?,
accounts: null == accounts
? _value.accounts
: accounts // ignore: cast_nullable_to_non_nullable
as List<Account>,
recurringTransactions: null == recurringTransactions
? _value.recurringTransactions
: recurringTransactions // ignore: cast_nullable_to_non_nullable
as List<RecurringTransactionDto>,
transactions: null == transactions
? _value.transactions
: transactions // ignore: cast_nullable_to_non_nullable
as List<TransactionDto>,
transactionTemplates: null == transactionTemplates
? _value.transactionTemplates
: transactionTemplates // ignore: cast_nullable_to_non_nullable
as List<TransactionTemplateDto>,
beneficiaries: null == beneficiaries
? _value.beneficiaries
: beneficiaries // ignore: cast_nullable_to_non_nullable
as List<Beneficiary>,
expenseCategories: null == expenseCategories
? _value.expenseCategories
: expenseCategories // ignore: cast_nullable_to_non_nullable
as List<ExpenseCategory>,
budgets: null == budgets
? _value.budgets
: budgets // ignore: cast_nullable_to_non_nullable
as List<BudgetsDto>,
budgetItems: null == budgetItems
? _value.budgetItems
: budgetItems // ignore: cast_nullable_to_non_nullable
as List<BudgetItemDto>,
activeBudget: freezed == activeBudget
? _value.activeBudget
: activeBudget // ignore: cast_nullable_to_non_nullable
as BudgetsDto?,
loans: null == loans
? _value.loans
: loans // ignore: cast_nullable_to_non_nullable
as List<LoanDto>,
activeLoan: freezed == activeLoan
? _value.activeLoan
: activeLoan // ignore: cast_nullable_to_non_nullable
as LoanDto?,
isDeletingAccount: null == isDeletingAccount
? _value.isDeletingAccount
: isDeletingAccount // ignore: cast_nullable_to_non_nullable
as bool,
) as $Val);
}
}
@ -173,27 +161,26 @@ class _$CoreStateCopyWithImpl<$Res, $Val extends CoreState>
abstract class _$$CoreStateImplCopyWith<$Res>
implements $CoreStateCopyWith<$Res> {
factory _$$CoreStateImplCopyWith(
_$CoreStateImpl value,
$Res Function(_$CoreStateImpl) then,
) = __$$CoreStateImplCopyWithImpl<$Res>;
_$CoreStateImpl value, $Res Function(_$CoreStateImpl) then) =
__$$CoreStateImplCopyWithImpl<$Res>;
@override
@useResult
$Res call({
OkanePage activePage,
int? activeAccountIndex,
TransactionDto? activeTransaction,
List<Account> accounts,
List<RecurringTransactionDto> recurringTransactions,
List<TransactionDto> transactions,
List<TransactionTemplateDto> transactionTemplates,
List<Beneficiary> beneficiaries,
List<ExpenseCategory> expenseCategories,
List<BudgetsDto> budgets,
BudgetsDto? activeBudget,
List<LoanDto> loans,
LoanDto? activeLoan,
bool isDeletingAccount,
});
$Res call(
{OkanePage activePage,
int? activeAccountIndex,
TransactionDto? activeTransaction,
List<Account> accounts,
List<RecurringTransactionDto> recurringTransactions,
List<TransactionDto> transactions,
List<TransactionTemplateDto> transactionTemplates,
List<Beneficiary> beneficiaries,
List<ExpenseCategory> expenseCategories,
List<BudgetsDto> budgets,
List<BudgetItemDto> budgetItems,
BudgetsDto? activeBudget,
List<LoanDto> loans,
LoanDto? activeLoan,
bool isDeletingAccount});
}
/// @nodoc
@ -201,9 +188,8 @@ class __$$CoreStateImplCopyWithImpl<$Res>
extends _$CoreStateCopyWithImpl<$Res, _$CoreStateImpl>
implements _$$CoreStateImplCopyWith<$Res> {
__$$CoreStateImplCopyWithImpl(
_$CoreStateImpl _value,
$Res Function(_$CoreStateImpl) _then,
) : super(_value, _then);
_$CoreStateImpl _value, $Res Function(_$CoreStateImpl) _then)
: super(_value, _then);
@pragma('vm:prefer-inline')
@override
@ -218,114 +204,105 @@ class __$$CoreStateImplCopyWithImpl<$Res>
Object? beneficiaries = null,
Object? expenseCategories = null,
Object? budgets = null,
Object? budgetItems = null,
Object? activeBudget = freezed,
Object? loans = null,
Object? activeLoan = freezed,
Object? isDeletingAccount = null,
}) {
return _then(
_$CoreStateImpl(
activePage:
null == activePage
? _value.activePage
: activePage // ignore: cast_nullable_to_non_nullable
as OkanePage,
activeAccountIndex:
freezed == activeAccountIndex
? _value.activeAccountIndex
: activeAccountIndex // ignore: cast_nullable_to_non_nullable
as int?,
activeTransaction:
freezed == activeTransaction
? _value.activeTransaction
: activeTransaction // ignore: cast_nullable_to_non_nullable
as TransactionDto?,
accounts:
null == accounts
? _value._accounts
: accounts // ignore: cast_nullable_to_non_nullable
as List<Account>,
recurringTransactions:
null == recurringTransactions
? _value._recurringTransactions
: recurringTransactions // ignore: cast_nullable_to_non_nullable
as List<RecurringTransactionDto>,
transactions:
null == transactions
? _value._transactions
: transactions // ignore: cast_nullable_to_non_nullable
as List<TransactionDto>,
transactionTemplates:
null == transactionTemplates
? _value._transactionTemplates
: transactionTemplates // ignore: cast_nullable_to_non_nullable
as List<TransactionTemplateDto>,
beneficiaries:
null == beneficiaries
? _value._beneficiaries
: beneficiaries // ignore: cast_nullable_to_non_nullable
as List<Beneficiary>,
expenseCategories:
null == expenseCategories
? _value._expenseCategories
: expenseCategories // ignore: cast_nullable_to_non_nullable
as List<ExpenseCategory>,
budgets:
null == budgets
? _value._budgets
: budgets // ignore: cast_nullable_to_non_nullable
as List<BudgetsDto>,
activeBudget:
freezed == activeBudget
? _value.activeBudget
: activeBudget // ignore: cast_nullable_to_non_nullable
as BudgetsDto?,
loans:
null == loans
? _value._loans
: loans // ignore: cast_nullable_to_non_nullable
as List<LoanDto>,
activeLoan:
freezed == activeLoan
? _value.activeLoan
: activeLoan // ignore: cast_nullable_to_non_nullable
as LoanDto?,
isDeletingAccount:
null == isDeletingAccount
? _value.isDeletingAccount
: isDeletingAccount // ignore: cast_nullable_to_non_nullable
as bool,
),
);
return _then(_$CoreStateImpl(
activePage: null == activePage
? _value.activePage
: activePage // ignore: cast_nullable_to_non_nullable
as OkanePage,
activeAccountIndex: freezed == activeAccountIndex
? _value.activeAccountIndex
: activeAccountIndex // ignore: cast_nullable_to_non_nullable
as int?,
activeTransaction: freezed == activeTransaction
? _value.activeTransaction
: activeTransaction // ignore: cast_nullable_to_non_nullable
as TransactionDto?,
accounts: null == accounts
? _value._accounts
: accounts // ignore: cast_nullable_to_non_nullable
as List<Account>,
recurringTransactions: null == recurringTransactions
? _value._recurringTransactions
: recurringTransactions // ignore: cast_nullable_to_non_nullable
as List<RecurringTransactionDto>,
transactions: null == transactions
? _value._transactions
: transactions // ignore: cast_nullable_to_non_nullable
as List<TransactionDto>,
transactionTemplates: null == transactionTemplates
? _value._transactionTemplates
: transactionTemplates // ignore: cast_nullable_to_non_nullable
as List<TransactionTemplateDto>,
beneficiaries: null == beneficiaries
? _value._beneficiaries
: beneficiaries // ignore: cast_nullable_to_non_nullable
as List<Beneficiary>,
expenseCategories: null == expenseCategories
? _value._expenseCategories
: expenseCategories // ignore: cast_nullable_to_non_nullable
as List<ExpenseCategory>,
budgets: null == budgets
? _value._budgets
: budgets // ignore: cast_nullable_to_non_nullable
as List<BudgetsDto>,
budgetItems: null == budgetItems
? _value._budgetItems
: budgetItems // ignore: cast_nullable_to_non_nullable
as List<BudgetItemDto>,
activeBudget: freezed == activeBudget
? _value.activeBudget
: activeBudget // ignore: cast_nullable_to_non_nullable
as BudgetsDto?,
loans: null == loans
? _value._loans
: loans // ignore: cast_nullable_to_non_nullable
as List<LoanDto>,
activeLoan: freezed == activeLoan
? _value.activeLoan
: activeLoan // ignore: cast_nullable_to_non_nullable
as LoanDto?,
isDeletingAccount: null == isDeletingAccount
? _value.isDeletingAccount
: isDeletingAccount // ignore: cast_nullable_to_non_nullable
as bool,
));
}
}
/// @nodoc
class _$CoreStateImpl implements _CoreState {
const _$CoreStateImpl({
this.activePage = OkanePage.accounts,
this.activeAccountIndex,
this.activeTransaction = null,
final List<Account> accounts = const [],
final List<RecurringTransactionDto> recurringTransactions = const [],
final List<TransactionDto> transactions = const [],
final List<TransactionTemplateDto> transactionTemplates = const [],
final List<Beneficiary> beneficiaries = const [],
final List<ExpenseCategory> expenseCategories = const [],
final List<BudgetsDto> budgets = const [],
this.activeBudget = null,
final List<LoanDto> loans = const [],
this.activeLoan = null,
this.isDeletingAccount = false,
}) : _accounts = accounts,
_recurringTransactions = recurringTransactions,
_transactions = transactions,
_transactionTemplates = transactionTemplates,
_beneficiaries = beneficiaries,
_expenseCategories = expenseCategories,
_budgets = budgets,
_loans = loans;
const _$CoreStateImpl(
{this.activePage = OkanePage.accounts,
this.activeAccountIndex,
this.activeTransaction = null,
final List<Account> accounts = const [],
final List<RecurringTransactionDto> recurringTransactions = const [],
final List<TransactionDto> transactions = const [],
final List<TransactionTemplateDto> transactionTemplates = const [],
final List<Beneficiary> beneficiaries = const [],
final List<ExpenseCategory> expenseCategories = const [],
final List<BudgetsDto> budgets = const [],
final List<BudgetItemDto> budgetItems = const [],
this.activeBudget = null,
final List<LoanDto> loans = const [],
this.activeLoan = null,
this.isDeletingAccount = false})
: _accounts = accounts,
_recurringTransactions = recurringTransactions,
_transactions = transactions,
_transactionTemplates = transactionTemplates,
_beneficiaries = beneficiaries,
_expenseCategories = expenseCategories,
_budgets = budgets,
_budgetItems = budgetItems,
_loans = loans;
@override
@JsonKey()
@ -401,6 +378,15 @@ class _$CoreStateImpl implements _CoreState {
return EqualUnmodifiableListView(_budgets);
}
final List<BudgetItemDto> _budgetItems;
@override
@JsonKey()
List<BudgetItemDto> get budgetItems {
if (_budgetItems is EqualUnmodifiableListView) return _budgetItems;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_budgetItems);
}
@override
@JsonKey()
final BudgetsDto? activeBudget;
@ -422,7 +408,7 @@ class _$CoreStateImpl implements _CoreState {
@override
String toString() {
return 'CoreState(activePage: $activePage, activeAccountIndex: $activeAccountIndex, activeTransaction: $activeTransaction, accounts: $accounts, recurringTransactions: $recurringTransactions, transactions: $transactions, transactionTemplates: $transactionTemplates, beneficiaries: $beneficiaries, expenseCategories: $expenseCategories, budgets: $budgets, activeBudget: $activeBudget, loans: $loans, activeLoan: $activeLoan, isDeletingAccount: $isDeletingAccount)';
return 'CoreState(activePage: $activePage, activeAccountIndex: $activeAccountIndex, activeTransaction: $activeTransaction, accounts: $accounts, recurringTransactions: $recurringTransactions, transactions: $transactions, transactionTemplates: $transactionTemplates, beneficiaries: $beneficiaries, expenseCategories: $expenseCategories, budgets: $budgets, budgetItems: $budgetItems, activeBudget: $activeBudget, loans: $loans, activeLoan: $activeLoan, isDeletingAccount: $isDeletingAccount)';
}
@override
@ -437,27 +423,19 @@ class _$CoreStateImpl implements _CoreState {
(identical(other.activeTransaction, activeTransaction) ||
other.activeTransaction == activeTransaction) &&
const DeepCollectionEquality().equals(other._accounts, _accounts) &&
const DeepCollectionEquality().equals(
other._recurringTransactions,
_recurringTransactions,
) &&
const DeepCollectionEquality().equals(
other._transactions,
_transactions,
) &&
const DeepCollectionEquality().equals(
other._transactionTemplates,
_transactionTemplates,
) &&
const DeepCollectionEquality().equals(
other._beneficiaries,
_beneficiaries,
) &&
const DeepCollectionEquality().equals(
other._expenseCategories,
_expenseCategories,
) &&
const DeepCollectionEquality()
.equals(other._recurringTransactions, _recurringTransactions) &&
const DeepCollectionEquality()
.equals(other._transactions, _transactions) &&
const DeepCollectionEquality()
.equals(other._transactionTemplates, _transactionTemplates) &&
const DeepCollectionEquality()
.equals(other._beneficiaries, _beneficiaries) &&
const DeepCollectionEquality()
.equals(other._expenseCategories, _expenseCategories) &&
const DeepCollectionEquality().equals(other._budgets, _budgets) &&
const DeepCollectionEquality()
.equals(other._budgetItems, _budgetItems) &&
(identical(other.activeBudget, activeBudget) ||
other.activeBudget == activeBudget) &&
const DeepCollectionEquality().equals(other._loans, _loans) &&
@ -469,22 +447,22 @@ class _$CoreStateImpl implements _CoreState {
@override
int get hashCode => Object.hash(
runtimeType,
activePage,
activeAccountIndex,
activeTransaction,
const DeepCollectionEquality().hash(_accounts),
const DeepCollectionEquality().hash(_recurringTransactions),
const DeepCollectionEquality().hash(_transactions),
const DeepCollectionEquality().hash(_transactionTemplates),
const DeepCollectionEquality().hash(_beneficiaries),
const DeepCollectionEquality().hash(_expenseCategories),
const DeepCollectionEquality().hash(_budgets),
activeBudget,
const DeepCollectionEquality().hash(_loans),
activeLoan,
isDeletingAccount,
);
runtimeType,
activePage,
activeAccountIndex,
activeTransaction,
const DeepCollectionEquality().hash(_accounts),
const DeepCollectionEquality().hash(_recurringTransactions),
const DeepCollectionEquality().hash(_transactions),
const DeepCollectionEquality().hash(_transactionTemplates),
const DeepCollectionEquality().hash(_beneficiaries),
const DeepCollectionEquality().hash(_expenseCategories),
const DeepCollectionEquality().hash(_budgets),
const DeepCollectionEquality().hash(_budgetItems),
activeBudget,
const DeepCollectionEquality().hash(_loans),
activeLoan,
isDeletingAccount);
@JsonKey(ignore: true)
@override
@ -494,22 +472,22 @@ class _$CoreStateImpl implements _CoreState {
}
abstract class _CoreState implements CoreState {
const factory _CoreState({
final OkanePage activePage,
final int? activeAccountIndex,
final TransactionDto? activeTransaction,
final List<Account> accounts,
final List<RecurringTransactionDto> recurringTransactions,
final List<TransactionDto> transactions,
final List<TransactionTemplateDto> transactionTemplates,
final List<Beneficiary> beneficiaries,
final List<ExpenseCategory> expenseCategories,
final List<BudgetsDto> budgets,
final BudgetsDto? activeBudget,
final List<LoanDto> loans,
final LoanDto? activeLoan,
final bool isDeletingAccount,
}) = _$CoreStateImpl;
const factory _CoreState(
{final OkanePage activePage,
final int? activeAccountIndex,
final TransactionDto? activeTransaction,
final List<Account> accounts,
final List<RecurringTransactionDto> recurringTransactions,
final List<TransactionDto> transactions,
final List<TransactionTemplateDto> transactionTemplates,
final List<Beneficiary> beneficiaries,
final List<ExpenseCategory> expenseCategories,
final List<BudgetsDto> budgets,
final List<BudgetItemDto> budgetItems,
final BudgetsDto? activeBudget,
final List<LoanDto> loans,
final LoanDto? activeLoan,
final bool isDeletingAccount}) = _$CoreStateImpl;
@override
OkanePage get activePage;
@ -532,6 +510,8 @@ abstract class _CoreState implements CoreState {
@override
List<BudgetsDto> get budgets;
@override
List<BudgetItemDto> get budgetItems;
@override
BudgetsDto? get activeBudget;
@override
List<LoanDto> get loans;

View File

@ -1,5 +1,8 @@
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';
@ -48,14 +51,16 @@ class AddExpenseCategoryState extends State<AddExpenseCategory> {
Spacer(),
OutlinedButton(
onPressed: () async {
// TODO
/*
final category =
ExpenseCategory()
..name = _categoryNameController.text;
await upsertExpenseCategory(category);
final category = await GetIt.I
.get<OkaneDatabase>()
.expenseCategoriesDao
.upsertCategory(
ExpenseCategoriesCompanion(
name: Value(_categoryNameController.text),
),
);
_categoryNameController.text = "";
Navigator.of(context).pop(category);*/
Navigator.of(context).pop(category);
},
child: Text(t.modals.add),
),