6 Commits

Author SHA1 Message Date
Nils Burghardt
5d7329a811 Merge branch 'master' into feature/2_adjust_dashboard
# Conflicts:
#	src/main/java/de/nilzbu/mytimetracker/ui/view/DashboardOverView.java
2025-07-21 14:52:49 +02:00
Nils Burghardt
f09fee5a55 refactor dashboard 2025-07-21 14:51:25 +02:00
ac3993545e .gitea/workflows/restart.yaml aktualisiert
All checks were successful
Build-und-Deploy / build (push) Successful in 11s
2025-07-21 12:21:10 +00:00
c62127e24d .gitea/workflows/restart.yaml aktualisiert
All checks were successful
Build-und-Deploy / build (push) Successful in 12s
2025-07-21 12:19:09 +00:00
f36fd63a04 addRestartAction (#12)
All checks were successful
Build-und-Deploy / build (push) Successful in 12s
Co-authored-by: Nils Burghardt <nilzbu@gmail.com>
Reviewed-on: #12
2025-07-21 12:09:45 +00:00
75ddbecc79 Enhance Dashboard (#11)
All checks were successful
Build-und-Deploy / build (push) Successful in 23s
Co-authored-by: Nils Burghardt <nilzbu@gmail.com>
Reviewed-on: #11
2025-07-21 10:53:08 +00:00
3 changed files with 44 additions and 7 deletions

View File

@@ -0,0 +1,14 @@
name: Docker Restart Manuell
on:
workflow_dispatch:
jobs:
restart-docker:
runs-on: ubuntu-latest
steps:
- name: Docker Compose Restart
run: |
cd /home/docker/apps/mytimetracker
docker compose down
docker compose up -d

View File

@@ -23,6 +23,10 @@ public class TimeEntryService {
return repository.findAllByUserOrderByDateDesc(user); return repository.findAllByUserOrderByDateDesc(user);
} }
public int getNumberOfEntriesForUser(User user) {
return getEntriesForUser(user).size();
}
public TimeEntry save(TimeEntry entry) { public TimeEntry save(TimeEntry entry) {
return repository.save(entry); return repository.save(entry);
} }

View File

@@ -19,6 +19,7 @@ import de.nilzbu.mytimetracker.ui.component.ChartJsComponent;
import de.nilzbu.mytimetracker.ui.layout.MainLayout; import de.nilzbu.mytimetracker.ui.layout.MainLayout;
import de.nilzbu.mytimetracker.ui.widget.KeyFigureWidget; import de.nilzbu.mytimetracker.ui.widget.KeyFigureWidget;
import jakarta.annotation.security.PermitAll; import jakarta.annotation.security.PermitAll;
import org.jetbrains.annotations.NotNull;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import java.time.LocalDate; import java.time.LocalDate;
@@ -150,8 +151,14 @@ public class DashboardOverView extends VerticalLayout {
chartLayout.setSpacing(true); chartLayout.setSpacing(true);
Component categoryChart = createCategoryBarChart(scopedEntries); Component categoryChart = createCategoryBarChart(scopedEntries);
Component overtimeChart = createOvertimeLineChart(allEntries, scopedEntries); categoryChart.getStyle().setBackgroundColor("lightgray");
categoryChart.getStyle().setBorder("1px solid black" );
categoryChart.getStyle().setMargin("10px");
Component overtimeChart = createOvertimeLineChart(allEntries, scopedEntries);
overtimeChart.getStyle().setBackgroundColor("lightgray");
overtimeChart.getStyle().setBorder("1px solid black" );
overtimeChart.getStyle().setMargin("10px");
chartLayout.add(categoryChart, overtimeChart); chartLayout.add(categoryChart, overtimeChart);
chartLayout.setFlexGrow(1, categoryChart); chartLayout.setFlexGrow(1, categoryChart);
@@ -184,18 +191,30 @@ public class DashboardOverView extends VerticalLayout {
calculateDaysWithDayStatus.apply(scopedEntries, DayStatus.SICK) calculateDaysWithDayStatus.apply(scopedEntries, DayStatus.SICK)
); );
KeyFigureWidget deviation = new KeyFigureWidget( KeyFigureWidget timeBalance = new KeyFigureWidget(
"Deviation", "Time Balance",
"" + scopedEntries.stream() getTimeBalance(scopedEntries)
.map(entry -> timeEntryService.calculateNetWorkMinutes(entry) - entry.getTargetMinutes())
.reduce(0, Integer::sum)
); );
keyFigureLayout.add(deviation, workingDays, remoteDays, officeDays, vacationDays, sickDays); keyFigureLayout.getStyle().setBackgroundColor("lightgray");
keyFigureLayout.getStyle().setBorder("1px solid black" );
keyFigureLayout.getStyle().setMargin("10px");
keyFigureLayout.add(timeBalance, workingDays, remoteDays, officeDays, vacationDays, sickDays);
contentContainer.add(keyFigureLayout); contentContainer.add(keyFigureLayout);
} }
@NotNull
private String getTimeBalance(List<TimeEntry> scopedEntries) {
Integer minutes = scopedEntries.stream()
.map(entry -> timeEntryService.calculateNetWorkMinutes(entry) - entry.getTargetMinutes())
.reduce(0, Integer::sum);
double hours = minutes / 60.0;
return "%.2f h".formatted(hours);
}
private Component createCategoryBarChart(List<TimeEntry> entries) { private Component createCategoryBarChart(List<TimeEntry> entries) {
Map<String, Long> statusCount = entries.stream() Map<String, Long> statusCount = entries.stream()
.collect(Collectors.groupingBy(e -> e.getStatus().name(), Collectors.counting())); .collect(Collectors.groupingBy(e -> e.getStatus().name(), Collectors.counting()));