l) {
+ Theme theme = new Theme();
+ Monochrome monochrome = new Monochrome();
+ monochrome.setEnabled(true);
+ theme.setMode(Mode.DARK);
+ theme.setMonochrome(monochrome);
+ Labels labels = new Labels();
+ labels.setRotate(270d);
+ labels.setShow(true);
+ labels.setRotateAlways(false);
+
+ withChart(ChartBuilder.get().withType(Type.SCATTER)
+ .withZoom(ZoomBuilder.get().withEnabled(true).withType(ZoomType.XY).build()).build())
+ .withSeries(new Series<>("ELO",
+ l.stream().sorted(new Spieler2vs2EloComparator()).map(Spieler::getElo2vs2).toArray()
+ ))
+ .withXaxis(XAxisBuilder.get().withCategories(l.stream().sorted(new Spieler2vs2EloComparator()).map(Spieler::getName).toList()).withLabels(labels).build())
+ .withYaxis(YAxisBuilder.get().build())
+ .withTheme(theme);
+ }
+}
diff --git a/src/main/java/org/kickerelo/kickerelo/MainView.java b/src/main/java/org/kickerelo/kickerelo/views/Enter1vs1View.java
similarity index 51%
rename from src/main/java/org/kickerelo/kickerelo/MainView.java
rename to src/main/java/org/kickerelo/kickerelo/views/Enter1vs1View.java
index b9d0570..53745c9 100644
--- a/src/main/java/org/kickerelo/kickerelo/MainView.java
+++ b/src/main/java/org/kickerelo/kickerelo/views/Enter1vs1View.java
@@ -1,47 +1,24 @@
-package org.kickerelo.kickerelo;
+package org.kickerelo.kickerelo.views;
import com.vaadin.flow.component.button.Button;
-import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.combobox.ComboBox;
+import com.vaadin.flow.component.html.H2;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.notification.NotificationVariant;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.IntegerField;
-import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.router.Route;
+import org.kickerelo.kickerelo.exception.DuplicatePlayerException;
+import org.kickerelo.kickerelo.exception.InvalidDataException;
+import org.kickerelo.kickerelo.exception.NoSuchPlayerException;
+import org.kickerelo.kickerelo.exception.PlayerNameNotSetException;
+import org.kickerelo.kickerelo.service.KickerEloService;
-/**
- * A sample Vaadin view class.
- *
- * To implement a Vaadin view just extend any Vaadin component and use @Route
- * annotation to announce it in a URL as a Spring managed bean.
- *
- * A new instance of this class is created for every new user and every browser
- * tab/window.
- *
- * The main view contains a text field for getting the user name and a button
- * that shows a greeting message in a notification.
- */
-@Route
-public class MainView extends VerticalLayout {
+@Route(value = "enter1vs1")
+public class Enter1vs1View extends VerticalLayout {
- /**
- * Construct a new Vaadin view.
- */
-
- public MainView(KickerEloService eloService) {
-
-
- TextField spielername = new TextField("Spielername");
- spielername.addClassName("bordered");
-
- // Button click listeners can be defined as lambda expressions
- Button button = new Button("Spieler hinzufügen", e -> {
- eloService.addSpieler(spielername.getValue());
- Notification.show("Spieler gespeichert").addThemeVariants(NotificationVariant.LUMO_SUCCESS);
- });
-
- button.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
+ public Enter1vs1View(KickerEloService eloService) {
+ H2 subheading = new H2("1 vs 1 Ergebnis");
ComboBox winnerSelect = new ComboBox<>("Gewinner");
winnerSelect.setItems(eloService.getSpielerNamen());
@@ -62,7 +39,13 @@ public class MainView extends VerticalLayout {
eloService.enterResult1vs1(winnerSelect.getValue(), loserSelect.getValue(), loserGoals.getValue().shortValue());
Notification.show("Gespeichert").addThemeVariants(NotificationVariant.LUMO_SUCCESS);
} catch (NoSuchPlayerException err) {
- Notification.show("Konnte nicht gespeichert werden").addThemeVariants(NotificationVariant.LUMO_ERROR);
+ Notification.show("Unbekannter Spieler").addThemeVariants(NotificationVariant.LUMO_ERROR);
+ } catch (DuplicatePlayerException err) {
+ Notification.show("Alle Spieler müssen paarweise verschieden sein").addThemeVariants(NotificationVariant.LUMO_ERROR);
+ } catch (PlayerNameNotSetException err) {
+ Notification.show("Alle Spieler müssen gesetzt sein").addThemeVariants(NotificationVariant.LUMO_ERROR);
+ } catch (InvalidDataException err) {
+ Notification.show("Verliertore falsch").addThemeVariants(NotificationVariant.LUMO_ERROR);
}
});
@@ -72,6 +55,6 @@ public class MainView extends VerticalLayout {
// styles.css.
addClassName("centered-content");
- add(spielername, button, winnerSelect, loserSelect, loserGoals, saveButton);
+ add(subheading, winnerSelect, loserSelect, loserGoals, saveButton);
}
-}
\ No newline at end of file
+}
diff --git a/src/main/java/org/kickerelo/kickerelo/views/Enter2vs2View.java b/src/main/java/org/kickerelo/kickerelo/views/Enter2vs2View.java
new file mode 100644
index 0000000..e84fa66
--- /dev/null
+++ b/src/main/java/org/kickerelo/kickerelo/views/Enter2vs2View.java
@@ -0,0 +1,66 @@
+package org.kickerelo.kickerelo.views;
+
+import com.vaadin.flow.component.button.Button;
+import com.vaadin.flow.component.combobox.ComboBox;
+import com.vaadin.flow.component.html.H2;
+import com.vaadin.flow.component.notification.Notification;
+import com.vaadin.flow.component.notification.NotificationVariant;
+import com.vaadin.flow.component.orderedlayout.VerticalLayout;
+import com.vaadin.flow.component.textfield.IntegerField;
+import com.vaadin.flow.router.Route;
+import org.kickerelo.kickerelo.exception.DuplicatePlayerException;
+import org.kickerelo.kickerelo.exception.InvalidDataException;
+import org.kickerelo.kickerelo.exception.NoSuchPlayerException;
+import org.kickerelo.kickerelo.exception.PlayerNameNotSetException;
+import org.kickerelo.kickerelo.service.KickerEloService;
+
+@Route(value = "enter2vs2")
+public class Enter2vs2View extends VerticalLayout {
+ public Enter2vs2View(KickerEloService eloService) {
+ H2 subheading = new H2("2 vs 2 Ergebnis");
+
+ ComboBox winnerFrontSelect = new ComboBox<>("Gewinner vorne");
+ winnerFrontSelect.setItems(eloService.getSpielerNamen());
+ winnerFrontSelect.setPlaceholder("Spieler auswählen");
+
+ ComboBox winnerBackSelect = new ComboBox<>("Gewinner hinten");
+ winnerBackSelect.setItems(eloService.getSpielerNamen());
+ winnerBackSelect.setPlaceholder("Spieler auswählen");
+
+ ComboBox loserFrontSelect = new ComboBox<>("Verlierer vorne");
+ loserFrontSelect.setItems(eloService.getSpielerNamen());
+ loserFrontSelect.setPlaceholder("Spieler auswählen");
+
+ ComboBox loserBackSelect = new ComboBox<>("Verlierer hinten");
+ loserBackSelect.setItems(eloService.getSpielerNamen());
+ loserBackSelect.setPlaceholder("Spieler auswählen");
+
+ IntegerField loserGoals = new IntegerField("Tore des Verlierers");
+ loserGoals.setMin(0);
+ loserGoals.setMax(9);
+ loserGoals.setValue(0);
+ loserGoals.setStepButtonsVisible(true);
+
+ Button saveButton = new Button("Speichern", e -> {
+ try {
+ eloService.enterResult2vs2(winnerFrontSelect.getValue(), winnerBackSelect.getValue(), loserFrontSelect.getValue(), loserBackSelect.getValue(), loserGoals.getValue().shortValue());
+ Notification.show("Gespeichert").addThemeVariants(NotificationVariant.LUMO_SUCCESS);
+ } catch (NoSuchPlayerException err) {
+ Notification.show("Unbekannter Spieler").addThemeVariants(NotificationVariant.LUMO_ERROR);
+ } catch (DuplicatePlayerException err) {
+ Notification.show("Alle Spieler müssen paarweise verschieden sein").addThemeVariants(NotificationVariant.LUMO_ERROR);
+ } catch (PlayerNameNotSetException err) {
+ Notification.show("Alle Spieler müssen gesetzt sein").addThemeVariants(NotificationVariant.LUMO_ERROR);
+ } catch (InvalidDataException err) {
+ Notification.show("Verliertore falsch").addThemeVariants(NotificationVariant.LUMO_ERROR);
+ }
+ });
+
+
+ // Use custom CSS classes to apply styling. This is defined in
+ // styles.css.
+ addClassName("centered-content");
+
+ add(subheading, winnerFrontSelect, winnerBackSelect, loserFrontSelect, loserBackSelect, loserGoals, saveButton);
+ }
+}
diff --git a/src/main/java/org/kickerelo/kickerelo/views/Graph1vs1View.java b/src/main/java/org/kickerelo/kickerelo/views/Graph1vs1View.java
new file mode 100644
index 0000000..7f216e4
--- /dev/null
+++ b/src/main/java/org/kickerelo/kickerelo/views/Graph1vs1View.java
@@ -0,0 +1,20 @@
+package org.kickerelo.kickerelo.views;
+
+import com.github.appreciated.apexcharts.ApexChartsBuilder;
+import com.vaadin.flow.component.html.H2;
+import com.vaadin.flow.component.orderedlayout.VerticalLayout;
+import com.vaadin.flow.router.Route;
+import org.kickerelo.kickerelo.service.KickerEloService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@Route("graph1vs1")
+public class Graph1vs1View extends VerticalLayout {
+
+ ApexChartsBuilder chart1vs1;
+ public Graph1vs1View(KickerEloService service) {
+ H2 subheading = new H2("1 vs 1 Elo");
+ chart1vs1 = new Chart1vs1(service.getSpielerEntities());
+ add(subheading, chart1vs1.build());
+ }
+
+}
diff --git a/src/main/java/org/kickerelo/kickerelo/views/Graph2vs2View.java b/src/main/java/org/kickerelo/kickerelo/views/Graph2vs2View.java
new file mode 100644
index 0000000..56353ca
--- /dev/null
+++ b/src/main/java/org/kickerelo/kickerelo/views/Graph2vs2View.java
@@ -0,0 +1,17 @@
+package org.kickerelo.kickerelo.views;
+
+import com.github.appreciated.apexcharts.ApexChartsBuilder;
+import com.vaadin.flow.component.html.H2;
+import com.vaadin.flow.component.orderedlayout.VerticalLayout;
+import com.vaadin.flow.router.Route;
+import org.kickerelo.kickerelo.service.KickerEloService;
+
+@Route("graph2vs2")
+public class Graph2vs2View extends VerticalLayout {
+ ApexChartsBuilder chart2vs2;
+ public Graph2vs2View(KickerEloService service) {
+ H2 subheading = new H2("2 vs 2 Elo");
+ chart2vs2 = new Chart2vs2(service.getSpielerEntities());
+ add(subheading, chart2vs2.build());
+ }
+}
diff --git a/src/main/java/org/kickerelo/kickerelo/views/PlayerListView.java b/src/main/java/org/kickerelo/kickerelo/views/PlayerListView.java
new file mode 100644
index 0000000..4be1c89
--- /dev/null
+++ b/src/main/java/org/kickerelo/kickerelo/views/PlayerListView.java
@@ -0,0 +1,38 @@
+package org.kickerelo.kickerelo.views;
+
+import com.vaadin.flow.component.grid.Grid;
+import com.vaadin.flow.component.grid.GridSortOrder;
+import com.vaadin.flow.component.html.H2;
+import com.vaadin.flow.component.orderedlayout.VerticalLayout;
+import com.vaadin.flow.data.provider.SortDirection;
+import com.vaadin.flow.router.Route;
+import org.kickerelo.kickerelo.data.Spieler;
+import org.kickerelo.kickerelo.service.KickerEloService;
+
+import java.util.List;
+
+@Route("")
+public class PlayerListView extends VerticalLayout {
+ public PlayerListView(KickerEloService eloService) {
+ setSizeFull();
+ H2 subheading = new H2("Spielerliste");
+
+ List players = eloService.getSpielerEntities();
+ Grid playerGrid = new Grid<>(Spieler.class);
+
+ playerGrid.setItems(players);
+ playerGrid.removeColumnByKey("id");
+ playerGrid.removeColumnByKey("elo_alt");
+ Grid.Column nameColumn = playerGrid.getColumnByKey("name");
+ Grid.Column elo1vs1Column = playerGrid.getColumnByKey("elo1vs1");
+ Grid.Column elo2vs2Column = playerGrid.getColumnByKey("elo2vs2");
+ nameColumn.setHeader("Name");
+ elo1vs1Column.setHeader("Elo 1 vs 1");
+
+ playerGrid.setColumnOrder(nameColumn, elo1vs1Column, elo2vs2Column);
+
+ GridSortOrder sortOrder = new GridSortOrder<>(elo1vs1Column, SortDirection.DESCENDING);
+ playerGrid.sort(List.of(sortOrder));
+ add(subheading, playerGrid);
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 743bb0a..902fa33 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -6,10 +6,9 @@ spring.mustache.check-template-location = false
vaadin.launch-browser=true
spring.datasource.url=jdbc:mariadb://localhost:3306/kickerelo
-spring.datasource.username=
-spring.datasource.password=
+spring.datasource.username=root
+spring.datasource.password=root
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.jpa.hibernate.ddl-auto=validate
-spring.jpa.show-sql=true
-spring.jpa.format-sql=true
+spring.jpa.show-sql=false
spring.jpa.open-in-view=false
\ No newline at end of file