From 0b7cde7ad0b994dee0cf7376c0fd9e36363d277b Mon Sep 17 00:00:00 2001 From: henkej Date: Fri, 16 Jan 2026 11:02:11 +0100 Subject: [PATCH] assignment --- .../projectmanagement/AppController.java | 10 +++- .../projectmanagement/AppRepository.java | 51 ++++++++++++++++++- .../modules/projectmanagement/AppService.java | 10 ++++ .../model/WorkpackageAppBean.java | 46 +++++++++++++++++ .../model/WorkpackageBean.java | 8 ++- .../projectmanagement/app/assign.html | 26 ++++++---- 6 files changed, 137 insertions(+), 14 deletions(-) create mode 100644 src/main/java/de/jottyfan/timetrack/modules/projectmanagement/model/WorkpackageAppBean.java diff --git a/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppController.java b/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppController.java index cb70535..7bfd100 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppController.java +++ b/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppController.java @@ -33,12 +33,20 @@ public class AppController extends CommonController { model.addAttribute("apps", service.getAppsOf(pkWorkpackage)); return "/projectmanagement/app/list"; } - + @RolesAllowed("timetrack_user") @GetMapping("/projectmanagement/app/{pkApp}/assign") public String loadAssignmentToolForApp(@PathVariable("pkApp") Integer pkApp, final Model model) { model.addAttribute("app", service.getApp(pkApp)); model.addAttribute("workpackages", service.getWorkpackages()); + model.addAttribute("linked", service.getWorkpackageApps(pkApp)); return "/projectmanagement/app/assign"; } + + @RolesAllowed("timetrack_user") + @GetMapping("/projectmanagement/workpackage/{pkWorkpackage}/app/{pkApp}/toggle") + public String toggleWorkpackageAppLinkage(@PathVariable("pkWorkpackage") Integer pkWorkpackage, @PathVariable("pkApp") Integer pkApp, final Model model) { + service.toggleWorkpackageAppLinkage(pkWorkpackage, pkApp); + return String.format("redirect:/projectmanagement/app/%s/assign", pkApp); + } } diff --git a/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppRepository.java b/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppRepository.java index 13c94b3..926571e 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppRepository.java +++ b/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppRepository.java @@ -1,19 +1,24 @@ package de.jottyfan.timetrack.modules.projectmanagement; import static de.jottyfan.timetrack.db.project.Tables.T_APP; -import static de.jottyfan.timetrack.db.project.Tables.T_WORKPACKAGE_APP; import static de.jottyfan.timetrack.db.project.Tables.T_WORKPACKAGE; +import static de.jottyfan.timetrack.db.project.Tables.T_WORKPACKAGE_APP; import java.util.List; import org.jooq.DSLContext; +import org.jooq.DeleteConditionStep; +import org.jooq.InsertValuesStep2; +import org.jooq.Record1; import org.jooq.Record7; import org.jooq.SelectConditionStep; import org.jooq.impl.DSL; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; +import de.jottyfan.timetrack.db.project.tables.records.TWorkpackageAppRecord; import de.jottyfan.timetrack.modules.projectmanagement.model.AppBean; +import de.jottyfan.timetrack.modules.projectmanagement.model.WorkpackageAppBean; import de.jottyfan.timetrack.modules.projectmanagement.model.WorkpackageBean; /** @@ -79,4 +84,48 @@ public class AppRepository { public List getWorkpackages() { return jooq.selectFrom(T_WORKPACKAGE).fetchInto(WorkpackageBean.class); } + + /** + * get all workpackage app linkages + * + * @param pkApp the ID of the app to look for + * @return the list of workpackage app linkages + */ + public List getWorkpackageApps(Integer pkApp) { + return jooq.selectFrom(T_WORKPACKAGE_APP).where(T_WORKPACKAGE_APP.FK_APP.eq(pkApp)).fetchInto(WorkpackageAppBean.class); + } + + /** + * toggle workpackage app linkage + * + * @param pkWorkpackage the ID of the workpackage + * @param pkApp the ID of the app + */ + public void toggleWorkpackageAppLinkage(Integer pkWorkpackage, Integer pkApp) { + SelectConditionStep> sql = jooq + // @formatter:off + .select(T_WORKPACKAGE_APP.PK_WORKPACKAGE_APP) + .from(T_WORKPACKAGE_APP) + .where(T_WORKPACKAGE_APP.FK_WORKPACKAGE.eq(pkWorkpackage)) + .and(T_WORKPACKAGE_APP.FK_APP.eq(pkApp)); + // @formatter:on + Integer pkWorkpackageApp = sql.fetchOne(T_WORKPACKAGE_APP.PK_WORKPACKAGE_APP); + if (pkWorkpackageApp == null) { + InsertValuesStep2 sql2 = jooq + // @formatter:off + .insertInto(T_WORKPACKAGE_APP, + T_WORKPACKAGE_APP.FK_WORKPACKAGE, + T_WORKPACKAGE_APP.FK_APP) + .values(pkWorkpackage, pkApp); + // @formatter:on + sql2.execute(); + } else { + DeleteConditionStep sql2 = jooq + // @formatter:off + .deleteFrom(T_WORKPACKAGE_APP) + .where(T_WORKPACKAGE_APP.PK_WORKPACKAGE_APP.eq(pkWorkpackageApp)); + // @formatter:on + sql2.execute(); + } + } } diff --git a/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppService.java b/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppService.java index 957ea4d..bb9f4ec 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppService.java +++ b/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppService.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.jottyfan.timetrack.modules.projectmanagement.model.AppBean; +import de.jottyfan.timetrack.modules.projectmanagement.model.WorkpackageAppBean; import de.jottyfan.timetrack.modules.projectmanagement.model.WorkpackageBean; /** @@ -29,4 +30,13 @@ public class AppService { public List getWorkpackages() { return repository.getWorkpackages(); } + + public List getWorkpackageApps(Integer fkApp) { + return repository.getWorkpackageApps(fkApp); + } + + public void toggleWorkpackageAppLinkage(Integer pkWorkpackage, Integer pkApp) { + repository.toggleWorkpackageAppLinkage(pkWorkpackage, pkApp); + } + } diff --git a/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/model/WorkpackageAppBean.java b/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/model/WorkpackageAppBean.java new file mode 100644 index 0000000..dee104d --- /dev/null +++ b/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/model/WorkpackageAppBean.java @@ -0,0 +1,46 @@ +package de.jottyfan.timetrack.modules.projectmanagement.model; + +import java.io.Serializable; + +/** + * + * @author jotty + * + */ +public class WorkpackageAppBean implements Serializable { + private static final long serialVersionUID = 1L; + + private Integer pkWorkpackageApp; + private Integer fkApp; + private Integer fkWorkpackage; + + public static final WorkpackageAppBean of(Integer fkApp) { + WorkpackageAppBean bean = new WorkpackageAppBean(); + bean.setFkApp(fkApp); + return bean; + } + + public Integer getPkWorkpackageApp() { + return pkWorkpackageApp; + } + + public void setPkWorkpackageApp(Integer pkWorkpackageApp) { + this.pkWorkpackageApp = pkWorkpackageApp; + } + + public Integer getFkApp() { + return fkApp; + } + + public void setFkApp(Integer fkApp) { + this.fkApp = fkApp; + } + + public Integer getFkWorkpackage() { + return fkWorkpackage; + } + + public void setFkWorkpackage(Integer fkWorkpackage) { + this.fkWorkpackage = fkWorkpackage; + } +} diff --git a/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/model/WorkpackageBean.java b/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/model/WorkpackageBean.java index 1c29c0f..815c323 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/model/WorkpackageBean.java +++ b/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/model/WorkpackageBean.java @@ -2,6 +2,8 @@ package de.jottyfan.timetrack.modules.projectmanagement.model; import java.io.Serializable; import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; import de.jottyfan.timetrack.db.project.tables.records.TWorkpackageRecord; @@ -20,7 +22,7 @@ public class WorkpackageBean implements Serializable { private String milestoneUrl; private String contractUrl; private LocalDate plannedDuedate; - + public static final WorkpackageBean of(TWorkpackageRecord r) { WorkpackageBean bean = new WorkpackageBean(); bean.setPkWorkpackage(r.getPkWorkpackage()); @@ -39,6 +41,10 @@ public class WorkpackageBean implements Serializable { return bean; } + public Boolean isIn(List linkages) { + return linkages.stream().map(WorkpackageAppBean::getFkWorkpackage).collect(Collectors.toSet()).contains(pkWorkpackage); + } + /** * @return the name */ diff --git a/src/main/resources/templates/projectmanagement/app/assign.html b/src/main/resources/templates/projectmanagement/app/assign.html index 689d966..03572e7 100644 --- a/src/main/resources/templates/projectmanagement/app/assign.html +++ b/src/main/resources/templates/projectmanagement/app/assign.html @@ -4,16 +4,20 @@ Projektmanagement - Projekt - -
-
-
- TODO: assign app to workpackage and store it -
+ Projekt + +
+
+
+
+ +
+
+
\ No newline at end of file