mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-11-14 22:43:57 +00:00
Merge branch 'master' into bug3949
This commit is contained in:
commit
695a22448d
62 files changed
+588
-470
No files matched your search
@@ -547,7 +547,7 @@ if [[ "$@" == "build" ]] || [[ "$@" == "all" ]]; then
|
||||
echo "INFO: Activating proxy profile"
|
||||
extra="$extra -P no-debug.with-proxy"
|
||||
MAVEN_SETTINGS=$MAVEN_SETTINGS_PROXY
|
||||
ANDROID_OPTIONS="--proxy-host proxy --proxy-port 8080"
|
||||
ANDROID_OPTIONS="--proxy_host=proxy --proxy_port=8080"
|
||||
else
|
||||
extra="$extra -P no-debug.without-proxy"
|
||||
ANDROID_OPTIONS=""
|
||||
@@ -629,9 +629,9 @@ if [[ "$@" == "build" ]] || [[ "$@" == "all" ]]; then
|
||||
echo "ANDROID_HOME=$ANDROID_HOME"
|
||||
PATH=$PATH:$ANDROID_HOME/tools
|
||||
PATH=$PATH:$ANDROID_HOME/platform-tools
|
||||
ANDROID="$ANDROID_HOME/tools/android"
|
||||
if [ \! -x "$ANDROID" ]; then
|
||||
ANDROID="$ANDROID_HOME/tools/android.bat"
|
||||
SDK_MANAGER="$ANDROID_HOME/tools/bin/sdkmanager"
|
||||
if [ \! -x "$SDK_MANAGER" ]; then
|
||||
SDK_MANAGER="$SDK_MANAGER/tools/bin/sdkmanager.bat"
|
||||
fi
|
||||
|
||||
mobile_extra="-P -with-not-android-relevant -P with-mobile"
|
||||
@@ -662,18 +662,16 @@ if [[ "$@" == "build" ]] || [[ "$@" == "all" ]]; then
|
||||
TEST_API=18
|
||||
ANDROID_ABI=armeabi-v7a
|
||||
AVD_NAME="androidTest-${NOW}"
|
||||
echo "Updating Android SDK (tools)..." | tee -a $START_DIR/build.log
|
||||
echo yes | "$ANDROID" update sdk $ANDROID_OPTIONS --filter tools --no-ui --force --all > /dev/null
|
||||
echo "Updating Android SDK (platform-tools)..." | tee -a $START_DIR/build.log
|
||||
echo yes | "$ANDROID" update sdk $ANDROID_OPTIONS --filter platform-tools --no-ui --force --all > /dev/null
|
||||
echo "Updating Android SDK..." | tee -a $START_DIR/build.log
|
||||
"$SDK_MANAGER" --update $ANDROID_OPTIONS
|
||||
echo "Updating Android SDK (build-tools-${BUILD_TOOLS})..." | tee -a $START_DIR/build.log
|
||||
echo yes | "$ANDROID" update sdk $ANDROID_OPTIONS --filter build-tools-${BUILD_TOOLS} --no-ui --force --all > /dev/null
|
||||
"$SDK_MANAGER" $ANDROID_OPTIONS "build-tools;${BUILD_TOOLS}"
|
||||
echo "Updating Android SDK (android-${TARGET_API})..." | tee -a $START_DIR/build.log
|
||||
echo yes | "$ANDROID" update sdk $ANDROID_OPTIONS --filter android-${TARGET_API} --no-ui --force --all > /dev/null
|
||||
"$SDK_MANAGER" $ANDROID_OPTIONS "platforms;android-${TARGET_API}"
|
||||
echo "Updating Android SDK (extra-android-m2repository)..." | tee -a $START_DIR/build.log
|
||||
echo yes | "$ANDROID" update sdk $ANDROID_OPTIONS --filter extra-android-m2repository --no-ui --force --all > /dev/null
|
||||
"$SDK_MANAGER" $ANDROID_OPTIONS "extras;android;m2repository"
|
||||
echo "Updating Android SDK (extra-google-m2repository)..." | tee -a $START_DIR/build.log
|
||||
echo yes | "$ANDROID" update sdk $ANDROID_OPTIONS --filter extra-google-m2repository --no-ui --force --all > /dev/null
|
||||
"$SDK_MANAGER" $ANDROID_OPTIONS "extras;google;m2repository"
|
||||
|
||||
echo "Using following command for apps build: mvn $mobile_extra -DargLine=\"$APP_PARAMETERS\" -fae -s $MAVEN_SETTINGS $clean install"
|
||||
echo "Maven version used: `mvn --version`"
|
||||
|
||||
+5
@@ -438,4 +438,9 @@ public abstract class AbstractLeaderboardDTO implements Serializable {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
}
|
||||
+1
-3
@@ -201,9 +201,7 @@ extends TrackImpl<EventT> implements AbstractLog<EventT, VisitorT> {
|
||||
try {
|
||||
event.accept(listener);
|
||||
} catch (Throwable t) {
|
||||
logger.log(Level.SEVERE, "RaceLogEventVisitor " + listener + " threw exception " + t.getMessage());
|
||||
logger.throwing(RaceLogImpl.class.getName(), "notifyListenersAboutReceive(RaceLogEvent)", t);
|
||||
t.printStackTrace();
|
||||
logger.log(Level.SEVERE, "RaceLogEventVisitor " + listener + " threw exception " + t.getMessage(), t);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+24
-24
@@ -567,39 +567,39 @@ public class DomainFactoryImpl implements DomainFactory {
|
||||
public Iterable<IControlPoint> getControlPointsForCourseArea(IEvent tracTracEvent, String tracTracCourseAreaName) {
|
||||
final Set<IControlPoint> result = new HashSet<>();
|
||||
for (final IControl control : getControlsForCourseArea(tracTracEvent, tracTracCourseAreaName)) {
|
||||
result.addAll(control.getControlPoints());
|
||||
result.addAll(control.getControlPoints());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Iterable<IControl> getControlsForCourseArea(IEvent tracTracEvent, String tracTracCourseAreaName) {
|
||||
final Set<IControl> result = new HashSet<>();
|
||||
if (tracTracCourseAreaName != null) {
|
||||
for (final IControl control : tracTracEvent.getControls()) {
|
||||
if (control.getCourseArea() != null && control.getCourseArea().equals(tracTracCourseAreaName)) {
|
||||
result.add(control);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
final Set<IControl> result = new HashSet<>();
|
||||
if (tracTracCourseAreaName != null) {
|
||||
for (final IControl control : tracTracEvent.getControls()) {
|
||||
if (control.getCourseArea() != null && control.getCourseArea().equals(tracTracCourseAreaName)) {
|
||||
result.add(control);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public ControlPoint getExistingControlWithTwoMarks(Iterable<IControl> candidates, Mark first, Mark second) {
|
||||
final Set<Mark> pairOfMarksToFind = new HashSet<>();
|
||||
pairOfMarksToFind.add(first);
|
||||
pairOfMarksToFind.add(second);
|
||||
for (final IControl control : candidates) {
|
||||
TracTracControlPoint cp = new ControlPointAdapter(control);
|
||||
Set<Mark> marksInExistingControlPoint = new HashSet<>();
|
||||
final ControlPoint controlPoint = getOrCreateControlPoint(cp);
|
||||
Util.addAll(controlPoint.getMarks(), marksInExistingControlPoint);
|
||||
if (marksInExistingControlPoint.equals(pairOfMarksToFind)) {
|
||||
return controlPoint;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
final Set<Mark> pairOfMarksToFind = new HashSet<>();
|
||||
pairOfMarksToFind.add(first);
|
||||
pairOfMarksToFind.add(second);
|
||||
for (final IControl control : candidates) {
|
||||
TracTracControlPoint cp = new ControlPointAdapter(control);
|
||||
Set<Mark> marksInExistingControlPoint = new HashSet<>();
|
||||
final ControlPoint controlPoint = getOrCreateControlPoint(cp);
|
||||
Util.addAll(controlPoint.getMarks(), marksInExistingControlPoint);
|
||||
if (marksInExistingControlPoint.equals(pairOfMarksToFind)) {
|
||||
return controlPoint;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+23
-22
@@ -82,27 +82,28 @@ public class TracTracCourseDesignUpdateHandler extends UpdateHandler implements
|
||||
}
|
||||
|
||||
private CourseBase replaceControlPointsByMatchingExistingControlPoints(CourseBase courseDesign) {
|
||||
final Iterable<IControl> candidates = domainFactory.getControlsForCourseArea(tractracRace.getEvent(), tractracRace.getCourseArea());
|
||||
final CourseBase result = new CourseDataImpl(courseDesign.getName());
|
||||
int zeroBasedPosition = 0;
|
||||
boolean changed = false;
|
||||
for (final Waypoint waypoint : courseDesign.getWaypoints()) {
|
||||
if (Util.size(waypoint.getMarks()) > 1) {
|
||||
final Iterator<Mark> markIter = waypoint.getMarks().iterator();
|
||||
final Mark first = markIter.next();
|
||||
final Mark second = markIter.next();
|
||||
final ControlPoint existingControlPoint = domainFactory.getExistingControlWithTwoMarks(candidates, first, second);
|
||||
if (existingControlPoint == null) {
|
||||
result.addWaypoint(zeroBasedPosition++, waypoint);
|
||||
} else {
|
||||
result.addWaypoint(zeroBasedPosition++,
|
||||
domainFactory.getBaseDomainFactory().createWaypoint(existingControlPoint, waypoint.getPassingInstructions()));
|
||||
changed = true;
|
||||
}
|
||||
} else {
|
||||
result.addWaypoint(zeroBasedPosition++, waypoint);
|
||||
}
|
||||
}
|
||||
return changed ? result : courseDesign;
|
||||
final Iterable<IControl> candidates = domainFactory.getControlsForCourseArea(tractracRace.getEvent(), tractracRace.getCourseArea());
|
||||
final CourseBase result = new CourseDataImpl(courseDesign.getName());
|
||||
int zeroBasedPosition = 0;
|
||||
boolean changed = false;
|
||||
for (final Waypoint waypoint : courseDesign.getWaypoints()) {
|
||||
if (Util.size(waypoint.getMarks()) > 1) {
|
||||
final Iterator<Mark> markIter = waypoint.getMarks().iterator();
|
||||
final Mark first = markIter.next();
|
||||
final Mark second = markIter.next();
|
||||
final ControlPoint existingControlPoint = domainFactory.getExistingControlWithTwoMarks(candidates,
|
||||
first, second);
|
||||
if (existingControlPoint == null) {
|
||||
result.addWaypoint(zeroBasedPosition++, waypoint);
|
||||
} else {
|
||||
result.addWaypoint(zeroBasedPosition++, domainFactory.getBaseDomainFactory()
|
||||
.createWaypoint(existingControlPoint, waypoint.getPassingInstructions()));
|
||||
changed = true;
|
||||
}
|
||||
} else {
|
||||
result.addWaypoint(zeroBasedPosition++, waypoint);
|
||||
}
|
||||
}
|
||||
return changed ? result : courseDesign;
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -25,11 +25,12 @@ import com.sap.sailing.gwt.home.desktop.partials.racelist.RaceListColumnFactory.
|
||||
import com.sap.sailing.gwt.home.desktop.partials.racelist.RaceListResources.LocalCss;
|
||||
import com.sap.sailing.gwt.home.desktop.places.event.EventView;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterValueChangeHandler;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterValueProvider;
|
||||
import com.sap.sailing.gwt.ui.leaderboard.SortedCellTable;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
|
||||
public abstract class AbstractRaceList<T extends RaceMetadataDTO<? extends AbstractWindDTO>>
|
||||
extends Composite implements FilterValueChangeHandler<SimpleRaceMetadataDTO, SimpleCompetitorDTO> {
|
||||
public abstract class AbstractRaceList<T extends RaceMetadataDTO<? extends AbstractWindDTO>> extends Composite
|
||||
implements FilterValueProvider<SimpleCompetitorDTO>, FilterValueChangeHandler<SimpleRaceMetadataDTO> {
|
||||
|
||||
private static final LocalCss CSS = RaceListResources.INSTANCE.css();
|
||||
|
||||
|
||||
-33
@@ -4,39 +4,6 @@
|
||||
xmlns:dp="urn:import:com.sap.sailing.gwt.home.desktop.partials"
|
||||
xmlns:e="urn:import:com.sap.sailing.gwt.home.desktop.places.event.multiregatta">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
|
||||
<ui:style>
|
||||
.header {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.mainHeader {
|
||||
width: 66.6666666666667%;
|
||||
}
|
||||
.sharingHeader {
|
||||
width: 33.3333333333333%;
|
||||
float: right;
|
||||
padding: 0 1rem;
|
||||
position:
|
||||
relative;
|
||||
padding: 1.333333333333333em 0;
|
||||
text-align: right;
|
||||
background-color: maroon;
|
||||
height: 2rem;
|
||||
}
|
||||
.breadcrumb, .intro {
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
}
|
||||
.breadcrumb {
|
||||
font-size: 0.866666666666667em;
|
||||
font-weight: 600;
|
||||
}
|
||||
.intro {
|
||||
height: 5em;
|
||||
}
|
||||
</ui:style>
|
||||
<g:HTMLPanel>
|
||||
<c:TabPanel ui:field="tabPanelUi">
|
||||
<c:header>
|
||||
|
||||
+23
-7
@@ -1,11 +1,13 @@
|
||||
package com.sap.sailing.gwt.home.desktop.places.event.regatta;
|
||||
|
||||
import com.google.gwt.core.shared.GWT;
|
||||
import com.google.gwt.event.logical.shared.AttachEvent;
|
||||
import com.google.gwt.event.logical.shared.AttachEvent.Handler;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.sap.sailing.gwt.home.desktop.places.Consumer;
|
||||
import com.sap.sailing.gwt.settings.client.leaderboard.LeaderboardPanelLifecycle;
|
||||
import com.sap.sailing.gwt.settings.client.leaderboard.LeaderboardSettings;
|
||||
import com.sap.sailing.gwt.settings.client.leaderboard.LeaderboardSettingsFactory;
|
||||
import com.sap.sailing.gwt.settings.client.leaderboard.LeaderboardUrlSettings;
|
||||
import com.sap.sailing.gwt.settings.client.utils.StoredSettingsLocationFactory;
|
||||
import com.sap.sailing.gwt.ui.client.LeaderboardUpdateListener;
|
||||
@@ -13,10 +15,11 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel;
|
||||
import com.sap.sse.gwt.client.mutationobserver.ElementSizeMutationObserver;
|
||||
import com.sap.sse.gwt.client.mutationobserver.ElementSizeMutationObserver.DomMutationCallback;
|
||||
import com.sap.sse.gwt.client.shared.settings.ComponentContext;
|
||||
import com.sap.sse.gwt.client.shared.settings.DefaultOnSettingsLoadedCallback;
|
||||
import com.sap.sse.gwt.client.shared.settings.PipelineLevel;
|
||||
import com.sap.sse.gwt.shared.GwtHttpRequestUtils;
|
||||
import com.sap.sse.security.ui.client.UserService;
|
||||
import com.sap.sse.security.ui.settings.ComponentContextWithSettingsStorageAndAdditionalSettingsLayers.OnSettingsReloadedCallback;
|
||||
import com.sap.sse.security.ui.settings.PlaceBasedComponentContextWithSettingsStorage;
|
||||
import com.sap.sse.security.ui.settings.StoredSettingsLocation;
|
||||
|
||||
@@ -37,7 +40,7 @@ public abstract class SharedLeaderboardRegattaTabView<T extends AbstractEventReg
|
||||
boolean autoExpandLastRaceColumn = GwtHttpRequestUtils.getBooleanParameter(
|
||||
LeaderboardUrlSettings.PARAM_AUTO_EXPAND_LAST_RACE_COLUMN, false);
|
||||
|
||||
final ComponentContext<LeaderboardSettings> componentContext = createLeaderboardComponentContext(leaderboardName, userService,
|
||||
final PlaceBasedComponentContextWithSettingsStorage<LeaderboardSettings> componentContext = createLeaderboardComponentContext(leaderboardName, userService,
|
||||
placeToken);
|
||||
componentContext.getInitialSettings(new DefaultOnSettingsLoadedCallback<LeaderboardSettings>() {
|
||||
@Override
|
||||
@@ -64,10 +67,23 @@ public abstract class SharedLeaderboardRegattaTabView<T extends AbstractEventReg
|
||||
ElementSizeMutationObserver observer = new ElementSizeMutationObserver(new DomMutationCallback() {
|
||||
@Override
|
||||
public void onSizeChanged(int newWidth, int newHeight) {
|
||||
if(newWidth > 0 && newHeight > 0 && newWidth > 1500 && initialLeaderboardSizeCalculated == false) {
|
||||
int numberOfLastRacesToShow = (1500 - 600) / 50;
|
||||
leaderboardPanel.setRaceColumnSelectionToLastNStrategy(numberOfLastRacesToShow);
|
||||
if (!initialLeaderboardSizeCalculated && leaderboardPanel.getLeaderboard() != null) {
|
||||
initialLeaderboardSizeCalculated = true;
|
||||
if (newWidth > 0 && newHeight > 0 && newWidth > 1500) {
|
||||
final int numberOfLastRacesToShow = (1500 - 600) / 50;
|
||||
final LeaderboardSettings newSettings = LeaderboardSettingsFactory.getInstance()
|
||||
.createNewDefaultSettingsWithLastN(numberOfLastRacesToShow);
|
||||
|
||||
componentContext.addAdditionalSettingsLayerForComponent(leaderboardPanel,
|
||||
PipelineLevel.SYSTEM_DEFAULTS, newSettings,
|
||||
new OnSettingsReloadedCallback<LeaderboardSettings>() {
|
||||
@Override
|
||||
public void onSettingsReloaded(LeaderboardSettings patchedSettings) {
|
||||
GWT.log("Switching to last_n mode with settings" + patchedSettings);
|
||||
leaderboardPanel.updateSettings(patchedSettings);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -78,12 +94,12 @@ public abstract class SharedLeaderboardRegattaTabView<T extends AbstractEventReg
|
||||
});
|
||||
}
|
||||
|
||||
protected ComponentContext<LeaderboardSettings> createLeaderboardComponentContext(String leaderboardName, UserService userService,
|
||||
protected PlaceBasedComponentContextWithSettingsStorage<LeaderboardSettings> createLeaderboardComponentContext(String leaderboardName, UserService userService,
|
||||
String placeToken) {
|
||||
final LeaderboardPanelLifecycle lifecycle = new LeaderboardPanelLifecycle(null, StringMessages.INSTANCE);
|
||||
final StoredSettingsLocation storageDefinition = StoredSettingsLocationFactory.createStoredSettingsLocatorForEventRegattaLeaderboard(leaderboardName);
|
||||
|
||||
final ComponentContext<LeaderboardSettings> componentContext = new PlaceBasedComponentContextWithSettingsStorage<>(
|
||||
final PlaceBasedComponentContextWithSettingsStorage<LeaderboardSettings> componentContext = new PlaceBasedComponentContextWithSettingsStorage<>(
|
||||
lifecycle, userService, storageDefinition, placeToken);
|
||||
return componentContext;
|
||||
}
|
||||
|
||||
-33
@@ -4,39 +4,6 @@
|
||||
xmlns:dp="urn:import:com.sap.sailing.gwt.home.desktop.partials"
|
||||
xmlns:e="urn:import:com.sap.sailing.gwt.home.desktop.places.event.regatta">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
|
||||
<ui:style>
|
||||
.header {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.mainHeader {
|
||||
width: 66.6666666666667%;
|
||||
}
|
||||
.sharingHeader {
|
||||
width: 33.3333333333333%;
|
||||
float: right;
|
||||
padding: 0 1rem;
|
||||
position:
|
||||
relative;
|
||||
padding: 1.333333333333333em 0;
|
||||
text-align: right;
|
||||
background-color: maroon;
|
||||
height: 2rem;
|
||||
}
|
||||
.breadcrumb, .intro {
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
}
|
||||
.breadcrumb {
|
||||
font-size: 0.866666666666667em;
|
||||
font-weight: 600;
|
||||
}
|
||||
.intro {
|
||||
height: 5em;
|
||||
}
|
||||
</ui:style>
|
||||
<g:HTMLPanel>
|
||||
<c:TabPanel ui:field="tabPanelUi">
|
||||
<c:header>
|
||||
|
||||
+21
-4
@@ -44,6 +44,7 @@ import com.sap.sailing.gwt.home.desktop.places.event.regatta.EventRegattaView.Pr
|
||||
import com.sap.sailing.gwt.home.desktop.places.event.regatta.RegattaTabView;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterPresenter;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterValueChangeHandler;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterValueProvider;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterWidget;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.RacesByCompetitorTextBoxFilter;
|
||||
import com.sap.sailing.gwt.home.shared.partials.placeholder.InfoPlaceholder;
|
||||
@@ -130,8 +131,10 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView<Reg
|
||||
}
|
||||
}, new GetRegattaWithProgressAction(eventId, regattaId));
|
||||
addRacesAction(liveRacesListUi.getRefreshable(), new GetLiveRacesForRegattaAction(eventId, regattaId), Navigation.SORT_LIST_FORMAT);
|
||||
filterPresenter.addProvider(Navigation.SORT_LIST_FORMAT, liveRacesListUi.getRaceList());
|
||||
filterPresenter.addHandler(Navigation.SORT_LIST_FORMAT, liveRacesListUi.getRaceList());
|
||||
addRacesAction(raceListContainerUi, new GetFinishedRacesAction(eventId, regattaId), Navigation.SORT_LIST_FORMAT);
|
||||
filterPresenter.addProvider(Navigation.SORT_LIST_FORMAT, finishedRacesList);
|
||||
filterPresenter.addHandler(Navigation.SORT_LIST_FORMAT, finishedRacesList);
|
||||
|
||||
listNavigationPanelUi.addAction(Navigation.SORT_LIST_FORMAT, true);
|
||||
@@ -139,6 +142,7 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView<Reg
|
||||
RegattaCompetitionPresenter competitionPresenter = new DesktopRegattaCompetitionPresenter();
|
||||
addRacesAction(competitionPresenter, new GetCompetitionFormatRacesAction(eventId, regattaId),
|
||||
Navigation.COMPETITION_FORMAT);
|
||||
filterPresenter.addProvider(Navigation.COMPETITION_FORMAT, competitionPresenter);
|
||||
filterPresenter.addHandler(Navigation.COMPETITION_FORMAT, competitionPresenter);
|
||||
}
|
||||
|
||||
@@ -282,19 +286,32 @@ public class RegattaRacesTabView extends Composite implements RegattaTabView<Reg
|
||||
}
|
||||
|
||||
private class RegattaRacesTabViewFilterPresenter extends FilterPresenter<SimpleRaceMetadataDTO, SimpleCompetitorDTO> {
|
||||
private final Map<Navigation, List<FilterValueChangeHandler<SimpleRaceMetadataDTO, SimpleCompetitorDTO>>> handlersByTab = new HashMap<>();
|
||||
|
||||
private final Map<Navigation, List<FilterValueProvider<SimpleCompetitorDTO>>> providersByTab = new HashMap<>();
|
||||
private final Map<Navigation, List<FilterValueChangeHandler<SimpleRaceMetadataDTO>>> handlersByTab = new HashMap<>();
|
||||
|
||||
private RegattaRacesTabViewFilterPresenter(FilterWidget<SimpleRaceMetadataDTO, SimpleCompetitorDTO> filterWidget) {
|
||||
super(filterWidget);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<FilterValueChangeHandler<SimpleRaceMetadataDTO, SimpleCompetitorDTO>> getCurrentValueChangeHandlers() {
|
||||
protected List<FilterValueProvider<SimpleCompetitorDTO>> getCurrentValueProviders() {
|
||||
return providersByTab.get(currentlySelectedTab);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<FilterValueChangeHandler<SimpleRaceMetadataDTO>> getCurrentValueChangeHandlers() {
|
||||
return handlersByTab.get(currentlySelectedTab);
|
||||
}
|
||||
|
||||
private void addHandler(Navigation assosiatedTab, FilterValueChangeHandler<SimpleRaceMetadataDTO, SimpleCompetitorDTO> handler) {
|
||||
List<FilterValueChangeHandler<SimpleRaceMetadataDTO, SimpleCompetitorDTO>> list = handlersByTab.get(assosiatedTab);
|
||||
private void addProvider(Navigation assosiatedTab, FilterValueProvider<SimpleCompetitorDTO> provider) {
|
||||
List<FilterValueProvider<SimpleCompetitorDTO>> list = providersByTab.get(assosiatedTab);
|
||||
if (list == null) this.providersByTab.put(assosiatedTab, list = new ArrayList<>());
|
||||
list.add(provider);
|
||||
}
|
||||
|
||||
private void addHandler(Navigation assosiatedTab, FilterValueChangeHandler<SimpleRaceMetadataDTO> handler) {
|
||||
List<FilterValueChangeHandler<SimpleRaceMetadataDTO>> list = handlersByTab.get(assosiatedTab);
|
||||
if (list == null) this.handlersByTab.put(assosiatedTab, list = new ArrayList<>());
|
||||
list.add(handler);
|
||||
super.addHandler(handler);
|
||||
|
||||
-3
@@ -5,9 +5,6 @@
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
|
||||
<ui:with field="res" type="com.sap.sailing.gwt.common.client.SharedResources" />
|
||||
<ui:style>
|
||||
.events-overview-navigation {
|
||||
font-size: 1rem;
|
||||
}
|
||||
.breadcrumb {
|
||||
font-size: 1rem;
|
||||
/* @alternate */ font-size: 0.866666666666667em;
|
||||
|
||||
-32
@@ -4,38 +4,6 @@
|
||||
xmlns:dp="urn:import:com.sap.sailing.gwt.home.desktop.partials"
|
||||
xmlns:s="urn:import:com.sap.sailing.gwt.home.desktop.places.fakeseries">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
|
||||
<ui:style>
|
||||
.header {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.mainHeader {
|
||||
width: 66.6666666666667%;
|
||||
}
|
||||
.sharingHeader {
|
||||
width: 33.3333333333333%;
|
||||
float: right;
|
||||
padding: 0 1rem;
|
||||
position: relative;
|
||||
padding: 1.333333333333333em 0;
|
||||
text-align: right;
|
||||
background-color: maroon;
|
||||
height: 2rem;
|
||||
}
|
||||
.breadcrumb, .intro {
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
}
|
||||
.breadcrumb {
|
||||
font-size: 0.866666666666667em;
|
||||
font-weight: 600;
|
||||
}
|
||||
.intro {
|
||||
height: 5em;
|
||||
}
|
||||
</ui:style>
|
||||
<g:HTMLPanel>
|
||||
<c:TabPanel ui:field="tabPanelUi">
|
||||
<c:header>
|
||||
|
||||
-32
@@ -4,38 +4,6 @@
|
||||
xmlns:uh="urn:import:com.sap.sse.security.ui.userprofile.desktop.userheader"
|
||||
xmlns:s="urn:import:com.sap.sailing.gwt.home.desktop.places.user.profile">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
|
||||
<ui:style>
|
||||
.header {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
.mainHeader {
|
||||
width: 66.6666666666667%;
|
||||
}
|
||||
.sharingHeader {
|
||||
width: 33.3333333333333%;
|
||||
float: right;
|
||||
padding: 0 1rem;
|
||||
position: relative;
|
||||
padding: 1.333333333333333em 0;
|
||||
text-align: right;
|
||||
background-color: maroon;
|
||||
height: 2rem;
|
||||
}
|
||||
.breadcrumb, .intro {
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
}
|
||||
.breadcrumb {
|
||||
font-size: 0.866666666666667em;
|
||||
font-weight: 600;
|
||||
}
|
||||
.intro {
|
||||
height: 5em;
|
||||
}
|
||||
</ui:style>
|
||||
<g:HTMLPanel>
|
||||
<c:TabPanel ui:field="tabPanelUi">
|
||||
<c:header>
|
||||
|
||||
+10
-1
@@ -15,11 +15,13 @@ import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.domain.common.impl.InvertibleComparatorAdapter;
|
||||
import com.sap.sailing.gwt.common.theme.component.celltable.DesignedCellTableResources;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.UserSettingsByKeyTextBoxFilter;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.settings.UserSettingsEntry;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.settings.UserSettingsView;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.leaderboard.SortedCellTable;
|
||||
import com.sap.sse.common.Util.Function;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
import com.sap.sse.common.util.NaturalComparator;
|
||||
|
||||
/**
|
||||
@@ -35,6 +37,8 @@ public class UserSettings extends Composite implements UserSettingsView {
|
||||
@UiField
|
||||
DivElement notificationsTextUi;
|
||||
@UiField
|
||||
UserSettingsByKeyTextBoxFilter userSettingsFilterUi;
|
||||
@UiField
|
||||
DivElement tableWrapper;
|
||||
@UiField(provided = true)
|
||||
final SortedCellTable<UserSettingsEntry> userSettingsTable = new SortedCellTable<>(0,
|
||||
@@ -92,10 +96,15 @@ public class UserSettings extends Composite implements UserSettingsView {
|
||||
userSettingsTable.addColumn(showColumn, "", null, false);
|
||||
deleteColumn.setCellStyleNames(DesignedCellTableResources.INSTANCE.cellTableStyle().buttonCell());
|
||||
userSettingsTable.addColumn(deleteColumn, "", null, false);
|
||||
|
||||
userSettingsFilterUi.addFilterValueChangeHandler(filter -> presenter.updateData());
|
||||
presenter.setView(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Filter<UserSettingsEntry> getFilter() {
|
||||
return userSettingsFilterUi.getFilter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEntries(List<UserSettingsEntry> entries) {
|
||||
if (entries.isEmpty()) {
|
||||
|
||||
+6
-1
@@ -1,7 +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:g="urn:import:com.google.gwt.user.client.ui"
|
||||
xmlns:um="urn:import:com.sap.sailing.gwt.home.shared.usermanagement.decorator"
|
||||
xmlns:ms="urn:import:com.sap.sailing.gwt.home.shared.partials.multiselection" xmlns:c="urn:import:com.google.gwt.user.cellview.client">
|
||||
xmlns:ms="urn:import:com.sap.sailing.gwt.home.shared.partials.multiselection"
|
||||
xmlns:f="urn:import:com.sap.sailing.gwt.home.shared.partials.filter"
|
||||
xmlns:c="urn:import:com.google.gwt.user.cellview.client">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
|
||||
<ui:with field="res" type="com.sap.sailing.gwt.common.client.SharedResources" />
|
||||
<ui:style>
|
||||
@@ -13,6 +15,9 @@
|
||||
<div ui:field="notificationsTextUi" class="{res.mediaCss.column} {res.mediaCss.medium12} {res.mainCss.spacermargintopsmall} {res.mainCss.spacermarginbottomsmall}">
|
||||
<ui:text from="{i18n.userNotificationsOnlyIfMailAddressIsVerified}" />
|
||||
</div>
|
||||
<div class="{res.mediaCss.column} {res.mediaCss.mediumoffset6} {res.mediaCss.medium6}">
|
||||
<f:UserSettingsByKeyTextBoxFilter ui:field="userSettingsFilterUi"/>
|
||||
</div>
|
||||
<div ui:field="tableWrapper" class="{res.mediaCss.column} {res.mediaCss.small12} {res.mainCss.spacermargintopmediumsmall}">
|
||||
<c:CellTable ui:field="userSettingsTable" addStyleNames="{style.table}" />
|
||||
</div>
|
||||
|
||||
-12
@@ -29,18 +29,6 @@ public class EventHeader extends Composite {
|
||||
@UiField DivElement eventDateUi;
|
||||
@UiField DivElement eventLocationUi;
|
||||
|
||||
public EventHeader(EventViewDTO event) {
|
||||
this(event, (String)null);
|
||||
}
|
||||
|
||||
public EventHeader(EventViewDTO event, String optionalRegattaDisplayName) {
|
||||
this(event, optionalRegattaDisplayName, null);
|
||||
}
|
||||
|
||||
public EventHeader(EventViewDTO event, PlaceNavigation<?> logoNavigation) {
|
||||
this(event, null, logoNavigation);
|
||||
}
|
||||
|
||||
public EventHeader(EventViewDTO event, String optionalRegattaDisplayName, PlaceNavigation<?> logoNavigation) {
|
||||
EventHeaderResources.INSTANCE.css().ensureInjected();
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
|
||||
+17
-7
@@ -13,6 +13,7 @@ import com.sap.sailing.gwt.home.mobile.places.event.EventViewBase;
|
||||
import com.sap.sailing.gwt.home.mobile.places.event.overview.AbstractEventOverview;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterPresenter;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterValueChangeHandler;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterValueProvider;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterWidget;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.RegattaByLeaderboardGroupNameFilter;
|
||||
import com.sap.sailing.gwt.home.shared.partials.regattalist.RegattaListPresenter;
|
||||
@@ -38,8 +39,8 @@ public class MultiRegattaViewImpl extends AbstractEventOverview {
|
||||
new RegattaListPresenter<RegattasAndLiveRacesDTO>(regattaStatusUi);
|
||||
RegattaByLeaderboardGroupNameFilter leaderboardGroupNameFilter = new RegattaByLeaderboardGroupNameFilter();
|
||||
regattaStatusUi.setFilterSectionWidget(leaderboardGroupNameFilter);
|
||||
MultiRegattaViewImplFilterPresenter filterPresenter =
|
||||
new MultiRegattaViewImplFilterPresenter(leaderboardGroupNameFilter, regattaListPresenter);
|
||||
MultiRegattaViewImplFilterPresenter filterPresenter = new MultiRegattaViewImplFilterPresenter(
|
||||
leaderboardGroupNameFilter, regattaListPresenter, regattaListPresenter);
|
||||
container.add(regattaStatusUi);
|
||||
refreshManager.add(filterPresenter.getRefreshableWidgetWrapper(
|
||||
regattaListPresenter.getRefreshableWidgetWrapper(regattaStatusUi)),
|
||||
@@ -47,18 +48,27 @@ public class MultiRegattaViewImpl extends AbstractEventOverview {
|
||||
}
|
||||
|
||||
private class MultiRegattaViewImplFilterPresenter extends FilterPresenter<RegattaMetadataDTO, String> {
|
||||
private final List<FilterValueChangeHandler<RegattaMetadataDTO, String>> valueChangeHandler;
|
||||
|
||||
private final List<FilterValueProvider<String>> valueProviders;
|
||||
private final List<FilterValueChangeHandler<RegattaMetadataDTO>> valueChangeHandlers;
|
||||
|
||||
public MultiRegattaViewImplFilterPresenter(FilterWidget<RegattaMetadataDTO, String> filterWidget,
|
||||
FilterValueChangeHandler<RegattaMetadataDTO, String> valueChangeHandler) {
|
||||
FilterValueProvider<String> valueProvider,
|
||||
FilterValueChangeHandler<RegattaMetadataDTO> valueChangeHandler) {
|
||||
super(filterWidget);
|
||||
this.valueChangeHandler = Arrays.asList(valueChangeHandler);
|
||||
this.valueProviders = Arrays.asList(valueProvider);
|
||||
this.valueChangeHandlers = Arrays.asList(valueChangeHandler);
|
||||
super.addHandler(valueChangeHandler);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<FilterValueChangeHandler<RegattaMetadataDTO, String>> getCurrentValueChangeHandlers() {
|
||||
return valueChangeHandler;
|
||||
protected List<FilterValueProvider<String>> getCurrentValueProviders() {
|
||||
return valueProviders;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<FilterValueChangeHandler<RegattaMetadataDTO>> getCurrentValueChangeHandlers() {
|
||||
return valueChangeHandlers;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+19
-8
@@ -21,6 +21,7 @@ import com.sap.sailing.gwt.home.mobile.places.QuickfinderPresenter;
|
||||
import com.sap.sailing.gwt.home.mobile.places.event.AbstractEventView;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterPresenter;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterValueChangeHandler;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterValueProvider;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterWidget;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.RacesByCompetitorTextBoxFilter;
|
||||
import com.sap.sailing.gwt.home.shared.partials.placeholder.InfoPlaceholder;
|
||||
@@ -42,12 +43,13 @@ public class RacesViewImpl extends AbstractEventView<RacesView.Presenter> implem
|
||||
setViewContent(uiBinder.createAndBindUi(this));
|
||||
if(presenter.getRegatta() != null) {
|
||||
RegattaCompetitionPresenter competitionPresenter = new MobileRegattaCompetitionPresenter();
|
||||
RacesViewImplFilterPresenter filterPresenter = new RacesViewImplFilterPresenter(competitorFilterUi, competitionPresenter);
|
||||
refreshManager.add(filterPresenter.getRefreshableWidgetWrapper(competitionPresenter), new GetCompetitionFormatRacesAction(getEventId(), getRegattaId()));
|
||||
RacesViewImplFilterPresenter filterPresenter = new RacesViewImplFilterPresenter(competitorFilterUi,
|
||||
competitionPresenter, competitionPresenter);
|
||||
refreshManager.add(filterPresenter.getRefreshableWidgetWrapper(competitionPresenter),
|
||||
new GetCompetitionFormatRacesAction(getEventId(), getRegattaId()));
|
||||
} else {
|
||||
setViewContent(new InfoPlaceholder(StringMessages.INSTANCE.noDataForEvent()));
|
||||
}
|
||||
competitorFilterUi.removeFromParent();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -72,18 +74,27 @@ public class RacesViewImpl extends AbstractEventView<RacesView.Presenter> implem
|
||||
}
|
||||
|
||||
private class RacesViewImplFilterPresenter extends FilterPresenter<SimpleRaceMetadataDTO, SimpleCompetitorDTO> {
|
||||
private final List<FilterValueChangeHandler<SimpleRaceMetadataDTO, SimpleCompetitorDTO>> valueChangeHandler;
|
||||
|
||||
private final List<FilterValueProvider<SimpleCompetitorDTO>> valueProviders;
|
||||
private final List<FilterValueChangeHandler<SimpleRaceMetadataDTO>> valueChangeHandlers;
|
||||
|
||||
public RacesViewImplFilterPresenter(FilterWidget<SimpleRaceMetadataDTO, SimpleCompetitorDTO> filterWidget,
|
||||
FilterValueChangeHandler<SimpleRaceMetadataDTO, SimpleCompetitorDTO> valueChangeHandler) {
|
||||
FilterValueProvider<SimpleCompetitorDTO> valueProvider,
|
||||
FilterValueChangeHandler<SimpleRaceMetadataDTO> valueChangeHandler) {
|
||||
super(filterWidget);
|
||||
this.valueChangeHandler = Arrays.asList(valueChangeHandler);
|
||||
this.valueProviders = Arrays.asList(valueProvider);
|
||||
this.valueChangeHandlers = Arrays.asList(valueChangeHandler);
|
||||
super.addHandler(valueChangeHandler);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<FilterValueChangeHandler<SimpleRaceMetadataDTO, SimpleCompetitorDTO>> getCurrentValueChangeHandlers() {
|
||||
return valueChangeHandler;
|
||||
protected List<FilterValueProvider<SimpleCompetitorDTO>> getCurrentValueProviders() {
|
||||
return valueProviders;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<FilterValueChangeHandler<SimpleRaceMetadataDTO>> getCurrentValueChangeHandlers() {
|
||||
return valueChangeHandlers;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+10
@@ -9,9 +9,11 @@ import com.google.gwt.uibinder.client.UiField;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.FlowPanel;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.UserSettingsByKeyTextBoxFilter;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.settings.UserSettingsEntry;
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.settings.UserSettingsView;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
|
||||
/**
|
||||
* Implementation of {@link UserSettingsView} where users can change their preferred selections and notifications.
|
||||
@@ -26,6 +28,8 @@ public class UserSettings extends Composite implements UserSettingsView {
|
||||
@UiField
|
||||
DivElement notificationsTextUi;
|
||||
@UiField
|
||||
UserSettingsByKeyTextBoxFilter userSettingsFilterUi;
|
||||
@UiField
|
||||
FlowPanel settingsContainerUi;
|
||||
|
||||
private final Presenter presenter;
|
||||
@@ -33,9 +37,15 @@ public class UserSettings extends Composite implements UserSettingsView {
|
||||
public UserSettings(UserSettingsView.Presenter presenter) {
|
||||
this.presenter = presenter;
|
||||
initWidget(uiBinder.createAndBindUi(this));
|
||||
userSettingsFilterUi.addFilterValueChangeHandler(filter -> presenter.updateData());
|
||||
presenter.setView(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Filter<UserSettingsEntry> getFilter() {
|
||||
return userSettingsFilterUi.getFilter();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setEntries(List<UserSettingsEntry> entries) {
|
||||
notificationsTextUi.setInnerText(entries.isEmpty() ? StringMessages.INSTANCE.noDataFound()
|
||||
|
||||
+5
-1
@@ -1,11 +1,15 @@
|
||||
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui">
|
||||
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" xmlns:g="urn:import:com.google.gwt.user.client.ui"
|
||||
xmlns:f="urn:import:com.sap.sailing.gwt.home.shared.partials.filter">
|
||||
<ui:with field="i18n" type="com.sap.sailing.gwt.ui.client.StringMessages" />
|
||||
<ui:with field="res" type="com.sap.sailing.gwt.common.client.SharedResources" />
|
||||
<g:HTMLPanel addStyleNames="{res.mediaCss.grid} {res.mainCss.spacermarginbottommediumsmall}">
|
||||
<div ui:field="notificationsTextUi" class="{res.mediaCss.column} {res.mediaCss.small12} {res.mainCss.spacermargintopsmall} {res.mainCss.spacermarginbottomsmall}">
|
||||
<ui:text from="{i18n.userNotificationsOnlyIfMailAddressIsVerified}" />
|
||||
</div>
|
||||
<div class="{res.mediaCss.column} {res.mediaCss.small12} {res.mainCss.spacermarginbottomsmall}">
|
||||
<f:UserSettingsByKeyTextBoxFilter ui:field="userSettingsFilterUi"/>
|
||||
</div>
|
||||
<g:FlowPanel ui:field="settingsContainerUi" addStyleNames="{res.mediaCss.column} {res.mediaCss.small12}" />
|
||||
</g:HTMLPanel>
|
||||
</ui:UiBinder>
|
||||
+20
-14
@@ -7,27 +7,33 @@ import com.google.gwt.event.shared.HandlerRegistration;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
|
||||
/**
|
||||
* Abstract implementation of {@link FilterWidget} holding a list of
|
||||
* {@link #addFilterValueChangeHandler(FilterValueChangeHandler) added} {@link FilterValueChangeHandler handlers} and
|
||||
* providing a {@link #notifyValueChangeHandlers() convenience method} to notify them.
|
||||
*
|
||||
* @param <T>
|
||||
* the actual type of values to be filtered
|
||||
* @param <C>
|
||||
* the actual type of values to select
|
||||
*/
|
||||
public abstract class AbstractFilterWidget<T, C> extends Composite implements FilterWidget<T, C> {
|
||||
|
||||
private final List<FilterValueChangeHandler<T, C>> valueChangeHandlers = new ArrayList<>();
|
||||
|
||||
private final List<FilterValueChangeHandler<T>> valueChangeHandlers = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public HandlerRegistration addFilterValueChangeHandler(final FilterValueChangeHandler<T, C> handler) {
|
||||
public HandlerRegistration addFilterValueChangeHandler(final FilterValueChangeHandler<T> handler) {
|
||||
valueChangeHandlers.add(handler);
|
||||
handler.onFilterValueChanged(getFilter());
|
||||
return new HandlerRegistration() {
|
||||
@Override
|
||||
public void removeHandler() {
|
||||
valueChangeHandlers.remove(handler);
|
||||
}
|
||||
};
|
||||
return () -> valueChangeHandlers.remove(handler);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convenience method to notify all {@link #addFilterValueChangeHandler(FilterValueChangeHandler) added}
|
||||
* {@link FilterValueChangeHandler handler}s.
|
||||
*/
|
||||
protected void notifyValueChangeHandlers() {
|
||||
Filter<T> filter = getFilter();
|
||||
for(FilterValueChangeHandler<T, C> valueChangeHandler : valueChangeHandlers) {
|
||||
valueChangeHandler.onFilterValueChanged(filter);
|
||||
}
|
||||
valueChangeHandlers.forEach(valueChangeHandler -> valueChangeHandler.onFilterValueChanged(filter));
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -26,7 +26,7 @@ public abstract class AbstractTextInputFilter<T, C> extends AbstractFilterWidget
|
||||
private void initTextInputWidget(Widget textInputWidget, String placeholderText, KeyUpHandler handler) {
|
||||
textInputWidget.getElement().setAttribute("placeholder", placeholderText);
|
||||
textInputWidget.addStyleName(FilterWidgetResources.INSTANCE.css().input_filter_text_input());
|
||||
textInputWidget.addHandler(handler, KeyUpEvent.getType());
|
||||
textInputWidget.addDomHandler(handler, KeyUpEvent.getType());
|
||||
containerUi.add(textInputWidget);
|
||||
}
|
||||
|
||||
|
||||
+6
-8
@@ -27,23 +27,21 @@ public abstract class FilterPresenter<T, C extends Comparable<C>> {
|
||||
this.filterWidget.asWidget().setVisible(false);
|
||||
}
|
||||
|
||||
protected abstract List<FilterValueChangeHandler<T, C>> getCurrentValueChangeHandlers();
|
||||
protected abstract List<FilterValueChangeHandler<T>> getCurrentValueChangeHandlers();
|
||||
|
||||
protected void addHandler(FilterValueChangeHandler<T, C> handler) {
|
||||
protected abstract List<FilterValueProvider<C>> getCurrentValueProviders();
|
||||
|
||||
protected void addHandler(FilterValueChangeHandler<T> handler) {
|
||||
this.filterWidget.addFilterValueChangeHandler(handler);
|
||||
}
|
||||
|
||||
public void update() {
|
||||
Set<C> filterableValues = new TreeSet<>();
|
||||
for (FilterValueChangeHandler<T, C> valueChangeHandler : getCurrentValueChangeHandlers()) {
|
||||
filterableValues.addAll(valueChangeHandler.getFilterableValues());
|
||||
}
|
||||
getCurrentValueProviders().forEach(provider -> filterableValues.addAll(provider.getFilterableValues()));
|
||||
this.filterWidget.asWidget().setVisible(!filterableValues.isEmpty());
|
||||
this.filterWidget.setSelectableValues(filterableValues);
|
||||
Filter<T> filter = filterableValues.isEmpty() ? alwaysMatchingFilter : this.filterWidget.getFilter();
|
||||
for (FilterValueChangeHandler<T, C> valueChangeHandler : getCurrentValueChangeHandlers()) {
|
||||
valueChangeHandler.onFilterValueChanged(filter);
|
||||
}
|
||||
getCurrentValueChangeHandlers().forEach(handler -> handler.onFilterValueChanged(filter));
|
||||
}
|
||||
|
||||
public <D extends DTO> RefreshableWidget<D> getRefreshableWidgetWrapper(final RefreshableWidget<D> wrappedWidget) {
|
||||
|
||||
+16
-6
@@ -1,13 +1,23 @@
|
||||
package com.sap.sailing.gwt.home.shared.partials.filter;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
|
||||
public interface FilterValueChangeHandler<T, C> {
|
||||
|
||||
/**
|
||||
* Handler interface for class which need to be informed about the value change of a {@link FilterWidget}.
|
||||
*
|
||||
* @param <T>
|
||||
* the actual type of values to be filtered
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface FilterValueChangeHandler<T> {
|
||||
|
||||
/**
|
||||
* Called if the value of the {@link FilterWidget widget}, where this {@link FilterValueChangeHandler handler} was
|
||||
* added, changes providing the {@link Filter} representing the its state.
|
||||
*
|
||||
* @param filter
|
||||
* {@link Filter} instance representing the {@link FilterWidget widget} state
|
||||
*/
|
||||
void onFilterValueChanged(Filter<T> filter);
|
||||
|
||||
Collection<C> getFilterableValues();
|
||||
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
package com.sap.sailing.gwt.home.shared.partials.filter;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* Handler interface for class provide the values available for selection in a {@link FilterWidget}.
|
||||
*
|
||||
* @param <C>
|
||||
* the actual type of values to select
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface FilterValueProvider<C> {
|
||||
|
||||
/**
|
||||
* Provides the values available for selection in a {@link FilterWidget widget}.
|
||||
*
|
||||
* @return {@link Collection} of select-able values
|
||||
*/
|
||||
Collection<C> getFilterableValues();
|
||||
|
||||
}
|
||||
+31
-3
@@ -6,11 +6,39 @@ import com.google.gwt.event.shared.HandlerRegistration;
|
||||
import com.google.gwt.user.client.ui.IsWidget;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
|
||||
/**
|
||||
* Interface for {@link IsWidget widgets} used to filter a specific type values based on another type, where the values
|
||||
* available for selection can be {@link #setSelectableValues(Collection) set}.
|
||||
*
|
||||
* @param <T>
|
||||
* the actual type of values to be filtered
|
||||
* @param <C>
|
||||
* the actual type of values to select
|
||||
*/
|
||||
public interface FilterWidget<T, C> extends IsWidget {
|
||||
|
||||
HandlerRegistration addFilterValueChangeHandler(FilterValueChangeHandler<T, C> handler);
|
||||
|
||||
/**
|
||||
* Adds a {@link FilterValueChangeHandler handler} to the {@link FilterWidget widget} which is called on values
|
||||
* changes.
|
||||
*
|
||||
* @param handler
|
||||
* the {@link FilterValueChangeHandler handler} to add
|
||||
* @return {@link HandlerRegistration} which can be used to remove the handler
|
||||
*/
|
||||
HandlerRegistration addFilterValueChangeHandler(FilterValueChangeHandler<T> handler);
|
||||
|
||||
/**
|
||||
* Provides a {@link Filter} instance based on the {@link FilterWidget widget} state.
|
||||
*
|
||||
* @return {@link Filter} instance representing the {@link FilterWidget widget} state
|
||||
*/
|
||||
Filter<T> getFilter();
|
||||
|
||||
|
||||
/**
|
||||
* Sets the values available for selection to the {@link FilterWidget widget}.
|
||||
*
|
||||
* @param selectableValues
|
||||
* {@link Collection} of select-able values
|
||||
*/
|
||||
void setSelectableValues(Collection<C> selectableValues);
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
package com.sap.sailing.gwt.home.shared.partials.filter;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import com.sap.sailing.gwt.home.shared.places.user.profile.settings.UserSettingsEntry;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sse.common.filter.AbstractKeywordFilter;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
|
||||
public class UserSettingsByKeyTextBoxFilter extends AbstractTextBoxFilter<UserSettingsEntry, String> {
|
||||
|
||||
public UserSettingsByKeyTextBoxFilter() {
|
||||
super(StringMessages.INSTANCE.userSettingsFilter());
|
||||
}
|
||||
|
||||
private final UserSettingsByKeyFilter filter = new UserSettingsByKeyFilter();
|
||||
|
||||
@Override
|
||||
protected Filter<UserSettingsEntry> getFilter(String searchString) {
|
||||
this.filter.setKeywords(Arrays.asList(searchString));
|
||||
return filter;
|
||||
}
|
||||
|
||||
private class UserSettingsByKeyFilter extends AbstractKeywordFilter<UserSettingsEntry> {
|
||||
|
||||
@Override
|
||||
public Iterable<String> getStrings(UserSettingsEntry userSettingsEntry) {
|
||||
return Arrays.asList(userSettingsEntry.getKey());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
+4
-3
@@ -12,6 +12,7 @@ import com.sap.sailing.gwt.home.communication.event.RaceCompetitionFormatSeriesD
|
||||
import com.sap.sailing.gwt.home.communication.event.SimpleCompetitorDTO;
|
||||
import com.sap.sailing.gwt.home.communication.race.SimpleRaceMetadataDTO;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterValueChangeHandler;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterValueProvider;
|
||||
import com.sap.sailing.gwt.home.shared.partials.regattacompetition.RegattaCompetitionView.RegattaCompetitionFleetView;
|
||||
import com.sap.sailing.gwt.home.shared.partials.regattacompetition.RegattaCompetitionView.RegattaCompetitionRaceView;
|
||||
import com.sap.sailing.gwt.home.shared.partials.regattacompetition.RegattaCompetitionView.RegattaCompetitionSeriesView;
|
||||
@@ -19,9 +20,9 @@ import com.sap.sailing.gwt.home.shared.refresh.RefreshableWidget;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
import com.sap.sse.gwt.dispatch.shared.commands.ListResult;
|
||||
|
||||
public abstract class RegattaCompetitionPresenter implements
|
||||
RefreshableWidget<ListResult<RaceCompetitionFormatSeriesDTO>>,
|
||||
FilterValueChangeHandler<SimpleRaceMetadataDTO, SimpleCompetitorDTO> {
|
||||
public abstract class RegattaCompetitionPresenter
|
||||
implements RefreshableWidget<ListResult<RaceCompetitionFormatSeriesDTO>>,
|
||||
FilterValueProvider<SimpleCompetitorDTO>, FilterValueChangeHandler<SimpleRaceMetadataDTO> {
|
||||
|
||||
private final RegattaCompetitionView view;
|
||||
private Filter<SimpleRaceMetadataDTO> latestRacesByCompetitorFilter;
|
||||
|
||||
+7
-5
@@ -10,18 +10,20 @@ import java.util.Set;
|
||||
|
||||
import com.sap.sailing.gwt.home.communication.eventview.RegattaMetadataDTO;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterValueChangeHandler;
|
||||
import com.sap.sailing.gwt.home.shared.partials.filter.FilterValueProvider;
|
||||
import com.sap.sailing.gwt.home.shared.partials.regattalist.RegattaListView.RegattaListItem;
|
||||
import com.sap.sailing.gwt.home.shared.refresh.RefreshableWidget;
|
||||
import com.sap.sse.common.Util;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
import com.sap.sse.gwt.dispatch.shared.commands.DTO;
|
||||
|
||||
public class RegattaListPresenter<D extends DTO> implements FilterValueChangeHandler<RegattaMetadataDTO, String>{
|
||||
|
||||
public class RegattaListPresenter<D extends DTO>
|
||||
implements FilterValueProvider<String>, FilterValueChangeHandler<RegattaMetadataDTO> {
|
||||
|
||||
private final RegattaListView view;
|
||||
private final Map<RegattaListItem, RegattaMetadataDTO> stucture = new HashMap<>();
|
||||
private Filter<RegattaMetadataDTO> latestLeaderboardGroupFilter;
|
||||
|
||||
|
||||
public <V extends RegattaListView & RefreshableWidget<D>> RegattaListPresenter(V view) {
|
||||
this.view = view;
|
||||
}
|
||||
@@ -42,9 +44,9 @@ public class RegattaListPresenter<D extends DTO> implements FilterValueChangeHan
|
||||
Util.addAll(regattaMetadata.getLeaderboardGroupNames(), filterableValues);
|
||||
}
|
||||
}
|
||||
return filterableValues.size() > 1 ? filterableValues : Collections.<String>emptySet();
|
||||
return filterableValues.size() > 1 ? filterableValues : Collections.<String> emptySet();
|
||||
}
|
||||
|
||||
|
||||
public RefreshableWidget<D> getRefreshableWidgetWrapper(final RefreshableWidget<D> wrappedWidget) {
|
||||
return new RefreshableWidget<D>() {
|
||||
@Override
|
||||
|
||||
+7
-1
@@ -7,6 +7,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.google.gwt.storage.client.Storage;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
@@ -51,6 +52,11 @@ public class UserSettingsPresenter<C extends ClientFactoryWithDispatch & ErrorAn
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateData() {
|
||||
view.setEntries(currentlyShownEntries.stream().filter(view.getFilter()::matches).collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
private void loadSettingsFromLocalStorage(final Map<String, String> userSettings) {
|
||||
final Map<String, String> localSettings = loadSettingsFromLocalStorage();
|
||||
final Set<String> allKeys = new TreeSet<>((a, b) -> a.compareTo(b));
|
||||
@@ -60,7 +66,7 @@ public class UserSettingsPresenter<C extends ClientFactoryWithDispatch & ErrorAn
|
||||
for(String key : allKeys) {
|
||||
currentlyShownEntries.add(new UserSettingsEntry(key, userSettings.get(key), localSettings.get(key)));
|
||||
}
|
||||
view.setEntries(currentlyShownEntries);
|
||||
this.updateData();
|
||||
}
|
||||
|
||||
private Map<String, String> loadSettingsFromLocalStorage() {
|
||||
|
||||
+5
@@ -4,6 +4,7 @@ import java.util.List;
|
||||
|
||||
import com.google.gwt.user.client.ui.IsWidget;
|
||||
import com.sap.sailing.gwt.home.shared.partials.multiselection.SuggestedMultiSelectionDataProvider;
|
||||
import com.sap.sse.common.filter.Filter;
|
||||
|
||||
/**
|
||||
* Interface for the user preferences UI. To support desktop as well as mobile version, an
|
||||
@@ -12,6 +13,8 @@ import com.sap.sailing.gwt.home.shared.partials.multiselection.SuggestedMultiSel
|
||||
*/
|
||||
public interface UserSettingsView extends IsWidget {
|
||||
|
||||
Filter<UserSettingsEntry> getFilter();
|
||||
|
||||
void setEntries(List<UserSettingsEntry> entries);
|
||||
|
||||
/**
|
||||
@@ -21,6 +24,8 @@ public interface UserSettingsView extends IsWidget {
|
||||
public interface Presenter {
|
||||
void loadData();
|
||||
|
||||
void updateData();
|
||||
|
||||
void remove(UserSettingsEntry entry);
|
||||
|
||||
void setView(UserSettingsView view);
|
||||
|
||||
+1
-1
@@ -35,12 +35,12 @@
|
||||
<inherits name='com.sap.sailing.gwt.ui.SourceClient'/>
|
||||
<inherits name='com.sap.sailing.gwt.ui.SourceActions'/>
|
||||
<inherits name='com.sap.sailing.gwt.ui.SourceShared'/>
|
||||
<inherits name="com.sap.sailing.gwt.ui.SourceLeaderboard"/>
|
||||
<inherits name='com.sap.sailing.gwt.ui.SourceCommon'/>
|
||||
<inherits name='com.sap.sailing.gwt.ui.SourceSimulator'/>
|
||||
<inherits name='com.sap.sailing.gwt.common.SourceCommon'/>
|
||||
<inherits name='com.sap.sailing.gwt.common.AuthenticationCommon'/>
|
||||
<inherits name='com.sap.sailing.gwt.settings.Settings'/>
|
||||
<inherits name='com.sap.sse.security.ui.Settings'/>
|
||||
|
||||
<inherits name='com.sap.sse.gwt.CommonControlCSS_Autoinject'/>
|
||||
</module>
|
||||
|
||||
+14
@@ -16,9 +16,11 @@ import com.google.gwt.user.client.ui.ScrollPanel;
|
||||
import com.sap.sailing.gwt.common.authentication.FixedSailingAuthentication;
|
||||
import com.sap.sailing.gwt.common.authentication.SAPSailingHeaderWithAuthentication;
|
||||
import com.sap.sailing.gwt.common.client.SharedResources;
|
||||
import com.sap.sailing.gwt.regattaoverview.client.RegattaRaceStatesComponent.EntryHandler;
|
||||
import com.sap.sailing.gwt.settings.client.regattaoverview.RegattaOverviewContextDefinition;
|
||||
import com.sap.sailing.gwt.settings.client.regattaoverview.RegattaRaceStatesSettings;
|
||||
import com.sap.sailing.gwt.ui.client.AbstractSailingEntryPoint;
|
||||
import com.sap.sailing.gwt.ui.shared.RegattaOverviewEntryDTO;
|
||||
import com.sap.sse.gwt.settings.SettingsToUrlSerializer;
|
||||
|
||||
public class RegattaOverviewEntryPoint extends AbstractSailingEntryPoint {
|
||||
@@ -66,6 +68,18 @@ public class RegattaOverviewEntryPoint extends AbstractSailingEntryPoint {
|
||||
createAndAddRegattaPanel(regattaOverviewContextDefinition);
|
||||
toggleDetailPanel(false);
|
||||
|
||||
regattaPanel.setEntryClickedHandler(new EntryHandler() {
|
||||
@Override
|
||||
public void onEntryClicked(RegattaOverviewEntryDTO entry) {
|
||||
detailPanel.show(entry);
|
||||
toggleDetailPanel(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEntryUpdated(RegattaOverviewEntryDTO entry) {
|
||||
detailPanel.update(entry);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void toggleDetailPanel(boolean visibile) {
|
||||
|
||||
+1
-99
@@ -7,32 +7,22 @@ import java.util.List;
|
||||
import com.google.gwt.dom.client.Style.Unit;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
import com.google.gwt.event.logical.shared.ValueChangeEvent;
|
||||
import com.google.gwt.event.logical.shared.ValueChangeHandler;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.Anchor;
|
||||
import com.google.gwt.user.client.ui.CheckBox;
|
||||
import com.google.gwt.user.client.ui.FlexTable;
|
||||
import com.google.gwt.user.client.ui.FlowPanel;
|
||||
import com.google.gwt.user.client.ui.SimplePanel;
|
||||
import com.google.gwt.user.client.ui.TabPanel;
|
||||
import com.google.gwt.user.client.ui.VerticalPanel;
|
||||
import com.sap.sailing.gwt.common.client.SharedResources;
|
||||
import com.sap.sailing.gwt.regattaoverview.client.RegattaRaceStatesComponent.EntryHandler;
|
||||
import com.sap.sailing.gwt.settings.client.leaderboard.LeaderboardSettings;
|
||||
import com.sap.sailing.gwt.settings.client.regattaoverview.RegattaOverviewContextDefinition;
|
||||
import com.sap.sailing.gwt.settings.client.regattaoverview.RegattaRaceStatesSettings;
|
||||
import com.sap.sailing.gwt.settings.client.utils.StoredSettingsLocationFactory;
|
||||
import com.sap.sailing.gwt.ui.client.CompetitorSelectionModel;
|
||||
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.leaderboard.LeaderboardPanel;
|
||||
import com.sap.sailing.gwt.ui.shared.EventDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceGroupDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.StrippedLeaderboardDTO;
|
||||
import com.sap.sse.gwt.client.ErrorReporter;
|
||||
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
|
||||
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
|
||||
import com.sap.sse.gwt.client.player.TimeListener;
|
||||
import com.sap.sse.gwt.client.player.Timer;
|
||||
@@ -62,15 +52,12 @@ public class RegattaOverviewPanel extends SimplePanel {
|
||||
private final RegattaOverviewContextDefinition regattaOverviewContextDefinition;
|
||||
private EventDTO eventDTO;
|
||||
private List<RaceGroupDTO> raceGroupDTOs;
|
||||
private boolean showLeaderboard = false;
|
||||
|
||||
private RegattaRaceStatesComponent regattaRaceStatesComponent;
|
||||
|
||||
private TabPanel leaderboardsTabPanel;
|
||||
private final Anchor settingsButton;
|
||||
private final Anchor refreshNowButton;
|
||||
private final Anchor startStopUpdatingButton;
|
||||
private CheckBox leaderboardCheckBox;
|
||||
private final FlowPanel repeatedInfoLabel = new FlowPanel();
|
||||
private VerticalPanel mainPanel;
|
||||
private UserService userService;
|
||||
@@ -83,7 +70,7 @@ public class RegattaOverviewPanel extends SimplePanel {
|
||||
|
||||
public void setEntryClickedHandler(EntryHandler handler) {
|
||||
entryClickedHandler = handler;
|
||||
if(regattaRaceStatesComponent != null) {
|
||||
if (regattaRaceStatesComponent != null) {
|
||||
regattaRaceStatesComponent.setEntryClickedHandler(handler);
|
||||
}
|
||||
}
|
||||
@@ -234,14 +221,6 @@ public class RegattaOverviewPanel extends SimplePanel {
|
||||
this.uiUpdateTimer.play();
|
||||
|
||||
|
||||
// TODO create a perspective and add this parameter to the perspectiveOwnSettings
|
||||
final boolean showLeaderboardButton = Window.Location.getParameter("enableLeaderboard") != null
|
||||
&& Window.Location.getParameter("enableLeaderboard").equalsIgnoreCase("true");
|
||||
if (showLeaderboardButton) {
|
||||
leaderboardCheckBox = addLeaderboardEnablerButton();
|
||||
} else {
|
||||
leaderboardCheckBox = null;
|
||||
}
|
||||
FlowPanel flowPanelLeft = new FlowPanel();
|
||||
flowPanelLeft.addStyleName(style.functionBarLeft());
|
||||
flowPanelLeft.add(repeatedInfoLabel);
|
||||
@@ -251,9 +230,6 @@ public class RegattaOverviewPanel extends SimplePanel {
|
||||
FlowPanel flowPanelRight = new FlowPanel();
|
||||
flowPanelRight.addStyleName(style.functionBar());
|
||||
|
||||
if (leaderboardCheckBox != null) {
|
||||
flowPanelRight.add(leaderboardCheckBox);
|
||||
}
|
||||
// flexTable.add(refreshNowButton);
|
||||
flowPanelRight.add(startStopUpdatingButton);
|
||||
flowPanelRight.add(settingsButton);
|
||||
@@ -266,82 +242,9 @@ public class RegattaOverviewPanel extends SimplePanel {
|
||||
mainPanel.add(leftRightToolbar);
|
||||
mainPanel.add(regattaRaceStatesComponent);
|
||||
|
||||
if (showLeaderboardButton) {
|
||||
leaderboardsTabPanel = new TabPanel();
|
||||
leaderboardsTabPanel.setStyleName(style.leaderboards());
|
||||
leaderboardsTabPanel.setVisible(false);
|
||||
mainPanel.add(leaderboardsTabPanel);
|
||||
} else {
|
||||
leaderboardsTabPanel = null;
|
||||
}
|
||||
checkToEnableSettingsButton();
|
||||
}
|
||||
|
||||
private CheckBox addLeaderboardEnablerButton() {
|
||||
final CheckBox checkBox = new CheckBox(stringMessages.leaderboard());
|
||||
|
||||
checkBox.setEnabled(true);
|
||||
checkBox.setValue(false);
|
||||
checkBox.setTitle(stringMessages.showHideComponent("Leaderboard"));
|
||||
// checkBox.getElement().getStyle().setMarginRight(10, Unit.PX);
|
||||
checkBox.setStyleName(RES.mainCss().button());
|
||||
checkBox.addStyleName(style.button());
|
||||
checkBox.addStyleName(style.buttonLeaderboard());
|
||||
checkBox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
|
||||
@Override
|
||||
public void onValueChange(ValueChangeEvent<Boolean> newValue) {
|
||||
boolean visible = checkBox.getValue();
|
||||
showLeaderboard = visible;
|
||||
loadLeaderboard();
|
||||
}
|
||||
});
|
||||
|
||||
return checkBox;
|
||||
}
|
||||
|
||||
private void loadLeaderboard() {
|
||||
/*
|
||||
* Load a tabbed widget with one tab per regatta. Each tab contains the leaderboard for the regatta.
|
||||
*/
|
||||
if (leaderboardsTabPanel != null) {
|
||||
if (showLeaderboard) {
|
||||
final CompetitorSelectionModel competitorSelectionProvider = new CompetitorSelectionModel(/* hasMultiSelection */ true);
|
||||
final LeaderboardSettings leaderboardSettings = new LeaderboardSettings();
|
||||
sailingService.getLeaderboardsByEvent(eventDTO, new MarkedAsyncCallback<List<StrippedLeaderboardDTO>>(
|
||||
new AsyncCallback<List<StrippedLeaderboardDTO>>() {
|
||||
@Override
|
||||
public void onSuccess(List<StrippedLeaderboardDTO> result) {
|
||||
leaderboardsTabPanel.clear();
|
||||
for (StrippedLeaderboardDTO leaderboard : result) {
|
||||
LeaderboardPanel leaderboardPanel = new LeaderboardPanel(null, null, sailingService,
|
||||
new AsyncActionsExecutor(), leaderboardSettings, false,
|
||||
/*preSelectedRace*/null,
|
||||
competitorSelectionProvider,
|
||||
null, leaderboard.name,
|
||||
errorReporter, stringMessages, /* showRaceDetails */false);
|
||||
leaderboardsTabPanel.add(leaderboardPanel,
|
||||
(leaderboard.getDisplayName() == null ? leaderboard.name : leaderboard.getDisplayName())
|
||||
+ " " + stringMessages.leaderboard());
|
||||
}
|
||||
if (!result.isEmpty()) {
|
||||
leaderboardsTabPanel.setVisible(true);
|
||||
leaderboardsTabPanel.selectTab(0);
|
||||
} else {
|
||||
leaderboardCheckBox.setValue(false);
|
||||
errorReporter.reportError(stringMessages.errorLoadingLeaderBoardByEvent());
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
}
|
||||
}));
|
||||
} else {
|
||||
leaderboardsTabPanel.clear();
|
||||
leaderboardsTabPanel.setVisible(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void checkToEnableSettingsButton() {
|
||||
if (eventDTO != null && raceGroupDTOs.size() > 0) {
|
||||
settingsButton.setEnabled(true);
|
||||
@@ -352,5 +255,4 @@ public class RegattaOverviewPanel extends SimplePanel {
|
||||
eventDTO = event;
|
||||
fireEvent(new EventDTOLoadedEvent(eventDTO));
|
||||
}
|
||||
|
||||
}
|
||||
+3
-1
@@ -519,7 +519,9 @@ public class RegattaRaceStatesComponent extends AbstractCompositeComponent<Regat
|
||||
raceStatusColumn.setFieldUpdater(new FieldUpdater<RegattaOverviewEntryDTO, SafeHtml>() {
|
||||
@Override
|
||||
public void update(int index, RegattaOverviewEntryDTO object, SafeHtml value) {
|
||||
entryClickedHandler.onEntryClicked(object);
|
||||
if(entryClickedHandler != null) {
|
||||
entryClickedHandler.onEntryClicked(object);
|
||||
}
|
||||
}
|
||||
});
|
||||
raceStatusColumn.setSortable(true);
|
||||
|
||||
+2
-1
@@ -287,9 +287,10 @@ public class LeaderboardSettingsDialogComponent implements SettingsDialogCompone
|
||||
}
|
||||
Grid grid = new Grid(rowCount, maxRacesPerRow);
|
||||
List<String> namesOfRaceColumnsToShow = initialSettings.getNamesOfRaceColumnsToShow();
|
||||
final boolean noRaceSelected = namesOfRaceColumnsToShow == null || Util.isEmpty(namesOfRaceColumnsToShow);
|
||||
for (String raceColumnName : raceAllRaceColumnNames) {
|
||||
CheckBox checkbox = createCheckbox(dialog, raceColumnName,
|
||||
Util.contains(namesOfRaceColumnsToShow, raceColumnName), null);
|
||||
noRaceSelected || Util.contains(namesOfRaceColumnsToShow, raceColumnName), null);
|
||||
raceColumnCheckboxes.put(raceColumnName, checkbox);
|
||||
grid.setWidget(rowIndex, columnIndex++, checkbox);
|
||||
if(columnIndex == maxRacesPerRow) {
|
||||
|
||||
+22
@@ -28,6 +28,28 @@ public class LeaderboardSettingsFactory {
|
||||
SettingsUtil.copyDefaultsFromValues(leaderboardSettings, leaderboardSettings);
|
||||
return leaderboardSettings;
|
||||
}
|
||||
|
||||
|
||||
public LeaderboardSettings createNewDefaultSettingsWithLastN(int numberOfLastRacesToShow) {
|
||||
LeaderboardSettings defaultSettings = new LeaderboardSettings();
|
||||
return new LeaderboardSettings(
|
||||
defaultSettings.getManeuverDetailsToShow(),
|
||||
defaultSettings.getLegDetailsToShow(),
|
||||
defaultSettings.getRaceDetailsToShow(), defaultSettings.getOverallDetailsToShow(),
|
||||
defaultSettings.getNamesOfRaceColumnsToShow(),
|
||||
defaultSettings.getNamesOfRacesToShow(),
|
||||
numberOfLastRacesToShow,
|
||||
defaultSettings.isAutoExpandPreSelectedRace(),
|
||||
defaultSettings.getDelayBetweenAutoAdvancesInMilliseconds(),
|
||||
defaultSettings.getNameOfRaceToSort(), defaultSettings.isSortAscending(),
|
||||
defaultSettings.isUpdateUponPlayStateChange(),
|
||||
RaceColumnSelectionStrategies.LAST_N,
|
||||
defaultSettings.isShowAddedScores(),
|
||||
defaultSettings.isShowOverallColumnWithNumberOfRacesCompletedPerCompetitor(),
|
||||
defaultSettings.isShowCompetitorSailIdColumn(),
|
||||
defaultSettings.isShowCompetitorFullNameColumn(),
|
||||
defaultSettings.isShowCompetitorNationality());
|
||||
}
|
||||
|
||||
public LeaderboardSettings createNewSettingsWithCustomRaceDetails(List<DetailType> raceDetailsToShow) {
|
||||
LeaderboardSettings defaultSettings = new LeaderboardSettings();
|
||||
|
||||
+1
-1
@@ -69,7 +69,7 @@ public abstract class AbstractTrackedRacesListComposite extends AbstractComposit
|
||||
|
||||
private SelectionCheckboxColumn<RaceDTO> selectionCheckboxColumn;
|
||||
|
||||
private FlushableCellTable<RaceDTO> raceTable;
|
||||
protected FlushableCellTable<RaceDTO> raceTable;
|
||||
|
||||
private ListDataProvider<RaceDTO> raceList;
|
||||
|
||||
|
||||
+13
-2
@@ -9,6 +9,7 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.google.gwt.cell.client.AbstractCell;
|
||||
import com.google.gwt.cell.client.FieldUpdater;
|
||||
@@ -151,11 +152,19 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
|
||||
removeEventsButton.setEnabled(false);
|
||||
removeEventsButton.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
if (Window.confirm(stringMessages.doYouReallyWantToRemoveEvents())) {
|
||||
public void onClick(ClickEvent event) {
|
||||
if(askUserForConfirmation()){
|
||||
removeEvents(refreshableEventSelectionModel.getSelectedSet());
|
||||
}
|
||||
}
|
||||
|
||||
private boolean askUserForConfirmation() {
|
||||
if(refreshableEventSelectionModel.itemIsSelectedButNotVisible(eventTable.getVisibleItems())){
|
||||
final String eventNames = refreshableEventSelectionModel.getSelectedSet().stream().map(e -> e.getName()).collect(Collectors.joining("\n"));
|
||||
return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleEvents(eventNames));
|
||||
}
|
||||
return Window.confirm(stringMessages.doYouReallyWantToRemoveEvents());
|
||||
}
|
||||
});
|
||||
eventControlsPanel.add(removeEventsButton);
|
||||
|
||||
@@ -187,6 +196,8 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
final boolean somethingSelected = !refreshableEventSelectionModel.getSelectedSet().isEmpty();
|
||||
removeEventsButton.setEnabled(somethingSelected);
|
||||
final int numberOfItemsSelected = refreshableEventSelectionModel.getSelectedSet().size();
|
||||
removeEventsButton.setText(numberOfItemsSelected <= 1 ? stringMessages.remove() : stringMessages.removeNumber(numberOfItemsSelected));
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
+14
-2
@@ -9,6 +9,7 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.google.gwt.cell.client.AbstractCell;
|
||||
import com.google.gwt.cell.client.FieldUpdater;
|
||||
@@ -140,10 +141,18 @@ TrackedRaceChangedListener, LeaderboardsDisplayer {
|
||||
leaderboardRemoveButton.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
if (Window.confirm(stringMessages.doYouReallyWantToRemoveLeaderboards())) {
|
||||
if(askUserForConfirmation()){
|
||||
removeLeaderboards(leaderboardSelectionModel.getSelectedSet());
|
||||
}
|
||||
}
|
||||
|
||||
private boolean askUserForConfirmation() {
|
||||
if (leaderboardSelectionModel.itemIsSelectedButNotVisible(leaderboardTable.getVisibleItems())) {
|
||||
final String leaderboardNames = leaderboardSelectionModel.getSelectedSet().stream().map(e -> e.getName()).collect(Collectors.joining("\n"));
|
||||
return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleLeaderboards(leaderboardNames));
|
||||
}
|
||||
return Window.confirm(stringMessages.doYouReallyWantToRemoveLeaderboards());
|
||||
}
|
||||
});
|
||||
controlsPanel.add(leaderboardRemoveButton);
|
||||
}
|
||||
@@ -753,7 +762,10 @@ TrackedRaceChangedListener, LeaderboardsDisplayer {
|
||||
|
||||
@Override
|
||||
protected void leaderboardSelectionChanged() {
|
||||
leaderboardRemoveButton.setEnabled(!leaderboardSelectionModel.getSelectedSet().isEmpty());
|
||||
Set<StrippedLeaderboardDTO> selectedLeaderboards = leaderboardSelectionModel.getSelectedSet();
|
||||
leaderboardRemoveButton.setEnabled(!selectedLeaderboards.isEmpty());
|
||||
leaderboardRemoveButton.setText(selectedLeaderboards.size() <= 1 ? stringMessages.remove() : stringMessages.removeNumber(selectedLeaderboards.size()));
|
||||
|
||||
StrippedLeaderboardDTO selectedLeaderboard = getSelectedLeaderboard();
|
||||
if (leaderboardSelectionModel.getSelectedSet().size() == 1 && selectedLeaderboard != null) {
|
||||
raceColumnTable.getDataProvider().getList().clear();
|
||||
|
||||
+31
-18
@@ -8,6 +8,7 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.google.gwt.cell.client.FieldUpdater;
|
||||
import com.google.gwt.core.client.GWT;
|
||||
@@ -475,23 +476,6 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
|
||||
});
|
||||
leaderboardGroupsControlsPanel.add(createGroupButton);
|
||||
|
||||
removeButton = new Button(stringMessages.remove());
|
||||
removeButton.ensureDebugId("RemoveLeaderboardButton");
|
||||
removeButton.setEnabled(false);
|
||||
removeButton.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
StringBuilder messageBuilder = new StringBuilder("Do you really want to remove the leaderboard groups:\n");
|
||||
for (LeaderboardGroupDTO group : refreshableGroupsSelectionModel.getSelectedSet()) {
|
||||
messageBuilder.append("\n" + group.getName());
|
||||
}
|
||||
|
||||
if (Window.confirm(messageBuilder.toString())) {
|
||||
removeLeaderboardGroups(refreshableGroupsSelectionModel.getSelectedSet());
|
||||
}
|
||||
}
|
||||
});
|
||||
leaderboardGroupsControlsPanel.add(removeButton);
|
||||
Button refreshButton = new Button(stringMessages.refresh());
|
||||
refreshButton.ensureDebugId("RefreshLeaderboardGroupsButton");
|
||||
refreshButton.addClickHandler(new ClickHandler() {
|
||||
@@ -513,6 +497,30 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
|
||||
return ANCHORTEMPLATE.cell(UriUtils.fromString(link), group.getName());
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
removeButton = new Button(stringMessages.remove());
|
||||
removeButton.ensureDebugId("RemoveLeaderboardButton");
|
||||
removeButton.setEnabled(false);
|
||||
removeButton.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
if(askUserForConfirmation()){
|
||||
removeLeaderboardGroups(refreshableGroupsSelectionModel.getSelectedSet());
|
||||
}
|
||||
}
|
||||
|
||||
private boolean askUserForConfirmation() {
|
||||
if (refreshableGroupsSelectionModel.itemIsSelectedButNotVisible(groupsTable.getVisibleItems())) {
|
||||
final String leaderboardGroupNames = refreshableGroupsSelectionModel.getSelectedSet().stream().map(e -> e.getName()).collect(Collectors.joining("\n"));
|
||||
return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleLeaderboardGroups(leaderboardGroupNames));
|
||||
}
|
||||
return Window.confirm(stringMessages.doYouReallyWantToRemoveLeaderboardGroups());
|
||||
}
|
||||
});
|
||||
leaderboardGroupsControlsPanel.add(removeButton);
|
||||
|
||||
|
||||
groupNameColumn.setSortable(true);
|
||||
leaderboardGroupsListHandler.setComparator(groupNameColumn, new Comparator<LeaderboardGroupDTO>() {
|
||||
@Override
|
||||
@@ -851,9 +859,14 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
|
||||
|
||||
|
||||
private void groupSelectionChanged() {
|
||||
isSingleGroupSelected = refreshableGroupsSelectionModel.getSelectedSet().size() == 1;
|
||||
Set<LeaderboardGroupDTO> selectedLeaderboardGroups = refreshableGroupsSelectionModel.getSelectedSet();
|
||||
isSingleGroupSelected = selectedLeaderboardGroups.size() == 1;
|
||||
final LeaderboardGroupDTO selectedGroup = getSelectedGroup();
|
||||
|
||||
removeButton.setEnabled(selectedGroup != null);
|
||||
removeButton.setEnabled(!selectedLeaderboardGroups.isEmpty());
|
||||
removeButton.setText(selectedLeaderboardGroups.size() <= 1 ? stringMessages.remove() : stringMessages.removeNumber(selectedLeaderboardGroups.size()));
|
||||
|
||||
splitPanel.setVisible(isSingleGroupSelected && selectedGroup != null);
|
||||
if (isSingleGroupSelected && selectedGroup != null) {
|
||||
//Display details of the group
|
||||
|
||||
+7
@@ -223,6 +223,7 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer
|
||||
if (RegattaConfigImagesBarCell.ACTION_EDIT.equals(value)) {
|
||||
editRegatta(regatta);
|
||||
} else if (RegattaConfigImagesBarCell.ACTION_REMOVE.equals(value)) {
|
||||
|
||||
if (Window.confirm(stringMessages.doYouReallyWantToRemoveRegatta(regatta.getName()))) {
|
||||
removeRegatta(regatta);
|
||||
}
|
||||
@@ -359,4 +360,10 @@ public class RegattaListComposite extends Composite implements RegattasDisplayer
|
||||
public RefreshableMultiSelectionModel<RegattaDTO> getRefreshableMultiSelectionModel() {
|
||||
return refreshableRegattaMultiSelectionModel;
|
||||
}
|
||||
|
||||
public CellTable<RegattaDTO> getRegattaTable() {
|
||||
return regattaTable;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+22
-7
@@ -5,6 +5,7 @@ import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
@@ -86,17 +87,22 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl
|
||||
removeRegattaButton.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
if (Window.confirm("Do you really want to remove the regattas? This will also remove all leaderboards for the regattas!")) {
|
||||
//Creating a new Collection, because getSelectedRegattas returns an
|
||||
//unmodifiable collection, which can't be sent to the server.
|
||||
Collection<RegattaIdentifier> regattas = new HashSet<RegattaIdentifier>();
|
||||
for (RegattaDTO regatta : refreshableRegattaMultiSelectionModel.getSelectedSet()) {
|
||||
regattas.add(regatta.getRegattaIdentifier());
|
||||
}
|
||||
if(askUserForConfirmation()){
|
||||
// unmodifiable collection can't be sent to the server.
|
||||
Collection<RegattaIdentifier> regattas = createModifiableCollection();
|
||||
removeRegattas(regattas);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean askUserForConfirmation() {
|
||||
if (refreshableRegattaMultiSelectionModel.itemIsSelectedButNotVisible(regattaListComposite.getRegattaTable().getVisibleItems())) {
|
||||
final String regattaNames = refreshableRegattaMultiSelectionModel.getSelectedSet().stream().map(e -> e.getName()).collect(Collectors.joining("\n"));
|
||||
return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleRegattas(regattaNames));
|
||||
}
|
||||
return Window.confirm(stringMessages.doYouReallyWantToRemoveRegattas());
|
||||
}
|
||||
});
|
||||
|
||||
regattaManagementControlsPanel.add(removeRegattaButton);
|
||||
regattasContentPanel.add(regattaManagementControlsPanel);
|
||||
regattaListComposite = new RegattaListComposite(sailingService, regattaRefresher, errorReporter, stringMessages);
|
||||
@@ -123,6 +129,7 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl
|
||||
regattaDetailsComposite.setVisible(false);
|
||||
}
|
||||
removeRegattaButton.setEnabled(!selectedRegattas.isEmpty());
|
||||
removeRegattaButton.setText(selectedRegattas.size() <= 1 ? stringMessages.remove() : stringMessages.removeNumber(selectedRegattas.size()));
|
||||
}
|
||||
});
|
||||
regattasContentPanel.add(regattaListComposite);
|
||||
@@ -175,4 +182,12 @@ public class RegattaManagementPanel extends SimplePanel implements RegattasDispl
|
||||
public void fillRegattas(Iterable<RegattaDTO> regattas) {
|
||||
regattaListComposite.fillRegattas(regattas);
|
||||
}
|
||||
|
||||
private Collection<RegattaIdentifier> createModifiableCollection() {
|
||||
Collection<RegattaIdentifier> regattas = new HashSet<RegattaIdentifier>();
|
||||
for (RegattaDTO regatta : refreshableRegattaMultiSelectionModel.getSelectedSet()) {
|
||||
regattas.add(regatta.getRegattaIdentifier());
|
||||
}
|
||||
return regattas;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -163,7 +163,7 @@ public class SetTrackingTimesDialog extends DataEntryDialogWithBootstrap<RaceLog
|
||||
authorNameBox = createTextBox("Shore");
|
||||
content.setWidget(2, 0, createLabel(stringMessages.authorName()));
|
||||
content.setWidget(2, 1, authorNameBox);
|
||||
authorPriorityBox = createIntegerBox(4, 2);
|
||||
authorPriorityBox = createIntegerBox(0, 2);
|
||||
content.setWidget(3, 0, createLabel(stringMessages.authorPriority()));
|
||||
content.setWidget(3, 1, authorPriorityBox);
|
||||
|
||||
|
||||
+29
-12
@@ -4,9 +4,11 @@ import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.Button;
|
||||
import com.google.gwt.user.client.ui.HorizontalPanel;
|
||||
@@ -109,16 +111,7 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite
|
||||
@Override
|
||||
protected void addControlButtons(HorizontalPanel trackedRacesButtonPanel) {
|
||||
if(actionButtonsEnabled) {
|
||||
btnRemoveRace = new Button(stringMessages.remove());
|
||||
btnRemoveRace.ensureDebugId("RemoveRaceButton");
|
||||
btnRemoveRace.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
removeAndUntrackRaces(refreshableSelectionModel.getSelectedSet());
|
||||
}
|
||||
});
|
||||
btnRemoveRace.setEnabled(false);
|
||||
trackedRacesButtonPanel.add(btnRemoveRace);
|
||||
|
||||
|
||||
btnUntrack = new Button(stringMessages.stopTracking());
|
||||
btnUntrack.ensureDebugId("StopTrackingButton");
|
||||
@@ -152,6 +145,28 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite
|
||||
});
|
||||
btnExport.setEnabled(false);
|
||||
trackedRacesButtonPanel.add(btnExport);
|
||||
|
||||
btnRemoveRace = new Button(stringMessages.remove());
|
||||
btnRemoveRace.ensureDebugId("RemoveRaceButton");
|
||||
btnRemoveRace.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
if(askUserForConfirmation()){
|
||||
removeAndUntrackRaces(refreshableSelectionModel.getSelectedSet());
|
||||
}
|
||||
}
|
||||
|
||||
private boolean askUserForConfirmation() {
|
||||
if(refreshableSelectionModel.itemIsSelectedButNotVisible(raceTable.getVisibleItems())){
|
||||
final String trackedRaceNames = refreshableSelectionModel.getSelectedSet().stream().map(e -> e.getRegattaName()+" - "+e.getName()).collect(Collectors.joining("\n"));
|
||||
return Window.confirm(stringMessages.doYouReallyWantToRemoveNonVisibleTrackedRaces(trackedRaceNames));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
});
|
||||
btnRemoveRace.setEnabled(false);
|
||||
trackedRacesButtonPanel.add(btnRemoveRace);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,10 +175,13 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite
|
||||
if (actionButtonsEnabled) {
|
||||
if (selectedRaces.isEmpty()) {
|
||||
btnRemoveRace.setEnabled(false);
|
||||
btnRemoveRace.setText(stringMessages.remove());
|
||||
btnUntrack.setEnabled(false);
|
||||
btnExport.setEnabled(false);
|
||||
} else {
|
||||
btnRemoveRace.setEnabled(true);
|
||||
final int numberOfItemsSelected = refreshableSelectionModel.getSelectedSet().size();
|
||||
btnRemoveRace.setText(numberOfItemsSelected <= 1 ? stringMessages.remove() : stringMessages.removeNumber(numberOfItemsSelected));
|
||||
btnUntrack.setEnabled(true);
|
||||
btnExport.setEnabled(true);
|
||||
}
|
||||
@@ -196,8 +214,7 @@ public class TrackedRacesListComposite extends AbstractTrackedRacesListComposite
|
||||
|
||||
@Override
|
||||
public TrackedRacesSettings getSettings() {
|
||||
// TODO Auto-generated method stub
|
||||
return null;
|
||||
return settings;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Regular → Executable
+10
@@ -28,6 +28,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
|
||||
String refresh();
|
||||
@Override
|
||||
String remove();
|
||||
String removeNumber(int count);
|
||||
String windSource();
|
||||
String dampeningInterval();
|
||||
String map();
|
||||
@@ -362,6 +363,8 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
|
||||
String pleaseSelectARegatta();
|
||||
String addFleet();
|
||||
String doYouReallyWantToRemoveRegatta(String name);
|
||||
String doYouReallyWantToRemoveRegattas();
|
||||
String doYouReallyWantToRemoveNonVisibleRegattas(String regattaNames);
|
||||
String errorLoadingScoreCorrectionProviders(String message);
|
||||
String selectResultListToImportFrom();
|
||||
String of();
|
||||
@@ -958,6 +961,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
|
||||
String offset();
|
||||
String line();
|
||||
String lineAngleToWindAndAdvantage(String startLineLength, String startLineAngleToCombinedWind, String startLineAdvantageousSide, String startLineAdvantageInMeters);
|
||||
String doYouReallyWantToRemoveNonVisibleEvents(String eventNames);
|
||||
String doYouReallyWantToRemoveEvents();
|
||||
String doYouReallyWantToRemoveEvent(String eventName);
|
||||
String doYouReallyWantToRemoveCompetitors();
|
||||
@@ -1030,6 +1034,9 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
|
||||
String errorGettingIgtimiAuthorizationUrl(String message);
|
||||
String addIgtimiUser();
|
||||
String doYouReallyWantToRemoveLeaderboards();
|
||||
String doYouReallyWantToRemoveNonVisibleLeaderboards(String leaderboardNames);
|
||||
String doYouReallyWantToRemoveTrackedRaces();
|
||||
String doYouReallyWantToRemoveNonVisibleTrackedRaces(String trackedRacesName);
|
||||
String errorTryingToRemoveIgtimiAccount(String eMailOfAccountToRemove);
|
||||
String successfullyRemoveIgtimiAccount(String eMailOfAccountToRemove);
|
||||
String eMailMustNotBeEmpty();
|
||||
@@ -1123,6 +1130,8 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
|
||||
String leaderboardsExceptFromSelectedGroup();
|
||||
String availableLeaderboardGroups();
|
||||
String leaderboardGroupsOfSelectedEvent();
|
||||
String doYouReallyWantToRemoveLeaderboardGroups();
|
||||
String doYouReallyWantToRemoveNonVisibleLeaderboardGroups(String leaderboardGroupNames);
|
||||
String addRaces();
|
||||
String withNamePrefix();
|
||||
String pleaseSelectASeriesFirst();
|
||||
@@ -1818,6 +1827,7 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
|
||||
String documentSettingsId();
|
||||
String settingsForId(String id);
|
||||
String userProfileSettingsTabDescription();
|
||||
String userSettingsFilter();
|
||||
String requiresRegattaRaceAndLeaderboard();
|
||||
String couldNotFindRaceInRegatte(String raceName, String regattaName);
|
||||
String algorithmTimeOutText();
|
||||
|
||||
Regular → Executable
+12
-2
@@ -14,6 +14,7 @@ maneuverType=Maneuver
|
||||
windPanelLabel=This is the Wind Panel which so far is completely empty.
|
||||
refresh=Refresh
|
||||
remove=Remove
|
||||
removeNumber=Remove ({0})
|
||||
windSource=Wind Source
|
||||
dampeningInterval=Dampening Interval
|
||||
map=Map
|
||||
@@ -372,6 +373,8 @@ noColor=No color
|
||||
pleaseSelectARegatta=Please select a regatta.
|
||||
addFleet=Add fleet
|
||||
doYouReallyWantToRemoveRegatta=Do you really want to remove the regatta "{0}"? This will also remove all leaderboards for this regatta!
|
||||
doYouReallyWantToRemoveRegattas=Do you really want to remove the regattas? This will also remove all leaderboards for those regattas!
|
||||
doYouReallyWantToRemoveNonVisibleRegattas=You are also deleting regattas that are currently not visible while filtering. The following regattas will be removed. Do you want to continue?\n\n{0}
|
||||
errorLoadingScoreCorrectionProviders=Error loading score correction providers: {0}
|
||||
selectResultListToImportFrom=Select result list to import from
|
||||
of=of
|
||||
@@ -929,6 +932,7 @@ hideToolbar=Hide toolbar
|
||||
showSeriesLeaderboards=Show series leaderboards
|
||||
showOverallLeaderboard=Show overall leaderboard
|
||||
lineAngleToWindAndAdvantage=length: {0}m\nangle to wind: {1}°\n{2} side has {3}m advantage
|
||||
doYouReallyWantToRemoveNonVisibleEvents=You are also deleting events that are currently not visible while filtering. The following events will be removed. Do you want to continue?\n\n{0}
|
||||
doYouReallyWantToRemoveEvents=Do you really want to remove the events?
|
||||
doYouReallyWantToRemoveEvent=Do you really want to remove event {0}?
|
||||
line=Line
|
||||
@@ -999,6 +1003,11 @@ couldNotAuthorizedAccessToIgtimiUser=Could not authorize user {0}; invalid user
|
||||
errorGettingIgtimiAuthorizationUrl=Error getting Igtimi authorization URL: {0}
|
||||
addIgtimiUser=Add Igtimi User
|
||||
doYouReallyWantToRemoveLeaderboards=Do you really want to remove the leaderboards?
|
||||
doYouReallyWantToRemoveNonVisibleLeaderboards=You are also deleting leaderboards that are currently not visible while filtering. The following leaderboards will be removed. Do you want to continue?\n\n{0}
|
||||
doYouReallyWantToRemoveLeaderboardGroups=Do you really want to remove the leaderboard groups?
|
||||
doYouReallyWantToRemoveNonVisibleLeaderboardGroups=You are also deleting leaderboard groups that are currently not visible while filtering. The following leaderboard groups will be removed. Do you want to continue?\n\n{0}
|
||||
doYouReallyWantToRemoveTrackedRaces=Do you really want to remove the tracked races?
|
||||
doYouReallyWantToRemoveNonVisibleTrackedRaces=You are also deleting tracked races that are currently not visible while filtering. The following tracked races will be removed. Do you want to continue?\n\n{0}
|
||||
errorTryingToRemoveIgtimiAccount=Error trying to remove Igtimi account for user {0}
|
||||
successfullyRemoveIgtimiAccount=Successfully removed Igtimi account for user {0}
|
||||
eMailMustNotBeEmpty=e-Mail address must not be empty
|
||||
@@ -1799,6 +1808,7 @@ resetToDefault=Reset to default
|
||||
resetToDefaultInProgress=In resetting...
|
||||
settingsRemoved=Default settings restored
|
||||
settingsRemovedError=Could not restore default settings
|
||||
userSettingsFilter=Settings filter
|
||||
requiresRegattaRaceAndLeaderboard=This page requires a valid regatta name, race name and leaderboard name.
|
||||
couldNotFindRaceInRegatte=Could not obtain a race with name {0} for a regatta with name {1}
|
||||
algorithmTimeOutText=out-of-bounds
|
||||
@@ -1809,13 +1819,13 @@ activeFilters=Active Filter(s): {0}
|
||||
errorLoadingRegattasForLeaderboardGroup=Error trying to load corresponding regattas for leaderboard group {0}: {1}
|
||||
errorLoadingLeaderBoardGroup=Error trying to load the leaderboard group {0}: {1}
|
||||
errorLoadingLeaderBoardGroups=Error trying to obtain the data: {0}
|
||||
errorServletCall=Failed servlet call to SimulatorService\n {0}
|
||||
errorServletCall=Failed servlet call to Simulator Service\n {0}
|
||||
errorReceivingWindPattern=Error retrieving wind patterns {0}
|
||||
errorLoadingBoatClasses=Failed to initialize boat classes!\r\n {0}s
|
||||
errorLoadingLegInformation=Failed to read legs information!\r\n {0}
|
||||
errorLoadingRaceNames=Failed to read races information!\r\n {0}
|
||||
errorLoadingCompetitors=Failed to read competitor information\r\n {0}
|
||||
errorLoadingTotalTime=Failed to read totalTime\r\n {0}
|
||||
errorLoadingTotalTime=Failed to read total time\r\n {0}
|
||||
errorUpdatingCarriedPoints=Error trying to update carry value for competitor {0} in leaderboard {1}: {2} \nYou may have to refresh your view.
|
||||
errorUpdatingLeaderboardScore=Error trying to update score correction for competitor {0} in leaderboard {1} for race {2} : {3} \nYou may have to refresh your view.");
|
||||
errorUpdatingLeaderboardScoreCorrection=Error trying to update score correction for: {0} \nYou may have to refresh your view.");
|
||||
|
||||
+14
-2
@@ -14,6 +14,7 @@ wind=Wind
|
||||
windPanelLabel=This is the Wind Panel which so far is completely empty.
|
||||
refresh=Aktualisieren
|
||||
remove=Löschen
|
||||
removeNumber=Löschen ({0})
|
||||
windSource=Windquelle
|
||||
dampeningInterval=Mittelungsintervall
|
||||
map=Karte
|
||||
@@ -373,6 +374,8 @@ noColor=Keine Farbe
|
||||
pleaseSelectARegatta=Bitte wählen Sie eine Regatta aus.
|
||||
addFleet=Gruppe hinzufügen
|
||||
doYouReallyWantToRemoveRegatta=Möchten Sie wirklich Regatta "{0}" löschen? Alle Regatta-Ranglisten werden dadurch ebenfalls gelöscht.
|
||||
doYouReallyWantToRemoveRegattas=Möchten Sie die Regatten wirklich löschen? Alle Regatta-Ranglisten werden dadurch ebenfalls gelöscht.
|
||||
doYouReallyWantToRemoveNonVisibleRegattas=Sie entfernen auch Regatten, die während des Filterns nicht angezeigt werden. Die folgenden Regatten werden entfernt. Möchten Sie fortfahren?\n\n{0}
|
||||
errorLoadingScoreCorrectionProviders=Fehler beim Laden der offiziellen Ergebnis-Dienste: {0}
|
||||
selectResultListToImportFrom=Rangliste auswählen
|
||||
of=von
|
||||
@@ -918,6 +921,7 @@ hideToolbar=Toolbar ausblenden
|
||||
showSeriesLeaderboards=Ranglisten der Serie anzeigen
|
||||
showOverallLeaderboard=Gesamtrangliste anzeigen
|
||||
lineAngleToWindAndAdvantage=Länge: {0}m\nWinkel zum Wind: {1}°\n{2}-Seite ist {3}m bevorteilt
|
||||
doYouReallyWantToRemoveNonVisibleEvents=Sie entfernen auch Veranstaltungen, die während des Filterns nicht angezeigt werden. Die folgenden Veranstaltungen werden entfernt. Möchten Sie fortfahren?\n\n{0}
|
||||
doYouReallyWantToRemoveEvents=Möchten Sie diese Veranstaltungen wirklich entfernen?
|
||||
doYouReallyWantToRemoveEvent=Möchten Sie wirklich die Veranstaltung {0} entfernen?
|
||||
line=Linie
|
||||
@@ -987,6 +991,10 @@ couldNotAuthorizedAccessToIgtimiUser=Benutzer {0} konnte nicht authentifiziert w
|
||||
errorGettingIgtimiAuthorizationUrl=Fehler beim Beschaffen der Igtimi Authorisierungs-URL: {0}
|
||||
addIgtimiUser=Igtimi-Benutzer hinzufügen
|
||||
doYouReallyWantToRemoveLeaderboards=Möchten Sie wirklich diese Ranglisten löschen?
|
||||
doYouReallyWantToRemoveNonVisibleLeaderboards=Sie entfernen auch Ranglisten, die während des Filterns nicht angezeigt werden. Die folgenden Ranglisten werden entfernt. Möchten Sie fortfahren?\n\n{0}
|
||||
doYouReallyWantToRemoveLeaderboardGroups=Möchten Sie wirklich diese Ranglisten-Gruppen löschen?
|
||||
doYouReallyWantToRemoveNonVisibleLeaderboardGroups=Sie entfernen auch Ranglisten-Gruppen, die während des Filterns nicht angezeigt werden. Die folgenden Ranglisten-Gruppen werden entfernt. Möchten Sie fortfahren?\n\n{0}
|
||||
doYouReallyWantToRemoveNonVisibleLeaderboards=Sie entfernen auch Ranglisten, die während des Filterns nicht angezeigt werden. Die folgenden Ranglisten werden entfernt. Möchten Sie fortfahren?\n\n{0}
|
||||
errorTryingToRemoveIgtimiAccount=Fehler beim Löschen des Zugangs zum Benutzerkonto {0}
|
||||
successfullyRemoveIgtimiAccount=Zugang zum Igtimi-Benutzerkonto {0} erfolgreich gelöscht
|
||||
eMailMustNotBeEmpty=e-Mailadresse darf nicht leer sein
|
||||
@@ -994,6 +1002,9 @@ emailAddress=e-Mailadresse
|
||||
password=Kennwort
|
||||
searchTag=Suchhilfe
|
||||
doYouReallyWantToRemoveLeaderboard=Möchten Sie wirklich die Rangliste ''{0}'' löschen?
|
||||
doYouReallyWantToRemoveLeaderboards=Möchten Sie die Ranglisten wirklich löschen?
|
||||
doYouReallyWantToRemoveTrackedRaces=Möchten Sie die getrackten Rennen wirklich löschen?
|
||||
doYouReallyWantToRemoveNonVisibleTrackedRaces=Sie entfernen auch getrackte Rennen, die während des Filterns nicht angezeigt werden. Die folgenden getrackten Rennen werden entfernt. Möchten Sie fortfahren?\n\n{0}
|
||||
metaLeaderboardCannotBeChanged=Dies ist eine Meta-Rangliste, das hier nicht geändert werden kann.
|
||||
failedToSetNewStartTime=Neue Startzeit konnte nicht gesetzt werden.
|
||||
doYouReallyWantToRemoveIgtimiAccount=Möchten Sie wirklich den Zugang zu den Daten des Benutzers {0} löschen?
|
||||
@@ -1782,16 +1793,17 @@ resetToDefault=Auf Standard zurücksetzen
|
||||
resetToDefaultInProgress=Setze zurück...
|
||||
settingsRemoved=Standardeinstellungen wiederhergestellt
|
||||
settingsRemovedError=Fehler beim Widerherstellen der Standardeinstellungen
|
||||
userSettingsFilter=Einstellungsfilter
|
||||
errorLoadingRegattasForLeaderboardGroup=Es ist ein Fehler beim Laden der zugehörigen Regatten aufgetreten {0}: {1}
|
||||
errorLoadingLeaderBoardGroup=Fehler beim laden der LeaderboardGruppe {0}: {1}
|
||||
errorLoadingLeaderBoardGroups=Fehler beim Datenladen {0}
|
||||
errorServletCall=Fehler beim aufrufen des Servlers für den SimulatorService\n {0}
|
||||
errorServletCall=Fehler beim aufrufen des Servlers für den Simulator-Dienst\n {0}
|
||||
errorReceivingWindPattern=Fehler beim Laden der Windstruktur {0}
|
||||
errorLoadingBoatClasses=Fehler beim Initialisiern der Bootklassen !\r\n {0}s
|
||||
errorLoadingLegInformation=Fehler beim Laden der Legs!\r\n {0}
|
||||
errorLoadingRaceNames=Fehler beim Lesen der Rennnamen!\r\n {0}
|
||||
errorLoadingCompetitors=Konnte Teilnehmer nicht laden\r\n {0}
|
||||
errorLoadingTotalTime=Konnte die Totaltime nicht laden\r\n {0}
|
||||
errorLoadingTotalTime=Konnte die Gesamtzeit nicht laden\r\n {0}
|
||||
errorUpdatingCarriedPoints=Fehler beim Updaten der Carry-Value des Teilnehmers {0} im Leaderboard {1}: {2} \nEvtl. hilft ein Refresh.
|
||||
errorUpdatingLeaderboardScore=Fehler beim Updaten der ScoreCorrection des Teilnehmers {0} im Leaderboard {1} for race {2} : {3} \n Evtl. hilft ein Refresh.");
|
||||
errorUpdatingLeaderboardScoreCorrection=Fehler beim Updaten der ScoreCorrection: {0} \n Evtl. hilft ein Refresh.");
|
||||
|
||||
-1
@@ -2,7 +2,6 @@ package com.sap.sailing.gwt.ui.client.shared.controls;
|
||||
|
||||
import com.google.gwt.cell.client.Cell;
|
||||
import com.sap.sailing.domain.common.SortingOrder;
|
||||
import com.sap.sailing.gwt.ui.leaderboard.SortableColumnWithMinMax;
|
||||
|
||||
public abstract class AbstractSortableColumnWithMinMax<T, C> extends SortableColumn<T, C> implements
|
||||
SortableColumnWithMinMax<T, C> {
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package com.sap.sailing.gwt.ui.leaderboard;
|
||||
package com.sap.sailing.gwt.ui.client.shared.controls;
|
||||
|
||||
public interface SortableColumnWithMinMax<T, C> {
|
||||
/**
|
||||
+1
-1
@@ -1402,7 +1402,7 @@ public class RaceMap extends AbstractCompositeComponent<RaceMapSettings> impleme
|
||||
|
||||
final static Distance advantageLineLength = new MeterDistance(1000); // TODO this should probably rather scale with the visible area of the map; bug 616
|
||||
private void showAdvantageLine(Iterable<CompetitorDTO> competitorsToShow, Date date, long timeForPositionTransitionMillis) {
|
||||
if (map != null && lastRaceTimesInfo != null && quickRanksDTOProvider.getQuickRanks().isEmpty()
|
||||
if (map != null && lastRaceTimesInfo != null && !quickRanksDTOProvider.getQuickRanks().isEmpty()
|
||||
&& lastCombinedWindTrackInfoDTO != null) {
|
||||
boolean drawAdvantageLine = false;
|
||||
if (settings.getHelpLinesSettings().isVisible(HelpLineTypes.ADVANTAGELINE)) {
|
||||
|
||||
-3
@@ -1109,7 +1109,6 @@ public class PathPolyline {
|
||||
USE_REAL_AVERAGE_WIND);
|
||||
|
||||
this.simulatorService.getTotalTime(requestData, new AsyncCallback<ResponseTotalTimeDTO>() {
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable error) {
|
||||
errorReporter.reportError(StringMessages.INSTANCE.errorLoadingTotalTime(error.getMessage()));
|
||||
@@ -1122,12 +1121,10 @@ public class PathPolyline {
|
||||
errorReporter.reportError(notificationMessage, true);
|
||||
warningAlreadyShown = true;
|
||||
}
|
||||
|
||||
if (getTotalTimeFactor) {
|
||||
totalTimeFactor = receiveData.factorSim2GPS;
|
||||
}
|
||||
long totalTime = Math.round(receiveData.totalTimeSeconds / totalTimeFactor);
|
||||
|
||||
simulatorMap.addLegendOverlayForPathPolyline(totalTime * 1000);
|
||||
simulatorMap.redrawLegendCanvasOverlay();
|
||||
}
|
||||
|
||||
+12
-11
@@ -1193,10 +1193,10 @@ public class RegattasResource extends AbstractSailingServerResource {
|
||||
JSONArray jsonCompetitors = new JSONArray();
|
||||
List<Competitor> competitorsFromBestToWorst = trackedRace.getCompetitorsFromBestToWorst(timePoint);
|
||||
Map<Competitor, Integer> overallRankPerCompetitor = new HashMap<>();
|
||||
if(leaderboard != null) {
|
||||
List<Competitor> overallRanking= leaderboard.getCompetitorsFromBestToWorst(timePoint);
|
||||
if (leaderboard != null) {
|
||||
List<Competitor> overallRanking = leaderboard.getCompetitorsFromBestToWorst(timePoint);
|
||||
Integer overallRank = 1;
|
||||
for (Competitor competitor: overallRanking) {
|
||||
for (Competitor competitor : overallRanking) {
|
||||
overallRankPerCompetitor.put(competitor, overallRank++);
|
||||
}
|
||||
}
|
||||
@@ -1213,19 +1213,20 @@ public class RegattasResource extends AbstractSailingServerResource {
|
||||
jsonCompetitorInLeg.put("color", competitor.getColor() != null ? competitor.getColor().getAsHtml()
|
||||
: null);
|
||||
jsonCompetitorInLeg.put("rank", rank++);
|
||||
if (overallRankPerCompetitor.containsKey(competitor)) {
|
||||
jsonCompetitorInLeg.put("overallRank", overallRankPerCompetitor.get(competitor));
|
||||
final Integer overallRank = overallRankPerCompetitor.get(competitor);
|
||||
if (overallRank != null) {
|
||||
jsonCompetitorInLeg.put("overallRank", overallRank);
|
||||
}
|
||||
if (trackedRace.getEndOfTracking() == null || trackedRace.getEndOfTracking().after(timePoint)) {
|
||||
GPSFixTrack<Competitor, GPSFixMoving> competitorTrack = trackedRace.getTrack(competitor);
|
||||
if (competitorTrack != null) {
|
||||
jsonCompetitorInLeg.put("speedOverGround-kts", roundDouble(competitorTrack.getEstimatedSpeed(timePoint).getKnots(), 2));
|
||||
}
|
||||
}
|
||||
TrackedLegOfCompetitor currentLegOfCompetitor = trackedRace.getCurrentLeg(competitor, timePoint);
|
||||
if (currentLegOfCompetitor != null) {
|
||||
int indexOfWaypoint = course.getIndexOfWaypoint(currentLegOfCompetitor.getLeg().getFrom());
|
||||
jsonCompetitorInLeg.put("leg", indexOfWaypoint + 1);
|
||||
|
||||
Speed speedOverGround = currentLegOfCompetitor.getSpeedOverGround(timePoint);
|
||||
if (speedOverGround != null) {
|
||||
jsonCompetitorInLeg.put("speedOverGround-kts", roundDouble(speedOverGround.getKnots(), 2));
|
||||
}
|
||||
|
||||
Distance distanceTraveled = currentLegOfCompetitor.getDistanceTraveled(timePoint);
|
||||
if (distanceTraveled != null) {
|
||||
jsonCompetitorInLeg.put("distanceTraveled-m", roundDouble(distanceTraveled.getMeters(), 2));
|
||||
|
||||
+18
-1
@@ -15,7 +15,7 @@ import com.google.gwt.view.client.SelectionChangeEvent;
|
||||
* register it self as a display on the {@link ListDataProvider} and reacts on the changes of {@link ListDataProvider}.
|
||||
* When the {@link ListDataProvider} is changed this {@link RefreshableMultiSelectionModel selection model} will refresh
|
||||
* the selection according to the {@link ListDataProvider} changes. To make this class work correct it is very important
|
||||
* to set the {@link ListDataProvider}, otherwise it won´t work.
|
||||
* to set the {@link ListDataProvider}, otherwise it won't work.
|
||||
* <p>
|
||||
* For more details on the update process read the {@link RefreshableSelectionModel} Javadoc and see the methods
|
||||
* {@link RefreshableMultiSelectionModel#refreshSelectionModel(Iterable)} and
|
||||
@@ -62,6 +62,23 @@ public class RefreshableMultiSelectionModel<T> extends MultiSelectionModel<T>
|
||||
public EntityIdentityComparator<T> getEntityIdentityComparator() {
|
||||
return comp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if all items that are currently selected also appear in the visible items list.
|
||||
*
|
||||
* @param visibleItemList
|
||||
* can be obtained by calling {@link com.google.gwt.user.cellview.client.CellTable#getVisibleItems()}
|
||||
* method.
|
||||
* @return <code>true</code> if the list of visible items does not contain every item of the current selected item set.
|
||||
*/
|
||||
public boolean itemIsSelectedButNotVisible(List<T> visibleItemList) {
|
||||
for (T item : getSelectedSet()) {
|
||||
if (!visibleItemList.contains(item)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the old selection state of the object. If it was selected before, the old version will be replaced with
|
||||
|
||||
+5
-1
@@ -1,5 +1,7 @@
|
||||
package com.sap.sse.gwt.client.celltable;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gwt.view.client.HasData;
|
||||
import com.google.gwt.view.client.ListDataProvider;
|
||||
import com.google.gwt.view.client.SelectionChangeEvent.Handler;
|
||||
@@ -37,6 +39,8 @@ public interface RefreshableSelectionModel<T> extends SetSelectionModel<T> {
|
||||
* <code><T></code>.
|
||||
*/
|
||||
EntityIdentityComparator<T> getEntityIdentityComparator();
|
||||
|
||||
|
||||
boolean itemIsSelectedButNotVisible(List<T> visibleItemList);
|
||||
|
||||
void refreshSelectionModel(Iterable<T> newObjects);
|
||||
}
|
||||
+13
-1
@@ -12,7 +12,7 @@ import com.google.gwt.view.client.SingleSelectionModel;
|
||||
* register it self as a display on the {@link ListDataProvider} and reacts on the changes of {@link ListDataProvider}.
|
||||
* When the {@link ListDataProvider} is changed this {@link RefreshableSingleSelectionModel selectionmodel} will refresh
|
||||
* the selection according to the {@link ListDataProvider} changes. To make this class work correct it is very important
|
||||
* to set the {@link ListDataProvider}, otherwise it won´t work.
|
||||
* to set the {@link ListDataProvider}, otherwise it won't work.
|
||||
* <p>
|
||||
* For more details on the update process read the {@link RefreshableSelectionModel} Javadoc and see the methods
|
||||
* {@link RefreshableSingleSelectionModel#refreshSelectionModel(Iterable)} and
|
||||
@@ -72,6 +72,18 @@ public class RefreshableSingleSelectionModel<T> extends SingleSelectionModel<T>
|
||||
super.setSelected(item, selected);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the currently selected object is also visible.
|
||||
*
|
||||
* @param visibleItemList
|
||||
* can be obtained by calling {@link com.google.gwt.user.cellview.client.CellTable#getVisibleItems()}
|
||||
* method.
|
||||
* @return <code>true</code> if the list of visible items does not contain the selected item.
|
||||
*/
|
||||
public boolean itemIsSelectedButNotVisible(List<T> visibleItemList) {
|
||||
return !visibleItemList.contains(getSelectedObject());
|
||||
}
|
||||
|
||||
/**
|
||||
* Refreshes the {@link RefreshableSingleSelectionModel} with the <code>newObjects</code>. If the current selected
|
||||
|
||||
+3
-12
@@ -4,7 +4,6 @@ import com.sap.sse.common.settings.Settings;
|
||||
import com.sap.sse.common.settings.generic.GenericSerializableSettings;
|
||||
import com.sap.sse.common.settings.generic.SettingsMap;
|
||||
import com.sap.sse.gwt.client.shared.components.ComponentLifecycle;
|
||||
import com.sap.sse.gwt.client.shared.settings.SettingsBuildingPipeline;
|
||||
import com.sap.sse.gwt.client.shared.settings.SettingsRepresentationTransformer;
|
||||
import com.sap.sse.gwt.settings.SettingsToStringSerializer;
|
||||
import com.sap.sse.security.ui.client.UserService;
|
||||
@@ -20,7 +19,7 @@ import com.sap.sse.security.ui.client.UserService;
|
||||
*
|
||||
*/
|
||||
public class PlaceBasedComponentContextWithSettingsStorage<S extends Settings>
|
||||
extends ComponentContextWithSettingsStorage<S> {
|
||||
extends ComponentContextWithSettingsStorageAndAdditionalSettingsLayers<S> {
|
||||
|
||||
/**
|
||||
* Constructs a special case of {@link ComponentContextWithSettingsStorage} which considers the provided
|
||||
@@ -63,15 +62,7 @@ public class PlaceBasedComponentContextWithSettingsStorage<S extends Settings>
|
||||
protected PlaceBasedComponentContextWithSettingsStorage(ComponentLifecycle<S> rootLifecycle,
|
||||
UserService userService, StoredSettingsLocation storageDefinitionId,
|
||||
SettingsRepresentationTransformer settingsRepresentationTransformer) {
|
||||
this(rootLifecycle, userService, storageDefinitionId, settingsRepresentationTransformer,
|
||||
new UserSettingsBuildingPipeline(settingsRepresentationTransformer));
|
||||
super(rootLifecycle, userService, storageDefinitionId, settingsRepresentationTransformer,
|
||||
new UserSettingsBuildingPipelineWithAdditionalSettingsLayers(settingsRepresentationTransformer));
|
||||
}
|
||||
|
||||
protected PlaceBasedComponentContextWithSettingsStorage(ComponentLifecycle<S> rootLifecycle,
|
||||
UserService userService, StoredSettingsLocation storageDefinitionId,
|
||||
SettingsRepresentationTransformer settingsRepresentationTransformer,
|
||||
SettingsBuildingPipeline settingsBuildingPipeline) {
|
||||
super(rootLifecycle, userService, storageDefinitionId, settingsRepresentationTransformer, settingsBuildingPipeline);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
|
||||
Bundle-ManifestVersion: 2
|
||||
Bundle-Name: TracTrac Client module
|
||||
Bundle-SymbolicName: com.tractrac.clientmodule
|
||||
Bundle-Version: 3.7.0
|
||||
Bundle-Version: 3.7.2
|
||||
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
|
||||
Bundle-ClassPath: .,
|
||||
lib/TracAPI.jar
|
||||
|
||||
Binary file not shown.
@@ -8,6 +8,6 @@
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
<artifactId>com.tractrac.clientmodule</artifactId>
|
||||
<version>3.7.0</version>
|
||||
<version>3.7.2</version>
|
||||
<packaging>eclipse-plugin</packaging>
|
||||
</project>
|
||||
+8
-9
@@ -4,13 +4,6 @@ import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ListView;
|
||||
|
||||
import com.sap.sailing.android.shared.util.ViewHelper;
|
||||
import com.sap.sailing.domain.base.CourseBase;
|
||||
import com.sap.sailing.domain.base.impl.CourseDataImpl;
|
||||
@@ -21,7 +14,13 @@ import com.sap.sailing.racecommittee.app.ui.adapters.checked.CheckedItem;
|
||||
import com.sap.sailing.racecommittee.app.ui.adapters.checked.CheckedItemAdapter;
|
||||
import com.sap.sailing.racecommittee.app.ui.layouts.HeaderLayout;
|
||||
import com.sap.sse.common.impl.MillisecondsTimePoint;
|
||||
import com.sap.sse.common.util.NaturalComparator;
|
||||
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.AdapterView;
|
||||
import android.widget.ListView;
|
||||
|
||||
public class CourseFragmentName extends CourseFragment {
|
||||
|
||||
@@ -61,7 +60,7 @@ public class CourseFragmentName extends CourseFragment {
|
||||
|
||||
if (mListView != null) {
|
||||
final List<String> courses = preferences.getByNameCourseDesignerCourseNames();
|
||||
Collections.sort(courses, new NaturalComparator());
|
||||
Collections.sort(courses);
|
||||
String courseName = "";
|
||||
|
||||
CourseBase courseDesign = getRaceState().getCourseDesign();
|
||||
|
||||
Reference in new issue
Block a user