diff --git a/src/main/java/org/kickerelo/kickerelo/layout/KickerAppLayout.java b/src/main/java/org/kickerelo/kickerelo/layout/KickerAppLayout.java index 77a7d0d..23db5af 100644 --- a/src/main/java/org/kickerelo/kickerelo/layout/KickerAppLayout.java +++ b/src/main/java/org/kickerelo/kickerelo/layout/KickerAppLayout.java @@ -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()), diff --git a/src/main/java/org/kickerelo/kickerelo/repository/Ergebnis1vs1Repository.java b/src/main/java/org/kickerelo/kickerelo/repository/Ergebnis1vs1Repository.java index 6332e2d..4179f36 100644 --- a/src/main/java/org/kickerelo/kickerelo/repository/Ergebnis1vs1Repository.java +++ b/src/main/java/org/kickerelo/kickerelo/repository/Ergebnis1vs1Repository.java @@ -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 { + @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 getFiltered(@Param("S1") String s1, @Param("S2") String s2); } diff --git a/src/main/java/org/kickerelo/kickerelo/views/History1vs1View.java b/src/main/java/org/kickerelo/kickerelo/views/History1vs1View.java index 7ef4104..099234c 100644 --- a/src/main/java/org/kickerelo/kickerelo/views/History1vs1View.java +++ b/src/main/java/org/kickerelo/kickerelo/views/History1vs1View.java @@ -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 res; public History1vs1View(Ergebnis1vs1Repository repo) { - setSizeFull(); H2 subheading = new H2("Spiele 1 vs 1"); - List res = repo.findAll(); + res = repo.findAll(); + Grid grid = new Grid<>(Ergebnis1vs1.class); + GridListDataView 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 winnerColumn = grid.getColumnByKey("gewinner"); winnerColumn.setHeader("Gewinner"); Grid.Column loserColumn = grid.getColumnByKey("verlierer"); @@ -32,11 +55,32 @@ public class History1vs1View extends VerticalLayout { Grid.Column 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 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); } diff --git a/src/main/java/org/kickerelo/kickerelo/views/History2vs2View.java b/src/main/java/org/kickerelo/kickerelo/views/History2vs2View.java index e23b7c4..1f1e114 100644 --- a/src/main/java/org/kickerelo/kickerelo/views/History2vs2View.java +++ b/src/main/java/org/kickerelo/kickerelo/views/History2vs2View.java @@ -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 res = repo.findAll(); Grid grid = new Grid<>(Ergebnis2vs2.class); + GridListDataView 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 winnerFront = grid.getColumnByKey("gewinnerVorn"); winnerFront.setHeader("Gewinner vorne"); Grid.Column winnerBack = grid.getColumnByKey("gewinnerHinten"); @@ -40,6 +62,34 @@ public class History2vs2View extends VerticalLayout { grid.setColumnOrder(winnerFront, winnerBack, loserFront, loserBack, goals, timestamp); GridSortOrder 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); } }