Browse Source

even nicer structure

master
GAM 4 years ago
parent
commit
c03f814668
45 changed files with 413 additions and 395 deletions
  1. +2
    -1
      frontend/app/views/matchday/matchday-view.css
  2. +0
    -18
      src/main/java/app/components/leafletmap/LeafletMap.java
  3. +2
    -2
      src/main/java/app/data/entity/AbstractEntity.java
  4. +1
    -0
      src/main/java/app/data/entity/Game.java
  5. +2
    -2
      src/main/java/app/data/entity/example/SampleAddress.java
  6. +2
    -2
      src/main/java/app/data/entity/example/SamplePerson.java
  7. +0
    -40
      src/main/java/app/data/generator/DataGenerator.java
  8. +1
    -1
      src/main/java/app/data/repository/GameInfoRepository.java
  9. +1
    -1
      src/main/java/app/data/repository/GameRepository.java
  10. +1
    -1
      src/main/java/app/data/repository/MatchRepository.java
  11. +1
    -1
      src/main/java/app/data/repository/MatchdayRepository.java
  12. +1
    -1
      src/main/java/app/data/repository/PlayerInfoRepository.java
  13. +1
    -1
      src/main/java/app/data/repository/PlayerRepository.java
  14. +1
    -1
      src/main/java/app/data/repository/SeasonRepository.java
  15. +2
    -2
      src/main/java/app/data/repository/example/SampleAddressRepository.java
  16. +2
    -2
      src/main/java/app/data/repository/example/SamplePersonRepository.java
  17. +1
    -0
      src/main/java/app/data/service/GameInfoService.java
  18. +1
    -0
      src/main/java/app/data/service/GameService.java
  19. +1
    -0
      src/main/java/app/data/service/MatchService.java
  20. +1
    -0
      src/main/java/app/data/service/MatchdayService.java
  21. +1
    -0
      src/main/java/app/data/service/PlayerInfoService.java
  22. +1
    -0
      src/main/java/app/data/service/PlayerService.java
  23. +1
    -0
      src/main/java/app/data/service/SeasonService.java
  24. +3
    -2
      src/main/java/app/data/service/example/SampleAddressService.java
  25. +3
    -2
      src/main/java/app/data/service/example/SamplePersonService.java
  26. +5
    -5
      src/main/java/app/gameimage/GameImageGenerator.java
  27. +3
    -3
      src/main/java/app/gameimage/GameImageUtils.java
  28. +7
    -5
      src/main/java/app/gameimage/service/GameImageService.java
  29. +15
    -4
      src/main/java/app/navigation/Navigation.java
  30. +1
    -1
      src/main/java/app/navigation/components/NavigationHeader.java
  31. +1
    -1
      src/main/java/app/navigation/components/button/ButtonUtils.java
  32. +1
    -1
      src/main/java/app/navigation/components/button/NextMatchdayButton.java
  33. +1
    -1
      src/main/java/app/navigation/components/button/PrevMatchdayButton.java
  34. +28
    -0
      src/main/java/app/navigation/service/NavigationService.java
  35. +2
    -2
      src/main/java/app/views/example/addressform/AddressFormView.java
  36. +0
    -22
      src/main/java/app/views/example/map/MapView.java
  37. +2
    -2
      src/main/java/app/views/example/masterdetail/MasterDetailView.java
  38. +2
    -2
      src/main/java/app/views/example/personform/PersonFormView.java
  39. +23
    -27
      src/main/java/app/views/match/MatchView.java
  40. +18
    -102
      src/main/java/app/views/matchday/MatchdayView.java
  41. +96
    -0
      src/main/java/app/views/matchday/components/MatchdayComponent.java
  42. +23
    -10
      src/main/java/app/views/navigation/NavigationViewBase.java
  43. +5
    -0
      src/main/java/app/views/navigation/interfaces/ContentConfigurable.java
  44. +18
    -127
      src/main/java/app/views/table/TableView.java
  45. +129
    -0
      src/main/java/app/views/table/components/TableComponent.java

+ 2
- 1
frontend/app/views/matchday/matchday-view.css View File

