From c4036d0ae20ba653829c170eb87dc761e26151dc Mon Sep 17 00:00:00 2001 From: poanse <50020771+poanse@users.noreply.github.com> Date: Sun, 3 May 2026 00:28:25 +0300 Subject: [PATCH] fixed multiview bug and task name typing bug --- src/Context.svelte.ts | 9 +------ src/TaskmapView.ts | 5 +++- src/data/Action.ts | 5 ++-- src/data/HistoryManager.svelte.ts | 3 --- src/data/ProjectData.svelte.ts | 41 ++++++++++++++++++------------- src/data/VersionedData.ts | 6 ++++- 6 files changed, 36 insertions(+), 33 deletions(-) diff --git a/src/Context.svelte.ts b/src/Context.svelte.ts index ded66e5..df4177e 100644 --- a/src/Context.svelte.ts +++ b/src/Context.svelte.ts @@ -263,6 +263,7 @@ export class Context { this.versionedData.changeParent(this.reparentingTaskId, newParentId); this.updateTaskPositions(); this.cancelReparenting(); + this.selectedTaskId = NoTaskId; } public changeFocusedTask(taskId: TaskId): void { @@ -454,14 +455,6 @@ export class Context { this.save(); } - public hideTaskBranch(id: number) { - this.versionedData.setHidden(id, true); - } - - public unhideTaskBranch(id: number) { - this.versionedData.setHidden(id, false); - } - public getCurrentTaskPosition(taskId: number) { return this.taskPositions.find((t) => t.taskId === taskId)!.tween! .current; diff --git a/src/TaskmapView.ts b/src/TaskmapView.ts index dfeec32..7f3e9e4 100644 --- a/src/TaskmapView.ts +++ b/src/TaskmapView.ts @@ -73,7 +73,10 @@ export class TaskmapView extends TextFileView { protected onOpen(): Promise { this.registerEvent( this.app.vault.on("modify", async (file) => { - if (file.path === this.file?.path) { + if ( + file.path === this.file?.path && + this.app.workspace.getActiveViewOfType(TaskmapView) != this + ) { await this.refreshUi(false); } }), diff --git a/src/data/Action.ts b/src/data/Action.ts index 01329f9..d75accf 100644 --- a/src/data/Action.ts +++ b/src/data/Action.ts @@ -38,7 +38,7 @@ export class AddTaskAction implements Action { if (data.curTaskId != this.addedTaskId + 1) { throw new Error(); } - data.removeTask(this.addedTaskId); + data.removeTask(); this.addedTaskId = undefined; } } @@ -68,9 +68,9 @@ export class RemoveTaskSingleAction implements Action { t.parentId = parentTask.taskId; t.depth = parentTask.depth + 1; }); - // TODO: Priorities suck data.recalcPriorities(task.parentId); data.recalcStatusRecursive(task.parentId); + data.markTasksUpdated(); } undo(data: ProjectData) { @@ -84,7 +84,6 @@ export class RemoveTaskSingleAction implements Action { t.parentId = task.taskId; t.depth = task.depth + 1; }); - // TODO: Priorities suck data.recalcPriorities(task.parentId); data.recalcPriorities(task.taskId); data.recalcStatusRecursive(task.taskId); diff --git a/src/data/HistoryManager.svelte.ts b/src/data/HistoryManager.svelte.ts index 98ecb13..91b4652 100644 --- a/src/data/HistoryManager.svelte.ts +++ b/src/data/HistoryManager.svelte.ts @@ -7,7 +7,6 @@ export class HistoryManager { execute(action: Action, data: ProjectData): void { action.do(data); - data.markTasksUpdated(); this.undoStack.push(action); this.redoStack = []; // Clear redo stack on new action } @@ -17,7 +16,6 @@ export class HistoryManager { if (!action) return false; action.undo(data); - data.markTasksUpdated(); this.redoStack.push(action); return true; } @@ -27,7 +25,6 @@ export class HistoryManager { if (!action) return false; action.do(data); - data.markTasksUpdated(); this.undoStack.push(action); return true; } diff --git a/src/data/ProjectData.svelte.ts b/src/data/ProjectData.svelte.ts index 3142680..a4d7e70 100644 --- a/src/data/ProjectData.svelte.ts +++ b/src/data/ProjectData.svelte.ts @@ -9,12 +9,14 @@ import { NoTaskId, RootTaskId } from "../NodePositionsCalculator"; import type { ProjectFileParsed } from "./ProjectDataSchema"; export class ProjectData { - tasks = new SvelteMap(); + // cannot use just SvelteMap because it breaks reactivity + tasks: Array; + taskIndexCache = new SvelteMap(); childrenCache = new SvelteMap(); ancestorsCache = new SvelteMap(); descendantsCache = new SvelteMap(); - tasksVersion = $state(0); - blockerPairs = $state(new Array()); + tasksVersion: number; + blockerPairs: Array; folderPath: string | undefined; curTaskId = RootTaskId; @@ -28,16 +30,15 @@ export class ProjectData { } constructor(obj: ProjectFileParsed) { - this.tasks = new SvelteMap( - obj.tasks.map((task) => [task.taskId, task]), - ); - if (this.tasks.size == 0) { + this.tasks = $state(obj.tasks); + this.blockerPairs = $state(obj.blockerPairs ?? []); + this.tasksVersion = $state(0); + this.folderPath = obj.folderPath; + this.curTaskId = obj.curTaskId; + if (this.tasks.length == 0) { this.addRootTask(); } this.rebuildCaches(); - this.blockerPairs = obj.blockerPairs ?? []; - this.folderPath = obj.folderPath; - this.curTaskId = obj.curTaskId; } public markTasksUpdated() { @@ -45,6 +46,10 @@ export class ProjectData { } private rebuildCaches() { + this.taskIndexCache.clear(); + this.tasks.forEach((value, index) => { + this.taskIndexCache.set(value.taskId, index); + }); // Order matters: descendants rely on ancestors, and ancestors rely on children. this.rebuildChildrenCache(); this.rebuildAncestorsCache(); @@ -103,17 +108,19 @@ export class ProjectData { } public addTask(task: TaskData) { - this.tasks.set(task.taskId, task); + this.tasks.push(task); this.rebuildCaches(); this.markTasksUpdated(); this.curTaskId++; } - public removeTask(taskId: TaskId) { - this.tasks.delete(taskId); - this.rebuildCaches(); - this.markTasksUpdated(); - this.curTaskId--; + public removeTask() { + const task = this.tasks.pop(); + if (task) { + this.rebuildCaches(); + this.markTasksUpdated(); + this.curTaskId--; + } } public addRootTask() { @@ -159,7 +166,7 @@ export class ProjectData { } public getTask(taskId: number) { - const res = this.tasks.get(taskId); + const res = this.tasks[this.taskIndexCache.get(taskId)!]; if (res) { return res; } else { diff --git a/src/data/VersionedData.ts b/src/data/VersionedData.ts index ac338d1..924d2ae 100644 --- a/src/data/VersionedData.ts +++ b/src/data/VersionedData.ts @@ -145,7 +145,11 @@ export class VersionedData { }; public getTaskOption = (taskId: TaskId) => { - return this.data.tasks.get(taskId); + try { + return this.data.getTask(taskId); + } catch { + return undefined; + } }; public getChildren = (taskId: TaskId, includeDeleted?: boolean) => {