From 9bec33d5de892ad3f186ff5cef4bb43cbda7e460 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Mon, 11 May 2026 20:14:24 +0200 Subject: [PATCH] implemented editing of custom states Signed-off-by: Stephan Richter --- frontend/src/routes/project/View.svelte | 32 ++++++++++++------- .../umbrella/project/ProjectModule.java | 14 ++++++++ .../srsoftware/umbrella/project/SqliteDb.java | 2 +- 3 files changed, 35 insertions(+), 13 deletions(-) diff --git a/frontend/src/routes/project/View.svelte b/frontend/src/routes/project/View.svelte index b734a6be..52209178 100644 --- a/frontend/src/routes/project/View.svelte +++ b/frontend/src/routes/project/View.svelte @@ -2,7 +2,7 @@ import { onMount, onDestroy } from 'svelte'; import { useTinyRouter } from 'svelte-tiny-router'; - import { api, eventStream } from '../../urls.svelte'; + import { api, eventStream, patch, post } from '../../urls.svelte'; import { error, yikes } from '../../warn.svelte'; import { t } from '../../translations.svelte'; @@ -35,11 +35,7 @@ async function addState(){ const url = api(`project/${id}/state`); - const resp = await fetch(url,{ - credentials: 'include', - method: 'POST', - body: JSON.stringify(new_state) - }); + const resp = await post(url,new_state); if (resp.ok){ const json = await resp.json(); project.allowed_states[json.code] = json.name; @@ -139,11 +135,7 @@ async function update(data){ const url = api(`project/${id}`); - const resp = await fetch(url,{ - credentials : 'include', - method : 'PATCH', - body : JSON.stringify(data) - }); + const resp = await patch(url,data); if (resp.ok){ yikes(); project = await resp.json(); @@ -160,6 +152,20 @@ update({members:members}); } + async function updateStateName(state_id,name){ + const url = api(`project/${id}/state`); + const resp = await patch(url,{id:state_id,name}); + if (resp.ok){ + const json = await resp.json(); + project.allowed_states[json.code]=json.name; + yikes(); + return true; + } else { + error(resp); + return false; + } + } + function showClosed(){ show_closed = !show_closed; loadTasks(); @@ -243,7 +249,9 @@ {/if} {key} -
{project.allowed_states[key]}
+
+ updateStateName(+key,newName)} /> +
{/each}
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 582e794b..e1d979a8 100644 --- a/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java +++ b/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java @@ -97,6 +97,7 @@ public class ProjectModule extends BaseHandler implements ProjectService { head = path.pop(); yield switch (head){ case null -> patchProject(ex,projectId,user.get()); + case Path.STATE -> patchProjectState(ex,projectId,user.get()); default -> super.doPatch(path,ex); }; } @@ -229,6 +230,19 @@ public class ProjectModule extends BaseHandler implements ProjectService { return sendContent(ex,project.toMap()); } + private boolean patchProjectState(HttpExchange ex, long projectId, UmbrellaUser user) throws IOException { + var project = loadMembers(projectDb.load(projectId)); + if (!project.hasMember(user)) throw notAmember(t(PROJECT_WITH_ID,ID,project.name())); + var json = json(ex); + if (!json.has(ID)) throw missingField(ID); + if (!json.has(NAME)) throw missingField(NAME); + if (!(json.get(ID) instanceof Number fieldId)) throw invalidField(ID,Text.NUMBER); + var newName = json.getString(NAME); + if (newName.isBlank()) throw invalidField(NAME, STRING); + var newState = new Status(newName,fieldId.intValue()); + return sendContent(ex, projectDb.save(projectId,newState)); + + } private boolean postNewState(HttpExchange ex, long projectId, UmbrellaUser user) throws IOException { var project = loadMembers(load(projectId)); diff --git a/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java b/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java index 302306de..9592e2bc 100644 --- a/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java +++ b/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java @@ -267,7 +267,7 @@ CREATE TABLE IF NOT EXISTS {0} ( @Override public Status save(long projectId, Status newState) { try { - insertInto(TABLE_CUSTOM_STATES, PROJECT_ID, Field.CODE, NAME).values(projectId,newState.code(),newState.name()).execute(db).close(); + replaceInto(TABLE_CUSTOM_STATES, PROJECT_ID, Field.CODE, NAME).values(projectId,newState.code(),newState.name()).execute(db).close(); return newState; } catch (SQLException e) { throw databaseException(FAILED_TO_CREATE_STATE).causedBy(e);