From 44279796c49a0010f38d67def81c7e3e791b18f5 Mon Sep 17 00:00:00 2001 From: gltron Date: Sun, 18 Feb 2024 00:08:17 +0100 Subject: [PATCH] budget mockup, account settings & transactions filter --- lib/domains/account/account_bloc.dart | 76 ++++++++++++++++++- lib/domains/account/account_event.dart | 41 ++++++++++ lib/domains/account/account_state.dart | 8 +- lib/domains/charts/chart_bloc.dart | 3 +- lib/domains/transaction/transaction_bloc.dart | 28 ++++++- .../transaction/transaction_event.dart | 6 ++ .../transaction/transaction_state.dart | 11 ++- lib/pages/budgets/budgets_page.dart | 2 + .../budgets/widgets/month_distribution.dart | 73 ++++++++++++++++++ lib/pages/common/titled_container.dart | 33 ++++++-- lib/pages/data/widgets/account_settings.dart | 53 +++++++++++-- .../data/widgets/categories_settings.dart | 4 +- .../transactions/widgets/category_filter.dart | 35 +++++++++ .../widgets/transactions_actions.dart | 2 + .../widgets/transactions_list.dart | 8 +- .../metadata/metadata_repository.dart | 4 + .../metadata/models/category.dart | 8 +- .../transactions/transactions_repository.dart | 4 + 18 files changed, 367 insertions(+), 32 deletions(-) create mode 100644 lib/pages/budgets/widgets/month_distribution.dart create mode 100644 lib/pages/transactions/widgets/category_filter.dart diff --git a/lib/domains/account/account_bloc.dart b/lib/domains/account/account_bloc.dart index d7dbac0..f626d04 100644 --- a/lib/domains/account/account_bloc.dart +++ b/lib/domains/account/account_bloc.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:io'; import 'package:csv/csv.dart'; @@ -49,6 +50,11 @@ class AccountBloc extends Bloc { on(_onAccountLoad); // on(_onAccountImportJSON); // on(_onAccountImportJSON); + on(_onAccountAdd); + on(_onAcountRemove); + on(_onAccountEditLabel); + on(_onAccountEditSaving); + on(_onAccountEditColor); _metadataRepository .getAccountsStream() @@ -103,7 +109,7 @@ class AccountBloc extends Bloc { String accountLabel = line[3]; if (accounts[accountLabel] == null) { - accounts[accountLabel] = Account(label: accountLabel); + accounts[accountLabel] = Account(label: accountLabel, color: 'FF74feff'); } return Transaction( @@ -134,4 +140,72 @@ class AccountBloc extends Bloc { state.copyWith(event.subAccounts) ); } + + _onAccountAdd(AccountAdd event, Emitter emit) async { + String uuid = const Uuid().v8(); + Account account = Account( + label: 'Account $uuid', + color: 'FF74feff', + saving: false + ); + emit( + state.copyWith(await _saveAccount(account)) + ); + } + + _onAcountRemove(AccountRemove event, Emitter emit) async { + Account accountToRemove = event.account; + List accounts = state.accounts; + List transactions = _transactionsRepository.getTransactions(); + + if (transactions.any((transaction) => transaction.account == accountToRemove.label)) { + emit(AccountRemoveFail()); + emit(AccountState(accounts: accounts)); + } else { + accounts.removeWhere((account) => account.label == accountToRemove.label); + emit(AccountRemoveSucess()); + emit( + state.copyWith(await _metadataRepository.saveAccounts(accounts)) + ); + } + } + + _onAccountEditLabel(AccountEditLabel event, Emitter emit) async { + Account account = event.account; + account.label = event.label; + emit( + state.copyWith(await _saveAccount(account)) + ); + } + + _onAccountEditSaving(AccountEditSaving event, Emitter emit) async { + Account account = event.account; + account.saving = event.saving; + emit( + state.copyWith(await _saveAccount(account)) + ); + } + + _onAccountEditColor(AccountEditColor event, Emitter emit) async { + Account account = event.account; + account.color = event.color; + emit( + state.copyWith(await _saveAccount(account)) + ); + } + + Future> _saveAccount(Account accountToSave) async { + List accounts = _metadataRepository.getAccounts(); + + try { + Account accountFound = accounts.firstWhere((account) => account.label == accountToSave.label); + accountFound.color = accountToSave.color; + accountFound.saving = accountToSave.saving; + } catch (e) { + accounts.add(accountToSave); + } + + await _metadataRepository.saveAccounts(accounts); + return accounts; + } } diff --git a/lib/domains/account/account_event.dart b/lib/domains/account/account_event.dart index f209579..b0ce95c 100644 --- a/lib/domains/account/account_event.dart +++ b/lib/domains/account/account_event.dart @@ -30,3 +30,44 @@ final class AccountLoad extends AccountEvent { @override List get props => [subAccounts]; } + +final class AccountEditColor extends AccountEvent { + final Account account; + final String color; + + const AccountEditColor(this.account, this.color); + + @override + List get props => [account, color]; +} + +final class AccountEditSaving extends AccountEvent { + final Account account; + final bool saving; + + const AccountEditSaving(this.account, this.saving); + + @override + List get props => [account, saving]; +} + +final class AccountEditLabel extends AccountEvent { + final Account account; + final String label; + + const AccountEditLabel(this.account, this.label); + + @override + List get props => [account, label]; +} + +final class AccountRemove extends AccountEvent { + final Account account; + + const AccountRemove(this.account); + + @override + List get props => [account]; +} + +final class AccountAdd extends AccountEvent {} diff --git a/lib/domains/account/account_state.dart b/lib/domains/account/account_state.dart index 0fe5e46..7b3ae88 100644 --- a/lib/domains/account/account_state.dart +++ b/lib/domains/account/account_state.dart @@ -1,6 +1,6 @@ part of 'account_bloc.dart'; -final class AccountState extends Equatable { +final class AccountState { final List accounts; const AccountState({ @@ -12,7 +12,7 @@ final class AccountState extends Equatable { accounts: accounts ?? this.accounts, ); } - - @override - List get props => [accounts]; } + +final class AccountRemoveFail extends AccountState {} +final class AccountRemoveSucess extends AccountState {} \ No newline at end of file diff --git a/lib/domains/charts/chart_bloc.dart b/lib/domains/charts/chart_bloc.dart index f3053ee..4f7ae92 100644 --- a/lib/domains/charts/chart_bloc.dart +++ b/lib/domains/charts/chart_bloc.dart @@ -7,7 +7,6 @@ import 'package:tunas/domains/charts/models/chart_item.dart'; import 'package:tunas/repositories/metadata/metadata_repository.dart'; import 'package:tunas/repositories/metadata/models/category.dart'; import 'package:tunas/repositories/transactions/models/transaction.dart'; -import 'package:tunas/repositories/transactions/models/transactions.dart'; import 'package:tunas/repositories/transactions/transactions_repository.dart'; part 'chart_event.dart'; @@ -138,7 +137,7 @@ class ChartBloc extends Bloc { scopedMonthlyTotals[transactionDateDay] = FlSpot(transactionDateDay.toDouble(), transactionLine.subTotal); final category = state.categories[transaction.category]; - if (category == null || category.saving) { + if (category == null || category.transfert) { continue; } diff --git a/lib/domains/transaction/transaction_bloc.dart b/lib/domains/transaction/transaction_bloc.dart index 153fe65..4cf2f7c 100644 --- a/lib/domains/transaction/transaction_bloc.dart +++ b/lib/domains/transaction/transaction_bloc.dart @@ -1,4 +1,3 @@ - import 'package:equatable/equatable.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:formz/formz.dart'; @@ -8,6 +7,7 @@ import 'package:tunas/domains/transaction/models/transaction_date.dart'; import 'package:tunas/domains/transaction/models/transaction_description.dart'; import 'package:tunas/domains/transaction/models/transaction_line.dart'; import 'package:tunas/domains/transaction/models/transaction_value.dart'; +import 'package:tunas/repositories/metadata/models/category.dart'; import 'package:tunas/repositories/transactions/models/transaction.dart'; import 'package:tunas/repositories/transactions/transactions_repository.dart'; import 'package:uuid/uuid.dart'; @@ -32,6 +32,7 @@ class TransactionBloc extends Bloc { on(_onTransactionAddDialog); on(_onTransactionSetCurrent); on(_onTransactionDeleteCurrent); + on(_onTransactionFilterCategory); _transactionsRepository .getTransactionsStream() @@ -43,6 +44,7 @@ class TransactionBloc extends Bloc { emit(state.copyWith( transactions: event.transactions, transactionsLines: computeResult.list, + transactionsLinesFiltered: _applyCategoryFilter(computeResult.list), globalTotal: computeResult.globalTotal, accountsTotals: computeResult.accountsTotals, )); @@ -172,6 +174,7 @@ class TransactionBloc extends Bloc { transactionValue: const TransactionValue.pure(), transactions: transactions, transactionsLines: computeResult.list, + transactionsLinesFiltered: _applyCategoryFilter(computeResult.list), globalTotal: computeResult.globalTotal, accountsTotals: computeResult.accountsTotals, )); @@ -221,10 +224,33 @@ class TransactionBloc extends Bloc { transactionValue: const TransactionValue.pure(), transactions: transactions, transactionsLines: computeResult.list, + transactionsLinesFiltered: _applyCategoryFilter(computeResult.list), globalTotal: computeResult.globalTotal, accountsTotals: computeResult.accountsTotals, )); } } + + _onTransactionFilterCategory(TransactionFilterCategory event, Emitter emit) { + List transactionsLinesFiltered = state.transactionsLines; + String? categoryLabel = event.category?.label; + if (categoryLabel != null) { + transactionsLinesFiltered = state.transactionsLines.where((transaction) => transaction.transaction.category == categoryLabel).toList(); + } + + emit(state.copyWith( + transactionsLinesFiltered: transactionsLinesFiltered, + categoryFilter: event.category, + )); + } + + List _applyCategoryFilter(List transactionsLines) { + List transactionsLinesFiltered = transactionsLines; + String? categoryLabel = state.categoryFilter?.label; + if (categoryLabel != null) { + transactionsLinesFiltered = state.transactionsLines.where((transaction) => transaction.transaction.category == categoryLabel).toList(); + } + return transactionsLinesFiltered; + } } \ No newline at end of file diff --git a/lib/domains/transaction/transaction_event.dart b/lib/domains/transaction/transaction_event.dart index 2b32175..40ac595 100644 --- a/lib/domains/transaction/transaction_event.dart +++ b/lib/domains/transaction/transaction_event.dart @@ -71,4 +71,10 @@ final class TransactionSetCurrent extends TransactionEvent { final class TransactionDeleteCurrent extends TransactionEvent { const TransactionDeleteCurrent(); +} + +final class TransactionFilterCategory extends TransactionEvent { + final Category? category; + + const TransactionFilterCategory(this.category); } \ No newline at end of file diff --git a/lib/domains/transaction/transaction_state.dart b/lib/domains/transaction/transaction_state.dart index 63bf93d..b63793e 100644 --- a/lib/domains/transaction/transaction_state.dart +++ b/lib/domains/transaction/transaction_state.dart @@ -6,6 +6,8 @@ final class TransactionState extends Equatable { final List transactions; final List transactionsLines; + final List transactionsLinesFiltered; + final Category? categoryFilter; final TransactionDate transactionDate; final TransactionCategory transactionCategory; @@ -22,6 +24,7 @@ final class TransactionState extends Equatable { this.accountsTotals = const {}, this.transactions = const [], this.transactionsLines = const [], + this.transactionsLinesFiltered = const [], this.transactionDate = const TransactionDate.pure(), this.transactionCategory = const TransactionCategory.pure(), this.transactionDescription = const TransactionDescription.pure(), @@ -29,7 +32,8 @@ final class TransactionState extends Equatable { this.transactionValue = const TransactionValue.pure(), this.isValid = false, this.showAddDialog = false, - this.currentTransaction + this.currentTransaction, + this.categoryFilter, }); TransactionState copyWith({ @@ -37,6 +41,7 @@ final class TransactionState extends Equatable { Map? accountsTotals, List? transactions, List? transactionsLines, + List? transactionsLinesFiltered, TransactionDate? transactionDate, TransactionCategory? transactionCategory, TransactionDescription? transactionDescription, @@ -45,12 +50,14 @@ final class TransactionState extends Equatable { bool? isValid, bool? showAddDialog, Transaction? currentTransaction, + Category? categoryFilter, }) { return TransactionState( globalTotal: globalTotal ?? this.globalTotal, accountsTotals: accountsTotals ?? this.accountsTotals, transactions: transactions ?? this.transactions, transactionsLines: transactionsLines ?? this.transactionsLines, + transactionsLinesFiltered: transactionsLinesFiltered ?? this.transactionsLinesFiltered, transactionDate: transactionDate ?? this.transactionDate, transactionCategory: transactionCategory ?? this.transactionCategory, transactionDescription: transactionDescription ?? this.transactionDescription, @@ -59,6 +66,7 @@ final class TransactionState extends Equatable { isValid: isValid ?? this.isValid, showAddDialog: showAddDialog ?? this.showAddDialog, currentTransaction: currentTransaction ?? this.currentTransaction, + categoryFilter: categoryFilter, ); } @@ -72,6 +80,7 @@ final class TransactionState extends Equatable { isValid, showAddDialog, currentTransaction, + categoryFilter, ]; } \ No newline at end of file diff --git a/lib/pages/budgets/budgets_page.dart b/lib/pages/budgets/budgets_page.dart index 54920ce..3659a0a 100644 --- a/lib/pages/budgets/budgets_page.dart +++ b/lib/pages/budgets/budgets_page.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:tunas/pages/budgets/widgets/budgets_actions.dart'; +import 'package:tunas/pages/budgets/widgets/month_distribution.dart'; class BudgetsPage extends StatelessWidget { const BudgetsPage({super.key}); @@ -14,6 +15,7 @@ class BudgetsPage extends StatelessWidget { child: const Column( children: [ BudgetsActions(), + MonthDistribution() ], ) ) diff --git a/lib/pages/budgets/widgets/month_distribution.dart b/lib/pages/budgets/widgets/month_distribution.dart new file mode 100644 index 0000000..072842b --- /dev/null +++ b/lib/pages/budgets/widgets/month_distribution.dart @@ -0,0 +1,73 @@ +import 'package:fl_chart/fl_chart.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:tunas/pages/common/titled_container.dart'; + +class MonthDistribution extends StatelessWidget { + const MonthDistribution({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + TitledContainer( + title: 'Prepare', + child: Column( + children: [ + Text('Money to spare: 2300 €'), + Text('Loyer'), + Slider( + min: 0, + max: 2300, + value: 200, + onChanged: (value) => {}, + ), + Text('Loyer'), + Slider( + min: 0, + max: 2300, + value: 200, + onChanged: (value) => {}, + ), + ], + ), + ), + TitledContainer( + title: 'Compare', + height: 500, + child: Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text('Budget'), + ], + ), + ), + Expanded( + child: Column( + children: [ + Row( + children: [ + IconButton( + onPressed: () => {}, + icon: const Icon(Icons.skip_previous) + ), + Text('Fev 2024'), + IconButton( + onPressed: () => {}, + icon: const Icon(Icons.skip_next) + ), + ], + ), + ], + ) + ) + ], + ), + ), + ], + ); + } +} \ No newline at end of file diff --git a/lib/pages/common/titled_container.dart b/lib/pages/common/titled_container.dart index bec26c1..0e385de 100644 --- a/lib/pages/common/titled_container.dart +++ b/lib/pages/common/titled_container.dart @@ -3,12 +3,35 @@ import 'package:flutter/material.dart'; class TitledContainer extends StatelessWidget { final String title; final Widget child; + final Widget? action; + final double? height; + final double? width; - const TitledContainer({super.key, required this.title, required this.child}); + const TitledContainer({super.key, required this.title, required this.child, this.action, this.height, this.width}); + + Widget _computeTitleRow() { + List children = []; + children.add(Text( + title, + style: const TextStyle( + fontWeight: FontWeight.w300, + fontSize: 20, + ), + )); + Widget? actionWidget = action; + if (actionWidget != null) { + children.add(actionWidget); + } + return Row( + children: children + ); + } @override Widget build(BuildContext context) { return Container( + height: height, + width: width, decoration: BoxDecoration( color: Theme.of(context).colorScheme.primaryContainer, borderRadius: BorderRadius.circular(15), @@ -36,13 +59,7 @@ class TitledContainer extends StatelessWidget { borderRadius: const BorderRadius.only(topLeft: Radius.circular(15), topRight: Radius.circular(15)), ), padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 15), - child: Text( - title, - style: const TextStyle( - fontWeight: FontWeight.w300, - fontSize: 20, - ), - ), + child: _computeTitleRow() ), ], ), diff --git a/lib/pages/data/widgets/account_settings.dart b/lib/pages/data/widgets/account_settings.dart index 70f8242..83e95ad 100644 --- a/lib/pages/data/widgets/account_settings.dart +++ b/lib/pages/data/widgets/account_settings.dart @@ -2,28 +2,71 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:tunas/domains/account/account_bloc.dart'; import 'package:tunas/pages/common/titled_container.dart'; +import 'package:tunas/repositories/metadata/models/account.dart'; class AccountSettings extends StatelessWidget { const AccountSettings({super.key}); - List _computeCategoryList(List subAccounts) { - return subAccounts.map((subAccount) => Row( + List _computeCategoryList(BuildContext context, List accounts) { + return accounts.map((account) => Row( children: [ - Text(subAccount), + IconButton( + onPressed: () {}, + icon: const Icon(Icons.palette), + color: account.rgbToColor(), + ), + IconButton( + onPressed: () => context.read().add(AccountEditSaving(account, !account.saving)), + icon: const Icon(Icons.savings), + color: account.saving ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.error, + ), + Container(width: 5), + Expanded( + child: Text(account.label) + ), + IconButton( + onPressed: () {}, + icon: const Icon(Icons.edit), + ), + IconButton( + onPressed: () => context.read().add(AccountRemove(account)), + icon: const Icon(Icons.delete), + ), ], )).toList(); } @override Widget build(BuildContext context) { - return BlocBuilder( + return BlocConsumer( + listener: (context, state) { + if (state is AccountRemoveSucess) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + backgroundColor: Colors.green, + content: Text('Account succesfuly removed !'), + ) + ); + } else if (state is AccountRemoveFail) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar( + backgroundColor: Colors.red, + content: Text('Cannot remove account. Still present on some transactions.'), + ) + ); + } + }, builder: (context, state) => TitledContainer( title: "Accounts", + action: IconButton( + onPressed: () => context.read().add(AccountAdd()), + icon: const Icon(Icons.add), + ), child: SingleChildScrollView( scrollDirection: Axis.vertical, child: Column( crossAxisAlignment: CrossAxisAlignment.start, - children: _computeCategoryList(state.accounts.map((account) => account.label).toList()), + children: _computeCategoryList(context, state.accounts), ), ), ), diff --git a/lib/pages/data/widgets/categories_settings.dart b/lib/pages/data/widgets/categories_settings.dart index 8c2fc7e..6b1f2f8 100644 --- a/lib/pages/data/widgets/categories_settings.dart +++ b/lib/pages/data/widgets/categories_settings.dart @@ -17,8 +17,8 @@ class CategoriesSettings extends StatelessWidget { ), IconButton( onPressed: () {}, - icon: const Icon(Icons.savings), - color: category.saving ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.error, + icon: const Icon(Icons.swap_horiz), + color: category.transfert ? Theme.of(context).colorScheme.primary : Theme.of(context).colorScheme.error, ), IconButton( onPressed: () {}, diff --git a/lib/pages/transactions/widgets/category_filter.dart b/lib/pages/transactions/widgets/category_filter.dart new file mode 100644 index 0000000..e3ed3f9 --- /dev/null +++ b/lib/pages/transactions/widgets/category_filter.dart @@ -0,0 +1,35 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:tunas/domains/category/category_bloc.dart'; +import 'package:tunas/domains/transaction/transaction_bloc.dart'; +import 'package:tunas/repositories/metadata/models/category.dart' as tunas_category; + +class CategoryFilter extends StatelessWidget { + const CategoryFilter({super.key}); + + @override + Widget build(BuildContext context) { + final categoryState = context.watch().state; + return BlocBuilder( + buildWhen: (previous, current) => previous.categoryFilter != current.categoryFilter, + builder: (context, state) => SizedBox( + width: 500, + child: DropdownButtonFormField( + value: state.categoryFilter, + onChanged: (value) => context.read().add(TransactionFilterCategory(value!)), + items: categoryState.categories.map((e) => DropdownMenuItem(value: e, child: Text(e.label))).toList(), + decoration: InputDecoration( + suffixIcon: IconButton( + icon: const Icon(Icons.filter_alt_off), + onPressed: () => context.read().add(const TransactionFilterCategory(null)), + ), + hintText: 'Category', + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(5), + ), + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/pages/transactions/widgets/transactions_actions.dart b/lib/pages/transactions/widgets/transactions_actions.dart index 3aadfc2..3e40c54 100644 --- a/lib/pages/transactions/widgets/transactions_actions.dart +++ b/lib/pages/transactions/widgets/transactions_actions.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:tunas/domains/transaction/transaction_bloc.dart'; +import 'package:tunas/pages/transactions/widgets/category_filter.dart'; import 'package:tunas/pages/transactions/widgets/transaction_add_dialog.dart'; class TransactionsActions extends StatelessWidget { @@ -22,6 +23,7 @@ class TransactionsActions extends StatelessWidget { fontSize: 35, ), ), + CategoryFilter(), IconButton( onPressed: () => TransactionAddDialog.show(context, null), icon: const Icon( diff --git a/lib/pages/transactions/widgets/transactions_list.dart b/lib/pages/transactions/widgets/transactions_list.dart index c3b7f42..394c316 100644 --- a/lib/pages/transactions/widgets/transactions_list.dart +++ b/lib/pages/transactions/widgets/transactions_list.dart @@ -9,13 +9,13 @@ class TransactionsList extends StatelessWidget { @override Widget build(BuildContext context) { return BlocBuilder( - buildWhen: (previous, current) => previous.transactionsLines != current.transactionsLines, + buildWhen: (previous, current) => previous.transactionsLinesFiltered != current.transactionsLinesFiltered, builder: (context, state) => Expanded( child: ListView.builder( - itemCount: state.transactionsLines.length, + itemCount: state.transactionsLinesFiltered.length, itemBuilder: (context, index) => TransactionLine( - transaction: state.transactionsLines[index].transaction, - subTotal: state.transactionsLines[index].subTotal + transaction: state.transactionsLinesFiltered[index].transaction, + subTotal: state.transactionsLinesFiltered[index].subTotal ) ) ) diff --git a/lib/repositories/metadata/metadata_repository.dart b/lib/repositories/metadata/metadata_repository.dart index a608a16..38b91bc 100644 --- a/lib/repositories/metadata/metadata_repository.dart +++ b/lib/repositories/metadata/metadata_repository.dart @@ -24,6 +24,10 @@ class MetadataRepository { return _budgetController.asBroadcastStream(); } + List getAccounts() { + return _accountController.value; + } + Stream> getAccountsStream() { return _accountController.asBroadcastStream(); } diff --git a/lib/repositories/metadata/models/category.dart b/lib/repositories/metadata/models/category.dart index 6c0403d..09123b8 100644 --- a/lib/repositories/metadata/models/category.dart +++ b/lib/repositories/metadata/models/category.dart @@ -4,13 +4,13 @@ class Category { String label; String color; bool essential; - bool saving; + bool transfert; Category({ this.label = '', this.color = '', this.essential = false, - this.saving = false, + this.transfert = false, }); factory Category.fromJson(Map json) { @@ -18,7 +18,7 @@ class Category { label: json['label'], color: json['color'], essential: bool.parse(json['essential']), - saving: bool.parse(json['saving']), + transfert: bool.parse(json['transfert']), ); } @@ -26,7 +26,7 @@ class Category { 'label': label, 'color': color, 'essential': essential.toString(), - 'saving': saving.toString(), + 'transfert': transfert.toString(), }; Color rgbToColor() { diff --git a/lib/repositories/transactions/transactions_repository.dart b/lib/repositories/transactions/transactions_repository.dart index ccdf864..3e9ac0f 100644 --- a/lib/repositories/transactions/transactions_repository.dart +++ b/lib/repositories/transactions/transactions_repository.dart @@ -12,6 +12,10 @@ class TransactionsRepository { required jsonRepository, }) : _jsonRepository = jsonRepository; + List getTransactions() { + return _transactionsController.value; + } + Stream> getTransactionsStream() { return _transactionsController.asBroadcastStream(); }