diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index 4cfd8ae0cfc..1555089857d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -429,4 +429,6 @@ public interface StringMessages extends Messages { String averageManeuverLossInMeters(); String averageTackLossInMeters(); String averageJibeLossInMeters(); + String legend(); + String live(); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index 24e38267968..7960dfb37b7 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -429,4 +429,6 @@ errorUpdatingIsMedalRace=Error updating the medal race setting: {0} maneuverLoss=Maneuver loss averageManeuverLossInMeters=\u2205 Maneuver Loss averageTackLossInMeters=\u2205 Tack Loss -averageJibeLossInMeters=\u2205 Jibe Loss \ No newline at end of file +averageJibeLossInMeters=\u2205 Jibe Loss +legend=Legend +live=live \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index df3d931cb4b..6359767721a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -430,4 +430,6 @@ errorUpdatingIsMedalRace=Fehler beim Ändern der Medaillenrennen-Einstellung: {0 maneuverLoss=Manöververlust averageManeuverLossInMeters=\u2205 Manöververlust averageTackLossInMeters=\u2205 Wendeverlust -averageJibeLossInMeters=\u2205 Halseverlust \ No newline at end of file +averageJibeLossInMeters=\u2205 Halseverlust +legend=Legende +live=live \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/LeaderboardGroupPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/LeaderboardGroupPanel.java index 83107460902..93adc463420 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/LeaderboardGroupPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/spectator/LeaderboardGroupPanel.java @@ -8,6 +8,7 @@ import java.util.Map; import com.google.gwt.cell.client.SafeHtmlCell; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Style.FontWeight; import com.google.gwt.safehtml.client.SafeHtmlTemplates; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlBuilder; @@ -15,8 +16,11 @@ import com.google.gwt.user.cellview.client.CellTable; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.FormPanel; import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.HasVerticalAlignment; +import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; @@ -25,7 +29,6 @@ import com.sap.sailing.domain.common.Color; import com.sap.sailing.domain.common.LeaderboardNameConstants; import com.sap.sailing.domain.common.RegattaAndRaceIdentifier; import com.sap.sailing.domain.common.impl.Util; -import com.sap.sailing.domain.common.impl.Util.Pair; import com.sap.sailing.gwt.ui.adminconsole.LeaderboardConfigPanel.AnchorCell; import com.sap.sailing.gwt.ui.client.ErrorReporter; import com.sap.sailing.gwt.ui.client.HasWelcomeWidget; @@ -39,7 +42,6 @@ import com.sap.sailing.gwt.ui.shared.RaceDTO; import com.sap.sailing.gwt.ui.shared.RegattaDTO; import com.sap.sailing.gwt.ui.shared.SeriesDTO; import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO; -import com.sap.sailing.gwt.ui.shared.panels.BreadcrumbPanel; import com.sap.sailing.gwt.ui.shared.panels.WelcomeWidget; public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget { @@ -71,8 +73,17 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget private static final AnchorTemplates ANCHORTEMPLATE = GWT.create(AnchorTemplates.class); private static final TextWithClassTemplate TEXTTEMPLATE = GWT.create(TextWithClassTemplate.class); private static final ColorBoxTemplate COLORBOXTEMPLATE = GWT.create(ColorBoxTemplate.class); - private static final String STYLE_NAME_PREFIX = "leaderboardGroupPanel-"; + private static final String STYLE_NAME_PREFIX = "leaderboardGroupPanel-"; + private static final String STYLE_INACTIVE_RACE = STYLE_NAME_PREFIX + "InactiveRace"; + private static final String STYLE_ACTIVE_RACE = STYLE_NAME_PREFIX + "ActiveRace"; + private static final String STYLE_LIVE_RACE = STYLE_NAME_PREFIX + "LiveRace"; + private static final String STYLE_ACTIVE_BUTTON = STYLE_NAME_PREFIX + "ActiveButton"; + private static final String STYLE_ACTIVE_LEADERBOARD = STYLE_NAME_PREFIX + "ActiveLeaderboard"; + private static final String STYLE_LEGEND = STYLE_NAME_PREFIX + "Legend"; + + private enum RacesRenderStrategy { DEFAULT, ESS40 }; + private final SailingServiceAsync sailingService; private final StringMessages stringMessages; private final ErrorReporter errorReporter; @@ -87,6 +98,8 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget private final boolean isEmbedded; private final boolean showRaceDetails; + private RacesRenderStrategy racesRenderStrategy = RacesRenderStrategy.DEFAULT; + public LeaderboardGroupPanel(SailingServiceAsync sailingService, StringMessages stringConstants, ErrorReporter errorReporter, final String groupName, String root, String viewMode, boolean embedded, boolean showRaceDetails) { super(); @@ -129,7 +142,7 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget for(RegattaDTO regattaDTO: regattaDTOs) { regattasByName.put(regattaDTO.name, regattaDTO); } - buildGUI(); + createdPageContent(); } @Override @@ -138,7 +151,7 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget } }); } else { - buildGUI(); + createdPageContent(); } } else { errorReporter.reportError(stringMessages.noLeaderboardGroupWithNameFound(leaderboardGroupName)); @@ -151,14 +164,8 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget }); } - private void buildGUI() { + private void createdPageContent() { if (!isEmbedded) { - // Create breadcrumb panel - BreadcrumbPanel breadcrumbPanel = createBreadcrumbPanel(); - if (breadcrumbPanel != null) { - mainPanel.add(breadcrumbPanel); - } - // leaderboard group details GUI Label groupNameLabel = new Label(leaderboardGroup.name + ":"); groupNameLabel.setStyleName(STYLE_NAME_PREFIX + "GroupName"); mainPanel.add(groupNameLabel); @@ -168,7 +175,6 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget leaderboardGroupDescriptionLabel.setStyleName(STYLE_NAME_PREFIX + "GroupDescription"); mainPanel.add(leaderboardGroupDescriptionLabel); - // leaderboards UI Label leaderboardsTableLabel = new Label(stringMessages.leaderboards()); leaderboardsTableLabel.setStyleName(STYLE_NAME_PREFIX + "LeaderboardsTableLabel"); mainPanel.add(leaderboardsTableLabel); @@ -181,8 +187,10 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget + "&displayName=" + stringMessages.overallStandings() + "&leaderboardGroupName=" + leaderboardGroup.name + "&root=" + root + (debugParam != null && !debugParam.isEmpty() ? "&gwt.codesvr=" + debugParam : "")); - HTML overallLeaderboardAnchor = new HTML(getAnchor(link, stringMessages.overallStandings(), "ActiveButton overallStandings")); - mainPanel.add(overallLeaderboardAnchor); + Anchor overallStandingsLink = new Anchor(stringMessages.overallStandings(), true, link); + overallStandingsLink.setStyleName(STYLE_ACTIVE_BUTTON); + overallStandingsLink.addStyleName("overallStandings"); + mainPanel.add(overallStandingsLink); } } SafeHtmlCell leaderboardNameCell = new SafeHtmlCell(); @@ -213,7 +221,7 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget + (isEmbedded ? "&embedded=true" : "") + "&leaderboardGroupName=" + leaderboardGroup.name + "&root=" + root + (debugParam != null && !debugParam.isEmpty() ? "&gwt.codesvr=" + debugParam : "")); - return getAnchor(link, stringMessages.overview(), /* style */ "ActiveLeaderboard"); + return getAnchor(link, stringMessages.overview(), STYLE_ACTIVE_LEADERBOARD); } }; @@ -228,7 +236,12 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget racesCell) { @Override public SafeHtml getValue(StrippedLeaderboardDTO leaderboard) { - return leaderboardRacesToHtml(leaderboard); + switch(racesRenderStrategy) { + case DEFAULT: return leaderboardRacesToHtml(leaderboard); + case ESS40: ess40LeaderboardRacesToHtml(leaderboard); + } + return null; + } }; leaderboardsTable.addColumn(racesColumn, stringMessages.races()); @@ -239,6 +252,31 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget leaderboardsTable.setRowData(leaderboardGroup.getLeaderboards()); } mainPanel.add(leaderboardsTable); + + // legend + if(!isEmbedded) { + HorizontalPanel legendPanel = new HorizontalPanel(); + legendPanel.setStyleName(STYLE_LEGEND); + legendPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_MIDDLE); + legendPanel.setSpacing(5); + mainPanel.add(legendPanel); + + Label legendLabel = new Label(stringMessages.legend() + ":"); + legendLabel.getElement().getStyle().setFontWeight(FontWeight.BOLD); + legendPanel.add(legendLabel); + + Label inactiveRace = new Label(stringMessages.untracked()); + inactiveRace.setStyleName(STYLE_INACTIVE_RACE); + legendPanel.add(inactiveRace); + + Label activeRace = new Label(stringMessages.tracked()); + activeRace.setStyleName(STYLE_ACTIVE_RACE); + legendPanel.add(activeRace); + + Label liveRace = new Label(stringMessages.live()); + liveRace.setStyleName(STYLE_LIVE_RACE); + legendPanel.add(liveRace); + } } private String shortenLeaderboardName(String prefixToCut, String leaderboardName) { @@ -268,6 +306,24 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget return b.toSafeHtml(); } + private SafeHtml ess40LeaderboardRacesToHtml(StrippedLeaderboardDTO leaderboard) { + SafeHtmlBuilder b = new SafeHtmlBuilder(); + if (leaderboard.isRegattaLeaderboard && leaderboard.regattaName != null) { + RegattaDTO regatta = regattasByName.get(leaderboard.regattaName); + boolean renderSeriesName = Util.size(regatta.series) > 1; + for (SeriesDTO series : regatta.series) { + b.appendHtmlConstant("
"); + renderSeriesToHtml(leaderboard, series, renderSeriesName, b); + b.appendHtmlConstant("
"); + b.appendHtmlConstant("
"); + } + } else { + List raceColumns = leaderboard.getRaceList(); + renderRacesToHTml(leaderboard, raceColumns, new FleetDTO("Default", 0, null), b); + } + return b.toSafeHtml(); + } + private void renderSeriesToHtml(StrippedLeaderboardDTO leaderboard, SeriesDTO series, boolean renderSeriesName, SafeHtmlBuilder b) { boolean hasMultipleFleets = series.getFleets().size() > 1; Map> racesOrderedByFleets = getRacesOrderedByFleets(leaderboard); @@ -324,13 +380,13 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget link += "&viewMode=" + viewMode; } if (race.trackedRace.hasGPSData && race.trackedRace.hasWindData) { - b.append(getAnchor(link, linkText, /* style */ "ActiveRace")); + b.append(getAnchor(link, linkText, STYLE_ACTIVE_RACE)); } else { - b.append(TEXTTEMPLATE.textWithClass(linkText, STYLE_NAME_PREFIX + "InactiveRace")); + b.append(TEXTTEMPLATE.textWithClass(linkText, STYLE_INACTIVE_RACE)); } } else { - b.append(TEXTTEMPLATE.textWithClass(linkText, STYLE_NAME_PREFIX + "InactiveRace")); + b.append(TEXTTEMPLATE.textWithClass(linkText, STYLE_INACTIVE_RACE)); } } } @@ -354,26 +410,12 @@ public class LeaderboardGroupPanel extends FormPanel implements HasWelcomeWidget private SafeHtml getAnchor(String link, String linkText, String style) { if (isEmbedded) { - return ANCHORTEMPLATE.anchorWithTarget(link, linkText, STYLE_NAME_PREFIX + style, "_blank"); + return ANCHORTEMPLATE.anchorWithTarget(link, linkText, style, "_blank"); } else { - return ANCHORTEMPLATE.anchor(link, linkText, STYLE_NAME_PREFIX + style); + return ANCHORTEMPLATE.anchor(link, linkText, style); } } - private BreadcrumbPanel createBreadcrumbPanel() { - BreadcrumbPanel breadcrumbPanel = null; - if (root.equals("overview")) { - String debugParam = Window.Location.getParameter("gwt.codesvr"); - String link = "/gwt/Spectator.html" - + (showRaceDetails ? "?showRaceDetails=true" : "") - + (debugParam != null && !debugParam.isEmpty() ? (showRaceDetails?"":"?")+"gwt.codesvr=" + debugParam : ""); - ArrayList> breadcrumbLinksData = new ArrayList>(); - breadcrumbLinksData.add(new Pair(link, stringMessages.home())); - breadcrumbPanel = new BreadcrumbPanel(breadcrumbLinksData, leaderboardGroup.name); - } - return breadcrumbPanel; - } - @Override public void setWelcomeWidgetVisible(boolean isVisible) { if (welcomeWidget != null) {