5
0
mirror of https://github.com/AJMicke/KickerELO.git synced 2026-03-11 13:31:02 +01:00

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.
This commit is contained in:
Sebastian Beckmann
2025-09-08 16:07:24 +02:00
committed by AJMicke
parent f63e0a7507
commit 1670901a57
3 changed files with 96 additions and 22 deletions

View File

@@ -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<Ergebnis1vs1, Long
(:S1 IS NULL AND :S2 IS NULL)
""")
List<Ergebnis1vs1> 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<Ergebnis1vs1> getResultsForSpieler(@Param("s") Spieler s);
}

View File

@@ -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<String> names = new ArrayList<>();
List<Float> 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);
}
}

View File

@@ -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<String> names = new ArrayList<>();
List<Float> 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);
}
}