diff --git a/core/src/main/java/de/srsoftware/umbrella/core/Paths.java b/core/src/main/java/de/srsoftware/umbrella/core/Paths.java
index dd4e955..228762b 100644
--- a/core/src/main/java/de/srsoftware/umbrella/core/Paths.java
+++ b/core/src/main/java/de/srsoftware/umbrella/core/Paths.java
@@ -14,6 +14,7 @@ public class Paths {
public static final String SEARCH = "search";
public static final String SERVICE = "service";
public static final String SETTINGS = "settings";
+ public static final String STATES = "states";
public static final String SUBMIT = "submit";
public static final String TOKEN = "token";
public static final String VIEW = "view";
diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/Constants.java b/documents/src/main/java/de/srsoftware/umbrella/documents/Constants.java
index b229b1b..8706d07 100644
--- a/documents/src/main/java/de/srsoftware/umbrella/documents/Constants.java
+++ b/documents/src/main/java/de/srsoftware/umbrella/documents/Constants.java
@@ -84,7 +84,6 @@ public class Constants {
public static final String POSITION = "position";
public static final String PROJECT_ID = "project_id";
- public static final String STATES = "states";
public static final String TABLE_COMPANY_SETTINGS = "company_settings";
public static final String TABLE_CUSTOMER_SETTINGS = "company_customer_settings";
diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java
index 157efe5..3fb795e 100644
--- a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java
+++ b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java
@@ -14,6 +14,7 @@ import static de.srsoftware.tools.Strings.escapeHtmlEntities;
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.ResponseCode.HTTP_UNPROCESSABLE;
import static de.srsoftware.umbrella.core.Util.request;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*;
diff --git a/frontend/src/Components/StateSelector.svelte b/frontend/src/Components/StateSelector.svelte
new file mode 100644
index 0000000..30e75e8
--- /dev/null
+++ b/frontend/src/Components/StateSelector.svelte
@@ -0,0 +1,30 @@
+
+
+{#if states}
+
+{:else}
+{message}
+{/if}
\ No newline at end of file
diff --git a/frontend/src/routes/project/View.svelte b/frontend/src/routes/project/View.svelte
index 6bc4908..5b57750 100644
--- a/frontend/src/routes/project/View.svelte
+++ b/frontend/src/routes/project/View.svelte
@@ -4,6 +4,7 @@
import TaskList from '../../Components/TaskList.svelte';
import MarkdownEditor from '../../Components/MarkdownEditor.svelte';
import LineEditor from '../../Components/LineEditor.svelte';
+ import StateSelector from '../../Components/StateSelector.svelte';
let { id } = $props();
let project = $state(null);
@@ -69,6 +70,12 @@
update({name:val})} />
+
+
{t('state')}
+
+ update({status:val})}/>
+
+
{#if project.company}
{t('company')}
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 4b577a1..ce32c6f 100644
--- a/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java
+++ b/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java
@@ -115,9 +115,7 @@ public class ProjectModule extends BaseHandler implements ProjectService {
}
}
- private boolean getProject(HttpExchange ex, long projectId, UmbrellaUser user) throws IOException, UmbrellaException {
- var project = projects.load(projectId);
- if (!project.hasMember(user)) throw forbidden("You are not a member of {0}",project.name());
+ private boolean addMembers(Project project, HttpExchange ex) throws IOException {
var map = project.toMap();
var members = new HashMap>();
for (var member : project.members()){
@@ -128,6 +126,13 @@ public class ProjectModule extends BaseHandler implements ProjectService {
if (!members.isEmpty()) map.put(MEMBERS,members);
project.companyId().map(companies::get).map(Company::toMap).ifPresent(data -> map.put(COMPANY,data));
return sendContent(ex,map);
+
+ }
+
+ private boolean getProject(HttpExchange ex, long projectId, UmbrellaUser user) throws IOException, UmbrellaException {
+ var project = projects.load(projectId);
+ if (!project.hasMember(user)) throw forbidden("You are not a member of {0}",project.name());
+ return addMembers(project,ex);
}
private boolean postProjectList(HttpExchange ex, UmbrellaUser user) throws IOException {
@@ -183,7 +188,7 @@ public class ProjectModule extends BaseHandler implements ProjectService {
if (!project.hasMember(user)) throw forbidden("You are not a member of {0}",project.name());
var json = json(ex);
projects.save(project.patch(json));
- return sendContent(ex,project.toMap());
+ return addMembers(project,ex);
}
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 0171a46..1cb8db4 100644
--- a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java
+++ b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java
@@ -6,6 +6,7 @@ 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.ResponseCode.HTTP_NOT_IMPLEMENTED;
import static de.srsoftware.umbrella.core.Util.mapValues;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.forbidden;
@@ -22,10 +23,7 @@ import de.srsoftware.umbrella.core.api.ProjectService;
import de.srsoftware.umbrella.core.api.TaskService;
import de.srsoftware.umbrella.core.api.UserService;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
-import de.srsoftware.umbrella.core.model.Project;
-import de.srsoftware.umbrella.core.model.Task;
-import de.srsoftware.umbrella.core.model.Token;
-import de.srsoftware.umbrella.core.model.UmbrellaUser;
+import de.srsoftware.umbrella.core.model.*;
import java.io.IOException;
import java.util.*;
@@ -49,6 +47,23 @@ public class TaskModule extends BaseHandler implements TaskService {
return companies;
}
+ @Override
+ public boolean doGet(Path path, HttpExchange ex) throws IOException {
+ addCors(ex);
+ try {
+ Optional token = SessionToken.from(ex).map(Token::of);
+ var user = users.loadUser(token);
+ if (user.isEmpty()) return unauthorized(ex);
+ var head = path.pop();
+ return switch (head) {
+ case STATES -> getStateList(ex);
+ default -> super.doGet(path,ex);
+ };
+ } catch (UmbrellaException e){
+ return send(ex,e);
+ }
+ }
+
@Override
public boolean doPost(Path path, HttpExchange ex) throws IOException {
addCors(ex);
@@ -89,6 +104,12 @@ public class TaskModule extends BaseHandler implements TaskService {
return sendContent(ex,result);
}
+ private boolean getStateList(HttpExchange ex) throws IOException {
+ var map = new HashMap();
+ for (var status : Status.values()) map.put(status.code(),status.name());
+ return sendContent(ex,map);
+ }
+
@Override
public HashMap listCompanyTasks(long companyId) throws UmbrellaException {
var projectList = projects.listCompanyProjects(companyId,false);
diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json
index cc2aa74..080e406 100644
--- a/translations/src/main/resources/de.json
+++ b/translations/src/main/resources/de.json
@@ -175,7 +175,9 @@
"state_new":"neu",
"state_open": "offen",
"state_payed": "bezahlt",
+ "state_pending": "ausstehend",
"state_sent": "versendet",
+ "state_started": "gestartet",
"status" : {
"403": "Zugriff verweigert",
"404": "Seite nicht gefunden",
diff --git a/web/src/main/resources/web/fontawesome-webfont.woff b/web/src/main/resources/web/fontawesome-webfont.woff
deleted file mode 100644
index 839528c..0000000
Binary files a/web/src/main/resources/web/fontawesome-webfont.woff and /dev/null differ