Completed Sort Fields for Task model

This commit is contained in:
Gianfranco Gasbarri 2020-07-05 12:47:04 +01:00
parent c61f57ba31
commit ed0e80f5e5
5 changed files with 120 additions and 16 deletions

View File

@ -47,6 +47,7 @@ abstract class TaskItemResponse
}
class TaskFields {
static const String name = 'name';
static const String description = 'description';
static const String duration = 'duration';
static const String invoiceId = 'invoice_id';
@ -58,6 +59,8 @@ class TaskFields {
static const String isRunning = 'is_running';
static const String customValue1 = 'custom1';
static const String customValue2 = 'custom2';
static const String customValue3 = 'custom3';
static const String customValue4 = 'custom4';
static const String updatedAt = 'updated_at';
static const String archivedAt = 'archived_at';
@ -437,14 +440,77 @@ abstract class TaskEntity extends Object
return actions..addAll(super.getActions(userCompany: userCompany));
}
int compareTo(TaskEntity task, String sortField, bool sortAscending) {
int compareTo(
TaskEntity task,
String sortField,
bool sortAscending,
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, ProjectEntity> projectMap,
BuiltMap<String, InvoiceEntity> invoiceMap) {
int response = 0;
final TaskEntity taskA = sortAscending ? this : task;
final TaskEntity taskB = sortAscending ? task : this;
switch (sortField) {
case TaskFields.duration:
response = taskA.clientId.compareTo(taskB.clientId);
response = taskA.duration.compareTo(taskB.duration);
break;
case TaskFields.description:
response = taskA.description.compareTo(taskB.description);
break;
case TaskFields.customValue1:
response = taskA.customValue1.compareTo(taskB.customValue1);
break;
case TaskFields.customValue2:
response = taskA.customValue2.compareTo(taskB.customValue2);
break;
case TaskFields.customValue3:
response = taskA.customValue3.compareTo(taskB.customValue3);
break;
case TaskFields.clientId:
case TaskFields.client:
final clientA = clientMap[taskA.clientId] ?? ClientEntity();
final clientB = clientMap[taskB.clientId] ?? ClientEntity();
response = clientA.listDisplayName
.toLowerCase()
.compareTo(clientB.listDisplayName.toLowerCase());
break;
case TaskFields.projectId:
case TaskFields.project:
final projectA = projectMap[taskA.projectId] ?? ProjectEntity();
final projectB = projectMap[taskB.projectId] ?? ProjectEntity();
response = projectA.listDisplayName
.toLowerCase()
.compareTo(projectB.listDisplayName.toLowerCase());
break;
case TaskFields.invoiceId:
final invoiceA = invoiceMap[taskA.invoiceId] ?? InvoiceEntity();
final invoiceB = invoiceMap[taskB.invoiceId] ?? InvoiceEntity();
response = invoiceA.listDisplayName
.toLowerCase()
.compareTo(invoiceB.listDisplayName.toLowerCase());
break;
case EntityFields.state:
final stateA =
EntityState.valueOf(taskA.entityState) ?? EntityState.active;
final stateB =
EntityState.valueOf(taskB.entityState) ?? EntityState.active;
response =
stateA.name.toLowerCase().compareTo(stateB.name.toLowerCase());
break;
case TaskFields.timeLog:
response =
taskA.timeLog.toLowerCase().compareTo(taskB.timeLog.toLowerCase());
break;
case EntityFields.createdAt:
response = taskA.createdAt.compareTo(taskB.createdAt);
break;
case TaskFields.archivedAt:
response = taskA.archivedAt.compareTo(taskB.archivedAt);
break;
case TaskFields.updatedAt:
response = taskA.updatedAt.compareTo(taskB.updatedAt);
break;
default:
print('## ERROR: sort by task.$sortField is not implemented');

View File

@ -32,11 +32,19 @@ InvoiceItemEntity convertTaskToInvoiceItem(
..quantity = round(task.duration / 3600, 3));
}
var memoizedTaskList = memo2(
(BuiltMap<String, TaskEntity> taskMap, String clientId) =>
taskList(taskMap, clientId));
var memoizedTaskList = memo5((BuiltMap<String, TaskEntity> taskMap,
String clientId,
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, ProjectEntity> projectMap) =>
taskList(taskMap, clientId, userMap, clientMap, projectMap));
List<String> taskList(BuiltMap<String, TaskEntity> taskMap, String clientId) {
List<String> taskList(
BuiltMap<String, TaskEntity> taskMap,
String clientId,
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, ProjectEntity> projectMap) {
final list = taskMap.keys.where((taskId) {
final task = taskMap[taskId];
if (clientId != null && clientId != null && task.clientId != clientId) {
@ -51,35 +59,50 @@ List<String> taskList(BuiltMap<String, TaskEntity> taskMap, String clientId) {
return list;
}
var memoizedDropdownTaskList = memo2(
(BuiltMap<String, TaskEntity> taskMap, BuiltList<String> taskList) =>
dropdownTasksSelector(taskMap, taskList));
var memoizedDropdownTaskList = memo6((BuiltMap<String, TaskEntity> taskMap,
BuiltList<String> taskList,
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String, ProjectEntity> projectMap) =>
dropdownTasksSelector(
taskMap, taskList, userMap, clientMap, invoiceMap, projectMap));
List<String> dropdownTasksSelector(
BuiltMap<String, TaskEntity> taskMap, BuiltList<String> taskList) {
BuiltMap<String, TaskEntity> taskMap,
BuiltList<String> taskList,
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltMap<String, ProjectEntity> projectMap) {
final list = taskList.where((taskId) => taskMap[taskId].isActive).toList();
list.sort((taskAId, taskBId) {
final taskA = taskMap[taskAId];
final taskB = taskMap[taskBId];
return taskA.compareTo(taskB, TaskFields.updatedAt, false);
return taskA.compareTo(taskB, TaskFields.updatedAt, false, userMap,
clientMap, projectMap, invoiceMap);
});
return list;
}
var memoizedFilteredTaskList = memo5((BuiltMap<String, TaskEntity> taskMap,
var memoizedFilteredTaskList = memo7((BuiltMap<String, TaskEntity> taskMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, ProjectEntity> projectMap,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltList<String> taskList,
ListUIState taskListState) =>
filteredTasksSelector(
taskMap, clientMap, projectMap, taskList, taskListState));
filteredTasksSelector(taskMap, clientMap, userMap, projectMap, invoiceMap,
taskList, taskListState));
List<String> filteredTasksSelector(
BuiltMap<String, TaskEntity> taskMap,
BuiltMap<String, ClientEntity> clientMap,
BuiltMap<String, UserEntity> userMap,
BuiltMap<String, ProjectEntity> projectMap,
BuiltMap<String, InvoiceEntity> invoiceMap,
BuiltList<String> taskList,
ListUIState taskListState) {
final list = taskList.where((taskId) {
@ -140,7 +163,13 @@ List<String> filteredTasksSelector(
final taskA = taskMap[taskAId];
final taskB = taskMap[taskBId];
return taskA.compareTo(
taskB, taskListState.sortField, taskListState.sortAscending);
taskB,
taskListState.sortField,
taskListState.sortAscending,
userMap,
clientMap,
projectMap,
invoiceMap);
});
return list;

View File

@ -212,7 +212,12 @@ class _InvoiceItemSelectorState extends State<InvoiceItemSelector>
}
Widget _taskList() {
final matches = memoizedTaskList(state.taskState.map, _filterClientId)
final matches = memoizedTaskList(
state.taskState.map,
_filterClientId,
state.userState.map,
state.clientState.map,
state.projectState.map)
.where((entityId) {
final task = state.taskState.map[entityId];
if (widget.excluded != null && widget.excluded.contains(task)) {

View File

@ -127,7 +127,9 @@ class TaskListVM {
taskList: memoizedFilteredTaskList(
state.taskState.map,
state.clientState.map,
state.userState.map,
state.projectState.map,
state.invoiceState.map,
state.taskState.list,
state.taskListState),
taskMap: state.taskState.map,

View File

@ -47,7 +47,9 @@ class TaskScreenVM {
taskList: memoizedFilteredTaskList(
state.taskState.map,
state.clientState.map,
state.userState.map,
state.projectState.map,
state.invoiceState.map,
state.taskState.list,
state.taskListState),
userCompany: state.userCompany,