forked from chhoumann/quickadd
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTodoistScript.js
99 lines (81 loc) · 3.42 KB
/
TodoistScript.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
module.exports = {SelectFromAllTasks, GetAllTasksFromProject, GetAllTasksFromSection};
const getTodoistPluginApi = (app) => app.plugins.plugins["todoist-sync-plugin"].api;
/* API */
async function SelectFromAllTasks(params) {
const tasks = await getAllTasks(params);
if (tasks.length === 0) {
new Notice("No tasks.");
return;
}
const selectedTasks = await selectTasks(params, tasks);
await closeSelectedTasks(params.app, selectedTasks);
return formatTasksToTasksPluginTask(selectedTasks);
}
async function GetAllTasksFromProject(params) {
const [allTasks, projects] = await Promise.all([getAllTasks(params), getProjects(params.app)]);
const targetProject = await params.quickAddApi.suggester(project => {
project.tasks = allTasks.filter(task => task.projectID === project.id);
return `${project.name} (${project.tasks.length})`;
}, projects);
if (!targetProject) return;
if (targetProject.tasks.length === 0) {
new Notice(`No tasks in '${targetProject.name}'.`);
return;
} else {
new Notice(`Added ${targetProject.tasks.length} tasks from '${targetProject.name}'.`)
}
await closeSelectedTasks(params.app, targetProject.tasks);
return formatTasksToTasksPluginTask(targetProject.tasks);
}
async function GetAllTasksFromSection(params) {
const [projects, sections, allTasks] = await Promise.all([getProjects(params.app), getSections(params.app), getAllTasks(params)]);
const targetSection = await params.quickAddApi.suggester(section => {
const sectionProject = projects.find(project => project.id === section["project_id"]);
section.tasks = allTasks.filter(task => task.sectionID === section.id);
return `${sectionProject.name} > ${section.name} (${section.tasks.length})`;
}, sections);
if (targetSection.tasks.length === 0) {
new Notice(`No tasks in '${targetSection.name}'.`);
return;
} else {
new Notice(`Added ${targetSection.tasks.length} tasks from '${targetSection.name}'.`)
}
await closeSelectedTasks(targetSection.tasks);
return formatTasksToTasksPluginTask(targetSection.tasks);
}
/* Helpers */
async function getAllTasks(params) {
const api = getTodoistPluginApi(params.app);
const {ok: tasks} = await api.getTasks();
return tasks;
}
async function selectTasks(params, tasks) {
const selectedTaskNames = await params.quickAddApi.checkboxPrompt(tasks.map(task => task.content));
return tasks.filter(task => selectedTaskNames.some(t => t.contains(task.content)));
}
async function closeSelectedTasks(app, tasks) {
const api = getTodoistPluginApi(app);
tasks.forEach(async task => await api.closeTask(task.id));
}
function formatTasksToTasksPluginTask(tasks) {
return tasks.map(task =>
task.rawDatetime ?
task = `- [ ] ${task.content} 📅 ${task.rawDatetime.format("YYYY-MM-DD")}` :
task = `- [ ] ${task.content}`
).join("\n") + "\n";
}
async function getTasksGroupedByProject(app) {
const api = getTodoistPluginApi(app);
const {ok: projects} = await api.getTasksGroupedByProject();
return projects;
}
async function getProjects(app) {
const api = getTodoistPluginApi(app);
const {ok: projects} = await api.getProjects();
return projects;
}
async function getSections(app) {
const api = getTodoistPluginApi(app);
const {ok: sections} = await api.getSections();
return sections;
}