diff --git a/lib/data/models/project_model.dart b/lib/data/models/project_model.dart index df2ff7272..31466494e 100644 --- a/lib/data/models/project_model.dart +++ b/lib/data/models/project_model.dart @@ -164,7 +164,12 @@ abstract class ProjectEntity extends Object return actions..addAll(super.getActions(userCompany: userCompany)); } - int compareTo(ProjectEntity project, String sortField, bool sortAscending) { + int compareTo( + ProjectEntity project, + String sortField, + bool sortAscending, + BuiltMap userMap, + BuiltMap clientMap) { int response = 0; final ProjectEntity projectA = sortAscending ? this : project; final ProjectEntity projectB = sortAscending ? project : this; @@ -177,6 +182,53 @@ abstract class ProjectEntity extends Object case ProjectFields.taskRate: response = projectA.taskRate.compareTo(projectB.taskRate); break; + case ProjectFields.client: + final clientA = clientMap[projectA.clientId] ?? ClientEntity(); + final clientB = clientMap[projectB.clientId] ?? ClientEntity(); + response = clientA.listDisplayName + .toLowerCase() + .compareTo(clientB.listDisplayName.toLowerCase()); + break; + case ProjectFields.dueDate: + response = projectA.dueDate.compareTo(projectB.dueDate); + break; + case ProjectFields.privateNotes: + response = projectA.privateNotes.compareTo(projectB.privateNotes); + break; + case ProjectFields.budgetedHours: + response = projectA.budgetedHours.compareTo(projectB.budgetedHours); + break; + case EntityFields.state: + final stateA = + EntityState.valueOf(projectA.entityState) ?? EntityState.active; + final stateB = + EntityState.valueOf(projectB.entityState) ?? EntityState.active; + response = + stateA.name.toLowerCase().compareTo(stateB.name.toLowerCase()); + break; + case EntityFields.createdAt: + response = projectA.createdAt.compareTo(projectB.createdAt); + break; + case ProjectFields.archivedAt: + response = projectA.archivedAt.compareTo(projectB.archivedAt); + break; + case ProjectFields.updatedAt: + response = projectA.updatedAt.compareTo(projectB.updatedAt); + break; + case EntityFields.assignedTo: + final userA = userMap[projectA.assignedUserId] ?? UserEntity(); + final userB = userMap[projectB.assignedUserId] ?? UserEntity(); + response = userA.listDisplayName + .toLowerCase() + .compareTo(userB.listDisplayName.toLowerCase()); + break; + case EntityFields.createdBy: + final userA = userMap[projectA.createdUserId] ?? UserEntity(); + final userB = userMap[projectB.createdUserId] ?? UserEntity(); + response = userA.listDisplayName + .toLowerCase() + .compareTo(userB.listDisplayName.toLowerCase()); + break; default: print('## ERROR: sort by project.$sortField is not implemented'); break; diff --git a/lib/redux/project/project_selectors.dart b/lib/redux/project/project_selectors.dart index babecda5a..9fedcc2df 100644 --- a/lib/redux/project/project_selectors.dart +++ b/lib/redux/project/project_selectors.dart @@ -21,15 +21,20 @@ List convertProjectToInvoiceItem( return items; } -var memoizedDropdownProjectList = memo4( - (BuiltMap projectMap, BuiltList projectList, - BuiltMap clientMap, String clientId) => - dropdownProjectsSelector(projectMap, projectList, clientMap, clientId)); +var memoizedDropdownProjectList = memo5( + (BuiltMap projectMap, + BuiltList projectList, + BuiltMap clientMap, + BuiltMap userMap, + String clientId) => + dropdownProjectsSelector( + projectMap, projectList, clientMap, userMap, clientId)); List dropdownProjectsSelector( BuiltMap projectMap, BuiltList projectList, BuiltMap clientMap, + BuiltMap userMap, String clientId) { final list = projectList.where((projectId) { final project = projectMap[projectId]; @@ -49,25 +54,28 @@ List dropdownProjectsSelector( list.sort((projectAId, projectBId) { final projectA = projectMap[projectAId]; final projectB = projectMap[projectBId]; - return projectA.compareTo(projectB, ProjectFields.name, true); + return projectA.compareTo( + projectB, ProjectFields.name, true, userMap, clientMap); }); return list; } -var memoizedFilteredProjectList = memo4( +var memoizedFilteredProjectList = memo5( (BuiltMap projectMap, BuiltList projectList, ListUIState projectListState, - BuiltMap clientMap) => + BuiltMap clientMap, + BuiltMap userMap) => filteredProjectsSelector( - projectMap, projectList, projectListState, clientMap)); + projectMap, projectList, projectListState, clientMap, userMap)); List filteredProjectsSelector( BuiltMap projectMap, BuiltList projectList, ListUIState projectListState, - BuiltMap clientMap) { + BuiltMap clientMap, + BuiltMap userMap) { final list = projectList.where((projectId) { final project = projectMap[projectId]; final client = @@ -111,8 +119,8 @@ List filteredProjectsSelector( list.sort((projectAId, projectBId) { final projectA = projectMap[projectAId]; final projectB = projectMap[projectBId]; - return projectA.compareTo( - projectB, projectListState.sortField, projectListState.sortAscending); + return projectA.compareTo(projectB, projectListState.sortField, + projectListState.sortAscending, userMap, clientMap); }); return list; diff --git a/lib/ui/project/project_list_vm.dart b/lib/ui/project/project_list_vm.dart index 4b70c2097..ad5503a46 100644 --- a/lib/ui/project/project_list_vm.dart +++ b/lib/ui/project/project_list_vm.dart @@ -121,10 +121,12 @@ class ProjectListVM { state: state, listState: state.projectListState, projectList: memoizedFilteredProjectList( - state.projectState.map, - state.projectState.list, - state.projectListState, - state.clientState.map), + state.projectState.map, + state.projectState.list, + state.projectListState, + state.clientState.map, + state.userState.map, + ), projectMap: state.projectState.map, clientMap: state.clientState.map, isLoading: state.isLoading, diff --git a/lib/ui/project/project_screen_vm.dart b/lib/ui/project/project_screen_vm.dart index 198990f30..91962852d 100644 --- a/lib/ui/project/project_screen_vm.dart +++ b/lib/ui/project/project_screen_vm.dart @@ -45,10 +45,12 @@ class ProjectScreenVM { return ProjectScreenVM( projectMap: state.projectState.map, projectList: memoizedFilteredProjectList( - state.projectState.map, - state.projectState.list, - state.projectListState, - state.clientState.map), + state.projectState.map, + state.projectState.list, + state.projectListState, + state.clientState.map, + state.userState.map, + ), userCompany: state.userCompany, isInMultiselect: state.projectListState.isInMultiselect(), ); diff --git a/lib/ui/task/edit/task_edit_details.dart b/lib/ui/task/edit/task_edit_details.dart index 20a9ab033..72acb27b7 100644 --- a/lib/ui/task/edit/task_edit_details.dart +++ b/lib/ui/task/edit/task_edit_details.dart @@ -118,6 +118,7 @@ class _TaskEditDetailsState extends State { state.projectState.map, state.projectState.list, state.clientState.map, + state.userState.map, task.clientId), onSelected: (selected) { final project = selected as ProjectEntity;