import 'package:flutter/widgets.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/task/task_selectors.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'; List convertProjectToInvoiceItem( {BuildContext context, ProjectEntity project}) { final List items = []; final state = StoreProvider.of(context).state; state.taskState.map.forEach((index, task) { if (task.isStopped && !task.isInvoiced && task.projectId == project.id) { final item = convertTaskToInvoiceItem(task: task, context: context); items.add(item); } }); return items; } var memoizedDropdownProjectList = memo4( (BuiltMap projectMap, BuiltList projectList, BuiltMap clientMap, String clientId) => dropdownProjectsSelector(projectMap, projectList, clientMap, clientId)); List dropdownProjectsSelector( BuiltMap projectMap, BuiltList projectList, BuiltMap clientMap, String clientId) { final list = projectList.where((projectId) { final project = projectMap[projectId]; if (clientId != null && clientId.isNotEmpty && project.clientId != clientId) { return false; } if (project.hasClient && clientMap.containsKey(project.clientId) && !clientMap[project.clientId].isActive) { return false; } return project.isActive; }).toList(); list.sort((projectAId, projectBId) { final projectA = projectMap[projectAId]; final projectB = projectMap[projectBId]; return projectA.compareTo(projectB, ProjectFields.name, true); }); return list; } var memoizedFilteredProjectList = memo4( (BuiltMap projectMap, BuiltList projectList, ListUIState projectListState, BuiltMap clientMap) => filteredProjectsSelector( projectMap, projectList, projectListState, clientMap)); List filteredProjectsSelector( BuiltMap projectMap, BuiltList projectList, ListUIState projectListState, BuiltMap clientMap) { final list = projectList.where((projectId) { final project = projectMap[projectId]; final client = clientMap[project.clientId] ?? ClientEntity(id: project.clientId); if (projectListState.filterEntityId != null) { if (!projectListState.entityMatchesFilter(client)) { return false; } } else if (!client.isActive) { return false; } if (!project.matchesFilter(projectListState.filter) && !client.matchesFilter(projectListState.filter)) { return false; } if (!project.matchesStates(projectListState.stateFilters)) { return false; } if (projectListState.custom1Filters.isNotEmpty && !projectListState.custom1Filters.contains(project.customValue1)) { return false; } if (projectListState.custom2Filters.isNotEmpty && !projectListState.custom2Filters.contains(project.customValue2)) { return false; } /* if (projectListState.filterEntityId != null && project.entityId != projectListState.filterEntityId) { return false; } */ return true; }).toList(); list.sort((projectAId, projectBId) { final projectA = projectMap[projectAId]; final projectB = projectMap[projectBId]; return projectA.compareTo( projectB, projectListState.sortField, projectListState.sortAscending); }); return list; } Duration taskDurationForProject( ProjectEntity project, BuiltMap taskMap, ) { int total = 0; taskMap.forEach((index, task) { if (task.isActive && task.projectId == project.id) { total += task.calculateDuration.inSeconds; } }); return Duration(seconds: total); } var memoizedProjectStatsForClient = memo4((String clientId, BuiltMap projectMap, String activeLabel, String archivedLabel) => projectStatsForClient(clientId, projectMap, activeLabel, archivedLabel)); String projectStatsForClient( String clientId, BuiltMap projectMap, String activeLabel, String archivedLabel) { int countActive = 0; int countArchived = 0; projectMap.forEach((projectId, project) { if (project.clientId == clientId) { if (project.isActive) { countActive++; } else if (project.isArchived) { countArchived++; } } }); String str = ''; if (countActive > 0) { str = '$countActive $activeLabel'; if (countArchived > 0) { str += ' • '; } } if (countArchived > 0) { str += '$countArchived $archivedLabel'; } return str; } bool hasProjectChanges( ProjectEntity project, BuiltMap projectMap) => project.isNew ? project.isChanged : project != projectMap[project.id];