diff --git a/main.ts b/main.ts index fa70f46..0f025ca 100644 --- a/main.ts +++ b/main.ts @@ -90,6 +90,13 @@ export default class VikunjaPlugin extends Plugin { await this.processor.exec(); } }); + this.addCommand({ + id: 'vikunja-pull-tasks', + name: 'Pull tasks from Vikunja', + callback: async () => { + await this.commands.pullTasksFromVikunja(); + } + }) this.addCommand({ id: 'vikunja-move-tasks-to-default-project', name: 'Move all tasks to default project', diff --git a/src/commands/index.ts b/src/commands/index.ts index af67b1e..e0702d9 100644 --- a/src/commands/index.ts +++ b/src/commands/index.ts @@ -3,6 +3,7 @@ import {appHasDailyNotesPluginLoaded} from "obsidian-daily-notes-interface"; import {App, Notice} from "obsidian"; import {getAPI} from "obsidian-dataview"; import VikunjaPlugin from "../../main"; +import {PluginTask} from "../vaultSearcher/vaultSearcher"; export default class Commands { private plugin: VikunjaPlugin; @@ -62,10 +63,26 @@ export default class Commands { } if (this.plugin.settings.debugging) console.log("Move all tasks to default project"); + const tasks = (await this.getTasksFromVault()).filter(task => task.task.id !== undefined).map(task => task.task); + await this.plugin.tasksApi.updateProjectsIdInVikunja(tasks, this.plugin.settings.defaultVikunjaProject); + } + + async pullTasksFromVikunja() { + if (this.isEverythingSetup()) { + new Notice("Vikunja Plugin: Found problems in plugin. Have to be fixed first. Syncing is stopped."); + return; + } + if (this.plugin.settings.debugging) console.log("Pull tasks from Vikunja"); + + const vikunjaTasks = await this.plugin.tasksApi.getAllTasks(); + const vaultTasks = await this.getTasksFromVault(); + await this.plugin.processor.pullTasksFromVikunjaToVault(vaultTasks, vikunjaTasks); + } + + async getTasksFromVault(): Promise { const vaultSearcher = this.plugin.processor.getVaultSearcher(); const taskParser = this.plugin.processor.getTaskParser(); - const tasks = (await vaultSearcher.getTasks(taskParser)).filter(task => task.task.id !== undefined).map(task => task.task); - await this.plugin.tasksApi.updateProjectsIdInVikunja(tasks, this.plugin.settings.defaultVikunjaProject); + return await vaultSearcher.getTasks(taskParser); } } diff --git a/src/processing/createTasks.ts b/src/processing/createTasks.ts index 32b05c4..ff2317e 100644 --- a/src/processing/createTasks.ts +++ b/src/processing/createTasks.ts @@ -32,78 +32,11 @@ class CreateTasks implements IAutomatonSteps { private async createTasks(localTasks: PluginTask[], vikunjaTasks: ModelsTask[]) { if (this.plugin.settings.debugging) console.log("Step CreateTask: Creating tasks in Vikunja and vault", localTasks, vikunjaTasks); - await this.pullTasksFromVikunjaToVault(localTasks, vikunjaTasks); - await this.pushTasksFromVaultToVikunja(localTasks, vikunjaTasks); + await this.processor.pullTasksFromVikunjaToVault(localTasks, vikunjaTasks); + await this.processor.pushTasksFromVaultToVikunja(localTasks, vikunjaTasks); } - private async pushTasksFromVaultToVikunja(localTasks: PluginTask[], vikunjaTasks: ModelsTask[]) { - const tasksToPushToVikunja = localTasks.filter(task => !vikunjaTasks.find(vikunjaTask => vikunjaTask.id === task.task.id)); - if (this.plugin.settings.debugging) console.log("Step CreateTask: Pushing tasks to vikunja", tasksToPushToVikunja); - const createdTasksInVikunja = await this.plugin.tasksApi.createTasks(tasksToPushToVikunja.map(task => task.task)); - if (this.plugin.settings.debugging) console.log("Step CreateTask: Created tasks in vikunja", createdTasksInVikunja); - - let tasksToUpdateInVault = []; - - for (const task of tasksToPushToVikunja) { - const createdTask = createdTasksInVikunja.find((vikunjaTask: ModelsTask) => vikunjaTask.title === task.task.title); - if (!createdTask) { - continue; - } - task.task = createdTask; - tasksToUpdateInVault.push(task); - } - - for (const task of tasksToUpdateInVault) { - if (this.plugin.settings.debugging) console.log("Step CreateTask: Updating task in vault", task); - await this.processor.updateToVault(task); - } - } - - private async pullTasksFromVikunjaToVault(localTasks: PluginTask[], vikunjaTasks: ModelsTask[]) { - if (this.plugin.settings.debugging) console.log("Step CreateTask: Pulling tasks from vikunja to vault, vault tasks", localTasks, "vikunja tasks", vikunjaTasks); - - const tasksToPushToVault = vikunjaTasks.filter(task => !localTasks.find(vaultTask => vaultTask.task.id === task.id)); - if (this.plugin.settings.debugging) console.log("Step CreateTask: Pushing tasks to vault", tasksToPushToVault); - - const createdTasksInVault: PluginTask[] = []; - for (const task of tasksToPushToVault) { - let file: TFile; - const chosenFile = this.app.vault.getFileByPath(this.plugin.settings.chosenOutputFile); - const date = moment(); - const dailies = getAllDailyNotes() - - switch (this.plugin.settings.chooseOutputFile) { - case chooseOutputFile.File: - if (!chosenFile) throw new Error("Output file not found"); - file = chosenFile; - break; - case chooseOutputFile.DailyNote: - if (!appHasDailyNotesPluginLoaded()) { - new Notice("Daily notes core plugin is not loaded. So we cannot create daily note. Please install daily notes core plugin. Interrupt now.") - continue; - } - - file = getDailyNote(date, dailies) - if (file == null) { - file = await createDailyNote(date) - } - break; - default: - throw new Error("No valid chooseOutputFile selected"); - } - const pluginTask: PluginTask = { - file: file, - lineno: 0, - task: task - }; - createdTasksInVault.push(pluginTask); - } - - for (const task of createdTasksInVault) { - await this.processor.saveToVault(task); - } - } } export default CreateTasks; diff --git a/src/processing/processor.ts b/src/processing/processor.ts index 3653cd2..ed608db 100644 --- a/src/processing/processor.ts +++ b/src/processing/processor.ts @@ -1,12 +1,19 @@ import Plugin from "../../main"; -import {App, MarkdownView, Notice} from "obsidian"; +import {App, MarkdownView, moment, Notice, TFile} from "obsidian"; import {PluginTask, VaultSearcher} from "../vaultSearcher/vaultSearcher"; import {TaskFormatter, TaskParser} from "../taskFormats/taskFormats"; import {Automaton, AutomatonStatus, IAutomatonSteps} from "./automaton"; import UpdateTasks from "./updateTasks"; import {EmojiTaskFormatter, EmojiTaskParser} from "../taskFormats/emojiTaskFormat"; -import {backendToFindTasks, supportedTasksPluginsFormat} from "../enums"; +import {backendToFindTasks, chooseOutputFile, supportedTasksPluginsFormat} from "../enums"; import {DataviewSearcher} from "../vaultSearcher/dataviewSearcher"; +import {ModelsTask} from "../../vikunja_sdk"; +import { + appHasDailyNotesPluginLoaded, + createDailyNote, + getAllDailyNotes, + getDailyNote +} from "obsidian-daily-notes-interface"; class Processor { @@ -220,6 +227,75 @@ class Processor { return taskParser; } + async pushTasksFromVaultToVikunja(localTasks: PluginTask[], vikunjaTasks: ModelsTask[]) { + const tasksToPushToVikunja = localTasks.filter(task => !vikunjaTasks.find(vikunjaTask => vikunjaTask.id === task.task.id)); + if (this.plugin.settings.debugging) console.log("Step CreateTask: Pushing tasks to vikunja", tasksToPushToVikunja); + const createdTasksInVikunja = await this.plugin.tasksApi.createTasks(tasksToPushToVikunja.map(task => task.task)); + if (this.plugin.settings.debugging) console.log("Step CreateTask: Created tasks in vikunja", createdTasksInVikunja); + + let tasksToUpdateInVault = []; + + for (const task of tasksToPushToVikunja) { + const createdTask = createdTasksInVikunja.find((vikunjaTask: ModelsTask) => vikunjaTask.title === task.task.title); + if (!createdTask) { + continue; + } + task.task = createdTask; + tasksToUpdateInVault.push(task); + } + + for (const task of tasksToUpdateInVault) { + if (this.plugin.settings.debugging) console.log("Step CreateTask: Updating task in vault", task); + await this.updateToVault(task); + } + } + + async pullTasksFromVikunjaToVault(localTasks: PluginTask[], vikunjaTasks: ModelsTask[]) { + if (this.plugin.settings.debugging) console.log("Step CreateTask: Pulling tasks from vikunja to vault, vault tasks", localTasks, "vikunja tasks", vikunjaTasks); + + const tasksToPushToVault = vikunjaTasks.filter(task => !localTasks.find(vaultTask => vaultTask.task.id === task.id)); + if (this.plugin.settings.debugging) console.log("Step CreateTask: Pushing tasks to vault", tasksToPushToVault); + + const createdTasksInVault: PluginTask[] = []; + for (const task of tasksToPushToVault) { + let file: TFile; + const chosenFile = this.app.vault.getFileByPath(this.plugin.settings.chosenOutputFile); + // FIXME This should be the date of the vikunja created date, so the task is created in the correct daily note + const date = moment(); + const dailies = getAllDailyNotes() + + switch (this.plugin.settings.chooseOutputFile) { + case chooseOutputFile.File: + if (!chosenFile) throw new Error("Output file not found"); + file = chosenFile; + break; + case chooseOutputFile.DailyNote: + if (!appHasDailyNotesPluginLoaded()) { + new Notice("Daily notes core plugin is not loaded. So we cannot create daily note. Please install daily notes core plugin. Interrupt now.") + continue; + } + + file = getDailyNote(date, dailies) + if (file == null) { + file = await createDailyNote(date) + } + break; + default: + throw new Error("No valid chooseOutputFile selected"); + } + const pluginTask: PluginTask = { + file: file, + lineno: 0, + task: task + }; + createdTasksInVault.push(pluginTask); + } + + for (const task of createdTasksInVault) { + await this.saveToVault(task); + } + } + } export {Processor};