diff --git a/frontend/app/views/matchday/matchday-view.css b/frontend/app/views/matchday/matchday-view.css index e0585be..e1ca104 100644 --- a/frontend/app/views/matchday/matchday-view.css +++ b/frontend/app/views/matchday/matchday-view.css @@ -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; diff --git a/src/main/java/app/components/leafletmap/LeafletMap.java b/src/main/java/app/components/leafletmap/LeafletMap.java deleted file mode 100644 index 654991b..0000000 --- a/src/main/java/app/components/leafletmap/LeafletMap.java +++ /dev/null @@ -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); - } - -} diff --git a/src/main/java/app/data/AbstractEntity.java b/src/main/java/app/data/entity/AbstractEntity.java similarity index 85% rename from src/main/java/app/data/AbstractEntity.java rename to src/main/java/app/data/entity/AbstractEntity.java index 8fd809d..478e975 100644 --- a/src/main/java/app/data/AbstractEntity.java +++ b/src/main/java/app/data/entity/AbstractEntity.java @@ -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 diff --git a/src/main/java/app/data/entity/Game.java b/src/main/java/app/data/entity/Game.java index 9d0de0b..6cb322e 100644 --- a/src/main/java/app/data/entity/Game.java +++ b/src/main/java/app/data/entity/Game.java @@ -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; diff --git a/src/main/java/app/data/entity/SampleAddress.java b/src/main/java/app/data/entity/example/SampleAddress.java similarity index 92% rename from src/main/java/app/data/entity/SampleAddress.java rename to src/main/java/app/data/entity/example/SampleAddress.java index 59e69e9..61fe565 100644 --- a/src/main/java/app/data/entity/SampleAddress.java +++ b/src/main/java/app/data/entity/example/SampleAddress.java @@ -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; diff --git a/src/main/java/app/data/entity/SamplePerson.java b/src/main/java/app/data/entity/example/SamplePerson.java similarity index 95% rename from src/main/java/app/data/entity/SamplePerson.java rename to src/main/java/app/data/entity/example/SamplePerson.java index 40204be..cf41e08 100644 --- a/src/main/java/app/data/entity/SamplePerson.java +++ b/src/main/java/app/data/entity/example/SamplePerson.java @@ -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; diff --git a/src/main/java/app/data/generator/DataGenerator.java b/src/main/java/app/data/generator/DataGenerator.java deleted file mode 100644 index 10a3b61..0000000 --- a/src/main/java/app/data/generator/DataGenerator.java +++ /dev/null @@ -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 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"); - }; - } - -} \ No newline at end of file diff --git a/src/main/java/app/data/service/GameInfoRepository.java b/src/main/java/app/data/repository/GameInfoRepository.java similarity index 85% rename from src/main/java/app/data/service/GameInfoRepository.java rename to src/main/java/app/data/repository/GameInfoRepository.java index 37e945a..9b47626 100644 --- a/src/main/java/app/data/service/GameInfoRepository.java +++ b/src/main/java/app/data/repository/GameInfoRepository.java @@ -1,4 +1,4 @@ -package app.data.service; +package app.data.repository; import app.data.entity.GameInfo; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/app/data/service/GameRepository.java b/src/main/java/app/data/repository/GameRepository.java similarity index 85% rename from src/main/java/app/data/service/GameRepository.java rename to src/main/java/app/data/repository/GameRepository.java index fca7b4e..c91a9d9 100644 --- a/src/main/java/app/data/service/GameRepository.java +++ b/src/main/java/app/data/repository/GameRepository.java @@ -1,4 +1,4 @@ -package app.data.service; +package app.data.repository; import app.data.entity.Game; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/app/data/service/MatchRepository.java b/src/main/java/app/data/repository/MatchRepository.java similarity index 85% rename from src/main/java/app/data/service/MatchRepository.java rename to src/main/java/app/data/repository/MatchRepository.java index 7fb0627..7d853d6 100644 --- a/src/main/java/app/data/service/MatchRepository.java +++ b/src/main/java/app/data/repository/MatchRepository.java @@ -1,4 +1,4 @@ -package app.data.service; +package app.data.repository; import app.data.entity.Match; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/app/data/service/MatchdayRepository.java b/src/main/java/app/data/repository/MatchdayRepository.java similarity index 85% rename from src/main/java/app/data/service/MatchdayRepository.java rename to src/main/java/app/data/repository/MatchdayRepository.java index a37a153..d36a927 100644 --- a/src/main/java/app/data/service/MatchdayRepository.java +++ b/src/main/java/app/data/repository/MatchdayRepository.java @@ -1,4 +1,4 @@ -package app.data.service; +package app.data.repository; import app.data.entity.Matchday; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/app/data/service/PlayerInfoRepository.java b/src/main/java/app/data/repository/PlayerInfoRepository.java similarity index 86% rename from src/main/java/app/data/service/PlayerInfoRepository.java rename to src/main/java/app/data/repository/PlayerInfoRepository.java index 005f13f..a74a82b 100644 --- a/src/main/java/app/data/service/PlayerInfoRepository.java +++ b/src/main/java/app/data/repository/PlayerInfoRepository.java @@ -1,4 +1,4 @@ -package app.data.service; +package app.data.repository; import app.data.entity.PlayerInfo; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/app/data/service/PlayerRepository.java b/src/main/java/app/data/repository/PlayerRepository.java similarity index 85% rename from src/main/java/app/data/service/PlayerRepository.java rename to src/main/java/app/data/repository/PlayerRepository.java index 2a9414b..66f82c0 100644 --- a/src/main/java/app/data/service/PlayerRepository.java +++ b/src/main/java/app/data/repository/PlayerRepository.java @@ -1,4 +1,4 @@ -package app.data.service; +package app.data.repository; import app.data.entity.Player; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/app/data/service/SeasonRepository.java b/src/main/java/app/data/repository/SeasonRepository.java similarity index 85% rename from src/main/java/app/data/service/SeasonRepository.java rename to src/main/java/app/data/repository/SeasonRepository.java index a49a594..c2f2bb3 100644 --- a/src/main/java/app/data/service/SeasonRepository.java +++ b/src/main/java/app/data/repository/SeasonRepository.java @@ -1,4 +1,4 @@ -package app.data.service; +package app.data.repository; import app.data.entity.Season; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/app/data/service/SampleAddressRepository.java b/src/main/java/app/data/repository/example/SampleAddressRepository.java similarity index 64% rename from src/main/java/app/data/service/SampleAddressRepository.java rename to src/main/java/app/data/repository/example/SampleAddressRepository.java index 39a7483..9bd05e9 100644 --- a/src/main/java/app/data/service/SampleAddressRepository.java +++ b/src/main/java/app/data/repository/example/SampleAddressRepository.java @@ -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 { diff --git a/src/main/java/app/data/service/SamplePersonRepository.java b/src/main/java/app/data/repository/example/SamplePersonRepository.java similarity index 64% rename from src/main/java/app/data/service/SamplePersonRepository.java rename to src/main/java/app/data/repository/example/SamplePersonRepository.java index 076f29c..46d635a 100644 --- a/src/main/java/app/data/service/SamplePersonRepository.java +++ b/src/main/java/app/data/repository/example/SamplePersonRepository.java @@ -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 { diff --git a/src/main/java/app/data/service/GameInfoService.java b/src/main/java/app/data/service/GameInfoService.java index c0f4d72..4263c9b 100644 --- a/src/main/java/app/data/service/GameInfoService.java +++ b/src/main/java/app/data/service/GameInfoService.java @@ -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; diff --git a/src/main/java/app/data/service/GameService.java b/src/main/java/app/data/service/GameService.java index 6c77908..5db387b 100644 --- a/src/main/java/app/data/service/GameService.java +++ b/src/main/java/app/data/service/GameService.java @@ -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; diff --git a/src/main/java/app/data/service/MatchService.java b/src/main/java/app/data/service/MatchService.java index 3f9a67c..f5ee09a 100644 --- a/src/main/java/app/data/service/MatchService.java +++ b/src/main/java/app/data/service/MatchService.java @@ -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; diff --git a/src/main/java/app/data/service/MatchdayService.java b/src/main/java/app/data/service/MatchdayService.java index 7310055..78885ec 100644 --- a/src/main/java/app/data/service/MatchdayService.java +++ b/src/main/java/app/data/service/MatchdayService.java @@ -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; diff --git a/src/main/java/app/data/service/PlayerInfoService.java b/src/main/java/app/data/service/PlayerInfoService.java index 7c0b756..d0cc618 100644 --- a/src/main/java/app/data/service/PlayerInfoService.java +++ b/src/main/java/app/data/service/PlayerInfoService.java @@ -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; diff --git a/src/main/java/app/data/service/PlayerService.java b/src/main/java/app/data/service/PlayerService.java index f17bbbd..b4611aa 100644 --- a/src/main/java/app/data/service/PlayerService.java +++ b/src/main/java/app/data/service/PlayerService.java @@ -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; diff --git a/src/main/java/app/data/service/SeasonService.java b/src/main/java/app/data/service/SeasonService.java index 24c2974..bdd1849 100644 --- a/src/main/java/app/data/service/SeasonService.java +++ b/src/main/java/app/data/service/SeasonService.java @@ -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; diff --git a/src/main/java/app/data/service/SampleAddressService.java b/src/main/java/app/data/service/example/SampleAddressService.java similarity index 79% rename from src/main/java/app/data/service/SampleAddressService.java rename to src/main/java/app/data/service/example/SampleAddressService.java index 7dd8149..8d81336 100644 --- a/src/main/java/app/data/service/SampleAddressService.java +++ b/src/main/java/app/data/service/example/SampleAddressService.java @@ -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; diff --git a/src/main/java/app/data/service/SamplePersonService.java b/src/main/java/app/data/service/example/SamplePersonService.java similarity index 79% rename from src/main/java/app/data/service/SamplePersonService.java rename to src/main/java/app/data/service/example/SamplePersonService.java index f12a5c5..b40e003 100644 --- a/src/main/java/app/data/service/SamplePersonService.java +++ b/src/main/java/app/data/service/example/SamplePersonService.java @@ -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; diff --git a/src/main/java/app/image/ImageGenerator.java b/src/main/java/app/gameimage/GameImageGenerator.java similarity index 88% rename from src/main/java/app/image/ImageGenerator.java rename to src/main/java/app/gameimage/GameImageGenerator.java index 4759658..448601e 100644 --- a/src/main/java/app/image/ImageGenerator.java +++ b/src/main/java/app/gameimage/GameImageGenerator.java @@ -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 WHITE_PIECES = Set.of('B', 'K', 'N', 'P', 'Q', 'R'); @@ -13,10 +13,10 @@ public class ImageGenerator { private static final Set 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; } diff --git a/src/main/java/app/image/ImageUtils.java b/src/main/java/app/gameimage/GameImageUtils.java similarity index 93% rename from src/main/java/app/image/ImageUtils.java rename to src/main/java/app/gameimage/GameImageUtils.java index 67f0960..dd7a6a7 100644 --- a/src/main/java/app/image/ImageUtils.java +++ b/src/main/java/app/gameimage/GameImageUtils.java @@ -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; diff --git a/src/main/java/app/image/ImageService.java b/src/main/java/app/gameimage/service/GameImageService.java similarity index 73% rename from src/main/java/app/image/ImageService.java rename to src/main/java/app/gameimage/service/GameImageService.java index ba042e0..e0d466d 100644 --- a/src/main/java/app/image/ImageService.java +++ b/src/main/java/app/gameimage/service/GameImageService.java @@ -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 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 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(); diff --git a/src/main/java/app/navigation/Navigation.java b/src/main/java/app/navigation/Navigation.java index b2aa912..fb97661 100644 --- a/src/main/java/app/navigation/Navigation.java +++ b/src/main/java/app/navigation/Navigation.java @@ -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 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 { public Optional getSelectedMatch() { return matchSelect.getOptionalValue(); } + + public SeasonService getSeasonService() { + return seasonService; + } + + public MatchdayService getMatchdayService() { + return matchdayService; + } + + public MatchService getMatchService() { + return matchService; + } } diff --git a/src/main/java/app/components/navigation/NavigationHeader.java b/src/main/java/app/navigation/components/NavigationHeader.java similarity index 97% rename from src/main/java/app/components/navigation/NavigationHeader.java rename to src/main/java/app/navigation/components/NavigationHeader.java index 7d92066..083971e 100644 --- a/src/main/java/app/components/navigation/NavigationHeader.java +++ b/src/main/java/app/navigation/components/NavigationHeader.java @@ -1,4 +1,4 @@ -package app.components.navigation; +package app.navigation.components; import app.navigation.Navigation; import com.vaadin.flow.component.html.Label; diff --git a/src/main/java/app/components/navigation/button/ButtonUtils.java b/src/main/java/app/navigation/components/button/ButtonUtils.java similarity index 89% rename from src/main/java/app/components/navigation/button/ButtonUtils.java rename to src/main/java/app/navigation/components/button/ButtonUtils.java index 3f03970..701b6a0 100644 --- a/src/main/java/app/components/navigation/button/ButtonUtils.java +++ b/src/main/java/app/navigation/components/button/ButtonUtils.java @@ -1,4 +1,4 @@ -package app.components.navigation.button; +package app.navigation.components.button; import app.navigation.Navigation; diff --git a/src/main/java/app/components/navigation/button/NextMatchdayButton.java b/src/main/java/app/navigation/components/button/NextMatchdayButton.java similarity index 96% rename from src/main/java/app/components/navigation/button/NextMatchdayButton.java rename to src/main/java/app/navigation/components/button/NextMatchdayButton.java index 7b6d280..6e753b6 100644 --- a/src/main/java/app/components/navigation/button/NextMatchdayButton.java +++ b/src/main/java/app/navigation/components/button/NextMatchdayButton.java @@ -1,4 +1,4 @@ -package app.components.navigation.button; +package app.navigation.components.button; import app.data.entity.Matchday; import app.navigation.Navigation; diff --git a/src/main/java/app/components/navigation/button/PrevMatchdayButton.java b/src/main/java/app/navigation/components/button/PrevMatchdayButton.java similarity index 96% rename from src/main/java/app/components/navigation/button/PrevMatchdayButton.java rename to src/main/java/app/navigation/components/button/PrevMatchdayButton.java index df1af78..c0c0a2a 100644 --- a/src/main/java/app/components/navigation/button/PrevMatchdayButton.java +++ b/src/main/java/app/navigation/components/button/PrevMatchdayButton.java @@ -1,4 +1,4 @@ -package app.components.navigation.button; +package app.navigation.components.button; import app.data.entity.Matchday; import app.navigation.Navigation; diff --git a/src/main/java/app/navigation/service/NavigationService.java b/src/main/java/app/navigation/service/NavigationService.java new file mode 100644 index 0000000..d26989c --- /dev/null +++ b/src/main/java/app/navigation/service/NavigationService.java @@ -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); + } +} diff --git a/src/main/java/app/views/example/addressform/AddressFormView.java b/src/main/java/app/views/example/addressform/AddressFormView.java index 0fcdad2..3ecf1e9 100644 --- a/src/main/java/app/views/example/addressform/AddressFormView.java +++ b/src/main/java/app/views/example/addressform/AddressFormView.java @@ -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; diff --git a/src/main/java/app/views/example/map/MapView.java b/src/main/java/app/views/example/map/MapView.java deleted file mode 100644 index e488d0f..0000000 --- a/src/main/java/app/views/example/map/MapView.java +++ /dev/null @@ -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); - } -} \ No newline at end of file diff --git a/src/main/java/app/views/example/masterdetail/MasterDetailView.java b/src/main/java/app/views/example/masterdetail/MasterDetailView.java index 2e3430b..e5a216c 100644 --- a/src/main/java/app/views/example/masterdetail/MasterDetailView.java +++ b/src/main/java/app/views/example/masterdetail/MasterDetailView.java @@ -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; diff --git a/src/main/java/app/views/example/personform/PersonFormView.java b/src/main/java/app/views/example/personform/PersonFormView.java index 95e0bf3..4445e91 100644 --- a/src/main/java/app/views/example/personform/PersonFormView.java +++ b/src/main/java/app/views/example/personform/PersonFormView.java @@ -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; diff --git a/src/main/java/app/views/match/MatchView.java b/src/main/java/app/views/match/MatchView.java index 221036a..564abc7 100644 --- a/src/main/java/app/views/match/MatchView.java +++ b/src/main/java/app/views/match/MatchView.java @@ -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 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); - } } } diff --git a/src/main/java/app/views/matchday/MatchdayView.java b/src/main/java/app/views/matchday/MatchdayView.java index 5e1d6dd..23d773b 100644 --- a/src/main/java/app/views/matchday/MatchdayView.java +++ b/src/main/java/app/views/matchday/MatchdayView.java @@ -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 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) 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, CalculatedMatch>) selectionEvent -> { -// Optional 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 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(); } } diff --git a/src/main/java/app/views/matchday/components/MatchdayComponent.java b/src/main/java/app/views/matchday/components/MatchdayComponent.java new file mode 100644 index 0000000..c9d219e --- /dev/null +++ b/src/main/java/app/views/matchday/components/MatchdayComponent.java @@ -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 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) 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()); + } + } +} diff --git a/src/main/java/app/views/navigation/NavigationViewBase.java b/src/main/java/app/views/navigation/NavigationViewBase.java index 89bd82b..f81e642 100644 --- a/src/main/java/app/views/navigation/NavigationViewBase.java +++ b/src/main/java/app/views/navigation/NavigationViewBase.java @@ -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(); diff --git a/src/main/java/app/views/navigation/interfaces/ContentConfigurable.java b/src/main/java/app/views/navigation/interfaces/ContentConfigurable.java new file mode 100644 index 0000000..fa10bf8 --- /dev/null +++ b/src/main/java/app/views/navigation/interfaces/ContentConfigurable.java @@ -0,0 +1,5 @@ +package app.views.navigation.interfaces; + +public interface ContentConfigurable { + void configureContent(); +} diff --git a/src/main/java/app/views/table/TableView.java b/src/main/java/app/views/table/TableView.java index f09f4d3..d60cceb 100644 --- a/src/main/java/app/views/table/TableView.java +++ b/src/main/java/app/views/table/TableView.java @@ -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 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::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::getAmountOfMatchesWon) - .setHeader(headerWon) - .setTextAlign(ColumnTextAlign.CENTER) - .setWidth("3em"); - - grid.addColumn((ValueProvider) PlayerForTable::getAmountOfMatchesDrawn) - .setHeader(headerDrawn) - .setTextAlign(ColumnTextAlign.CENTER) - .setWidth("3em"); - - grid.addColumn((ValueProvider) PlayerForTable::getAmountOfMatchesLost) - .setHeader(headerLost) - .setTextAlign(ColumnTextAlign.CENTER) - .setWidth("3em"); - - grid.addColumn((ValueProvider) this::getResultString) - .setHeader(headerGames) - .setTextAlign(ColumnTextAlign.CENTER) - .setWidth("6em"); - - grid.addColumn((ValueProvider) 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(); } } diff --git a/src/main/java/app/views/table/components/TableComponent.java b/src/main/java/app/views/table/components/TableComponent.java new file mode 100644 index 0000000..28a1f91 --- /dev/null +++ b/src/main/java/app/views/table/components/TableComponent.java @@ -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 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()); + } + } +}