diff --git a/src/main/java/app/data/service/PlayerService.java b/src/main/java/app/data/service/PlayerService.java index b4611aa..c4498f2 100644 --- a/src/main/java/app/data/service/PlayerService.java +++ b/src/main/java/app/data/service/PlayerService.java @@ -34,7 +34,7 @@ public class PlayerService extends CrudService { } public List getPlayersForTable(Matchday matchday) { - return new PlayerForTableProvider(matchday).getPlayersForTableSorted(); + return new PlayerForTableProvider(matchday).getPlayersForTableSorted(true); } private class PlayerForTableProvider { @@ -52,7 +52,7 @@ public class PlayerService extends CrudService { .collect(Collectors.toList())); } - private List getPlayersForTableSorted() { + private List getPlayersForTableSorted(boolean calcDiffToLastMatchday) { List playerForTableList = players.stream() .map(this::getPlayerForTable) .sorted(Comparator.comparingDouble(PlayerForTable::getGamePointsForSelf).reversed()) @@ -78,7 +78,21 @@ public class PlayerService extends CrudService { currentPlayer.setPlace(i + 1 - offset); currentPlayer.setPlaceString(offset == 0 ? String.valueOf(i + 1) : ""); } - // TODO: add diff to last matchday + if (calcDiffToLastMatchday) { + if (matchdays.size() < 2) { + playerForTableList.forEach(playerForTable -> playerForTable.setPlaceDiffToLastMatchday(Integer.MAX_VALUE)); + } else { + List lastMatchdayList = new PlayerForTableProvider(matchdays.get(matchdays.size() - 2)).getPlayersForTableSorted(false); + for (PlayerForTable playerForTable : playerForTableList) { + int placeLastMatchday = lastMatchdayList.stream() + .filter(playerForTableLastMatchday -> playerForTable.getPlayer().equals(playerForTableLastMatchday.getPlayer())) + .findFirst() + .map(PlayerForTable::getPlace) + .orElseThrow(); + playerForTable.setPlaceDiffToLastMatchday(placeLastMatchday - playerForTable.getPlace()); + } + } + } return playerForTableList; } diff --git a/src/main/java/app/utils/VaadinUtils.java b/src/main/java/app/utils/VaadinUtils.java index b41978c..dad1288 100644 --- a/src/main/java/app/utils/VaadinUtils.java +++ b/src/main/java/app/utils/VaadinUtils.java @@ -1,6 +1,7 @@ package app.utils; import app.data.entity.Player; +import com.vaadin.flow.component.icon.Icon; import com.vaadin.flow.data.renderer.TemplateRenderer; import com.vaadin.flow.function.ValueProvider; @@ -24,4 +25,5 @@ public class VaadinUtils { return TemplateRenderer.of(StringUtils.getBoldHtmlString(itemString)) .withProperty(string, stringProvider); } + } diff --git a/src/main/java/app/views/table/components/TableCard.java b/src/main/java/app/views/table/components/TableCard.java index 39d5cc1..f1fdf86 100644 --- a/src/main/java/app/views/table/components/TableCard.java +++ b/src/main/java/app/views/table/components/TableCard.java @@ -12,6 +12,10 @@ 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.icon.Icon; +import com.vaadin.flow.component.icon.VaadinIcon; +import com.vaadin.flow.component.orderedlayout.FlexComponent; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import org.springframework.beans.factory.annotation.Autowired; import java.util.NoSuchElementException; @@ -59,10 +63,9 @@ public class TableCard extends Div implements ContentConfigurable { Label headerDiff = new Label("Diff"); - grid.addColumn(VaadinUtils.getBoldStringRenderer(PlayerForTable::getPlaceString)) + grid.addComponentColumn(this::getPlaceColumnItem) .setHeader(headerPlace) - .setTextAlign(ColumnTextAlign.CENTER) -// .setClassNameGenerator(playerForTable -> "leftmost-column-cell") + .setTextAlign(ColumnTextAlign.START) .setWidth("5em"); grid.addColumn(VaadinUtils.getPlayerRenderer(PlayerForTable::getPlayer)) @@ -105,13 +108,32 @@ public class TableCard extends Div implements ContentConfigurable { .setTextAlign(ColumnTextAlign.CENTER) .setWidth("5em"); - grid.setWidth("51em"); + grid.setWidth("55em"); grid.setHeightByRows(true); grid.addThemeVariants(GridVariant.LUMO_NO_BORDER, GridVariant.LUMO_NO_ROW_BORDERS, GridVariant.LUMO_ROW_STRIPES); } + private Icon getPlaceDiffIcon(PlayerForTable playerForTable) { + int placeDiff = playerForTable.getPlaceDiffToLastMatchday(); + if (placeDiff < -1) return VaadinIcon.ANGLE_DOUBLE_DOWN.create(); + if (placeDiff == -1) return VaadinIcon.ANGLE_DOWN.create(); + if (placeDiff == 0) return VaadinIcon.MINUS.create(); + if (placeDiff == 1) return VaadinIcon.ANGLE_UP.create(); + return VaadinIcon.ANGLE_DOUBLE_UP.create(); + } + + private HorizontalLayout getPlaceColumnItem(PlayerForTable playerForTable) { + Label label = new Label(playerForTable.getPlaceString()); + Icon icon = getPlaceDiffIcon(playerForTable); + icon.setSize("1em"); + HorizontalLayout horizontalLayout = new HorizontalLayout(label, icon); + horizontalLayout.setJustifyContentMode(FlexComponent.JustifyContentMode.BETWEEN); + horizontalLayout.setAlignItems(FlexComponent.Alignment.CENTER); + return horizontalLayout; + } + private String getResultString(PlayerForTable player) { return StringUtils.getResultString(":", player.getGamePointsForSelf(), player.getGamePointsForOpponents()); }