From 0f7fee4501c7f3c85d559ad7b82364a8ca935056 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Sun, 18 Sep 2022 21:41:05 +0300 Subject: [PATCH] Transactions --- .../models/static/invoice_status_model.dart | 2 +- lib/data/models/transaction_model.dart | 20 +++ lib/data/models/transaction_model.g.dart | 150 ++++++++++++++++++ .../transaction/transaction_selectors.dart | 8 +- lib/ui/transaction/transaction_screen.dart | 20 +++ lib/utils/i18n.dart | 10 ++ 6 files changed, 208 insertions(+), 2 deletions(-) diff --git a/lib/data/models/static/invoice_status_model.dart b/lib/data/models/static/invoice_status_model.dart index 789ba12e7..586fd1ee2 100644 --- a/lib/data/models/static/invoice_status_model.dart +++ b/lib/data/models/static/invoice_status_model.dart @@ -49,7 +49,7 @@ class InvoiceStatusFields { } abstract class InvoiceStatusEntity extends Object - with EntityStatus + with EntityStatus, SelectableEntity implements Built { factory InvoiceStatusEntity() { return _$InvoiceStatusEntity._( diff --git a/lib/data/models/transaction_model.dart b/lib/data/models/transaction_model.dart index cffea4823..9cc25792b 100644 --- a/lib/data/models/transaction_model.dart +++ b/lib/data/models/transaction_model.dart @@ -249,3 +249,23 @@ abstract class TransactionEntity extends Object static Serializer get serializer => _$transactionEntitySerializer; } + +abstract class TransactionStatusEntity extends Object + with EntityStatus, SelectableEntity + implements Built { + factory TransactionStatusEntity() { + return _$TransactionStatusEntity._( + id: '', + name: '', + ); + } + + TransactionStatusEntity._(); + + @override + @memoized + int get hashCode; + + static Serializer get serializer => + _$transactionStatusEntitySerializer; +} diff --git a/lib/data/models/transaction_model.g.dart b/lib/data/models/transaction_model.g.dart index c8d2e5944..d917167f3 100644 --- a/lib/data/models/transaction_model.g.dart +++ b/lib/data/models/transaction_model.g.dart @@ -12,6 +12,8 @@ Serializer _$transactionItemResponseSerializer = new _$TransactionItemResponseSerializer(); Serializer _$transactionEntitySerializer = new _$TransactionEntitySerializer(); +Serializer _$transactionStatusEntitySerializer = + new _$TransactionStatusEntitySerializer(); class _$TransactionListResponseSerializer implements StructuredSerializer { @@ -270,6 +272,57 @@ class _$TransactionEntitySerializer } } +class _$TransactionStatusEntitySerializer + implements StructuredSerializer { + @override + final Iterable types = const [ + TransactionStatusEntity, + _$TransactionStatusEntity + ]; + @override + final String wireName = 'TransactionStatusEntity'; + + @override + Iterable serialize( + Serializers serializers, TransactionStatusEntity object, + {FullType specifiedType = FullType.unspecified}) { + final result = [ + 'id', + serializers.serialize(object.id, specifiedType: const FullType(String)), + 'name', + serializers.serialize(object.name, specifiedType: const FullType(String)), + ]; + + return result; + } + + @override + TransactionStatusEntity deserialize( + Serializers serializers, Iterable serialized, + {FullType specifiedType = FullType.unspecified}) { + final result = new TransactionStatusEntityBuilder(); + + final iterator = serialized.iterator; + while (iterator.moveNext()) { + final key = iterator.current as String; + iterator.moveNext(); + final Object value = iterator.current; + switch (key) { + case 'id': + result.id = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + case 'name': + result.name = serializers.deserialize(value, + specifiedType: const FullType(String)) as String; + break; + } + } + + return result.build(); + } +} + class _$TransactionListResponse extends TransactionListResponse { @override final BuiltList data; @@ -777,4 +830,101 @@ class TransactionEntityBuilder } } +class _$TransactionStatusEntity extends TransactionStatusEntity { + @override + final String id; + @override + final String name; + + factory _$TransactionStatusEntity( + [void Function(TransactionStatusEntityBuilder) updates]) => + (new TransactionStatusEntityBuilder()..update(updates)).build(); + + _$TransactionStatusEntity._({this.id, this.name}) : super._() { + BuiltValueNullFieldError.checkNotNull(id, 'TransactionStatusEntity', 'id'); + BuiltValueNullFieldError.checkNotNull( + name, 'TransactionStatusEntity', 'name'); + } + + @override + TransactionStatusEntity rebuild( + void Function(TransactionStatusEntityBuilder) updates) => + (toBuilder()..update(updates)).build(); + + @override + TransactionStatusEntityBuilder toBuilder() => + new TransactionStatusEntityBuilder()..replace(this); + + @override + bool operator ==(Object other) { + if (identical(other, this)) return true; + return other is TransactionStatusEntity && + id == other.id && + name == other.name; + } + + int __hashCode; + @override + int get hashCode { + return __hashCode ??= $jf($jc($jc(0, id.hashCode), name.hashCode)); + } + + @override + String toString() { + return (newBuiltValueToStringHelper('TransactionStatusEntity') + ..add('id', id) + ..add('name', name)) + .toString(); + } +} + +class TransactionStatusEntityBuilder + implements + Builder { + _$TransactionStatusEntity _$v; + + String _id; + String get id => _$this._id; + set id(String id) => _$this._id = id; + + String _name; + String get name => _$this._name; + set name(String name) => _$this._name = name; + + TransactionStatusEntityBuilder(); + + TransactionStatusEntityBuilder get _$this { + final $v = _$v; + if ($v != null) { + _id = $v.id; + _name = $v.name; + _$v = null; + } + return this; + } + + @override + void replace(TransactionStatusEntity other) { + ArgumentError.checkNotNull(other, 'other'); + _$v = other as _$TransactionStatusEntity; + } + + @override + void update(void Function(TransactionStatusEntityBuilder) updates) { + if (updates != null) updates(this); + } + + @override + _$TransactionStatusEntity build() { + final _$result = _$v ?? + new _$TransactionStatusEntity._( + id: BuiltValueNullFieldError.checkNotNull( + id, 'TransactionStatusEntity', 'id'), + name: BuiltValueNullFieldError.checkNotNull( + name, 'TransactionStatusEntity', 'name')); + replace(_$result); + return _$result; + } +} + // ignore_for_file: always_put_control_body_on_new_line,always_specify_types,annotate_overrides,avoid_annotating_with_dynamic,avoid_as,avoid_catches_without_on_clauses,avoid_returning_this,deprecated_member_use_from_same_package,lines_longer_than_80_chars,omit_local_variable_types,prefer_expression_function_bodies,sort_constructors_first,test_types_in_equals,unnecessary_const,unnecessary_new diff --git a/lib/redux/transaction/transaction_selectors.dart b/lib/redux/transaction/transaction_selectors.dart index 55d4264bc..74c1ca5fd 100644 --- a/lib/redux/transaction/transaction_selectors.dart +++ b/lib/redux/transaction/transaction_selectors.dart @@ -84,12 +84,18 @@ List filteredTransactionsSelector( final transaction = transactionMap[transactionId]; if (filterEntityId != null && transaction.id != filterEntityId) { return false; - } else {} + } else { + // + } if (!transaction.matchesStates(transactionListState.stateFilters)) { return false; } + if (!transaction.matchesStatuses(transactionListState.statusFilters)) { + return false; + } + return transaction.matchesFilter(transactionListState.filter); }).toList(); diff --git a/lib/ui/transaction/transaction_screen.dart b/lib/ui/transaction/transaction_screen.dart index d0883562c..d3121836e 100644 --- a/lib/ui/transaction/transaction_screen.dart +++ b/lib/ui/transaction/transaction_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; +import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; @@ -30,6 +31,24 @@ class TransactionScreen extends StatelessWidget { final userCompany = state.userCompany; final localization = AppLocalization.of(context); + final statuses = [ + TransactionStatusEntity().rebuild( + (b) => b + ..id = kTransactionStatusUnmatched + ..name = localization.unmatched, + ), + TransactionStatusEntity().rebuild( + (b) => b + ..id = kTransactionStatusMatched + ..name = localization.matched, + ), + TransactionStatusEntity().rebuild( + (b) => b + ..id = kTransactionStatusConverted + ..name = localization.converted, + ), + ]; + return ListScaffold( entityType: EntityType.transaction, onHamburgerLongPress: () => store.dispatch(StartTransactionMultiselect()), @@ -85,6 +104,7 @@ class TransactionScreen extends StatelessWidget { store.dispatch(FilterTransactionsByCustom3(value)), onSelectedCustom4: (value) => store.dispatch(FilterTransactionsByCustom4(value)), + statuses: statuses, ), floatingActionButton: state.prefState.isMenuFloated && userCompany.canCreate(EntityType.transaction) diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index b38032420..5de999853 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -16,6 +16,8 @@ mixin LocalizationsProvider on LocaleCodeAware { static final Map> _localizedValues = { 'en': { // STARTER: lang key - do not remove comment + 'matched': 'Matched', + 'unmatched': 'Unmatched', 'create_credit': 'Create Credit', 'update_credit': 'Update Credit', 'delete_credit': 'Delete Credit', @@ -87302,6 +87304,14 @@ mixin LocalizationsProvider on LocaleCodeAware { _localizedValues[localeCode]['delete_credit'] ?? _localizedValues['en']['delete_credit']; + String get matched => + _localizedValues[localeCode]['matched'] ?? + _localizedValues['en']['matched']; + + String get unmatched => + _localizedValues[localeCode]['unmatched'] ?? + _localizedValues['en']['unmatched']; + // STARTER: lang field - do not remove comment String lookup(String key) {