mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-05 11:53:53 +00:00
Merge remote-tracking branch 'ExternalGit/master' into master-2
This commit is contained in:
commit
5ad86cb175
53 files changed
+638
-174
No files matched your search
@@ -19,11 +19,12 @@ Like businesses, sailors need the latest information to make strategic decisions
|
||||
* [[Monitoring Apache and RabbitMQ|wiki/monitoring-apache-and-rabbitmq]]
|
||||
* [[JMX Support|wiki/jmx]]
|
||||
* Information for Developers
|
||||
* [[Cook Book|wiki/cook-book]]
|
||||
* [[OnBoarding Information|wiki/onboarding]]
|
||||
* [[Cook Book|wiki/cook-book]]
|
||||
* [[Building and Deploying|wiki/building-and-deploying]]
|
||||
* [[Continuous Integration with Hudson/Jenkins|wiki/ci]]
|
||||
* [[UI Tests with Selenium|wiki/selenium-ui-tests]]
|
||||
* [[Profiling|wiki/profiling]]
|
||||
* [[Typical Development Scenarios|wiki/typical-development-scenarios]]
|
||||
* [[Load Tests|wiki/server-load-tests]]
|
||||
* [[Server Replication|wiki/server-replication]]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
eclipse.preferences.version=1
|
||||
entryPointModules=
|
||||
filesCopiedToWebInfLib=gwt-servlet.jar
|
||||
gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgLiAtbG9jYWxXb3JrZXJzIDMgLXN0cmljdCAtbG9nTGV2ZWwgVFJBQ0UgLWNvbXBpbGVSZXBvcnQgLVhzb3ljRGV0YWlsZWRdXT48L2V4dHJhLWFyZ3M+PHZtLWFyZ3M+PCFbQ0RBVEFbLVhteDIwMjRtIC1EZ3d0LnVzZWFyY2hpdmVzPWZhbHNlXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5SYWNlQm9hcmQ8L2VudHJ5LXBvaW50LW1vZHVsZT48L2d3dC1jb21waWxlLXNldHRpbmdzPg\=\=
|
||||
gwtCompileSettings=PGd3dC1jb21waWxlLXNldHRpbmdzPjxsb2ctbGV2ZWw+SU5GTzwvbG9nLWxldmVsPjxvdXRwdXQtc3R5bGU+T0JGVVNDQVRFRDwvb3V0cHV0LXN0eWxlPjxleHRyYS1hcmdzPjwhW0NEQVRBWy13YXIgLiAtbG9jYWxXb3JrZXJzIDMgLXN0cmljdCAtbG9nTGV2ZWwgVFJBQ0UgLWNvbXBpbGVSZXBvcnQgLVhzb3ljRGV0YWlsZWRdXT48L2V4dHJhLWFyZ3M+PHZtLWFyZ3M+PCFbQ0RBVEFbLVhteDIwMjRtIC1EZ3d0LnVzZWFyY2hpdmVzPWZhbHNlXV0+PC92bS1hcmdzPjxlbnRyeS1wb2ludC1tb2R1bGU+Y29tLnNhcC5zYWlsaW5nLmd3dC51aS5SYWNlQm9hcmQ8L2VudHJ5LXBvaW50LW1vZHVsZT48ZW50cnktcG9pbnQtbW9kdWxlPmNvbS5zYXAuc2FpbGluZy5nd3QudWkuQWRtaW5Db25zb2xlPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLkxlYWRlcmJvYXJkPC9lbnRyeS1wb2ludC1tb2R1bGU+PGVudHJ5LXBvaW50LW1vZHVsZT5jb20uc2FwLnNhaWxpbmcuZ3d0LnVpLlNwZWN0YXRvcjwvZW50cnktcG9pbnQtbW9kdWxlPjwvZ3d0LWNvbXBpbGUtc2V0dGluZ3M+
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
+6
@@ -5,6 +5,7 @@ import java.util.List;
|
||||
import com.google.gwt.event.shared.SimpleEventBus;
|
||||
import com.google.gwt.place.shared.PlaceController;
|
||||
import com.google.web.bindery.event.shared.EventBus;
|
||||
import com.sap.sailing.gwt.home.client.place.error.TabletAndDesktopErrorView;
|
||||
import com.sap.sailing.gwt.home.client.place.event.EventView;
|
||||
import com.sap.sailing.gwt.home.client.place.event.EventWithoutRegattasView;
|
||||
import com.sap.sailing.gwt.home.client.place.event.TabletAndDesktopEventView;
|
||||
@@ -55,6 +56,11 @@ public class SmartphoneApplicationClientFactory extends AbstractApplicationClien
|
||||
return new TabletAndDesktopEventsView(getPlaceNavigator());
|
||||
}
|
||||
|
||||
@Override
|
||||
public TabletAndDesktopErrorView createErrorView(String errorMessage, Throwable errorReason) {
|
||||
return new TabletAndDesktopErrorView(errorMessage, errorReason);
|
||||
}
|
||||
|
||||
@Override
|
||||
public StartView createStartView() {
|
||||
return new TabletAndDesktopStartView(getPlaceNavigator());
|
||||
|
||||
+6
@@ -5,6 +5,7 @@ import java.util.List;
|
||||
import com.google.gwt.event.shared.SimpleEventBus;
|
||||
import com.google.gwt.place.shared.PlaceController;
|
||||
import com.google.web.bindery.event.shared.EventBus;
|
||||
import com.sap.sailing.gwt.home.client.place.error.TabletAndDesktopErrorView;
|
||||
import com.sap.sailing.gwt.home.client.place.event.EventView;
|
||||
import com.sap.sailing.gwt.home.client.place.event.EventWithoutRegattasView;
|
||||
import com.sap.sailing.gwt.home.client.place.event.TabletAndDesktopEventView;
|
||||
@@ -45,6 +46,11 @@ public class TabletAndDesktopApplicationClientFactory extends AbstractApplicatio
|
||||
return new TabletAndDesktopEventView(getSailingService(), event, raceGroups, leaderboardName, timerForClientServerOffset);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TabletAndDesktopErrorView createErrorView(String errorMessage, Throwable errorReason) {
|
||||
return new TabletAndDesktopErrorView(errorMessage, errorReason);
|
||||
}
|
||||
|
||||
@Override
|
||||
public EventWithoutRegattasView createEventWithoutRegattasView(EventDTO event) {
|
||||
return new TabletAndDesktopEventWithoutRegattasView(getSailingService(), event);
|
||||
|
||||
+1
-7
@@ -1,8 +1,6 @@
|
||||
package com.sap.sailing.gwt.home.client.app;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.Element;
|
||||
import com.google.gwt.dom.client.Style.Visibility;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
@@ -31,9 +29,6 @@ public class TabletAndDesktopApplicationView extends Composite implements Applic
|
||||
@UiField
|
||||
SimplePanel mainContentPanel;
|
||||
|
||||
@UiField
|
||||
Element loadingMessage;
|
||||
|
||||
public TabletAndDesktopApplicationView(PlaceNavigator navigator) {
|
||||
headerPanel = new Header(navigator);
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
@@ -45,7 +40,6 @@ public class TabletAndDesktopApplicationView extends Composite implements Applic
|
||||
}
|
||||
|
||||
@Override
|
||||
public void showLoading(boolean visibile) {
|
||||
loadingMessage.getStyle().setVisibility(visibile ? Visibility.VISIBLE : Visibility.HIDDEN);
|
||||
public void showLoading(boolean visible) {
|
||||
}
|
||||
}
|
||||
-5
@@ -2,14 +2,9 @@
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
|
||||
xmlns:g="urn:import:com.google.gwt.user.client.ui"
|
||||
xmlns:s="urn:import:com.sap.sailing.gwt.home.client.shared">
|
||||
|
||||
<g:HTMLPanel>
|
||||
<div ui:field="loadingMessage" style="display: none; position:absolute; top:0; left:0; background-color:yellow;">Loading...</div>
|
||||
|
||||
<s:header.Header ui:field="headerPanel" />
|
||||
|
||||
<g:SimplePanel ui:field="mainContentPanel" />
|
||||
|
||||
<s:footer.Footer ui:field="footerPanel" />
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+5
-1
@@ -13,7 +13,6 @@ public interface TextMessages extends Messages {
|
||||
String contact();
|
||||
String sponsoring();
|
||||
String solutions();
|
||||
String search();
|
||||
String german();
|
||||
String english();
|
||||
String fullEventSchedule();
|
||||
@@ -23,6 +22,11 @@ public interface TextMessages extends Messages {
|
||||
String moreInfo();
|
||||
String viewAnalysis();
|
||||
String overallLeaderboard();
|
||||
String pleaseEnterASearchTerm();
|
||||
String pleaseTryAgain();
|
||||
String reloadPage();
|
||||
String errorMessageLoadingData();
|
||||
String raceNotScheduled();
|
||||
|
||||
String countdownDays();
|
||||
String countdownHours();
|
||||
|
||||
+6
-2
@@ -5,7 +5,6 @@ aboutUs=About us
|
||||
contact=Contact
|
||||
sponsoring=Sponsoring
|
||||
solutions=Solutions
|
||||
search=Search
|
||||
german=Deutsch
|
||||
english=English
|
||||
fullEventSchedule=Full event schedule
|
||||
@@ -15,6 +14,11 @@ races=Races
|
||||
moreInfo=More info
|
||||
viewAnalysis=View analysis
|
||||
overallLeaderboard=Overall leaderboard
|
||||
pleaseEnterASearchTerm=Please enter a search term.
|
||||
pleaseTryAgain=Please try again...
|
||||
reloadPage=Reload page
|
||||
errorMessageLoadingData=An error occured while loading the data for this page.
|
||||
raceNotScheduled=Not scheduled.
|
||||
|
||||
countdownDays=Days
|
||||
countdownHours=Hrs
|
||||
@@ -101,7 +105,7 @@ headerEvents=Events
|
||||
headerHome=Home
|
||||
headerLogo=SAP Sailing Analytics
|
||||
headerSearch=Search
|
||||
headerSearchPlaceholder=Search
|
||||
headerSearchPlaceholder=Search SAPSailing.com
|
||||
headerSolutions=Solutions
|
||||
headerSponsoring=Sponsoring
|
||||
latestRaceResultsHeadline=Latest Official Race Results
|
||||
|
||||
+6
-2
@@ -5,7 +5,6 @@ aboutUs=Über uns
|
||||
contact=Kontakt
|
||||
sponsoring=Sponsoring
|
||||
solutions=Lösungen
|
||||
search=Suche
|
||||
german=Deutsch
|
||||
english=English
|
||||
fullEventSchedule=Gesamter Veranstaltungsplan
|
||||
@@ -15,6 +14,11 @@ races=Rennen
|
||||
moreInfo=Weitere Informationen
|
||||
viewAnalysis=Analyzen ansehen
|
||||
overallLeaderboard=Gesamtergebnis
|
||||
pleaseEnterASearchTerm=Bitte gebe einen Suchbegriff ein.
|
||||
pleaseTryAgain=Bitte versuchen sie es erneut...
|
||||
reloadPage=Seite neu laden
|
||||
errorMessageLoadingData=Beim Laden der Daten für diese Seite ist ein Fehler aufgetreten.
|
||||
raceNotScheduled=Keine Startzeit bekannt
|
||||
|
||||
countdownDays=Tage
|
||||
countdownHours=Std.
|
||||
@@ -100,7 +104,7 @@ footerFeedback=Feedback
|
||||
headerEvents=Veranstaltungen
|
||||
headerHome=Startseite
|
||||
headerLogo=SAP Sailing Analytics
|
||||
headerSearch=Suche
|
||||
headerSearch=Suche in SAPSailing.com
|
||||
headerSearchPlaceholder=Suche
|
||||
headerSolutions=Lösungen
|
||||
headerSponsoring=Sponsoren
|
||||
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
package com.sap.sailing.gwt.home.client.place.error;
|
||||
|
||||
import com.google.gwt.activity.shared.AbstractActivity;
|
||||
import com.google.gwt.event.shared.EventBus;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
|
||||
public class ErrorActivity extends AbstractActivity {
|
||||
|
||||
public ErrorActivity(ErrorPlace place, ErrorClientFactory clientFactory) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(AcceptsOneWidget panel, EventBus eventBus) {
|
||||
// TODO: the error place should get the error message from the place
|
||||
panel.setWidget(new TabletAndDesktopErrorView(null, null));
|
||||
}
|
||||
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
package com.sap.sailing.gwt.home.client.place.error;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.sap.sse.gwt.client.mvp.AbstractActivityProxy;
|
||||
|
||||
public class ErrorActivityProxy extends AbstractActivityProxy {
|
||||
|
||||
private final ErrorClientFactory clientFactory;
|
||||
private final ErrorPlace place;
|
||||
|
||||
public ErrorActivityProxy(ErrorPlace place, ErrorClientFactory clientFactory) {
|
||||
this.place = place;
|
||||
this.clientFactory = clientFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void startAsync() {
|
||||
GWT.runAsync(new AbstractRunAsyncCallback() {
|
||||
@Override
|
||||
public void onSuccess() {
|
||||
super.onSuccess(new ErrorActivity(place, clientFactory));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
package com.sap.sailing.gwt.home.client.place.error;
|
||||
|
||||
import com.sap.sailing.gwt.ui.client.SailingClientFactory;
|
||||
|
||||
public interface ErrorClientFactory extends SailingClientFactory {
|
||||
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
package com.sap.sailing.gwt.home.client.place.error;
|
||||
|
||||
import com.google.gwt.place.shared.PlaceTokenizer;
|
||||
import com.sap.sailing.gwt.home.client.AbstractBasePlace;
|
||||
|
||||
public class ErrorPlace extends AbstractBasePlace {
|
||||
|
||||
public static class Tokenizer implements PlaceTokenizer<ErrorPlace> {
|
||||
@Override
|
||||
public String getToken(ErrorPlace place) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ErrorPlace getPlace(String token) {
|
||||
return new ErrorPlace();
|
||||
}
|
||||
}
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
package com.sap.sailing.gwt.home.client.place.error;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
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.Widget;
|
||||
import com.sap.sailing.gwt.home.client.shared.error.ErrorMessage;
|
||||
import com.sap.sse.gwt.client.mvp.ErrorView;
|
||||
|
||||
public class TabletAndDesktopErrorView extends Composite implements ErrorView {
|
||||
private static ErrorViewUiBinder uiBinder = GWT.create(ErrorViewUiBinder.class);
|
||||
|
||||
interface ErrorViewUiBinder extends UiBinder<Widget, TabletAndDesktopErrorView> {
|
||||
}
|
||||
|
||||
@UiField(provided=true) ErrorMessage errorMessage;
|
||||
|
||||
public TabletAndDesktopErrorView(String errorMessageText, Throwable errorReason) {
|
||||
errorMessage = new ErrorMessage(errorMessageText, errorReason);
|
||||
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
|
||||
xmlns:s="urn:import:com.sap.sailing.gwt.home.client.shared"
|
||||
xmlns:g="urn:import:com.google.gwt.user.client.ui">
|
||||
<ui:with field="res" type="com.sap.sailing.gwt.home.client.HomeResources" />
|
||||
<g:HTMLPanel>
|
||||
<s:error.ErrorMessage ui:field='errorMessage'/>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
package com.sap.sailing.gwt.home.client.place.event;
|
||||
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.sap.sailing.gwt.ui.shared.EventDTO;
|
||||
|
||||
/**
|
||||
* A base class for a content composite related to an sailing event
|
||||
* @author Frank
|
||||
*
|
||||
*/
|
||||
public class AbstractEventComposite extends Composite {
|
||||
private final EventDTO event;
|
||||
private final EventPageNavigator pageNavigator;
|
||||
|
||||
public AbstractEventComposite(EventDTO event, EventPageNavigator pageNavigator) {
|
||||
this.event = event;
|
||||
this.pageNavigator = pageNavigator;
|
||||
}
|
||||
|
||||
public EventDTO getEvent() {
|
||||
return event;
|
||||
}
|
||||
|
||||
public EventPageNavigator getPageNavigator() {
|
||||
return pageNavigator;
|
||||
}
|
||||
}
|
||||
+80
-57
@@ -9,12 +9,14 @@ import com.google.gwt.event.shared.EventBus;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.sap.sailing.gwt.home.client.shared.placeholder.Placeholder;
|
||||
import com.sap.sailing.gwt.ui.regattaoverview.RegattaRaceStatesSettings;
|
||||
import com.sap.sailing.gwt.ui.shared.EventDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceGroupDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RegattaOverviewEntryDTO;
|
||||
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
|
||||
import com.sap.sse.gwt.client.mvp.ErrorView;
|
||||
import com.sap.sse.gwt.client.player.TimeListener;
|
||||
import com.sap.sse.gwt.client.player.Timer;
|
||||
import com.sap.sse.gwt.client.player.Timer.PlayModes;
|
||||
@@ -30,66 +32,86 @@ public class EventActivity extends AbstractActivity {
|
||||
private final RegattaRaceStatesSettings raceStatesSettings;
|
||||
|
||||
private EventView view;
|
||||
private EventDTO event;
|
||||
|
||||
public EventActivity(EventPlace place, EventClientFactory clientFactory) {
|
||||
this.clientFactory = clientFactory;
|
||||
this.eventPlace = place;
|
||||
|
||||
this.view = null;
|
||||
this.event = null;
|
||||
|
||||
timerForClientServerOffset = new Timer(PlayModes.Replay);
|
||||
serverUpdateTimer = new Timer(PlayModes.Live, serverUpdateRateInMs);
|
||||
|
||||
raceStatesSettings = new RegattaRaceStatesSettings();
|
||||
serverUpdateTimer.addTimeListener(new TimeListener() {
|
||||
|
||||
@Override
|
||||
public void timeChanged(Date newTime, Date oldTime) {
|
||||
// loadAndUpdateEventRaceStatesLog();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(final AcceptsOneWidget panel, final EventBus eventBus) {
|
||||
panel.setWidget(new Placeholder());
|
||||
|
||||
final long clientTimeWhenRequestWasSent = System.currentTimeMillis();
|
||||
UUID eventUUID = UUID.fromString(eventPlace.getEventUuidAsString());
|
||||
clientFactory.getSailingService().getEventById(eventUUID, true, new AsyncCallback<EventDTO>() {
|
||||
@Override
|
||||
public void onSuccess(final EventDTO event) {
|
||||
if(event.getLeaderboardGroups().size() > 0) {
|
||||
clientFactory.getSailingService().getRegattaStructureOfEvent(event.id, new AsyncCallback<List<RaceGroupDTO>>() {
|
||||
@Override
|
||||
public void onSuccess(List<RaceGroupDTO> raceGroups) {
|
||||
if(raceGroups.size() > 0) {
|
||||
for(LeaderboardGroupDTO leaderboardGroupDTO: event.getLeaderboardGroups()) {
|
||||
final long clientTimeWhenResponseWasReceived = System.currentTimeMillis();
|
||||
if (leaderboardGroupDTO.getAverageDelayToLiveInMillis() != null) {
|
||||
timerForClientServerOffset.setLivePlayDelayInMillis(leaderboardGroupDTO.getAverageDelayToLiveInMillis());
|
||||
}
|
||||
timerForClientServerOffset.adjustClientServerOffset(clientTimeWhenRequestWasSent, leaderboardGroupDTO.getCurrentServerTime(), clientTimeWhenResponseWasReceived);
|
||||
}
|
||||
createEventView(event, raceGroups, panel);
|
||||
} else {
|
||||
createEventWithoutRegattasView(event, panel);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
Window.alert("Shit happens at getRegattaStructureForEvent()");
|
||||
}
|
||||
});
|
||||
} else {
|
||||
createEventWithoutRegattasView(event, panel);
|
||||
}
|
||||
loadRegattaStructure(panel, clientTimeWhenRequestWasSent, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
Window.alert("Shit happens at getRegattaStructureForEvent()");
|
||||
createErrorView("Error while loading the event with service getEventById()", caught, panel);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void loadRegattaStructure(final AcceptsOneWidget panel, final long clientTimeWhenRequestWasSent, final EventDTO event) {
|
||||
this.event = event;
|
||||
if(event.getLeaderboardGroups().size() > 0) {
|
||||
clientFactory.getSailingService().getRegattaStructureOfEvent(event.id, new AsyncCallback<List<RaceGroupDTO>>() {
|
||||
@Override
|
||||
public void onSuccess(List<RaceGroupDTO> raceGroups) {
|
||||
if(raceGroups.size() > 0) {
|
||||
for(LeaderboardGroupDTO leaderboardGroupDTO: event.getLeaderboardGroups()) {
|
||||
final long clientTimeWhenResponseWasReceived = System.currentTimeMillis();
|
||||
if (leaderboardGroupDTO.getAverageDelayToLiveInMillis() != null) {
|
||||
timerForClientServerOffset.setLivePlayDelayInMillis(leaderboardGroupDTO.getAverageDelayToLiveInMillis());
|
||||
}
|
||||
timerForClientServerOffset.adjustClientServerOffset(clientTimeWhenRequestWasSent, leaderboardGroupDTO.getCurrentServerTime(), clientTimeWhenResponseWasReceived);
|
||||
}
|
||||
createEventView(event, raceGroups, panel);
|
||||
|
||||
if(event.isRunning()) {
|
||||
// create update time for race states only for running events
|
||||
serverUpdateTimer.addTimeListener(new TimeListener() {
|
||||
@Override
|
||||
public void timeChanged(Date newTime, Date oldTime) {
|
||||
loadAndUpdateEventRaceStatesLog();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
} else {
|
||||
createEventWithoutRegattasView(event, panel);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
createErrorView("Error while loading the regatta structure with service getRegattaStructureOfEvent()", caught, panel);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
createEventWithoutRegattasView(event, panel);
|
||||
}
|
||||
}
|
||||
|
||||
private void createErrorView(String errorMessage, Throwable errorReason, AcceptsOneWidget panel) {
|
||||
ErrorView view = clientFactory.createErrorView(errorMessage, errorReason);
|
||||
panel.setWidget(view.asWidget());
|
||||
}
|
||||
|
||||
private void createEventView(EventDTO event, List<RaceGroupDTO> raceGroups, AcceptsOneWidget panel) {
|
||||
view = clientFactory.createEventView(event, raceGroups, eventPlace.getLeaderboardIdAsNameString(), timerForClientServerOffset);
|
||||
panel.setWidget(view.asWidget());
|
||||
@@ -102,31 +124,32 @@ public class EventActivity extends AbstractActivity {
|
||||
}
|
||||
|
||||
protected void loadAndUpdateEventRaceStatesLog() {
|
||||
final long clientTimeWhenRequestWasSent = System.currentTimeMillis();
|
||||
UUID eventUUID = UUID.fromString(eventPlace.getEventUuidAsString());
|
||||
if(view != null && event != null) {
|
||||
final long clientTimeWhenRequestWasSent = System.currentTimeMillis();
|
||||
|
||||
clientFactory.getSailingService().getRaceStateEntriesForRaceGroup(eventUUID, raceStatesSettings.getVisibleCourseAreas(),
|
||||
raceStatesSettings.getVisibleRegattas(), raceStatesSettings.isShowOnlyCurrentlyRunningRaces(), raceStatesSettings.isShowOnlyRacesOfSameDay(),
|
||||
new MarkedAsyncCallback<List<RegattaOverviewEntryDTO>>(
|
||||
new AsyncCallback<List<RegattaOverviewEntryDTO>>() {
|
||||
@Override
|
||||
public void onFailure(Throwable cause) {
|
||||
Window.alert("Shit happens at getRaceStateEntriesForRaceGroup()");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(List<RegattaOverviewEntryDTO> result) {
|
||||
final long clientTimeWhenResponseWasReceived = System.currentTimeMillis();
|
||||
Date serverTimeDuringRequest = null;
|
||||
for (RegattaOverviewEntryDTO entryDTO : result) {
|
||||
if (entryDTO.currentServerTime != null) {
|
||||
serverTimeDuringRequest = entryDTO.currentServerTime;
|
||||
}
|
||||
clientFactory.getSailingService().getRaceStateEntriesForRaceGroup(event.id, raceStatesSettings.getVisibleCourseAreas(),
|
||||
raceStatesSettings.getVisibleRegattas(), raceStatesSettings.isShowOnlyCurrentlyRunningRaces(), raceStatesSettings.isShowOnlyRacesOfSameDay(),
|
||||
new MarkedAsyncCallback<List<RegattaOverviewEntryDTO>>(
|
||||
new AsyncCallback<List<RegattaOverviewEntryDTO>>() {
|
||||
@Override
|
||||
public void onFailure(Throwable cause) {
|
||||
Window.setStatus("Error while loading the race states with service getRaceStateEntriesForRaceGroup()");
|
||||
}
|
||||
view.updateEventRaceStates(result);
|
||||
timerForClientServerOffset.adjustClientServerOffset(clientTimeWhenRequestWasSent, serverTimeDuringRequest, clientTimeWhenResponseWasReceived);
|
||||
}
|
||||
}));
|
||||
|
||||
@Override
|
||||
public void onSuccess(List<RegattaOverviewEntryDTO> result) {
|
||||
final long clientTimeWhenResponseWasReceived = System.currentTimeMillis();
|
||||
Date serverTimeDuringRequest = null;
|
||||
for (RegattaOverviewEntryDTO entryDTO : result) {
|
||||
if (entryDTO.currentServerTime != null) {
|
||||
serverTimeDuringRequest = entryDTO.currentServerTime;
|
||||
}
|
||||
}
|
||||
view.updateEventRaceStates(result);
|
||||
timerForClientServerOffset.adjustClientServerOffset(clientTimeWhenRequestWasSent, serverTimeDuringRequest, clientTimeWhenResponseWasReceived);
|
||||
}
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+3
-3
@@ -58,9 +58,9 @@ public class TabletAndDesktopEventView extends Composite implements EventView, E
|
||||
eventHeader = new EventHeader(event, this);
|
||||
eventRegattaList = new EventRegattaList(event, regattaStructure, timerForClientServerOffset, this);
|
||||
eventRegattaRaces = new EventRegattaRaces(event, timerForClientServerOffset, this);
|
||||
eventOverview = new EventOverview(event);
|
||||
eventSchedule = new EventSchedule(event);
|
||||
eventMedia = new EventMedia(event);
|
||||
eventOverview = new EventOverview(event, this);
|
||||
eventSchedule = new EventSchedule(event, this);
|
||||
eventMedia = new EventMedia(event, this);
|
||||
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
|
||||
|
||||
+8
-13
@@ -11,9 +11,9 @@ import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.uibinder.client.UiHandler;
|
||||
import com.google.gwt.user.client.ui.Anchor;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.client.i18n.TextMessages;
|
||||
import com.sap.sailing.gwt.home.client.place.event.AbstractEventComposite;
|
||||
import com.sap.sailing.gwt.home.client.place.event.EventPageNavigator;
|
||||
import com.sap.sailing.gwt.home.client.shared.EventDatesFormatterUtil;
|
||||
import com.sap.sailing.gwt.ui.shared.CourseAreaDTO;
|
||||
@@ -21,14 +21,12 @@ import com.sap.sailing.gwt.ui.shared.EventDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
|
||||
|
||||
public class EventHeader extends Composite {
|
||||
public class EventHeader extends AbstractEventComposite {
|
||||
private static EventHeaderUiBinder uiBinder = GWT.create(EventHeaderUiBinder.class);
|
||||
|
||||
interface EventHeaderUiBinder extends UiBinder<Widget, EventHeader> {
|
||||
}
|
||||
|
||||
private final EventDTO event;
|
||||
|
||||
// @UiField Anchor overviewLink;
|
||||
@UiField Anchor regattasLink;
|
||||
// @UiField Anchor scheduleLink;
|
||||
@@ -69,12 +67,9 @@ public class EventHeader extends Composite {
|
||||
// private final List<Anchor> links1;
|
||||
// private final List<Anchor> links2;
|
||||
// private final List<Anchor> links3;
|
||||
|
||||
private final EventPageNavigator pageNavigator;
|
||||
|
||||
public EventHeader(EventDTO event, EventPageNavigator pageNavigator) {
|
||||
this.event = event;
|
||||
this.pageNavigator = pageNavigator;
|
||||
super(event, pageNavigator);
|
||||
|
||||
EventHeaderResources.INSTANCE.css().ensureInjected();
|
||||
StyleInjector.injectAtEnd("@media (min-width: 50em) { "+EventHeaderResources.INSTANCE.largeCss().getText()+"}");
|
||||
@@ -102,8 +97,7 @@ public class EventHeader extends Composite {
|
||||
}
|
||||
|
||||
public EventHeader(EventDTO event) {
|
||||
this.event = event;
|
||||
this.pageNavigator = null;
|
||||
super(event, null);
|
||||
|
||||
EventHeaderResources.INSTANCE.css().ensureInjected();
|
||||
StyleInjector.injectAtEnd("@media (min-width: 50em) { "+EventHeaderResources.INSTANCE.largeCss().getText()+"}");
|
||||
@@ -135,6 +129,7 @@ public class EventHeader extends Composite {
|
||||
}
|
||||
|
||||
private void updateUI() {
|
||||
EventDTO event = getEvent();
|
||||
boolean isSeries = event.isFakeSeries();
|
||||
|
||||
String eventName = event.getName();
|
||||
@@ -226,8 +221,8 @@ public class EventHeader extends Composite {
|
||||
|
||||
@UiHandler("seriesLeaderboardAnchor")
|
||||
void seriesLeaderboardClicked(ClickEvent clickevent) {
|
||||
if(event.isFakeSeries()) {
|
||||
pageNavigator.openOverallLeaderboardViewer(event.getLeaderboardGroups().get(0));
|
||||
if(getEvent().isFakeSeries()) {
|
||||
getPageNavigator().openOverallLeaderboardViewer(getEvent().getLeaderboardGroups().get(0));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,7 +232,7 @@ public class EventHeader extends Composite {
|
||||
// }
|
||||
//
|
||||
private void showRegattas() {
|
||||
pageNavigator.goToRegattas();
|
||||
getPageNavigator().goToRegattas();
|
||||
// setActiveLink(links1, regattasLink);
|
||||
// setActiveLink(links2, regattasLink2);
|
||||
// setActiveLink(links3, regattasLink3);
|
||||
|
||||
+5
-7
@@ -2,21 +2,19 @@ package com.sap.sailing.gwt.home.client.place.event.media;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.client.place.event.AbstractEventComposite;
|
||||
import com.sap.sailing.gwt.home.client.place.event.EventPageNavigator;
|
||||
import com.sap.sailing.gwt.ui.shared.EventDTO;
|
||||
|
||||
public class EventMedia extends Composite {
|
||||
public class EventMedia extends AbstractEventComposite {
|
||||
private static EventMediaUiBinder uiBinder = GWT.create(EventMediaUiBinder.class);
|
||||
|
||||
interface EventMediaUiBinder extends UiBinder<Widget, EventMedia> {
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private final EventDTO event;
|
||||
|
||||
public EventMedia(EventDTO event) {
|
||||
this.event = event;
|
||||
public EventMedia(EventDTO event, EventPageNavigator placeNavigator) {
|
||||
super(event, placeNavigator);
|
||||
|
||||
EventMediaResources.INSTANCE.css().ensureInjected();
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
|
||||
+5
-7
@@ -2,21 +2,19 @@ package com.sap.sailing.gwt.home.client.place.event.overview;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.client.place.event.AbstractEventComposite;
|
||||
import com.sap.sailing.gwt.home.client.place.event.EventPageNavigator;
|
||||
import com.sap.sailing.gwt.ui.shared.EventDTO;
|
||||
|
||||
public class EventOverview extends Composite {
|
||||
public class EventOverview extends AbstractEventComposite {
|
||||
private static EventOverviewUiBinder uiBinder = GWT.create(EventOverviewUiBinder.class);
|
||||
|
||||
interface EventOverviewUiBinder extends UiBinder<Widget, EventOverview> {
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private final EventDTO event;
|
||||
|
||||
public EventOverview(EventDTO event) {
|
||||
this.event = event;
|
||||
public EventOverview(EventDTO event, EventPageNavigator pageNavigator) {
|
||||
super(event, pageNavigator);
|
||||
|
||||
EventOverviewResources.INSTANCE.css().ensureInjected();
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
|
||||
+5
-6
@@ -16,9 +16,9 @@ import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.DOM;
|
||||
import com.google.gwt.user.client.Event;
|
||||
import com.google.gwt.user.client.EventListener;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.client.HomeResources;
|
||||
import com.sap.sailing.gwt.home.client.place.event.AbstractEventComposite;
|
||||
import com.sap.sailing.gwt.home.client.place.event.EventPageNavigator;
|
||||
import com.sap.sailing.gwt.home.client.place.event.regatta.Regatta;
|
||||
import com.sap.sailing.gwt.home.client.shared.LongNamesUtil;
|
||||
@@ -29,7 +29,7 @@ import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
|
||||
import com.sap.sse.common.Util.Triple;
|
||||
import com.sap.sse.gwt.client.player.Timer;
|
||||
|
||||
public class EventRegattaList extends Composite {
|
||||
public class EventRegattaList extends AbstractEventComposite {
|
||||
private static EventRegattaHeaderUiBinder uiBinder = GWT.create(EventRegattaHeaderUiBinder.class);
|
||||
|
||||
interface EventRegattaHeaderUiBinder extends UiBinder<Widget, EventRegattaList> {
|
||||
@@ -44,12 +44,11 @@ public class EventRegattaList extends Composite {
|
||||
@UiField AnchorElement filterNoLeaderboardGroupsAnchor;
|
||||
@UiField SpanElement allBoatClassesSelected;
|
||||
|
||||
private final EventDTO event;
|
||||
private final Map<String, List<Regatta>> regattaElementsByLeaderboardGroup;
|
||||
|
||||
public EventRegattaList(EventDTO event, Map<String, Triple<RaceGroupDTO, StrippedLeaderboardDTO, LeaderboardGroupDTO>> regattaStructure,
|
||||
Timer timerForClientServerOffset, EventPageNavigator pageNavigator) {
|
||||
this.event = event;
|
||||
super(event, pageNavigator);
|
||||
|
||||
EventRegattaListResources.INSTANCE.css().ensureInjected();
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
@@ -117,7 +116,7 @@ public class EventRegattaList extends Composite {
|
||||
if (leaderboardGroup != null) {
|
||||
allBoatClassesSelected.getStyle().setDisplay(Display.NONE);
|
||||
// hide all regattas of the not selected leaderboardgroup
|
||||
for (LeaderboardGroupDTO lg : event.getLeaderboardGroups()) {
|
||||
for (LeaderboardGroupDTO lg : getEvent().getLeaderboardGroups()) {
|
||||
boolean isVisible = leaderboardGroup.getName().equals(lg.getName());
|
||||
List<Regatta> regattaElements = regattaElementsByLeaderboardGroup.get(lg.getName());
|
||||
for (Regatta regatta : regattaElements) {
|
||||
@@ -127,7 +126,7 @@ public class EventRegattaList extends Composite {
|
||||
} else {
|
||||
// make all regattas visible
|
||||
allBoatClassesSelected.getStyle().setDisplay(Display.INLINE_BLOCK);
|
||||
for (LeaderboardGroupDTO lg : event.getLeaderboardGroups()) {
|
||||
for (LeaderboardGroupDTO lg : getEvent().getLeaderboardGroups()) {
|
||||
List<Regatta> regattaElements = regattaElementsByLeaderboardGroup.get(lg.getName());
|
||||
for (Regatta regatta : regattaElements) {
|
||||
regatta.setVisible(true);
|
||||
|
||||
+5
-6
@@ -7,9 +7,9 @@ import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.StyleInjector;
|
||||
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.Widget;
|
||||
import com.sap.sailing.gwt.home.client.place.event.AbstractEventComposite;
|
||||
import com.sap.sailing.gwt.home.client.place.event.EventPageNavigator;
|
||||
import com.sap.sailing.gwt.home.client.place.event.regatta.Regatta;
|
||||
import com.sap.sailing.gwt.ui.shared.EventDTO;
|
||||
@@ -19,7 +19,7 @@ import com.sap.sailing.gwt.ui.shared.RaceGroupSeriesDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
|
||||
import com.sap.sse.gwt.client.player.Timer;
|
||||
|
||||
public class EventRegattaRaces extends Composite {
|
||||
public class EventRegattaRaces extends AbstractEventComposite {
|
||||
private static EventRegattaRacesUiBinder uiBinder = GWT.create(EventRegattaRacesUiBinder.class);
|
||||
|
||||
interface EventRegattaRacesUiBinder extends UiBinder<Widget, EventRegattaRaces> {
|
||||
@@ -31,12 +31,11 @@ public class EventRegattaRaces extends Composite {
|
||||
@UiField HTMLPanel rootPanel;
|
||||
|
||||
private final Timer timerForClientServerOffset;
|
||||
private final EventPageNavigator pageNavigator;
|
||||
private final List<EventRegattaRacesPhase> phaseElements;
|
||||
|
||||
public EventRegattaRaces(EventDTO event, Timer timerForClientServerOffset, EventPageNavigator pageNavigator) {
|
||||
super(event, pageNavigator);
|
||||
this.timerForClientServerOffset = timerForClientServerOffset;
|
||||
this.pageNavigator = pageNavigator;
|
||||
|
||||
phaseElements = new ArrayList<EventRegattaRacesPhase>();
|
||||
|
||||
@@ -57,13 +56,13 @@ public class EventRegattaRaces extends Composite {
|
||||
int regattaPhases = raceGroup.getSeries().size();
|
||||
if(regattaPhases > 1) {
|
||||
for(RaceGroupSeriesDTO series: raceGroup.getSeries()) {
|
||||
EventRegattaRacesPhase regattaPhase = new EventRegattaRacesPhase(leaderboard, series, timerForClientServerOffset, pageNavigator);
|
||||
EventRegattaRacesPhase regattaPhase = new EventRegattaRacesPhase(leaderboard, series, timerForClientServerOffset, getPageNavigator());
|
||||
regattaPhasesPanel.getElement().appendChild(regattaPhase.getElement());
|
||||
phaseElements.add(regattaPhase);
|
||||
}
|
||||
} else {
|
||||
RaceGroupSeriesDTO raceGroupSeriesDTO = raceGroup.getSeries().get(0);
|
||||
EventRegattaRacesPhase regattaPhase = new EventRegattaRacesPhase(leaderboard, raceGroupSeriesDTO, timerForClientServerOffset, pageNavigator);
|
||||
EventRegattaRacesPhase regattaPhase = new EventRegattaRacesPhase(leaderboard, raceGroupSeriesDTO, timerForClientServerOffset, getPageNavigator());
|
||||
regattaPhasesPanel.getElement().appendChild(regattaPhase.getElement());
|
||||
phaseElements.add(regattaPhase);
|
||||
}
|
||||
|
||||
+34
-15
@@ -25,7 +25,7 @@ import com.sap.sse.gwt.client.player.Timer;
|
||||
public class EventRegattaRacesRace extends UIObject {
|
||||
private static EventRegattaRacesRaceUiBinder uiBinder = GWT.create(EventRegattaRacesRaceUiBinder.class);
|
||||
|
||||
private enum SimpleRaceStates { NOT_TRACKED, TRACKED_AND_NOT_LIVE, TRACKED_AND_LIVE };
|
||||
private enum SimpleRaceStates { NOT_TRACKED, TRACKED_AND_FINISHED, TRACKED_AND_RUNNING, TRACKED_BUT_NOT_SCHEDULED };
|
||||
|
||||
interface EventRegattaRacesRaceUiBinder extends UiBinder<DivElement, EventRegattaRacesRace> {
|
||||
}
|
||||
@@ -38,6 +38,7 @@ public class EventRegattaRacesRace extends UIObject {
|
||||
@UiField SpanElement averageRaceWind;
|
||||
|
||||
@UiField DivElement raceNotTrackedDiv;
|
||||
@UiField DivElement raceNotScheduledDiv;
|
||||
@UiField DivElement watchRaceDiv;
|
||||
@UiField DivElement analyzeRaceDiv;
|
||||
@UiField AnchorElement watchRaceLink;
|
||||
@@ -83,8 +84,8 @@ public class EventRegattaRacesRace extends UIObject {
|
||||
EventRegattaRacesResources.INSTANCE.css().ensureInjected();
|
||||
setElement(uiBinder.createAndBindUi(this));
|
||||
|
||||
allConditionalElements = new Element[] {raceWinnerDiv, raceLeaderDiv, watchRaceDiv, analyzeRaceDiv, raceNotTrackedDiv,
|
||||
raceFeaturesDiv, legProgressDiv, raceFlagDiv, windStatusDiv, currentLegNo, totalLegsCount };
|
||||
allConditionalElements = new Element[] {raceWinnerDiv, raceLeaderDiv, watchRaceDiv, analyzeRaceDiv, raceNotTrackedDiv, raceNotScheduledDiv,
|
||||
raceFeaturesDiv, legProgressDiv, raceFlagDiv, windStatusDiv };
|
||||
|
||||
if(fleet.getColor() != null) {
|
||||
fleetColor.getStyle().setBackgroundColor(fleet.getColor().getAsHtml());
|
||||
@@ -127,7 +128,20 @@ public class EventRegattaRacesRace extends UIObject {
|
||||
SimpleRaceStates simpleRaceState = SimpleRaceStates.NOT_TRACKED;
|
||||
|
||||
if(race != null && race.trackedRace != null) {
|
||||
simpleRaceState = isLive() ? SimpleRaceStates.TRACKED_AND_LIVE : SimpleRaceStates.TRACKED_AND_NOT_LIVE;
|
||||
if(isLive()) {
|
||||
simpleRaceState = SimpleRaceStates.TRACKED_AND_RUNNING;
|
||||
if(race.startOfRace == null) {
|
||||
simpleRaceState = SimpleRaceStates.TRACKED_BUT_NOT_SCHEDULED;
|
||||
} else if (race.endOfRace != null) {
|
||||
simpleRaceState = SimpleRaceStates.TRACKED_AND_FINISHED;
|
||||
}
|
||||
} else {
|
||||
if(race.startOfRace == null) {
|
||||
simpleRaceState = SimpleRaceStates.TRACKED_BUT_NOT_SCHEDULED;
|
||||
} else if (race.endOfRace != null) {
|
||||
simpleRaceState = SimpleRaceStates.TRACKED_AND_FINISHED;
|
||||
}
|
||||
}
|
||||
}
|
||||
return simpleRaceState;
|
||||
}
|
||||
@@ -147,32 +161,37 @@ public class EventRegattaRacesRace extends UIObject {
|
||||
case NOT_TRACKED:
|
||||
showElement(raceNotTrackedDiv);
|
||||
break;
|
||||
case TRACKED_AND_LIVE:
|
||||
case TRACKED_BUT_NOT_SCHEDULED:
|
||||
showElement(raceNotScheduledDiv);
|
||||
break;
|
||||
case TRACKED_AND_RUNNING:
|
||||
showElement(watchRaceDiv);
|
||||
showElement(legProgressDiv);
|
||||
showElement(currentLegNo);
|
||||
showElement(totalLegsCount);
|
||||
|
||||
raceTime.setInnerText(raceTimeFormat.format(race.startOfRace));
|
||||
currentLegNo.setInnerText(String.valueOf(race.trackedRaceStatistics.currentLegNo));
|
||||
totalLegsCount.setInnerText(String.valueOf(race.trackedRaceStatistics.totalLegsCount));
|
||||
|
||||
if(race.startOfRace != null) {
|
||||
raceTime.setInnerText(raceTimeFormat.format(race.startOfRace));
|
||||
}
|
||||
if(race.trackedRaceStatistics.hasLegProgressData) {
|
||||
showElement(legProgressDiv);
|
||||
currentLegNo.setInnerText(String.valueOf(race.trackedRaceStatistics.currentLegNo));
|
||||
totalLegsCount.setInnerText(String.valueOf(race.trackedRaceStatistics.totalLegsCount));
|
||||
}
|
||||
if(race.trackedRaceStatistics.hasLeaderData && race.trackedRaceStatistics.leaderOrWinner != null) {
|
||||
showElement(raceLeaderDiv);
|
||||
updateWinnerOrLeader(raceLeader, race.trackedRaceStatistics.leaderOrWinner);
|
||||
}
|
||||
|
||||
break;
|
||||
case TRACKED_AND_NOT_LIVE:
|
||||
case TRACKED_AND_FINISHED:
|
||||
showElement(analyzeRaceDiv);
|
||||
|
||||
if(race.trackedRaceStatistics.hasLeaderData && race.trackedRaceStatistics.leaderOrWinner != null) {
|
||||
showElement(raceWinnerDiv);
|
||||
updateWinnerOrLeader(raceWinner, race.trackedRaceStatistics.leaderOrWinner);
|
||||
}
|
||||
if(race.startOfRace != null) {
|
||||
raceTime.setInnerText(raceTimeFormat.format(race.startOfRace));
|
||||
}
|
||||
showElement(raceFeaturesDiv);
|
||||
|
||||
raceTime.setInnerText(raceTimeFormat.format(race.startOfRace));
|
||||
updateRaceFeatures();
|
||||
|
||||
break;
|
||||
|
||||
+4
-1
@@ -27,7 +27,7 @@
|
||||
<div ui:field="raceLeaderDiv" class="{local_res.css.eventregattarace_details} {local_res.css.eventregattarace_leader}">
|
||||
<ui:text from="{i18n.eventRegattaRaceLeader}"/><br></br><span ui:field="raceLeader" class="{local_res.css.eventregattarace_leader_name}"></span>
|
||||
</div>
|
||||
<div ui:field="legProgressDiv" class="{local_res.css.eventregattarace_details} {local_res.css.eventregattarace_legs}"><ui:text from='{i18n.leg}'/>&nbps;<span ui:field="currentLegNo" />/<span ui:field="totalLegsCount" />
|
||||
<div ui:field="legProgressDiv" class="{local_res.css.eventregattarace_details} {local_res.css.eventregattarace_legs}"><ui:text from='{i18n.leg}'/> <span ui:field="currentLegNo" />/<span ui:field="totalLegsCount" />
|
||||
<div class="{local_res.css.eventregattarace_legs_list}">
|
||||
<div data-status="r" class="{local_res.css.eventregattarace_legs_leg}"></div>
|
||||
</div>
|
||||
@@ -41,6 +41,9 @@
|
||||
<div ui:field="raceNotTrackedDiv" class="{local_res.css.eventregattarace_action} {local_res.css.eventregattarace_actiondisabled}">
|
||||
<ui:text from='{i18n.eventRegattaRaceNotTracked}'/>
|
||||
</div>
|
||||
<div ui:field="raceNotScheduledDiv" class="{local_res.css.eventregattarace_action} {local_res.css.eventregattarace_actiondisabled}">
|
||||
<ui:text from='{i18n.raceNotScheduled}'/>
|
||||
</div>
|
||||
<div ui:field="watchRaceDiv" class="{local_res.css.eventregattarace_action}">
|
||||
<a ui:field="watchRaceLink" class="{res.mainCss.button} {local_res.css.eventregattarace_action_watch}"><ui:text from='{i18n.eventRegattaRaceWatch}'/></a>
|
||||
</div>
|
||||
|
||||
+5
-7
@@ -2,21 +2,19 @@ package com.sap.sailing.gwt.home.client.place.event.schedule;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.client.place.event.AbstractEventComposite;
|
||||
import com.sap.sailing.gwt.home.client.place.event.EventPageNavigator;
|
||||
import com.sap.sailing.gwt.ui.shared.EventDTO;
|
||||
|
||||
public class EventSchedule extends Composite {
|
||||
public class EventSchedule extends AbstractEventComposite {
|
||||
private static EventScheduleUiBinder uiBinder = GWT.create(EventScheduleUiBinder.class);
|
||||
|
||||
interface EventScheduleUiBinder extends UiBinder<Widget, EventSchedule> {
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private final EventDTO event;
|
||||
|
||||
public EventSchedule(EventDTO event) {
|
||||
this.event = event;
|
||||
public EventSchedule(EventDTO event, EventPageNavigator placeNavigator) {
|
||||
super(event, placeNavigator);
|
||||
|
||||
EventScheduleResources.INSTANCE.css().ensureInjected();
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
|
||||
+3
-3
@@ -23,9 +23,9 @@ public abstract class AbstractEventsView extends Composite implements EventsView
|
||||
@Override
|
||||
public void setEvents(List<EventBaseDTO> events) {
|
||||
for(EventBaseDTO event: events) {
|
||||
if(event.startDate != null) {
|
||||
if(DateUtil.isDayInPast(event.startDate)) {
|
||||
// recent event
|
||||
if(event.startDate != null && event.endDate != null) {
|
||||
if(DateUtil.isDayInPast(event.startDate) || event.isRunning()) {
|
||||
// recent event or live event
|
||||
int year = DateUtil.getYear(event.startDate);
|
||||
List<EventBaseDTO> eventsOfYear = recentEventsOrderedByYear.get(year);
|
||||
if(eventsOfYear == null) {
|
||||
|
||||
+9
-4
@@ -4,10 +4,11 @@ import java.util.List;
|
||||
|
||||
import com.google.gwt.activity.shared.AbstractActivity;
|
||||
import com.google.gwt.event.shared.EventBus;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.sap.sailing.gwt.home.client.shared.placeholder.Placeholder;
|
||||
import com.sap.sailing.gwt.ui.shared.EventBaseDTO;
|
||||
import com.sap.sse.gwt.client.mvp.ErrorView;
|
||||
|
||||
public class EventsActivity extends AbstractActivity {
|
||||
|
||||
@@ -19,17 +20,21 @@ public class EventsActivity extends AbstractActivity {
|
||||
|
||||
@Override
|
||||
public void start(final AcceptsOneWidget panel, EventBus eventBus) {
|
||||
final EventsView eventsView = clientFactory.createEventsView(EventsActivity.this);
|
||||
panel.setWidget(eventsView.asWidget());
|
||||
panel.setWidget(new Placeholder());
|
||||
|
||||
clientFactory.getSailingService().getPublicEventsOfAllSailingServers(new AsyncCallback<List<EventBaseDTO>>() {
|
||||
@Override
|
||||
public void onSuccess(List<EventBaseDTO> events) {
|
||||
final EventsView eventsView = clientFactory.createEventsView(EventsActivity.this);
|
||||
panel.setWidget(eventsView.asWidget());
|
||||
|
||||
eventsView.setEvents(events);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
Window.alert("Shit happens");
|
||||
final ErrorView view = clientFactory.createErrorView("Error while loading the sailing server instances with service getPublicEventsOfAllSailingServers()", caught);
|
||||
panel.setWidget(view.asWidget());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
+11
-3
@@ -2,11 +2,12 @@ package com.sap.sailing.gwt.home.client.place.searchresult;
|
||||
|
||||
import com.google.gwt.activity.shared.AbstractActivity;
|
||||
import com.google.gwt.event.shared.EventBus;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.sap.sailing.gwt.home.client.shared.placeholder.Placeholder;
|
||||
import com.sap.sailing.gwt.ui.shared.LeaderboardSearchResultDTO;
|
||||
import com.sap.sse.common.search.KeywordQuery;
|
||||
import com.sap.sse.gwt.client.mvp.ErrorView;
|
||||
|
||||
public class SearchResultActivity extends AbstractActivity {
|
||||
private final SearchResultClientFactory clientFactory;
|
||||
@@ -14,6 +15,7 @@ public class SearchResultActivity extends AbstractActivity {
|
||||
private final SearchResultPlace searchResultPlace;
|
||||
|
||||
private SearchResultView view;
|
||||
private AcceptsOneWidget panel;
|
||||
|
||||
public SearchResultActivity(SearchResultPlace place, SearchResultClientFactory clientFactory) {
|
||||
this.clientFactory = clientFactory;
|
||||
@@ -25,13 +27,18 @@ public class SearchResultActivity extends AbstractActivity {
|
||||
private void bindEvents() {
|
||||
clientFactory.getEventBus().addHandler(SearchEvent.TYPE, new SearchEventHandler() {
|
||||
public void onDoSearch(SearchEvent event) {
|
||||
doSearch(event.getSearchText());
|
||||
if(view != null) {
|
||||
doSearch(event.getSearchText());
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(final AcceptsOneWidget panel, final EventBus eventBus) {
|
||||
this.panel = panel;
|
||||
panel.setWidget(new Placeholder());
|
||||
|
||||
view = clientFactory.createSearchResultView();
|
||||
panel.setWidget(view.asWidget());
|
||||
doSearch(searchResultPlace.getSearchText());
|
||||
@@ -47,7 +54,8 @@ public class SearchResultActivity extends AbstractActivity {
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
Window.alert("Shit happens");
|
||||
final ErrorView view = clientFactory.createErrorView("Error while seaching with service search()", caught);
|
||||
panel.setWidget(view.asWidget());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
+6
-3
@@ -10,6 +10,7 @@ import com.google.gwt.activity.shared.AbstractActivity;
|
||||
import com.google.gwt.event.shared.EventBus;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.AcceptsOneWidget;
|
||||
import com.sap.sailing.gwt.home.client.shared.placeholder.Placeholder;
|
||||
import com.sap.sailing.gwt.home.client.shared.stage.StageEventType;
|
||||
import com.sap.sailing.gwt.ui.shared.EventBaseDTO;
|
||||
import com.sap.sse.common.Util.Pair;
|
||||
@@ -22,13 +23,15 @@ public class StartActivity extends AbstractActivity {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start(AcceptsOneWidget panel, EventBus eventBus) {
|
||||
final StartView view = clientFactory.createStartView();
|
||||
panel.setWidget(view.asWidget());
|
||||
public void start(final AcceptsOneWidget panel, EventBus eventBus) {
|
||||
panel.setWidget(new Placeholder());
|
||||
|
||||
clientFactory.getSailingService().getPublicEventsOfAllSailingServers(new AsyncCallback<List<EventBaseDTO>>() {
|
||||
@Override
|
||||
public void onSuccess(List<EventBaseDTO> result) {
|
||||
final StartView view = clientFactory.createStartView();
|
||||
panel.setWidget(view.asWidget());
|
||||
|
||||
fillStartPageEvents(view, result);
|
||||
}
|
||||
|
||||
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
.error_content {
|
||||
margin-top: 3em;
|
||||
margin-bottom: 3em;
|
||||
}
|
||||
.error_message {
|
||||
font-weight: bold;
|
||||
font-size: 20px;
|
||||
}
|
||||
.error_message_detail {
|
||||
font-size: 15px;
|
||||
}
|
||||
.reload_page_message {
|
||||
font-size: 20px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
package com.sap.sailing.gwt.home.client.shared.error;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.DivElement;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.uibinder.client.UiHandler;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.ui.Anchor;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.client.i18n.TextMessages;
|
||||
|
||||
public class ErrorMessage extends Composite {
|
||||
|
||||
interface ErrorUiBinder extends UiBinder<Widget, ErrorMessage> {
|
||||
}
|
||||
|
||||
private static ErrorUiBinder uiBinder = GWT.create(ErrorUiBinder.class);
|
||||
|
||||
@UiField DivElement errorMessage;
|
||||
@UiField DivElement errorMessageDetail;
|
||||
@UiField Anchor reloadPageAnchor;
|
||||
|
||||
public ErrorMessage(String detailMessage, Throwable errorReason) {
|
||||
ErrorMessageResources.INSTANCE.css().ensureInjected();
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
|
||||
this.setHeight(Window.getClientHeight() + "px");
|
||||
errorMessage.setInnerText(TextMessages.INSTANCE.errorMessageLoadingData());
|
||||
|
||||
Window.setStatus(detailMessage);
|
||||
}
|
||||
|
||||
@UiHandler("reloadPageAnchor")
|
||||
void reloadPage(ClickEvent e) {
|
||||
Window.Location.reload();
|
||||
}
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
<!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:s="urn:import:com.sap.sailing.gwt.home.client.shared">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.home.client.i18n.TextMessages"/>
|
||||
<ui:with field="res" type="com.sap.sailing.gwt.home.client.HomeResources" />
|
||||
<ui:with field="local_res" type="com.sap.sailing.gwt.home.client.shared.error.ErrorMessageResources" />
|
||||
<g:HTMLPanel>
|
||||
<div class="{res.mainCss.grid}">
|
||||
<div class="{res.mediaCss.columns}">
|
||||
<div class="{local_res.css.error_content}">
|
||||
<div ui:field="errorMessage" class="{local_res.css.error_message}"></div>
|
||||
<div ui:field="errorMessageDetail" class="{local_res.css.error_message_detail}"></div>
|
||||
</div>
|
||||
<div>
|
||||
<span class="{local_res.css.reload_page_message}"><ui:text from='{i18n.pleaseTryAgain}'/></span>
|
||||
<g:Anchor ui:field="reloadPageAnchor" href="javascript:;" styleName="{res.mainCss.button}"><ui:text from='{i18n.reloadPage}'/></g:Anchor>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
package com.sap.sailing.gwt.home.client.shared.error;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.resources.client.ClientBundle;
|
||||
import com.google.gwt.resources.client.CssResource;
|
||||
|
||||
public interface ErrorMessageResources extends ClientBundle {
|
||||
public static final ErrorMessageResources INSTANCE = GWT.create(ErrorMessageResources.class);
|
||||
|
||||
@Source("com/sap/sailing/gwt/home/client/shared/error/ErrorMessage.css")
|
||||
LocalCss css();
|
||||
|
||||
public interface LocalCss extends CssResource {
|
||||
String error_content();
|
||||
String error_message();
|
||||
String error_message_detail();
|
||||
String reload_page_message();
|
||||
}
|
||||
}
|
||||
+21
-3
@@ -4,6 +4,7 @@ import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.AnchorElement;
|
||||
import com.google.gwt.dom.client.StyleInjector;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.KeyCodes;
|
||||
@@ -12,6 +13,9 @@ import com.google.gwt.event.dom.client.KeyPressHandler;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.uibinder.client.UiHandler;
|
||||
import com.google.gwt.user.client.DOM;
|
||||
import com.google.gwt.user.client.Event;
|
||||
import com.google.gwt.user.client.EventListener;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.ui.Anchor;
|
||||
import com.google.gwt.user.client.ui.Button;
|
||||
@@ -19,11 +23,13 @@ import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.TextBox;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.client.app.PlaceNavigator;
|
||||
import com.sap.sailing.gwt.home.client.i18n.TextMessages;
|
||||
|
||||
public class Header extends Composite {
|
||||
@UiField Anchor startPageLink;
|
||||
@UiField Anchor eventsPageLink;
|
||||
@UiField Anchor solutionsPageLink;
|
||||
@UiField AnchorElement homeLink;
|
||||
// @UiField Anchor sponsoringPageLink;
|
||||
|
||||
@UiField TextBox searchText;
|
||||
@@ -37,7 +43,7 @@ public class Header extends Composite {
|
||||
|
||||
private static HeaderUiBinder uiBinder = GWT.create(HeaderUiBinder.class);
|
||||
|
||||
public Header(PlaceNavigator navigator) {
|
||||
public Header(final PlaceNavigator navigator) {
|
||||
this.navigator = navigator;
|
||||
|
||||
HeaderResources.INSTANCE.css().ensureInjected();
|
||||
@@ -46,7 +52,7 @@ public class Header extends Composite {
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
links = Arrays.asList(new Anchor[] { startPageLink, eventsPageLink, solutionsPageLink });
|
||||
|
||||
searchText.getElement().setAttribute("placeholder", "Search SAPSailing.com");
|
||||
searchText.getElement().setAttribute("placeholder", TextMessages.INSTANCE.headerSearchPlaceholder());
|
||||
searchText.addKeyPressHandler(new KeyPressHandler() {
|
||||
@Override
|
||||
public void onKeyPress(KeyPressEvent event) {
|
||||
@@ -55,6 +61,18 @@ public class Header extends Composite {
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Event.sinkEvents(homeLink, Event.ONCLICK);
|
||||
Event.setEventListener(homeLink, new EventListener() {
|
||||
@Override
|
||||
public void onBrowserEvent(Event event) {
|
||||
switch (DOM.eventGetType(event)) {
|
||||
case Event.ONCLICK:
|
||||
navigator.goToHome();
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@UiHandler("startPageLink")
|
||||
@@ -83,7 +101,7 @@ public class Header extends Composite {
|
||||
@UiHandler("searchButton")
|
||||
void searchButtonClick(ClickEvent event) {
|
||||
if(searchText.getText().isEmpty()) {
|
||||
Window.alert("Please enter a search term.");
|
||||
Window.alert(TextMessages.INSTANCE.pleaseEnterASearchTerm());
|
||||
} else {
|
||||
navigator.goToSearchResult(searchText.getText());
|
||||
}
|
||||
|
||||
+3
-1
@@ -9,7 +9,9 @@
|
||||
<header class="{local_res.css.siteheader}">
|
||||
<div class="{res.mainCss.grid}">
|
||||
<div class="{res.mediaCss.small2} {res.mediaCss.large3} {res.mediaCss.columns}">
|
||||
<g:Image resource="{local_res.logo}" pixelSize="80, 40" altText="SAP Sailing Analytics" styleName="{local_res.css.logo}"/>
|
||||
<a ui:field="homeLink" href="javascript:;">
|
||||
<g:Image resource="{local_res.logo}" pixelSize="80, 40" altText="SAP Sailing Analytics" styleName="{local_res.css.logo}"/>
|
||||
</a>
|
||||
<p class="{local_res.css.logotitle}">Sailing Analytics</p>
|
||||
</div>
|
||||
<div class="{res.mediaCss.small9} {res.mediaCss.medium7} {res.mediaCss.large6} {res.mediaCss.columns}">
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
.content {
|
||||
margin-top: 3em;
|
||||
font-weight: bold;
|
||||
vertical-align: center;
|
||||
}
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
package com.sap.sailing.gwt.home.client.shared.placeholder;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
|
||||
public class Placeholder extends Composite {
|
||||
|
||||
interface PlaceholderUiBinder extends UiBinder<Widget, Placeholder> {
|
||||
}
|
||||
|
||||
private static PlaceholderUiBinder uiBinder = GWT.create(PlaceholderUiBinder.class);
|
||||
|
||||
public Placeholder() {
|
||||
PlaceholderResources.INSTANCE.css().ensureInjected();
|
||||
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
|
||||
this.setHeight(Window.getClientHeight() + "px");
|
||||
}
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
<!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:s="urn:import:com.sap.sailing.gwt.home.client.shared">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.home.client.i18n.TextMessages"/>
|
||||
<ui:with field="res" type="com.sap.sailing.gwt.home.client.HomeResources" />
|
||||
<ui:with field="local_res" type="com.sap.sailing.gwt.home.client.shared.placeholder.PlaceholderResources" />
|
||||
<g:HTMLPanel>
|
||||
<div class="{res.mainCss.grid}">
|
||||
<div class="{res.mediaCss.columns}">
|
||||
<div class="{local_res.css.content}">
|
||||
<span style="margin-right: 10px">Loading...</span>
|
||||
<img src="images/home/busy_indicator.gif" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
package com.sap.sailing.gwt.home.client.shared.placeholder;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.resources.client.ClientBundle;
|
||||
import com.google.gwt.resources.client.CssResource;
|
||||
|
||||
public interface PlaceholderResources extends ClientBundle {
|
||||
public static final PlaceholderResources INSTANCE = GWT.create(PlaceholderResources.class);
|
||||
|
||||
@Source("com/sap/sailing/gwt/home/client/shared/placeholder/Placeholder.css")
|
||||
LocalCss css();
|
||||
|
||||
public interface LocalCss extends CssResource {
|
||||
String content();
|
||||
}
|
||||
}
|
||||
+7
-1
@@ -7,6 +7,7 @@ import com.google.gwt.dom.client.AnchorElement;
|
||||
import com.google.gwt.dom.client.DivElement;
|
||||
import com.google.gwt.dom.client.ImageElement;
|
||||
import com.google.gwt.dom.client.SpanElement;
|
||||
import com.google.gwt.dom.client.Style.Display;
|
||||
import com.google.gwt.safehtml.shared.SafeHtml;
|
||||
import com.google.gwt.uibinder.client.UiBinder;
|
||||
import com.google.gwt.uibinder.client.UiField;
|
||||
@@ -26,7 +27,8 @@ public class RecentEvent extends UIObject {
|
||||
@UiField SpanElement eventStartDate;
|
||||
@UiField AnchorElement eventOverviewLink;
|
||||
@UiField ImageElement eventImage;
|
||||
|
||||
@UiField DivElement isLiveDiv;
|
||||
|
||||
private EventBaseDTO event;
|
||||
|
||||
private final String defaultImageUrl = "http://static.sapsailing.com/ubilabsimages/default/default_event_photo.jpg";
|
||||
@@ -64,6 +66,10 @@ public class RecentEvent extends UIObject {
|
||||
SafeHtml safeHtmlEventName = LongNamesUtil.breakLongName(event.getName());
|
||||
eventName.setInnerSafeHtml(safeHtmlEventName);
|
||||
|
||||
if(!event.isRunning()) {
|
||||
isLiveDiv.getStyle().setDisplay(Display.NONE);
|
||||
}
|
||||
|
||||
venueName.setInnerText(event.venue.getName());
|
||||
eventStartDate.setInnerText(EventDatesFormatterUtil.formatDateRangeWithoutYear(event.startDate, event.endDate));
|
||||
|
||||
|
||||
+1
-1
@@ -9,7 +9,7 @@
|
||||
<div class="{local_res.css.eventteasercontainer}">
|
||||
<a href="javascript:;" ui:field="eventOverviewLink" class="{local_res.css.eventteaser}">
|
||||
<figure class="{local_res.css.eventteaser_image}"><img ui:field="eventImage" />
|
||||
<div class="{local_res.css.eventteaser_series} {res.mainCss.label}"></div>
|
||||
<div ui:field="isLiveDiv" data-labeltype="live" class="{local_res.css.eventteaser_series} {res.mainCss.label}"><ui:text from='{i18n.live}'/></div>
|
||||
</figure>
|
||||
<div class="{local_res.css.eventteaser_name}"><span ui:field="eventName" /></div>
|
||||
<div class="{local_res.css.eventteaser_location}">
|
||||
|
||||
+13
-12
@@ -67,22 +67,23 @@ public class Stage extends Composite {
|
||||
stageTeaserComposites.add(stageTeaser);
|
||||
}
|
||||
|
||||
this.swiper = Swiper.createWithoutLoopOption(StageResources.INSTANCE.css().stage_teasers(),
|
||||
StageResources.INSTANCE.css().swiperwrapper(),
|
||||
StageResources.INSTANCE.css().swiperslide(), new Swiper.PageChangeListener() {
|
||||
|
||||
@Override
|
||||
public void pageChanged(int newPageIndex, int pageCount) {
|
||||
boolean isFirstSlide = newPageIndex == 0;
|
||||
boolean isLastSlide = newPageIndex == pageCount - 1;
|
||||
nextStageTeaserLink.setVisible(!isLastSlide);
|
||||
prevStageTeaserLink.setVisible(!isFirstSlide);
|
||||
}
|
||||
});
|
||||
if (featuredEvents.size() <= 1) {
|
||||
prevStageTeaserLink.setVisible(false);
|
||||
nextStageTeaserLink.setVisible(false);
|
||||
} else {
|
||||
swiper = Swiper.createWithoutLoopOption(StageResources.INSTANCE.css().stage_teasers(),
|
||||
StageResources.INSTANCE.css().swiperwrapper(),
|
||||
StageResources.INSTANCE.css().swiperslide(), new Swiper.PageChangeListener() {
|
||||
|
||||
@Override
|
||||
public void pageChanged(int newPageIndex, int pageCount) {
|
||||
boolean isFirstSlide = newPageIndex == 0;
|
||||
boolean isLastSlide = newPageIndex == pageCount - 1;
|
||||
nextStageTeaserLink.setVisible(!isLastSlide);
|
||||
prevStageTeaserLink.setVisible(!isFirstSlide);
|
||||
}
|
||||
});
|
||||
|
||||
prevStageTeaserLink.setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
+3
@@ -1,6 +1,7 @@
|
||||
package com.sap.sailing.gwt.ui.client;
|
||||
|
||||
import com.sap.sse.gwt.client.mvp.ClientFactory;
|
||||
import com.sap.sse.gwt.client.mvp.ErrorView;
|
||||
|
||||
/**
|
||||
* A client factory that can deliver the sailing-specific services.
|
||||
@@ -10,4 +11,6 @@ import com.sap.sse.gwt.client.mvp.ClientFactory;
|
||||
*/
|
||||
public interface SailingClientFactory extends ClientFactory {
|
||||
SailingServiceAsync getSailingService();
|
||||
|
||||
ErrorView createErrorView(String errorMessage, Throwable errorReason);
|
||||
}
|
||||
+3
-1
@@ -3031,7 +3031,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
public List<EventBaseDTO> getPublicEventsOfAllSailingServers() throws MalformedURLException {
|
||||
List<EventBaseDTO> result = new ArrayList<>();
|
||||
for (EventDTO localEvent : getEvents()) {
|
||||
result.add(localEvent);
|
||||
if(localEvent.isPublic) {
|
||||
result.add(localEvent);
|
||||
}
|
||||
}
|
||||
for (Entry<RemoteSailingServerReference, com.sap.sse.common.Util.Pair<Iterable<EventBase>, Exception>> serverRefAndEventsOrException :
|
||||
getService().getPublicEventsOfAllSailingServers().entrySet()) {
|
||||
|
||||
+8
@@ -52,6 +52,14 @@ public class EventBaseDTO extends NamedDTO implements IsSerializable {
|
||||
this.leaderboardGroups = leaderboardGroups;
|
||||
}
|
||||
|
||||
public boolean isRunning() {
|
||||
Date now = new Date();
|
||||
if(startDate != null && endDate != null && (now.after(startDate) && now.before(endDate))) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
+1
-1
@@ -30,7 +30,7 @@
|
||||
<entry-point class='com.sap.sailing.gwt.ui.raceboard.RaceBoardEntryPoint'/>
|
||||
|
||||
<!-- Specify the paths for translatable code -->
|
||||
<extend-property name="locale" values="de"/>
|
||||
<extend-property name="locale" values="de"/>
|
||||
<extend-property name="locale" values="ru"/>
|
||||
|
||||
<source path='common'/>
|
||||
|
||||
@@ -45,6 +45,27 @@
|
||||
<h2 class='articleSubheadline'>Upcoming and Live</h2>
|
||||
<br/>
|
||||
<div class="timeBar">
|
||||
<div class='raceSection'>
|
||||
<h5 class='date'>
|
||||
505 Worlds 2014
|
||||
</h5>
|
||||
<div class='raceTimepoint'></div>
|
||||
<a href='http://505worlds2014.sapsailing.com' target='_blank'>
|
||||
<ul class='racePanel'>
|
||||
<li class='raceName'>
|
||||
505 Worlds 2014
|
||||
</li>
|
||||
<li class='raceLocation'>
|
||||
Kiel, Germany
|
||||
</li>
|
||||
</ul>
|
||||
</a>
|
||||
<div class='raceDescription'>
|
||||
<p>505 Worlds 2014</p>
|
||||
<a href='http://505worlds2014.sapsailing.com' target='_blank'>SAP Sailing Analytics</a><br/>
|
||||
<a href='http://sap505worlds.com' target='_blank'>Official website</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class='raceSection'>
|
||||
<h5 class='date'>
|
||||
2014 Season
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package com.sap.sse.gwt.client.mvp;
|
||||
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
|
||||
public interface ErrorView {
|
||||
Widget asWidget();
|
||||
}
|
||||
@@ -16,6 +16,42 @@ Admin Console at http://ec2-54-77-33-52.eu-west-1.compute.amazonaws.com:8888/gwt
|
||||
External IP: 54.77.33.52
|
||||
Internal IP: 172.31.31.62
|
||||
|
||||
## TracTrac URL
|
||||
|
||||
http://secondary.traclive.dk/events/event_20140813_Worlds/jsonservice.php
|
||||
|
||||
## Replication
|
||||
|
||||
RabbitMQ server for replication: 54.246.250.138
|
||||
Replication Exchange Name: 505WORLDS2014
|
||||
|
||||
Regatta Overview: http://505worlds2014ro.sapsailing.com
|
||||
|
||||
Manage2Sail Event URL: http://manage2sail.com/api/public/links/event/d70bee3e-9f65-46f4-96a1-9fd467712ce0?accesstoken=bDAv8CwsTM94ujZ&mediaType=json
|
||||
|
||||
Event Page (newhome): http://505worlds2014.sapsailing.com/gwt/Home.html#EventPlace:eventId=94e1e240-8a3d-466b-9f39-419f311eaace
|
||||
|
||||
## Replication to Cube Server
|
||||
|
||||
At this event we operate a replica on our SAP Sail Cube server. The server is physically located behind the ground floor desk. With one of its network adapters it is hooked up to the lounge network, using a radio link from realTV. The second network adapter (Mainboard) is connected to the cube's network, allowing access from studio PCs to the cube server. This adapter is also the default route, providing the cube server, cube showroom and realTV with Internet access. As a backup it is possible to switch the default route to the launch. See `ip route show`.
|
||||
|
||||
The server runs a isc-dhcp-server, which requires all connected routers to NOT deliver a dhcp server. All required subnet config is in `/etc/dhcp/dhcpd.conf`. We have a /22 subnet for cube and a /24 subnet for the launch. BeTomorrow get static ips assigned by the dhcp through MAC-addresses, because their server always needs the same ip address. Futhermore the dhcp deploys our own DNS server here. For further description of the DNS setup read further.
|
||||
|
||||
The server also runs a bind9 DNS server which is set as the primary DNS for all lounge and cube PCs. All DNS requests are forwarded to a public DNS server except for requests for 505worlds2014.sapsailing.com for which the local DNS server returns the IP address of the cube server for the NIC through which the DNS request was received. For that two DNS zones are introduced, which match by the incoming IP range request. See `/etc/bind/named.conf.zones-cube` and `/etc/bind/named.conf.zones-launch` for definition of zone and forwarding. Take a look at `/etc/bind/zones/505sapsailing.cube.db` and `/etc/bind/zones/505sapsailing.sailing.db` for the nameserver entries for the zone. The result is, that if a request comes from the launch network, the domain is resolved to the ip the cube server has in this subnet and also if the request comes from the cube, it returns the ip in the subnet of the cube.
|
||||
As described in bug2204 wind data and API are not served through the replica, so BeTomorrow has to go to our main server. For that i introduced a subsubdomain `btmw.505worlds2014.sapsailing.com` which points to `sapsailing.com` and answers with our main active server of the event.
|
||||
|
||||
On the cube server we run a replica server instance as user `sailing` under the usual directory set-up (`/home/sailing/servers/server`). The `env.sh` file uses a configuration that lets the server start replicating when launched. The two possible master servers (A / B) are specified in two lines defining `REPLICATE_MASTER_SERVLET_HOST`, one is commented, the other one active.
|
||||
|
||||
When switching from the A server to the B server or vice versa, the replica needs to be re-configured. Before stopping it, connected clients need to be re-directed to the master when they hit 505worlds2014.sapsailing.com. This is achieved by re-configuring the Apache server running on the replica, as user `root`, editing `/etc/apache2/sites-enabled/001-events.conf` and activating the line for `505worlds2014.sapsailing.com` that points to the IP address of the new active server, then invoking `/etc/init.d/apache2 reload`. Once this is done, the running replica should cleanly stop replication (using the `Replication` tab in the AdminConsole), then stopping the instance (as user `sailing` run `/home/sailing/servers/server/stop`). Then, in `env.sh` the `REPLICATE_MASTER_SERVLET_HOST` variable needs to be set to point to the new master. After that, the replica Java instance can be launched using `/home/sailing/servers/server/start`). Before re-activating it is important that the rabbit initial load is done. So please watch eather `/home/sailing/servers/server/logs/sailing0.log.0` or the Rabbit Webinterface on `http://54.246.250.138:15672/#/queues`. Please deleted eventually displayed old queues (be sure not to remove the correct replicating queue!). Re-configure Apache again by editing `/etc/apache2/sites-enabled/001-events.conf` again, re-activating the record that lets 505worlds2014.sapsailing.com point to the replica. From this point on, clients in the lounge and the Cube will instantly be directed to the cube server again when hitting the replica server's Apache with a URL starting with `505worlds2014.sapsailing.com`. You can check this by example checking the load with `htop` or `apachetop`.
|
||||
|
||||
## Switching Servers
|
||||
|
||||
For maximum availability we have two EC2 servers reserved for the event (see above). We can prepare the other server by installing a release, either by using the `refreshInstance.sh` script or by using `tmux attach` to go to a console and fetching from git and building and installing there. When done, fire up the server and load all races required. Test the server reasonably well.
|
||||
|
||||
Then switch the cube server replica to point to the new server. This process is described above.
|
||||
|
||||
Then, log on as `root` on `sapsailing.com`, go to `/etc/httpd/conf.d` and edit `001-events.conf` to update the 505worlds2014-related URLs. By convention, the inactive server URLs are suffixed with `-a` or `-b` name, respectively. When done editing, run `/etc/init.d/httpd reload` which will update the Apache configuration so that from that point on requests to `505worlds2014.sapsailing.com` will go to the new server. Convince yourself by looking at the logs under `/home/sailing/servers/server/logs/sailing0.log.0` that the correct server is now active. Afterwards, stop the old server's Java instance.
|
||||
|
||||
### Touch Computer (Lenovo) Setup
|
||||
|
||||
#### Installation Browser & Setup
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
This document describes the onboarding process for a new team member (developer)
|
||||
|
||||
First of all, make sure you've looked at http://www.amazon.de/Patterns-Elements-Reusable-Object-Oriented-Software/dp/0201633612. That's a great book, and knowing at least some of it will help you a great deal finding your way around our solution.
|
||||
|
||||
### Race Analysis Development Setup
|
||||
|
||||
#### Installations
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
# Profiling
|
||||
|
||||
Use the SAP JVM 7 available at http://sapjvm.wdf.sap.corp:1080 and its Eclipse profiler plug-in available from the same location. The update site to add to your Eclipse is http://sapjvm.wdf.sap.corp:1080/profiling. After unpacking the VM, make it known by your Eclipse installation and use it for the launch configuration that you want to profile.
|
||||
|
||||
## Profiling GWT Client Code
|
||||
|
||||
Using GWT's DevMode, you can also profile GWT Java code running in the client. You have to keep in mind that many things work differently when in DevMode and that significant overhead for the Browser-to-JavaVM communication is generated. However, your core algorithms that require attention performance-wise will often still stick out, assuming some clever filtering in the Eclipse profiler plug-in which is easily possible.
|
||||
|
||||
For GWT profiling please note that there is no immediate support to launch an SAP JVM in profiling mode for a GWT launch config. Instead, use the `Sailing GWT Remote Profiling (Run-Mode only)` launch configuration in Run mode. It will pause at start-up and wait for the profiler to get connected. Then use the profiling launch configuration `Profile SailingGWT` to get started.
|
||||
Reference in new issue
Block a user