97 lines
2.8 KiB
Dart
97 lines
2.8 KiB
Dart
import 'package:memoize/memoize.dart';
|
|
import 'package:built_collection/built_collection.dart';
|
|
import 'package:invoiceninja_flutter/data/models/models.dart';
|
|
import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart';
|
|
|
|
ClientEntity quoteClientSelector(
|
|
InvoiceEntity quote, BuiltMap<int, ClientEntity> clientMap) {
|
|
return clientMap[quote.clientId];
|
|
}
|
|
|
|
var memoizedFilteredQuoteList = memo4((BuiltMap<int, InvoiceEntity> quoteMap,
|
|
BuiltList<int> quoteList,
|
|
BuiltMap<int, ClientEntity> clientMap,
|
|
ListUIState quoteListState) =>
|
|
filteredQuotesSelector(quoteMap, quoteList, clientMap, quoteListState));
|
|
|
|
List<int> filteredQuotesSelector(
|
|
BuiltMap<int, InvoiceEntity> quoteMap,
|
|
BuiltList<int> quoteList,
|
|
BuiltMap<int, ClientEntity> clientMap,
|
|
ListUIState quoteListState) {
|
|
final list = quoteList.where((quoteId) {
|
|
final quote = quoteMap[quoteId];
|
|
final client =
|
|
clientMap[quote.clientId] ?? ClientEntity(id: quote.clientId);
|
|
|
|
if (quoteListState.filterEntityId != null) {
|
|
if (!quoteListState.entityMatchesFilter(client)) {
|
|
return false;
|
|
}
|
|
} else if (!client.isActive) {
|
|
return false;
|
|
}
|
|
|
|
if (!quote.matchesStates(quoteListState.stateFilters)) {
|
|
return false;
|
|
}
|
|
if (!quote.matchesStatuses(quoteListState.statusFilters)) {
|
|
return false;
|
|
}
|
|
if (!quote.matchesFilter(quoteListState.filter) &&
|
|
!client.matchesFilter(quoteListState.filter)) {
|
|
return false;
|
|
}
|
|
if (quoteListState.custom1Filters.isNotEmpty &&
|
|
!quoteListState.custom1Filters.contains(quote.customTextValue1)) {
|
|
return false;
|
|
}
|
|
if (quoteListState.custom2Filters.isNotEmpty &&
|
|
!quoteListState.custom2Filters.contains(quote.customTextValue2)) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}).toList();
|
|
|
|
list.sort((quoteAId, quoteBId) {
|
|
return quoteMap[quoteAId].compareTo(quoteMap[quoteBId],
|
|
quoteListState.sortField, quoteListState.sortAscending);
|
|
});
|
|
|
|
return list;
|
|
}
|
|
|
|
var memoizedQuoteStatsForClient = memo4((int clientId,
|
|
BuiltMap<int, InvoiceEntity> quoteMap,
|
|
String activeLabel,
|
|
String archivedLabel) =>
|
|
quoteStatsForClient(clientId, quoteMap, activeLabel, archivedLabel));
|
|
|
|
String quoteStatsForClient(int clientId, BuiltMap<int, InvoiceEntity> quoteMap,
|
|
String activeLabel, String archivedLabel) {
|
|
int countActive = 0;
|
|
int countArchived = 0;
|
|
quoteMap.forEach((quoteId, quote) {
|
|
if (quote.clientId == clientId) {
|
|
if (quote.isActive) {
|
|
countActive++;
|
|
} else if (quote.isArchived) {
|
|
countArchived++;
|
|
}
|
|
}
|
|
});
|
|
|
|
String str = '';
|
|
if (countActive > 0) {
|
|
str = '$countActive $activeLabel';
|
|
if (countArchived > 0) {
|
|
str += ' • ';
|
|
}
|
|
}
|
|
if (countArchived > 0) {
|
|
str += '$countArchived $archivedLabel';
|
|
}
|
|
|
|
return str;
|
|
}
|