Browse Source

solved issues when moving tasks

feature/entityId
Stephan Richter 3 months ago
parent
commit
6b6e5f60bc
  1. 11
      core/src/main/java/de/srsoftware/umbrella/core/model/Task.java
  2. 26
      frontend/src/routes/task/ListTask.svelte
  3. 2
      frontend/src/routes/task/TaskList.svelte
  4. 12
      task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java

11
core/src/main/java/de/srsoftware/umbrella/core/model/Task.java

@ -70,6 +70,10 @@ public class Task implements Mappable { @@ -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 { @@ -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;
}
}

26
frontend/src/routes/task/ListTask.svelte

@ -12,6 +12,7 @@ @@ -12,6 +12,7 @@
let {
estimated_time,
show_closed,
siblings,
task
} = $props();
let children = $state(null);
@ -39,34 +40,25 @@ @@ -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 @@ @@ -125,7 +117,7 @@
</script>
{#if !deleted}
<li draggable="true" ondrop={ev => dropAt(ev, task)} ondragover={e => e.preventDefault()} ondragend={e => dragend(e,task)} ondragstart={e => drag(e,task)} class="task {task.status.name.toLowerCase()}">
<li draggable="true" {ondrop} ondragover={e => e.preventDefault()} {ondragstart} class="task {task.status.name.toLowerCase()}">
<LineEditor bind:value={task.name} onclick={openTask} editable={true} onSet={setName} type="a" />
{#if task.estimated_time}
<span class="estimated_time">({+task.estimated_time}&nbsp;h)</span>

2
frontend/src/routes/task/TaskList.svelte

@ -10,6 +10,6 @@ @@ -10,6 +10,6 @@
<ul>
{#each sortedTasks as task}
<ListTask {task} {estimated_time} show_closed={show_closed || task.show_closed} />
<ListTask {task} siblings={tasks} {estimated_time} show_closed={show_closed || task.show_closed} />
{/each}
</ul>

12
task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java

@ -277,12 +277,22 @@ public class TaskModule extends BaseHandler implements TaskService { @@ -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);

Loading…
Cancel
Save