overview on index
This commit is contained in:
@ -5,7 +5,7 @@ plugins {
|
||||
}
|
||||
|
||||
group = 'de.jottyfan'
|
||||
version = '1.2.1'
|
||||
version = '1.2.2'
|
||||
sourceCompatibility = '11'
|
||||
|
||||
ext['spring-framework.version'] = '5.3.18'
|
||||
|
@ -0,0 +1,61 @@
|
||||
package de.jottyfan.timetrack.spring;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
||||
import javax.annotation.security.RolesAllowed;
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Controller;
|
||||
import org.springframework.ui.Model;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
|
||||
import de.jottyfan.timetrack.spring.done.DoneBean;
|
||||
import de.jottyfan.timetrack.spring.done.DoneModel;
|
||||
import de.jottyfan.timetrack.spring.done.IDoneService;
|
||||
import de.jottyfan.timetrack.spring.done.SummaryBean;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author henkej
|
||||
*
|
||||
*/
|
||||
@Controller
|
||||
public class IndexController {
|
||||
private static final Logger LOGGER = LogManager.getLogger(IndexController.class);
|
||||
|
||||
private final HttpServletRequest request;
|
||||
|
||||
@Autowired
|
||||
private IDoneService doneService;
|
||||
|
||||
@Autowired
|
||||
public IndexController(HttpServletRequest request) {
|
||||
this.request = request;
|
||||
}
|
||||
|
||||
@GetMapping("/logout")
|
||||
public String getLogout(HttpServletRequest request) throws ServletException {
|
||||
request.logout();
|
||||
return "redirect:/";
|
||||
}
|
||||
|
||||
@RolesAllowed("timetrack_user")
|
||||
@RequestMapping("/")
|
||||
public String getIndex(@ModelAttribute DoneModel doneModel, Model model) {
|
||||
String username = doneService.getCurrentUser(request);
|
||||
Duration maxWorkTime = Duration.ofHours(8); // TODO: to the configuration file
|
||||
LocalDate day = LocalDate.now();
|
||||
List<DoneBean> list = doneService.getList(day, username);
|
||||
model.addAttribute("sum", new SummaryBean(list, day, maxWorkTime));
|
||||
LOGGER.debug("sum = {}", model.getAttribute("sum"));
|
||||
return "public/index";
|
||||
}
|
||||
}
|
@ -40,17 +40,6 @@ public class ContactController {
|
||||
this.request = request;
|
||||
}
|
||||
|
||||
@GetMapping("/logout")
|
||||
public String getLogout(HttpServletRequest request) throws ServletException {
|
||||
request.logout();
|
||||
return "redirect:/";
|
||||
}
|
||||
|
||||
@GetMapping("/")
|
||||
public String getIndex() {
|
||||
return "public/index";
|
||||
}
|
||||
|
||||
@ModelAttribute("currentUser")
|
||||
@ResponseBody
|
||||
public String getCurrentUser() {
|
||||
|
@ -19,8 +19,6 @@ import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMethod;
|
||||
|
||||
import de.jottyfan.timetrack.db.done.tables.records.TProjectRecord;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author henkej
|
||||
|
@ -24,6 +24,17 @@ public class SummaryBean implements Serializable {
|
||||
this.maxDayWorktime = maxDayWorktime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
StringBuilder buf = new StringBuilder("{");
|
||||
buf.append("start=").append(getStart());
|
||||
buf.append(",end=").append(getEnd());
|
||||
buf.append(",pause=").append(getPause());
|
||||
buf.append(",overdue=").append(getOverdue());
|
||||
buf.append("}");
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
public String getBillingTime(String key) {
|
||||
Duration duration = Duration.ZERO;
|
||||
for (DoneBean bean : list) {
|
||||
|
@ -49,22 +49,23 @@ body {
|
||||
|
||||
.formpane {
|
||||
margin: 24px;
|
||||
border: 1px solid silver;
|
||||
border-radius: 4px;
|
||||
padding: 24px;
|
||||
background: whitesmoke;
|
||||
border: 1px solid silver;
|
||||
border-radius: 4px;
|
||||
padding: 24px;
|
||||
background: whitesmoke;
|
||||
min-width: 95vw !important;
|
||||
}
|
||||
|
||||
.menudangerbutton {
|
||||
color: #e00 !important;
|
||||
border: 1px solid rgba(0,0,0,0);
|
||||
border: 1px solid rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
.menudangerbutton:hover {
|
||||
color: #f00 !important;
|
||||
border: 1px solid silver;
|
||||
border-radius: 4px;
|
||||
background: rgba(255,0,0,0.2);
|
||||
background: rgba(255, 0, 0, 0.2);
|
||||
}
|
||||
|
||||
.redfont {
|
||||
@ -81,7 +82,8 @@ body {
|
||||
|
||||
.page {
|
||||
width: 100%;
|
||||
background-image: linear-gradient(to bottom, #99c1f1, #1a5f64) !important;
|
||||
background-image: linear-gradient(to bottom, #99c1f1, #1a5f64)
|
||||
!important;
|
||||
}
|
||||
|
||||
.emph {
|
||||
@ -121,7 +123,7 @@ body {
|
||||
.billing {
|
||||
color: black !important;
|
||||
border: 1px solid darkgray;
|
||||
border-radius: 16px;
|
||||
border-radius: 16px;
|
||||
padding: 4px !important;
|
||||
padding-left: 8px !important;
|
||||
padding-right: 8px !important;
|
||||
@ -176,7 +178,7 @@ body {
|
||||
}
|
||||
|
||||
.fc-content {
|
||||
cursor: pointer;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.btn-white-text {
|
||||
@ -240,6 +242,37 @@ body {
|
||||
border: 1px solid silver;
|
||||
}
|
||||
|
||||
.inputtimefield {
|
||||
min-width: 70px !important;
|
||||
}
|
||||
|
||||
.spanlabel {
|
||||
display: inline-block;
|
||||
min-width: 128px;
|
||||
max-width: 128px;
|
||||
margin-top: 4px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.btn-bordered {
|
||||
border: 1px solid rgba(1, 1, 1, 0.0);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.btn-bordered:hover {
|
||||
border: 1px solid silver;
|
||||
}
|
||||
|
||||
.btn-secondaryhover:hover {
|
||||
background-image: linear-gradient(to right bottom, #99c1f1, #1a5f64);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.btn-dangerhover:hover {
|
||||
background-image: linear-gradient(to right bottom, rgba(255, 128, 0, 0.3),
|
||||
rgba(255, 128, 0, 1));
|
||||
}
|
||||
|
||||
.clock {
|
||||
background-image: url("../png/clock.png");
|
||||
background-repeat: no-repeat;
|
||||
|
@ -25,10 +25,11 @@
|
||||
<div class="row mb-3">
|
||||
<label for="inputTimefrom" class="col-sm-1 col-form-label">von</label>
|
||||
<div class="col-sm-1">
|
||||
<input id="inputTimefrom" type="text" th:field="*{timeFromString}" class="form-control" onchange="validateTime(this, 'okbtn')" />
|
||||
<input id="inputTimefrom" type="text" th:field="*{timeFromString}" class="form-control inputtimefield" onchange="validateTime(this, 'okbtn')" />
|
||||
</div>
|
||||
<div class="col-sm-10">
|
||||
<button type="button" class="btn btn-danger" value="" onclick="resetValue('#inputTimefrom', '')"><span class="fas fa-trash-alt"></span></button>
|
||||
<button type="button" class="btn btn-secondary" onclick="resetValue('#inputTimefrom', nowPlus(-105))"><script type="text/javascript">document.write(nowPlus(-105))</script></button>
|
||||
<button type="button" class="btn btn-secondary" onclick="resetValue('#inputTimefrom', nowPlus(-90))"><script type="text/javascript">document.write(nowPlus(-90))</script></button>
|
||||
<button type="button" class="btn btn-secondary" onclick="resetValue('#inputTimefrom', nowPlus(-75))"><script type="text/javascript">document.write(nowPlus(-75))</script></button>
|
||||
<button type="button" class="btn btn-secondary" onclick="resetValue('#inputTimefrom', nowPlus(-60))"><script type="text/javascript">document.write(nowPlus(-60))</script></button>
|
||||
@ -38,15 +39,17 @@
|
||||
<button type="button" class="btn btn-primary" onclick="resetValue('#inputTimefrom', nowPlus(0))"><script type="text/javascript">document.write(nowPlus(0))</script></button>
|
||||
<button type="button" class="btn btn-primary" onclick="resetValue('#inputTimefrom', nowPlus(15))"><script type="text/javascript">document.write(nowPlus(15))</script></button>
|
||||
<button type="button" class="btn btn-secondary" onclick="resetValue('#inputTimefrom', nowPlus(30))"><script type="text/javascript">document.write(nowPlus(30))</script></button>
|
||||
<button type="button" class="btn btn-secondary" onclick="resetValue('#inputTimefrom', nowPlus(45))"><script type="text/javascript">document.write(nowPlus(45))</script></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-3">
|
||||
<label for="inputTimeuntil" class="col-sm-1 col-form-label">bis</label>
|
||||
<div class="col-sm-1">
|
||||
<input id="inputTimeuntil" type="text" th:field="*{timeUntilString}" class="form-control" onchange="validateTime(this, 'okbtn')" />
|
||||
<input id="inputTimeuntil" type="text" th:field="*{timeUntilString}" class="form-control inputtimefield" onchange="validateTime(this, 'okbtn')" />
|
||||
</div>
|
||||
<div class="col-sm-10">
|
||||
<button type="button" class="btn btn-danger" value="" onclick="resetValue('#inputTimeuntil', '')"><span class="fas fa-trash-alt"></span></button>
|
||||
<button type="button" class="btn btn-secondary" onclick="resetValue('#inputTimeuntil', nowPlus(-105))"><script type="text/javascript">document.write(nowPlus(-105))</script></button>
|
||||
<button type="button" class="btn btn-secondary" onclick="resetValue('#inputTimeuntil', nowPlus(-90))"><script type="text/javascript">document.write(nowPlus(-90))</script></button>
|
||||
<button type="button" class="btn btn-secondary" onclick="resetValue('#inputTimeuntil', nowPlus(-75))"><script type="text/javascript">document.write(nowPlus(-75))</script></button>
|
||||
<button type="button" class="btn btn-secondary" onclick="resetValue('#inputTimeuntil', nowPlus(-60))"><script type="text/javascript">document.write(nowPlus(-60))</script></button>
|
||||
@ -56,6 +59,7 @@
|
||||
<button type="button" class="btn btn-primary" onclick="resetValue('#inputTimeuntil', nowPlus(0))"><script type="text/javascript">document.write(nowPlus(0))</script></button>
|
||||
<button type="button" class="btn btn-primary" onclick="resetValue('#inputTimeuntil', nowPlus(15))"><script type="text/javascript">document.write(nowPlus(15))</script></button>
|
||||
<button type="button" class="btn btn-secondary" onclick="resetValue('#inputTimeuntil', nowPlus(30))"><script type="text/javascript">document.write(nowPlus(30))</script></button>
|
||||
<button type="button" class="btn btn-secondary" onclick="resetValue('#inputTimeuntil', nowPlus(45))"><script type="text/javascript">document.write(nowPlus(45))</script></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mb-12">
|
||||
|
@ -19,8 +19,15 @@
|
||||
</li>
|
||||
</ul>
|
||||
<ul layout:fragment="menu">
|
||||
<li class="nav-item" sec:authorize="hasRole('timetrack_user')"><a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/{day}(day=${doneModel.day})}">Neuer
|
||||
Eintrag</a></li>
|
||||
<li class="nav-item" sec:authorize="hasRole('timetrack_user')">
|
||||
<table>
|
||||
<tr>
|
||||
<td><a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/{day}(day=${doneModel.day})}">Neuer
|
||||
Eintrag</a></td>
|
||||
<td style="padding-left: 8px"><a class="nav-link btn btn-bordered btn-dangerhover" style="width: 44px" th:href="@{/done/list}"><i class="fas fa-sync"></i></a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</li>
|
||||
</ul>
|
||||
<main layout:fragment="content">
|
||||
<ul class="nav nav-tabs navback" role="tablist">
|
||||
@ -48,10 +55,14 @@
|
||||
<tr th:each="done : ${doneList}">
|
||||
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span th:text="${done.timeNote}"></span></a></td>
|
||||
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span th:text="${done.timeDiff}"></span></a></td>
|
||||
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span class="boldtext" th:text="${done.project?.name}"></span></a></td>
|
||||
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span class="boldtext" th:text="${done.module?.name}"></span></a></td>
|
||||
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span class="boldtext" th:text="${done.activity?.name}"></span></a></td>
|
||||
<td><span th:text="${done.billing.shortcut}" th:class="'billing ' + ${done.billing.csskey}" th:if="${done.billing != null}"></span></td>
|
||||
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span class="boldtext"
|
||||
th:text="${done.project?.name}"></span></a></td>
|
||||
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span class="boldtext"
|
||||
th:text="${done.module?.name}"></span></a></td>
|
||||
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span class="boldtext"
|
||||
th:text="${done.activity?.name}"></span></a></td>
|
||||
<td><span th:text="${done.billing.shortcut}" th:class="'billing ' + ${done.billing.csskey}"
|
||||
th:if="${done.billing != null}"></span></td>
|
||||
<td><a th:href="@{/done/edit/{id}(id=${done.pk})}" th:title="${done.pk}"><i class="fa fa-edit"></i></a></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
@ -66,10 +77,14 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td><span th:if="${sum.getBillingTime('WP2') != '0,0 h'}"><span class="billing WP2">WP2</span><span th:text="${sum.getBillingTime('WP2')}" class="distfat"></span></span></td>
|
||||
<td><span th:if="${sum.getBillingTime('WP4') != '0,0 h'}"><span class="billing WP4">WP4</span><span th:text="${sum.getBillingTime('WP4')}" class="distfat"></span></span></td>
|
||||
<td><span th:if="${sum.getBillingTime('WP5') != '0,0 h'}"><span class="billing WP5">WP5</span><span th:text="${sum.getBillingTime('WP5')}" class="distfat"></span></span></td>
|
||||
<td><span th:if="${sum.getBillingTime('TA3') != '0,0 h'}"><span class="billing TA3">TA3</span><span th:text="${sum.getBillingTime('TA3')}" class="distfat"></span></span></td>
|
||||
<td><span th:if="${sum.getBillingTime('WP2') != '0,0 h'}"><span class="billing WP2">WP2</span><span
|
||||
th:text="${sum.getBillingTime('WP2')}" class="distfat"></span></span></td>
|
||||
<td><span th:if="${sum.getBillingTime('WP4') != '0,0 h'}"><span class="billing WP4">WP4</span><span
|
||||
th:text="${sum.getBillingTime('WP4')}" class="distfat"></span></span></td>
|
||||
<td><span th:if="${sum.getBillingTime('WP5') != '0,0 h'}"><span class="billing WP5">WP5</span><span
|
||||
th:text="${sum.getBillingTime('WP5')}" class="distfat"></span></span></td>
|
||||
<td><span th:if="${sum.getBillingTime('TA3') != '0,0 h'}"><span class="billing TA3">TA3</span><span
|
||||
th:text="${sum.getBillingTime('TA3')}" class="distfat"></span></span></td>
|
||||
<td><span class="billing">X</span><span th:text="${sum.getBillingTime(null)}" class="distfat"></span></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
@ -93,8 +108,7 @@
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/project}">neues Projekt</a>
|
||||
<td colspan="3"><a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/project}">neues Projekt</a>
|
||||
</td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
@ -118,9 +132,7 @@
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/module}">neues Modul</a>
|
||||
</td>
|
||||
<td colspan="3"><a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/module}">neues Modul</a></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
@ -143,9 +155,7 @@
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr>
|
||||
<td colspan="3">
|
||||
<a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/job}">neue Aufgabe</a>
|
||||
</td>
|
||||
<td colspan="3"><a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/job}">neue Aufgabe</a></td>
|
||||
</tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
@ -170,7 +180,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function(){
|
||||
$(document).ready(function() {
|
||||
var localeUrl = '[[@{/js/dataTables/de.json}]]';
|
||||
$("#project_table").DataTable({
|
||||
"language" : {
|
||||
|
@ -7,6 +7,36 @@
|
||||
<body>
|
||||
<ul layout:fragment="menu">
|
||||
</ul>
|
||||
<main layout:fragment="content"></main>
|
||||
<main layout:fragment="content">
|
||||
<div class="card text-dark bg-light" style="width: 256px; margin: 24px">
|
||||
<div class="card-header"><a class="btn btn-seondary btn-bordered btn-secondaryhover" style="width: 100%" th:href="@{/done/list}">heutige Arbeitszeiten</a></div>
|
||||
<div class="card-body">
|
||||
<div>
|
||||
<span class="spanlabel">Start:</span> <span class="emphgreen" th:text="${sum.start}"></span>
|
||||
</div>
|
||||
<div>
|
||||
<span class="spanlabel">Ende:</span> <span class="emphgreen" th:text="${sum.end}"></span>
|
||||
</div>
|
||||
<div>
|
||||
<span class="spanlabel">Arbeitszeit total:</span> <span class="emphblue" th:text="${sum.total}"></span>
|
||||
</div>
|
||||
<div>
|
||||
<span class="spanlabel">Pausezeit total:</span> <span class="emphorange" th:text="${sum.pause}"></span>
|
||||
</div>
|
||||
<div>
|
||||
<span class="spanlabel">Überstunden:</span> <span class="emphred" th:text="${sum.overdue}"></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer">
|
||||
<span th:if="${sum.getBillingTime('WP2') != '0,0 h'}"><span class="billing WP2">WP2</span><span
|
||||
th:text="${sum.getBillingTime('WP2')}" class="distfat"></span></span> <span th:if="${sum.getBillingTime('WP4') != '0,0 h'}"><span
|
||||
class="billing WP4">WP4</span><span th:text="${sum.getBillingTime('WP4')}" class="distfat"></span></span> <span
|
||||
th:if="${sum.getBillingTime('WP5') != '0,0 h'}"><span class="billing WP5">WP5</span><span
|
||||
th:text="${sum.getBillingTime('WP5')}" class="distfat"></span></span> <span th:if="${sum.getBillingTime('TA3') != '0,0 h'}"><span
|
||||
class="billing TA3">TA3</span><span th:text="${sum.getBillingTime('TA3')}" class="distfat"></span></span> <span class="billing">X</span><span
|
||||
th:text="${sum.getBillingTime(null)}" class="distfat"></span>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
Reference in New Issue
Block a user