From 9568e77f52f51976e914ae225e4facf6709d4586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Henke?= Date: Tue, 20 Jan 2026 14:00:14 +0100 Subject: [PATCH] add, edit and delete apps --- gradle/wrapper/gradle-wrapper.properties | 2 +- .../projectmanagement/AppController.java | 41 ++++++++++ .../projectmanagement/AppRepository.java | 60 ++++++++++++++ .../modules/projectmanagement/AppService.java | 16 ++++ .../templates/projectmanagement/app/item.html | 81 +++++++++++++++++++ .../templates/projectmanagement/app/list.html | 5 +- 6 files changed, 202 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/templates/projectmanagement/app/item.html diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ac57dd1..5dc98db 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists 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 f07febc..e19a7e0 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppController.java +++ b/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppController.java @@ -3,10 +3,14 @@ package de.jottyfan.timetrack.modules.projectmanagement; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; import de.jottyfan.timetrack.modules.CommonController; +import de.jottyfan.timetrack.modules.projectmanagement.model.AppBean; import jakarta.annotation.security.RolesAllowed; /** @@ -19,6 +23,43 @@ public class AppController extends CommonController { @Autowired private AppService service; + + @RolesAllowed("timetrack_user") + @GetMapping("/projectmanagement/app/add") + public String getAppForAdd(final Model model) { + model.addAttribute("bean", new AppBean()); + model.addAttribute("apps", service.getApps()); + model.addAttribute("bundles", service.getBundleMap().values()); + return "/projectmanagement/app/item"; + } + + @RolesAllowed("timetrack_user") + @GetMapping("/projectmanagement/app/{pkApp}") + public String getAppForEdit(@PathVariable("pkApp") Integer pkApp, final Model model) { + model.addAttribute("bean", service.getApp(pkApp)); + model.addAttribute("apps", service.getApps()); + model.addAttribute("bundles", service.getBundleMap().values()); + return "/projectmanagement/app/item"; + } + + @RolesAllowed("timetrack_user") + @PostMapping("/projectmanagement/app/upsert") + public String updateApp(@ModelAttribute("bean") AppBean bean, BindingResult bindingResult, final Model model) { + if (bindingResult.hasErrors()) { + model.addAttribute("apps", service.getApps()); + model.addAttribute("bundles", service.getBundleMap().values()); + return "/projectmanagement/app/item"; + } + service.upsert(bean); + return "redirect:/projectmanagement/apps"; + } + + @RolesAllowed("timetrack_user") + @GetMapping("/projectmanagement/app/{pkApp}/delete") + public String deleteApp(@PathVariable("pkApp") Integer pkApp) { + service.deleteApp(pkApp); + return "redirect:/projectmanagement/apps"; + } @RolesAllowed("timetrack_user") @GetMapping("/projectmanagement/apps") 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 68dc5f3..84505fd 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppRepository.java +++ b/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppRepository.java @@ -192,4 +192,64 @@ public class AppRepository { .fetchOneInto(ProjectBean.class); // @formatter:on } + + /** + * get all apps ordered by name + * + * @return the apps list; an empty list at least + */ + public List getAllApps() { + return jooq.selectFrom(T_APP).orderBy(T_APP.NAME).fetchInto(AppBean.class); + } + + /** + * delete the app + * + * @param pkApp the ID of the app + */ + public void deleteApp(Integer pkApp) { + jooq.deleteFrom(T_APP).where(T_APP.PK_APP.eq(pkApp)).execute(); + } + + /** + * update the app bean + * + * @param bean the bean + */ + public void updateApp(AppBean bean) { + jooq + // @formatter:off + .update(T_APP) + .set(T_APP.NAME, bean.getName()) + .set(T_APP.DESCRIPTION, bean.getDescription()) + .set(T_APP.FK_BUNDLE, bean.getFkBundle()) + .set(T_APP.BASIC_FUNCTIONALITY, bean.getBasicFunctionality()) + .set(T_APP.FK_REPLACED_BY_APP, bean.getFkReplacedByApp()) + .set(T_APP.REPOSITORY_URL, bean.getRepositoryUrl()) + .where(T_APP.PK_APP.eq(bean.getPkApp())) + .execute(); + // @formatter:on + } + + /** + * insert the bean + * + * @param bean the bean + * @return the new ID of the bean + */ + public Integer insertApp(AppBean bean) { + return jooq + // @formatter:off + .insertInto(T_APP, + T_APP.NAME, + T_APP.DESCRIPTION, + T_APP.FK_BUNDLE, + T_APP.BASIC_FUNCTIONALITY, + T_APP.FK_REPLACED_BY_APP, + T_APP.REPOSITORY_URL) + .values(bean.getName(), bean.getDescription(), bean.getFkBundle(), bean.getBasicFunctionality(), bean.getFkReplacedByApp(), bean.getRepositoryUrl()) + .returning(T_APP.PK_APP) + .fetchOne(T_APP.PK_APP); + // @formatter:on + } } 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 bdd5b9e..002d328 100644 --- a/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppService.java +++ b/src/main/java/de/jottyfan/timetrack/modules/projectmanagement/AppService.java @@ -52,5 +52,21 @@ public class AppService { public ProjectBean getProjectOfWorkpackage(Integer pkWorkpackage) { return repository.getProjectOfWorkpackage(pkWorkpackage); + } + + public List getApps() { + return repository.getAllApps(); + } + + public void deleteApp(Integer pkApp) { + repository.deleteApp(pkApp); + } + + public void upsert(AppBean bean) { + if (bean.getPkApp() != null) { + repository.updateApp(bean); + } else { + repository.insertApp(bean); + } } } diff --git a/src/main/resources/templates/projectmanagement/app/item.html b/src/main/resources/templates/projectmanagement/app/item.html new file mode 100644 index 0000000..456cfaa --- /dev/null +++ b/src/main/resources/templates/projectmanagement/app/item.html @@ -0,0 +1,81 @@ + + + +Projektmanagement + + + App + +
+
+
+
+
+
+
ID
+
+ +
+
Name
+
+ +
+
Beschreibung
+
+ +
+
Git-URL
+
+ +
+
Basisfunktion
+
+ +
+
Bundle
+
+ +
+
ersetzt durch
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+ +
+ + \ No newline at end of file diff --git a/src/main/resources/templates/projectmanagement/app/list.html b/src/main/resources/templates/projectmanagement/app/list.html index 6d6c5c0..230a984 100644 --- a/src/main/resources/templates/projectmanagement/app/list.html +++ b/src/main/resources/templates/projectmanagement/app/list.html @@ -7,7 +7,8 @@ Projekt
@@ -48,7 +49,7 @@ - + gitlab zuordnen