Fix budgets appearing multiple times

This commit is contained in:
PapaTutuWawa 2025-05-18 14:46:48 +02:00
parent 42b1bbd438
commit facbc16bb2
6 changed files with 4909 additions and 3533 deletions

View File

@ -386,17 +386,10 @@ class BudgetsDao extends DatabaseAccessor<OkaneDatabase>
BudgetsDao(OkaneDatabase db) : super(db); BudgetsDao(OkaneDatabase db) : super(db);
Stream<List<BudgetsDto>> budgetsStream(Account account) { Stream<List<BudgetsDto>> budgetsStream(Account account) {
return (select(budgets)..where((b) => b.accountId.equals(account.id))) return (select(budgets)
.join([ ..where((b) => b.accountId.equals(account.id))).watch().map((rows) {
leftOuterJoin(
budgetItems,
budgetItems.budgetId.equalsExp(budgets.id),
),
])
.watch()
.map((rows) {
return rows.map((row) { return rows.map((row) {
return BudgetsDto(budget: row.readTable(budgets)); return BudgetsDto(budget: row);
}).toList(); }).toList();
}); });
} }

File diff suppressed because it is too large Load Diff

View File

@ -135,7 +135,7 @@ class TransactionDetailsPage extends StatelessWidget {
GetIt.I GetIt.I
.get<CoreCubit>() .get<CoreCubit>()
.activeAccount! .activeAccount!
.name!, .name,
), ),
), ),
], ],

View File

@ -95,6 +95,7 @@ class CoreCubit extends Cubit<CoreState> {
_budgetsStreamSubscription = db.budgetsDao _budgetsStreamSubscription = db.budgetsDao
.budgetsStream(activeAccount!) .budgetsStream(activeAccount!)
.listen((budgets) async { .listen((budgets) async {
print("BUDGETS: $budgets");
emit(state.copyWith(budgets: budgets)); emit(state.copyWith(budgets: budgets));
}); });
_loanStreamSubscription?.cancel(); _loanStreamSubscription?.cancel();
@ -133,7 +134,7 @@ class CoreCubit extends Cubit<CoreState> {
expenseCategories: await db.expenseCategoriesDao.getExpenseCategories( expenseCategories: await db.expenseCategoriesDao.getExpenseCategories(
account, account,
), ),
budgets: await db.budgetsDao.getBudgets(account), //budgets: await db.budgetsDao.getBudgets(account),
loans: await db.loansDao.getLoans(account), loans: await db.loansDao.getLoans(account),
), ),
); );

View File

