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 { class TaskFields {
static const String name = 'name';
static const String description = 'description'; static const String description = 'description';
static const String duration = 'duration'; static const String duration = 'duration';
static const String invoiceId = 'invoice_id'; static const String invoiceId = 'invoice_id';
@ -58,6 +59,8 @@ class TaskFields {
static const String isRunning = 'is_running'; static const String isRunning = 'is_running';
static const String customValue1 = 'custom1'; static const String customValue1 = 'custom1';
static const String customValue2 = 'custom2'; static const String customValue2 = 'custom2';
static const String customValue3 = 'custom3';
static const String customValue4 = 'custom4';
static const String updatedAt = 'updated_at'; static const String updatedAt = 'updated_at';
static const String archivedAt = 'archived_at'; static const String archivedAt = 'archived_at';
@ -437,14 +440,77 @@ abstract class TaskEntity extends Object
return actions..addAll(super.getActions(userCompany: userCompany)); 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; int response = 0;
final TaskEntity taskA = sortAscending ? this : task; final TaskEntity taskA = sortAscending ? this : task;
final TaskEntity taskB = sortAscending ? task : this; final TaskEntity taskB = sortAscending ? task : this;
switch (sortField) { switch (sortField) {
case TaskFields.duration: 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; break;
default: default:
print('## ERROR: sort by task.$sortField is not implemented'); print('## ERROR: sort by task.$sortField is not implemented');

View File

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

View File

@ -212,7 +212,12 @@ class _InvoiceItemSelectorState extends State<InvoiceItemSelector>
} }
Widget _taskList() { 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) { .where((entityId) {
final task = state.taskState.map[entityId]; final task = state.taskState.map[entityId];
if (widget.excluded != null && widget.excluded.contains(task)) { if (widget.excluded != null && widget.excluded.contains(task)) {

View File

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

View File

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