diff --git a/lib/data/models/models.dart b/lib/data/models/models.dart index 6997f98df..1ce8b8fd7 100644 --- a/lib/data/models/models.dart +++ b/lib/data/models/models.dart @@ -119,6 +119,7 @@ class EntityAction extends EnumClass { static const EntityAction accept = _$accept; static const EntityAction addToInventory = _$addToInventory; static const EntityAction convertToExpense = _$convertToExpense; + static const EntityAction convertToPayment = _$convertToPayment; static const EntityAction merge = _$merge; @override diff --git a/lib/data/models/models.g.dart b/lib/data/models/models.g.dart index 9dad8c9c9..ec27e501f 100644 --- a/lib/data/models/models.g.dart +++ b/lib/data/models/models.g.dart @@ -85,6 +85,8 @@ const EntityAction _$accept = const EntityAction._('accept'); const EntityAction _$addToInventory = const EntityAction._('addToInventory'); const EntityAction _$convertToExpense = const EntityAction._('convertToExpense'); +const EntityAction _$convertToPayment = + const EntityAction._('convertToPayment'); const EntityAction _$merge = const EntityAction._('merge'); EntityAction _$valueOf(String name) { @@ -227,6 +229,8 @@ EntityAction _$valueOf(String name) { return _$addToInventory; case 'convertToExpense': return _$convertToExpense; + case 'convertToPayment': + return _$convertToPayment; case 'merge': return _$merge; default: @@ -305,6 +309,7 @@ final BuiltSet _$values = _$accept, _$addToInventory, _$convertToExpense, + _$convertToPayment, _$merge, ]); diff --git a/lib/ui/transaction/view/transaction_view.dart b/lib/ui/transaction/view/transaction_view.dart index 230b1eb65..35a466eb3 100644 --- a/lib/ui/transaction/view/transaction_view.dart +++ b/lib/ui/transaction/view/transaction_view.dart @@ -1,5 +1,7 @@ import 'package:flutter/material.dart'; import 'package:invoiceninja_flutter/data/models/invoice_model.dart'; +import 'package:invoiceninja_flutter/data/models/models.dart'; +import 'package:invoiceninja_flutter/ui/app/buttons/elevated_button.dart'; import 'package:invoiceninja_flutter/ui/app/entity_header.dart'; import 'package:invoiceninja_flutter/ui/app/lists/list_divider.dart'; import 'package:invoiceninja_flutter/ui/app/search_text.dart'; @@ -7,6 +9,7 @@ import 'package:invoiceninja_flutter/ui/invoice/invoice_list_item.dart'; import 'package:invoiceninja_flutter/ui/transaction/view/transaction_view_vm.dart'; import 'package:invoiceninja_flutter/ui/app/view_scaffold.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/icons.dart'; import 'package:invoiceninja_flutter/utils/localization.dart'; class TransactionView extends StatefulWidget { @@ -136,6 +139,7 @@ class __MatchInvoicesState extends State<_MatchInvoices> { return Column( mainAxisSize: MainAxisSize.max, + crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Row( children: [ @@ -165,26 +169,45 @@ class __MatchInvoicesState extends State<_MatchInvoices> { ), ListDivider(), Expanded( - child: ListView.separated( - separatorBuilder: (context, index) => ListDivider(), - itemCount: _invoices.length, - itemBuilder: (BuildContext context, int index) { - final invoice = _invoices[index]; - return InvoiceListItem( - invoice: invoice, - showCheck: true, - isChecked: _selectedInvoices.contains(invoice), - onTap: () => setState(() { - if (_selectedInvoices.contains(invoice)) { - _selectedInvoices.remove(invoice); - } else { - _selectedInvoices.add(invoice); - } - updateInvoiceList(); - }), - ); - }, - )), + child: ListView.separated( + separatorBuilder: (context, index) => ListDivider(), + itemCount: _invoices.length, + itemBuilder: (BuildContext context, int index) { + final invoice = _invoices[index]; + return InvoiceListItem( + invoice: invoice, + showCheck: true, + isChecked: _selectedInvoices.contains(invoice), + onTap: () => setState(() { + if (_selectedInvoices.contains(invoice)) { + _selectedInvoices.remove(invoice); + } else { + _selectedInvoices.add(invoice); + } + updateInvoiceList(); + }), + ); + }, + ), + ), + ListDivider(), + Padding( + padding: const EdgeInsets.only( + left: 20, + bottom: 20, + right: 20, + top: 4, + ), + child: AppButton( + label: localization.convertToPayment, + onPressed: _selectedInvoices.length == 0 + ? null + : () { +// + }, + iconData: getEntityActionIcon(EntityAction.convertToExpense), + ), + ) ], ); } diff --git a/lib/utils/i18n.dart b/lib/utils/i18n.dart index 411fac44b..e532da582 100644 --- a/lib/utils/i18n.dart +++ b/lib/utils/i18n.dart @@ -16,6 +16,7 @@ mixin LocalizationsProvider on LocaleCodeAware { static final Map> _localizedValues = { 'en': { // STARTER: lang key - do not remove comment + 'convert_to_payment': 'Convert to Payment', 'deposit': 'Deposit', 'withdrawal': 'Withdrawal', 'deposits': 'Deposits', @@ -87332,6 +87333,10 @@ mixin LocalizationsProvider on LocaleCodeAware { _localizedValues[localeCode]['withdrawals'] ?? _localizedValues['en']['withdrawals']; + String get convertToPayment => + _localizedValues[localeCode]['convert_to_payment'] ?? + _localizedValues['en']['convert_to_payment']; + // STARTER: lang field - do not remove comment String lookup(String key) { diff --git a/lib/utils/icons.dart b/lib/utils/icons.dart index 165996e3b..fe69d4614 100644 --- a/lib/utils/icons.dart +++ b/lib/utils/icons.dart @@ -54,6 +54,7 @@ IconData getEntityActionIcon(EntityAction entityAction) { case EntityAction.convertToInvoice: case EntityAction.convertToExpense: case EntityAction.convertToProject: + case EntityAction.convertToPayment: return Icons.content_copy; case EntityAction.approve: case EntityAction.accept: