From 275ea93d21721f8abf69baee8a1de2f3bd247c0a Mon Sep 17 00:00:00 2001 From: poanse <50020771+poanse@users.noreply.github.com> Date: Mon, 2 Feb 2026 13:07:55 +0300 Subject: [PATCH] fixes --- src/Context.svelte.ts | 27 +++++++++++++++--- src/ProjectData.svelte.ts | 19 +++++++++---- src/Tooltip.ts | 4 +-- src/components/Button.svelte | 20 +++++++++---- src/components/Connection.svelte | 2 +- src/components/Task.svelte | 17 ++++++----- src/components/TaskmapContainer.svelte | 39 ++++++++++++++++++-------- src/components/Toolbar.svelte | 14 ++++----- src/types.ts | 4 +-- 9 files changed, 101 insertions(+), 45 deletions(-) diff --git a/src/Context.svelte.ts b/src/Context.svelte.ts index 5e6f600..df42b85 100644 --- a/src/Context.svelte.ts +++ b/src/Context.svelte.ts @@ -78,14 +78,35 @@ export class Context { } public isTaskBlocked(taskId: TaskId) { - return this.projectData.blockerPairs.some((p) => p.blocked === taskId); + if (this.projectData.getTask(taskId).status === StatusCode.DONE) { + return false; + } + return this.projectData.blockerPairs + .filter((p) => p.blocked === taskId) + .some( + (p) => + this.projectData.getTask(p.blocker).status !== + StatusCode.DONE, + ); } public isTaskBlocking(taskId: TaskId) { - return this.projectData.blockerPairs.some((p) => p.blocker === taskId); + if (this.projectData.getTask(taskId).status === StatusCode.DONE) { + return false; + } + return this.projectData.blockerPairs + .filter((p) => p.blocker === taskId) + .some( + (p) => + this.projectData.getTask(p.blocked).status !== + StatusCode.DONE, + ); } public isBlockerHighlighted = (taskId: TaskId) => { + if (this.projectData.getTask(taskId).status === StatusCode.DONE) { + return false; + } if (this.chosenBlockedId !== NoTaskId) { return ( this.chosenBlockedId === taskId || @@ -195,7 +216,6 @@ export class Context { public startReparenting(taskId: TaskId) { this.reparentingTaskId = taskId; - this.selectedTaskId = NoTaskId; } public cancelReparenting() { @@ -221,7 +241,6 @@ export class Context { } this.projectData.changeParent(this.reparentingTaskId, newParentId); this.updateTaskPositions(); - this.cancelReparenting(); } public changeFocusedTask(taskId: TaskId): void { diff --git a/src/ProjectData.svelte.ts b/src/ProjectData.svelte.ts index ea5e594..7f5901e 100644 --- a/src/ProjectData.svelte.ts +++ b/src/ProjectData.svelte.ts @@ -61,6 +61,7 @@ export class ProjectData { depth: this.getTask(parentId).depth + 1, }); this.curTaskId++; + this.recalculateStatusRecursive(parentId); return id; } @@ -73,14 +74,17 @@ export class ProjectData { t.parentId = parentTask.taskId; t.depth = parentTask.depth + 1; }); - this.recalcPriorities(this.getTask(id).parentId); + this.recalcPriorities(task.parentId); + this.recalculateStatusRecursive(task.parentId); } public removeTaskBranch(id: number) { this.getDescendantIds(id).forEach( (taskId) => (this.getTask(taskId).deleted = true), ); - this.recalcPriorities(this.getTask(id).parentId); + const parentId = this.getTask(id).parentId; + this.recalcPriorities(parentId); + this.recalculateStatusRecursive(parentId); } public getDescendantIds(taskId: number, includeDeleted: boolean = false) { @@ -161,10 +165,12 @@ export class ProjectData { this.recalculateStatusRecursive(task.parentId); } - public changeParent(taskId: TaskId, parentId: TaskId) { + public changeParent(taskId: TaskId, newParentId: TaskId) { const taskData = this.getTask(taskId); - taskData.parentId = parentId; - this.recalculateStatusRecursive(parentId); + const oldParentId = taskData.parentId; + taskData.parentId = newParentId; + this.recalculateStatusRecursive(oldParentId); + this.recalculateStatusRecursive(newParentId); [taskId, ...this.getDescendantIds(taskId)].forEach((taskId) => { const task = this.getTask(taskId); task.depth = this.getTask(task.parentId).depth + 1; @@ -185,6 +191,9 @@ export class ProjectData { public calculateStatus(taskId: TaskId) { const children = this.getChildren(taskId).map((x) => this.getTask(x)); + if (children.length === 0) { + return this.getTask(taskId).status; + } const counts = [0, 0, 0, 0]; children.forEach((t) => (counts[t.status] += 1)); if (counts[StatusCode.DONE] == children.length) { diff --git a/src/Tooltip.ts b/src/Tooltip.ts index 0ced271..2177ff4 100644 --- a/src/Tooltip.ts +++ b/src/Tooltip.ts @@ -34,13 +34,13 @@ export function getTooltipText(code: IconCode) { return "Add blocker task"; case IconCode.LOCK: return "Block another task"; - case IconCode.REMOVE: + case IconCode.REMOVE_SUBMENU: return "Remove"; case IconCode.REMOVE_SINGLE: return "Remove single task"; case IconCode.REMOVE_MULTIPLE: return "Remove task branch"; - case IconCode.STATUS: + case IconCode.STATUS_SUBMENU: return "Status"; case IconCode.STATUS_DRAFT: return "Draft"; diff --git a/src/components/Button.svelte b/src/components/Button.svelte index 06429dd..889341d 100644 --- a/src/components/Button.svelte +++ b/src/components/Button.svelte @@ -25,7 +25,13 @@ let isPressedDown = $state(false); let isPressed = $derived(context.pressedButtonCode == iconCode); - const stateful = [IconCode.REMOVE, IconCode.STATUS, IconCode.KEY, IconCode.LOCK].contains(iconCode); + const stateful = [ + IconCode.REMOVE_SUBMENU, + IconCode.STATUS_SUBMENU, + IconCode.KEY, + IconCode.LOCK, + IconCode.REPARENT + ].contains(iconCode); function onpointerdown(event: MouseEvent) { isPressedDown = true; @@ -41,6 +47,7 @@ (context.isReparentingOn() && [IconCode.LOCK, IconCode.KEY].contains(iconCode)) || (context.chosenBlockerId !== NoTaskId && [IconCode.REPARENT].contains(iconCode)) || (context.chosenBlockedId !== NoTaskId && [IconCode.REPARENT].contains(iconCode)) + || (iconCode === IconCode.STATUS_DONE && context.isTaskBlocked(context.selectedTaskId)) ); function onpointerup(event: MouseEvent) { @@ -88,7 +95,7 @@ let classString = $derived(` ${(isPressed && !isButtonDisabled) ? 'is-pressed-up ': ''} ${(isPressedDown && !isButtonDisabled) ? 'is-pressed-down ': '' } - ${iconCode === IconCode.STATUS ? classStringFromStatusCode(context.toolbarStatus) + ' ': ""} + ${iconCode === IconCode.STATUS_SUBMENU ? classStringFromStatusCode(context.toolbarStatus) + ' ': ""} `); @@ -116,10 +123,10 @@ - {:else if iconCode === IconCode.REMOVE} + {:else if iconCode === IconCode.REMOVE_SUBMENU} {:else if iconCode === IconCode.KEY} - + {:else if iconCode === IconCode.LOCK} {:else if iconCode === IconCode.REPARENT} @@ -128,7 +135,7 @@ {:else if iconCode === IconCode.CREATE_LINKED_NOTE} - {:else if iconCode === IconCode.STATUS} + {:else if iconCode === IconCode.STATUS_SUBMENU} {:else if iconCode === IconCode.STATUS_DRAFT} @@ -202,6 +209,9 @@ :global(svg) { stroke: grey; } + :global(svg.done) { + stroke: color-mix(in srgb, #30623E 100%, #000000 50%); + } } .button:hover:not(.disabled){ diff --git a/src/components/Connection.svelte b/src/components/Connection.svelte index 4a71651..faaf2a4 100644 --- a/src/components/Connection.svelte +++ b/src/components/Connection.svelte @@ -32,7 +32,7 @@ let midX = $derived( isBlockerConnection ? (context.chosenBlockerId !== NoTaskId - ? endPoint.x + (isStartTaskDepthLE(startTaskId, endTaskId) ? -1 : 1) * (ParentToChildHorizontalShift - TASK_SIZE.width) / 2 + ? endPoint.x + (isStartTaskDepthLE(endTaskId, startTaskId) ? 1 : -1) * (ParentToChildHorizontalShift - TASK_SIZE.width) / 2 : startPoint.x + (isStartTaskDepthLE(startTaskId, endTaskId) ? 1 : -1) * (ParentToChildHorizontalShift - TASK_SIZE.width) / 2 ) : (startPoint.x + endPoint.x) / 2 diff --git a/src/components/Task.svelte b/src/components/Task.svelte index f21ff7f..2e3b5b7 100644 --- a/src/components/Task.svelte +++ b/src/components/Task.svelte @@ -156,21 +156,24 @@ && !(context.chosenBlockerId !== NoTaskId)} {/if} - {#if context.isTaskBlocking(taskId) && taskData.status !== StatusCode.DONE} + {#if context.isTaskBlocking(taskId)}
- +
{/if} - {#if context.isTaskBlocked(taskId) && taskData.status !== StatusCode.DONE} + {#if context.isTaskBlocked(taskId)}
{/each} - + + + + + + + + + + + + + + {#if context.chosenBlockerId !== NoTaskId || context.chosenBlockedId !== NoTaskId} {#each (context.projectData.blockerPairs.filter( p => p.blocker === context.chosenBlockerId || p.blocked === context.chosenBlockedId + ).filter( + p => context.projectData.getTask(p.blocked).status !== StatusCode.DONE + && context.projectData.getTask(p.blocker).status !== StatusCode.DONE )) as pair} - + {#if context.selectedTaskId !== -1} {#key context.selectedTaskId} diff --git a/src/components/Toolbar.svelte b/src/components/Toolbar.svelte index 6fc22f5..59207e8 100644 --- a/src/components/Toolbar.svelte +++ b/src/components/Toolbar.svelte @@ -33,16 +33,16 @@ let toolbarButtons = $derived(taskId == RootTaskId ? [ IconCode.CREATE_LINKED_NOTE, IconCode.FOCUS, - IconCode.STATUS + IconCode.STATUS_SUBMENU ] : [ IconCode.CREATE_LINKED_NOTE, - IconCode.REMOVE, + IconCode.REMOVE_SUBMENU, IconCode.REPARENT, IconCode.KEY, IconCode.LOCK, IconCode.FOCUS, - IconCode.STATUS + IconCode.STATUS_SUBMENU ]); let removeButtons = [ @@ -86,13 +86,13 @@ {/each} {/key} - {#if context.pressedButtonCode === IconCode.REMOVE} + {#if context.pressedButtonCode === IconCode.REMOVE_SUBMENU}
{#key context.updateOnZoomCounter} @@ -102,13 +102,13 @@
{/if} - {#if context.pressedButtonCode === IconCode.STATUS} + {#if context.pressedButtonCode === IconCode.STATUS_SUBMENU}
{#key context.updateOnZoomCounter} diff --git a/src/types.ts b/src/types.ts index bb9fa39..b37efd6 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,13 +1,13 @@ import type { EasingFunction } from "svelte/transition"; export enum IconCode { - REMOVE, + REMOVE_SUBMENU, KEY, LOCK, FOCUS, REPARENT, CREATE_LINKED_NOTE, - STATUS, + STATUS_SUBMENU, REMOVE_SINGLE, REMOVE_MULTIPLE, STATUS_DRAFT,