Task page - task filters v2 (#10053)

* update column.vue, getters/task.js, getters/user.js and add unittests and helpers

* add vue-test-utils pkg + unit test for column.vue

* add unit test column.vue

* update unit tests

* fix linting errors
This commit is contained in:
kartik adur
2018-03-18 20:53:58 +05:30
committed by Matteo Pagliazzi
parent 68ea28305d
commit e18e89bc10
11 changed files with 714 additions and 137 deletions
@@ -0,0 +1,68 @@
import { shouldDo } from 'common/script/cron';
// Task filter data
// @TODO find a way to include user preferences w.r.t sort and defaults
const taskFilters = {
habit: {
label: 'habits',
filters: [
{ label: 'all', filterFn: () => true, default: true },
{ label: 'yellowred', filterFn: t => t.value < 1 }, // weak
{ label: 'greenblue', filterFn: t => t.value >= 1 }, // strong
],
},
daily: {
label: 'dailies',
filters: [
{ label: 'all', filterFn: () => true, default: true },
{ label: 'due', filterFn: userPrefs => t => !t.completed && shouldDo(new Date(), t, userPrefs) },
{ label: 'notDue', filterFn: userPrefs => t => t.completed || !shouldDo(new Date(), t, userPrefs) },
],
},
todo: {
label: 'todos',
filters: [
{ label: 'remaining', filterFn: t => !t.completed, default: true }, // active
{ label: 'scheduled', filterFn: t => !t.completed && t.date, sort: t => t.date },
{ label: 'complete2', filterFn: t => t.completed },
],
},
reward: {
label: 'rewards',
filters: [
{ label: 'all', filterFn: () => true, default: true },
{ label: 'custom', filterFn: () => true }, // all rewards made by the user
{ label: 'wishlist', filterFn: () => false }, // not user tasks
],
},
};
function typeLabel (filterList) {
return (type) => filterList[type].label;
}
export const getTypeLabel = typeLabel(taskFilters);
function filterLabel (filterList) {
return (type) => {
let filterListByType = filterList[type].filters;
let filterListOfLabels = new Array(filterListByType.length);
filterListByType.forEach(({ label }, i) => filterListOfLabels[i] = label);
return filterListOfLabels;
};
}
export const getFilterLabels = filterLabel(taskFilters);
function activeFilter (filterList) {
return (type, filterType = '') => {
let filterListByType = filterList[type].filters;
if (filterType) {
return filterListByType.find(f => f.label === filterType);
}
return filterListByType.find(f => f.default === true);
};
}
export const getActiveFilter = activeFilter(taskFilters);
@@ -0,0 +1,31 @@
import compact from 'lodash/compact';
// sets task order for single task type only.
// Accepts task list and corresponding taskorder for its task type.
export function orderSingleTypeTasks (rawTasks, taskOrder) {
// if there is no predefined task order return task list as is.
if (!taskOrder) return rawTasks;
const orderedTasks = new Array(rawTasks.length);
const unorderedTasks = []; // What we want to add later
rawTasks.forEach((task, index) => {
const taskId = task._id;
const i = taskOrder[index] === taskId ? index : taskOrder.indexOf(taskId);
if (i === -1) {
unorderedTasks.push(task);
} else {
orderedTasks[i] = task;
}
});
return compact(orderedTasks).concat(unorderedTasks);
}
export function orderMultipleTypeTasks (rawTasks, tasksOrder) {
return {
habits: orderSingleTypeTasks(rawTasks.habits, tasksOrder.habits),
dailys: orderSingleTypeTasks(rawTasks.dailys, tasksOrder.dailys),
todos: orderSingleTypeTasks(rawTasks.todos, tasksOrder.todos),
rewards: orderSingleTypeTasks(rawTasks.rewards, tasksOrder.rewards),
};
}