diff --git a/src/main/java/app/navigation/AbstractNavigationHeader.java b/src/main/java/app/navigation/AbstractNavigationHeader.java new file mode 100644 index 0000000..2dce644 --- /dev/null +++ b/src/main/java/app/navigation/AbstractNavigationHeader.java @@ -0,0 +1,22 @@ +package app.navigation; + +import com.vaadin.flow.component.orderedlayout.FlexComponent; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; + +public abstract class AbstractNavigationHeader extends HorizontalLayout { + protected final T navigation; + + public AbstractNavigationHeader(T navigation) { + this.navigation = navigation; + defineLayout(); + defineChildren(); + } + + private void defineLayout() { + setWidthFull(); + setAlignItems(FlexComponent.Alignment.CENTER); + setJustifyContentMode(FlexComponent.JustifyContentMode.END); + } + + protected abstract void defineChildren(); +} diff --git a/src/main/java/app/navigation/Navigation.java b/src/main/java/app/navigation/Navigation.java new file mode 100644 index 0000000..74b249f --- /dev/null +++ b/src/main/java/app/navigation/Navigation.java @@ -0,0 +1,53 @@ +package app.navigation; + +import app.components.label.ValidationLabel; +import com.vaadin.flow.router.HasUrlParameter; + +import java.util.ArrayList; +import java.util.List; + +public abstract class Navigation implements HasUrlParameter { + protected String route; + + protected final List runnablesToBeRunAfterSelection = new ArrayList<>(); + + protected final ValidationLabel validationLabel = new ValidationLabel(); + + protected boolean editFlag = false; + + public final void setRoute(String route) { + this.route = route; + } + + public final ValidationLabel getValidationLabel() { + return validationLabel; + } + + public abstract String getWildcardParam(); + + protected final String getRoute() { + if (route != null) return route; + throw new IllegalStateException("Route must be set!"); + } + + protected void doPostSelectionStuff() { + validationLabel.setValid(true); + updateUrl(); + runnablesToBeRunAfterSelection.forEach(Runnable::run); + } + + protected abstract void updateUrl(); + + public boolean editFlag() { + return editFlag; + } + + public void setEditFlag(boolean editFlag) { + if (editFlag != this.editFlag) { + this.editFlag = editFlag; + updateUrl(); + runnablesToBeRunAfterSelection.forEach(Runnable::run); + } + } + +} \ No newline at end of file diff --git a/src/main/java/app/navigation/NavigationService.java b/src/main/java/app/navigation/NavigationService.java new file mode 100644 index 0000000..31befbd --- /dev/null +++ b/src/main/java/app/navigation/NavigationService.java @@ -0,0 +1,5 @@ +package app.navigation; + +public interface NavigationService { + T getNewNavigation(); +} diff --git a/src/main/java/app/navigation/player/PlayerNavigation.java b/src/main/java/app/navigation/player/PlayerNavigation.java index 24239dd..452d675 100644 --- a/src/main/java/app/navigation/player/PlayerNavigation.java +++ b/src/main/java/app/navigation/player/PlayerNavigation.java @@ -5,6 +5,7 @@ import app.data.entity.Player; import app.data.entity.Season; import app.data.service.PlayerService; import app.data.service.SeasonService; +import app.navigation.Navigation; import app.navigation.NavigationUtils; import app.utils.EntityStringUtils; import com.vaadin.flow.component.AbstractField.ComponentValueChangeEvent; @@ -12,7 +13,6 @@ import com.vaadin.flow.component.HasValue.ValueChangeListener; import com.vaadin.flow.component.UI; import com.vaadin.flow.component.select.Select; 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; @@ -22,11 +22,8 @@ import java.util.Map; import java.util.Optional; @SuppressWarnings("OptionalUsedAsFieldOrParameterType") -public class PlayerNavigation implements HasUrlParameter { +public class PlayerNavigation extends Navigation { - private String route; - - private final List runnablesToBeRunAfterSelection = new ArrayList<>(); private final PlayerService playerService; private final SeasonService seasonService; @@ -37,7 +34,6 @@ public class PlayerNavigation implements HasUrlParameter { private final Select playerSelect = new Select<>(); private final Select seasonSelect = new Select<>(); - private final ValidationLabel validationLabel = new ValidationLabel(); public PlayerNavigation(@Autowired PlayerService playerService, @Autowired SeasonService seasonService) { @@ -53,20 +49,11 @@ public class PlayerNavigation implements HasUrlParameter { seasonSelect.setItemLabelGenerator(EntityStringUtils::getSeasonString); } - public void setRoute(String route) { - this.route = route; - } - public void addRunnableToBeRunAfterSelection(Runnable runnable) { runnablesToBeRunAfterSelection.add(runnable); } - private String getRoute() { - if (route != null) return route; - throw new IllegalStateException("Route must be set!"); - } - - private void updateUrl() { + protected void updateUrl() { String playerParam = null; String seasonParam = null; if (playerSelect.getOptionalValue().isPresent()) @@ -89,12 +76,6 @@ public class PlayerNavigation implements HasUrlParameter { return event -> doPostSelectionStuff(); } - private void doPostSelectionStuff() { - validationLabel.setValid(true); - updateUrl(); - runnablesToBeRunAfterSelection.forEach(Runnable::run); - } - private void autoselectPlayer() { if (playerList.isEmpty()) { validationLabel.setText("No Players in List!"); @@ -141,10 +122,6 @@ public class PlayerNavigation implements HasUrlParameter { else autoselectSeason(); } - public ValidationLabel getValidationLabel() { - return validationLabel; - } - public List getPlayerList() { return playerList; } @@ -177,6 +154,7 @@ public class PlayerNavigation implements HasUrlParameter { return seasonService; } + @Override public String getWildcardParam() { return NavigationUtils.getWildcardParam( false, diff --git a/src/main/java/app/navigation/player/PlayerNavigationService.java b/src/main/java/app/navigation/player/PlayerNavigationService.java index 1b9789d..a9dd599 100644 --- a/src/main/java/app/navigation/player/PlayerNavigationService.java +++ b/src/main/java/app/navigation/player/PlayerNavigationService.java @@ -2,11 +2,12 @@ package app.navigation.player; import app.data.service.PlayerService; import app.data.service.SeasonService; +import app.navigation.NavigationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service -public class PlayerNavigationService { +public class PlayerNavigationService implements NavigationService { private final SeasonService seasonService; private final PlayerService playerService; diff --git a/src/main/java/app/navigation/regular/RegularNavigation.java b/src/main/java/app/navigation/regular/RegularNavigation.java index 853da40..5b1b562 100644 --- a/src/main/java/app/navigation/regular/RegularNavigation.java +++ b/src/main/java/app/navigation/regular/RegularNavigation.java @@ -1,12 +1,12 @@ package app.navigation.regular; -import app.components.label.ValidationLabel; import app.data.entity.Match; import app.data.entity.Matchday; import app.data.entity.Season; import app.data.service.MatchService; import app.data.service.MatchdayService; import app.data.service.SeasonService; +import app.navigation.Navigation; import app.navigation.NavigationUtils; import app.utils.EntityStringUtils; import com.vaadin.flow.component.AbstractField.ComponentValueChangeEvent; @@ -14,7 +14,6 @@ import com.vaadin.flow.component.HasValue.ValueChangeListener; import com.vaadin.flow.component.UI; import com.vaadin.flow.component.select.Select; 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.lang.NonNull; @@ -25,13 +24,10 @@ import java.util.Map; import java.util.Optional; @SuppressWarnings("OptionalUsedAsFieldOrParameterType") -public class RegularNavigation implements HasUrlParameter { +public class RegularNavigation extends Navigation { - private String route; private boolean onlyMatchdaysWithActivity; - private final List runnablesToBeRunAfterSelection = new ArrayList<>(); - private final SeasonService seasonService; private final MatchdayService matchdayService; private final MatchService matchService; @@ -46,10 +42,6 @@ public class RegularNavigation implements HasUrlParameter { private RegularNavigationLevel regularNavigationLevel = RegularNavigationLevel.SEASON; - private final ValidationLabel validationLabel = new ValidationLabel(); - - private boolean editFlag = false; - public RegularNavigation(@Autowired SeasonService seasonService, @Autowired MatchdayService matchdayService, @Autowired MatchService matchService) { @@ -68,10 +60,6 @@ public class RegularNavigation implements HasUrlParameter { matchSelect.setItemLabelGenerator(EntityStringUtils::getMatchString); } - public void setRoute(String route) { - this.route = route; - } - public void setOnlyMatchdaysWithActivity(boolean onlyMatchdaysWithActivity) { this.onlyMatchdaysWithActivity = onlyMatchdaysWithActivity; } @@ -96,12 +84,7 @@ public class RegularNavigation implements HasUrlParameter { return this.regularNavigationLevel.compareTo(RegularNavigationLevel.MATCH) >= 0; } - private String getRoute() { - if (route != null) return route; - throw new IllegalStateException("Route must be set!"); - } - - private void updateUrl() { + protected void updateUrl() { String seasonParam = null; String matchdayParam = null; String matchParam = null; @@ -147,12 +130,6 @@ public class RegularNavigation implements HasUrlParameter { }; } - private void doPostSelectionStuff() { - validationLabel.setValid(true); - updateUrl(); - runnablesToBeRunAfterSelection.forEach(Runnable::run); - } - private void autoselectSeason() { if (!seasonEnabled()) throw new IllegalStateException("This method should not be called when season is not enabled!"); @@ -164,7 +141,7 @@ public class RegularNavigation implements HasUrlParameter { seasonSelect.setValue(seasonList.get(seasonList.size() - 1)); } - private void autoselectMatchday() { // TODO: choose depending on date instead! + private void autoselectMatchday() { if (!matchdayEnabled()) throw new IllegalStateException("This method should not be called when matchday is not enabled!"); if (matchdayList.isEmpty()) { @@ -232,10 +209,6 @@ public class RegularNavigation implements HasUrlParameter { else autoselectMatch(); } - public ValidationLabel getValidationLabel() { - return validationLabel; - } - public List getSeasonList() { return seasonList; } @@ -284,18 +257,7 @@ public class RegularNavigation implements HasUrlParameter { return matchService; } - public boolean editFlag() { - return editFlag; - } - - public void setEditFlag(boolean editFlag) { - if (editFlag != this.editFlag) { - this.editFlag = editFlag; - updateUrl(); - runnablesToBeRunAfterSelection.forEach(Runnable::run); - } - } - + @Override public String getWildcardParam() { return NavigationUtils.getWildcardParam( editFlag, diff --git a/src/main/java/app/navigation/regular/RegularNavigationService.java b/src/main/java/app/navigation/regular/RegularNavigationService.java index 61255f6..225c37e 100644 --- a/src/main/java/app/navigation/regular/RegularNavigationService.java +++ b/src/main/java/app/navigation/regular/RegularNavigationService.java @@ -3,11 +3,12 @@ package app.navigation.regular; import app.data.service.MatchService; import app.data.service.MatchdayService; import app.data.service.SeasonService; +import app.navigation.NavigationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service -public class RegularNavigationService { +public class RegularNavigationService implements NavigationService { private final SeasonService seasonService; private final MatchdayService matchdayService; @@ -21,6 +22,7 @@ public class RegularNavigationService { this.matchService = matchService; } + @Override public RegularNavigation getNewNavigation() { return new RegularNavigation(seasonService, matchdayService, matchService); } diff --git a/src/main/java/app/navigation/regular/components/RegularNavigationHeader.java b/src/main/java/app/navigation/regular/components/RegularNavigationHeader.java index 8cedd43..ea8c364 100644 --- a/src/main/java/app/navigation/regular/components/RegularNavigationHeader.java +++ b/src/main/java/app/navigation/regular/components/RegularNavigationHeader.java @@ -1,22 +1,19 @@ package app.navigation.regular.components; +import app.navigation.AbstractNavigationHeader; +import app.navigation.Navigation; import app.navigation.regular.RegularNavigation; import com.vaadin.flow.component.html.Label; import com.vaadin.flow.component.orderedlayout.FlexComponent; -import com.vaadin.flow.component.orderedlayout.HorizontalLayout; -public class RegularNavigationHeader extends HorizontalLayout { - - private final RegularNavigation regularNavigation; +public class RegularNavigationHeader extends AbstractNavigationHeader { private final Label seasonLabel = new Label("Season:"); private final Label matchdayLabel = new Label("Matchday:"); private final Label matchLabel = new Label("Match:"); - public RegularNavigationHeader(RegularNavigation regularNavigation) { - this.regularNavigation = regularNavigation; - defineLayout(); - configureChildren(); + public RegularNavigationHeader(Navigation navigation) { + super(navigation); } private void defineLayout() { @@ -25,16 +22,17 @@ public class RegularNavigationHeader extends HorizontalLayout { setJustifyContentMode(FlexComponent.JustifyContentMode.END); } - private void configureChildren() { + @Override + protected void defineChildren() { removeAll(); - if (regularNavigation.seasonEnabled()) { - add(seasonLabel, regularNavigation.getSeasonSelect()); + if (navigation.seasonEnabled()) { + add(seasonLabel, navigation.getSeasonSelect()); } - if (regularNavigation.matchdayEnabled()) { - add(matchdayLabel, regularNavigation.getMatchdaySelect()); + if (navigation.matchdayEnabled()) { + add(matchdayLabel, navigation.getMatchdaySelect()); } - if (regularNavigation.matchEnabled()) { - add(matchLabel, regularNavigation.getMatchSelect()); + if (navigation.matchEnabled()) { + add(matchLabel, navigation.getMatchSelect()); } } } diff --git a/src/main/java/app/views/match/MatchView.java b/src/main/java/app/views/match/MatchView.java index d272ba8..53b2a4d 100644 --- a/src/main/java/app/views/match/MatchView.java +++ b/src/main/java/app/views/match/MatchView.java @@ -43,7 +43,7 @@ public class MatchView extends NavigationViewBase { //////////// private void configureLayout() { - matchComponent = new MatchComponent(regularNavigation, chessComService, gameImageService); + matchComponent = new MatchComponent(navigation, chessComService, gameImageService); add(matchComponent); } diff --git a/src/main/java/app/views/matchday/MatchdayView.java b/src/main/java/app/views/matchday/MatchdayView.java index a4b8e66..c4517f3 100644 --- a/src/main/java/app/views/matchday/MatchdayView.java +++ b/src/main/java/app/views/matchday/MatchdayView.java @@ -30,7 +30,7 @@ public class MatchdayView extends NavigationViewBase { //////////// private void configureLayout() { - matchdayCard = new MatchdayCard(regularNavigation); + matchdayCard = new MatchdayCard(navigation); add(matchdayCard); } diff --git a/src/main/java/app/views/navigation/NavigationViewBase.java b/src/main/java/app/views/navigation/NavigationViewBase.java index b7bf70c..eabe86b 100644 --- a/src/main/java/app/views/navigation/NavigationViewBase.java +++ b/src/main/java/app/views/navigation/NavigationViewBase.java @@ -1,39 +1,50 @@ package app.views.navigation; +import app.navigation.AbstractNavigationHeader; +import app.navigation.Navigation; +import app.navigation.NavigationService; import app.navigation.regular.RegularNavigation; import app.navigation.regular.RegularNavigationLevel; import app.navigation.regular.RegularNavigationService; import app.navigation.regular.components.RegularNavigationHeader; 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.router.BeforeEvent; import com.vaadin.flow.router.HasUrlParameter; import com.vaadin.flow.router.WildcardParameter; import org.springframework.beans.factory.annotation.Autowired; -public abstract class NavigationViewBase extends VerticalLayout implements HasUrlParameter { +public abstract class NavigationViewBase extends VerticalLayout implements HasUrlParameter { - protected final RegularNavigation regularNavigation; - protected final RegularNavigationHeader regularNavigationHeader; + protected final Navigation navigation; + protected final AbstractNavigationHeader navigationHeader; - protected NavigationViewBase(@Autowired RegularNavigationService regularNavigationService, + protected NavigationViewBase(@Autowired NavigationService navigationService, String route, RegularNavigationLevel regularNavigationLevel) { - this.regularNavigation = regularNavigationService.getNewNavigation(); - regularNavigation.setRoute(route); - regularNavigation.setNavigationLevel(regularNavigationLevel); + this.navigation = navigationService.getNewNavigation(); + navigation.setRoute(route); + if (navigation instanceof RegularNavigation) { + ((RegularNavigation) navigation).setNavigationLevel(regularNavigationLevel); + } - this.regularNavigationHeader = new RegularNavigationHeader(regularNavigation); + this.navigationHeader = new RegularNavigationHeader(navigation); define(); } + protected NavigationViewBase(@Autowired RegularNavigationService regularNavigationService, + String route) { + this(regularNavigationService, route, null); + } + private void define() { - add(regularNavigationHeader); + add(navigationHeader); addClassName("content"); setAlignItems(FlexComponent.Alignment.CENTER); - regularNavigation.addRunnableToBeRunAfterSelection(this::configureContent); + navigation.addRunnableToBeRunAfterSelection(this::configureContent); } ///////////// @@ -49,11 +60,11 @@ public abstract class NavigationViewBase extends VerticalLayout implements HasUr @Override public void removeAll() { super.removeAll(); - add(regularNavigationHeader); + add(navigationHeader); } @Override public void setParameter(BeforeEvent event, @WildcardParameter String param) { - regularNavigation.setParameter(event, param); + navigation.setParameter(event, param); } } diff --git a/src/main/java/app/views/table/TableView.java b/src/main/java/app/views/table/TableView.java index fc2cf9d..0fc2f9b 100644 --- a/src/main/java/app/views/table/TableView.java +++ b/src/main/java/app/views/table/TableView.java @@ -27,7 +27,7 @@ public class TableView extends NavigationViewBase { super(regularNavigationService, "table", RegularNavigationLevel.MATCHDAY); this.playerService = playerService; - this.regularNavigation.setOnlyMatchdaysWithActivity(true); + this.navigation.setOnlyMatchdaysWithActivity(true); addClassName("table-view"); @@ -39,7 +39,7 @@ public class TableView extends NavigationViewBase { //////////// private void defineLayout() { - tableCard = new TableCard(regularNavigation, playerService); + tableCard = new TableCard(navigation, playerService); add(tableCard); }