solved issues when moving tasks
This commit is contained in:
@@ -70,6 +70,10 @@ public class Task implements Mappable {
|
|||||||
return estimatedTime;
|
return estimatedTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasMember(UmbrellaUser user) {
|
||||||
|
return members.containsKey(user.id());
|
||||||
|
}
|
||||||
|
|
||||||
public long id(){
|
public long id(){
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
@@ -215,8 +219,9 @@ public class Task implements Mappable {
|
|||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasMember(UmbrellaUser user) {
|
|
||||||
return members.containsKey(user.id());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
let {
|
let {
|
||||||
estimated_time,
|
estimated_time,
|
||||||
show_closed,
|
show_closed,
|
||||||
|
siblings,
|
||||||
task
|
task
|
||||||
} = $props();
|
} = $props();
|
||||||
let children = $state(null);
|
let children = $state(null);
|
||||||
@@ -39,34 +40,25 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function drag(ev,task){
|
function ondragstart(ev){
|
||||||
ev.stopPropagation();
|
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();
|
ev.stopPropagation();
|
||||||
if (dragged.element.id == target.id) return;
|
if (dragged.element.id == task.id) return;
|
||||||
const url = api(`task/${dragged.element.id}`);
|
const url = api(`task/${dragged.element.id}`);
|
||||||
const resp = await fetch(url,{
|
const resp = await fetch(url,{
|
||||||
credentials : 'include',
|
credentials : 'include',
|
||||||
method : 'PATCH',
|
method : 'PATCH',
|
||||||
body : JSON.stringify({ parent_task_id : target.id})
|
body : JSON.stringify({ parent_task_id : task.id})
|
||||||
});
|
});
|
||||||
if (resp.ok) {
|
if (resp.ok) {
|
||||||
dragged.moved = true;
|
|
||||||
children[dragged.element.id]=dragged.element;
|
children[dragged.element.id]=dragged.element;
|
||||||
|
if (dragged.siblings[dragged.element.id]) delete dragged.siblings[dragged.element.id];
|
||||||
} else {
|
} else {
|
||||||
error = await resp.text();
|
error = await resp.text();
|
||||||
}
|
}
|
||||||
@@ -125,7 +117,7 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#if !deleted}
|
{#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" />
|
<LineEditor bind:value={task.name} onclick={openTask} editable={true} onSet={setName} type="a" />
|
||||||
{#if task.estimated_time}
|
{#if task.estimated_time}
|
||||||
<span class="estimated_time">({+task.estimated_time} h)</span>
|
<span class="estimated_time">({+task.estimated_time} h)</span>
|
||||||
|
|||||||
@@ -10,6 +10,6 @@
|
|||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
{#each sortedTasks as task}
|
{#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}
|
{/each}
|
||||||
</ul>
|
</ul>
|
||||||
@@ -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(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(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(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));
|
taskDb.save(task.patch(json));
|
||||||
|
|
||||||
return sendContent(ex,task);
|
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 {
|
private boolean postNewTask(UmbrellaUser user, HttpExchange ex) throws IOException {
|
||||||
var json = json(ex);
|
var json = json(ex);
|
||||||
if (!(json.has(PROJECT_ID) && json.get(PROJECT_ID) instanceof Number pid)) throw missingFieldException(PROJECT_ID);
|
if (!(json.has(PROJECT_ID) && json.get(PROJECT_ID) instanceof Number pid)) throw missingFieldException(PROJECT_ID);
|
||||||
|
|||||||
Reference in New Issue
Block a user