@ -12,7 +12,8 @@ part of 'core.dart';
T _$identity<T>(T value) => value; T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError( 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 /// @nodoc
mixin _$CoreState { mixin _$CoreState {
@ -45,8 +46,8 @@ abstract class $CoreStateCopyWith<$Res> {
factory $CoreStateCopyWith(CoreState value, $Res Function(CoreState) then) = factory $CoreStateCopyWith(CoreState value, $Res Function(CoreState) then) =
_$CoreStateCopyWithImpl<$Res, CoreState>; _$CoreStateCopyWithImpl<$Res, CoreState>;
@useResult @useResult
$Res call( $Res call({
{OkanePage activePage, OkanePage activePage,
int? activeAccountIndex, int? activeAccountIndex,
TransactionDto? activeTransaction, TransactionDto? activeTransaction,
List<Account> accounts, List<Account> accounts,
@ -60,7 +61,8 @@ abstract class $CoreStateCopyWith<$Res> {
BudgetsDto? activeBudget, BudgetsDto? activeBudget,
List<LoanDto> loans, List<LoanDto> loans,
LoanDto? activeLoan, LoanDto? activeLoan,
bool isDeletingAccount}); bool isDeletingAccount,
});
} }
/// @nodoc /// @nodoc
@ -92,68 +94,86 @@ class _$CoreStateCopyWithImpl<$Res, $Val extends CoreState>
Object? activeLoan = freezed, Object? activeLoan = freezed,
Object? isDeletingAccount = null, Object? isDeletingAccount = null,
}) { }) {
return _then(_value.copyWith( return _then(
activePage: null == activePage _value.copyWith(
activePage:
null == activePage
? _value.activePage ? _value.activePage
: activePage // ignore: cast_nullable_to_non_nullable : activePage // ignore: cast_nullable_to_non_nullable
as OkanePage, as OkanePage,
activeAccountIndex: freezed == activeAccountIndex activeAccountIndex:
freezed == activeAccountIndex
? _value.activeAccountIndex ? _value.activeAccountIndex
: activeAccountIndex // ignore: cast_nullable_to_non_nullable : activeAccountIndex // ignore: cast_nullable_to_non_nullable
as int?, as int?,
activeTransaction: freezed == activeTransaction activeTransaction:
freezed == activeTransaction
? _value.activeTransaction ? _value.activeTransaction
: activeTransaction // ignore: cast_nullable_to_non_nullable : activeTransaction // ignore: cast_nullable_to_non_nullable
as TransactionDto?, as TransactionDto?,
accounts: null == accounts accounts:
null == accounts
? _value.accounts ? _value.accounts
: accounts // ignore: cast_nullable_to_non_nullable : accounts // ignore: cast_nullable_to_non_nullable
as List<Account>, as List<Account>,
recurringTransactions: null == recurringTransactions recurringTransactions:
null == recurringTransactions
? _value.recurringTransactions ? _value.recurringTransactions
: recurringTransactions // ignore: cast_nullable_to_non_nullable : recurringTransactions // ignore: cast_nullable_to_non_nullable
as List<RecurringTransactionDto>, as List<RecurringTransactionDto>,
transactions: null == transactions transactions:
null == transactions
? _value.transactions ? _value.transactions
: transactions // ignore: cast_nullable_to_non_nullable : transactions // ignore: cast_nullable_to_non_nullable
as List<TransactionDto>, as List<TransactionDto>,
transactionTemplates: null == transactionTemplates transactionTemplates:
null == transactionTemplates
? _value.transactionTemplates ? _value.transactionTemplates
: transactionTemplates // ignore: cast_nullable_to_non_nullable : transactionTemplates // ignore: cast_nullable_to_non_nullable
as List<TransactionTemplateDto>, as List<TransactionTemplateDto>,
beneficiaries: null == beneficiaries beneficiaries:
null == beneficiaries
? _value.beneficiaries ? _value.beneficiaries
: beneficiaries // ignore: cast_nullable_to_non_nullable : beneficiaries // ignore: cast_nullable_to_non_nullable
as List<Beneficiary>, as List<Beneficiary>,
expenseCategories: null == expenseCategories expenseCategories:
null == expenseCategories
? _value.expenseCategories ? _value.expenseCategories
: expenseCategories // ignore: cast_nullable_to_non_nullable : expenseCategories // ignore: cast_nullable_to_non_nullable
as List<ExpenseCategory>, as List<ExpenseCategory>,
budgets: null == budgets budgets:
null == budgets
? _value.budgets ? _value.budgets
: budgets // ignore: cast_nullable_to_non_nullable : budgets // ignore: cast_nullable_to_non_nullable
as List<BudgetsDto>, as List<BudgetsDto>,
budgetItems: null == budgetItems budgetItems:
null == budgetItems
? _value.budgetItems ? _value.budgetItems
: budgetItems // ignore: cast_nullable_to_non_nullable : budgetItems // ignore: cast_nullable_to_non_nullable
as List<BudgetItemDto>, as List<BudgetItemDto>,
activeBudget: freezed == activeBudget activeBudget:
freezed == activeBudget
? _value.activeBudget ? _value.activeBudget
: activeBudget // ignore: cast_nullable_to_non_nullable : activeBudget // ignore: cast_nullable_to_non_nullable
as BudgetsDto?, as BudgetsDto?,
loans: null == loans loans:
null == loans
? _value.loans ? _value.loans
: loans // ignore: cast_nullable_to_non_nullable : loans // ignore: cast_nullable_to_non_nullable
as List<LoanDto>, as List<LoanDto>,
activeLoan: freezed == activeLoan activeLoan:
freezed == activeLoan
? _value.activeLoan ? _value.activeLoan
: activeLoan // ignore: cast_nullable_to_non_nullable : activeLoan // ignore: cast_nullable_to_non_nullable
as LoanDto?, as LoanDto?,
isDeletingAccount: null == isDeletingAccount isDeletingAccount:
null == isDeletingAccount
? _value.isDeletingAccount ? _value.isDeletingAccount
: isDeletingAccount // ignore: cast_nullable_to_non_nullable : isDeletingAccount // ignore: cast_nullable_to_non_nullable
as bool, as bool,
) as $Val); )
as $Val,
);
} }
} }
@ -161,12 +181,13 @@ class _$CoreStateCopyWithImpl<$Res, $Val extends CoreState>
abstract class _$$CoreStateImplCopyWith<$Res> abstract class _$$CoreStateImplCopyWith<$Res>
implements $CoreStateCopyWith<$Res> { implements $CoreStateCopyWith<$Res> {
factory _$$CoreStateImplCopyWith( factory _$$CoreStateImplCopyWith(
_$CoreStateImpl value, $Res Function(_$CoreStateImpl) then) = _$CoreStateImpl value,
__$$CoreStateImplCopyWithImpl<$Res>; $Res Function(_$CoreStateImpl) then,
) = __$$CoreStateImplCopyWithImpl<$Res>;
@override @override
@useResult @useResult
$Res call( $Res call({
{OkanePage activePage, OkanePage activePage,
int? activeAccountIndex, int? activeAccountIndex,
TransactionDto? activeTransaction, TransactionDto? activeTransaction,
List<Account> accounts, List<Account> accounts,
@ -180,7 +201,8 @@ abstract class _$$CoreStateImplCopyWith<$Res>
BudgetsDto? activeBudget, BudgetsDto? activeBudget,
List<LoanDto> loans, List<LoanDto> loans,
LoanDto? activeLoan, LoanDto? activeLoan,
bool isDeletingAccount}); bool isDeletingAccount,
});
} }
/// @nodoc /// @nodoc
@ -188,8 +210,9 @@ class __$$CoreStateImplCopyWithImpl<$Res>
extends _$CoreStateCopyWithImpl<$Res, _$CoreStateImpl> extends _$CoreStateCopyWithImpl<$Res, _$CoreStateImpl>
implements _$$CoreStateImplCopyWith<$Res> { implements _$$CoreStateImplCopyWith<$Res> {
__$$CoreStateImplCopyWithImpl( __$$CoreStateImplCopyWithImpl(
_$CoreStateImpl _value, $Res Function(_$CoreStateImpl) _then) _$CoreStateImpl _value,
: super(_value, _then); $Res Function(_$CoreStateImpl) _then,
) : super(_value, _then);
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
@ -210,76 +233,93 @@ class __$$CoreStateImplCopyWithImpl<$Res>
Object? activeLoan = freezed, Object? activeLoan = freezed,
Object? isDeletingAccount = null, Object? isDeletingAccount = null,
}) { }) {
return _then(_$CoreStateImpl( return _then(
activePage: null == activePage _$CoreStateImpl(
activePage:
null == activePage
? _value.activePage ? _value.activePage
: activePage // ignore: cast_nullable_to_non_nullable : activePage // ignore: cast_nullable_to_non_nullable
as OkanePage, as OkanePage,
activeAccountIndex: freezed == activeAccountIndex activeAccountIndex:
freezed == activeAccountIndex
? _value.activeAccountIndex ? _value.activeAccountIndex
: activeAccountIndex // ignore: cast_nullable_to_non_nullable : activeAccountIndex // ignore: cast_nullable_to_non_nullable
as int?, as int?,
activeTransaction: freezed == activeTransaction activeTransaction:
freezed == activeTransaction
? _value.activeTransaction ? _value.activeTransaction
: activeTransaction // ignore: cast_nullable_to_non_nullable : activeTransaction // ignore: cast_nullable_to_non_nullable
as TransactionDto?, as TransactionDto?,
accounts: null == accounts accounts:
null == accounts
? _value._accounts ? _value._accounts
: accounts // ignore: cast_nullable_to_non_nullable : accounts // ignore: cast_nullable_to_non_nullable
as List<Account>, as List<Account>,
recurringTransactions: null == recurringTransactions recurringTransactions:
null == recurringTransactions
? _value._recurringTransactions ? _value._recurringTransactions
: recurringTransactions // ignore: cast_nullable_to_non_nullable : recurringTransactions // ignore: cast_nullable_to_non_nullable
as List<RecurringTransactionDto>, as List<RecurringTransactionDto>,
transactions: null == transactions transactions:
null == transactions
? _value._transactions ? _value._transactions
: transactions // ignore: cast_nullable_to_non_nullable : transactions // ignore: cast_nullable_to_non_nullable
as List<TransactionDto>, as List<TransactionDto>,
transactionTemplates: null == transactionTemplates transactionTemplates:
null == transactionTemplates
? _value._transactionTemplates ? _value._transactionTemplates
: transactionTemplates // ignore: cast_nullable_to_non_nullable : transactionTemplates // ignore: cast_nullable_to_non_nullable
as List<TransactionTemplateDto>, as List<TransactionTemplateDto>,
beneficiaries: null == beneficiaries beneficiaries:
null == beneficiaries
? _value._beneficiaries ? _value._beneficiaries
: beneficiaries // ignore: cast_nullable_to_non_nullable : beneficiaries // ignore: cast_nullable_to_non_nullable
as List<Beneficiary>, as List<Beneficiary>,
expenseCategories: null == expenseCategories expenseCategories:
null == expenseCategories
? _value._expenseCategories ? _value._expenseCategories
: expenseCategories // ignore: cast_nullable_to_non_nullable : expenseCategories // ignore: cast_nullable_to_non_nullable
as List<ExpenseCategory>, as List<ExpenseCategory>,
budgets: null == budgets budgets:
null == budgets
? _value._budgets ? _value._budgets
: budgets // ignore: cast_nullable_to_non_nullable : budgets // ignore: cast_nullable_to_non_nullable
as List<BudgetsDto>, as List<BudgetsDto>,
budgetItems: null == budgetItems budgetItems:
null == budgetItems
? _value._budgetItems ? _value._budgetItems
: budgetItems // ignore: cast_nullable_to_non_nullable : budgetItems // ignore: cast_nullable_to_non_nullable
as List<BudgetItemDto>, as List<BudgetItemDto>,
activeBudget: freezed == activeBudget activeBudget:
freezed == activeBudget
? _value.activeBudget ? _value.activeBudget
: activeBudget // ignore: cast_nullable_to_non_nullable : activeBudget // ignore: cast_nullable_to_non_nullable
as BudgetsDto?, as BudgetsDto?,
loans: null == loans loans:
null == loans
? _value._loans ? _value._loans
: loans // ignore: cast_nullable_to_non_nullable : loans // ignore: cast_nullable_to_non_nullable
as List<LoanDto>, as List<LoanDto>,
activeLoan: freezed == activeLoan activeLoan:
freezed == activeLoan
? _value.activeLoan ? _value.activeLoan
: activeLoan // ignore: cast_nullable_to_non_nullable : activeLoan // ignore: cast_nullable_to_non_nullable
as LoanDto?, as LoanDto?,
isDeletingAccount: null == isDeletingAccount isDeletingAccount:
null == isDeletingAccount
? _value.isDeletingAccount ? _value.isDeletingAccount
: isDeletingAccount // ignore: cast_nullable_to_non_nullable : isDeletingAccount // ignore: cast_nullable_to_non_nullable
as bool, as bool,
)); ),
);
} }
} }
/// @nodoc /// @nodoc
class _$CoreStateImpl implements _CoreState { class _$CoreStateImpl implements _CoreState {
const _$CoreStateImpl( const _$CoreStateImpl({
{this.activePage = OkanePage.accounts, this.activePage = OkanePage.accounts,
this.activeAccountIndex, this.activeAccountIndex,
this.activeTransaction = null, this.activeTransaction = null,
final List<Account> accounts = const [], final List<Account> accounts = const [],
@ -293,8 +333,8 @@ class _$CoreStateImpl implements _CoreState {
this.activeBudget = null, this.activeBudget = null,
final List<LoanDto> loans = const [], final List<LoanDto> loans = const [],
this.activeLoan = null, this.activeLoan = null,
this.isDeletingAccount = false}) this.isDeletingAccount = false,
: _accounts = accounts, }) : _accounts = accounts,
_recurringTransactions = recurringTransactions, _recurringTransactions = recurringTransactions,
_transactions = transactions, _transactions = transactions,
_transactionTemplates = transactionTemplates, _transactionTemplates = transactionTemplates,
@ -423,19 +463,31 @@ class _$CoreStateImpl implements _CoreState {
(identical(other.activeTransaction, activeTransaction) || (identical(other.activeTransaction, activeTransaction) ||
other.activeTransaction == activeTransaction) && other.activeTransaction == activeTransaction) &&
const DeepCollectionEquality().equals(other._accounts, _accounts) && const DeepCollectionEquality().equals(other._accounts, _accounts) &&
const DeepCollectionEquality() const DeepCollectionEquality().equals(
.equals(other._recurringTransactions, _recurringTransactions) && other._recurringTransactions,
const DeepCollectionEquality() _recurringTransactions,
.equals(other._transactions, _transactions) && ) &&
const DeepCollectionEquality() const DeepCollectionEquality().equals(
.equals(other._transactionTemplates, _transactionTemplates) && other._transactions,
const DeepCollectionEquality() _transactions,
.equals(other._beneficiaries, _beneficiaries) && ) &&
const DeepCollectionEquality() const DeepCollectionEquality().equals(
.equals(other._expenseCategories, _expenseCategories) && 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._budgets, _budgets) &&
const DeepCollectionEquality() const DeepCollectionEquality().equals(
.equals(other._budgetItems, _budgetItems) && other._budgetItems,
_budgetItems,
) &&
(identical(other.activeBudget, activeBudget) || (identical(other.activeBudget, activeBudget) ||
other.activeBudget == activeBudget) && other.activeBudget == activeBudget) &&
const DeepCollectionEquality().equals(other._loans, _loans) && const DeepCollectionEquality().equals(other._loans, _loans) &&
@ -462,7 +514,8 @@ class _$CoreStateImpl implements _CoreState {
activeBudget, activeBudget,
const DeepCollectionEquality().hash(_loans), const DeepCollectionEquality().hash(_loans),
activeLoan, activeLoan,
isDeletingAccount); isDeletingAccount,
);
@JsonKey(ignore: true) @JsonKey(ignore: true)
@override @override
@ -472,8 +525,8 @@ class _$CoreStateImpl implements _CoreState {
} }
abstract class _CoreState implements CoreState { abstract class _CoreState implements CoreState {
const factory _CoreState( const factory _CoreState({
{final OkanePage activePage, final OkanePage activePage,
final int? activeAccountIndex, final int? activeAccountIndex,
final TransactionDto? activeTransaction, final TransactionDto? activeTransaction,
final List<Account> accounts, final List<Account> accounts,
@ -487,7 +540,8 @@ abstract class _CoreState implements CoreState {
final BudgetsDto? activeBudget, final BudgetsDto? activeBudget,
final List<LoanDto> loans, final List<LoanDto> loans,
final LoanDto? activeLoan, final LoanDto? activeLoan,
final bool isDeletingAccount}) = _$CoreStateImpl; final bool isDeletingAccount,
}) = _$CoreStateImpl;
@override @override
OkanePage get activePage; OkanePage get activePage;

View File

@ -65,7 +65,7 @@ class AccountSwitcher extends StatelessWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
Text( Text(
bloc.activeAccount!.name!, bloc.activeAccount!.name,
style: Theme.of(context).textTheme.titleLarge, style: Theme.of(context).textTheme.titleLarge,
), ),
Icon(Icons.arrow_drop_down), Icon(Icons.arrow_drop_down),