package app.views.match.components;
|
|
|
|
import app.data.bean.CalculatedMatch;
|
|
import app.data.entity.Game;
|
|
import app.data.entity.Match;
|
|
import app.data.service.ChessComService;
|
|
import app.data.service.MatchService;
|
|
import app.gameimage.GameImageService;
|
|
import app.navigation.match.MatchNavigation;
|
|
import app.utils.ComponentUtils;
|
|
import app.utils.StringUtils;
|
|
import app.views.navigation.interfaces.ContentConfigurable;
|
|
import com.vaadin.flow.component.button.Button;
|
|
import com.vaadin.flow.component.button.ButtonVariant;
|
|
import com.vaadin.flow.component.html.Div;
|
|
import com.vaadin.flow.component.html.Label;
|
|
import com.vaadin.flow.component.icon.Icon;
|
|
import com.vaadin.flow.component.icon.VaadinIcon;
|
|
import com.vaadin.flow.component.orderedlayout.FlexComponent;
|
|
import com.vaadin.flow.component.orderedlayout.FlexLayout;
|
|
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
|
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import java.util.NoSuchElementException;
|
|
|
|
public class MatchComponent extends Div implements ContentConfigurable {
|
|
|
|
private final MatchNavigation matchNavigation;
|
|
private final MatchService matchService;
|
|
private final GameImageService gameImageService;
|
|
|
|
private final VerticalLayout headerLayout = new VerticalLayout();
|
|
private final HorizontalLayout headerPlayersLayout = new HorizontalLayout();
|
|
private final Label headerResultLabel = new Label();
|
|
|
|
private final FlexLayout gamesLayout = new FlexLayout();
|
|
private final VerticalLayout noGamesLayout = new VerticalLayout();
|
|
|
|
private final FlexLayout editLayout = new FlexLayout();
|
|
private final EditMatchCard editMatchCard;
|
|
|
|
private Match match;
|
|
private CalculatedMatch calculatedMatch;
|
|
|
|
public MatchComponent(MatchNavigation matchNavigation,
|
|
@Autowired ChessComService chessComService,
|
|
@Autowired GameImageService gameImageService) {
|
|
this.matchNavigation = matchNavigation;
|
|
this.matchService = matchNavigation.getMatchService();
|
|
this.gameImageService = gameImageService;
|
|
|
|
this.editMatchCard = new EditMatchCard(matchNavigation, chessComService, gameImageService);
|
|
|
|
defineLayout();
|
|
}
|
|
|
|
////////////
|
|
// LAYOUT //
|
|
////////////
|
|
|
|
private void defineLayout() {
|
|
add(headerLayout);
|
|
|
|
defineHeaderLayout();
|
|
defineGamesLayout();
|
|
defineNoGamesLayout();
|
|
defineEditLayout();
|
|
}
|
|
|
|
private void defineHeaderLayout() {
|
|
headerLayout.add(headerPlayersLayout, headerResultLabel);
|
|
|
|
headerPlayersLayout.addClassName("match-header-players");
|
|
|
|
headerResultLabel.addClassName("match-header-result");
|
|
headerResultLabel.addClassName("bold-header");
|
|
}
|
|
|
|
private void defineGamesLayout() {
|
|
gamesLayout.setFlexWrap(FlexLayout.FlexWrap.WRAP);
|
|
gamesLayout.setJustifyContentMode(FlexComponent.JustifyContentMode.CENTER);
|
|
}
|
|
|
|
private void defineNoGamesLayout() {
|
|
noGamesLayout.add(createNoGamesLabel(), createAddGamesButton());
|
|
noGamesLayout.setAlignItems(FlexComponent.Alignment.CENTER);
|
|
}
|
|
|
|
private Label createNoGamesLabel() {
|
|
return new Label("No games for this match in the database.");
|
|
}
|
|
|
|
private Button createAddGamesButton() {
|
|
Button button = new Button("Add games", new Icon(VaadinIcon.PLUS));
|
|
button.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
|
|
button.addClickListener(event -> {
|
|
matchNavigation.setEditFlag(true);
|
|
remove(noGamesLayout);
|
|
});
|
|
return button;
|
|
}
|
|
|
|
private void defineEditLayout() {
|
|
editLayout.setJustifyContentMode(FlexComponent.JustifyContentMode.CENTER);
|
|
editLayout.add(editMatchCard);
|
|
}
|
|
|
|
/////////////
|
|
// CONTENT //
|
|
/////////////
|
|
|
|
@Override
|
|
public void configureContent() {
|
|
try {
|
|
match = matchNavigation.getSelectedMatch().orElseThrow();
|
|
calculatedMatch = matchService.getCalculatedMatch(match);
|
|
configureHeaderContent();
|
|
configureMainContent();
|
|
} catch (NoSuchElementException e) {
|
|
gamesLayout.removeAll();
|
|
add(matchNavigation.getValidationLabel());
|
|
}
|
|
}
|
|
|
|
private void configureHeaderContent() {
|
|
configureHeaderPlayersLayout();
|
|
configureHeaderResultLabel();
|
|
}
|
|
|
|
private void configureHeaderPlayersLayout() {
|
|
HorizontalLayout player1 = ComponentUtils.getPlayerLabel(calculatedMatch.getPlayer1());
|
|
HorizontalLayout player2 = ComponentUtils.getPlayerLabel(calculatedMatch.getPlayer2());
|
|
Label vs = new Label("vs.");
|
|
|
|
headerPlayersLayout.removeAll();
|
|
headerPlayersLayout.add(player1, vs, player2);
|
|
}
|
|
|
|
private void configureHeaderResultLabel() {
|
|
if (match.getGames().isEmpty() || matchNavigation.editFlag()) {
|
|
headerLayout.remove(headerResultLabel);
|
|
} else {
|
|
headerLayout.add(headerResultLabel);
|
|
headerResultLabel.setText(String.format("%s",
|
|
StringUtils.getResultString("-", calculatedMatch.getScore1(), calculatedMatch.getScore2())));
|
|
}
|
|
}
|
|
|
|
private void configureMainContent() {
|
|
if (matchNavigation.editFlag()) {
|
|
remove(gamesLayout);
|
|
add(editLayout);
|
|
editMatchCard.configureContent(match);
|
|
return;
|
|
}
|
|
remove(editLayout);
|
|
configureGamesContent();
|
|
}
|
|
|
|
private void configureGamesContent() {
|
|
if (match.getGames().isEmpty()) {
|
|
remove(gamesLayout);
|
|
add(noGamesLayout);
|
|
return;
|
|
}
|
|
|
|
remove(noGamesLayout);
|
|
add(gamesLayout);
|
|
|
|
gamesLayout.removeAll();
|
|
for (Game game : match.getGames()) {
|
|
gamesLayout.add(new GameCard(game, gameImageService));
|
|
}
|
|
}
|
|
}
|