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 046972e..4b9c4f2 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 @@ -164,7 +164,10 @@ public class Task implements Mappable { case NAME: name = json.getString(key); break; case NO_INDEX: noIndex = json.getBoolean(NO_INDEX); break; case PARENT_TASK_ID: parentTaskId = json.getLong(PARENT_TASK_ID); break; - case REQUIRED_TASKS_IDS: requiredTasksIds.addAll(json.getJSONArray(REQUIRED_TASKS_IDS).toList().stream().map(entry -> Long.parseLong(entry.toString())).toList()); break; + case REQUIRED_TASKS_IDS: + requiredTasksIds.clear(); + requiredTasksIds.addAll(json.getJSONArray(REQUIRED_TASKS_IDS).toList().stream().map(entry -> Long.parseLong(entry.toString())).toList()); + break; case SHOW_CLOSED: showClosed = json.getBoolean(SHOW_CLOSED); break; case START_DATE: start = json.isNull(START_DATE) || json.getString(START_DATE).isBlank() ? null : LocalDate.parse(json.getString(START_DATE)); break; case STATUS: status = json.getInt(key); break; diff --git a/frontend/src/routes/task/RequiredTasks.svelte b/frontend/src/routes/task/RequiredTasks.svelte index 24b8b4d..3ad719d 100644 --- a/frontend/src/routes/task/RequiredTasks.svelte +++ b/frontend/src/routes/task/RequiredTasks.svelte @@ -22,20 +22,14 @@ error = null; let newTask = await resp.json(); if (newTask.project_id != task.project_id){ - alert('prject mismatch!'); + alert('project mismatch!'); return; } task.required_tasks_ids.push(new_task_id); requiredTasks[new_task_id] = newTask; - url = api(`task/${task.id}`); - resp = await fetch(url,{ - credentials : 'include', - method : 'PATCH', - body : JSON.stringify({required_tasks_ids:task.required_tasks_ids}) - }); + await patch(); delete candidates[new_task_id]; - } - if (!resp.ok) { + } else { error = await resp.text(); } } @@ -90,6 +84,24 @@ return false; } + async function patch(){ + const url = api(`task/${task.id}`); + const resp = await fetch(url,{ + credentials : 'include', + method : 'PATCH', + body : JSON.stringify({required_tasks_ids:task.required_tasks_ids}) + }); + if (!resp.ok){ + error = await resp.text(); + } + } + + async function unlink(required_task){ + task.required_tasks_ids = task.required_tasks_ids.filter(item => item != required_task.id); + patch(); + delete requiredTasks[required_task.id]; + } + onMount(loadTasks); @@ -97,7 +109,7 @@ diff --git a/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java b/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java index 1a47e97..99b4b7e 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java @@ -316,9 +316,19 @@ CREATE TABLE IF NOT EXISTS {0} ( task.clean(MEMBERS); } if (task.isDirty(REQUIRED_TASKS_IDS)) { - var query = replaceInto(TABLE_TASK_DEPENDENCIES,TASK_ID,REQUIRED_TASK_ID); - for (var reqId : task.requiredTasksIds()) query.values(task.id(),reqId); - query.execute(db).close(); + var dropQuery = Query.delete().from(TABLE_TASK_DEPENDENCIES).where(TASK_ID,equal(task.id())); + if (!task.requiredTasksIds().isEmpty()){ + dropQuery.where(REQUIRED_TASK_ID,notIn(task.requiredTasksIds().toArray())); + db.setAutoCommit(false); + } + dropQuery.execute(db); + if (!task.requiredTasksIds().isEmpty()) { + var addQuery = replaceInto(TABLE_TASK_DEPENDENCIES, TASK_ID, REQUIRED_TASK_ID); + for (var reqId : task.requiredTasksIds()) addQuery.values(task.id(), reqId); + addQuery.execute(db).close(); + db.setAutoCommit(true); + } + task.clean(REQUIRED_TASKS_IDS); } if (task.isDirty()) {