// Package imports: import 'package:built_collection/built_collection.dart'; import 'package:memoize/memoize.dart'; // Project imports: import 'package:invoiceninja_flutter/data/models/models.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; ClientContactEntity creditContactSelector( InvoiceEntity credit, ClientEntity client) { var contactIds = credit.invitations .map((invitation) => invitation.clientContactId) .toList(); if (contactIds.contains(client.primaryContact.id)) { contactIds = [client.primaryContact.id]; } return client.contacts .firstWhere((contact) => contactIds.contains(contact.id), orElse: null); } var memoizedDropdownCreditList = memo7( (BuiltMap creditMap, BuiltMap clientMap, BuiltMap vendorMap, BuiltList creditList, String clientId, BuiltMap userMap, List excludedIds) => dropdownCreditSelector( creditMap, clientMap, vendorMap, creditList, clientId, userMap, excludedIds, )); List dropdownCreditSelector( BuiltMap creditMap, BuiltMap clientMap, BuiltMap vendorMap, BuiltList creditList, String clientId, BuiltMap userMap, List excludedIds) { final list = creditList.where((creditId) { final credit = creditMap[creditId]; if (excludedIds.contains(creditId)) { return false; } if (clientId != null && clientId.isNotEmpty && credit.clientId != clientId) { return false; } if (!clientMap.containsKey(credit.clientId) || !clientMap[credit.clientId].isActive) { return false; } if (credit.balanceOrAmount == 0) { return false; } return credit.isActive && credit.isUnpaid; }).toList(); list.sort((creditAId, creditBId) { final creditA = creditMap[creditAId]; final creditB = creditMap[creditBId]; return creditA.compareTo( invoice: creditB, clientMap: clientMap, vendorMap: vendorMap, sortAscending: true, sortField: CreditFields.number, userMap: userMap); }); return list; } ClientEntity creditClientSelector( InvoiceEntity credit, BuiltMap clientMap) { return clientMap[credit.clientId]; } var memoizedFilteredCreditList = memo7((SelectionState selectionState, BuiltMap creditMap, BuiltList creditList, BuiltMap clientMap, BuiltMap vendorMap, ListUIState creditListState, BuiltMap userMap) => filteredCreditsSelector(selectionState, creditMap, creditList, clientMap, vendorMap, creditListState, userMap)); List filteredCreditsSelector( SelectionState selectionState, BuiltMap creditMap, BuiltList creditList, BuiltMap clientMap, BuiltMap vendorMap, ListUIState creditListState, BuiltMap userMap) { final filterEntityId = selectionState.filterEntityId; final filterEntityType = selectionState.filterEntityType; final list = creditList.where((creditId) { final credit = creditMap[creditId]; final client = clientMap[credit.clientId] ?? ClientEntity(id: credit.clientId); if (credit.id == selectionState.selectedId) { return true; } if (!client.isActive && !client.matchesEntityFilter(filterEntityType, filterEntityId)) { return false; } if (filterEntityType == EntityType.client && client.id != filterEntityId) { return false; } else if (filterEntityType == EntityType.user && credit.assignedUserId != filterEntityId) { return false; } else if (filterEntityType == EntityType.design && credit.designId != filterEntityId) { return false; } else if (filterEntityType == EntityType.group && client.groupId != filterEntityId) { return false; } if (!credit.matchesStates(creditListState.stateFilters)) { return false; } if (!credit.matchesStatuses(creditListState.statusFilters)) { return false; } if (!credit.matchesFilter(creditListState.filter) && !client.matchesNameOrEmail(creditListState.filter)) { return false; } if (creditListState.custom1Filters.isNotEmpty && !creditListState.custom1Filters.contains(credit.customValue1)) { return false; } else if (creditListState.custom2Filters.isNotEmpty && !creditListState.custom2Filters.contains(credit.customValue2)) { return false; } else if (creditListState.custom3Filters.isNotEmpty && !creditListState.custom3Filters.contains(credit.customValue3)) { return false; } else if (creditListState.custom4Filters.isNotEmpty && !creditListState.custom4Filters.contains(credit.customValue4)) { return false; } return true; }).toList(); list.sort((creditAId, creditBId) { return creditMap[creditAId].compareTo( invoice: creditMap[creditBId], sortField: creditListState.sortField, sortAscending: creditListState.sortAscending, clientMap: clientMap, vendorMap: vendorMap, userMap: userMap); }); return list; } var memoizedCreditStatsForDesign = memo2( (String designId, BuiltMap creditMap) => creditStatsForDesign(designId, creditMap)); EntityStats creditStatsForDesign( String designId, BuiltMap creditMap) { int countActive = 0; int countArchived = 0; creditMap.forEach((creditId, credit) { if (credit.designId == designId) { if (credit.isActive) { countActive++; } else if (credit.isArchived) { countArchived++; } } }); return EntityStats(countActive: countActive, countArchived: countArchived); } var memoizedCreditStatsForClient = memo2( (String clientId, BuiltMap creditMap) => creditStatsForClient(clientId, creditMap)); EntityStats creditStatsForClient( String clientId, BuiltMap creditMap) { int countActive = 0; int countArchived = 0; creditMap.forEach((creditId, credit) { if (credit.clientId == clientId) { if (credit.isActive) { countActive++; } else if (credit.isArchived) { countArchived++; } } }); return EntityStats(countActive: countActive, countArchived: countArchived); } var memoizedCreditStatsForUser = memo2( (String userId, BuiltMap creditMap) => creditStatsForUser(userId, creditMap)); EntityStats creditStatsForUser( String userId, BuiltMap creditMap, ) { int countActive = 0; int countArchived = 0; creditMap.forEach((creditId, credit) { if (credit.assignedUserId == userId) { if (credit.isActive) { countActive++; } else if (credit.isArchived) { countArchived++; } } }); return EntityStats(countActive: countActive, countArchived: countArchived); } bool hasCreditChanges( InvoiceEntity credit, BuiltMap creditMap) => credit.isNew ? credit.isChanged : credit != creditMap[credit.id];