diff --git a/build.gradle b/build.gradle index a2c53b7b9f9..bdbf300e238 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0-alpha1' + classpath 'com.android.tools.build:gradle:2.1.0-alpha3' } } diff --git a/doc/SAPSailingAnalytics_Administrator_Training.pptx b/doc/SAPSailingAnalytics_Administrator_Training.pptx index b7b81e9293a..72e5d0297a5 100644 Binary files a/doc/SAPSailingAnalytics_Administrator_Training.pptx and b/doc/SAPSailingAnalytics_Administrator_Training.pptx differ diff --git a/java/com.sap.sailing.dashboards.gwt/META-INF/MANIFEST.MF b/java/com.sap.sailing.dashboards.gwt/META-INF/MANIFEST.MF index b021abb2cd9..53b9b480d53 100644 --- a/java/com.sap.sailing.dashboards.gwt/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.dashboards.gwt/META-INF/MANIFEST.MF @@ -25,7 +25,8 @@ Require-Bundle: com.sap.sailing.domain, com.sap.sse.gwt.adminconsole, org.apache.commons.math;bundle-version="2.1.0" Bundle-ActivationPolicy: lazy -Import-Package: com.sap.sse.util, +Import-Package: com.google.gwt.core.ext.linker, + com.sap.sse.util, javax.servlet;version="3.1.0", javax.servlet.descriptor;version="3.1.0", javax.servlet.http;version="3.1.0", diff --git a/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT sdm.launch b/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT sdm.launch old mode 100755 new mode 100644 index aefd1e3ffb6..1d3ddca4744 --- a/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT sdm.launch +++ b/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT sdm.launch @@ -43,5 +43,5 @@ - + diff --git a/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT.launch b/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT.launch old mode 100755 new mode 100644 index 463a6cf721f..82f276e1799 --- a/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT.launch +++ b/java/com.sap.sailing.dashboards.gwt/SailingDashboardsGWT.launch @@ -43,5 +43,5 @@ - + diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java index c7199a2a5ed..c6b2997f97c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceImpl.java @@ -575,7 +575,7 @@ DynamicTrackedRace, GPSTrackListener { neededToCreateOrUpdateFinishMarkPassing = true; } else { finishMarkPassingToUse = originalMarkPassing.getOriginal(); - if (copyOfMarkPassings != originalMarkPassing) { + if (finishMarkPassingToUse != originalMarkPassing) { logger.info(getRace().getName()+": Reverting race log-based finish mark passing "+originalMarkPassing+" to "+finishMarkPassingToUse+ " because no finishing time found anymore for that competitor in race log"); neededToCreateOrUpdateFinishMarkPassing = true; diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch index 3188a77e3f5..263825f093c 100644 --- a/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT sdm.launch @@ -74,5 +74,5 @@ - + diff --git a/java/com.sap.sailing.gwt.ui/SailingGWT.launch b/java/com.sap.sailing.gwt.ui/SailingGWT.launch index dfad7ad820a..b14028404ea 100644 --- a/java/com.sap.sailing.gwt.ui/SailingGWT.launch +++ b/java/com.sap.sailing.gwt.ui/SailingGWT.launch @@ -71,5 +71,5 @@ - + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages.properties index cd6e7af5c5a..7365690323b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages.properties @@ -163,7 +163,7 @@ searchResultSortLabel=Sort by searchResultSortNewest=Recent searchResultSortOldest=Oldest searchResultSortRelevance=Relevance -searchResultCount=About 2,450 results where found for 'Schnitzel' +searchResultCount=About 2,450 results where found for ''Schnitzel'' sharingEmail=Send an email sharingFacebook=Share on Facebook sharingTwitter=Tweet about it @@ -197,7 +197,7 @@ solutionsSAPText1=By delivering real time analytics around race rankings, speeds solutionsSAPText2=SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere. solutionsRaceText=The SAP Race Committee App delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter. solutionsPostText=Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better.
SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas. -solutionsTrainingText=The STG Training Diary supports the daily documentation and analysis of an athlete\u2019s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. +solutionsTrainingText=The STG Training Diary supports the daily documentation and analysis of an athlete''s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. solutionsSimulatorText=Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions. diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml index 0c9ed27ee32..f90fce8f834 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/footer/Footer.ui.xml @@ -43,10 +43,10 @@ - + - + diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.ui.xml b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.ui.xml index 307e1bb0bf2..8d1b7a99c63 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.ui.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/desktop/partials/header/Header.ui.xml @@ -24,7 +24,7 @@ styleName="{local_res.css.sitenavigation_link}" text="{i18n.events}" /> - | - + | + + +

