From d95f4359f0a701602f15c12403ae356e90fe195c Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Wed, 7 Oct 2026 21:53:50 +0200 Subject: [PATCH 1/3] avoiding markdown rendering when reading task list Signed-off-by: Stephan Richter --- .../de/srsoftware/umbrella/core/constants/Field.java | 1 + .../de/srsoftware/umbrella/core/model/Project.java | 10 +++++++--- frontend/src/routes/task/Index.svelte | 4 ++-- .../de/srsoftware/umbrella/project/ProjectModule.java | 4 +++- .../java/de/srsoftware/umbrella/task/TaskModule.java | 3 ++- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/de/srsoftware/umbrella/core/constants/Field.java b/core/src/main/java/de/srsoftware/umbrella/core/constants/Field.java index 512f19c4..33e16539 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/constants/Field.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/constants/Field.java @@ -139,6 +139,7 @@ public class Field { public static final String RECEIVERS = "receivers"; public static final String REDIRECT = "redirect"; + public static final String RENDER = "render"; public static final String RENDERED = "rendered"; public static final String REQUIRED_TASKS_IDS = "required_tasks_ids"; diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/Project.java b/core/src/main/java/de/srsoftware/umbrella/core/model/Project.java index d4dce056..3f935b6d 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/model/Project.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/model/Project.java @@ -118,8 +118,7 @@ public class Project extends UmbrellaObject { return tagColors; } - @Override - public Map toMap() { + public Map toMap(boolean renderMarkdown){ var memberMap = new HashMap>(); if (members != null) for (var entry : members.entrySet()){ memberMap.put(entry.getKey(),entry.getValue().toMap()); @@ -128,7 +127,7 @@ public class Project extends UmbrellaObject { for (var state : allowedStates) stateMap.put(state.code(),state.name()); return super.map( NAME,name, - DESCRIPTION,mapMarkdown(description), + DESCRIPTION, renderMarkdown ? mapMarkdown(description) : Map.of(SOURCE,description), STATUS,status, COMPANY_ID,companyId, SHOW_CLOSED,showClosed, @@ -137,6 +136,11 @@ public class Project extends UmbrellaObject { TAG_COLORS,tagColors); } + @Override + public Map toMap() { + return toMap(true); + } + @Override public String toString() { return name(); diff --git a/frontend/src/routes/task/Index.svelte b/frontend/src/routes/task/Index.svelte index 7b35428b..3d8fd4d2 100644 --- a/frontend/src/routes/task/Index.svelte +++ b/frontend/src/routes/task/Index.svelte @@ -59,7 +59,7 @@ } async function loadProject(pid){ - const url = api(`project/${pid}`); + const url = api(`project/${pid}?render=false`); const resp = await get(url); if (resp.ok){ projects[pid] = await resp.json(); @@ -67,7 +67,7 @@ } async function load(){ - const url = api(`task?offset=${bounds.offset}&limit=${bounds.limit}`); + const url = api(`task?offset=${bounds.offset}&limit=${bounds.limit}&render=false`); const resp = await get(url); if (resp.ok){ let newTasks = await resp.json(); diff --git a/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java b/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java index 20a5e6eb..09c6d6ef 100644 --- a/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java +++ b/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java @@ -144,9 +144,11 @@ public class ProjectModule extends BaseHandler implements ProjectService { } private boolean getProject(HttpExchange ex, long projectId, UmbrellaUser user) throws IOException, UmbrellaException { + var params = queryParam(ex); + var render = !(params.get(RENDER) instanceof String r) || r.equals("true"); var project = loadMembers(projectDb.load(projectId)); if (!project.hasMember(user)) throw notAmember(t(PROJECT_WITH_ID,ID,project.name())); - var map = project.toMap(); + var map = project.toMap(render); project.companyId().map(companyService()::get).map(Company::toMap).ifPresent(data -> map.put(Field.COMPANY,data)); return sendContent(ex,map); } 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 4863a8fc..1680be5f 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java @@ -280,8 +280,9 @@ public class TaskModule extends BaseHandler implements TaskService { } catch (NumberFormatException e) { throw invalidField(LIMIT, t(Text.NUMBER)); } + var render = !(params.get(RENDER) instanceof String r) || r.equals("true"); var tasks = taskDb.listUserTasks(user.id(), limit, offset, false); - var mapped = loadMembers(tasks).stream().map(Task::toMap); + var mapped = loadMembers(tasks).stream().map(t -> t.toMap(render)); return sendContent(ex, mapped); } From e41932cb9f49e99289a4fc7e70db5b7220ce5a48 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Thu, 8 Oct 2026 00:59:58 +0200 Subject: [PATCH 2/3] avoiding markdown rendering when loading project tasks Signed-off-by: Stephan Richter --- frontend/src/routes/project/Kanban.svelte | 2 +- frontend/src/routes/project/View.svelte | 3 ++- .../main/java/de/srsoftware/umbrella/task/TaskModule.java | 8 ++++---- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/frontend/src/routes/project/Kanban.svelte b/frontend/src/routes/project/Kanban.svelte index 9b37d048..d739b839 100644 --- a/frontend/src/routes/project/Kanban.svelte +++ b/frontend/src/routes/project/Kanban.svelte @@ -190,7 +190,7 @@ const url = api('task/list'); selector.show_closed = true; selector.no_index = true; - selector.rendered = false; + selector.render = false; var resp = await post(url,selector); if (resp.ok){ var json = await resp.json(); diff --git a/frontend/src/routes/project/View.svelte b/frontend/src/routes/project/View.svelte index d3147cd4..b67830fc 100644 --- a/frontend/src/routes/project/View.svelte +++ b/frontend/src/routes/project/View.svelte @@ -108,7 +108,8 @@ const url = api('task/list'); const data = { project_id:+id, - show_closed:project.show_closed + show_closed:project.show_closed, + render: false } const resp = await fetch(url,{ credentials : 'include', 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 1680be5f..a793c49e 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java @@ -475,23 +475,23 @@ public class TaskModule extends BaseHandler implements TaskService { var noIndex = json.has(NO_INDEX) && json.get(NO_INDEX) instanceof Boolean bool ? bool : false; var projectId = json.has(PROJECT_ID) && json.get(PROJECT_ID) instanceof Number number ? number.longValue() : null; var parentTaskId = json.has(PARENT_TASK_ID) && json.get(PARENT_TASK_ID) instanceof Number number ? number.longValue() : null; - var markdown = !json.has(RENDERED) || !(json.get(RENDERED) instanceof Boolean render) || render; + var render = !json.has(RENDER) || !(json.get(RENDER) instanceof Boolean bool) || bool; if (isSet(projectId)) { if (parentTaskId == null) { var list = taskDb.listRootTasks(projectId, user, showClosed); - return sendContent(ex, mapTasks(list,markdown)); + return sendContent(ex, mapTasks(list,render)); } var projectTasks = taskDb.listProjectTasks(projectId, parentTaskId, noIndex); loadMembers(projectTasks.values()); var tags = tagService().getTags(TASK,projectTasks.keySet(),user); projectTasks = addTags(projectTasks, tags); - return sendContent(ex, mapTasks(projectTasks, markdown)); + return sendContent(ex, mapTasks(projectTasks, render)); } if (isSet(parentTaskId)) return sendContent(ex, mapValues(taskDb.listChildrenOf(parentTaskId, user, showClosed))); var taskIds = json.has(IDS) && json.get(IDS) instanceof JSONArray ids ? ids.toList().stream().map(Object::toString).map(Long::parseLong).toList() : null; var tasks = taskDb.load(taskIds); - if (isSet(taskIds)) return sendContent(ex, mapTasks(tasks,markdown)); + if (isSet(taskIds)) return sendContent(ex, mapTasks(tasks,render)); return sendEmptyResponse(HTTP_NOT_IMPLEMENTED, ex); } From d2d534cb14c6a14e1639b90b78f9b9428e0ee500 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Thu, 8 Oct 2026 01:28:00 +0200 Subject: [PATCH 3/3] fixed code so it works for task list in project view Signed-off-by: Stephan Richter --- frontend/src/routes/project/View.svelte | 6 +----- frontend/src/routes/task/ListTask.svelte | 3 ++- .../de/srsoftware/umbrella/task/TaskModule.java | 14 ++++++++------ 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/frontend/src/routes/project/View.svelte b/frontend/src/routes/project/View.svelte index b67830fc..5f7e5363 100644 --- a/frontend/src/routes/project/View.svelte +++ b/frontend/src/routes/project/View.svelte @@ -111,11 +111,7 @@ show_closed:project.show_closed, render: false } - const resp = await fetch(url,{ - credentials : 'include', - method : 'POST', - body : JSON.stringify(data) - }); + const resp = await post(url,data); if (resp.ok){ tasks = {}; est_time.sum = 0; diff --git a/frontend/src/routes/task/ListTask.svelte b/frontend/src/routes/task/ListTask.svelte index 424685bb..1fc1bf01 100644 --- a/frontend/src/routes/task/ListTask.svelte +++ b/frontend/src/routes/task/ListTask.svelte @@ -80,7 +80,8 @@ const url = api('task/list'); const data = { parent_task_id : +task.id, - show_closed : show_closed + show_closed : show_closed, + render : false }; if (task.show_closed) data.show_closed = true; const resp = await post(url,data); 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 a793c49e..ad87152e 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java @@ -475,7 +475,7 @@ public class TaskModule extends BaseHandler implements TaskService { var noIndex = json.has(NO_INDEX) && json.get(NO_INDEX) instanceof Boolean bool ? bool : false; var projectId = json.has(PROJECT_ID) && json.get(PROJECT_ID) instanceof Number number ? number.longValue() : null; var parentTaskId = json.has(PARENT_TASK_ID) && json.get(PARENT_TASK_ID) instanceof Number number ? number.longValue() : null; - var render = !json.has(RENDER) || !(json.get(RENDER) instanceof Boolean bool) || bool; + var render = !json.has(RENDER) || !(json.get(RENDER) instanceof Boolean bool) || bool; if (isSet(projectId)) { if (parentTaskId == null) { var list = taskDb.listRootTasks(projectId, user, showClosed); @@ -488,11 +488,13 @@ public class TaskModule extends BaseHandler implements TaskService { projectTasks = addTags(projectTasks, tags); return sendContent(ex, mapTasks(projectTasks, render)); } - if (isSet(parentTaskId)) return sendContent(ex, mapValues(taskDb.listChildrenOf(parentTaskId, user, showClosed))); - var taskIds = json.has(IDS) && json.get(IDS) instanceof JSONArray ids ? ids.toList().stream().map(Object::toString).map(Long::parseLong).toList() : null; - var tasks = taskDb.load(taskIds); - if (isSet(taskIds)) return sendContent(ex, mapTasks(tasks,render)); - return sendEmptyResponse(HTTP_NOT_IMPLEMENTED, ex); + Map tasks; + if (!isSet(parentTaskId)) { + var taskIds = json.has(IDS) && json.get(IDS) instanceof JSONArray ids ? ids.toList().stream().map(Object::toString).map(Long::parseLong).toList() : null; + if (!isSet(taskIds)) return sendEmptyResponse(HTTP_NOT_IMPLEMENTED,ex); + tasks = taskDb.load(taskIds); + } else tasks = taskDb.listChildrenOf(parentTaskId,user,showClosed); + return sendContent(ex, mapTasks(tasks,render)); } private Map addTags(Map taskList, Map> tags) {