From 7ab844bcff792e75dcc1aad69e4b943645e7ee5b Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Mon, 18 Aug 2025 15:37:57 +0200 Subject: [PATCH] working on time list Signed-off-by: Stephan Richter --- .../umbrella/core/api/TaskService.java | 2 +- frontend/src/routes/time/Index.svelte | 16 ++++- .../srsoftware/umbrella/task/TaskModule.java | 2 +- .../de/srsoftware/umbrella/time/SqliteDb.java | 21 +++--- .../de/srsoftware/umbrella/time/TimeDb.java | 4 +- .../srsoftware/umbrella/time/TimeModule.java | 65 +++++-------------- 6 files changed, 47 insertions(+), 63 deletions(-) diff --git a/core/src/main/java/de/srsoftware/umbrella/core/api/TaskService.java b/core/src/main/java/de/srsoftware/umbrella/core/api/TaskService.java index 6c1610f..eefe2be 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/api/TaskService.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/api/TaskService.java @@ -10,7 +10,7 @@ import java.util.List; public interface TaskService { HashMap listCompanyTasks(long companyId) throws UmbrellaException; HashMap listProjectTasks(long projectId) throws UmbrellaException; - HashMap load(List taskIds); + HashMap load(Collection taskIds); Collection loadMembers(Collection tasks); default Task loadMembers(Task task){ diff --git a/frontend/src/routes/time/Index.svelte b/frontend/src/routes/time/Index.svelte index 7b4c829..66a8e85 100644 --- a/frontend/src/routes/time/Index.svelte +++ b/frontend/src/routes/time/Index.svelte @@ -1,9 +1,11 @@ @@ -34,14 +40,20 @@ {time.start_time}…{time.end_time} + + {time.duration} h + {time.subject} - {#each time.task_ids as tid} - {tid}  + {#each Object.entries(time.tasks) as [tid,task]} + openTask(tid)}>{task} {/each} + + {t("state_"+time.state.name.toLowerCase())} + {/each} 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 e1fec80..4bfc8ef 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java @@ -216,7 +216,7 @@ public class TaskModule extends BaseHandler implements TaskService { } @Override - public HashMap load(List taskIds) { + public HashMap load(Collection taskIds) { try { var map = taskIds.stream().map(taskDb::load).collect(Collectors.toMap(Task::id, t -> t)); return new HashMap<>(map); diff --git a/time/src/main/java/de/srsoftware/umbrella/time/SqliteDb.java b/time/src/main/java/de/srsoftware/umbrella/time/SqliteDb.java index a4d0efe..e6851d5 100644 --- a/time/src/main/java/de/srsoftware/umbrella/time/SqliteDb.java +++ b/time/src/main/java/de/srsoftware/umbrella/time/SqliteDb.java @@ -1,12 +1,11 @@ /* © SRSoftware 2025 */ package de.srsoftware.umbrella.time; -import static de.srsoftware.tools.jdbc.Condition.equal; -import static de.srsoftware.tools.jdbc.Condition.in; +import static de.srsoftware.tools.jdbc.Condition.*; import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL; import static de.srsoftware.tools.jdbc.Query.select; -import static de.srsoftware.umbrella.core.Constants.ID; -import static de.srsoftware.umbrella.core.Constants.USER_ID; +import static de.srsoftware.umbrella.core.Constants.*; +import static de.srsoftware.umbrella.core.model.Time.State.Complete; import static de.srsoftware.umbrella.time.Constants.*; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; @@ -26,7 +25,7 @@ public class SqliteDb implements TimeDb { } @Override - public HashMap listTimes(Collection taskIds) throws UmbrellaException { + public HashMap listTimes(Collection taskIds, boolean showClosed) throws UmbrellaException { try { var rs = select(ALL).from(TABLE_TASK_TIMES).where(TASK_ID,in(taskIds.toArray())).exec(db); var mapFromTimesToTasks = new HashMap>(); @@ -36,7 +35,9 @@ public class SqliteDb implements TimeDb { mapFromTimesToTasks.computeIfAbsent(timeId, k -> new HashSet<>()).add(taskId); } rs.close(); - rs = select(ALL).from(TABLE_TIMES).where(ID,in(mapFromTimesToTasks.keySet().toArray())).exec(db); + var query = select(ALL).from(TABLE_TIMES).where(ID,in(mapFromTimesToTasks.keySet().toArray())); + if (!showClosed) query.where(STATE,lessThan(Complete.code())); + rs = query.exec(db); var times = new HashMap(); while (rs.next()) { var time = Time.of(rs); @@ -45,15 +46,17 @@ public class SqliteDb implements TimeDb { } rs.close(); return times; - } catch (SQLException e) { + } catch (Exception e) { throw new UmbrellaException("Failed to load times for task list"); } } @Override - public HashMap listUserTimes(long userId) { + public HashMap listUserTimes(long userId, boolean showClosed) { try { - var rs = select(ALL).from(TABLE_TIMES).where(USER_ID,equal(userId)).exec(db); + var query = select(ALL).from(TABLE_TIMES).where(USER_ID,equal(userId)); + if (!showClosed) query.where(STATE,lessThan(Complete.code())); + var rs = query.exec(db); var times = new HashMap(); while (rs.next()) { var time = Time.of(rs); diff --git a/time/src/main/java/de/srsoftware/umbrella/time/TimeDb.java b/time/src/main/java/de/srsoftware/umbrella/time/TimeDb.java index 2ef9715..8815039 100644 --- a/time/src/main/java/de/srsoftware/umbrella/time/TimeDb.java +++ b/time/src/main/java/de/srsoftware/umbrella/time/TimeDb.java @@ -7,7 +7,7 @@ import java.util.Collection; import java.util.HashMap; public interface TimeDb { - HashMap listTimes(Collection taskIds) throws UmbrellaException; + HashMap listTimes(Collection taskIds, boolean showClosed) throws UmbrellaException; - HashMap listUserTimes(long userId); + HashMap listUserTimes(long userId, boolean showClosed); } diff --git a/time/src/main/java/de/srsoftware/umbrella/time/TimeModule.java b/time/src/main/java/de/srsoftware/umbrella/time/TimeModule.java index 005e401..116ce1e 100644 --- a/time/src/main/java/de/srsoftware/umbrella/time/TimeModule.java +++ b/time/src/main/java/de/srsoftware/umbrella/time/TimeModule.java @@ -4,12 +4,10 @@ package de.srsoftware.umbrella.time; 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.ResponseCode.HTTP_NOT_IMPLEMENTED; -import static de.srsoftware.umbrella.core.Util.mapValues; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.forbidden; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingFieldException; import static de.srsoftware.umbrella.time.Constants.*; -import static java.util.function.Predicate.not; +import static java.util.stream.Collectors.toSet; import com.sun.net.httpserver.HttpExchange; import de.srsoftware.configuration.Configuration; @@ -23,6 +21,7 @@ import de.srsoftware.umbrella.core.model.*; import java.io.IOException; import java.time.LocalDateTime; import java.util.*; +import java.util.stream.Collectors; public class TimeModule extends BaseHandler implements TimeService { @@ -82,54 +81,24 @@ public class TimeModule extends BaseHandler implements TimeService { } private boolean getUserTimes(UmbrellaUser user, HttpExchange ex) throws IOException { - // TODO - var taskIds = new HashSet(); + Set taskIds = new HashSet<>(); Map projects = projectService().listUserProjects(user.id(), true); for (var pid : projects.keySet()) taskIds.addAll(taskService().listProjectTasks(pid).keySet()); - var times = timeDb.listTimes(taskIds); - times.putAll(timeDb.listUserTimes(user.id())); - return sendContent(ex,mapValues(times)); - } - - /* - { - 1 : { - name: Projekt 1 - id: 1 - times: { - 3:{ - name: time 3 - start: 123456 - end: 78901 - }, - 4:{ - name: time 4 - start: 234567 - end: 890123 - tasks:{ - 5:{ - name: task5 - }, - 6:{ - name: task6 - } - } - } - } - }, - 2: { - name: Projekt 2 - id: 2 - times: { - 7:{ - name: time 7 - start: 456789 - end: 012345 - } - } + boolean showClosed = false; + var times = timeDb.listTimes(taskIds, showClosed); + times.putAll(timeDb.listUserTimes(user.id(), showClosed)); + taskIds = times.values().stream().map(Time::taskIds).flatMap(Collection::stream).collect(toSet()); + var tasks = taskService().load(taskIds); + var result = new HashMap>(); + for (var entry : times.entrySet()) { + var time = entry.getValue(); + var map = time.toMap(); + map.remove(TASK_IDS); + map.put(TASKS,time.taskIds().stream().collect(Collectors.toMap(tid -> tid, tid -> tasks.get(tid).name()))); + result.put(entry.getKey(),map); } + return sendContent(ex,result); } - */ private boolean listTimes(HttpExchange ex, UmbrellaUser user) throws IOException, UmbrellaException { var json = json(ex); @@ -141,7 +110,7 @@ public class TimeModule extends BaseHandler implements TimeService { long projectId = pid.longValue(); Map tasksOfProject = taskService().listProjectTasks(projectId); - List> times = timeDb.listTimes(tasksOfProject.keySet()) + List> times = timeDb.listTimes(tasksOfProject.keySet(), true) .entrySet().stream() .filter(entry -> !entry.getValue().isClosed()) .sorted(Comparator.comparing(entry ->entry.getValue().start()))