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

Add filtering to match history

This commit is contained in:
Anton Micke
2025-03-21 20:20:54 +01:00
committed by AJMicke
parent d2c1f8eb2d
commit c2c9fbf3d7
4 changed files with 115 additions and 26 deletions

View File

@@ -7,10 +7,7 @@ import com.vaadin.flow.component.html.H1;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.sidenav.SideNav;
import com.vaadin.flow.component.sidenav.SideNavItem;
import com.vaadin.flow.component.tabs.Tab;
import com.vaadin.flow.component.tabs.Tabs;
import com.vaadin.flow.router.Layout;
import com.vaadin.flow.router.RouterLink;
import org.kickerelo.kickerelo.views.*;
@Layout
@@ -25,20 +22,6 @@ public class KickerAppLayout extends AppLayout {
addToNavbar(drawerToggle, title);
RouterLink enter1vs1 = new RouterLink("1 vs 1 Ergebnis", Enter1vs1View.class);
RouterLink enter2vs2 = new RouterLink("2 vs 2 Ergebnis", Enter2vs2View.class);
RouterLink playerList = new RouterLink("Spielerliste", PlayerListView.class);
RouterLink graph1vs1 = new RouterLink("Graph 1 vs 1", Graph1vs1View.class);
RouterLink graph2vs2 = new RouterLink("Graph 2 vs 2", Graph2vs2View.class);
RouterLink history1vs1 = new RouterLink("Resultate 1 vs 1", History1vs1View.class);
RouterLink history2vs2 = new RouterLink("Resultate 2 vs 2", History2vs2View.class);
RouterLink admin = new RouterLink("Verwaltung", AdminView.class);
Tabs tabs = new Tabs(new Tab(VaadinIcon.GROUP.create(), playerList), new Tab(VaadinIcon.COG.create(), admin),
new Tab(VaadinIcon.EDIT.create(), enter1vs1), new Tab(VaadinIcon.BAR_CHART.create(), graph1vs1), new Tab(VaadinIcon.RECORDS.create(), history1vs1),
new Tab(VaadinIcon.EDIT.create(), enter2vs2), new Tab(VaadinIcon.BAR_CHART.create(), graph2vs2), new Tab(VaadinIcon.RECORDS.create(), history2vs2));
tabs.setOrientation(Tabs.Orientation.VERTICAL);
SideNav general = new SideNav("Allgemein");
general.setCollapsible(true);
general.addItem(new SideNavItem("Spielerliste", PlayerListView.class, VaadinIcon.GROUP.create()),

View File

@@ -2,8 +2,20 @@ package org.kickerelo.kickerelo.repository;
import org.kickerelo.kickerelo.data.Ergebnis1vs1;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface Ergebnis1vs1Repository extends JpaRepository<Ergebnis1vs1, Long> {
@Query("""
SELECT e from Ergebnis1vs1 e WHERE
(:S1 IS NOT NULL AND :S2 IS NOT NULL AND (:S1=e.gewinner.name AND :S2 = e.verlierer.name OR :S1=e.verlierer.name AND :S2=e.gewinner.name)) OR
(:S1 IS NOT NULL AND :S2 IS NULL AND (:S1=e.gewinner.name OR :S1=e.verlierer.name)) OR
(:S1 IS NULL AND :S2 IS NOT NULL AND (:S2=e.gewinner.name OR :S2=e.verlierer.name)) OR
(:S1 IS NULL AND :S2 IS NULL)
""")
List<Ergebnis1vs1> getFiltered(@Param("S1") String s1, @Param("S2") String s2);
}

View File

@@ -2,10 +2,16 @@ package org.kickerelo.kickerelo.views;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridSortOrder;
import com.vaadin.flow.component.grid.dataview.GridListDataView;
import com.vaadin.flow.component.html.H2;
import com.vaadin.flow.component.icon.Icon;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.provider.SortDirection;
import com.vaadin.flow.data.renderer.LocalDateTimeRenderer;
import com.vaadin.flow.data.value.ValueChangeMode;
import com.vaadin.flow.router.Route;
import org.kickerelo.kickerelo.data.Ergebnis1vs1;
import org.kickerelo.kickerelo.repository.Ergebnis1vs1Repository;
@@ -14,15 +20,32 @@ import java.util.List;
@Route("history1vs1")
public class History1vs1View extends VerticalLayout {
List<Ergebnis1vs1> res;
public History1vs1View(Ergebnis1vs1Repository repo) {
setSizeFull();
H2 subheading = new H2("Spiele 1 vs 1");
List<Ergebnis1vs1> res = repo.findAll();
res = repo.findAll();
Grid<Ergebnis1vs1> grid = new Grid<>(Ergebnis1vs1.class);
GridListDataView<Ergebnis1vs1> dataView = grid.setItems(res);
HorizontalLayout filterLayout = new HorizontalLayout();
filterLayout.setWidth("95%");
TextField filter1 = new TextField();
filter1.setPlaceholder("Spieler");
filter1.setPrefixComponent(new Icon(VaadinIcon.SEARCH));
filter1.setValueChangeMode(ValueChangeMode.EAGER);
filter1.addValueChangeListener(event -> dataView.refreshAll());
filter1.setMaxWidth("50%");
TextField filter2 = new TextField();
filter2.setPlaceholder("Spieler");
filter2.setPrefixComponent(new Icon(VaadinIcon.SEARCH));
filter2.setValueChangeMode(ValueChangeMode.EAGER);
filter2.addValueChangeListener(event -> dataView.refreshAll());
filter2.setMaxWidth("50%");
filterLayout.add(filter1, filter2);
grid.setItems(res);
grid.removeColumnByKey("id");
Grid.Column<Ergebnis1vs1> winnerColumn = grid.getColumnByKey("gewinner");
winnerColumn.setHeader("Gewinner");
Grid.Column<Ergebnis1vs1> loserColumn = grid.getColumnByKey("verlierer");
@@ -32,11 +55,32 @@ public class History1vs1View extends VerticalLayout {
Grid.Column<Ergebnis1vs1> timestamp = grid.getColumnByKey("timestamp");
timestamp.setHeader("Zeitpunkt");
timestamp.setRenderer(new LocalDateTimeRenderer<>(Ergebnis1vs1::getTimestamp, "dd.MM.yy HH:mm"));
grid.setColumnOrder(winnerColumn, loserColumn, goals, timestamp);
GridSortOrder<Ergebnis1vs1> sortOrder = new GridSortOrder<>(timestamp, SortDirection.DESCENDING);
grid.sort(List.of(sortOrder));
add(subheading, grid);
dataView.addFilter(result -> {
String name1 = result.getGewinner().getName();
String name2 = result.getVerlierer().getName();
String s1 = filter1.getValue();
boolean p1 = !(s1 == null || s1.isEmpty());
String s2 = filter2.getValue();
boolean p2 = !(s2 == null || s2.isEmpty());
if (p1 && p2) {
return name1.contains(s1) && name2.contains(s2) || name2.contains(s1) && name1.contains(s2);
}
if (p1) {
return name1.contains(s1) || name2.contains(s1);
}
if (p2) {
return name1.contains(s2) || name2.contains(s2);
}
return true;
});
add(subheading, filterLayout, grid);
}

View File

@@ -2,10 +2,16 @@ package org.kickerelo.kickerelo.views;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridSortOrder;
import com.vaadin.flow.component.grid.dataview.GridListDataView;
import com.vaadin.flow.component.html.H2;
import com.vaadin.flow.component.icon.Icon;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.provider.SortDirection;
import com.vaadin.flow.data.renderer.LocalDateTimeRenderer;
import com.vaadin.flow.data.value.ValueChangeMode;
import com.vaadin.flow.router.Route;
import org.kickerelo.kickerelo.data.Ergebnis2vs2;
import org.kickerelo.kickerelo.repository.Ergebnis2vs2Repository;
@@ -19,10 +25,26 @@ public class History2vs2View extends VerticalLayout {
H2 subheading = new H2("Spiele 2 vs 2");
List<Ergebnis2vs2> res = repo.findAll();
Grid<Ergebnis2vs2> grid = new Grid<>(Ergebnis2vs2.class);
GridListDataView<Ergebnis2vs2> dataView = grid.setItems(res);
HorizontalLayout filterLayout = new HorizontalLayout();
filterLayout.setWidth("95%");
TextField filter1 = new TextField();
filter1.setPlaceholder("Spieler");
filter1.setPrefixComponent(new Icon(VaadinIcon.SEARCH));
filter1.setValueChangeMode(ValueChangeMode.EAGER);
filter1.addValueChangeListener(event -> dataView.refreshAll());
filter1.setMaxWidth("50%");
TextField filter2 = new TextField();
filter2.setPlaceholder("Spieler");
filter2.setPrefixComponent(new Icon(VaadinIcon.SEARCH));
filter2.setValueChangeMode(ValueChangeMode.EAGER);
filter2.addValueChangeListener(event -> dataView.refreshAll());
filter2.setMaxWidth("50%");
filterLayout.add(filter1, filter2);
grid.setItems(res);
grid.removeColumnByKey("id");
Grid.Column<Ergebnis2vs2> winnerFront = grid.getColumnByKey("gewinnerVorn");
winnerFront.setHeader("Gewinner vorne");
Grid.Column<Ergebnis2vs2> winnerBack = grid.getColumnByKey("gewinnerHinten");
@@ -40,6 +62,34 @@ public class History2vs2View extends VerticalLayout {
grid.setColumnOrder(winnerFront, winnerBack, loserFront, loserBack, goals, timestamp);
GridSortOrder<Ergebnis2vs2> sortOrder = new GridSortOrder<>(timestamp, SortDirection.DESCENDING);
grid.sort(List.of(sortOrder));
add(subheading, grid);
dataView.addFilter(result -> {
String name1 = result.getGewinnerVorn().getName();
String name2 = result.getVerliererVorn().getName();
String name3 = result.getVerliererHinten().getName();
String name4 = result.getGewinnerHinten().getName();
String s1 = filter1.getValue();
boolean p1 = !(s1 == null || s1.isEmpty());
String s2 = filter2.getValue();
boolean p2 = !(s2 == null || s2.isEmpty());
if (p1 && p2) {
return name1.contains(s1) && name2.contains(s2) || name2.contains(s1) && name1.contains(s2)
|| name1.contains(s1) && name3.contains(s2) || name3.contains(s1) && name1.contains(s2)
|| name1.contains(s1) && name4.contains(s2) || name4.contains(s1) && name1.contains(s2)
|| name2.contains(s1) && name3.contains(s2) || name3.contains(s1) && name2.contains(s2)
|| name2.contains(s1) && name4.contains(s2) || name4.contains(s1) && name2.contains(s2)
|| name3.contains(s1) && name4.contains(s2) || name4.contains(s1) && name3.contains(s2);
}
if (p1) {
return name1.contains(s1) || name2.contains(s1) || name3.contains(s1) || name4.contains(s1);
}
if (p2) {
return name1.contains(s2) || name2.contains(s2) || name3.contains(s2) || name4.contains(s2);
}
return true;
});
add(subheading, filterLayout, grid);
}
}