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