@ -3,7 +3,8 @@
font-size: large;
}
.matchday-view .matchday_header {
.matchday-view .matchday-header-label {
width: 100%;
font-weight: bolder;
font-size: x-large;
text-align: center;

+ 0
- 18
src/main/java/app/components/leafletmap/LeafletMap.java View File

@ -1,18 +0,0 @@
package app.components.leafletmap;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.HasSize;
import com.vaadin.flow.component.Tag;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.dependency.JsModule;
@CssImport("leaflet/dist/leaflet.css")
@JsModule("app/components/leafletmap/leaflet-map.js")
@Tag("leaflet-map")
public class LeafletMap extends Component implements HasSize {
public void setView(double latitude, double longitude, int zoomLevel) {
getElement().callJsFunction("setView", latitude, longitude, zoomLevel);
}
}

src/main/java/app/data/AbstractEntity.java → src/main/java/app/data/entity/AbstractEntity.java View File

@ -1,11 +1,11 @@
package app.data;
package app.data.entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class AbstractEntity {
public abstract class AbstractEntity { // TODO: Use this in your own entities (adapt annotations and equals())
@Id
@GeneratedValue

+ 1
- 0
src/main/java/app/data/entity/Game.java View File

@ -42,6 +42,7 @@ public class Game {
public void setResult(Integer result) {
this.result = result;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;


src/main/java/app/data/entity/SampleAddress.java → src/main/java/app/data/entity/example/SampleAddress.java View File

@ -1,6 +1,6 @@
package app.data.entity;
package app.data.entity.example;
import app.data.AbstractEntity;
import app.data.entity.AbstractEntity;
import javax.persistence.Entity;

src/main/java/app/data/entity/SamplePerson.java → src/main/java/app/data/entity/example/SamplePerson.java View File

@ -1,6 +1,6 @@
package app.data.entity;
package app.data.entity.example;
import app.data.AbstractEntity;
import app.data.entity.AbstractEntity;
import javax.persistence.Entity;
import java.time.LocalDate;

+ 0
- 40
src/main/java/app/data/generator/DataGenerator.java View File

@ -1,40 +0,0 @@
package app.data.generator;
import app.data.service.SamplePersonRepository;
import com.vaadin.flow.spring.annotation.SpringComponent;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
@SpringComponent
public class DataGenerator {
@Bean
public CommandLineRunner loadData(SamplePersonRepository samplePersonRepository) {
return args -> {
// Logger logger = LoggerFactory.getLogger(getClass());
// if (samplePersonRepository.count() != 0L) {
// logger.info("Using existing database");
// return;
// }
// int seed = 123;
//
// logger.info("Generating demo data");
//
// logger.info("... generating 100 Sample Person entities...");
// ExampleDataGenerator<SamplePerson> samplePersonRepositoryGenerator = new ExampleDataGenerator<>(
// SamplePerson.class, LocalDateTime.of(2021, 2, 26, 0, 0, 0));
// samplePersonRepositoryGenerator.setData(SamplePerson::setId, DataType.ID);
// samplePersonRepositoryGenerator.setData(SamplePerson::setFirstName, DataType.FIRST_NAME);
// samplePersonRepositoryGenerator.setData(SamplePerson::setLastName, DataType.LAST_NAME);
// samplePersonRepositoryGenerator.setData(SamplePerson::setEmail, DataType.EMAIL);
// samplePersonRepositoryGenerator.setData(SamplePerson::setPhone, DataType.PHONE_NUMBER);
// samplePersonRepositoryGenerator.setData(SamplePerson::setDateOfBirth, DataType.DATE_OF_BIRTH);
// samplePersonRepositoryGenerator.setData(SamplePerson::setOccupation, DataType.OCCUPATION);
// samplePersonRepositoryGenerator.setData(SamplePerson::setImportant, DataType.BOOLEAN_10_90);
// samplePersonRepository.saveAll(samplePersonRepositoryGenerator.create(100, seed));
//
// logger.info("Generated demo data");
};
}
}

src/main/java/app/data/service/GameInfoRepository.java → src/main/java/app/data/repository/GameInfoRepository.java View File

@ -1,4 +1,4 @@
package app.data.service;
package app.data.repository;
import app.data.entity.GameInfo;
import org.springframework.data.jpa.repository.JpaRepository;

src/main/java/app/data/service/GameRepository.java → src/main/java/app/data/repository/GameRepository.java View File

@ -1,4 +1,4 @@
package app.data.service;
package app.data.repository;
import app.data.entity.Game;
import org.springframework.data.jpa.repository.JpaRepository;

src/main/java/app/data/service/MatchRepository.java → src/main/java/app/data/repository/MatchRepository.java View File

@ -1,4 +1,4 @@
package app.data.service;
package app.data.repository;
import app.data.entity.Match;
import org.springframework.data.jpa.repository.JpaRepository;

src/main/java/app/data/service/MatchdayRepository.java → src/main/java/app/data/repository/MatchdayRepository.java View File

@ -1,4 +1,4 @@
package app.data.service;
package app.data.repository;
import app.data.entity.Matchday;
import org.springframework.data.jpa.repository.JpaRepository;

src/main/java/app/data/service/PlayerInfoRepository.java → src/main/java/app/data/repository/PlayerInfoRepository.java View File

@ -1,4 +1,4 @@
package app.data.service;
package app.data.repository;
import app.data.entity.PlayerInfo;
import org.springframework.data.jpa.repository.JpaRepository;

src/main/java/app/data/service/PlayerRepository.java → src/main/java/app/data/repository/PlayerRepository.java View File

@ -1,4 +1,4 @@
package app.data.service;
package app.data.repository;
import app.data.entity.Player;
import org.springframework.data.jpa.repository.JpaRepository;

src/main/java/app/data/service/SeasonRepository.java → src/main/java/app/data/repository/SeasonRepository.java View File

@ -1,4 +1,4 @@
package app.data.service;
package app.data.repository;
import app.data.entity.Season;
import org.springframework.data.jpa.repository.JpaRepository;

src/main/java/app/data/service/SampleAddressRepository.java → src/main/java/app/data/repository/example/SampleAddressRepository.java View File

@ -1,6 +1,6 @@
package app.data.service;
package app.data.repository.example;
import app.data.entity.SampleAddress;
import app.data.entity.example.SampleAddress;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SampleAddressRepository extends JpaRepository<SampleAddress, Integer> {

src/main/java/app/data/service/SamplePersonRepository.java → src/main/java/app/data/repository/example/SamplePersonRepository.java View File

@ -1,6 +1,6 @@
package app.data.service;
package app.data.repository.example;
import app.data.entity.SamplePerson;
import app.data.entity.example.SamplePerson;
import org.springframework.data.jpa.repository.JpaRepository;
public interface SamplePersonRepository extends JpaRepository<SamplePerson, Integer> {

+ 1
- 0
src/main/java/app/data/service/GameInfoService.java View File

@ -1,6 +1,7 @@
package app.data.service;
import app.data.entity.GameInfo;
import app.data.repository.GameInfoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.vaadin.artur.helpers.CrudService;


+ 1
- 0
src/main/java/app/data/service/GameService.java View File

@ -1,6 +1,7 @@
package app.data.service;
import app.data.entity.Game;
import app.data.repository.GameRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.vaadin.artur.helpers.CrudService;


+ 1
- 0
src/main/java/app/data/service/MatchService.java View File

@ -4,6 +4,7 @@ import app.data.bean.CalculatedMatch;
import app.data.entity.Game;
import app.data.entity.Match;
import app.data.entity.Matchday;
import app.data.repository.MatchRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.vaadin.artur.helpers.CrudService;


+ 1
- 0
src/main/java/app/data/service/MatchdayService.java View File

@ -2,6 +2,7 @@ package app.data.service;
import app.data.entity.Matchday;
import app.data.entity.Season;
import app.data.repository.MatchdayRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Service;


+ 1
- 0
src/main/java/app/data/service/PlayerInfoService.java View File

@ -1,6 +1,7 @@
package app.data.service;
import app.data.entity.PlayerInfo;
import app.data.repository.PlayerInfoRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.vaadin.artur.helpers.CrudService;


+ 1
- 0
src/main/java/app/data/service/PlayerService.java View File

@ -4,6 +4,7 @@ import app.data.bean.CalculatedMatch;
import app.data.bean.PlayerForTable;
import app.data.entity.Matchday;
import app.data.entity.Player;
import app.data.repository.PlayerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.vaadin.artur.helpers.CrudService;


+ 1
- 0
src/main/java/app/data/service/SeasonService.java View File

@ -1,6 +1,7 @@
package app.data.service;
import app.data.entity.Season;
import app.data.repository.SeasonRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.vaadin.artur.helpers.CrudService;


src/main/java/app/data/service/SampleAddressService.java → src/main/java/app/data/service/example/SampleAddressService.java View File

@ -1,6 +1,7 @@
package app.data.service;
package app.data.service.example;
import app.data.entity.SampleAddress;
import app.data.entity.example.SampleAddress;
import app.data.repository.example.SampleAddressRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.vaadin.artur.helpers.CrudService;

src/main/java/app/data/service/SamplePersonService.java → src/main/java/app/data/service/example/SamplePersonService.java View File

@ -1,6 +1,7 @@
package app.data.service;
package app.data.service.example;
import app.data.entity.SamplePerson;
import app.data.entity.example.SamplePerson;
import app.data.repository.example.SamplePersonRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.vaadin.artur.helpers.CrudService;

src/main/java/app/image/ImageGenerator.java → src/main/java/app/gameimage/GameImageGenerator.java View File

@ -1,11 +1,11 @@
package app.image;
package app.gameimage;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Objects;
import java.util.Set;
public class ImageGenerator {
public class GameImageGenerator {
private static final int FIELD_SIZE = 150;
private static final Set<Character> WHITE_PIECES = Set.of('B', 'K', 'N', 'P', 'Q', 'R');
@ -13,10 +13,10 @@ public class ImageGenerator {
private static final Set<Character> BLANKS = Set.of('1', '2', '3', '4', '5', '6', '7', '8');
private static final Character ROW_DELIMITER = '/';
private ImageGenerator() {}
private GameImageGenerator() {}
public static BufferedImage generateImage(String fen) {
BufferedImage image = app.image.ImageUtils.readImage("board");
BufferedImage image = GameImageUtils.readImage("board");
Graphics2D g = image.createGraphics();
g.drawImage(image, 0, 0, null);
@ -24,7 +24,7 @@ public class ImageGenerator {
int y = 0;
for (Character c : fen.split(" ")[0].toCharArray()) {
if (isPiece(c)) {
g.drawImage(app.image.ImageUtils.readImage(getFilename(c)), x * FIELD_SIZE, y * FIELD_SIZE, null);
g.drawImage(GameImageUtils.readImage(getFilename(c)), x * FIELD_SIZE, y * FIELD_SIZE, null);
x += 1;
continue;
}

src/main/java/app/image/ImageUtils.java → src/main/java/app/gameimage/GameImageUtils.java View File

@ -1,17 +1,17 @@
package app.image;
package app.gameimage;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImageUtils {
public class GameImageUtils {
public static final String IMAGE_SOURCE_PATH = "src/main/resources/META-INF/resources/images/chess-sources/";
public static final String IMAGE_DEST_PATH = "src/main/resources/META-INF/resources/images/games/";
public static final String EXTENSION = ".png";
private static final String EXTENSION_WITHOUT_DOT = "png";
private ImageUtils() {}
private GameImageUtils() {}
public static BufferedImage readImage(String fileNameWithoutExtension) {
BufferedImage img = null;

src/main/java/app/image/ImageService.java → src/main/java/app/gameimage/service/GameImageService.java View File

@ -1,8 +1,10 @@
package app.image;
package app.gameimage.service;
import app.data.chesscom.ChessComGame;
import app.data.entity.Game;
import app.data.service.ChessComService;
import app.gameimage.GameImageGenerator;
import app.gameimage.GameImageUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -10,11 +12,11 @@ import java.io.File;
import java.util.Optional;
@Service
public class ImageService {
public class GameImageService {
private final ChessComService chessComService;
public ImageService(@Autowired ChessComService chessComService) {
public GameImageService(@Autowired ChessComService chessComService) {
this.chessComService = chessComService;
}
@ -23,7 +25,7 @@ public class ImageService {
}
public Optional<String> getImagePath(Game game) {
String path = ImageUtils.IMAGE_DEST_PATH + getGameNumber(game) + ImageUtils.EXTENSION;
String path = GameImageUtils.IMAGE_DEST_PATH + getGameNumber(game) + GameImageUtils.EXTENSION;
File f = new File(path);
if(f.isFile()) {
return Optional.of(path);
@ -31,7 +33,7 @@ public class ImageService {
Optional<String> optionalFen = getFen(game);
if (optionalFen.isPresent()) {
ImageUtils.writeImage(ImageGenerator.generateImage(optionalFen.get()), getGameNumber(game));
GameImageUtils.writeImage(GameImageGenerator.generateImage(optionalFen.get()), getGameNumber(game));
return Optional.of(path);
}
return Optional.empty();

+ 15
- 4
src/main/java/app/navigation/Navigation.java View File

@ -15,7 +15,6 @@ import com.vaadin.flow.router.BeforeEvent;
import com.vaadin.flow.router.HasUrlParameter;
import com.vaadin.flow.router.WildcardParameter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@ -107,9 +106,9 @@ public class Navigation implements HasUrlParameter<String> {
String seasonParam = null;
String matchdayParam = null;
String matchParam = null;
if (seasonEnabled) seasonParam = seasonSelect.getValue().toString();
if (matchdayEnabled) matchdayParam = matchdaySelect.getValue().toString();
if (matchEnabled) matchParam = matchdaySelect.getValue().toString();
if (seasonEnabled && seasonSelect.getOptionalValue().isPresent()) seasonParam = seasonSelect.getValue().toString();
if (matchdayEnabled && matchdaySelect.getOptionalValue().isPresent()) matchdayParam = matchdaySelect.getValue().toString();
if (matchEnabled && matchSelect.getOptionalValue().isPresent()) matchParam = matchSelect.getValue().toString();
String params = NavigationUtils.getWildcardParam(seasonParam, matchdayParam, matchParam);
UI.getCurrent().getPage().getHistory().pushState(null, String.format("%s/%s", getRoute(), params));
@ -293,4 +292,16 @@ public class Navigation implements HasUrlParameter<String> {
public Optional<Match> getSelectedMatch() {
return matchSelect.getOptionalValue();
}
public SeasonService getSeasonService() {
return seasonService;
}
public MatchdayService getMatchdayService() {
return matchdayService;
}
public MatchService getMatchService() {
return matchService;
}
}

src/main/java/app/components/navigation/NavigationHeader.java → src/main/java/app/navigation/components/NavigationHeader.java View File

@ -1,4 +1,4 @@
package app.components.navigation;
package app.navigation.components;
import app.navigation.Navigation;
import com.vaadin.flow.component.html.Label;

src/main/java/app/components/navigation/button/ButtonUtils.java → src/main/java/app/navigation/components/button/ButtonUtils.java View File

@ -1,4 +1,4 @@
package app.components.navigation.button;
package app.navigation.components.button;
import app.navigation.Navigation;

src/main/java/app/components/navigation/button/NextMatchdayButton.java → src/main/java/app/navigation/components/button/NextMatchdayButton.java View File

@ -1,4 +1,4 @@
package app.components.navigation.button;
package app.navigation.components.button;
import app.data.entity.Matchday;
import app.navigation.Navigation;

src/main/java/app/components/navigation/button/PrevMatchdayButton.java → src/main/java/app/navigation/components/button/PrevMatchdayButton.java View File

@ -1,4 +1,4 @@
package app.components.navigation.button;
package app.navigation.components.button;
import app.data.entity.Matchday;
import app.navigation.Navigation;

+ 28
- 0
src/main/java/app/navigation/service/NavigationService.java View File

@ -0,0 +1,28 @@
package app.navigation.service;
import app.data.service.MatchService;
import app.data.service.MatchdayService;
import app.data.service.SeasonService;
import app.navigation.Navigation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class NavigationService {
private final SeasonService seasonService;
private final MatchdayService matchdayService;
private final MatchService matchService;
public NavigationService(@Autowired SeasonService seasonService,
@Autowired MatchdayService matchdayService,
@Autowired MatchService matchService) {
this.seasonService = seasonService;
this.matchdayService = matchdayService;
this.matchService = matchService;
}
public Navigation getNewNavigation() {
return new Navigation(seasonService, matchdayService, matchService);
}
}

+ 2
- 2
src/main/java/app/views/example/addressform/AddressFormView.java View File

@ -1,7 +1,7 @@
package app.views.example.addressform;
import app.data.entity.SampleAddress;
import app.data.service.SampleAddressService;
import app.data.entity.example.SampleAddress;
import app.data.service.example.SampleAddressService;
import app.views.main.MainView;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.button.Button;


+ 0
- 22
src/main/java/app/views/example/map/MapView.java View File

@ -1,22 +0,0 @@
package app.views.example.map;
import app.components.leafletmap.LeafletMap;
import app.views.main.MainView;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
@Route(value = "map", layout = MainView.class)
@PageTitle("Map")
public class MapView extends VerticalLayout {
private LeafletMap map = new LeafletMap();
public MapView() {
setSizeFull();
setPadding(false);
map.setSizeFull();
map.setView(55.0, 10.0, 4);
add(map);
}
}

+ 2
- 2
src/main/java/app/views/example/masterdetail/MasterDetailView.java View File

@ -1,7 +1,7 @@
package app.views.example.masterdetail;
import app.data.entity.SamplePerson;
import app.data.service.SamplePersonService;
import app.data.entity.example.SamplePerson;
import app.data.service.example.SamplePersonService;
import app.views.main.MainView;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.HasStyle;


+ 2
- 2
src/main/java/app/views/example/personform/PersonFormView.java View File

@ -1,7 +1,7 @@
package app.views.example.personform;
import app.data.entity.SamplePerson;
import app.data.service.SamplePersonService;
import app.data.entity.example.SamplePerson;
import app.data.service.example.SamplePersonService;
import app.views.main.MainView;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.button.Button;


+ 23
- 27
src/main/java/app/views/match/MatchView.java View File

@ -1,58 +1,54 @@
package app.views.match;
import app.data.entity.Game;
import app.data.entity.Match;
import app.data.service.MatchService;
import app.data.service.MatchdayService;
import app.data.service.SeasonService;
import app.image.ImageService;
import app.navigation.Navigation;
import app.navigation.service.NavigationService;
import app.views.main.MainView;
import app.views.navigation.NavigationViewBase;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.html.Image;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.ArrayList;
import java.util.List;
@CssImport("app/views/match/match-view.css")
@Route(value = "match", layout = MainView.class)
@PageTitle("Schachliga DACH - Results - Matches")
public class MatchView extends NavigationViewBase {
private final List<Image> images = new ArrayList<>();
private final MatchService matchService;
private final ImageService imageService;
public MatchView(@Autowired NavigationService navigationService,
@Autowired MatchService matchService) {
super(navigationService, true, true, true);
this.matchService = matchService;
public MatchView(@Autowired SeasonService seasonService,
@Autowired MatchdayService matchdayService,
@Autowired MatchService matchService,
@Autowired ImageService imageService) {
super(seasonService, matchdayService, matchService, true, true, true);
this.imageService = imageService;
addClassName("match-view");
this.navigation.setSeasonEnabled(true);
this.navigation.setMatchdayEnabled(true);
this.navigation.setMatchEnabled(true);
configureLayout();
}
///////////
// ROUTE //
///////////
@Override
public String getRoute() {
return "match";
}
////////////
// LAYOUT //
////////////
private void configureLayout() {
}
/////////////
// CONTENT //
/////////////
@Override
protected void configureContent() {
Match match = navigation.getSelectedMatch().orElseThrow();
removeAll();
for (Game game : match.getGames()) {
Image image = new Image(imageService.getVaadinImagePath(game).orElse(""), "image");
image.setWidth("30%");
add(image);
}
}
}

+ 18
- 102
src/main/java/app/views/matchday/MatchdayView.java View File

@ -1,34 +1,15 @@
package app.views.matchday;
import app.components.navigation.NavigationHeader;
import app.components.navigation.button.NextMatchdayButton;
import app.components.navigation.button.PrevMatchdayButton;
import app.data.bean.CalculatedMatch;
import app.data.entity.Matchday;
import app.data.service.MatchService;
import app.data.service.MatchdayService;
import app.data.service.SeasonService;
import app.navigation.Navigation;
import app.utils.StringUtils;
import app.utils.VaadinUtils;
import app.navigation.service.NavigationService;
import app.views.main.MainView;
import app.views.matchday.components.MatchdayComponent;
import app.views.navigation.NavigationViewBase;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.grid.ColumnTextAlign;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridVariant;
import com.vaadin.flow.component.html.Label;
import com.vaadin.flow.component.orderedlayout.FlexComponent;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.function.ValueProvider;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Optional;
@CssImport("app/views/matchday/matchday-view.css")
@Route(value = "matchday", layout = MainView.class)
@PageTitle("Schachliga DACH - Results - Matchdays")
@ -36,107 +17,42 @@ public class MatchdayView extends NavigationViewBase {
private final MatchService matchService;
private final VerticalLayout matchdayLayout = new VerticalLayout();
private final Label matchdayHeader = new Label();
private final Grid<CalculatedMatch> grid = new Grid<>();
private final Button prevButton;
private final Button nextButton;
private MatchdayComponent matchdayComponent;
public MatchdayView(@Autowired SeasonService seasonService,
@Autowired MatchdayService matchdayService,
public MatchdayView(@Autowired NavigationService navigationService,
@Autowired MatchService matchService) {
super(seasonService, matchdayService, matchService, true, true, false);
super(navigationService, true, true, false);
this.matchService = matchService;
this.navigation.setSeasonEnabled(true);
this.navigation.setMatchdayEnabled(true);
addClassName("matchday-view");
prevButton = new PrevMatchdayButton(navigation);
nextButton = new NextMatchdayButton(navigation);
configureLayout();
}
addClassName("matchday-view");
addClassName("content");
///////////
// ROUTE //
///////////
configureContentLayout();
@Override
public String getRoute() {
return "matchday";
}
////////////
// LAYOUT //
////////////
private void configureContentLayout() {
setWidthFull();
setHeightFull();
setAlignItems(FlexComponent.Alignment.CENTER);
add(new NavigationHeader(navigation), matchdayLayout);
// TODO add background color for content
matchdayHeader.addClassName("matchday_header"); // TODO: add dates
matchdayHeader.setWidth("100%");
HorizontalLayout matchdayHeaderLayout = new HorizontalLayout(prevButton, matchdayHeader, nextButton);
matchdayHeaderLayout.setWidthFull();
matchdayLayout.setPadding(false);
matchdayLayout.add(matchdayHeaderLayout, grid);
matchdayLayout.setAlignItems(FlexComponent.Alignment.CENTER);
matchdayLayout.setWidth("");
matchdayLayout.addClassName("wrapper");
Label headerPlayer1 = new Label("Player 1");
headerPlayer1.addClassName("column_header");
Label headerPlayer2 = new Label("Player 2");
headerPlayer2.addClassName("column_header");
grid.addColumn(VaadinUtils.getPlayerRenderer(CalculatedMatch::getPlayer1))
.setHeader(headerPlayer1)
.setTextAlign(ColumnTextAlign.END)
.setWidth("13em")
.setFlexGrow(1);
grid.addColumn((ValueProvider<CalculatedMatch, String>) this::getResultString)
.setHeader("vs.")
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("6em");
grid.addColumn(VaadinUtils.getPlayerRenderer(CalculatedMatch::getPlayer2))
.setHeader(headerPlayer2)
.setTextAlign(ColumnTextAlign.START)
.setWidth("13em")
.setFlexGrow(1);
grid.setWidth("32em"); // TODO: find a way to set this dynamically based on column widths
grid.setHeightByRows(true);
grid.addThemeVariants(GridVariant.LUMO_NO_BORDER,
GridVariant.LUMO_NO_ROW_BORDERS, GridVariant.LUMO_ROW_STRIPES);
// grid.addSelectionListener((SelectionListener<Grid<CalculatedMatch>, CalculatedMatch>) selectionEvent -> {
// Optional<CalculatedMatch> calculatedMatch = selectionEvent.getFirstSelectedItem();
// calculatedMatch.ifPresent(match -> navigation.selectMatch(match.getMatch()));
// });
}
private String getResultString(CalculatedMatch match) {
return StringUtils.getResultString(match.getScore1(), match.getScore2());
private void configureLayout() {
matchdayComponent = new MatchdayComponent(navigation);
add(matchdayComponent);
}
/////////////
// CONTENT //
/////////////
@Override
protected void configureContent() {
Optional<Matchday> selectedMatchday = navigation.getSelectedMatchday();
selectedMatchday.ifPresent(matchday -> {
matchdayHeader.setText(String.format("Matchday %s", matchday.toString()));
grid.setItems(matchService.getCalculatedMatches(matchday));
});
}
@Override
public String getRoute() {
return "matchday";
matchdayComponent.configureContent();
}
}

+ 96
- 0
src/main/java/app/views/matchday/components/MatchdayComponent.java View File

@ -0,0 +1,96 @@
package app.views.matchday.components;
import app.data.bean.CalculatedMatch;
import app.data.entity.Matchday;
import app.navigation.Navigation;
import app.navigation.components.button.NextMatchdayButton;
import app.navigation.components.button.PrevMatchdayButton;
import app.utils.StringUtils;
import app.utils.VaadinUtils;
import app.views.navigation.interfaces.ContentConfigurable;
import com.vaadin.flow.component.grid.ColumnTextAlign;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridVariant;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.html.Label;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.function.ValueProvider;
import java.util.NoSuchElementException;
public class MatchdayComponent extends Div implements ContentConfigurable {
private final Navigation navigation;
private final VerticalLayout inner = new VerticalLayout();
private final HorizontalLayout header = new HorizontalLayout();
private final Label headerLabel = new Label();
private final Grid<CalculatedMatch> grid = new Grid<>();
public MatchdayComponent(Navigation navigation) {
this.navigation = navigation;
addClassName("wrapper");
add(inner);
inner.add(header, grid);
configureHeader();
configureGrid();
}
private void configureHeader() {
header.add(new PrevMatchdayButton(this.navigation), headerLabel, new NextMatchdayButton(this.navigation));
header.setWidthFull();
headerLabel.addClassName("matchday-header-label");
}
private void configureGrid() {
Label headerPlayer1 = new Label("Player 1");
headerPlayer1.addClassName("column_header");
Label headerPlayer2 = new Label("Player 2");
headerPlayer2.addClassName("column_header");
grid.addColumn(VaadinUtils.getPlayerRenderer(CalculatedMatch::getPlayer1))
.setHeader(headerPlayer1)
.setTextAlign(ColumnTextAlign.END)
.setWidth("13em")
.setFlexGrow(1);
grid.addColumn((ValueProvider<CalculatedMatch, String>) this::getResultString)
.setHeader("vs.")
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("6em");
grid.addColumn(VaadinUtils.getPlayerRenderer(CalculatedMatch::getPlayer2))
.setHeader(headerPlayer2)
.setTextAlign(ColumnTextAlign.START)
.setWidth("13em")
.setFlexGrow(1);
grid.setWidth("32em"); // TODO: find a way to set this dynamically based on column widths
grid.setHeightByRows(true);
grid.addThemeVariants(GridVariant.LUMO_NO_BORDER,
GridVariant.LUMO_NO_ROW_BORDERS, GridVariant.LUMO_ROW_STRIPES);
}
private String getResultString(CalculatedMatch match) {
return StringUtils.getResultString(match.getScore1(), match.getScore2());
}
@Override
public void configureContent() {
try {
Matchday matchday = navigation.getSelectedMatchday().orElseThrow();
headerLabel.setText(String.format("Matchday %s", matchday.toString())); // TODO: add dates
grid.setItems(navigation.getMatchService().getCalculatedMatches(matchday));
} catch (NoSuchElementException e) {
removeAll();
add(navigation.getValidationLabel());
}
}
}

+ 23
- 10
src/main/java/app/views/navigation/NavigationViewBase.java View File

@ -1,10 +1,8 @@
package app.views.navigation;
import app.components.navigation.NavigationHeader;
import app.data.service.MatchService;
import app.data.service.MatchdayService;
import app.data.service.SeasonService;
import app.navigation.Navigation;
import app.navigation.components.NavigationHeader;
import app.navigation.service.NavigationService;
import com.vaadin.flow.component.orderedlayout.FlexComponent;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.BeforeEvent;
@ -17,30 +15,45 @@ public abstract class NavigationViewBase extends VerticalLayout implements HasUr
protected final Navigation navigation;
protected final NavigationHeader navigationHeader;
protected NavigationViewBase(@Autowired SeasonService seasonService,
@Autowired MatchdayService matchdayService,
@Autowired MatchService matchService,
protected NavigationViewBase(@Autowired NavigationService navigationService,
boolean seasonEnabled,
boolean matchdayEnabled,
boolean matchEnabled) {
this.navigation = new Navigation(seasonService, matchdayService, matchService);
this.navigationHeader = new NavigationHeader(navigation);
this.navigation = navigationService.getNewNavigation();
navigation.setRoute(getRoute());
navigation.setSeasonEnabled(seasonEnabled);
navigation.setMatchdayEnabled(matchdayEnabled);
navigation.setMatchEnabled(matchEnabled);
this.navigationHeader = new NavigationHeader(navigation);
configure();
}
private void configure() {
add(navigationHeader);
addClassName("content");
setAlignItems(FlexComponent.Alignment.CENTER);
navigation.addRunnableToBeRunAfterSelection(this::configureContent);
}
///////////
// ROUTE //
///////////
protected abstract String getRoute();
/////////////
// CONTENT //
/////////////
protected abstract void configureContent();
//////////////
// OVERRIDE //
//////////////
@Override
public void removeAll() {
super.removeAll();


+ 5
- 0
src/main/java/app/views/navigation/interfaces/ContentConfigurable.java View File

@ -0,0 +1,5 @@
package app.views.navigation.interfaces;
public interface ContentConfigurable {
void configureContent();
}

+ 18
- 127
src/main/java/app/views/table/TableView.java View File

@ -1,31 +1,14 @@
package app.views.table;
import app.components.label.ValidationLabel;
import app.components.navigation.NavigationHeader;
import app.data.bean.PlayerForTable;
import app.data.service.MatchService;
import app.data.service.MatchdayService;
import app.data.service.PlayerService;
import app.data.service.SeasonService;
import app.utils.StringUtils;
import app.utils.VaadinUtils;
import app.navigation.Navigation;
import app.navigation.service.NavigationService;
import app.views.main.MainView;
import app.views.navigation.NavigationViewBase;
import app.views.table.components.TableComponent;
import com.vaadin.flow.component.dependency.CssImport;
import com.vaadin.flow.component.grid.ColumnTextAlign;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridVariant;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.html.Label;
import com.vaadin.flow.component.orderedlayout.FlexComponent;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.function.ValueProvider;
import com.vaadin.flow.router.*;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.NoSuchElementException;
@CssImport("app/views/table/table-view.css")
@Route(value = "table", layout = MainView.class)
@RouteAlias(value = "", layout = MainView.class)
@ -34,136 +17,44 @@ public class TableView extends NavigationViewBase {
private final PlayerService playerService;
private final Grid<PlayerForTable> grid = new Grid<>();
private TableComponent tableComponent;
public TableView(@Autowired SeasonService seasonService,
@Autowired MatchdayService matchdayService,
@Autowired MatchService matchService,
public TableView(@Autowired NavigationService navigationService,
@Autowired PlayerService playerService) {
super(seasonService, matchdayService, matchService, true, true, false);
super(navigationService, true, true, false);
this.playerService = playerService;
// this.navigation = new Navigation("table", seasonService, matchdayService, matchService, true);
this.navigation.setOnlyMatchdaysWithActivity(true);
this.navigation.setSeasonEnabled(true);
this.navigation.setMatchdayEnabled(true);
addClassName("table-view");
addClassName("content");
configureLayout();
}
///////////
// ROUTE //
///////////
@Override
public String getRoute() {
return "table";
}
////////////
// LAYOUT //
////////////
private void configureLayout() {
Div gridWrapper = new Div(grid);
gridWrapper.addClassName("grid-wrapper");
add(new NavigationHeader(navigation), new HorizontalLayout(gridWrapper));
configureGrid();
}
protected void configureGrid() {
// TODO: add background color for content
// TODO: add diff to last matchday
Label headerPlace = new Label("Place");
headerPlace.addClassName("important-table-column-header");
Label headerPlayer = new Label("Player");
headerPlayer.addClassName("important-table-column-header");
Label headerMatchesPlayed = new Label("Played");
Label headerMatchPoints = new Label("Points");
headerMatchPoints.addClassName("important-table-column-header");
Label headerWon = new Label("W");
Label headerDrawn = new Label("D");
Label headerLost = new Label("L");
Label headerGames = new Label("Games");
Label headerDiff = new Label("Diff");
grid.addColumn(VaadinUtils.getBoldStringRenderer(PlayerForTable::getPlaceString))
.setHeader(headerPlace)
.setTextAlign(ColumnTextAlign.CENTER)
// .setClassNameGenerator(playerForTable -> "leftmost-column-cell")
.setWidth("5em");
grid.addColumn(VaadinUtils.getPlayerRenderer(PlayerForTable::getPlayer))
.setHeader(headerPlayer)
.setTextAlign(ColumnTextAlign.START)
.setWidth("13em");
grid.addColumn((ValueProvider<PlayerForTable, Integer>) PlayerForTable::getAmountOfMatches)
.setHeader(headerMatchesPlayed)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("5em");
grid.addColumn(VaadinUtils.getBoldStringRenderer(player -> String.valueOf(player.getMatchPoints())))
.setHeader(headerMatchPoints)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("6em");
grid.addColumn((ValueProvider<PlayerForTable, Integer>) PlayerForTable::getAmountOfMatchesWon)
.setHeader(headerWon)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("3em");
grid.addColumn((ValueProvider<PlayerForTable, Integer>) PlayerForTable::getAmountOfMatchesDrawn)
.setHeader(headerDrawn)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("3em");
grid.addColumn((ValueProvider<PlayerForTable, Integer>) PlayerForTable::getAmountOfMatchesLost)
.setHeader(headerLost)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("3em");
grid.addColumn((ValueProvider<PlayerForTable, String>) this::getResultString)
.setHeader(headerGames)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("6em");
grid.addColumn((ValueProvider<PlayerForTable, String>) player -> StringUtils.getSignedString(player.getGamePointDiff()))
.setHeader(headerDiff)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("5em");
grid.setWidth("51em");
grid.setHeightByRows(true);
grid.addThemeVariants(GridVariant.LUMO_NO_BORDER,
GridVariant.LUMO_NO_ROW_BORDERS, GridVariant.LUMO_ROW_STRIPES);
}
private String getResultString(PlayerForTable player) {
return StringUtils.getResultString(player.getGamePointsForSelf(), player.getGamePointsForOpponents());
tableComponent = new TableComponent(navigation, playerService);
add(tableComponent);
}
/////////////
// CONTENT //
/////////////
@Override
public String getRoute() {
return "table";
}
@Override
protected void configureContent() {
try {
grid.setItems(playerService.getPlayersForTable(navigation.getSelectedMatchday().orElseThrow()));
} catch (NoSuchElementException e) {
removeAll();
add(navigation.getValidationLabel());
}
tableComponent.configureContent();
}
}

+ 129
- 0
src/main/java/app/views/table/components/TableComponent.java View File

@ -0,0 +1,129 @@
package app.views.table.components;
import app.data.bean.PlayerForTable;
import app.data.entity.Matchday;
import app.data.service.PlayerService;
import app.navigation.Navigation;
import app.utils.StringUtils;
import app.utils.VaadinUtils;
import app.views.navigation.interfaces.ContentConfigurable;
import com.vaadin.flow.component.grid.ColumnTextAlign;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridVariant;
import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.html.Label;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.NoSuchElementException;
public class TableComponent extends Div implements ContentConfigurable {
private final Navigation navigation;
private final PlayerService playerService;
private final Grid<PlayerForTable> grid = new Grid<>();
public TableComponent(Navigation navigation, @Autowired PlayerService playerService) {
this.navigation = navigation;
this.playerService = playerService;
addClassName("grid-wrapper");
add(grid);
configureGrid();
}
private void configureGrid() {
// TODO: add diff to last matchday
// TODO: rounded corners for rows?
Label headerPlace = new Label("Place");
headerPlace.addClassName("important-table-column-header");
Label headerPlayer = new Label("Player");
headerPlayer.addClassName("important-table-column-header");
Label headerMatchesPlayed = new Label("Played");
Label headerMatchPoints = new Label("Points");
headerMatchPoints.addClassName("important-table-column-header");
Label headerWon = new Label("W");
Label headerDrawn = new Label("D");
Label headerLost = new Label("L");
Label headerGames = new Label("Games");
Label headerDiff = new Label("Diff");
grid.addColumn(VaadinUtils.getBoldStringRenderer(PlayerForTable::getPlaceString))
.setHeader(headerPlace)
.setTextAlign(ColumnTextAlign.CENTER)
// .setClassNameGenerator(playerForTable -> "leftmost-column-cell")
.setWidth("5em");
grid.addColumn(VaadinUtils.getPlayerRenderer(PlayerForTable::getPlayer))
.setHeader(headerPlayer)
.setTextAlign(ColumnTextAlign.START)
.setWidth("13em");
grid.addColumn(PlayerForTable::getAmountOfMatches)
.setHeader(headerMatchesPlayed)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("5em");
grid.addColumn(VaadinUtils.getBoldStringRenderer(player -> String.valueOf(player.getMatchPoints())))
.setHeader(headerMatchPoints)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("6em");
grid.addColumn(PlayerForTable::getAmountOfMatchesWon)
.setHeader(headerWon)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("3em");
grid.addColumn(PlayerForTable::getAmountOfMatchesDrawn)
.setHeader(headerDrawn)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("3em");
grid.addColumn(PlayerForTable::getAmountOfMatchesLost)
.setHeader(headerLost)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("3em");
grid.addColumn(this::getResultString)
.setHeader(headerGames)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("6em");
grid.addColumn(player -> StringUtils.getSignedString(player.getGamePointDiff()))
.setHeader(headerDiff)
.setTextAlign(ColumnTextAlign.CENTER)
.setWidth("5em");
grid.setWidth("51em");
grid.setHeightByRows(true);
grid.addThemeVariants(GridVariant.LUMO_NO_BORDER,
GridVariant.LUMO_NO_ROW_BORDERS, GridVariant.LUMO_ROW_STRIPES);
}
private String getResultString(PlayerForTable player) {
return StringUtils.getResultString(player.getGamePointsForSelf(), player.getGamePointsForOpponents());
}
@Override
public void configureContent() {
try {
Matchday matchday = navigation.getSelectedMatchday().orElseThrow();
grid.setItems(playerService.getPlayersForTable(matchday));
} catch (NoSuchElementException e) {
removeAll();
add(navigation.getValidationLabel());
}
}
}

Loading…
Cancel
Save