From 6b6e5f60bc6c56cc772f5890272b84ab10e39a6e Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Thu, 31 Jul 2025 08:41:40 +0200 Subject: [PATCH] solved issues when moving tasks --- .../srsoftware/umbrella/core/model/Task.java | 11 +++++--- frontend/src/routes/task/ListTask.svelte | 26 +++++++------------ frontend/src/routes/task/TaskList.svelte | 2 +- .../srsoftware/umbrella/task/TaskModule.java | 12 ++++++++- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/Task.java b/core/src/main/java/de/srsoftware/umbrella/core/model/Task.java index 7f12551..50cff3d 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/model/Task.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/model/Task.java @@ -70,6 +70,10 @@ public class Task implements Mappable { return estimatedTime; } + public boolean hasMember(UmbrellaUser user) { + return members.containsKey(user.id()); + } + public long id(){ return id; } @@ -215,8 +219,9 @@ public class Task implements Mappable { return map; } - public boolean hasMember(UmbrellaUser user) { - return members.containsKey(user.id()); - } + @Override + public String toString() { + return name; + } } diff --git a/frontend/src/routes/task/ListTask.svelte b/frontend/src/routes/task/ListTask.svelte index d9ef8b6..a06957f 100644 --- a/frontend/src/routes/task/ListTask.svelte +++ b/frontend/src/routes/task/ListTask.svelte @@ -12,6 +12,7 @@ let { estimated_time, show_closed, + siblings, task } = $props(); let children = $state(null); @@ -39,34 +40,25 @@ } } - function drag(ev,task){ + function ondragstart(ev){ ev.stopPropagation(); - task.new_parent = false; - dragged.element = task; + dragged.element = task; + dragged.siblings = siblings; } - function dragend(ev,task){ - ev.stopPropagation(); - setTimeout(() => { - if (dragged.moved){ - console.log("removing",ev.target); - ev.target.remove(); - } - },500); - } - async function dropAt(ev,target){ + async function ondrop(ev){ ev.stopPropagation(); - if (dragged.element.id == target.id) return; + if (dragged.element.id == task.id) return; const url = api(`task/${dragged.element.id}`); const resp = await fetch(url,{ credentials : 'include', method : 'PATCH', - body : JSON.stringify({ parent_task_id : target.id}) + body : JSON.stringify({ parent_task_id : task.id}) }); if (resp.ok) { - dragged.moved = true; children[dragged.element.id]=dragged.element; + if (dragged.siblings[dragged.element.id]) delete dragged.siblings[dragged.element.id]; } else { error = await resp.text(); } @@ -125,7 +117,7 @@ {#if !deleted} -
  • dropAt(ev, task)} ondragover={e => e.preventDefault()} ondragend={e => dragend(e,task)} ondragstart={e => drag(e,task)} class="task {task.status.name.toLowerCase()}"> +
  • e.preventDefault()} {ondragstart} class="task {task.status.name.toLowerCase()}"> {#if task.estimated_time} ({+task.estimated_time} h) diff --git a/frontend/src/routes/task/TaskList.svelte b/frontend/src/routes/task/TaskList.svelte index acedbf1..d6e9122 100644 --- a/frontend/src/routes/task/TaskList.svelte +++ b/frontend/src/routes/task/TaskList.svelte @@ -10,6 +10,6 @@
      {#each sortedTasks as task} - + {/each}
    \ No newline at end of file diff --git a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java index 6a2aada..a50e034 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java @@ -277,12 +277,22 @@ public class TaskModule extends BaseHandler implements TaskService { if (json.has(DROP_MEMBER) && json.get(DROP_MEMBER) instanceof Number id) dropMember(task,id.longValue()); if (json.has(MEMBERS) && json.get(MEMBERS) instanceof JSONObject memberJson) patchMembers(task,memberJson); if (json.has(NEW_MEMBER) && json.get(NEW_MEMBER) instanceof Number num) addMember(task,num.longValue()); - + if (json.has(PARENT_TASK_ID) && json.get(PARENT_TASK_ID) instanceof Number ptid && newParentIsSubtask(task,ptid.longValue())) throw forbidden("Task must not be sub-task of itself."); taskDb.save(task.patch(json)); return sendContent(ex,task); } + private boolean newParentIsSubtask(Task task, long newParent) { + var parent = taskDb.load(newParent); + while (parent != null){ + if (task.id() == parent.id()) return true; + if (parent.parentTaskId() == null) break; + parent = taskDb.load(parent.parentTaskId()); + } + return false; + } + private boolean postNewTask(UmbrellaUser user, HttpExchange ex) throws IOException { var json = json(ex); if (!(json.has(PROJECT_ID) && json.get(PROJECT_ID) instanceof Number pid)) throw missingFieldException(PROJECT_ID);