more details
This commit is contained in:
@@ -30,6 +30,8 @@ public class AppController extends CommonController {
|
||||
@RolesAllowed("timetrack_user")
|
||||
@GetMapping("/projectmanagement/workpackage/{pkWorkpackage}/apps")
|
||||
public String getAppsOfWorkpackage(@PathVariable("pkWorkpackage") Integer pkWorkpackage, final Model model) {
|
||||
model.addAttribute("bean", service.getWorkpackage(pkWorkpackage));
|
||||
model.addAttribute("project", service.getProjectOfWorkpackage(pkWorkpackage));
|
||||
model.addAttribute("apps", service.getAppsOf(pkWorkpackage));
|
||||
return "/projectmanagement/app/list";
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package de.jottyfan.timetrack.modules.projectmanagement;
|
||||
|
||||
import static de.jottyfan.timetrack.db.project.Tables.T_PROJECT;
|
||||
import static de.jottyfan.timetrack.db.project.Tables.T_APP;
|
||||
import static de.jottyfan.timetrack.db.project.Tables.T_BUNDLE;
|
||||
import static de.jottyfan.timetrack.db.project.Tables.T_WORKPACKAGE;
|
||||
@@ -25,6 +26,7 @@ import org.springframework.stereotype.Repository;
|
||||
import de.jottyfan.timetrack.db.project.tables.records.TBundleRecord;
|
||||
import de.jottyfan.timetrack.db.project.tables.records.TWorkpackageAppRecord;
|
||||
import de.jottyfan.timetrack.modules.projectmanagement.model.AppBean;
|
||||
import de.jottyfan.timetrack.modules.projectmanagement.model.ProjectBean;
|
||||
import de.jottyfan.timetrack.modules.projectmanagement.model.WorkpackageAppBean;
|
||||
import de.jottyfan.timetrack.modules.projectmanagement.model.WorkpackageBean;
|
||||
|
||||
@@ -109,7 +111,8 @@ public class AppRepository {
|
||||
* @return the list of workpackage app linkages
|
||||
*/
|
||||
public List<WorkpackageAppBean> getWorkpackageApps(Integer pkApp) {
|
||||
return jooq.selectFrom(T_WORKPACKAGE_APP).where(T_WORKPACKAGE_APP.FK_APP.eq(pkApp)).fetchInto(WorkpackageAppBean.class);
|
||||
return jooq.selectFrom(T_WORKPACKAGE_APP).where(T_WORKPACKAGE_APP.FK_APP.eq(pkApp))
|
||||
.fetchInto(WorkpackageAppBean.class);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -156,4 +159,37 @@ public class AppRepository {
|
||||
jooq.selectFrom(T_BUNDLE).fetchInto(TBundleRecord.class).forEach(b -> map.put(b.getPkBundle(), b));
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* get the workpackage
|
||||
*
|
||||
* @param pkWorkpackage the ID of the workpackage
|
||||
* @return the workpackage if found or null
|
||||
*/
|
||||
public WorkpackageBean getWorkpackage(Integer pkWorkpackage) {
|
||||
return jooq
|
||||
// @formatter:off
|
||||
.selectFrom(T_WORKPACKAGE)
|
||||
.where(T_WORKPACKAGE.PK_WORKPACKAGE.eq(pkWorkpackage))
|
||||
.fetchOneInto(WorkpackageBean.class);
|
||||
// @formatter:on
|
||||
}
|
||||
|
||||
/**
|
||||
* get the project of the workpackage
|
||||
*
|
||||
* @param pkWorkpackage the ID of the workpackage
|
||||
* @return the project if found or null
|
||||
*/
|
||||
public ProjectBean getProjectOfWorkpackage(Integer pkWorkpackage) {
|
||||
return jooq
|
||||
// @formatter:off
|
||||
.select(T_PROJECT.NAME,
|
||||
T_PROJECT.DESCRIPTION)
|
||||
.from(T_WORKPACKAGE)
|
||||
.leftJoin(T_PROJECT).on(T_PROJECT.PK_PROJECT.eq(T_WORKPACKAGE.FK_PROJECT))
|
||||
.where(T_WORKPACKAGE.PK_WORKPACKAGE.eq(pkWorkpackage))
|
||||
.fetchOneInto(ProjectBean.class);
|
||||
// @formatter:on
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import org.springframework.stereotype.Service;
|
||||
|
||||
import de.jottyfan.timetrack.db.project.tables.records.TBundleRecord;
|
||||
import de.jottyfan.timetrack.modules.projectmanagement.model.AppBean;
|
||||
import de.jottyfan.timetrack.modules.projectmanagement.model.ProjectBean;
|
||||
import de.jottyfan.timetrack.modules.projectmanagement.model.WorkpackageAppBean;
|
||||
import de.jottyfan.timetrack.modules.projectmanagement.model.WorkpackageBean;
|
||||
|
||||
@@ -45,4 +46,11 @@ public class AppService {
|
||||
return repository.getBundleMap();
|
||||
}
|
||||
|
||||
public WorkpackageBean getWorkpackage(Integer pkWorkpackage) {
|
||||
return repository.getWorkpackage(pkWorkpackage);
|
||||
}
|
||||
|
||||
public ProjectBean getProjectOfWorkpackage(Integer pkWorkpackage) {
|
||||
return repository.getProjectOfWorkpackage(pkWorkpackage);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,60 +4,60 @@
|
||||
<title>Projektmanagement</title>
|
||||
</head>
|
||||
<body>
|
||||
<font layout:fragment="title">Projekt</font>
|
||||
<ul layout:fragment="menu">
|
||||
<li class="nav-item" sec:authorize="hasRole('timetrack_user')"><a class="nav-link btn btn-secondary btn-white-text" th:href="@{/projectmanagement}">zur Projektübersicht</a></li>
|
||||
</ul>
|
||||
<main layout:fragment="content">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-2">Name</div>
|
||||
<div class="col-10 fw-bold" th:text="${app.name}"></div>
|
||||
<div class="col-2">Beschreibung</div>
|
||||
<div class="col-10" th:text="${app.description}"></div>
|
||||
<div class="col-2">Basisfunktion</div>
|
||||
<div class="col-10" th:text="${app.basicFunctionality}"></div>
|
||||
<div class="col-2">URL der Entwicklung</div>
|
||||
<div class="col-10"><a th:href="${app.repositoryUrl}" target="_blank" th:text="${app.repositoryUrl}"></a></div>
|
||||
<div class="col-2" th:if="${app.fkReplacedByApp}">Ersetzt durch andere App</div>
|
||||
<div class="col-10" th:if="${app.fkReplacedByApp}">
|
||||
<a th:href="@{/projectmanagement/app/{id}/assign(id=${app.fkReplacedByApp})}" th:text="${app.fkReplacedByApp}"></a>
|
||||
</div>
|
||||
<div class="col-2">Bundle</div>
|
||||
<div class="col-10">
|
||||
<th:block th:with="b=${bundleMap.get(app.fkBundle)}">
|
||||
<div th:text="${b.name}"></div>
|
||||
<div th:text="${b.description}"></div>
|
||||
</th:block>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Beschreibung</th>
|
||||
<th>Zuordnung</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr th:each="p : ${workpackages}">
|
||||
<td>
|
||||
<input type="checkbox" th:checked="${p.isIn(linked)}" /> <a th:href="@{/projectmanagement/workpackage/{w}/apps(w=${p.pkWorkpackage})}" th:text="${p.name}"></a>
|
||||
</td>
|
||||
<td th:text="${p.description}"></td>
|
||||
<td>
|
||||
<a th:href="@{/projectmanagement/workpackage/{w}/app/{a}/toggle(w=${p.pkWorkpackage},a=${app.pkApp})}" class="btn btn-outline-secondary">
|
||||
<span th:if="${p.isIn(linked)}">rausschmeißen</span>
|
||||
<span th:unless="${p.isIn(linked)}">zuweisen</span>
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
<font layout:fragment="title">Projekt</font>
|
||||
<ul layout:fragment="menu">
|
||||
<li class="nav-item" sec:authorize="hasRole('timetrack_user')">
|
||||
<a class="nav-link btn btn-secondary btn-white-text" th:href="@{/projectmanagement}">zur Projektübersicht</a>
|
||||
</li>
|
||||
</ul>
|
||||
<main layout:fragment="content">
|
||||
<div class="card">
|
||||
<div class="card-header" th:text="${app.name}"></div>
|
||||
<div class="card-body">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-2">Beschreibung</div>
|
||||
<div class="col-10" th:text="${app.description}"></div>
|
||||
<div class="col-2">Basisfunktion</div>
|
||||
<div class="col-10" th:text="${app.basicFunctionality}"></div>
|
||||
<div class="col-2">URL der Entwicklung</div>
|
||||
<div class="col-10">
|
||||
<a th:href="${app.repositoryUrl}" target="_blank" th:text="${app.repositoryUrl}"></a>
|
||||
</div>
|
||||
<div class="col-2" th:if="${app.fkReplacedByApp}">Ersetzt durch andere App</div>
|
||||
<div class="col-10" th:if="${app.fkReplacedByApp}">
|
||||
<a th:href="@{/projectmanagement/app/{id}/assign(id=${app.fkReplacedByApp})}" th:text="${app.fkReplacedByApp}"></a>
|
||||
</div>
|
||||
<div class="col-2">Bundle</div>
|
||||
<div class="col-10">
|
||||
<th:block th:with="b=${bundleMap.get(app.fkBundle)}">
|
||||
<div th:text="${b.name}"></div>
|
||||
<div th:text="${b.description}"></div>
|
||||
</th:block>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<table class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Beschreibung</th>
|
||||
<th>Zuordnung</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr th:each="p : ${workpackages}">
|
||||
<td><input type="checkbox" th:checked="${p.isIn(linked)}" /> <a th:href="@{/projectmanagement/workpackage/{w}/apps(w=${p.pkWorkpackage})}" th:text="${p.name}"></a></td>
|
||||
<td th:text="${p.description}"></td>
|
||||
<td><a th:href="@{/projectmanagement/workpackage/{w}/app/{a}/toggle(w=${p.pkWorkpackage},a=${app.pkApp})}" class="btn btn-outline-secondary">
|
||||
<span th:if="${p.isIn(linked)}">rausschmeißen</span> <span th:unless="${p.isIn(linked)}">zuweisen</span>
|
||||
</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
@@ -11,35 +11,59 @@
|
||||
</li>
|
||||
</ul>
|
||||
<main layout:fragment="content">
|
||||
<div class="p-2">
|
||||
<table id="table" class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Beschreibung</th>
|
||||
<th>URL</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr th:each="b : ${apps}">
|
||||
<td th:text="${b.name}"></td>
|
||||
<td th:text="${b.description}"></td>
|
||||
<td><a th:href="${b.repositoryUrl}" target="_blank">gitlab</a></td>
|
||||
<td><a th:href="@{/projectmanagement/app/{id}/assign(id=${b.pkApp})}">zuordnen</a><span th:text="' (' + ${b.workpackagesString} + ')'" th:if="${b.workpackagesString}"></span></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
var localeUrl = '[[@{/js/dataTables/de.json}]]';
|
||||
$("#table").DataTable({
|
||||
"language" : {
|
||||
"url" : localeUrl
|
||||
}
|
||||
<div class="card">
|
||||
<div class="card-header" th:if="${bean}">
|
||||
<span th:text="${project.name}" th:if="${project}"></span>:
|
||||
<span th:text="${bean.name}"></span>
|
||||
</div>
|
||||
<div class="card-body" th:if="${bean}">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-2" th:if="${project}">Projektdetails</div>
|
||||
<div class="col-sm-12 col-md-10" th:if="${project}" th:text="${project.description}"></div>
|
||||
<div class="col-sm-12 col-md-2">Beschreibung</div>
|
||||
<div class="col-sm-12 col-md-10" th:text="${bean.description}"></div>
|
||||
<div class="col-sm-12 col-md-2">Milestone</div>
|
||||
<div class="col-sm-12 col-md-10">
|
||||
<a th:href="${bean.milestoneUrl}" target="_blank" th:text="${bean.milestoneUrl}" th:if="${bean.milestoneUrl}"></a>
|
||||
</div>
|
||||
<div class="col-sm-12 col-md-2">Vertrag</div>
|
||||
<div class="col-sm-12 col-md-10" th:text="${bean.contractUrl}"></div>
|
||||
<div class="col-sm-12 col-md-2">Zieldatum</div>
|
||||
<div class="col-sm-12 col-md-10" th:text="${bean.plannedDuedate}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<table id="table" class="table table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Name</th>
|
||||
<th>Beschreibung</th>
|
||||
<th>URL</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr th:each="b : ${apps}">
|
||||
<td th:text="${b.name}"></td>
|
||||
<td th:text="${b.description}"></td>
|
||||
<td><a th:href="${b.repositoryUrl}" target="_blank">gitlab</a></td>
|
||||
<td><a th:href="@{/projectmanagement/app/{id}/assign(id=${b.pkApp})}">zuordnen</a><span th:text="' (' + ${b.workpackagesString} + ')'" th:if="${b.workpackagesString}"></span></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
var localeUrl = '[[@{/js/dataTables/de.json}]]';
|
||||
$("#table").DataTable({
|
||||
"language" : {
|
||||
"url" : localeUrl
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</script>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
|
||||
Reference in New Issue
Block a user