diff --git a/lib/ui/invoice/invoice_list_item.dart b/lib/ui/invoice/invoice_list_item.dart index 18f979fd3..2c0ae1046 100644 --- a/lib/ui/invoice/invoice_list_item.dart +++ b/lib/ui/invoice/invoice_list_item.dart @@ -23,11 +23,15 @@ class InvoiceListItem extends StatelessWidget { @required this.invoice, this.filter, this.showCheckbox = true, + this.forceCheckbox = false, + this.forceChecked = false, }); final InvoiceEntity invoice; final String filter; final bool showCheckbox; + final bool forceCheckbox; + final bool forceChecked; @override Widget build(BuildContext context) { @@ -37,8 +41,11 @@ class InvoiceListItem extends StatelessWidget { final uiState = state.uiState; final invoiceUIState = uiState.invoiceUIState; final listUIState = state.getUIState(invoice.entityType).listUIState; - final isInMultiselect = showCheckbox && listUIState.isInMultiselect(); - final isChecked = isInMultiselect && listUIState.isSelected(invoice.id); + final isInMultiselect = + forceCheckbox || (showCheckbox && listUIState.isInMultiselect()); + final isChecked = forceCheckbox + ? forceChecked + : isInMultiselect && listUIState.isSelected(invoice.id); final textStyle = TextStyle(fontSize: 16); final localization = AppLocalization.of(context); final filterMatch = filter != null && filter.isNotEmpty @@ -69,11 +76,13 @@ class InvoiceListItem extends StatelessWidget { } return DismissibleEntity( - isSelected: isDesktop(context) && - invoice.id == - (uiState.isEditing - ? invoiceUIState.editing.id - : invoiceUIState.selectedId), + isSelected: forceCheckbox + ? forceChecked + : isDesktop(context) && + invoice.id == + (uiState.isEditing + ? invoiceUIState.editing.id + : invoiceUIState.selectedId), showCheckbox: showCheckbox, userCompany: state.userCompany, entity: invoice, diff --git a/lib/ui/transaction/view/transaction_view.dart b/lib/ui/transaction/view/transaction_view.dart index 1c1ab53bb..dc1a5aeda 100644 --- a/lib/ui/transaction/view/transaction_view.dart +++ b/lib/ui/transaction/view/transaction_view.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:invoiceninja_flutter/data/models/invoice_model.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'; +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'; @@ -53,7 +55,10 @@ class _TransactionViewState extends State { ), ), ListDivider(), - Expanded(child: _MatchInvoices()), + Expanded( + child: _MatchInvoices( + viewModel: viewModel, + )), ], ), ); @@ -61,7 +66,12 @@ class _TransactionViewState extends State { } class _MatchInvoices extends StatefulWidget { - const _MatchInvoices({Key key}) : super(key: key); + const _MatchInvoices({ + Key key, + @required this.viewModel, + }) : super(key: key); + + final TransactionViewVM viewModel; @override State<_MatchInvoices> createState() => __MatchInvoicesState(); @@ -70,12 +80,23 @@ class _MatchInvoices extends StatefulWidget { class __MatchInvoicesState extends State<_MatchInvoices> { TextEditingController _filterController; FocusNode _focusNode; + List _invoices; + String _filter; @override void initState() { super.initState(); _filterController = TextEditingController(); _focusNode = FocusNode(); + + updateInvoiceList(); + } + + void updateInvoiceList() { + final invoiceState = widget.viewModel.state.invoiceState; + _invoices = invoiceState.map.values.toList(); + _invoices + .sort((invoiceA, invoiceB) => invoiceB.date.compareTo(invoiceA.date)); } @override @@ -111,9 +132,15 @@ class __MatchInvoicesState extends State<_MatchInvoices> { ), ListDivider(), Expanded( - child: ListView.builder( - itemCount: 1, - itemBuilder: (BuildContext context, int index) => SizedBox(), + child: ListView.separated( + separatorBuilder: (context, index) => ListDivider(), + itemCount: _invoices.length, + itemBuilder: (BuildContext context, int index) { + return InvoiceListItem( + invoice: _invoices[index], + forceCheckbox: true, + ); + }, )), ], );