overview on index

This commit is contained in:
Jörg Henke
2022-07-26 10:36:22 +02:00
parent f98ceeb68b
commit 8b14e49952
9 changed files with 182 additions and 46 deletions

View File

@ -5,7 +5,7 @@ plugins {
} }
group = 'de.jottyfan' group = 'de.jottyfan'
version = '1.2.1' version = '1.2.2'
sourceCompatibility = '11' sourceCompatibility = '11'
ext['spring-framework.version'] = '5.3.18' ext['spring-framework.version'] = '5.3.18'

View File

@ -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";
}
}

View File

@ -40,17 +40,6 @@ public class ContactController {
this.request = request; 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") @ModelAttribute("currentUser")
@ResponseBody @ResponseBody
public String getCurrentUser() { public String getCurrentUser() {

View File

@ -19,8 +19,6 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import de.jottyfan.timetrack.db.done.tables.records.TProjectRecord;
/** /**
* *
* @author henkej * @author henkej

View File

@ -24,6 +24,17 @@ public class SummaryBean implements Serializable {
this.maxDayWorktime = maxDayWorktime; 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) { public String getBillingTime(String key) {
Duration duration = Duration.ZERO; Duration duration = Duration.ZERO;
for (DoneBean bean : list) { for (DoneBean bean : list) {

View File

@ -53,6 +53,7 @@ body {
border-radius: 4px; border-radius: 4px;
padding: 24px; padding: 24px;
background: whitesmoke; background: whitesmoke;
min-width: 95vw !important;
} }
.menudangerbutton { .menudangerbutton {
@ -81,7 +82,8 @@ body {
.page { .page {
width: 100%; width: 100%;
background-image: linear-gradient(to bottom, #99c1f1, #1a5f64) !important; background-image: linear-gradient(to bottom, #99c1f1, #1a5f64)
!important;
} }
.emph { .emph {
@ -240,6 +242,37 @@ body {
border: 1px solid silver; 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 { .clock {
background-image: url("../png/clock.png"); background-image: url("../png/clock.png");
background-repeat: no-repeat; background-repeat: no-repeat;

View File

@ -25,10 +25,11 @@
<div class="row mb-3"> <div class="row mb-3">
<label for="inputTimefrom" class="col-sm-1 col-form-label">von</label> <label for="inputTimefrom" class="col-sm-1 col-form-label">von</label>
<div class="col-sm-1"> <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>
<div class="col-sm-10"> <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-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(-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(-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> <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(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-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(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> </div>
<div class="row mb-3"> <div class="row mb-3">
<label for="inputTimeuntil" class="col-sm-1 col-form-label">bis</label> <label for="inputTimeuntil" class="col-sm-1 col-form-label">bis</label>
<div class="col-sm-1"> <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>
<div class="col-sm-10"> <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-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(-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(-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> <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(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-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(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> </div>
<div class="row mb-12"> <div class="row mb-12">

View File

@ -19,8 +19,15 @@
</li> </li>
</ul> </ul>
<ul layout:fragment="menu"> <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 <li class="nav-item" sec:authorize="hasRole('timetrack_user')">
Eintrag</a></li> <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> </ul>
<main layout:fragment="content"> <main layout:fragment="content">
<ul class="nav nav-tabs navback" role="tablist"> <ul class="nav nav-tabs navback" role="tablist">
@ -48,10 +55,14 @@
<tr th:each="done : ${doneList}"> <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.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 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"
<td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span class="boldtext" th:text="${done.module?.name}"></span></a></td> 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.activity?.name}"></span></a></td> <td><a class="hoverlink" th:href="@{/done/edit/{id}(id=${done.pk})}"><span class="boldtext"
<td><span th:text="${done.billing.shortcut}" th:class="'billing ' + ${done.billing.csskey}" th:if="${done.billing != null}"></span></td> 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> <td><a th:href="@{/done/edit/{id}(id=${done.pk})}" th:title="${done.pk}"><i class="fa fa-edit"></i></a></td>
</tr> </tr>
</tbody> </tbody>
@ -66,10 +77,14 @@
</tr> </tr>
<tr> <tr>
<td></td> <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('WP2') != '0,0 h'}"><span class="billing WP2">WP2</span><span
<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> th:text="${sum.getBillingTime('WP2')}" 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('WP4') != '0,0 h'}"><span class="billing WP4">WP4</span><span
<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> 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> <td><span class="billing">X</span><span th:text="${sum.getBillingTime(null)}" class="distfat"></span></td>
</tr> </tr>
</tfoot> </tfoot>
@ -93,8 +108,7 @@
</tbody> </tbody>
<tfoot> <tfoot>
<tr> <tr>
<td colspan="3"> <td colspan="3"><a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/project}">neues Projekt</a>
<a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/project}">neues Projekt</a>
</td> </td>
</tr> </tr>
</tfoot> </tfoot>
@ -118,9 +132,7 @@
</tbody> </tbody>
<tfoot> <tfoot>
<tr> <tr>
<td colspan="3"> <td colspan="3"><a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/module}">neues Modul</a></td>
<a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/module}">neues Modul</a>
</td>
</tr> </tr>
</tfoot> </tfoot>
</table> </table>
@ -143,9 +155,7 @@
</tbody> </tbody>
<tfoot> <tfoot>
<tr> <tr>
<td colspan="3"> <td colspan="3"><a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/job}">neue Aufgabe</a></td>
<a class="nav-link btn btn-success btn-white-text" th:href="@{/done/add/job}">neue Aufgabe</a>
</td>
</tr> </tr>
</tfoot> </tfoot>
</table> </table>

View File

@ -7,6 +7,36 @@
<body> <body>
<ul layout:fragment="menu"> <ul layout:fragment="menu">
</ul> </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> </body>
</html> </html>