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,19 +386,12 @@ 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( return rows.map((row) {
budgetItems, return BudgetsDto(budget: row);
budgetItems.budgetId.equalsExp(budgets.id), }).toList();
), });
])
.watch()
.map((rows) {
return rows.map((row) {
return BudgetsDto(budget: row.readTable(budgets));
}).toList();
});
} }
Future<List<BudgetsDto>> getBudgets(Account? account) { Future<List<BudgetsDto>> getBudgets(Account? account) {

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,22 +46,23 @@ 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,
List<RecurringTransactionDto> recurringTransactions, List<RecurringTransactionDto> recurringTransactions,
List<TransactionDto> transactions, List<TransactionDto> transactions,
List<TransactionTemplateDto> transactionTemplates, List<TransactionTemplateDto> transactionTemplates,
List<Beneficiary> beneficiaries, List<Beneficiary> beneficiaries,
List<ExpenseCategory> expenseCategories, List<ExpenseCategory> expenseCategories,
List<BudgetsDto> budgets, List<BudgetsDto> budgets,
List<BudgetItemDto> budgetItems, List<BudgetItemDto> budgetItems,
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(
? _value.activePage activePage:
: activePage // ignore: cast_nullable_to_non_nullable null == activePage
as OkanePage, ? _value.activePage
activeAccountIndex: freezed == activeAccountIndex : activePage // ignore: cast_nullable_to_non_nullable
? _value.activeAccountIndex as OkanePage,
: activeAccountIndex // ignore: cast_nullable_to_non_nullable activeAccountIndex:
as int?, freezed == activeAccountIndex
activeTransaction: freezed == activeTransaction ? _value.activeAccountIndex
? _value.activeTransaction : activeAccountIndex // ignore: cast_nullable_to_non_nullable
: activeTransaction // ignore: cast_nullable_to_non_nullable as int?,
as TransactionDto?, activeTransaction:
accounts: null == accounts freezed == activeTransaction
? _value.accounts ? _value.activeTransaction
: accounts // ignore: cast_nullable_to_non_nullable : activeTransaction // ignore: cast_nullable_to_non_nullable
as List<Account>, as TransactionDto?,
recurringTransactions: null == recurringTransactions accounts:
? _value.recurringTransactions null == accounts
: recurringTransactions // ignore: cast_nullable_to_non_nullable ? _value.accounts
as List<RecurringTransactionDto>, : accounts // ignore: cast_nullable_to_non_nullable
transactions: null == transactions as List<Account>,
? _value.transactions recurringTransactions:
: transactions // ignore: cast_nullable_to_non_nullable null == recurringTransactions
as List<TransactionDto>, ? _value.recurringTransactions
transactionTemplates: null == transactionTemplates : recurringTransactions // ignore: cast_nullable_to_non_nullable
? _value.transactionTemplates as List<RecurringTransactionDto>,
: transactionTemplates // ignore: cast_nullable_to_non_nullable transactions:
as List<TransactionTemplateDto>, null == transactions
beneficiaries: null == beneficiaries ? _value.transactions
? _value.beneficiaries : transactions // ignore: cast_nullable_to_non_nullable
: beneficiaries // ignore: cast_nullable_to_non_nullable as List<TransactionDto>,
as List<Beneficiary>, transactionTemplates:
expenseCategories: null == expenseCategories null == transactionTemplates
? _value.expenseCategories ? _value.transactionTemplates
: expenseCategories // ignore: cast_nullable_to_non_nullable : transactionTemplates // ignore: cast_nullable_to_non_nullable
as List<ExpenseCategory>, as List<TransactionTemplateDto>,
budgets: null == budgets beneficiaries:
? _value.budgets null == beneficiaries
: budgets // ignore: cast_nullable_to_non_nullable ? _value.beneficiaries
as List<BudgetsDto>, : beneficiaries // ignore: cast_nullable_to_non_nullable
budgetItems: null == budgetItems as List<Beneficiary>,
? _value.budgetItems expenseCategories:
: budgetItems // ignore: cast_nullable_to_non_nullable null == expenseCategories
as List<BudgetItemDto>, ? _value.expenseCategories
activeBudget: freezed == activeBudget : expenseCategories // ignore: cast_nullable_to_non_nullable
? _value.activeBudget as List<ExpenseCategory>,
: activeBudget // ignore: cast_nullable_to_non_nullable budgets:
as BudgetsDto?, null == budgets
loans: null == loans ? _value.budgets
? _value.loans : budgets // ignore: cast_nullable_to_non_nullable
: loans // ignore: cast_nullable_to_non_nullable as List<BudgetsDto>,
as List<LoanDto>, budgetItems:
activeLoan: freezed == activeLoan null == budgetItems
? _value.activeLoan ? _value.budgetItems
: activeLoan // ignore: cast_nullable_to_non_nullable : budgetItems // ignore: cast_nullable_to_non_nullable
as LoanDto?, as List<BudgetItemDto>,
isDeletingAccount: null == isDeletingAccount activeBudget:
? _value.isDeletingAccount freezed == activeBudget
: isDeletingAccount // ignore: cast_nullable_to_non_nullable ? _value.activeBudget
as bool, : activeBudget // ignore: cast_nullable_to_non_nullable
) as $Val); 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,
);
} }
} }
@ -161,26 +181,28 @@ 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,
List<RecurringTransactionDto> recurringTransactions, List<RecurringTransactionDto> recurringTransactions,
List<TransactionDto> transactions, List<TransactionDto> transactions,
List<TransactionTemplateDto> transactionTemplates, List<TransactionTemplateDto> transactionTemplates,
List<Beneficiary> beneficiaries, List<Beneficiary> beneficiaries,
List<ExpenseCategory> expenseCategories, List<ExpenseCategory> expenseCategories,
List<BudgetsDto> budgets, List<BudgetsDto> budgets,
List<BudgetItemDto> budgetItems, List<BudgetItemDto> budgetItems,
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,99 +233,116 @@ class __$$CoreStateImplCopyWithImpl<$Res>
Object? activeLoan = freezed, Object? activeLoan = freezed,
Object? isDeletingAccount = null, Object? isDeletingAccount = null,
}) { }) {
return _then(_$CoreStateImpl( return _then(
activePage: null == activePage _$CoreStateImpl(
? _value.activePage activePage:
: activePage // ignore: cast_nullable_to_non_nullable null == activePage
as OkanePage, ? _value.activePage
activeAccountIndex: freezed == activeAccountIndex : activePage // ignore: cast_nullable_to_non_nullable
? _value.activeAccountIndex as OkanePage,
: activeAccountIndex // ignore: cast_nullable_to_non_nullable activeAccountIndex:
as int?, freezed == activeAccountIndex
activeTransaction: freezed == activeTransaction ? _value.activeAccountIndex
? _value.activeTransaction : activeAccountIndex // ignore: cast_nullable_to_non_nullable
: activeTransaction // ignore: cast_nullable_to_non_nullable as int?,
as TransactionDto?, activeTransaction:
accounts: null == accounts freezed == activeTransaction
? _value._accounts ? _value.activeTransaction
: accounts // ignore: cast_nullable_to_non_nullable : activeTransaction // ignore: cast_nullable_to_non_nullable
as List<Account>, as TransactionDto?,
recurringTransactions: null == recurringTransactions accounts:
? _value._recurringTransactions null == accounts
: recurringTransactions // ignore: cast_nullable_to_non_nullable ? _value._accounts
as List<RecurringTransactionDto>, : accounts // ignore: cast_nullable_to_non_nullable
transactions: null == transactions as List<Account>,
? _value._transactions recurringTransactions:
: transactions // ignore: cast_nullable_to_non_nullable null == recurringTransactions
as List<TransactionDto>, ? _value._recurringTransactions
transactionTemplates: null == transactionTemplates : recurringTransactions // ignore: cast_nullable_to_non_nullable
? _value._transactionTemplates as List<RecurringTransactionDto>,
: transactionTemplates // ignore: cast_nullable_to_non_nullable transactions:
as List<TransactionTemplateDto>, null == transactions
beneficiaries: null == beneficiaries ? _value._transactions
? _value._beneficiaries : transactions // ignore: cast_nullable_to_non_nullable
: beneficiaries // ignore: cast_nullable_to_non_nullable as List<TransactionDto>,
as List<Beneficiary>, transactionTemplates:
expenseCategories: null == expenseCategories null == transactionTemplates
? _value._expenseCategories ? _value._transactionTemplates
: expenseCategories // ignore: cast_nullable_to_non_nullable : transactionTemplates // ignore: cast_nullable_to_non_nullable
as List<ExpenseCategory>, as List<TransactionTemplateDto>,
budgets: null == budgets beneficiaries:
? _value._budgets null == beneficiaries
: budgets // ignore: cast_nullable_to_non_nullable ? _value._beneficiaries
as List<BudgetsDto>, : beneficiaries // ignore: cast_nullable_to_non_nullable
budgetItems: null == budgetItems as List<Beneficiary>,
? _value._budgetItems expenseCategories:
: budgetItems // ignore: cast_nullable_to_non_nullable null == expenseCategories
as List<BudgetItemDto>, ? _value._expenseCategories
activeBudget: freezed == activeBudget : expenseCategories // ignore: cast_nullable_to_non_nullable
? _value.activeBudget as List<ExpenseCategory>,
: activeBudget // ignore: cast_nullable_to_non_nullable budgets:
as BudgetsDto?, null == budgets
loans: null == loans ? _value._budgets
? _value._loans : budgets // ignore: cast_nullable_to_non_nullable
: loans // ignore: cast_nullable_to_non_nullable as List<BudgetsDto>,
as List<LoanDto>, budgetItems:
activeLoan: freezed == activeLoan null == budgetItems
? _value.activeLoan ? _value._budgetItems
: activeLoan // ignore: cast_nullable_to_non_nullable : budgetItems // ignore: cast_nullable_to_non_nullable
as LoanDto?, as List<BudgetItemDto>,
isDeletingAccount: null == isDeletingAccount activeBudget:
? _value.isDeletingAccount freezed == activeBudget
: isDeletingAccount // ignore: cast_nullable_to_non_nullable ? _value.activeBudget
as bool, : 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 /// @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 [],
final List<RecurringTransactionDto> recurringTransactions = const [], final List<RecurringTransactionDto> recurringTransactions = const [],
final List<TransactionDto> transactions = const [], final List<TransactionDto> transactions = const [],
final List<TransactionTemplateDto> transactionTemplates = const [], final List<TransactionTemplateDto> transactionTemplates = const [],
final List<Beneficiary> beneficiaries = const [], final List<Beneficiary> beneficiaries = const [],
final List<ExpenseCategory> expenseCategories = const [], final List<ExpenseCategory> expenseCategories = const [],
final List<BudgetsDto> budgets = const [], final List<BudgetsDto> budgets = const [],
final List<BudgetItemDto> budgetItems = const [], final List<BudgetItemDto> budgetItems = const [],
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,
_beneficiaries = beneficiaries, _beneficiaries = beneficiaries,
_expenseCategories = expenseCategories, _expenseCategories = expenseCategories,
_budgets = budgets, _budgets = budgets,
_budgetItems = budgetItems, _budgetItems = budgetItems,
_loans = loans; _loans = loans;
@override @override
@JsonKey() @JsonKey()
@ -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) &&
@ -447,22 +499,23 @@ class _$CoreStateImpl implements _CoreState {
@override @override
int get hashCode => Object.hash( int get hashCode => Object.hash(
runtimeType, runtimeType,
activePage, activePage,
activeAccountIndex, activeAccountIndex,
activeTransaction, activeTransaction,
const DeepCollectionEquality().hash(_accounts), const DeepCollectionEquality().hash(_accounts),
const DeepCollectionEquality().hash(_recurringTransactions), const DeepCollectionEquality().hash(_recurringTransactions),
const DeepCollectionEquality().hash(_transactions), const DeepCollectionEquality().hash(_transactions),
const DeepCollectionEquality().hash(_transactionTemplates), const DeepCollectionEquality().hash(_transactionTemplates),
const DeepCollectionEquality().hash(_beneficiaries), const DeepCollectionEquality().hash(_beneficiaries),
const DeepCollectionEquality().hash(_expenseCategories), const DeepCollectionEquality().hash(_expenseCategories),
const DeepCollectionEquality().hash(_budgets), const DeepCollectionEquality().hash(_budgets),
const DeepCollectionEquality().hash(_budgetItems), const DeepCollectionEquality().hash(_budgetItems),
activeBudget, activeBudget,
const DeepCollectionEquality().hash(_loans), const DeepCollectionEquality().hash(_loans),
activeLoan, activeLoan,
isDeletingAccount); isDeletingAccount,
);
@JsonKey(ignore: true) @JsonKey(ignore: true)
@override @override
@ -472,22 +525,23 @@ 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,
final List<RecurringTransactionDto> recurringTransactions, final List<RecurringTransactionDto> recurringTransactions,
final List<TransactionDto> transactions, final List<TransactionDto> transactions,
final List<TransactionTemplateDto> transactionTemplates, final List<TransactionTemplateDto> transactionTemplates,
final List<Beneficiary> beneficiaries, final List<Beneficiary> beneficiaries,
final List<ExpenseCategory> expenseCategories, final List<ExpenseCategory> expenseCategories,
final List<BudgetsDto> budgets, final List<BudgetsDto> budgets,
final List<BudgetItemDto> budgetItems, final List<BudgetItemDto> budgetItems,
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),