// 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/static/static_state.dart'; import 'package:invoiceninja_flutter/redux/ui/list_ui_state.dart'; var memoizedSortedActiveTaskStatusIds = memo2(( BuiltList taskStatusList, BuiltMap taskStatusMap, ) => sortedActiveTaskStatusIds( taskStatusList: taskStatusList, taskStatusMap: taskStatusMap, )); List sortedActiveTaskStatusIds({ BuiltMap taskStatusMap, BuiltList taskStatusList, }) { final statuses = taskStatusList .where((statusId) => taskStatusMap.containsKey(statusId) && taskStatusMap[statusId].isActive) .toList(); statuses.sort((statusIdA, statusIdB) { final statusA = taskStatusMap[statusIdA]; final statusB = taskStatusMap[statusIdB]; if (statusA.statusOrder == statusB.statusOrder) { return statusB.updatedAt.compareTo(statusA.updatedAt); } else { return (statusA.statusOrder ?? 99999) .compareTo(statusB.statusOrder ?? 99999); } }); return statuses; } var memoizedDropdownTaskStatusList = memo4( (BuiltMap taskStatusMap, BuiltList taskStatusList, StaticState staticState, BuiltMap userMap) => dropdownTaskStatusesSelector( taskStatusMap, taskStatusList, staticState, userMap)); List dropdownTaskStatusesSelector( BuiltMap taskStatusMap, BuiltList taskStatusList, StaticState staticState, BuiltMap userMap) { final list = taskStatusList.where((taskStatusId) { final taskStatus = taskStatusMap[taskStatusId]; return taskStatus.isActive; }).toList(); list.sort((taskStatusAId, taskStatusBId) { final taskStatusA = taskStatusMap[taskStatusAId]; final taskStatusB = taskStatusMap[taskStatusBId]; return taskStatusA.compareTo( sortAscending: true, sortField: TaskStatusFields.order, taskStatus: taskStatusB, ); }); return list; } var memoizedFilteredTaskStatusList = memo4((SelectionState selectionState, BuiltMap taskStatusMap, BuiltList taskStatusList, ListUIState taskStatusListState) => filteredTaskStatusesSelector( selectionState, taskStatusMap, taskStatusList, taskStatusListState)); List filteredTaskStatusesSelector( SelectionState selectionState, BuiltMap taskStatusMap, BuiltList taskStatusList, ListUIState taskStatusListState) { final list = taskStatusList.where((taskStatusId) { final taskStatus = taskStatusMap[taskStatusId]; if (taskStatus.id == selectionState.selectedId) { return true; } if (!taskStatus.matchesStates(taskStatusListState.stateFilters)) { return false; } if (!taskStatus.matchesStatuses(taskStatusListState.statusFilters)) { return false; } return taskStatus.matchesFilter(taskStatusListState.filter); }).toList(); list.sort((taskStatusAId, taskStatusBId) { return taskStatusMap[taskStatusAId].compareTo( taskStatus: taskStatusMap[taskStatusBId], sortField: taskStatusListState.sortField, sortAscending: taskStatusListState.sortAscending, ); }); return list; } var memoizedCalculateTaskStatusAmount = memo2((String taskStatusId, BuiltMap taskMap) => calculateTaskStatusAmount(taskStatusId: taskStatusId, taskMap: taskMap)); int calculateTaskStatusAmount({ String taskStatusId, BuiltMap taskMap, }) { int total = 0; taskMap.forEach((taskId, task) { if (task.statusId == taskStatusId) { total += task.calculateDuration().inSeconds; } }); return total; } var memoizedTaskStatsForTaskStatus = memo2( (String companyGatewayId, BuiltMap taskMap) => taskStatsForTaskStatus(companyGatewayId, taskMap)); EntityStats taskStatsForTaskStatus( String statusId, BuiltMap taskMap, ) { int countActive = 0; int countArchived = 0; taskMap.forEach((taskId, task) { if (task.statusId == statusId) { if (task.isActive) { countActive++; } else if (task.isArchived) { countArchived++; } } }); return EntityStats(countActive: countActive, countArchived: countArchived); } String defaultTaskStatusId(BuiltMap taskStatusMap) { final statusIds = taskStatusMap.keys.where((statusId) { final status = taskStatusMap[statusId]; return status.isActive; }).toList(); statusIds.sort((statusIdA, statusIdB) { final statusA = taskStatusMap[statusIdA]; final statusB = taskStatusMap[statusIdB]; return (statusA.statusOrder ?? 9999).compareTo(statusB.statusOrder ?? 9999); }); if (statusIds.isNotEmpty) { return statusIds.first; } else { return ''; } }