From 167365d0b3cc4d2723d610b783a34c6f2200b6f2 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Wed, 1 Jul 2026 15:51:55 +0200 Subject: [PATCH] implemented member editing on creating new tasks Signed-off-by: Stephan Richter --- frontend/src/routes/task/Add.svelte | 23 +++++-------- .../srsoftware/umbrella/task/TaskModule.java | 33 ++++++++----------- 2 files changed, 22 insertions(+), 34 deletions(-) diff --git a/frontend/src/routes/task/Add.svelte b/frontend/src/routes/task/Add.svelte index bdaede4b..6cb1d41e 100644 --- a/frontend/src/routes/task/Add.svelte +++ b/frontend/src/routes/task/Add.svelte @@ -51,25 +51,21 @@ } async function load(){ - console.log({assignee}); if (parent_task_id) await loadParent(); - if (project_id) await loadProject(); + if (project_id) loadProject(); if (state_id) task.status = { code : +state_id }; - await loadTags(); - console.log({task:JSON.parse(JSON.stringify(task))}); + loadTags(); } async function loadParent(){ - console.log('loading parent task with id = '+parent_task_id); const url = api(`task/${parent_task_id}`); const resp = await get(url); if (resp.ok){ parent_task = await resp.json(); - console.log(JSON.parse(JSON.stringify(parent_task))); task.parent_task_id = +parent_task_id; for (let [uid, member] of Object.entries(parent_task.members)){ + if (['OWNER','ASSIGNEE'].includes(member.permission.name)) member.permission = { name: 'EDIT', code: 2 }; task.members[uid] = member; - console.log('added member from parent task to new task: '+member.user.name+' ('+member.permission.name+')'); } project_id = +parent_task.project_id; yikes(); @@ -78,17 +74,15 @@ } async function loadProject(){ - console.log('loading project '+project_id); const url = api(`project/${project_id}`); const resp = await get(url); if (resp.ok){ project = await resp.json(); - console.log(JSON.parse(JSON.stringify(project))); task.project_id = +project_id; if (Object.keys(task.members).length < 1) { for (let [uid, member] of Object.entries(project.members)){ + if (['OWNER','ASSIGNEE'].includes(member.permission.name)) member.permission = { name: 'EDIT', code: 2 }; task.members[uid] = member; - console.log('added member from project to new task: '+member.user.name+' ('+member.permission.name+')'); } } if (assignee && project.members[assignee]){ @@ -103,11 +97,9 @@ } async function loadTags(){ - let url = null; if (project_id) url = api(`tags/project/${project_id}`); if (parent_task_id) url = api(`tags/task/${parent_task_id}`); - console.log('loading tags: ',url); if (url) { const resp = await get(url); if (resp.ok) task.tags = await resp.json(); @@ -122,7 +114,6 @@ } async function saveTask(){ - console.log({task:JSON.parse(JSON.stringify(task))}); const url = api('task/add'); const resp = await post(url,task); if (resp.ok) { @@ -143,6 +134,10 @@ extendedSettings = !extendedSettings; } + function updatePermission(uid,perm){ + task.members[uid].permission = perm; + } + onMount(load); @@ -180,7 +175,7 @@ {#if extendedSettings}
{t('members')}
- +
{t('estimated_time')}
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 1e49f5a7..a7071e29 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java @@ -386,40 +386,33 @@ public class TaskModule extends BaseHandler implements TaskService { long projectId = pid.longValue(); var project = projectService().load(projectId); projectService().loadMembers(List.of(project)); - var members = project.members(); - var member = members.get(user.id()); + var parentMembers = project.members(); + var member = parentMembers.get(user.id()); if (member == null || member.permission() == READ_ONLY) throw forbidden("You are not allowed to create new tasks in this project"); var parentTask = json.has(PARENT_TASK_ID) && json.get(PARENT_TASK_ID) instanceof Number par ? taskService().load(Set.of(par.longValue())).get(par.longValue()) : null; if (parentTask != null) { taskService().loadMembers(parentTask); - members = parentTask.members(); - member = members.get(user.id()); + parentMembers = parentTask.members(); + member = parentMembers.get(user.id()); if (member == null || member.permission() == READ_ONLY) throw forbidden("You are not allowed to add sub-stasks to {object}", OBJECT, parentTask.name()); } var newMembers = new HashMap(); - for (var mem : members.values()) { // Assign members from project or parent task - var permission = mem.permission() == OWNER ? EDIT : mem.permission(); - newMembers.put(mem.user().id(), permission); - } - - if (json.has(MEMBERS) && json.get(MEMBERS) instanceof JSONObject mems) { - // check of assignee has been set by client - for (var k : mems.keySet()) { - try { - var userId = Long.parseLong(k); - var permName = mems.getJSONObject(k).getJSONObject(PERMISSION).getString(NAME); - if (Permission.valueOf(permName) == ASSIGNEE) newMembers.put(userId, ASSIGNEE); - } catch (Exception ignored) { - LOG.log(WARNING, "Failed to parse {0}", mems.get(k)); - } + if (json.has(MEMBERS) && json.get(MEMBERS) instanceof JSONObject members) { + for (var key : members.keySet()){ + var code = members.getJSONObject(key).getJSONObject(PERMISSION).getInt(CODE); + var perm = Permission.of(code); + if (perm == OWNER) perm = EDIT; + var userId = Long.parseLong(key); + if (!parentMembers.containsKey(userId)) throw forbidden("{user} is not a member of {path}",Field.USER,userService().loadUser(userId).name(),Field.PATH, parentTask == null ? project.name() : parentTask.name()); + newMembers.put(userId,perm); } } + // set ownership to current user newMembers.put(user.id(), OWNER); - json.put(MEMBERS, Map.of()); // reset member map for task-to-be-created Task task = Task.of(json); if (parentTask != null && parentTask.dueDate() != null && task.dueDate() == null) task.dueDate(parentTask.dueDate());