implemented selector for parent task

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2026-05-14 00:32:10 +02:00
parent 9bec33d5de
commit ccf8fc2089
11 changed files with 139 additions and 20 deletions
@@ -2,6 +2,7 @@
package de.srsoftware.umbrella.task;
import static de.srsoftware.tools.Optionals.is0;
import static de.srsoftware.tools.jdbc.Condition.*;
import static de.srsoftware.tools.jdbc.Query.*;
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
@@ -236,7 +237,7 @@ CREATE TABLE IF NOT EXISTS {0} (
public Map<Long, Task> listProjectTasks(Long projectId, Long parentTaskId, boolean noIndex) throws UmbrellaException {
try {
var query = select(ALL).from(TABLE_TASKS).where(PROJECT_ID,equal(projectId));
if (parentTaskId != 0) query.where(PARENT_TASK_ID,equal(parentTaskId));
if (!is0(parentTaskId)) query.where(PARENT_TASK_ID,equal(parentTaskId));
if (!noIndex) query.where(NO_INDEX,notIn(1));
var tasks = new HashMap<Long,Task>();
var rs = query.exec(db);
@@ -32,6 +32,7 @@ import de.srsoftware.tools.SessionToken;
import de.srsoftware.umbrella.core.BaseHandler;
import de.srsoftware.umbrella.core.ModuleRegistry;
import de.srsoftware.umbrella.core.api.*;
import de.srsoftware.umbrella.core.constants.Field;
import de.srsoftware.umbrella.core.constants.Text;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.core.model.*;
@@ -110,8 +111,11 @@ public class TaskModule extends BaseHandler implements TaskService {
case null -> getUserTasks(user.get(), ex);
default -> {
var taskId = Long.parseLong(head);
head = path.pop();
yield head == null ? getTask(ex, taskId, user.get()) : super.doGet(path, ex);
yield switch (path.pop()){
case null -> getTask(ex,taskId,user.get());
case PARENT_CANDIDATES -> getParentCandidates(ex,taskId, user.get());
default -> super.doGet(path,ex);
};
}
};
} catch (UmbrellaException e) {
@@ -188,6 +192,33 @@ public class TaskModule extends BaseHandler implements TaskService {
return sendContent(ex, result);
}
private boolean getParentCandidates(HttpExchange ex, long taskId, UmbrellaUser user) throws IOException {
var task = taskDb.load(taskId);
var project = projectService().load(task.projectId());
var projectTasks = taskDb.listProjectTasks(project.id(),null, false);
var mapped = projectTasks.values().stream().collect(Collectors.toMap(Task::id,Task::toMap));
var roots = new HashMap<Long,Map<String,Object>>();
for (var map : mapped.values()){
if (!(map.get(ID) instanceof Long id)) continue;
if (id == taskId) continue;
if (map.get(PARENT_TASK_ID) instanceof Long parentId) {
var parent = mapped.get(parentId);
if (parent != null) {
var o = parent.get(Field.CHILDREN);
Map<Long,Object> children;
if (o == null) {
children = new HashMap<>();
parent.put(Field.CHILDREN,children);
} else children = (Map<Long, Object>) o;
children.put(id, map);
}
} else {
roots.put(id, map);
}
}
return sendContent(ex,roots);
}
private boolean getPermissionList(HttpExchange ex) throws IOException {
var map = new HashMap<Integer, String>();
for (var permission : Permission.values()) map.put(permission.code(),permission.name());
@@ -293,7 +324,7 @@ public class TaskModule extends BaseHandler implements TaskService {
Task parent = taskMap.get(task.parentTaskId());
var trunk = placeInTree(parent, taskTree, taskMap);
@SuppressWarnings("unchecked")
ArrayList<Object> children = (ArrayList<Object>) trunk.computeIfAbsent(CHILDREN, k -> new ArrayList<>());
ArrayList<Object> children = (ArrayList<Object>) trunk.computeIfAbsent(Field.CHILDREN, k -> new ArrayList<>());
children.add(mappedTask);
return mappedTask;
}