>() { @Override public void onSuccess(Collection result) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java index 7224931137e..f953fada44f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/RegattaLogTrackingDeviceMappingsDialog.java @@ -40,6 +40,8 @@ import com.sap.sse.gwt.client.ErrorReporter; import com.sap.sse.gwt.client.dialog.DataEntryDialog; public class RegattaLogTrackingDeviceMappingsDialog extends DataEntryDialog { + private static final int HOURS_TO_EXPAND_FOR_OPEN_END = 2; + protected final String leaderboardName; public static final double PERCENTAGE_OF_TIMESPAN_TO_EXTEND_OPEN_ENDS = 0.1; @@ -165,16 +167,19 @@ public class RegattaLogTrackingDeviceMappingsDialog extends DataEntryDialog(){ + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error while setting tracking times: " + caught.getMessage()); + } + + @Override + public void onSuccess(Void result) { + refreshTimes(); + } + }); + } + }); + + currentPanel.add(startStopButton); current.add(currentPanel); return current; @@ -149,6 +210,10 @@ public class SetTrackingTimesDialog extends DataEntryDialogWithBootstrap " + NumberFormat.getDecimalFormat().format(after.speedInKnots) + " " + stringMessages.knotsUnit() + ")")); if (maneuver.maneuverLossInMeters != null) { - vPanel.add(createInfoWindowLabelAndValue(stringMessages.maneuverLoss(), ""+maneuver.maneuverLossInMeters+"m")); + vPanel.add(createInfoWindowLabelAndValue(stringMessages.maneuverLoss(), NumberFormat.getFormat("0.0").format(maneuver.maneuverLossInMeters)+"m")); } return vPanel; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardTable.css b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardTable.css index 0ddbdbe2a30..2d8c4698a2b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardTable.css +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/leaderboard/LeaderboardTable.css @@ -1,6 +1,6 @@ .cellTableWidget { - border-left: 1px solid #c9caca; border-top: 1px solid #c9caca; + border-right: 1px solid #c9caca; border-collapse: separate; } @@ -16,20 +16,19 @@ border-right: 0px solid #c9caca !important; border-top: none !important; border-bottom: 1px solid #c9caca !important; + border-left: 1px solid #c9caca !important; padding: 3px 5px; padding-bottom: 5px; text-align: center; text-shadow: none !important; + font-weight: bold; + font-size: 12px!important; } .cellTableFirstColumnHeader { position: relative; vertical-align: bottom; background-color: #e5e5e5; - border-left: none !important; - border-right: 1px solid #c9caca !important; - border-top: none !important; - border-bottom: 1px solid #c9caca !important; text-align: center; } @@ -37,9 +36,6 @@ position: relative; vertical-align: bottom; background-color: #e5e5e5; - border-right: 1px solid #c9caca !important; - border-top: none !important; - border-bottom: 1px solid #c9caca !important; text-align: center; } @@ -89,8 +85,11 @@ height: 13px; width: 13px; margin: auto auto; - border: 1px solid #fcbb22; - background-color: #fcbb22; + border: 1px solid #fcbb22; + background-color: #fcbb22; +/* border: solid 1px #acacac; */ +/* background-color: #cacaca; */ + } .cellTableCheckboxDeselected { diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/client/images/stop_racelog_tracking.png b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/client/images/stop_racelog_tracking.png new file mode 100644 index 00000000000..9ce5314e73b Binary files /dev/null and b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/client/images/stop_racelog_tracking.png differ diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java index c80d0badd8d..9fba7e3571c 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java @@ -35,13 +35,13 @@ public class EventsResource extends AbstractSailingServerResource { @GET @Produces("application/json;charset=UTF-8") - public Response getEvents() { - // TODO bug2589, bug3504: the following will require EVENT:READ permission; it requires cross-server links to be authentication aware... + public Response getEvents(@QueryParam("showNonPublic") String showNonPublic) { + // TODO bug2589, bug3504: the following will require EVENT:READ permission; it requires cross-server links to be authentication aware... // SecurityUtils.getSubject().checkPermission(Permission.EVENT.getStringPermission(Permission.Mode.READ)); JsonSerializer eventSerializer = new EventBaseJsonSerializer(new VenueJsonSerializer(new CourseAreaJsonSerializer()), new LeaderboardGroupBaseJsonSerializer()); JSONArray result = new JSONArray(); for (EventBase event : getService().getAllEvents()) { - if (event.isPublic()) { + if ((showNonPublic != null && Boolean.valueOf(showNonPublic)) || event.isPublic()) { result.add(eventSerializer.serialize(event)); } } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java index b48aae155d1..0c76e3d5a3a 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RaceStateSerializer.java @@ -38,6 +38,7 @@ public class RaceStateSerializer implements JsonSerializerAuto Player

A web based player switching automatically between live races and the overall leaderboard of a competition.

Start Auto Player... +

Home

+

Server Landing Page and Stage

+ Home...

...for data analysis

diff --git a/java/com.sap.sse.security.ui/Security UI sdm.launch b/java/com.sap.sse.security.ui/Security UI sdm.launch old mode 100755 new mode 100644 index e15e8f7ab9e..fdc04ec8bf3 --- a/java/com.sap.sse.security.ui/Security UI sdm.launch +++ b/java/com.sap.sse.security.ui/Security UI sdm.launch @@ -44,5 +44,5 @@ - + diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml index 97ad255b3ba..d80170db093 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values-de/strings.xml @@ -494,4 +494,7 @@ nach Namen - \ No newline at end of file + Zeige nicht öffentliche Events + Lade alle Events, auch die nicht öffentlichen. + + diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/preferences.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/preferences.xml index 298da4716b6..9ea02046b1e 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values/preferences.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values/preferences.xml @@ -108,4 +108,7 @@ Dark Light + + show_non_public_events + false diff --git a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml index bf5a3255b6b..82318e4453e 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/values/strings.xml @@ -522,4 +522,6 @@ by Name - \ No newline at end of file + Show Non Public Events + Load all events including the no public one. + diff --git a/mobile/com.sap.sailing.racecommittee.app/res/xml/preference_general.xml b/mobile/com.sap.sailing.racecommittee.app/res/xml/preference_general.xml index 0d1f96bf120..8ce2d002d79 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/xml/preference_general.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/xml/preference_general.xml @@ -60,6 +60,12 @@ android:key="@string/preference_mail_key" android:title="@string/settings_advanced_mail_header"/> + + > handler = new EventsDataHandler(OnlineDataManager.this); // ExLog.i(context, TAG, "getEventsLoader created new loader..."); - - URL url = UrlHelper.generateUrl(preferences.getServerBaseURL(), "/sailingserver/api/v1/events", null); + List> params = new ArrayList<>(); + params.add(new Util.Pair("showNonPublic", AppPreferences.on(context).showNonPublic())); + URL url = UrlHelper.generateUrl(preferences.getServerBaseURL(), "/sailingserver/api/v1/events", params); return new OnlineDataLoader>(context, url, parser, handler); } diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/StartTimeFragment.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/StartTimeFragment.java index e3e17b1a443..184fd497a33 100755 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/StartTimeFragment.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/ui/fragments/raceinfo/StartTimeFragment.java @@ -32,6 +32,7 @@ import com.sap.sailing.domain.abstractlog.race.state.RaceStateChangedListener; import com.sap.sailing.domain.abstractlog.race.state.ReadonlyRaceState; import com.sap.sailing.domain.abstractlog.race.state.impl.BaseRaceStateChangedListener; import com.sap.sailing.domain.common.LeaderboardNameConstants; +import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.racecommittee.app.AppConstants; import com.sap.sailing.racecommittee.app.AppPreferences; @@ -422,7 +423,7 @@ public class StartTimeFragment extends BaseFragment } if (races.getFleet().getName().equals(fleet.getA())) { for (ManagedRace race : mGroupHeaders.get(races)) { - if (!getRace().equals(race)) { + if (!getRace().equals(race) && race.getStatus() != RaceLogRaceStatus.FINISHED) { Util.Pair data = new Util.Pair<>(race.getRaceName(), null); int position = mRaceAdapter.add(data); if (position >= 0) { diff --git a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/WindHelper.java b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/WindHelper.java index 3368d5f8aa6..268121450cd 100644 --- a/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/WindHelper.java +++ b/mobile/com.sap.sailing.racecommittee.app/src/com/sap/sailing/racecommittee/app/utils/WindHelper.java @@ -87,13 +87,12 @@ public class WindHelper { boolean matchingFleetName = fleetName != null && fleetName.equals(triple.getC()); boolean matchingRaceName = raceName != null && raceName.equals(race.getRaceName()); if (matchingLeaderboardName && matchingFleetName && matchingRaceName){ - if (!raceState.isNull("trackedRaceId")){ + if (raceState.getBoolean("trackedRaceLinked")){ isTracked = true; break; } } } - } catch (JSONException e) { Log.e(TAG, "Failed to parse contents of the server response: " + e.getMessage()); }