Add support for tags and priorities + make default query and mapper
This commit is contained in:
@@ -5,6 +5,7 @@ import { parse } from "../generated/grammar/task";
|
||||
import { Task as DefaultTask } from "../model";
|
||||
import { ParseResult } from "../types/grammar";
|
||||
import { Task, TaskPriority } from "../types/task";
|
||||
import { jsMapper } from "../util";
|
||||
|
||||
/**
|
||||
* Returns all tasks from specified directory and filters them with optional query.
|
||||
@@ -20,21 +21,12 @@ export async function loadTasks(directories: string[], query?: string): Promise<
|
||||
HIGHEST: TaskPriority.HIGHEST
|
||||
};
|
||||
|
||||
const filter = query && createFilter(query, ctx);
|
||||
const filter = query && jsMapper<Task, boolean>(query, ctx);
|
||||
const tasks = await Promise.all(directories.map(readTasksFromDirectory));
|
||||
|
||||
return tasks.flat().filter(t => filter ? filter(t) : true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a filter function for tasks using a query string and context object.
|
||||
* All context' properties will be passed as variables to the query string.
|
||||
*/
|
||||
function createFilter(query: string, context: Record<string, unknown>): (task: Task) => boolean {
|
||||
const filter = new Function('$', ...Object.keys(context), `return ${query};`);
|
||||
return (task: Task) => filter(task, ...Object.values(context));
|
||||
}
|
||||
|
||||
/**
|
||||
* Read all files in specific directory and returns all tasks from those files.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user