From 9cbcfb3b7f34b59447cce7409ee67ccee30686d5 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Wed, 23 Jul 2025 18:47:52 +0200 Subject: [PATCH] preparing to save ne task --- .../umbrella/core/api/ProjectService.java | 2 ++ frontend/src/routes/task/Add.svelte | 32 +++++++++++++++---- .../umbrella/project/ProjectModule.java | 5 +++ .../srsoftware/umbrella/task/TaskModule.java | 17 ++++++++-- translations/src/main/resources/de.json | 1 + 5 files changed, 48 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/de/srsoftware/umbrella/core/api/ProjectService.java b/core/src/main/java/de/srsoftware/umbrella/core/api/ProjectService.java index f98e20d..5459c17 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/api/ProjectService.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/api/ProjectService.java @@ -11,7 +11,9 @@ public interface ProjectService { CompanyService companyService(); Map listCompanyProjects(long companyId, boolean includeClosed) throws UmbrellaException; Map listUserProjects(long userId, boolean includeClosed) throws UmbrellaException; + Project load(long projectId); Collection loadMembers(Collection projects); + default Project loadMembers(Project project){ loadMembers(List.of(project)); return project; diff --git a/frontend/src/routes/task/Add.svelte b/frontend/src/routes/task/Add.svelte index c5a67b3..e238d34 100644 --- a/frontend/src/routes/task/Add.svelte +++ b/frontend/src/routes/task/Add.svelte @@ -12,7 +12,7 @@ let project = $state(null) let task = $state({ name : '', - description : { source : 'new_task', rendered : '' }, + description : { source : '', rendered : '' }, members : {} }); @@ -21,9 +21,12 @@ } function addMember(member){ - for (let uid of Object.keys(member)){ - task.members[uid] = project.members[uid]; - } + for (let uid of Object.keys(member)) task.members[uid] = project.members[uid]; + } + + function dropMember(member){ + delete task.members[member.user.id]; + console.log({drop:member.user.id}); } async function loadProject(){ @@ -32,7 +35,7 @@ if (resp.ok){ project = await resp.json(); task.project_id = project_id; - task.members = project.members; + task.members = JSON.parse(JSON.stringify(project.members)); // deep copy error = null; } else { error = await resp.text(); @@ -46,6 +49,22 @@ return Object.fromEntries(candidates); } + async function saveTask(){ + var url = api('task/add'); + const resp = await fetch(url,{ + credentials:'include', + method:'POST', + body: JSON.stringify(task) + }); + if (resp.ok) { + task = await resp.json(); + router.navigate(`/task/${task.id}/view`); + error = null; + } else { + error = await resp.text(); + } + } + onMount(load); @@ -85,9 +104,10 @@ {t('members')} - + + \ No newline at end of file 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 0ad868a..cffc296 100644 --- a/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java +++ b/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java @@ -153,6 +153,11 @@ public class ProjectModule extends BaseHandler implements ProjectService { return sendContent(ex,mapValues(projects)); } + @Override + public Project load(long projectId) { + return projects.load(projectId); + } + @Override public Collection loadMembers(Collection projectList) { var userMap = new HashMap(); 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 b5541be..b882655 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java @@ -5,8 +5,7 @@ import static de.srsoftware.tools.Optionals.is0; import static de.srsoftware.tools.Optionals.isSet; import static de.srsoftware.umbrella.core.ConnectionProvider.connect; import static de.srsoftware.umbrella.core.Constants.*; -import static de.srsoftware.umbrella.core.Paths.LIST; -import static de.srsoftware.umbrella.core.Paths.STATES; +import static de.srsoftware.umbrella.core.Paths.*; import static de.srsoftware.umbrella.core.ResponseCode.HTTP_NOT_IMPLEMENTED; import static de.srsoftware.umbrella.core.Util.mapValues; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.forbidden; @@ -38,7 +37,7 @@ public class TaskModule extends BaseHandler implements TaskService { private final UserService users; private final CompanyService companies; - public TaskModule(Configuration config, ProjectService projectService) throws UmbrellaException { + public TaskModule(Configuration config, ProjectService projectService) throws UmbrellaException { var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); taskDb = new SqliteDb(connect(dbFile)); projects = projectService; @@ -83,6 +82,7 @@ public class TaskModule extends BaseHandler implements TaskService { if (user.isEmpty()) return unauthorized(ex); var head = path.pop(); return switch (head) { + case ADD -> postNewTask(user.get(),ex); case ESTIMATED_TIMES -> estimatedTimes(user.get(),ex); case LIST -> postTaskList(user.get(),ex); default -> super.doGet(path,ex); @@ -171,6 +171,17 @@ public class TaskModule extends BaseHandler implements TaskService { return mappedTask; } + private boolean postNewTask(UmbrellaUser user, HttpExchange ex) throws IOException { + var json = json(ex); + if (!(json.has(PROJECT_ID) && json.get(PROJECT_ID) instanceof Number pid)) throw missingFieldException(PROJECT_ID); + long projectId = pid.longValue(); + var project = projects.load(projectId); + var member = project.members().get(user.id()); + if (member == null || member.permission() == Permission.READ_ONLY) throw forbidden("You are not allowed to create new tasks in this project"); + Task task = Task.of(json); + return taskDb.save(task); + } + private boolean postTaskList(UmbrellaUser user, HttpExchange ex) throws IOException { var json = json(ex); var showClosed = json.has(SHOW_CLOSED) && json.get(SHOW_CLOSED) instanceof Boolean bool ? bool : false; diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json index 778ae02..d66228b 100644 --- a/translations/src/main/resources/de.json +++ b/translations/src/main/resources/de.json @@ -159,6 +159,7 @@ "saved": "gespeichert", "save_service": "Service speichern", + "save_task": "Aufgabe speichern", "save_user": "Nutzer speichern", "search": "Suche", "select_company" : "Wählen Sie eine ihrer Firmen:",