diff --git a/lib/data/models/client_model.dart b/lib/data/models/client_model.dart index 433be0f9b..3b0cb63f6 100644 --- a/lib/data/models/client_model.dart +++ b/lib/data/models/client_model.dart @@ -535,41 +535,29 @@ abstract class ClientEntity extends Object @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; + for (var i = 0; i < contacts.length; i++) { + final value = contacts[i].matchesFilterValue(filter); + if (value != null) { + return value; + } } - filter = filter.toLowerCase(); - final contact = contacts.firstWhere( - (contact) => contact.matchesFilter(filter), - orElse: () => null); - - if (vatNumber.toLowerCase().contains(filter)) { - return vatNumber; - } else if (idNumber.toLowerCase().contains(filter)) { - return idNumber; - } else if (phone.toLowerCase().contains(filter)) { - return phone; - } else if (address1.toLowerCase().contains(filter)) { - return address1; - } else if (city.toLowerCase().contains(filter)) { - return city; - } else if (postalCode.toLowerCase().contains(filter)) { - return postalCode; - } else if (contact != null) { - final match = contact.matchesFilterValue(filter); - return match == displayName ? null : match; - } else if (customValue1.toLowerCase().contains(filter)) { - return customValue1; - } else if (customValue2.toLowerCase().contains(filter)) { - return customValue2; - } else if (customValue3.toLowerCase().contains(filter)) { - return customValue3; - } else if (customValue4.toLowerCase().contains(filter)) { - return customValue4; - } - - return null; + return matchesStringsValue( + haystacks: [ + displayName, + vatNumber, + idNumber, + phone, + address1, + city, + postalCode, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override diff --git a/lib/data/models/company_gateway_model.dart b/lib/data/models/company_gateway_model.dart index 7aaf148f4..10991dbbf 100644 --- a/lib/data/models/company_gateway_model.dart +++ b/lib/data/models/company_gateway_model.dart @@ -8,6 +8,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'company_gateway_model.g.dart'; @@ -163,25 +164,30 @@ abstract class CompanyGatewayEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - filter = filter.toLowerCase(); - - if (gateway.name.toLowerCase().contains(filter)) { - return true; - } - - return false; + return matchesStrings( + haystacks: [ + gateway.name, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } - - return null; + return matchesStringsValue( + haystacks: [ + gateway.name, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override diff --git a/lib/data/models/company_model.dart b/lib/data/models/company_model.dart index ccc9b6b7a..dc00acf23 100644 --- a/lib/data/models/company_model.dart +++ b/lib/data/models/company_model.dart @@ -13,6 +13,7 @@ import 'package:invoiceninja_flutter/data/models/payment_term_model.dart'; import 'package:invoiceninja_flutter/data/models/task_model.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; import 'package:invoiceninja_flutter/.env.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'company_model.g.dart'; @@ -259,10 +260,64 @@ abstract class CompanyEntity extends Object String get displayName => settings.name ?? ''; @override - bool matchesFilter(String filter) => false; + bool matchesFilter(String filter) { + for (final user in users) { + if (user.matchesFilter(filter)) { + return true; + } + } + for (final project in projects) { + if (project.matchesFilter(filter)) { + return true; + } + } + for (final product in products) { + if (product.matchesFilter(filter)) { + return true; + } + } + + return matchesStrings( + haystacks: [ + subdomain, + displayName, + companyKey + ], + needle: filter, + ); + } @override - String matchesFilterValue(String filter) => null; + String matchesFilterValue(String filter) { + + for (final user in users) { + final value = user.matchesFilterValue(filter); + if (value != null) { + return value; + } + } + for (final project in projects) { + final value = project.matchesFilterValue(filter); + if (value != null) { + return value; + } + } + for (final product in products) { + final value = product.matchesFilterValue(filter); + if (value != null) { + return value; + } + } + + return matchesStringsValue( + haystacks: [ + subdomain, + displayName, + companyKey + ], + needle: filter, + ); + } @override double get listDisplayAmount => null; diff --git a/lib/data/models/design_model.dart b/lib/data/models/design_model.dart index 57e770bce..8a001a9b7 100644 --- a/lib/data/models/design_model.dart +++ b/lib/data/models/design_model.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'design_model.g.dart'; @@ -174,28 +175,22 @@ abstract class DesignEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - - filter = filter.toLowerCase(); - - if (name.toLowerCase().contains(filter)) { - return true; - } - - return false; + return matchesStrings( + haystacks: [ + name + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } - - filter = filter.toLowerCase(); - - return null; + return matchesStringsValue( + haystacks: [ + name + ], + needle: filter, + ); } @override diff --git a/lib/data/models/document_model.dart b/lib/data/models/document_model.dart index d74ad14eb..91b47aeaf 100644 --- a/lib/data/models/document_model.dart +++ b/lib/data/models/document_model.dart @@ -4,6 +4,7 @@ import 'package:built_value/serializer.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'document_model.g.dart'; @@ -154,48 +155,26 @@ abstract class DocumentEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - - filter = filter.toLowerCase(); - /* - if (documentKey.toLowerCase().contains(filter)) { - return true; - } else if (notes.toLowerCase().contains(filter)) { - return true; - } else if (customValue1.isNotEmpty && - customValue1.toLowerCase().contains(filter)) { - return true; - } else if (customValue2.isNotEmpty && - customValue2.toLowerCase().contains(filter)) { - return true; - } - */ - return true; + return matchesStrings( + haystacks: [ + name, + type, + preview, + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } - - filter = filter.toLowerCase(); - - /* - if (notes.toLowerCase().contains(filter)) { - return notes; - } else if (customValue1.isNotEmpty && - customValue1.toLowerCase().contains(filter)) { - return customValue1; - } else if (customValue2.isNotEmpty && - customValue2.toLowerCase().contains(filter)) { - return customValue2; - } - */ - - return null; + return matchesStringsValue( + haystacks: [ + name, + type, + preview, + ], + needle: filter, + ); } @override diff --git a/lib/data/models/expense_model.dart b/lib/data/models/expense_model.dart index 7eb4ab263..02072edeb 100644 --- a/lib/data/models/expense_model.dart +++ b/lib/data/models/expense_model.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'expense_model.g.dart'; @@ -357,70 +358,40 @@ abstract class ExpenseEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - - filter = filter.toLowerCase(); - - if (publicNotes.toLowerCase().contains(filter)) { - return true; - } else if (privateNotes.toLowerCase().contains(filter)) { - return true; - } else if (customValue1.isNotEmpty && - customValue1.toLowerCase().contains(filter)) { - return true; - } else if (customValue2.isNotEmpty && - customValue2.toLowerCase().contains(filter)) { - return true; - } else if (customValue3.isNotEmpty && - customValue3.toLowerCase().contains(filter)) { - return true; - } else if (customValue4.isNotEmpty && - customValue4.toLowerCase().contains(filter)) { - return true; - } - - if (transactionReference.toLowerCase().contains(filter)) { - return true; - } - - return false; + return matchesStrings( + haystacks: [ + publicNotes, + privateNotes, + transactionReference, + taxName1, + taxName2, + taxName3, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } - - filter = filter.toLowerCase(); - - if (privateNotes.toLowerCase().contains(filter)) { - return privateNotes; - } - - if (publicNotes.toLowerCase().contains(filter)) { - return publicNotes; - } else if (publicNotes.toLowerCase().contains(filter)) { - return transactionReference; - } else if (transactionReference.toLowerCase().contains(filter)) { - return transactionReference; - } else if (customValue1.isNotEmpty && - customValue1.toLowerCase().contains(filter)) { - return customValue1; - } else if (customValue2.isNotEmpty && - customValue2.toLowerCase().contains(filter)) { - return customValue2; - } else if (customValue3.isNotEmpty && - customValue3.toLowerCase().contains(filter)) { - return customValue3; - } else if (customValue4.isNotEmpty && - customValue4.toLowerCase().contains(filter)) { - return customValue4; - } - - return null; + return matchesStringsValue( + haystacks: [ + publicNotes, + privateNotes, + transactionReference, + taxName1, + taxName2, + taxName3, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override diff --git a/lib/data/models/gateway_token_model.dart b/lib/data/models/gateway_token_model.dart index 38209460e..cb409016d 100644 --- a/lib/data/models/gateway_token_model.dart +++ b/lib/data/models/gateway_token_model.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/data/models/company_model.dart'; import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'gateway_token_model.g.dart'; @@ -121,25 +122,22 @@ abstract class GatewayTokenEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - filter = filter.toLowerCase(); - - if (customerReference.toLowerCase().contains(filter)) { - return true; - } - - return false; + return matchesStrings( + haystacks: [ + customerReference + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } - - return null; + return matchesStringsValue( + haystacks: [ + customerReference + ], + needle: filter, + ); } @override diff --git a/lib/data/models/group_model.dart b/lib/data/models/group_model.dart index 03345a2ff..97758f4b7 100644 --- a/lib/data/models/group_model.dart +++ b/lib/data/models/group_model.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'group_model.g.dart'; @@ -117,25 +118,22 @@ abstract class GroupEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - filter = filter.toLowerCase(); - - if (name.toLowerCase().contains(filter)) { - return true; - } - - return false; + return matchesStrings( + haystacks: [ + name, + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } - - return null; + return matchesStringsValue( + haystacks: [ + name, + ], + needle: filter, + ); } @override diff --git a/lib/data/models/invoice_model.dart b/lib/data/models/invoice_model.dart index 033e4457b..be248e812 100644 --- a/lib/data/models/invoice_model.dart +++ b/lib/data/models/invoice_model.dart @@ -10,6 +10,7 @@ import 'package:invoiceninja_flutter/data/models/quote_model.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/static/static_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'invoice_model.g.dart'; @@ -534,52 +535,36 @@ abstract class InvoiceEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - - filter = filter.toLowerCase(); - - if (number != null && number.toLowerCase().contains(filter)) { - return true; - } else if (customValue1.isNotEmpty && - customValue1.toLowerCase().contains(filter)) { - return true; - } else if (customValue2.isNotEmpty && - customValue2.toLowerCase().contains(filter)) { - return true; - } else if (customValue3.isNotEmpty && - customValue3.toLowerCase().contains(filter)) { - return true; - } else if (customValue4.isNotEmpty && - customValue4.toLowerCase().contains(filter)) { - return true; - } - - return false; + return matchesStrings( + haystacks: [ + number, + poNumber, + publicNotes, + privateNotes, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } - - filter = filter.toLowerCase(); - if (customValue1.isNotEmpty && - customValue1.toLowerCase().contains(filter)) { - return customValue1; - } else if (customValue2.isNotEmpty && - customValue2.toLowerCase().contains(filter)) { - return customValue2; - } else if (customValue3.isNotEmpty && - customValue3.toLowerCase().contains(filter)) { - return customValue3; - } else if (customValue4.isNotEmpty && - customValue4.toLowerCase().contains(filter)) { - return customValue4; - } - return null; + return matchesStringsValue( + haystacks: [ + number, + poNumber, + publicNotes, + privateNotes, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override diff --git a/lib/data/models/payment_model.dart b/lib/data/models/payment_model.dart index f6dc6b23d..5d1148544 100644 --- a/lib/data/models/payment_model.dart +++ b/lib/data/models/payment_model.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'payment_model.g.dart'; @@ -304,66 +305,32 @@ abstract class PaymentEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - - filter = filter.toLowerCase(); - - if (transactionReference.toLowerCase().contains(filter)) { - return true; - } else if (privateNotes.toLowerCase().contains(filter)) { - return true; - } else if (customValue1.isNotEmpty && - customValue1.toLowerCase().contains(filter)) { - return true; - } else if (customValue2.isNotEmpty && - customValue2.toLowerCase().contains(filter)) { - return true; - } else if (customValue3.isNotEmpty && - customValue3.toLowerCase().contains(filter)) { - return true; - } else if (customValue4.isNotEmpty && - customValue4.toLowerCase().contains(filter)) { - return true; - } - /* - } else if (customValue1.isNotEmpty && - customValue2.toLowerCase().contains(filter)) { - return customValue2; - } - */ - - return false; + return matchesStrings( + haystacks: [ + transactionReference, + privateNotes, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } - - filter = filter.toLowerCase(); - - if (transactionReference.toLowerCase().contains(filter)) { - return transactionReference; - } else if (privateNotes.toLowerCase().contains(filter)) { - return privateNotes; - } else if (customValue1.isNotEmpty && - customValue1.toLowerCase().contains(filter)) { - return customValue1; - } else if (customValue2.isNotEmpty && - customValue2.toLowerCase().contains(filter)) { - return customValue2; - } else if (customValue3.isNotEmpty && - customValue3.toLowerCase().contains(filter)) { - return customValue3; - } else if (customValue4.isNotEmpty && - customValue4.toLowerCase().contains(filter)) { - return customValue4; - } - - return null; + return matchesStringsValue( + haystacks: [ + transactionReference, + privateNotes, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override diff --git a/lib/data/models/product_model.dart b/lib/data/models/product_model.dart index c3a74911b..8352a9872 100644 --- a/lib/data/models/product_model.dart +++ b/lib/data/models/product_model.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'product_model.g.dart'; @@ -267,56 +268,32 @@ abstract class ProductEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - - filter = filter.toLowerCase(); - - if (productKey.toLowerCase().contains(filter)) { - return true; - } else if (notes.toLowerCase().contains(filter)) { - return true; - } else if (customValue1.isNotEmpty && - customValue1.toLowerCase().contains(filter)) { - return true; - } else if (customValue2.isNotEmpty && - customValue2.toLowerCase().contains(filter)) { - return true; - } else if (customValue3.isNotEmpty && - customValue3.toLowerCase().contains(filter)) { - return true; - } else if (customValue4.isNotEmpty && - customValue4.toLowerCase().contains(filter)) { - return true; - } - - return false; + return matchesStrings( + haystacks: [ + productKey, + notes, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } - - filter = filter.toLowerCase(); - if (notes.toLowerCase().contains(filter)) { - return notes; - } else if (customValue1.isNotEmpty && - customValue1.toLowerCase().contains(filter)) { - return customValue1; - } else if (customValue2.isNotEmpty && - customValue2.toLowerCase().contains(filter)) { - return customValue2; - } else if (customValue3.isNotEmpty && - customValue3.toLowerCase().contains(filter)) { - return customValue1; - } else if (customValue3.isNotEmpty && - customValue3.toLowerCase().contains(filter)) { - return customValue2; - } - return null; + return matchesStringsValue( + haystacks: [ + productKey, + notes, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override diff --git a/lib/data/models/project_model.dart b/lib/data/models/project_model.dart index 31466494e..6021d6b21 100644 --- a/lib/data/models/project_model.dart +++ b/lib/data/models/project_model.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'project_model.g.dart'; @@ -239,36 +240,30 @@ abstract class ProjectEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } else if (customValue1.toLowerCase().contains(filter)) { - return true; - } else if (customValue2.toLowerCase().contains(filter)) { - return true; - } else if (customValue3.toLowerCase().contains(filter)) { - return true; - } else if (customValue4.toLowerCase().contains(filter)) { - return true; - } - - return name.toLowerCase().contains(filter); + return matchesStrings( + haystacks: [ + name, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } else if (customValue1.toLowerCase().contains(filter)) { - return customValue1; - } else if (customValue2.toLowerCase().contains(filter)) { - return customValue2; - } else if (customValue3.toLowerCase().contains(filter)) { - return customValue3; - } else if (customValue4.toLowerCase().contains(filter)) { - return customValue4; - } - - return null; + return matchesStringsValue( + haystacks: [ + name, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override diff --git a/lib/data/models/task_model.dart b/lib/data/models/task_model.dart index 91ecf5171..94bee320c 100644 --- a/lib/data/models/task_model.dart +++ b/lib/data/models/task_model.dart @@ -9,6 +9,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'task_model.g.dart'; @@ -522,23 +523,16 @@ abstract class TaskEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - - filter = filter.toLowerCase(); - - if (customValue1.toLowerCase().contains(filter)) { - return true; - } else if (customValue2.toLowerCase().contains(filter)) { - return true; - } else if (customValue3.toLowerCase().contains(filter)) { - return true; - } else if (customValue4.toLowerCase().contains(filter)) { - return true; - } - - return description.toLowerCase().contains(filter); + return matchesStrings( + haystacks: [ + description, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override @@ -562,19 +556,16 @@ abstract class TaskEntity extends Object @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } else if (customValue1.toLowerCase().contains(filter)) { - return customValue1; - } else if (customValue2.toLowerCase().contains(filter)) { - return customValue2; - } else if (customValue3.toLowerCase().contains(filter)) { - return customValue3; - } else if (customValue4.toLowerCase().contains(filter)) { - return customValue4; - } - - return null; + return matchesStringsValue( + haystacks: [ + description, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override diff --git a/lib/data/models/tax_rate_model.dart b/lib/data/models/tax_rate_model.dart index 23a95d2e1..2336a281e 100644 --- a/lib/data/models/tax_rate_model.dart +++ b/lib/data/models/tax_rate_model.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'tax_rate_model.g.dart'; @@ -114,25 +115,22 @@ abstract class TaxRateEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - filter = filter.toLowerCase(); - - if (name.toLowerCase().contains(filter)) { - return true; - } - - return false; + return matchesStrings( + haystacks: [ + name + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } - - return null; + return matchesStringsValue( + haystacks: [ + name + ], + needle: filter, + ); } @override diff --git a/lib/data/models/token_model.dart b/lib/data/models/token_model.dart index dbd7faee5..6b8fcc06c 100644 --- a/lib/data/models/token_model.dart +++ b/lib/data/models/token_model.dart @@ -8,6 +8,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'token_model.g.dart'; @@ -125,25 +126,22 @@ abstract class TokenEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - filter = filter.toLowerCase(); - - if (name.toLowerCase().contains(filter)) { - return true; - } - - return false; + return matchesStrings( + haystacks: [ + name, + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } - - return null; + return matchesStringsValue( + haystacks: [ + name, + ], + needle: filter, + ); } @override diff --git a/lib/data/models/user_model.dart b/lib/data/models/user_model.dart index 6cdc90bd1..f2f3c95df 100644 --- a/lib/data/models/user_model.dart +++ b/lib/data/models/user_model.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'user_model.g.dart'; @@ -181,39 +182,36 @@ abstract class UserEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - filter = filter.toLowerCase(); - - if (firstName.toLowerCase().contains(filter)) { - return true; - } else if (lastName.toLowerCase().contains(filter)) { - return true; - } else if (phone.toLowerCase().contains(filter)) { - return true; - } else if (email.toLowerCase().contains(filter)) { - return true; - } - - return false; + return matchesStrings( + haystacks: [ + firstName, + lastName, + email, + phone, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } - - filter = filter.toLowerCase(); - - if (email.toLowerCase().contains(filter)) { - return email; - } else if (phone.toLowerCase().contains(filter)) { - return phone; - } - - return null; + return matchesStringsValue( + haystacks: [ + firstName, + lastName, + email, + phone, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override diff --git a/lib/data/models/vendor_model.dart b/lib/data/models/vendor_model.dart index 5ac1bdf9d..1c4eb1009 100644 --- a/lib/data/models/vendor_model.dart +++ b/lib/data/models/vendor_model.dart @@ -5,6 +5,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'vendor_model.g.dart'; @@ -255,76 +256,55 @@ abstract class VendorEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; + for(final contact in contacts) { + if (contact.matchesFilter(filter)) { + return true; + } } - filter = filter.toLowerCase(); - - if (name.toLowerCase().contains(filter)) { - return true; - } else if (vatNumber.toLowerCase().contains(filter)) { - return true; - } else if (idNumber.toLowerCase().contains(filter)) { - return true; - } else if (phone.toLowerCase().contains(filter)) { - return true; - } else if (address1.toLowerCase().contains(filter)) { - return true; - } else if (city.toLowerCase().contains(filter)) { - return true; - } else if (contacts - .where((contact) => contact.matchesFilter(filter)) - .isNotEmpty) { - return true; - } else if (customValue1.toLowerCase().contains(filter)) { - return true; - } else if (customValue2.toLowerCase().contains(filter)) { - return true; - } else if (customValue3.toLowerCase().contains(filter)) { - return true; - } else if (customValue4.toLowerCase().contains(filter)) { - return true; - } - - return false; + return matchesStrings( + haystacks: [ + name, + vatNumber, + idNumber, + phone, + address1, + city, + postalCode, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; + for(final contact in contacts) { + final value = contact.matchesFilterValue(filter); + if (value != null) { + return value; + } } - filter = filter.toLowerCase(); - final contact = contacts.firstWhere( - (contact) => contact.matchesFilter(filter), - orElse: () => null); - - if (vatNumber.toLowerCase().contains(filter)) { - return vatNumber; - } else if (idNumber.toLowerCase().contains(filter)) { - return idNumber; - } else if (phone.toLowerCase().contains(filter)) { - return phone; - } else if (address1.toLowerCase().contains(filter)) { - return address1; - } else if (city.toLowerCase().contains(filter)) { - return city; - } else if (contact != null) { - final match = contact.matchesFilterValue(filter); - return match == name ? null : match; - } else if (customValue1.toLowerCase().contains(filter)) { - return customValue1; - } else if (customValue2.toLowerCase().contains(filter)) { - return customValue2; - } else if (customValue3.toLowerCase().contains(filter)) { - return customValue3; - } else if (customValue4.toLowerCase().contains(filter)) { - return customValue4; - } - - return null; + return matchesStringsValue( + haystacks: [ + name, + vatNumber, + idNumber, + phone, + address1, + city, + postalCode, + customValue1, + customValue2, + customValue3, + customValue4, + ], + needle: filter, + ); } @override diff --git a/lib/data/models/webhook_model.dart b/lib/data/models/webhook_model.dart index 9fab9027e..ebe39d706 100644 --- a/lib/data/models/webhook_model.dart +++ b/lib/data/models/webhook_model.dart @@ -6,6 +6,7 @@ import 'package:invoiceninja_flutter/data/models/entities.dart'; import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/utils/formatting.dart'; +import 'package:invoiceninja_flutter/utils/strings.dart'; part 'webhook_model.g.dart'; @@ -186,25 +187,22 @@ abstract class WebhookEntity extends Object @override bool matchesFilter(String filter) { - if (filter == null || filter.isEmpty) { - return true; - } - filter = filter.toLowerCase(); - - if (targetUrl.toLowerCase().contains(filter)) { - return true; - } - - return false; + return matchesStrings( + haystacks: [ + targetUrl, + ], + needle: filter, + ); } @override String matchesFilterValue(String filter) { - if (filter == null || filter.isEmpty) { - return null; - } - - return null; + return matchesStringsValue( + haystacks: [ + targetUrl, + ], + needle: filter, + ); } @override diff --git a/lib/utils/strings.dart b/lib/utils/strings.dart index b98d5b323..472b26e93 100644 --- a/lib/utils/strings.dart +++ b/lib/utils/strings.dart @@ -104,3 +104,42 @@ bool matchesString({String haystack, String needle}) { }); return RegExp(regExp).hasMatch(haystack.toLowerCase()); } + +String matchesStringsValue({ + List haystacks, + String needle, +}) { + if (needle == null || needle.isEmpty) { + return null; + } + + String match; + haystacks.forEach((haystack) { + final value = matchesStringValue( + haystack: haystack, + needle: needle, + ); + if (value != null) { + match = value; + } + }); + return match; +} + +String matchesStringValue({String haystack, String needle}) { + if (needle == null || needle.isEmpty) { + return null; + } + + String regExp = ''; + needle.toLowerCase().runes.forEach((int rune) { + final character = String.fromCharCode(rune); + regExp += character + '.*?'; + }); + + if(RegExp(regExp).hasMatch(haystack.toLowerCase())) { + return haystack; + } else { + return null; + } +}