From 1670901a578709064cf17c465339cec7609d886b Mon Sep 17 00:00:00 2001 From: Sebastian Beckmann Date: Mon, 8 Sep 2025 16:07:24 +0200 Subject: [PATCH] views: Add checkbox to only show active players Enabled by default, this changes the Elo graphs to only show players that played a game (in the respective category) in the last 2 weeks. --- .../repository/Ergebnis1vs1Repository.java | 4 ++ .../kickerelo/views/Graph1vs1View.java | 57 +++++++++++++++---- .../kickerelo/views/Graph2vs2View.java | 57 +++++++++++++++---- 3 files changed, 96 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/kickerelo/kickerelo/repository/Ergebnis1vs1Repository.java b/src/main/java/org/kickerelo/kickerelo/repository/Ergebnis1vs1Repository.java index 4179f36..f5a2940 100644 --- a/src/main/java/org/kickerelo/kickerelo/repository/Ergebnis1vs1Repository.java +++ b/src/main/java/org/kickerelo/kickerelo/repository/Ergebnis1vs1Repository.java @@ -1,6 +1,7 @@ package org.kickerelo.kickerelo.repository; import org.kickerelo.kickerelo.data.Ergebnis1vs1; +import org.kickerelo.kickerelo.data.Spieler; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -18,4 +19,7 @@ public interface Ergebnis1vs1Repository extends JpaRepository getFiltered(@Param("S1") String s1, @Param("S2") String s2); + + @Query("select e from Ergebnis1vs1 e where (:s = e.verlierer or :s = e.gewinner) order by e.timestamp desc") + List getResultsForSpieler(@Param("s") Spieler s); } diff --git a/src/main/java/org/kickerelo/kickerelo/views/Graph1vs1View.java b/src/main/java/org/kickerelo/kickerelo/views/Graph1vs1View.java index 63e94cc..05efbe7 100644 --- a/src/main/java/org/kickerelo/kickerelo/views/Graph1vs1View.java +++ b/src/main/java/org/kickerelo/kickerelo/views/Graph1vs1View.java @@ -1,29 +1,64 @@ package org.kickerelo.kickerelo.views; -import java.util.ArrayList; -import java.util.List; - -import org.kickerelo.kickerelo.repository.SpielerRepository; -import org.kickerelo.kickerelo.util.comparator.Spieler1vs1EloComparator; - +import com.vaadin.flow.component.checkbox.Checkbox; import com.vaadin.flow.component.html.H2; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.router.Route; +import org.kickerelo.kickerelo.repository.Ergebnis1vs1Repository; +import org.kickerelo.kickerelo.repository.SpielerRepository; +import org.kickerelo.kickerelo.util.comparator.Spieler1vs1EloComparator; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; @Route("graph1vs1") public class Graph1vs1View extends VerticalLayout { + private final Ergebnis1vs1Repository ergebnisRepository; + private final SpielerRepository spielerRepository; + private Chart chart; - public Graph1vs1View(SpielerRepository repo) { + public Graph1vs1View(Ergebnis1vs1Repository ergebnisRepository, SpielerRepository spielerRepository) { + this.ergebnisRepository = ergebnisRepository; + this.spielerRepository = spielerRepository; setSizeFull(); H2 subheading = new H2("1 vs 1 Elo"); + Checkbox checkbox = new Checkbox(); + checkbox.setValue(true); + checkbox.addValueChangeListener(event -> { + remove(chart); + chart = createChart(event.getValue()); + add(chart); + }); + checkbox.setLabel("Nur aktive Spieler*innen anzeigen"); + checkbox.setTooltipText("Nur Spieler*innen anzeigen, die in den letzten 2 Wochen gespielt haben"); + chart = createChart(true); + + add(subheading, checkbox, chart); + } + + private Chart createChart(boolean onlyActive) { List names = new ArrayList<>(); List elo = new ArrayList<>(); - repo.getSpielerWith1vs1Games().stream().sorted(new Spieler1vs1EloComparator()).forEach((s) -> {names.add(s.getName()); elo.add(s.getElo1vs1());}); + spielerRepository.getSpielerWith1vs1Games().stream() + .filter((spieler) -> { + if (!onlyActive) { + return true; + } - Chart chart = new Chart(names, elo); - - add(subheading, chart); + var results = ergebnisRepository.getResultsForSpieler(spieler); + return results.stream().anyMatch((result) -> { + var twoWeeksAgo = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusWeeks(2); + return result.getTimestamp().isAfter(twoWeeksAgo); + }); + }) + .sorted(new Spieler1vs1EloComparator()).forEach((s) -> { + names.add(s.getName()); + elo.add(s.getElo1vs1()); + }); + return new Chart(names, elo); } } diff --git a/src/main/java/org/kickerelo/kickerelo/views/Graph2vs2View.java b/src/main/java/org/kickerelo/kickerelo/views/Graph2vs2View.java index 068ca9f..45d7b9d 100644 --- a/src/main/java/org/kickerelo/kickerelo/views/Graph2vs2View.java +++ b/src/main/java/org/kickerelo/kickerelo/views/Graph2vs2View.java @@ -1,29 +1,64 @@ package org.kickerelo.kickerelo.views; -import java.util.ArrayList; -import java.util.List; - -import org.kickerelo.kickerelo.repository.SpielerRepository; -import org.kickerelo.kickerelo.util.comparator.Spieler2vs2EloComparator; - +import com.vaadin.flow.component.checkbox.Checkbox; import com.vaadin.flow.component.html.H2; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.router.Route; +import org.kickerelo.kickerelo.repository.Ergebnis2vs2Repository; +import org.kickerelo.kickerelo.repository.SpielerRepository; +import org.kickerelo.kickerelo.util.comparator.Spieler2vs2EloComparator; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; @Route("graph2vs2") public class Graph2vs2View extends VerticalLayout { + private final Ergebnis2vs2Repository ergebnisRepository; + private final SpielerRepository spielerRepository; + private Chart chart; - public Graph2vs2View(SpielerRepository repo) { + public Graph2vs2View(Ergebnis2vs2Repository ergebnisRepository, SpielerRepository spielerRepository) { + this.ergebnisRepository = ergebnisRepository; + this.spielerRepository = spielerRepository; setSizeFull(); H2 subheading = new H2("2 vs 2 Elo"); + Checkbox checkbox = new Checkbox(); + checkbox.setValue(true); + checkbox.addValueChangeListener(event -> { + remove(chart); + chart = createChart(event.getValue()); + add(chart); + }); + checkbox.setLabel("Nur aktive Spieler*innen anzeigen"); + checkbox.setTooltipText("Nur Spieler*innen anzeigen, die in den letzten 2 Wochen gespielt haben"); + chart = createChart(true); + + add(subheading, checkbox, chart); + } + + private Chart createChart(boolean onlyActive) { List names = new ArrayList<>(); List elo = new ArrayList<>(); - repo.getSpielerWith2vs2Games().stream().sorted(new Spieler2vs2EloComparator()).forEach((s) -> {names.add(s.getName()); elo.add(s.getElo2vs2());}); + spielerRepository.getSpielerWith2vs2Games().stream() + .filter((spieler) -> { + if (!onlyActive) { + return true; + } - Chart chart = new Chart(names, elo); - - add(subheading, chart); + var results = ergebnisRepository.getResultsForSpieler(spieler); + return results.stream().anyMatch((result) -> { + var twoWeeksAgo = LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusWeeks(2); + return result.getTimestamp().isAfter(twoWeeksAgo); + }); + }) + .sorted(new Spieler2vs2EloComparator()).forEach((s) -> { + names.add(s.getName()); + elo.add(s.getElo2vs2()); + }); + return new Chart(names, elo); } }