mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-30 17:36:40 +00:00
Merge branch 'master' into confidencewind
This commit is contained in:
commit
a1d26fa780
9 files changed
+162
-116
No files matched your search
+3
-1
@@ -35,6 +35,9 @@ interface AdminConsoleResources extends ClientBundle {
|
||||
@Source("com/sap/sailing/gwt/ui/client/images/reddot.png")
|
||||
ImageResource reddotIcon();
|
||||
|
||||
@Source("com/sap/sailing/gwt/ui/client/images/winddirection.png")
|
||||
ImageResource windDirectionIcon();
|
||||
|
||||
@Source("com/sap/sailing/gwt/ui/client/images/boats/Blue_Port.png")
|
||||
ImageResource lowlightedBoatIcon_Port();
|
||||
|
||||
@@ -47,7 +50,6 @@ interface AdminConsoleResources extends ClientBundle {
|
||||
@Source("com/sap/sailing/gwt/ui/client/images/boats/Blue_DW_Starbord.png")
|
||||
ImageResource lowlightedBoatIconDW_Starboard();
|
||||
|
||||
|
||||
@Source("com/sap/sailing/gwt/ui/client/images/boats/Blue_Port_Selected.png")
|
||||
ImageResource highlightedBoatIcon_Port();
|
||||
|
||||
|
||||
+25
-4
@@ -69,6 +69,7 @@ import com.sap.sailing.gwt.ui.shared.MarkDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.PositionDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.QuickRankDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.SpeedWithBearingDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.components.Component;
|
||||
import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent;
|
||||
|
||||
@@ -295,7 +296,8 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele
|
||||
final ParallelExecutionCallback<Map<CompetitorDTO, List<GPSFixDTO>>> getBoatsCallback = new ParallelExecutionCallback<Map<CompetitorDTO, List<GPSFixDTO>>>();
|
||||
final ParallelExecutionCallback<List<MarkDTO>> getMarksCallback = new ParallelExecutionCallback<List<MarkDTO>>();
|
||||
final ParallelExecutionCallback<List<QuickRankDTO>> getQuickRanksCallback = new ParallelExecutionCallback<List<QuickRankDTO>>();
|
||||
new ParallelExecutionHolder(getBoatsCallback, getMarksCallback, getQuickRanksCallback) {
|
||||
final ParallelExecutionCallback<WindInfoForRaceDTO> getWindCallback = new ParallelExecutionCallback<WindInfoForRaceDTO>();
|
||||
new ParallelExecutionHolder(getBoatsCallback, getMarksCallback, getQuickRanksCallback, getWindCallback) {
|
||||
@Override
|
||||
protected void handleSuccess() {
|
||||
quickRanks = getQuickRanksCallback.getData();
|
||||
@@ -336,19 +338,21 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele
|
||||
mapZoomedOrPannedSinceLastRaceSelectionChange = false;
|
||||
}
|
||||
}
|
||||
showWindOnMap(getWindCallback.getData());
|
||||
} else {
|
||||
lastTimeChangeBeforeInitialization = date;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void handleFailure(Throwable t) {
|
||||
errorReporter.reportError("Error trying to obtain mark and/or boat positions: " + t.getMessage());
|
||||
errorReporter.reportError("Error trying to obtain data for the map: " + t.getMessage());
|
||||
}
|
||||
};
|
||||
sailingService.getBoatPositions(race, fromAndToAndOverlap.getA(), fromAndToAndOverlap.getB(), true, getBoatsCallback);
|
||||
sailingService.getMarkPositions(race, date, getMarksCallback);
|
||||
sailingService.getQuickRanks(race, date, getQuickRanksCallback);
|
||||
sailingService.getWindInfo(race, date, date, null, getWindCallback);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -444,6 +448,23 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele
|
||||
}
|
||||
}
|
||||
|
||||
protected void showWindOnMap(WindInfoForRaceDTO windInfo) {
|
||||
// DON'T DELETE... THIS WILL BE IMPLEMENTED SOON
|
||||
// System.out.println("Windsources: " + windInfo.windTrackInfoByWindSource.size());
|
||||
// for(WindSource windSource: windInfo.windTrackInfoByWindSource.keySet()) {
|
||||
// switch (windSource) {
|
||||
// case COURSE_BASED:
|
||||
// case EXPEDITION:
|
||||
// case TRACK_BASED_ESTIMATION:
|
||||
// case WEB:
|
||||
// WindTrackInfoDTO windTrackInfoDTO = windInfo.windTrackInfoByWindSource.get(windSource);
|
||||
// for(WindDTO windDTO: windTrackInfoDTO.windFixes) {
|
||||
// Long timepoint = windDTO.timepoint;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
protected void showMarksOnMap(List<MarkDTO> result) {
|
||||
if (map != null) {
|
||||
Set<MarkDTO> toRemove = new HashSet<MarkDTO>(buoyMarkers.keySet());
|
||||
@@ -1049,7 +1070,7 @@ public class RaceMap extends SimplePanel implements TimeListener, CompetitorSele
|
||||
|
||||
@Override
|
||||
public Widget getEntryWidget() {
|
||||
return map;
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+14
-7
@@ -33,16 +33,22 @@ public class RaceBoardEntryPoint extends AbstractEntryPoint {
|
||||
@Override
|
||||
public void onModuleLoad() {
|
||||
super.onModuleLoad();
|
||||
String viewModeParamValue = Window.Location.getParameter("viewMode");
|
||||
try {
|
||||
viewMode = RaceBoardViewMode.valueOf(RaceBoardViewMode.class, viewModeParamValue);
|
||||
} catch (Exception e) {
|
||||
viewMode = RaceBoardViewMode.ONE_SCREEN;
|
||||
}
|
||||
eventName = Window.Location.getParameter("eventName");
|
||||
raceName = Window.Location.getParameter("raceName");
|
||||
String leaderboardNameParamValue = Window.Location.getParameter("leaderboardName");
|
||||
String leaderboardGroupNameParamValue = Window.Location.getParameter("leaderboardGroupName");
|
||||
String viewModeParamValue = Window.Location.getParameter("viewMode");
|
||||
// set the view mode for the race board
|
||||
if(viewModeParamValue != null && !viewModeParamValue.isEmpty()) {
|
||||
try {
|
||||
|
||||
viewMode = RaceBoardViewMode.valueOf(viewModeParamValue);
|
||||
} catch (IllegalArgumentException e) {
|
||||
viewMode = RaceBoardViewMode.ONE_SCREEN;
|
||||
}
|
||||
} else {
|
||||
viewMode = RaceBoardViewMode.ONE_SCREEN;
|
||||
}
|
||||
if(leaderboardNameParamValue == null || leaderboardNameParamValue.isEmpty()) {
|
||||
leaderboardName = DefaultLeaderboardName.DEFAULT_LEADERBOARD_NAME;
|
||||
} else {
|
||||
@@ -146,7 +152,8 @@ public class RaceBoardEntryPoint extends AbstractEntryPoint {
|
||||
|
||||
FlowPanel raceBoardHeaderPanel = new FlowPanel();
|
||||
raceBoardHeaderPanel.addStyleName("RaceBoardHeaderPanel");
|
||||
raceBoardHeaderPanel.add(raceBoardPanel.getBreadcrumbWidget());
|
||||
if(raceBoardPanel.getBreadcrumbWidget() != null)
|
||||
raceBoardHeaderPanel.add(raceBoardPanel.getBreadcrumbWidget());
|
||||
|
||||
FlowPanel contentOuterPanel = new FlowPanel(); // outer div which centered page content
|
||||
contentOuterPanel.addStyleName("contentOuterPanel");
|
||||
|
||||
+56
-101
@@ -12,7 +12,6 @@ import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.ui.Anchor;
|
||||
import com.google.gwt.user.client.ui.FlowPanel;
|
||||
import com.google.gwt.user.client.ui.FormPanel;
|
||||
import com.google.gwt.user.client.ui.Panel;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.domain.common.RaceIdentifier;
|
||||
import com.sap.sailing.domain.common.WindSourceType;
|
||||
@@ -70,7 +69,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
|
||||
*/
|
||||
private int scrollOffset;
|
||||
|
||||
private final List<CollapsableComponentViewer<?>> collapsableViewers;
|
||||
private final List<ComponentViewer> componentViewers;
|
||||
private FlowPanel componentsNavigationPanel;
|
||||
private BreadcrumbPanel breadcrumbPanel;
|
||||
private RaceTimePanel timePanel;
|
||||
@@ -97,32 +96,62 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
|
||||
setWidget(mainPanel);
|
||||
|
||||
timer = new Timer(PlayModes.Replay, /* delayBetweenAutoAdvancesInMilliseconds */1000);
|
||||
collapsableViewers = new ArrayList<CollapsableComponentViewer<?>>();
|
||||
componentViewers = new ArrayList<ComponentViewer>();
|
||||
competitorSelectionModel = new CompetitorSelectionModel(/* hasMultiSelection */ true);
|
||||
|
||||
switch (viewMode) {
|
||||
case CASCADING:
|
||||
createCascadingView(leaderboardName, leaderboardGroupName, mainPanel);
|
||||
break;
|
||||
case ONE_SCREEN:
|
||||
createOneScreenView();
|
||||
break;
|
||||
case TV_MODE:
|
||||
createTVView();
|
||||
break;
|
||||
case CASCADING:
|
||||
createCascadingView(leaderboardName, leaderboardGroupName, mainPanel);
|
||||
break;
|
||||
case ONE_SCREEN:
|
||||
createOneScreenView(leaderboardName, leaderboardGroupName, mainPanel);
|
||||
break;
|
||||
}
|
||||
|
||||
for (ComponentViewer componentViewer : componentViewers) {
|
||||
mainPanel.add(componentViewer.getViewerWidget());
|
||||
addComponentViewerMenuEntry(componentViewer);
|
||||
}
|
||||
|
||||
timePanel = new RaceTimePanel(sailingService, timer, errorReporter, stringMessages);
|
||||
raceSelectionProvider.addRaceSelectionChangeListener(timePanel);
|
||||
timePanel.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
|
||||
}
|
||||
|
||||
private void createOneScreenView(String leaderboardName, String leaderboardGroupName, FlowPanel mainPanel) {
|
||||
componentsNavigationPanel = new FlowPanel();
|
||||
componentsNavigationPanel.addStyleName("raceBoardNavigation");
|
||||
|
||||
// create the default leaderboard and select the right race
|
||||
|
||||
LeaderboardSettings leaderBoardSettings = LeaderboardSettingsFactory.getInstance().createNewSettingsForPlayMode(timer.getPlayMode());
|
||||
LeaderboardPanel leaderboardPanel = new LeaderboardPanel(sailingService, leaderBoardSettings, selectedRaceIdentifier, competitorSelectionModel,
|
||||
timer, leaderboardName, leaderboardGroupName, errorReporter, stringMessages, userAgentType);
|
||||
RaceMap raceMap = new RaceMap(sailingService, errorReporter, timer, competitorSelectionModel, stringMessages);
|
||||
|
||||
SideBySideComponentViewer leaderboardAndMapViewer = new SideBySideComponentViewer(leaderboardPanel, raceMap, "auto", "500px");
|
||||
componentViewers.add(leaderboardAndMapViewer);
|
||||
|
||||
raceMap.onRaceSelectionChange(Collections.singletonList(selectedRaceIdentifier));
|
||||
|
||||
WindChartSettings windChartSettings = new WindChartSettings(WindSource.values());
|
||||
WindChart windChart = new WindChart(sailingService, raceSelectionProvider, timer, windChartSettings,
|
||||
stringMessages, errorReporter);
|
||||
SimpleComponentViewer<WindChartSettings> windChartViewer = new SimpleComponentViewer<WindChartSettings>(
|
||||
windChart, "auto", "200px");
|
||||
windChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
|
||||
componentViewers.add(windChartViewer);
|
||||
|
||||
MultiChartPanel competitorCharts = new MultiChartPanel(sailingService, competitorSelectionModel, raceSelectionProvider,
|
||||
timer, stringMessages, errorReporter);
|
||||
SimpleComponentViewer<MultiChartSettings> chartViewer = new SimpleComponentViewer<MultiChartSettings>(
|
||||
competitorCharts, "auto", "200px");
|
||||
|
||||
competitorCharts.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
|
||||
componentViewers.add(chartViewer);
|
||||
}
|
||||
|
||||
private void createTVView() {
|
||||
// TODO Auto-generated method stub
|
||||
}
|
||||
|
||||
private void createOneScreenView() {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
private void createCascadingView(String leaderboardName, String leaderboardGroupName, FlowPanel mainPanel) {
|
||||
private void createCascadingView(String leaderboardName, String leaderboardGroupName, FlowPanel mainPanel) {
|
||||
// create the breadcrumb navigation
|
||||
breadcrumbPanel = createBreadcrumbPanel(leaderboardGroupName);
|
||||
mainPanel.add(breadcrumbPanel);
|
||||
@@ -141,7 +170,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
|
||||
|
||||
CollapsableComponentViewer<LeaderboardSettings> leaderboardViewer = new CollapsableComponentViewer<LeaderboardSettings>(
|
||||
leaderboardPanel, "100%", "100%", stringMessages, ViewerPanelTypes.SCROLL_PANEL);
|
||||
collapsableViewers.add(leaderboardViewer);
|
||||
componentViewers.add(leaderboardViewer);
|
||||
}
|
||||
|
||||
// create the race map
|
||||
@@ -150,9 +179,9 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
|
||||
CollapsableComponentViewer<RaceMapSettings> raceMapViewer = new CollapsableComponentViewer<RaceMapSettings>(
|
||||
raceMap, "auto", "500px", stringMessages);
|
||||
|
||||
((Panel) raceMapViewer.getViewerWidget().getContent()).add(raceMap);
|
||||
//((Panel) raceMapViewer.getViewerWidget().getContent()).add(raceMap);
|
||||
raceMap.onRaceSelectionChange(Collections.singletonList(selectedRaceIdentifier));
|
||||
collapsableViewers.add(raceMapViewer);
|
||||
componentViewers.add(raceMapViewer);
|
||||
}
|
||||
|
||||
WindChartSettings windChartSettings = new WindChartSettings(WindSourceType.values());
|
||||
@@ -161,7 +190,7 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
|
||||
CollapsableComponentViewer<WindChartSettings> windChartViewer = new CollapsableComponentViewer<WindChartSettings>(
|
||||
windChart, "auto", "400px", stringMessages);
|
||||
windChart.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
|
||||
collapsableViewers.add(windChartViewer);
|
||||
componentViewers.add(windChartViewer);
|
||||
if (showCompetitorCharts) {
|
||||
// DON'T DELETE -> this is temporary for testing of different chart types
|
||||
// ChartPanel competitorCharts = new ChartPanel(sailingService, competitorSelectionModel, raceSelectionProvider,
|
||||
@@ -175,17 +204,9 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
|
||||
competitorCharts, "auto", "400px", stringMessages);
|
||||
|
||||
competitorCharts.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
|
||||
collapsableViewers.add(chartViewer);
|
||||
componentViewers.add(chartViewer);
|
||||
}
|
||||
|
||||
for (CollapsableComponentViewer<?> componentViewer : collapsableViewers) {
|
||||
mainPanel.add(componentViewer.getViewerWidget());
|
||||
addComponentViewerMenuEntry(componentViewer);
|
||||
}
|
||||
|
||||
timePanel = new RaceTimePanel(sailingService, timer, errorReporter, stringMessages);
|
||||
raceSelectionProvider.addRaceSelectionChangeListener(timePanel);
|
||||
timePanel.onRaceSelectionChange(raceSelectionProvider.getSelectedRaces());
|
||||
}
|
||||
|
||||
private BreadcrumbPanel createBreadcrumbPanel(String leaderboardGroupName) {
|
||||
@@ -271,71 +292,5 @@ public class RaceBoardPanel extends FormPanel implements EventDisplayer, RaceSel
|
||||
@Override
|
||||
public void onRaceSelectionChange(List<RaceIdentifier> selectedRaces) {
|
||||
}
|
||||
//
|
||||
// if (selectedRaces != null && !selectedRaces.isEmpty()) {
|
||||
// RaceDTO selectedRace = racesByIdentifier.get(selectedRaces.iterator().next());
|
||||
//
|
||||
// Date min = null;
|
||||
// Date max = null;
|
||||
//
|
||||
// if (selectedRace.startOfTracking != null) {
|
||||
// min = selectedRace.startOfTracking;
|
||||
// }
|
||||
// if (selectedRace.endOfRace != null) {
|
||||
// max = selectedRace.endOfRace;
|
||||
// } else if (selectedRace.timePointOfNewestEvent != null) {
|
||||
// max = selectedRace.timePointOfNewestEvent;
|
||||
// timer.setPlayMode(PlayModes.Live);
|
||||
// }
|
||||
//
|
||||
// if(min != null && max != null)
|
||||
// timePanel.setMinMax(min, max);
|
||||
//
|
||||
// // set initial timer position
|
||||
// switch(timer.getPlayMode()) {
|
||||
// case Live:
|
||||
// if(selectedRace.timePointOfNewestEvent != null) {
|
||||
// timer.setTime(selectedRace.timePointOfNewestEvent.getTime());
|
||||
// }
|
||||
// break;
|
||||
// case Replay:
|
||||
// if(selectedRace.endOfRace != null) {
|
||||
// timer.setTime(selectedRace.endOfRace.getTime());
|
||||
// } else {
|
||||
// timer.setTime(selectedRace.startOfRace.getTime());
|
||||
// }
|
||||
// break;
|
||||
// }
|
||||
//
|
||||
// sailingService.getRaceTimesInfo(selectedRace.getRaceIdentifier(),
|
||||
// new AsyncCallback<RaceTimesInfoDTO>() {
|
||||
// @Override
|
||||
// public void onFailure(Throwable caught) {
|
||||
// errorReporter.reportError("Error obtaining leg timepoints: " + caught.getMessage());
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void onSuccess(RaceTimesInfoDTO raceTimesInfo) {
|
||||
// // raceTimesInfo can be null if the race is not tracked anymore
|
||||
// if (raceTimesInfo != null) {
|
||||
// timePanel.setLegMarkers(raceTimesInfo.getLegTimes());
|
||||
// if (raceTimesInfo.getStartOfRace() != null) {
|
||||
// // set the new start time
|
||||
// Date startOfRace = raceTimesInfo.getStartOfRace();
|
||||
// Date startOfTimeslider = new Date(startOfRace.getTime() - 5 * 60 * 1000);
|
||||
//
|
||||
// timePanel.changeMin(startOfTimeslider);
|
||||
// }
|
||||
// // set time to end of race
|
||||
// if(raceTimesInfo.getLastLegTimes() != null) {
|
||||
// timer.setTime(raceTimesInfo.getLastLegTimes().firstPassingDate.getTime());
|
||||
// }
|
||||
// } else {
|
||||
// timePanel.reset();
|
||||
// }
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
+2
-2
@@ -2,6 +2,6 @@ package com.sap.sailing.gwt.ui.raceboard;
|
||||
|
||||
public enum RaceBoardViewMode {
|
||||
|
||||
CASCADING, ONE_SCREEN, TV_MODE
|
||||
|
||||
CASCADING, ONE_SCREEN
|
||||
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
package com.sap.sailing.gwt.ui.raceboard;
|
||||
|
||||
import com.google.gwt.user.client.ui.HorizontalSplitPanel;
|
||||
import com.google.gwt.user.client.ui.Panel;
|
||||
import com.sap.sailing.gwt.ui.shared.components.Component;
|
||||
import com.sap.sailing.gwt.ui.shared.components.ComponentViewer;
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
public class SideBySideComponentViewer implements ComponentViewer {
|
||||
/** there is no easy replacement for the HorizontalSplitPanel available */
|
||||
private final HorizontalSplitPanel mainPanel;
|
||||
|
||||
public SideBySideComponentViewer(Component<?> leftComponent, Component<?> rightComponent, String defaultWidth, String defaultHeight) {
|
||||
mainPanel = new HorizontalSplitPanel();
|
||||
mainPanel.setSize(defaultWidth, defaultHeight);
|
||||
mainPanel.setLeftWidget(leftComponent.getEntryWidget());
|
||||
mainPanel.setRightWidget(rightComponent.getEntryWidget());
|
||||
}
|
||||
|
||||
public Panel getViewerWidget() {
|
||||
return mainPanel;
|
||||
}
|
||||
|
||||
public Component<?> getRootComponent() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getViewerName() {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package com.sap.sailing.gwt.ui.raceboard;
|
||||
|
||||
import com.google.gwt.user.client.ui.Panel;
|
||||
import com.google.gwt.user.client.ui.SimplePanel;
|
||||
import com.sap.sailing.gwt.ui.shared.components.Component;
|
||||
import com.sap.sailing.gwt.ui.shared.components.ComponentViewer;
|
||||
|
||||
public class SimpleComponentViewer<SettingsType> implements ComponentViewer {
|
||||
private final SimplePanel mainPanel;
|
||||
private final Component<SettingsType> component;
|
||||
|
||||
public SimpleComponentViewer(Component<SettingsType> component, String defaultWidth, String defaultHeight) {
|
||||
this.component = component;
|
||||
mainPanel = new SimplePanel();
|
||||
mainPanel.setSize(defaultWidth, defaultHeight);
|
||||
mainPanel.setWidget(component.getEntryWidget());
|
||||
}
|
||||
|
||||
public Panel getViewerWidget() {
|
||||
return mainPanel;
|
||||
}
|
||||
|
||||
public Component<?> getRootComponent() {
|
||||
return component;
|
||||
}
|
||||
|
||||
public String getViewerName() {
|
||||
return component.getLocalizedShortName();
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -292,7 +292,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS
|
||||
entryDTO.legDetails.add(legEntry);
|
||||
}
|
||||
}
|
||||
final Distance windwardDistanceToOverallLeader = trackedRace.getWindwardDistanceToOverallLeader(competitor, timePoint);
|
||||
final Distance windwardDistanceToOverallLeader = trackedRace == null ? null : trackedRace.getWindwardDistanceToOverallLeader(competitor, timePoint);
|
||||
entryDTO.windwardDistanceToOverallLeaderInMeters = windwardDistanceToOverallLeader == null ? null : windwardDistanceToOverallLeader.getMeters();
|
||||
return entryDTO;
|
||||
}
|
||||
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
Reference in new issue
Block a user