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:
committed by
Matteo Pagliazzi
parent
68ea28305d
commit
e18e89bc10
@@ -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),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user