mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-18 02:00:58 +00:00
adoption of sizes, fonts, and colors to all widgets to new dashboard design
This commit is contained in:
1 parent
15982503ed
commit
bfc45b50a5
39 files changed
+585
-393
No files matched your search
+13
-16
@@ -47,44 +47,41 @@
|
||||
|
||||
.collumnthree {
|
||||
left: 66.8%;
|
||||
right: 0pt;
|
||||
right: 0px;
|
||||
}
|
||||
|
||||
.left {
|
||||
left: 0pt;
|
||||
left: 0px;
|
||||
right: 50%;
|
||||
}
|
||||
|
||||
.right {
|
||||
left: 50%;
|
||||
right: 0pt;
|
||||
right: 0px;
|
||||
}
|
||||
|
||||
.startline_advantage_by_wind_container {
|
||||
position: absolute;
|
||||
background-color: white;
|
||||
top: 27%;
|
||||
right: 0pt;
|
||||
left: 0pt;
|
||||
top: 163px;
|
||||
right: 0px;
|
||||
left: 0px;
|
||||
bottom: 0%;
|
||||
}
|
||||
|
||||
.startline_advantage_by_geometry_container {
|
||||
position: absolute;
|
||||
background-color: white;
|
||||
top: 0%;
|
||||
right: 0pt;
|
||||
left: 0pt;
|
||||
bottom: 73%;
|
||||
margin-bottom: 10pt;
|
||||
top: 0px;
|
||||
right: 0px;
|
||||
left: 0px;
|
||||
height: 150px
|
||||
}
|
||||
|
||||
.windcharthint {
|
||||
position: absolute;
|
||||
bottom: 0pt;
|
||||
bottom: 0px;
|
||||
height: 15pt;
|
||||
line-height: 15pt;
|
||||
margin-top: 0pt;
|
||||
margin-top: 0px;
|
||||
vertical-align: middle;
|
||||
font-size: 12pt;
|
||||
font-family: DASHBOARD_FONT_FAMILY;
|
||||
@@ -105,7 +102,7 @@
|
||||
|
||||
.windloadinghinttext {
|
||||
position: absolute;
|
||||
bottom: 0pt;
|
||||
bottom: 0px;
|
||||
height: 15pt;
|
||||
line-height: 15pt;
|
||||
margin-top: 0pt;
|
||||
|
||||
+5
-5
@@ -26,7 +26,7 @@ import com.sap.sailing.dashboards.gwt.client.eventlogo.EventLogo;
|
||||
import com.sap.sailing.dashboards.gwt.client.notifications.orientation.WrongDeviceOrientationNotification;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.PollsLiveDataEvery5Seconds;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.startanalysis.StartAnalysisWidget;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.course.StartLineAdvantageByGeometryWidget;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.course.StartlineAdvantageByGeometryWidget;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.StartlineAdvantagesByWindWidget;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.windbot.WindBotWidget;
|
||||
import com.sap.sailing.dashboards.gwt.shared.DashboardURLParameters;
|
||||
@@ -81,7 +81,7 @@ public class DashboardPanel extends Composite implements NumberOfWindBotsChangeL
|
||||
public StartAnalysisWidget startanalysisComponent;
|
||||
|
||||
@UiField(provided = true)
|
||||
public StartLineAdvantageByGeometryWidget startlineAdvantageByGeometryComponent;
|
||||
public StartlineAdvantageByGeometryWidget startlineAdvantageByGeometryWidget;
|
||||
|
||||
private List<WindBotWidget> windBotComponents;
|
||||
private StringMessages stringConstants;
|
||||
@@ -94,7 +94,7 @@ public class DashboardPanel extends Composite implements NumberOfWindBotsChangeL
|
||||
windBotComponents = new ArrayList<WindBotWidget>();
|
||||
startanalysisComponent = new StartAnalysisWidget(this.dashboardClientFactory);
|
||||
startlineAdvantagesByWindComponent = new StartlineAdvantagesByWindWidget(this.dashboardClientFactory);
|
||||
startlineAdvantageByGeometryComponent = new StartLineAdvantageByGeometryWidget(this.dashboardClientFactory);
|
||||
startlineAdvantageByGeometryWidget = new StartlineAdvantageByGeometryWidget(this.dashboardClientFactory);
|
||||
stringConstants = StringMessages.INSTANCE;
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
initLogos();
|
||||
@@ -136,12 +136,12 @@ public class DashboardPanel extends Composite implements NumberOfWindBotsChangeL
|
||||
windBotComponents.clear();
|
||||
for (String windBotID : windBotIDs) {
|
||||
if (windBotAddedCounterTOConsiderForPanels == 0) {
|
||||
WindBotWidget leftwindBotComponent = new WindBotWidget(windBotID);
|
||||
WindBotWidget leftwindBotComponent = new WindBotWidget(windBotID, dashboardClientFactory);
|
||||
leftwindbotcontainer.add(leftwindBotComponent);
|
||||
windBotComponents.add(leftwindBotComponent);
|
||||
windloadinghintleft.getStyle().setOpacity(0.0);
|
||||
} else if (windBotAddedCounterTOConsiderForPanels == 1) {
|
||||
WindBotWidget rightwindBotComponent = new WindBotWidget(windBotID);
|
||||
WindBotWidget rightwindBotComponent = new WindBotWidget(windBotID, dashboardClientFactory);
|
||||
rightwindbotcontainer.add(rightwindBotComponent);
|
||||
windBotComponents.add(rightwindBotComponent);
|
||||
windloadinghintright.getStyle().setOpacity(0.0);
|
||||
|
||||
+1
-1
@@ -36,7 +36,7 @@
|
||||
</g:HTMLPanel>
|
||||
<g:HTMLPanel styleName="{resources.style.collumn} {resources.style.collumnthree}">
|
||||
<g:HTMLPanel styleName="{resources.style.startline_advantage_by_geometry_container}">
|
||||
<startlineadvantagegeometry:StartLineAdvantageByGeometryWidget ui:field="startlineAdvantageByGeometryComponent"></startlineadvantagegeometry:StartLineAdvantageByGeometryWidget>
|
||||
<startlineadvantagegeometry:StartlineAdvantageByGeometryWidget ui:field="startlineAdvantageByGeometryWidget"></startlineadvantagegeometry:StartlineAdvantageByGeometryWidget>
|
||||
</g:HTMLPanel>
|
||||
<g:HTMLPanel styleName="{resources.style.startline_advantage_by_wind_container}">
|
||||
<startlineadvantagewind:StartlineAdvantagesByWindWidget
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@ public class Sizes {
|
||||
public static final String DASHBOARD_FONT_SIZE_SMALL = "13px";
|
||||
public static final String DASHBOARD_FONT_SIZE_MEDIUM = "14px";
|
||||
public static final String DASHBOARD_FONT_SIZE_LARGE = "18px";
|
||||
public static final String DASHBOARD_FONT_SIZE_VERY_LARGE = "25px";
|
||||
public static final String DASHBOARD_FONT_SIZE_VERY_LARGE = "33px";
|
||||
|
||||
public static final String DASHBOARD_SPACE_VERY_SMALL = "10px";
|
||||
public static final String DASHBOARD_SPACE_SMALL = "30px";
|
||||
|
||||
+2
@@ -14,9 +14,11 @@
|
||||
@def DASHBOARD_FONT_FAMILY eval("com.sap.sailing.dashboards.gwt.client.theme.Fonts.DASHBOARD_FONT_FAMILY");
|
||||
|
||||
/*Sizes*/
|
||||
@def DASHBOARD_FONT_SIZE_VERY_SMALL eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_FONT_SIZE_VERY_SMALL");
|
||||
@def DASHBOARD_FONT_SIZE_SMALL eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_FONT_SIZE_SMALL");
|
||||
@def DASHBOARD_FONT_SIZE_MEDIUM eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_FONT_SIZE_MEDIUM");
|
||||
@def DASHBOARD_FONT_SIZE_LARGE eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_FONT_SIZE_LARGE");
|
||||
@def DASHBOARD_FONT_SIZE_VERY_LARGE eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_FONT_SIZE_VERY_LARGE");
|
||||
|
||||
@def DASHBOARD_SPACE_VERY_SMALL eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_SPACE_VERY_SMALL");
|
||||
@def DASHBOARD_SPACE_SMALL eval("com.sap.sailing.dashboards.gwt.client.theme.Sizes.DASHBOARD_SPACE_SMALL");
|
||||
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
@require 'theme';
|
||||
|
||||
.dashboard_widget_header {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: DASHBOARD_SPACE_MEDIUM;
|
||||
top: 0;
|
||||
line-height: DASHBOARD_SPACE_MEDIUM;
|
||||
vertical-align: middle;
|
||||
font-size: DASHBOARD_FONT_SIZE_LARGE;
|
||||
font-family: DASHBOARD_FONT_FAMILY;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
overflow: visible;
|
||||
background-color: WHITE;
|
||||
border-bottom:solid LIGHT_GREY 1px;
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
.dashboard_widget_no_data_message_container {
|
||||
position: absolute;
|
||||
top: DASHBOARD_SPACE_MEDIUM;
|
||||
bottom: 0px;
|
||||
width: 100%;
|
||||
font-size: DASHBOARD_FONT_SIZE_MEDIUM;
|
||||
font-family: DASHBOARD_FONT_FAMILY;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
line-height: DASHBOARD_LINE_HEIGHT;
|
||||
}
|
||||
|
||||
.dashboard_widget_no_data_message_header {
|
||||
color: DARK_TEXT_COLOR;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.dashboard_widget_no_data_message {
|
||||
color: LIGHT_TEXT_COLOR;
|
||||
font-weight: normal;
|
||||
}
|
||||
+88
@@ -0,0 +1,88 @@
|
||||
package com.sap.sailing.dashboards.gwt.client.widgets.header;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.DivElement;
|
||||
import com.google.gwt.dom.client.Style.Unit;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.HTMLPanel;
|
||||
import com.google.gwt.user.client.ui.HasWidgets;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
|
||||
/**
|
||||
* @author Alexander Ries (D062114)
|
||||
*
|
||||
*/
|
||||
public class DashboardWidgetHeaderAndNoDataMessage extends Composite implements HasWidgets {
|
||||
|
||||
private static DashboardWidgetHeaderAndNoDataMessageUiBinder uiBinder = GWT.create(DashboardWidgetHeaderAndNoDataMessageUiBinder.class);
|
||||
private static final int EXTRA_WIDTH_MESSAGE = 10;
|
||||
|
||||
interface DashboardWidgetHeaderAndNoDataMessageUiBinder extends UiBinder<Widget, DashboardWidgetHeaderAndNoDataMessage> {
|
||||
}
|
||||
|
||||
@UiField
|
||||
HTMLPanel header;
|
||||
|
||||
@UiField
|
||||
DivElement noDataMessageHeader;
|
||||
|
||||
@UiField
|
||||
DivElement noDataMessage;
|
||||
|
||||
public DashboardWidgetHeaderAndNoDataMessage() {
|
||||
DashboardWidgetHeaderAndNoDataMessageResources.INSTANCE.gss().ensureInjected();
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
}
|
||||
|
||||
public void setHeaderText(String headerText) {
|
||||
this.header.getElement().setInnerHTML(headerText);
|
||||
}
|
||||
|
||||
public void showNoDataMessageWithHeaderAndMessage(String header, String message) {
|
||||
noDataMessageHeader.setInnerText(header);
|
||||
noDataMessage.setInnerText(message);
|
||||
noDataMessage.getStyle().setWidth(noDataMessageHeader.getClientWidth()+EXTRA_WIDTH_MESSAGE, Unit.PX);
|
||||
|
||||
}
|
||||
|
||||
public void hideNoDataMessage() {
|
||||
noDataMessageHeader.setInnerHTML("");
|
||||
noDataMessage.setInnerHTML("");
|
||||
}
|
||||
|
||||
public void adaptSizeOfNoDataMessageDiv() {
|
||||
// Scheduler.get().scheduleDeferred(new Command() {
|
||||
// public void execute () {
|
||||
double widthOfNoDataMessageHeader = Double.parseDouble(noDataMessageHeader.getStyle().getWidth());
|
||||
Window.alert("asdfasdfasfd");
|
||||
Window.alert("widthOfNoDataMessageHeader "+widthOfNoDataMessageHeader);
|
||||
noDataMessage.getStyle().setWidth(widthOfNoDataMessageHeader, Unit.PX);
|
||||
// }
|
||||
// });
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(Widget w) {
|
||||
throw new UnsupportedOperationException("The method add(Widget w) is not supported.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
throw new UnsupportedOperationException("The method clear() is not supported.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Widget> iterator() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Widget w) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
|
||||
xmlns:g="urn:import:com.google.gwt.user.client.ui">
|
||||
|
||||
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.header.DashboardWidgetHeaderAndNoDataMessageResources"/>
|
||||
|
||||
<g:HTMLPanel>
|
||||
<g:HTMLPanel ui:field="header" styleName="{resources.gss.dashboard_widget_header}">
|
||||
</g:HTMLPanel>
|
||||
<div class="{resources.gss.dashboard_widget_no_data_message_container}">
|
||||
<div>
|
||||
<div ui:field="noDataMessageHeader" class="{resources.gss.dashboard_widget_no_data_message_header}"></div>
|
||||
<div ui:field="noDataMessage" class="{resources.gss.dashboard_widget_no_data_message}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
package com.sap.sailing.dashboards.gwt.client.widgets.header;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.resources.client.ClientBundle;
|
||||
import com.google.gwt.resources.client.CssResource;
|
||||
|
||||
/**
|
||||
* @author Alexander Ries (D062114)
|
||||
*
|
||||
*/
|
||||
public interface DashboardWidgetHeaderAndNoDataMessageResources extends ClientBundle {
|
||||
|
||||
public static final DashboardWidgetHeaderAndNoDataMessageResources INSTANCE = GWT.create(DashboardWidgetHeaderAndNoDataMessageResources.class);
|
||||
|
||||
@Source({"com/sap/sailing/dashboards/gwt/client/theme/theme.gss", "DashboardWidgetHeaderAndNoDataMessage.gss"})
|
||||
DashboardWidgetHeaderAndNoDataMessageGSS gss();
|
||||
|
||||
public interface DashboardWidgetHeaderAndNoDataMessageGSS extends CssResource {
|
||||
String dashboard_widget_header();
|
||||
String dashboard_widget_no_data_message_container();
|
||||
String dashboard_widget_no_data_message_header();
|
||||
String dashboard_widget_no_data_message();
|
||||
}
|
||||
}
|
||||
-41
@@ -10,47 +10,6 @@
|
||||
bottom: 0pt;
|
||||
}
|
||||
|
||||
.panel_header {
|
||||
height: DASHBOARD_SPACE_MEDIUM;
|
||||
margin-top: 0;
|
||||
line-height: DASHBOARD_SPACE_MEDIUM;
|
||||
vertical-align: middle;
|
||||
font-size: DASHBOARD_FONT_SIZE_LARGE;
|
||||
font-family: DASHBOARD_FONT_FAMILY;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
overflow: visible;
|
||||
background-color: WHITE;
|
||||
}
|
||||
|
||||
.no_data_message_container {
|
||||
position: absolute;
|
||||
top: DASHBOARD_SPACE_MEDIUM;
|
||||
bottom: 0px;
|
||||
width: 100%;
|
||||
font-size: DASHBOARD_FONT_SIZE_MEDIUM;
|
||||
font-family: DASHBOARD_FONT_FAMILY;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-align: center;
|
||||
line-height: DASHBOARD_LINE_HEIGHT;
|
||||
}
|
||||
|
||||
.no_data_message_header {
|
||||
color: DARK_TEXT_COLOR;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.no_data_message {
|
||||
color: LIGHT_TEXT_COLOR;
|
||||
max-width: 230px;
|
||||
margin: auto;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.current_start_panel {
|
||||
height: DASHBOARD_SPACE_MEDIUM;
|
||||
top: DASHBOARD_SPACE_MEDIUM;
|
||||
|
||||
+11
-23
@@ -8,7 +8,6 @@ import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.DivElement;
|
||||
import com.google.gwt.dom.client.Style.Unit;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
@@ -34,6 +33,7 @@ import com.sap.sailing.dashboards.gwt.client.popups.competitorselection.Competit
|
||||
import com.sap.sailing.dashboards.gwt.client.popups.competitorselection.CompetitorSelectionPopup;
|
||||
import com.sap.sailing.dashboards.gwt.client.popups.competitorselection.SettingsButtonWithSelectionIndicationLabel;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.PollsLiveDataEvery5Seconds;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.header.DashboardWidgetHeaderAndNoDataMessage;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.startanalysis.card.StartAnalysisCard;
|
||||
import com.sap.sailing.dashboards.gwt.shared.DashboardURLParameters;
|
||||
import com.sap.sailing.dashboards.gwt.shared.dto.LeaderboardCompetitorsDTO;
|
||||
@@ -62,9 +62,9 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
|
||||
|
||||
interface StartlineAnalysis extends CssResource {
|
||||
}
|
||||
|
||||
@UiField
|
||||
HTMLPanel header;
|
||||
|
||||
@UiField(provided = true)
|
||||
DashboardWidgetHeaderAndNoDataMessage dashboardWidgetHeaderAndNoDataMessage;
|
||||
|
||||
@UiField
|
||||
HTMLPanel currentStartPanel;
|
||||
@@ -93,12 +93,6 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
|
||||
* */
|
||||
@UiField
|
||||
HTMLPanel startanalysis_card_container;
|
||||
|
||||
@UiField
|
||||
DivElement noDataMessageHeader;
|
||||
|
||||
@UiField
|
||||
DivElement noDataMessage;
|
||||
|
||||
/**
|
||||
* The CSS "left" property from the {@link #startanalysis_card_container}.
|
||||
@@ -136,13 +130,14 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
|
||||
* Component that contains handles, displays and loads startanalysis cards.
|
||||
* */
|
||||
public StartAnalysisWidget(DashboardClientFactory dashboardClientFactory) {
|
||||
dashboardWidgetHeaderAndNoDataMessage = new DashboardWidgetHeaderAndNoDataMessage();
|
||||
StartAnalysisWidgetResources.INSTANCE.gss().ensureInjected();
|
||||
raceMapResources.combinedWindPanelStyle().ensureInjected();
|
||||
this.dashboardClientFactory = dashboardClientFactory;
|
||||
pageChangeListener = new ArrayList<StartAnalysisCard>();
|
||||
starts = new ArrayList<StartAnalysisDTO>();
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
header.getElement().setInnerText(StringMessages.INSTANCE.dashboardStartAnalysesHeader());
|
||||
dashboardWidgetHeaderAndNoDataMessage.setHeaderText(StringMessages.INSTANCE.dashboardStartAnalysesHeader());
|
||||
initCompetitorSelectionPopupAndAddCompetitorSelectionListener();
|
||||
initLeftRightButtons();
|
||||
initAndAddBottomNotification();
|
||||
@@ -175,13 +170,14 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
logger.log(Level.INFO, "Failed to received startanalysis list, "+caught.getMessage());
|
||||
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(StartAnalysesDTO result) {
|
||||
logger.log(Level.INFO, "Received startanalysis list");
|
||||
if (result != null && !result.getStartAnalyses().isEmpty()) {
|
||||
hideNoDataMessage();
|
||||
dashboardWidgetHeaderAndNoDataMessage.hideNoDataMessage();
|
||||
if (displayedStartAnalysisCompetitorDifferentToRequestedOne()) {
|
||||
removeAllStartAnalysisCards();
|
||||
}
|
||||
@@ -194,7 +190,7 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
|
||||
settingsButtonWithSelectionIndicationLabel.setSelectionIndicationTextOnLabel(result.getStartAnalyses().get(0).competitor.getName());
|
||||
} else {
|
||||
logger.log(Level.INFO, "Received startanalysis list is null or empty");
|
||||
showNoDataMessageWithHeaderAndMessage(null, null);
|
||||
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableMessage());
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -255,12 +251,14 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
|
||||
}
|
||||
} else {
|
||||
logger.log(Level.INFO, "Received competitors are null or empty");
|
||||
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
logger.log(Level.INFO, "Failed to received competitors for leaderboard name, "+caught.getMessage());
|
||||
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -413,16 +411,6 @@ public class StartAnalysisWidget extends Composite implements HasWidgets, PollsL
|
||||
}
|
||||
}
|
||||
|
||||
private void showNoDataMessageWithHeaderAndMessage(String header, String message) {
|
||||
noDataMessageHeader.setInnerHTML(StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableHeader());
|
||||
noDataMessage.setInnerHTML(StringMessages.INSTANCE.dashboardNoStartAnalysesAvailableMessage());
|
||||
}
|
||||
|
||||
private void hideNoDataMessage() {
|
||||
noDataMessageHeader.setInnerHTML("");
|
||||
noDataMessage.setInnerHTML("");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void timeChanged(Date newTime, Date oldTime) {
|
||||
String selectedCompetitorId = Cookies.getCookie(SELECTED_COMPETITOR_ID_COOKIE_KEY);
|
||||
|
||||
+5
-12
@@ -1,19 +1,12 @@
|
||||
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
|
||||
xmlns:g="urn:import:com.google.gwt.user.client.ui">
|
||||
|
||||
<ui:with field="resources"
|
||||
type="com.sap.sailing.dashboards.gwt.client.widgets.startanalysis.StartAnalysisWidgetResources" />
|
||||
xmlns:g="urn:import:com.google.gwt.user.client.ui"
|
||||
xmlns:header="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.header">
|
||||
|
||||
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.startanalysis.StartAnalysisWidgetResources" />
|
||||
|
||||
<g:HTMLPanel styleName="{resources.gss.startanalysis}">
|
||||
<g:HTMLPanel ui:field="header" styleName="{resources.gss.panel_header}">
|
||||
</g:HTMLPanel>
|
||||
<div class="{resources.gss.no_data_message_container}">
|
||||
<span>
|
||||
<div ui:field="noDataMessageHeader" class="{resources.gss.no_data_message_header}"></div>
|
||||
<div ui:field="noDataMessage" class="{resources.gss.no_data_message}"></div>
|
||||
</span>
|
||||
</div>
|
||||
<header:DashboardWidgetHeaderAndNoDataMessage ui:field="dashboardWidgetHeaderAndNoDataMessage"></header:DashboardWidgetHeaderAndNoDataMessage>
|
||||
<g:HTMLPanel ui:field="currentStartPanel" styleName="{resources.gss.current_start_panel}">
|
||||
</g:HTMLPanel>
|
||||
<g:HTMLPanel ui:field="leftButton"
|
||||
|
||||
-4
@@ -26,10 +26,6 @@ public interface StartAnalysisWidgetResources extends ClientBundle {
|
||||
|
||||
public interface StartAnalysisGSS extends CssResource {
|
||||
String startanalysis();
|
||||
String panel_header();
|
||||
String no_data_message_container();
|
||||
String no_data_message_header();
|
||||
String no_data_message();
|
||||
String current_start_panel();
|
||||
String controll_header_button();
|
||||
String controll_header_button_visible();
|
||||
|
||||
+2
-2
@@ -101,9 +101,9 @@ public class StartAnalysisCard extends Composite implements HasWidgets, StartAna
|
||||
final String startLineAdvantageType;
|
||||
if (startAnalysisDTO.startAnalysisWindLineInfoDTO.startLineAdvantage.startLineAdvatageType
|
||||
.equals(StartlineAdvantageType.GEOMETRIC)) {
|
||||
startLineAdvantageType = stringMessages.dashboardStartlineAdvantageByGeometry();
|
||||
startLineAdvantageType = stringMessages.dashboardStartlineAdvantageByGeometryHeader();
|
||||
} else {
|
||||
startLineAdvantageType = stringMessages.dashboardStartlineAdvantagesByWind();
|
||||
startLineAdvantageType = stringMessages.dashboardStartlineAdvantagesByWindHeader();
|
||||
}
|
||||
startanalysis_card_line_advantage
|
||||
.setInnerHTML(SafeHtmlUtils.fromString(startLineAdvantageType
|
||||
|
||||
+8
-24
@@ -1,31 +1,15 @@
|
||||
@require 'theme';
|
||||
|
||||
.startLineAdvantageComponent_liveAveragePanel {
|
||||
bottom: 5pt;
|
||||
margin-top: 4pt;
|
||||
.start_line_advantage_by_geometry_widget {
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
background-color: LIGHT_GREY;
|
||||
}
|
||||
|
||||
.startLineAdvantageComponent_header {
|
||||
font-size: 14pt;
|
||||
}
|
||||
|
||||
.startLineAdvantageComponent_livePanel {
|
||||
top: 35%;
|
||||
bottom: 20%;
|
||||
}
|
||||
|
||||
.startLineAdvantageComponent_averagePanel {
|
||||
top: 35%;
|
||||
bottom: 20%;
|
||||
}
|
||||
|
||||
.startLineAdvantageComponent_middleLine {
|
||||
top: 35%;
|
||||
bottom: 20%;
|
||||
}
|
||||
|
||||
.startLineAdvantageComponent_wrapper {
|
||||
.advantage_maximum_live_average {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: DASHBOARD_SPACE_MEDIUM;
|
||||
height: auto;
|
||||
}
|
||||
+74
-25
@@ -1,51 +1,74 @@
|
||||
package com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.course;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.i18n.client.NumberFormat;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.HTMLPanel;
|
||||
import com.google.gwt.user.client.ui.HasWidgets;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.dashboards.gwt.client.DashboardClientFactory;
|
||||
import com.sap.sailing.dashboards.gwt.client.actions.GetStartlineAdvantageByGeometryAction;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.PollsLiveDataEvery5Seconds;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.header.DashboardWidgetHeaderAndNoDataMessage;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util.LiveAverageComponent;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.StartlineAdvantagesByWindWidget;
|
||||
import com.sap.sailing.dashboards.gwt.shared.DashboardURLParameters;
|
||||
import com.sap.sailing.dashboards.gwt.shared.dto.StartLineAdvantageDTO;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
|
||||
/**
|
||||
* The purpose of the class is to display the live and average start line advantage either by wind or by geometry. There
|
||||
* is only one advantage display at once, so the user can switch between these following two
|
||||
* {@link StartLineAdvantageComponentState}s {@link StartLineAdvantageComponentStateShowsAdvantageByWind} and
|
||||
* {@link StartLineAdvantageComponentStateShowsAdvantageByGeometry} by tabing somewhere at the widget. The class extends
|
||||
* from {@link LiveAverageComponent} to get necessary Ui Elements but customizes these with own CSS.
|
||||
*
|
||||
* @author Alexander Ries (D062114)
|
||||
*
|
||||
*/
|
||||
public class StartLineAdvantageByGeometryWidget extends LiveAverageComponent implements PollsLiveDataEvery5Seconds {
|
||||
public class StartlineAdvantageByGeometryWidget extends Composite implements HasWidgets, PollsLiveDataEvery5Seconds {
|
||||
|
||||
private DashboardClientFactory dashboardClientFactory;
|
||||
private static StartlineAdvantageByGeometryWidgetUiBinder uiBinder = GWT
|
||||
.create(StartlineAdvantageByGeometryWidgetUiBinder.class);
|
||||
|
||||
interface StartlineAdvantageByGeometryWidgetUiBinder extends UiBinder<Widget, StartlineAdvantageByGeometryWidget> {
|
||||
}
|
||||
|
||||
private static StringMessages stringConstants = StringMessages.INSTANCE;
|
||||
private static final Logger logger = Logger.getLogger(StartLineAdvantageByGeometryWidget.class.getName());
|
||||
@UiField(provided = true)
|
||||
DashboardWidgetHeaderAndNoDataMessage dashboardWidgetHeaderAndNoDataMessage;
|
||||
|
||||
public StartLineAdvantageByGeometryWidget(DashboardClientFactory dashboardClientFactory) {
|
||||
super(stringConstants.dashboardStartlineAdvantageByGeometry(), "m");
|
||||
this.dashboardClientFactory = dashboardClientFactory;
|
||||
@UiField(provided = true)
|
||||
LiveAverageComponent advantageMaximumLiveAverage;
|
||||
|
||||
@UiField
|
||||
HTMLPanel contentContainer;
|
||||
|
||||
public DashboardClientFactory dashboardClientFactory;
|
||||
private static final Logger logger = Logger.getLogger(StartlineAdvantagesByWindWidget.class.getName());
|
||||
|
||||
public StartlineAdvantageByGeometryWidget(DashboardClientFactory dashboardClientFactory) {
|
||||
StartLineAdvantageByGeometryWidgetRessources.INSTANCE.gss().ensureInjected();
|
||||
this.header.setInnerText(stringConstants.dashboardStartlineAdvantageByGeometry());
|
||||
this.header.addClassName(StartLineAdvantageByGeometryWidgetRessources.INSTANCE.gss().startLineAdvantageComponent_header());
|
||||
liveAveragePanel.getElement().addClassName(StartLineAdvantageByGeometryWidgetRessources.INSTANCE.gss().startLineAdvantageComponent_liveAveragePanel());
|
||||
livePanel.getElement().addClassName(StartLineAdvantageByGeometryWidgetRessources.INSTANCE.gss().startLineAdvantageComponent_livePanel());
|
||||
middleLine.getElement().addClassName(StartLineAdvantageByGeometryWidgetRessources.INSTANCE.gss().startLineAdvantageComponent_middleLine());
|
||||
averagePanel.getElement().addClassName(StartLineAdvantageByGeometryWidgetRessources.INSTANCE.gss().startLineAdvantageComponent_averagePanel());
|
||||
this.liveLabel.setInnerHTML(stringConstants.dashboardLiveWind());
|
||||
this.averageLabel.setInnerHTML(stringConstants.dashboardAverageWind()+"<br>"+stringConstants.dashboardAverageWindMinutes(15));
|
||||
this.dashboardClientFactory = dashboardClientFactory;
|
||||
dashboardWidgetHeaderAndNoDataMessage = new DashboardWidgetHeaderAndNoDataMessage();
|
||||
advantageMaximumLiveAverage = new LiveAverageComponent(StringMessages.INSTANCE.metersUnit());
|
||||
advantageMaximumLiveAverage.liveLabel.setInnerHTML(StringMessages.INSTANCE.dashboardLiveWind());
|
||||
advantageMaximumLiveAverage.averageLabel.setInnerHTML("<p>"+StringMessages.INSTANCE.dashboardAverageWind()+"</p><p>"+StringMessages.INSTANCE.dashboardAverageWindMinutes(15)+"</p>");
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
hideDataDisplayContainer();
|
||||
dashboardWidgetHeaderAndNoDataMessage.setHeaderText(StringMessages.INSTANCE.dashboardStartlineAdvantageByGeometryHeader());
|
||||
registerForDashboardFiveSecondsTimer(dashboardClientFactory);
|
||||
}
|
||||
|
||||
private void showDataDisplayContainer(){
|
||||
contentContainer.getElement().getStyle().setOpacity(1.0);
|
||||
}
|
||||
|
||||
private void hideDataDisplayContainer(){
|
||||
contentContainer.getElement().getStyle().setOpacity(0.0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void timeChanged(Date newTime, Date oldTime) {
|
||||
String leaderboardNameParameterValue = DashboardURLParameters.LEADERBOARD_NAME.getValue();
|
||||
@@ -57,26 +80,52 @@ public class StartLineAdvantageByGeometryWidget extends LiveAverageComponent imp
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
logger.log(Level.INFO, "Failed to received startline advantage by geometry");
|
||||
hideDataDisplayContainer();
|
||||
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByGeometryAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByGeometryAvailableMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(StartLineAdvantageDTO result) {
|
||||
if (result.startLineAdvantage != null) {
|
||||
logger.log(Level.INFO, "Updating UI with RibDashboardRaceInfoDTO.startLineAdvantageDTO");
|
||||
setLiveValue(NumberFormat.getFormat("#0.0").format(result.startLineAdvantage.doubleValue()));
|
||||
setAverageValue(NumberFormat.getFormat("#0.0").format(result.average.doubleValue()));
|
||||
advantageMaximumLiveAverage.setLiveValue(NumberFormat.getFormat("#0.0").format(result.startLineAdvantage.doubleValue()));
|
||||
advantageMaximumLiveAverage.setAverageValue(NumberFormat.getFormat("#0.0").format(result.average.doubleValue()));
|
||||
showDataDisplayContainer();
|
||||
dashboardWidgetHeaderAndNoDataMessage.hideNoDataMessage();
|
||||
} else {
|
||||
logger.log(Level.INFO, "RibDashboardRaceInfoDTO.startLineAdvantageDTO is 0");
|
||||
hideDataDisplayContainer();
|
||||
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByGeometryAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByGeometryAvailableMessage());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void registerForDashboardFiveSecondsTimer(DashboardClientFactory dashboardClientFactory) {
|
||||
if (dashboardClientFactory != null) {
|
||||
dashboardClientFactory.getDashboardFiveSecondsTimer().addTimeListener(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(Widget w) {
|
||||
throw new UnsupportedOperationException("The method add(Widget w) is not supported.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
throw new UnsupportedOperationException("The method clear() is not supported.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Widget> iterator() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Widget w) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+3
-11
@@ -14,16 +14,8 @@ public interface StartLineAdvantageByGeometryWidgetRessources extends ClientBund
|
||||
|
||||
@Shared
|
||||
public interface StartLineAdvantageByGeometryGss extends CssResource {
|
||||
public String startLineAdvantageComponent_liveAveragePanel();
|
||||
|
||||
public String startLineAdvantageComponent_header();
|
||||
|
||||
public String startLineAdvantageComponent_livePanel();
|
||||
|
||||
public String startLineAdvantageComponent_averagePanel();
|
||||
|
||||
public String startLineAdvantageComponent_middleLine();
|
||||
|
||||
public String startLineAdvantageComponent_wrapper();
|
||||
|
||||
String start_line_advantage_by_geometry_widget();
|
||||
String advantage_maximum_live_average();
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
|
||||
xmlns:g="urn:import:com.google.gwt.user.client.ui"
|
||||
xmlns:util="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util"
|
||||
xmlns:header="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.header">
|
||||
|
||||
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.course.StartLineAdvantageByGeometryWidgetRessources" />
|
||||
|
||||
<g:HTMLPanel styleName="{resources.gss.start_line_advantage_by_geometry_widget}">
|
||||
<header:DashboardWidgetHeaderAndNoDataMessage ui:field="dashboardWidgetHeaderAndNoDataMessage"></header:DashboardWidgetHeaderAndNoDataMessage>
|
||||
<g:HTMLPanel ui:field="contentContainer">
|
||||
<g:HTMLPanel styleName="{resources.gss.advantage_maximum_live_average}">
|
||||
<util:LiveAverageComponent ui:field="advantageMaximumLiveAverage"></util:LiveAverageComponent>
|
||||
</g:HTMLPanel>
|
||||
</g:HTMLPanel>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+20
-35
@@ -5,33 +5,14 @@
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
top: 0px;
|
||||
bottom: 0px;
|
||||
}
|
||||
|
||||
.header_container {
|
||||
position: absolute;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
top: 0px;
|
||||
height: 35%;
|
||||
}
|
||||
|
||||
.header {
|
||||
height: 100%;
|
||||
margin-top: 5pt;
|
||||
line-height: 15pt;
|
||||
vertical-align: middle;
|
||||
font-size: 13pt;
|
||||
font-family: DASHBOARD_FONT_FAMILY;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
overflow: visible;
|
||||
font-weight: bold;
|
||||
height: 110px;
|
||||
background-color: WHITE;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.live_container {
|
||||
position: absolute;
|
||||
top: 35%;
|
||||
top: DASHBOARD_SPACE_VERY_SMALL;
|
||||
bottom: 30%;
|
||||
right: 52%;
|
||||
left: 0%;
|
||||
@@ -39,7 +20,7 @@
|
||||
|
||||
.average_container {
|
||||
position: absolute;
|
||||
top: 35%;
|
||||
top: DASHBOARD_SPACE_VERY_SMALL;
|
||||
bottom: 30%;
|
||||
right: 0%;
|
||||
left: 52%;
|
||||
@@ -47,7 +28,7 @@
|
||||
|
||||
.middle_line {
|
||||
position: absolute;
|
||||
top: 35%;
|
||||
top: 13px;
|
||||
height: 30pt;
|
||||
width: 1px;
|
||||
left: 50%;
|
||||
@@ -57,12 +38,13 @@
|
||||
|
||||
.panel_value_number {
|
||||
font-family: DASHBOARD_FONT_FAMILY;
|
||||
font-size: 26pt;
|
||||
font-size: DASHBOARD_FONT_SIZE_VERY_LARGE;
|
||||
height: DASHBOARD_FONT_SIZE_VERY_LARGE;
|
||||
}
|
||||
|
||||
.panel_value_unit {
|
||||
font-family: DASHBOARD_FONT_FAMILY;
|
||||
font-size: 15pt;
|
||||
font-size: DASHBOARD_FONT_SIZE_MEDIUM;
|
||||
}
|
||||
|
||||
.panel_value_unit_degrees {
|
||||
@@ -74,7 +56,6 @@
|
||||
.value_panel {
|
||||
margin: 0px;
|
||||
width: 100%;
|
||||
height: 90%;
|
||||
text-align: center;
|
||||
font-family: DASHBOARD_FONT_FAMILY;
|
||||
font-weight: bolder;
|
||||
@@ -85,23 +66,27 @@
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
font-size: 11pt;
|
||||
color: grey;
|
||||
font-size: DASHBOARD_FONT_SIZE_MEDIUM;
|
||||
color: LIGHT_TEXT_COLOR;
|
||||
font-family: DASHBOARD_FONT_FAMILY;
|
||||
}
|
||||
|
||||
.live_label_container {
|
||||
position: absolute;
|
||||
bottom: 0px;
|
||||
top: 56px;
|
||||
left: 0px;
|
||||
right: 50%;
|
||||
height: 35%;
|
||||
height: 14px;
|
||||
padding-left: DASHBOARD_SPACE_VERY_SMALL;
|
||||
padding-right: DASHBOARD_SPACE_VERY_SMALL;
|
||||
}
|
||||
|
||||
.average_label_container {
|
||||
position: absolute;
|
||||
bottom: 0px;
|
||||
right: 0px;
|
||||
top: 56px;
|
||||
left: 50%;
|
||||
height: 35%;
|
||||
right: 0px;
|
||||
height: 14px;
|
||||
padding-left: DASHBOARD_SPACE_VERY_SMALL;
|
||||
padding-right: DASHBOARD_SPACE_VERY_SMALL;
|
||||
}
|
||||
+1
-6
@@ -11,7 +11,6 @@ import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.HTMLPanel;
|
||||
import com.google.gwt.user.client.ui.HasWidgets;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.course.StartLineAdvantageByGeometryWidget;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.windbot.WindBotWidget;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.windbot.charts.VerticalWindChartClickListener;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
@@ -34,9 +33,6 @@ public class LiveAverageComponent extends Composite implements HasWidgets, Verti
|
||||
@UiField
|
||||
public HTMLPanel liveAveragePanel;
|
||||
|
||||
@UiField
|
||||
public DivElement header;
|
||||
|
||||
@UiField
|
||||
SpanElement liveNumber;
|
||||
|
||||
@@ -78,12 +74,11 @@ public class LiveAverageComponent extends Composite implements HasWidgets, Verti
|
||||
* sets a special size
|
||||
*
|
||||
* */
|
||||
public LiveAverageComponent(String header, String unit) {
|
||||
public LiveAverageComponent(String unit) {
|
||||
LiveAverageComponentResources.INSTANCE.gss().ensureInjected();
|
||||
stringConstants = StringMessages.INSTANCE;
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
liveAveragePanel.getElement().getStyle().setProperty("backgroundColor", "white");
|
||||
this.header.setInnerText(header);
|
||||
this.liveUnit.setInnerText(unit);
|
||||
this.averageUnit.setInnerText(unit);
|
||||
// Lifts the degrees unit string "°". Otherwise it would be too small.
|
||||
|
||||
+13
-24
@@ -2,40 +2,29 @@
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
|
||||
xmlns:g="urn:import:com.google.gwt.user.client.ui">
|
||||
|
||||
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util.LiveAverageComponentResources"/>
|
||||
|
||||
<ui:with field="resources"
|
||||
type="com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util.LiveAverageComponentResources" />
|
||||
|
||||
<g:HTMLPanel ui:field="liveAveragePanel" styleName="{resources.gss.live_average_component}">
|
||||
|
||||
<g:HTMLPanel styleName="{resources.gss.header_container}">
|
||||
<div class="{resources.gss.header}" ui:field="header"></div>
|
||||
</g:HTMLPanel>
|
||||
|
||||
<g:HTMLPanel ui:field="livePanel" styleName="{resources.gss.live_container}">
|
||||
<div class="{resources.gss.value_panel}">
|
||||
<span class="{resources.gss.panel_value_number}" ui:field="liveNumber"></span>
|
||||
<span class="{resources.gss.panel_value_unit}" ui:field="liveUnit"></span>
|
||||
</div>
|
||||
<div class="{resources.gss.value_panel}">
|
||||
<span class="{resources.gss.panel_value_number}" ui:field="liveNumber"></span>
|
||||
<span class="{resources.gss.panel_value_unit}" ui:field="liveUnit"></span>
|
||||
</div>
|
||||
</g:HTMLPanel>
|
||||
|
||||
<g:HTMLPanel ui:field="middleLine" styleName="{resources.gss.middle_line}">
|
||||
|
||||
</g:HTMLPanel>
|
||||
|
||||
<g:HTMLPanel ui:field="averagePanel" styleName="{resources.gss.average_container}">
|
||||
<div class="{resources.gss.value_panel}">
|
||||
<span class="{resources.gss.panel_value_number}" ui:field="averageNumber"></span>
|
||||
<span class="{resources.gss.panel_value_unit}" ui:field="averageUnit"></span>
|
||||
</div>
|
||||
<div class="{resources.gss.value_panel}">
|
||||
<span class="{resources.gss.panel_value_number}" ui:field="averageNumber"></span>
|
||||
<span class="{resources.gss.panel_value_unit}" ui:field="averageUnit"></span>
|
||||
</div>
|
||||
</g:HTMLPanel>
|
||||
|
||||
<g:HTMLPanel styleName="{resources.gss.live_label_container}">
|
||||
<div class="{resources.gss.label_text}" ui:field="liveLabel"></div>
|
||||
<div class="{resources.gss.label_text}" ui:field="liveLabel"></div>
|
||||
</g:HTMLPanel>
|
||||
|
||||
<g:HTMLPanel styleName="{resources.gss.average_label_container}">
|
||||
<div class="{resources.gss.label_text}" ui:field="averageLabel"></div>
|
||||
<div class="{resources.gss.label_text}" ui:field="averageLabel"></div>
|
||||
</g:HTMLPanel>
|
||||
|
||||
</g:HTMLPanel>
|
||||
|
||||
</ui:UiBinder>
|
||||
-2
@@ -17,8 +17,6 @@ public interface LiveAverageComponentResources extends ClientBundle {
|
||||
|
||||
interface LiveAverageComponentGss extends CssResource {
|
||||
String live_average_component();
|
||||
String header();
|
||||
String header_container();
|
||||
String live_container();
|
||||
String average_container();
|
||||
String middle_line();
|
||||
|
||||
+9
-8
@@ -1,21 +1,22 @@
|
||||
@require 'theme';
|
||||
|
||||
.start_line_advantages_by_wind_component{
|
||||
.start_line_advantages_by_wind_component {
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
background-color: LIGHT_GREY;
|
||||
}
|
||||
|
||||
.advantage_maximum_live_average{
|
||||
.advantage_maximum_live_average {
|
||||
position: absolute;
|
||||
height: 30%;
|
||||
width: 100%;
|
||||
top: 4pt;
|
||||
top: DASHBOARD_SPACE_MEDIUM;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.advantages_on_line_chart_container{
|
||||
position: absolute;
|
||||
height: 70%;
|
||||
top: 30%;
|
||||
.advantages_on_line_chart_container {
|
||||
position: absolute;
|
||||
top: 150px;
|
||||
width: 100%;
|
||||
bottom: 0px;
|
||||
}
|
||||
+24
-3
@@ -6,18 +6,19 @@ import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.Style.Unit;
|
||||
import com.google.gwt.i18n.client.NumberFormat;
|
||||
import com.google.gwt.resources.client.CssResource;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.HTMLPanel;
|
||||
import com.google.gwt.user.client.ui.HasWidgets;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.dashboards.gwt.client.DashboardClientFactory;
|
||||
import com.sap.sailing.dashboards.gwt.client.actions.GetStartlineAdvantagesByWindAction;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.PollsLiveDataEvery5Seconds;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.header.DashboardWidgetHeaderAndNoDataMessage;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util.LiveAverageComponent;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.charts.StartlineAdvantagesOnLineChart;
|
||||
import com.sap.sailing.dashboards.gwt.shared.DashboardURLParameters;
|
||||
@@ -40,24 +41,33 @@ public class StartlineAdvantagesByWindWidget extends Composite implements HasWid
|
||||
|
||||
}
|
||||
|
||||
@UiField(provided = true)
|
||||
DashboardWidgetHeaderAndNoDataMessage dashboardWidgetHeaderAndNoDataMessage;
|
||||
|
||||
@UiField(provided = true)
|
||||
LiveAverageComponent advantageMaximumLiveAverage;
|
||||
|
||||
@UiField(provided = true)
|
||||
StartlineAdvantagesOnLineChart startlineAdvantagesOnLineChart;
|
||||
|
||||
@UiField
|
||||
HTMLPanel dataDisplayContainer;
|
||||
|
||||
public DashboardClientFactory dashboardClientFactory;
|
||||
private static final Logger logger = Logger.getLogger(StartlineAdvantagesByWindWidget.class.getName());
|
||||
|
||||
public StartlineAdvantagesByWindWidget(DashboardClientFactory dashboardClientFactory) {
|
||||
StartlineAdvantagesByWindWidgetResources.INSTANCE.gss().ensureInjected();
|
||||
this.dashboardClientFactory = dashboardClientFactory;
|
||||
dashboardWidgetHeaderAndNoDataMessage = new DashboardWidgetHeaderAndNoDataMessage();
|
||||
advantageMaximumLiveAverage = new LiveAverageComponent(StringMessages.INSTANCE.metersUnit());
|
||||
startlineAdvantagesOnLineChart = new StartlineAdvantagesOnLineChart();
|
||||
advantageMaximumLiveAverage = new LiveAverageComponent(StringMessages.INSTANCE.dashboardStartlineAdvantagesByWind(), "m");
|
||||
advantageMaximumLiveAverage.header.getStyle().setFontSize(14, Unit.PT);
|
||||
advantageMaximumLiveAverage.liveLabel.setInnerHTML("advantage max.");
|
||||
advantageMaximumLiveAverage.averageLabel.setInnerHTML("advantage max. average "+StringMessages.INSTANCE.dashboardAverageWindMinutes(15));
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
hideDataDisplayContainer();
|
||||
dashboardWidgetHeaderAndNoDataMessage.setHeaderText(StringMessages.INSTANCE.dashboardStartlineAdvantagesByWindHeader());
|
||||
dataDisplayContainer.getElement().getStyle().setOpacity(0.0);
|
||||
registerForDashboardFiveSecondsTimer(dashboardClientFactory);
|
||||
}
|
||||
|
||||
@@ -79,8 +89,10 @@ public class StartlineAdvantagesByWindWidget extends Composite implements HasWid
|
||||
result.maximum.doubleValue()));
|
||||
advantageMaximumLiveAverage.setAverageValue(NumberFormat.getFormat("#0.0").format(
|
||||
result.average.doubleValue()));
|
||||
showDataDisplayContainer();
|
||||
} else {
|
||||
logger.log(Level.INFO, "StartlineAdvantagesWithMaxAndAverageDTO is null");
|
||||
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByWindAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByWindAvailableMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,11 +100,20 @@ public class StartlineAdvantagesByWindWidget extends Composite implements HasWid
|
||||
public void onFailure(Throwable caught) {
|
||||
logger.log(Level.INFO, "Failed to received StartlineAdvantagesWithMaxAndAverageDTO, "
|
||||
+ caught.getMessage());
|
||||
dashboardWidgetHeaderAndNoDataMessage.showNoDataMessageWithHeaderAndMessage(StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByWindAvailableHeader(), StringMessages.INSTANCE.dashboardNoStartlineAdvantagesByWindAvailableMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void showDataDisplayContainer(){
|
||||
dataDisplayContainer.getElement().getStyle().setOpacity(1.0);
|
||||
}
|
||||
|
||||
private void hideDataDisplayContainer(){
|
||||
dataDisplayContainer.getElement().getStyle().setOpacity(0.0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void timeChanged(Date newTime, Date oldTime) {
|
||||
loadData();
|
||||
|
||||
+12
-7
@@ -2,16 +2,21 @@
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
|
||||
xmlns:g="urn:import:com.google.gwt.user.client.ui"
|
||||
xmlns:util="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util"
|
||||
xmlns:chart="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.charts">
|
||||
xmlns:chart="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.charts"
|
||||
xmlns:header="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.header">
|
||||
|
||||
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.StartlineAdvantagesByWindWidgetResources"/>
|
||||
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.wind.StartlineAdvantagesByWindWidgetResources" />
|
||||
|
||||
<g:HTMLPanel styleName="{resources.gss.start_line_advantages_by_wind_component}">
|
||||
<g:HTMLPanel styleName="{resources.gss.advantage_maximum_live_average}">
|
||||
<util:LiveAverageComponent ui:field="advantageMaximumLiveAverage"></util:LiveAverageComponent>
|
||||
</g:HTMLPanel>
|
||||
<g:HTMLPanel styleName="{resources.gss.advantages_on_line_chart_container}">
|
||||
<chart:StartlineAdvantagesOnLineChart ui:field="startlineAdvantagesOnLineChart"></chart:StartlineAdvantagesOnLineChart>
|
||||
<header:DashboardWidgetHeaderAndNoDataMessage
|
||||
ui:field="dashboardWidgetHeaderAndNoDataMessage"></header:DashboardWidgetHeaderAndNoDataMessage>
|
||||
<g:HTMLPanel ui:field="dataDisplayContainer">
|
||||
<g:HTMLPanel styleName="{resources.gss.advantage_maximum_live_average}">
|
||||
<util:LiveAverageComponent ui:field="advantageMaximumLiveAverage"></util:LiveAverageComponent>
|
||||
</g:HTMLPanel>
|
||||
<g:HTMLPanel styleName="{resources.gss.advantages_on_line_chart_container}">
|
||||
<chart:StartlineAdvantagesOnLineChart ui:field="startlineAdvantagesOnLineChart"></chart:StartlineAdvantagesOnLineChart>
|
||||
</g:HTMLPanel>
|
||||
</g:HTMLPanel>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+20
-26
@@ -7,17 +7,18 @@
|
||||
z-index: 5;
|
||||
}
|
||||
|
||||
.name_panel {
|
||||
height: 45pt;
|
||||
line-height: 45pt;
|
||||
.live_average_header {
|
||||
position: absolute;
|
||||
height: 60px;
|
||||
top: DASHBOARD_SPACE_MEDIUM;
|
||||
line-height: 60px;
|
||||
vertical-align: middle;
|
||||
font-size: 14pt;
|
||||
font-size: DASHBOARD_FONT_SIZE_LARGE;
|
||||
font-family: DASHBOARD_FONT_FAMILY;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
overflow: visible;
|
||||
background-color: white;
|
||||
background-color: WHITE;
|
||||
}
|
||||
|
||||
.live_average_container {
|
||||
@@ -25,41 +26,34 @@
|
||||
border: none;
|
||||
border-radius: 0pt;
|
||||
background-color: white;
|
||||
top: 45pt;
|
||||
bottom: 65%;
|
||||
top: 90px;
|
||||
}
|
||||
|
||||
.left {
|
||||
left: 0pt;
|
||||
left: 0px;
|
||||
right: 50%;
|
||||
}
|
||||
|
||||
.right {
|
||||
left: 50%;
|
||||
right: 0pt;
|
||||
right: 0px;
|
||||
}
|
||||
|
||||
.windchart_container {
|
||||
position: absolute;
|
||||
border: none;
|
||||
border-radius: 0pt;
|
||||
border-radius: 0px;
|
||||
background-color: white;
|
||||
top: 35%;
|
||||
bottom: 0pt;
|
||||
top: 190px;
|
||||
bottom: 0px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
|
||||
.windchart{
|
||||
position: absolute;
|
||||
left: 0pt;
|
||||
right: 0pt;
|
||||
top: 0pt;
|
||||
bottom: 0pt;
|
||||
}
|
||||
|
||||
.compass_container{
|
||||
position: absolute;
|
||||
height: 45pt;
|
||||
width: 45pt;
|
||||
top: 5pt;
|
||||
right: 5pt;
|
||||
}
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
top: 0px;
|
||||
bottom: 0px;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
+43
-38
@@ -7,15 +7,17 @@ import java.util.logging.Logger;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
|
||||
import com.google.gwt.dom.client.DivElement;
|
||||
import com.google.gwt.i18n.client.NumberFormat;
|
||||
import com.google.gwt.resources.client.CssResource;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.HTMLPanel;
|
||||
import com.google.gwt.user.client.ui.HasWidgets;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.dashboards.gwt.client.DashboardClientFactory;
|
||||
import com.sap.sailing.dashboards.gwt.client.dataretriever.WindBotDataRetrieverListener;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.header.DashboardWidgetHeaderAndNoDataMessage;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util.LiveAverageComponent;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.windbot.charts.VerticalWindChart;
|
||||
import com.sap.sailing.dashboards.gwt.client.widgets.windbot.compass.LocationPointerCompass;
|
||||
@@ -49,18 +51,18 @@ public class WindBotWidget extends Composite implements HasWidgets, WindBotDataR
|
||||
|
||||
interface WindBotWidgetUiBinder extends UiBinder<Widget, WindBotWidget> {
|
||||
}
|
||||
|
||||
interface WindBotComponentStyle extends CssResource {
|
||||
}
|
||||
|
||||
@UiField
|
||||
public HTMLPanel windBotComponent;
|
||||
|
||||
/**
|
||||
* The header of the widget displaying the name of the wind bot.
|
||||
* */
|
||||
|
||||
@UiField(provided = true)
|
||||
DashboardWidgetHeaderAndNoDataMessage dashboardWidgetHeaderAndNoDataMessage;
|
||||
|
||||
@UiField
|
||||
public HTMLPanel windBotNamePanel;
|
||||
DivElement totalWindSpeedHeader;
|
||||
|
||||
@UiField
|
||||
DivElement totalWindDirectionHeader;
|
||||
|
||||
/**
|
||||
* One of two {@link LiveAverageComponent}s that display in big font the live and the average value of the measured
|
||||
@@ -97,24 +99,28 @@ public class WindBotWidget extends Composite implements HasWidgets, WindBotDataR
|
||||
@UiField
|
||||
public LocationPointerCompass locationPointerCompass;
|
||||
|
||||
public DashboardClientFactory dashboardClientFactory;
|
||||
private String windBotId;
|
||||
private StringMessages stringConstants;
|
||||
private final static String UNIT_WIND_DIRECTION = "°";
|
||||
|
||||
public WindBotWidget(String windBotId) {
|
||||
public WindBotWidget(String windBotId, DashboardClientFactory dashboardClientFactory) {
|
||||
WindBotWidgetResources.INSTANCE.gss().ensureInjected();
|
||||
this.dashboardClientFactory = dashboardClientFactory;
|
||||
dashboardWidgetHeaderAndNoDataMessage = new DashboardWidgetHeaderAndNoDataMessage();
|
||||
this.windBotId = windBotId;
|
||||
stringConstants = StringMessages.INSTANCE;
|
||||
movingAverageSpeed = new MovingAverage(500);
|
||||
movingAverageDirection = new MovingAverage(500);
|
||||
trueWindSpeedLiveAverageComponent = new LiveAverageComponent(stringConstants.dashboardTrueWindSpeed(), stringConstants.dashboardTrueWindSpeedUnit());
|
||||
trueWindDirectionLiveAverageComponent = new LiveAverageComponent(stringConstants.dashboardTrueWindDirection(), UNIT_WIND_DIRECTION);
|
||||
trueWindSpeedLiveAverageComponent = new LiveAverageComponent(stringConstants.dashboardTrueWindSpeedUnit());
|
||||
trueWindDirectionLiveAverageComponent = new LiveAverageComponent(stringConstants.degreesUnit());
|
||||
trueWindSpeedVerticalWindChart = new VerticalWindChart("#008FFF", "#6ADBFF");
|
||||
trueWindDirectionVerticalWindChart = new VerticalWindChart("#008FFF", "#6ADBFF");
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
windBotNamePanel.getElement().setInnerText(stringConstants.dashboardWindBot()+" "+ windBotId);
|
||||
trueWindSpeedVerticalWindChart.addVerticalWindChartClickListener(trueWindSpeedLiveAverageComponent);
|
||||
trueWindDirectionVerticalWindChart.addVerticalWindChartClickListener(trueWindDirectionLiveAverageComponent);
|
||||
dashboardWidgetHeaderAndNoDataMessage.setHeaderText(stringConstants.dashboardWindBot()+" "+ windBotId);
|
||||
totalWindSpeedHeader.setInnerHTML(stringConstants.dashboardTrueWindSpeed());
|
||||
totalWindDirectionHeader.setInnerHTML(stringConstants.dashboardTrueWindDirection());
|
||||
trueWindSpeedVerticalWindChart.addVerticalWindChartClickListener(trueWindSpeedLiveAverageComponent);
|
||||
trueWindDirectionVerticalWindChart.addVerticalWindChartClickListener(trueWindDirectionLiveAverageComponent);
|
||||
}
|
||||
|
||||
public WindTrackInfoDTO getWindTrackInfoDTOFromAndWindBotID(WindInfoForRaceDTO windInfoForRaceDTO, String id) {
|
||||
@@ -128,26 +134,6 @@ public class WindBotWidget extends Composite implements HasWidgets, WindBotDataR
|
||||
return windTrackInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(Widget w) {
|
||||
throw new UnsupportedOperationException("The method add(Widget w) is not supported.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
throw new UnsupportedOperationException("The method clear() is not supported.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Widget> iterator() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Widget w) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the classes {@link LiveAverageComponent}s and {@link VerticalWindChart}s with data AND updates the
|
||||
* {@link #locationPointerCompass} with a new wind bot position !!!
|
||||
@@ -220,8 +206,7 @@ public class WindBotWidget extends Composite implements HasWidgets, WindBotDataR
|
||||
}
|
||||
|
||||
private void updateLocationPointerCompass(final WindTrackInfoDTO windTrackInfoDTO) {
|
||||
locationPointerCompass.windBotPositionChanged(windTrackInfoDTO.windFixes
|
||||
.get(windTrackInfoDTO.windFixes.size() - 1).position);
|
||||
locationPointerCompass.windBotPositionChanged(windTrackInfoDTO.windFixes.get(windTrackInfoDTO.windFixes.size() - 1).position);
|
||||
}
|
||||
|
||||
private void updateMovingAverages(List<WindDTO> windFixes) {
|
||||
@@ -230,4 +215,24 @@ public class WindBotWidget extends Composite implements HasWidgets, WindBotDataR
|
||||
movingAverageDirection.add(windDTO.trueWindFromDeg);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(Widget w) {
|
||||
throw new UnsupportedOperationException("The method add(Widget w) is not supported.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
throw new UnsupportedOperationException("The method clear() is not supported.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Widget> iterator() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Widget w) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+6
-6
@@ -3,12 +3,16 @@
|
||||
xmlns:g="urn:import:com.google.gwt.user.client.ui" xmlns:client="urn:import:com.sap.sailing.dashboards.gwt.client"
|
||||
xmlns:util="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.startlineadvantage.util"
|
||||
xmlns:windchart="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.windbot.charts"
|
||||
xmlns:compass="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.windbot.compass">
|
||||
xmlns:compass="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.windbot.compass"
|
||||
xmlns:header="urn:import:com.sap.sailing.dashboards.gwt.client.widgets.header">
|
||||
|
||||
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.windbot.WindBotWidgetResources"/>
|
||||
|
||||
<g:HTMLPanel ui:field="windBotComponent" styleName="{resources.gss.wind_bot_component}">
|
||||
<g:HTMLPanel ui:field="windBotNamePanel" styleName="{resources.gss.name_panel}"></g:HTMLPanel>
|
||||
<header:DashboardWidgetHeaderAndNoDataMessage ui:field="dashboardWidgetHeaderAndNoDataMessage"></header:DashboardWidgetHeaderAndNoDataMessage>
|
||||
<compass:LocationPointerCompass ui:field="locationPointerCompass"></compass:LocationPointerCompass>
|
||||
<div ui:field="totalWindSpeedHeader" class="{resources.gss.live_average_header} {resources.gss.left}"></div>
|
||||
<div ui:field="totalWindDirectionHeader" class="{resources.gss.live_average_header} {resources.gss.right}"></div>
|
||||
<g:HTMLPanel
|
||||
styleName="{resources.gss.live_average_container} {resources.gss.left}">
|
||||
<util:LiveAverageComponent ui:field="trueWindSpeedLiveAverageComponent"></util:LiveAverageComponent>
|
||||
@@ -27,9 +31,5 @@
|
||||
<windchart:VerticalWindChart ui:field="trueWindDirectionVerticalWindChart"
|
||||
styleName="{resources.gss.windchart}"></windchart:VerticalWindChart>
|
||||
</g:HTMLPanel>
|
||||
<g:HTMLPanel styleName="{resources.gss.compass_container}">
|
||||
<compass:LocationPointerCompass
|
||||
ui:field="locationPointerCompass"></compass:LocationPointerCompass>
|
||||
</g:HTMLPanel>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+1
-2
@@ -17,12 +17,11 @@ public interface WindBotWidgetResources extends ClientBundle {
|
||||
|
||||
public interface WindBotComponentGss extends CssResource {
|
||||
String wind_bot_component();
|
||||
String name_panel();
|
||||
String live_average_header();
|
||||
String live_average_container();
|
||||
String left();
|
||||
String right();
|
||||
String windchart_container();
|
||||
String windchart();
|
||||
String compass_container();
|
||||
}
|
||||
}
|
||||
+9
-7
@@ -37,6 +37,9 @@ import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.FocusPanel;
|
||||
import com.google.gwt.user.client.ui.HasWidgets;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.dashboards.gwt.client.theme.Colors;
|
||||
import com.sap.sailing.dashboards.gwt.client.theme.Fonts;
|
||||
import com.sap.sailing.dashboards.gwt.client.theme.Sizes;
|
||||
import com.sap.sailing.dashboards.gwt.client.util.HighchartsUtil;
|
||||
import com.sap.sailing.dashboards.gwt.shared.WindType;
|
||||
import com.sap.sailing.gwt.ui.client.shared.charts.ChartPointRecalculator;
|
||||
@@ -138,9 +141,8 @@ public class VerticalWindChart extends Composite implements HasWidgets {
|
||||
.setType(Type.DATE_TIME)
|
||||
.setReversed(false)
|
||||
.setLabels(
|
||||
new XAxisLabels().setStyle(new Style().setFontFamily("Arial").setFontSize("12")
|
||||
.setColor("grey"))).setLineColor("grey").setTickWidth(0.5).setLineWidth(1)
|
||||
.setTickWidth(1).setTickColor("grey").setOffset(0).setMinPadding(20).setGridLineColor("white")
|
||||
new XAxisLabels().setStyle(new Style().setFontFamily(Fonts.DASHBOARD_FONT_FAMILY).setFontSize(Sizes.DASHBOARD_FONT_SIZE_SMALL).setColor(Colors.LIGHT_TEXT_COLOR))).setLineColor(Colors.LIGHT_TEXT_COLOR).setTickWidth(0.5).setLineWidth(1)
|
||||
.setTickWidth(1).setTickColor(Colors.LIGHT_TEXT_COLOR).setOffset(0).setMinPadding(20).setGridLineColor(Colors.LIGHT_GREY)
|
||||
.setGridLineWidth(0)
|
||||
.setDateTimeLabelFormats(new DateTimeLabelFormats().setMonth("%e. %b").setYear("%b"));
|
||||
}
|
||||
@@ -148,12 +150,12 @@ public class VerticalWindChart extends Composite implements HasWidgets {
|
||||
private void setYAxisOptions() {
|
||||
verticalWindChart
|
||||
.getYAxis()
|
||||
.setLineColor("grey")
|
||||
.setLineColor(Colors.LIGHT_TEXT_COLOR)
|
||||
.setTickWidth(1)
|
||||
.setTickColor("grey")
|
||||
.setTickColor(Colors.LIGHT_TEXT_COLOR)
|
||||
.setAxisTitleText(null)
|
||||
.setGridLineWidth(0)
|
||||
.setAlternateGridColor("#d4d4d4")
|
||||
.setAlternateGridColor(Colors.LIGHT_GREY)
|
||||
.setLineWidth(1)
|
||||
.setEndOnTick(true)
|
||||
.setStartOnTick(true)
|
||||
@@ -163,7 +165,7 @@ public class VerticalWindChart extends Composite implements HasWidgets {
|
||||
.setMaxPadding(0)
|
||||
.setLabels(
|
||||
new YAxisLabels().setStyle(
|
||||
new Style().setFontFamily("Arial").setFontSize("12").setColor("grey")).setFormatter(
|
||||
new Style().setFontFamily(Fonts.DASHBOARD_FONT_FAMILY).setFontSize(Sizes.DASHBOARD_FONT_SIZE_SMALL).setColor(Colors.LIGHT_TEXT_COLOR)).setFormatter(
|
||||
new AxisLabelsFormatter() {
|
||||
@Override
|
||||
public String format(AxisLabelsData axisLabelsData) {
|
||||
|
||||
+22
-11
@@ -1,5 +1,16 @@
|
||||
@require 'theme';
|
||||
|
||||
.location_pointer_compass {
|
||||
position: absolute;
|
||||
width: 70px;
|
||||
height: 85px;
|
||||
background-color: LIGHT_GREY;
|
||||
top: 0px;
|
||||
right: 13px;
|
||||
z-index: 5;
|
||||
/*border-bottom-left-radius: 2em;*/
|
||||
}
|
||||
|
||||
.compass{
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
@@ -8,13 +19,13 @@
|
||||
|
||||
.needle{
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
top: 0%;
|
||||
left: 0%;
|
||||
top: 10px;
|
||||
left: 10px;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.angleToLocationLabel{
|
||||
.angle_to_location {
|
||||
position: absolute;
|
||||
height: 10pt;
|
||||
width: 100%;
|
||||
@@ -23,22 +34,22 @@
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
font-family: DASHBOARD_FONT_FAMILY;
|
||||
font-size: 9pt;
|
||||
font-size: DASHBOARD_FONT_SIZE_VERY_SMALL;
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.distanceToLocationLabel{
|
||||
.distance_to_location {
|
||||
position: absolute;
|
||||
height: 15pt;
|
||||
height: DASHBOARD_FONT_SIZE_SMALL;
|
||||
width: 100%;
|
||||
bottom: -17pt;
|
||||
top: 65px;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
font-family: DASHBOARD_FONT_FAMILY;
|
||||
line-height: 10pt;
|
||||
line-height: DASHBOARD_FONT_SIZE_SMALL;
|
||||
font-weight: bold;
|
||||
font-size: 9pt;
|
||||
font-size: DASHBOARD_FONT_SIZE_SMALL;
|
||||
color: black;
|
||||
z-index: 10;
|
||||
}
|
||||
+45
-41
@@ -1,38 +1,45 @@
|
||||
package com.sap.sailing.dashboards.gwt.client.widgets.windbot.compass;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.DivElement;
|
||||
import com.google.gwt.i18n.client.NumberFormat;
|
||||
import com.google.gwt.user.client.ui.AbsolutePanel;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.HasWidgets;
|
||||
import com.google.gwt.user.client.ui.Image;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.domain.common.Position;
|
||||
|
||||
/**
|
||||
* The class is an UI component that should be used to display the direction and the distance from the users device to a
|
||||
* certain pointed GPS location. The class needs an {@link LocationPointerCompassAngleDistance} instance and registers
|
||||
* as an listener to it. It furthermore notifies its {@link LocationPointerCompassAngleDistance} instance about wind bot
|
||||
* GPS location changes.
|
||||
*
|
||||
* @author Alexander Ries (D062114)
|
||||
*
|
||||
*/
|
||||
public class LocationPointerCompass extends AbsolutePanel implements HasWidgets,
|
||||
LocationPointerCompassAngleDistanceListener {
|
||||
public class LocationPointerCompass extends Composite implements HasWidgets, LocationPointerCompassAngleDistanceListener {
|
||||
|
||||
private double angleOffset;
|
||||
private static LocationPointerCompasssUiBinder uiBinder = GWT.create(LocationPointerCompasssUiBinder.class);
|
||||
|
||||
interface LocationPointerCompasssUiBinder extends UiBinder<Widget, LocationPointerCompass> {
|
||||
}
|
||||
|
||||
private Image compassNeedle;
|
||||
@UiField
|
||||
Image compassNeedle;
|
||||
|
||||
/**
|
||||
* The Label shows the distance the users device is away from the location it points to.
|
||||
* */
|
||||
private Label distanceToPointetLocationLabel;
|
||||
@UiField
|
||||
DivElement distanceToPointetLocation;
|
||||
|
||||
/**
|
||||
* The Label shows the direction in degrees from north the users device is away from the location it points to.
|
||||
* */
|
||||
private Label angleToPointetLocationLabel;
|
||||
@UiField
|
||||
DivElement angleToPointetLocation;
|
||||
|
||||
private double angleOffset;
|
||||
/**
|
||||
* The {@link LocationPointerCompassAngleDistance} notifies the class about updates about angle and distance
|
||||
* changes.
|
||||
@@ -41,33 +48,10 @@ public class LocationPointerCompass extends AbsolutePanel implements HasWidgets,
|
||||
|
||||
public LocationPointerCompass() {
|
||||
LocationPointerCompassRessources.INSTANCE.gss().ensureInjected();
|
||||
this.getElement().addClassName(LocationPointerCompassRessources.INSTANCE.gss().compass());
|
||||
initCompassNeedle();
|
||||
initAngleToPointetLocationLabel();
|
||||
initDistanceToPointedLocationLabel();
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
compassNeedle.setResource(LocationPointerCompassRessources.INSTANCE.compass());
|
||||
locationPointerCompassAngleDistance = new LocationPointerCompassAngleDistance();
|
||||
locationPointerCompassAngleDistance.addListener(this);
|
||||
locationPointerCompassAngleDistance.triggerOrientationRead();
|
||||
}
|
||||
|
||||
private void initCompassNeedle() {
|
||||
compassNeedle = new Image();
|
||||
compassNeedle.setResource(LocationPointerCompassRessources.INSTANCE.compass());
|
||||
compassNeedle.getElement().addClassName(LocationPointerCompassRessources.INSTANCE.gss().needle());
|
||||
LocationPointerCompass.this.add(compassNeedle);
|
||||
}
|
||||
|
||||
private void initAngleToPointetLocationLabel() {
|
||||
angleToPointetLocationLabel = new Label();
|
||||
angleToPointetLocationLabel.getElement().addClassName(LocationPointerCompassRessources.INSTANCE.gss().angleToLocationLabel());
|
||||
this.add(angleToPointetLocationLabel);
|
||||
}
|
||||
|
||||
private void initDistanceToPointedLocationLabel() {
|
||||
distanceToPointetLocationLabel = new Label();
|
||||
distanceToPointetLocationLabel.getElement().addClassName(LocationPointerCompassRessources.INSTANCE.gss().distanceToLocationLabel());
|
||||
distanceToPointetLocationLabel.setText("m");
|
||||
this.add(distanceToPointetLocationLabel);
|
||||
}
|
||||
|
||||
private void updateNeedleAngle(double newDirection) {
|
||||
@@ -79,19 +63,19 @@ public class LocationPointerCompass extends AbsolutePanel implements HasWidgets,
|
||||
compassNeedle.getElement().getStyle()
|
||||
.setProperty("webkitTransform", "rotate(" + winddirectionformatted + "deg)");
|
||||
String winddirectionFormattedForLabel = NumberFormat.getFormat("#0").format((newAngle < 0) ? 360+newAngle : newAngle);
|
||||
angleToPointetLocationLabel.setText(winddirectionFormattedForLabel+"°");
|
||||
angleToPointetLocation.setInnerHTML(winddirectionFormattedForLabel+"°");
|
||||
}
|
||||
}
|
||||
|
||||
private void updateDistanceToPointedLocationLabel(double distance, double angle) {
|
||||
String distanceFormatted = NumberFormat.getFormat("#0").format(distance);
|
||||
distanceToPointetLocationLabel.setText(distanceFormatted + " m");
|
||||
distanceToPointetLocation.setInnerHTML(distanceFormatted + " m");
|
||||
}
|
||||
|
||||
public void windBotPositionChanged(Position positionDTO) {
|
||||
locationPointerCompassAngleDistance.windBotPositionChanged(positionDTO);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void angleChanged(double angle) {
|
||||
updateNeedleAngle(angle);
|
||||
@@ -107,4 +91,24 @@ public class LocationPointerCompass extends AbsolutePanel implements HasWidgets,
|
||||
public void setAngleOffset(double offset) {
|
||||
angleOffset = offset;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void add(Widget w) {
|
||||
throw new UnsupportedOperationException("The method add(Widget w) is not supported.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
throw new UnsupportedOperationException("The method clear() is not supported.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterator<Widget> iterator() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean remove(Widget w) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
|
||||
xmlns:g="urn:import:com.google.gwt.user.client.ui">
|
||||
|
||||
<ui:with field="resources" type="com.sap.sailing.dashboards.gwt.client.widgets.windbot.compass.LocationPointerCompassRessources"/>
|
||||
|
||||
<g:HTMLPanel styleName="{resources.gss.location_pointer_compass}">
|
||||
<g:Image ui:field="compassNeedle" styleName="{resources.gss.needle}"></g:Image>
|
||||
<div ui:field="angleToPointetLocation" class="{resources.gss.angle_to_location}"></div>
|
||||
<div ui:field="distanceToPointetLocation" class="{resources.gss.distance_to_location}"></div>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+3
-2
@@ -18,9 +18,10 @@ public interface LocationPointerCompassRessources extends ClientBundle {
|
||||
|
||||
@Shared
|
||||
public interface LocationPointerCompassGSS extends CssResource {
|
||||
public String location_pointer_compass();
|
||||
public String compass();
|
||||
public String needle();
|
||||
public String angleToLocationLabel();
|
||||
public String distanceToLocationLabel();
|
||||
public String angle_to_location();
|
||||
public String distance_to_location();
|
||||
}
|
||||
}
|
||||
+6
-2
@@ -1275,8 +1275,12 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, c
|
||||
String dashboardNewStartAnalysisAvailable();
|
||||
String dashboardNoStartAnalysesAvailableHeader();
|
||||
String dashboardNoStartAnalysesAvailableMessage();
|
||||
String dashboardStartlineAdvantagesByWind();
|
||||
String dashboardStartlineAdvantageByGeometry();
|
||||
String dashboardNoStartlineAdvantagesByWindAvailableHeader();
|
||||
String dashboardNoStartlineAdvantagesByWindAvailableMessage();
|
||||
String dashboardNoStartlineAdvantagesByGeometryAvailableHeader();
|
||||
String dashboardNoStartlineAdvantagesByGeometryAvailableMessage();
|
||||
String dashboardStartlineAdvantagesByWindHeader();
|
||||
String dashboardStartlineAdvantageByGeometryHeader();
|
||||
String dashboardRankAtFirstMark();
|
||||
String dashboardTeam();
|
||||
String dashboardDistanceToLineInM();
|
||||
|
||||
+6
-2
@@ -1237,8 +1237,12 @@ dashboardStartAnalysesHeader=Start Analyses
|
||||
dashboardNewStartAnalysisAvailable=New start analysis available
|
||||
dashboardNoStartAnalysesAvailableHeader=No Start Analyses available yet.
|
||||
dashboardNoStartAnalysesAvailableMessage=There is a Start Analysis created from each race start. Please stand by till racing has been started.
|
||||
dashboardStartlineAdvantagesByWind=Startline advantage by wind
|
||||
dashboardStartlineAdvantageByGeometry=Startline advantage by geometry
|
||||
dashboardNoStartlineAdvantagesByWindAvailableHeader=No Startline Advantages available yet.
|
||||
dashboardNoStartlineAdvantagesByWindAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
|
||||
dashboardNoStartlineAdvantagesByGeometryAvailableHeader=No Startline Advantage available yet.
|
||||
dashboardNoStartlineAdvantagesByGeometryAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
|
||||
dashboardStartlineAdvantagesByWindHeader=Startline Advantages by Wind
|
||||
dashboardStartlineAdvantageByGeometryHeader=Startline Advantage by Geometry
|
||||
dashboardRankAtFirstMark=Rank at first mark
|
||||
dashboardTeam=Team
|
||||
dashboardDistanceToLineInM=Distance to line in m
|
||||
|
||||
+6
-2
@@ -1228,8 +1228,12 @@ dashboardStartAnalysesHeader=Start Analysen
|
||||
dashboardNewStartAnalysisAvailable=Neue Start Analyse verfügbar.
|
||||
dashboardNoStartAnalysesAvailableHeader=Noch keine Start Analysen verfügbar.
|
||||
dashboardNoStartAnalysesAvailableMessage=Es wird eine Start Analyse für jeden Renn Start erstellt. Bitte warten bis die Rennen starten.
|
||||
dashboardStartlineAdvantagesByWind=Startlininien Vorteil nach Wind
|
||||
dashboardStartlineAdvantageByGeometry=Startlininien Vorteil nach Geometrie
|
||||
dashboardNoStartlineAdvantagesByWindAvailableHeader=No Startline Advantages available yet.
|
||||
dashboardNoStartlineAdvantagesByWindAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
|
||||
dashboardNoStartlineAdvantagesByGeometryAvailableHeader=No Startline Advantage available yet.
|
||||
dashboardNoStartlineAdvantagesByGeometryAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
|
||||
dashboardStartlineAdvantagesByWindHeader=Startline Advantages by Wind
|
||||
dashboardStartlineAdvantageByGeometryHeader=Startline Advantage by Geometry
|
||||
dashboardRankAtFirstMark=Position an erster Bahnmarke
|
||||
dashboardTeam=Team
|
||||
dashboardDistanceToLineInM=Distanz zur Linie in m
|
||||
|
||||
+6
-2
@@ -1171,8 +1171,12 @@ dashboardStartAnalysesHeader=Start Analyses
|
||||
dashboardNewStartAnalysisAvailable=New start analysis available
|
||||
dashboardNoStartAnalysesAvailableHeader=No Start Analyses available yet.
|
||||
dashboardNoStartAnalysesAvailableMessage=There is a Start Analysis created from each race start. Please stand by till racing has been started.
|
||||
dashboardStartlineAdvantagesByWind=Startline advantage by wind
|
||||
dashboardStartlineAdvantageByGeometry=Startline advantage by geometry
|
||||
dashboardNoStartlineAdvantagesByWindAvailableHeader=No Startline Advantages available yet.
|
||||
dashboardNoStartlineAdvantagesByWindAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
|
||||
dashboardNoStartlineAdvantagesByGeometryAvailableHeader=No Startline Advantage available yet.
|
||||
dashboardNoStartlineAdvantagesByGeometryAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
|
||||
dashboardStartlineAdvantagesByWindHeader=Startline Advantages by Wind
|
||||
dashboardStartlineAdvantageByGeometryHeader=Startline Advantage by Geometry
|
||||
dashboardRankAtFirstMark=Rank at first mark
|
||||
dashboardTeam=Team
|
||||
dashboardDistanceToLineInM=Distance to line in m
|
||||
|
||||
+6
-2
@@ -159,7 +159,6 @@ explainReplicationServletPort=Servlet port number that is used to connect to reg
|
||||
numberOfManeuvers=操作
|
||||
successfullyAllowedCompetitorReset=Successfully allowed reload of competitor(s) {0}.
|
||||
pleaseEnterAName=Please enter a name
|
||||
dashboardStartlineAdvantageByGeometry=Startline advantage by geometry
|
||||
confidence=Confidence
|
||||
from=从
|
||||
start=起航
|
||||
@@ -1098,7 +1097,8 @@ windwardDistanceToGoInMetersTooltip=迎/顺风航段时参赛队的位置离开
|
||||
papaDisplayed=Start mode flag - four minutes till start
|
||||
sheetNameTooltip=You can name your polar sheet using the text field.nA name will be generated using the boat classnif no name is provided.
|
||||
competitorsFilter=参赛队过滤
|
||||
dashboardStartlineAdvantagesByWind=Startline advantage by wind
|
||||
dashboardStartlineAdvantagesByWindHeader=Startline Advantages by Wind
|
||||
dashboardStartlineAdvantageByGeometryHeader=Startline Advantage by Geometry
|
||||
dashboardSecondsAbreviation=s
|
||||
pleaseEnterNonEmptyDescription=Please enter a non-empty description
|
||||
polarSheetChart=Polar Sheet
|
||||
@@ -1257,6 +1257,10 @@ courseAreaName=Course area: {0}
|
||||
competitorsCount[one]={0,number} competitor�
|
||||
dashboardWindBotLoadingText=Loading wind bot data ...
|
||||
dashboardWindBotLoadingMessage=Depending on your connection this operation might take some minutes to complete the first time.
|
||||
dashboardNoStartlineAdvantagesByWindAvailableHeader=No Startline Advantages available yet.
|
||||
dashboardNoStartlineAdvantagesByWindAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
|
||||
dashboardNoStartlineAdvantagesByGeometryAvailableHeader=No Startline Advantage available yet.
|
||||
dashboardNoStartlineAdvantagesByGeometryAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee.
|
||||
currentOfTotalLegs=航段 {0,number}/{1,number}
|
||||
clone=Clone
|
||||
changed=Changed
|
||||
|
||||
Reference in new issue
Block a user