added competitor registration dialog

This commit is contained in:
Fredrik Teschke committed 2014-03-06 16:58:36 +01:00
1 parent ca783d378a
commit 16474ca8f1
12 files changed
+263 -27

No files matched your search

@@ -70,4 +70,7 @@ interface AdminConsoleResources extends ClientBundle {
@Source("com/sap/sailing/gwt/ui/client/images/start_racelog_tracking.png")
ImageResource startRaceLogTracking();
@Source("com/sap/sailing/gwt/ui/client/images/competitor_registrations.png")
ImageResource competitorRegistrations();
}
@@ -0,0 +1,121 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.HashSet;
import java.util.Set;
import com.google.gwt.core.client.Callback;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.domain.common.dto.CompetitorDTO;
import com.sap.sailing.gwt.ui.client.ErrorReporter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
public class CompetitorRegistrationsDialog extends DialogBox {
private final CompetitorTableWrapper competitorTable;
public CompetitorRegistrationsDialog(final SailingServiceAsync sailingService, final StringMessages stringMessages,
final ErrorReporter errorReporter, final String leaderboardName,
final String raceColumnName, final String fleetName, boolean editable) {
boolean filterByLeaderBoardInitially = false;
VerticalPanel mainPanel = new VerticalPanel();
setWidget(mainPanel);
HorizontalPanel buttonPanel = new HorizontalPanel();
final Button toggleOnlyLeaderboard = new Button(filterByLeaderBoardInitially ? stringMessages.removeLeaderboardFilter():
stringMessages.filterByLeaderboard());
toggleOnlyLeaderboard.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
boolean filterByLeaderboard = toggleOnlyLeaderboard.getText().equals(stringMessages.filterByLeaderboard());
competitorTable.refreshCompetitorList(filterByLeaderboard ? leaderboardName : null);
toggleOnlyLeaderboard.setText(filterByLeaderboard ? stringMessages.removeLeaderboardFilter() :
stringMessages.filterByLeaderboard());
}
});
final Button toggleSelection = new Button(stringMessages.selectAll());
toggleSelection.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
boolean selectAll = toggleSelection.getText().equals(stringMessages.selectAll());
for (CompetitorDTO competitor : competitorTable.getAllCompetitors()) {
competitorTable.getSelectionModel().setSelected(competitor, selectAll);
}
toggleSelection.setText(selectAll ? stringMessages.deselectAll() : stringMessages.selectAll());
}
});
Button cancel = new Button(stringMessages.cancel());
cancel.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
hide();
}
});
Button save = new Button(stringMessages.save());
save.setEnabled(editable);
save.setTitle(stringMessages.canOnlyBeEditedBeforeStartingTracking());
save.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
sailingService.setCompetitorRegistrations(leaderboardName, raceColumnName, fleetName,
competitorTable.getSelectionModel().getSelectedSet(), new AsyncCallback<Void>() {
@Override
public void onSuccess(Void result) {
hide();
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Could not save competitor registrations: " + caught.getMessage());
}
});
}
});
buttonPanel.add(toggleOnlyLeaderboard);
buttonPanel.add(toggleSelection);
buttonPanel.add(cancel);
buttonPanel.add(save);
mainPanel.add(buttonPanel);
competitorTable = new CompetitorTableWrapper(sailingService, stringMessages, errorReporter);
mainPanel.add(competitorTable);
competitorTable.refreshCompetitorList(filterByLeaderBoardInitially ? leaderboardName : null,
true, new Callback<Iterable<CompetitorDTO>, Throwable>() {
@Override
public void onSuccess(Iterable<CompetitorDTO> result) {
center();
//preselect competitors that are already registered
sailingService.getCompetitorRegistrations(leaderboardName, raceColumnName, fleetName, new AsyncCallback<Iterable<CompetitorDTO>>() {
@Override
public void onSuccess(Iterable<CompetitorDTO> result) {
Set<String> registeredIds = new HashSet<String>();
for (CompetitorDTO c : result) {
registeredIds.add(c.getIdAsString());
}
for (CompetitorDTO c : competitorTable.getAllCompetitors()) {
competitorTable.getSelectionModel().setSelected(c, registeredIds.contains(c.getIdAsString()));
}
}
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Could not load already registered competitors: " + caught.getMessage());
}
});
}
@Override
public void onFailure(Throwable reason) {}
});
}
}
@@ -5,6 +5,7 @@ import java.util.Comparator;
import java.util.List;
import com.google.gwt.cell.client.SafeHtmlCell;
import com.google.gwt.core.client.Callback;
import com.google.gwt.core.client.GWT;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.safehtml.shared.SafeHtml;
@@ -183,20 +184,31 @@ public class CompetitorTableWrapper implements IsWidget {
return filterField;
}
public void refreshCompetitorList(String leaderboardName) {
refreshCompetitorList(leaderboardName, false, null);
}
public void refreshCompetitorList(String leaderboardName, boolean lookInRaceLogs) {
refreshCompetitorList(leaderboardName, lookInRaceLogs, null);
}
/**
* @param leaderboardName If null, all existing competitors are loaded
*/
public void refreshCompetitorList(String leaderboardName) {
public void refreshCompetitorList(String leaderboardName, boolean lookInRaceLogs, final Callback<Iterable<CompetitorDTO>,
Throwable> callback) {
if(leaderboardName != null) {
sailingService.getCompetitorsOfLeaderboard(leaderboardName, new AsyncCallback<Iterable<CompetitorDTO>>() {
sailingService.getCompetitorsOfLeaderboard(leaderboardName, lookInRaceLogs, new AsyncCallback<Iterable<CompetitorDTO>>() {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Remote Procedure Call getCompetitors() - Failure: " + caught.getMessage());
if (callback != null) callback.onFailure(caught);
}
@Override
public void onSuccess(Iterable<CompetitorDTO> result) {
getFilteredCompetitors(result);
if (callback != null) callback.onSuccess(result);
}
});
} else {
@@ -204,11 +216,13 @@ public class CompetitorTableWrapper implements IsWidget {
@Override
public void onFailure(Throwable caught) {
errorReporter.reportError("Remote Procedure Call getCompetitors() - Failure: " + caught.getMessage());
if (callback != null) callback.onFailure(caught);
}
@Override
public void onSuccess(Iterable<CompetitorDTO> result) {
getFilteredCompetitors(result);
if (callback != null) callback.onSuccess(result);
}
});
}
@@ -84,17 +84,14 @@ public class RaceLogTrackingEventManagementPanel extends AbstractLeaderboardConf
@Override
public String getValue(RaceColumnDTOAndFleetDTOWithNameBasedEquality raceColumnAndFleetName) {
RaceLogTrackingState state = raceColumnAndFleetName.getB().raceLogTrackingState;
if (raceColumnAndFleetName.getB().raceLogTrackerExists) {
if (state == RaceLogTrackingState.TRACKING) {
return "Tracking";
} else {
return "Tracker is listening";
}
} else if (raceColumnAndFleetName.getB().raceLogTrackingState.isForTracking()) {
return "Denoted";
} else {
return "Not denoted";
}
return state.name();
}
};
TextColumn<RaceColumnDTOAndFleetDTOWithNameBasedEquality> trackerStateColumn = new TextColumn<RaceColumnDTOAndFleetDTOWithNameBasedEquality>() {
@Override
public String getValue(RaceColumnDTOAndFleetDTOWithNameBasedEquality raceColumnAndFleetName) {
return raceColumnAndFleetName.getB().raceLogTrackerExists ? "Active" : "None";
}
};
@@ -110,13 +107,18 @@ public class RaceLogTrackingEventManagementPanel extends AbstractLeaderboardConf
denoteForRaceLogTracking(object.getA(), object.getB());
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_START_RACELOG_TRACKING.equals(value)) {
startRaceLogTracking(object.getA(), object.getB());
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_COMPETITOR_REGISTRATIONS.equals(value)) {
boolean editable = object.getB().raceLogTrackingState != RaceLogTrackingState.TRACKING;
new CompetitorRegistrationsDialog(sailingService, stringMessages, errorReporter,
getSelectedLeaderboardName(), object.getA().getName(), object.getB().getName(), editable).show();
}
}
});
racesTable.addColumn(raceNameColumn, stringMessages.race());
racesTable.addColumn(fleetNameColumn, stringMessages.fleet());
racesTable.addColumn(raceLogTrackingStateColumn, stringMessages.status());
racesTable.addColumn(raceLogTrackingStateColumn, stringMessages.raceStatusColumn());
racesTable.addColumn(trackerStateColumn, stringMessages.trackerStatus());
racesTable.addColumn(raceActionColumn, stringMessages.actions());
}
@@ -13,6 +13,7 @@ public class RaceLogTrackingEventManagementRaceImagesBarCell extends ImagesBarCe
public final static String ACTION_ADD_RACELOG_TRACKER = "ACTION_ADD_RACELOG_TRACKER";
public final static String ACTION_DENOTE_FOR_RACELOG_TRACKING = "ACTION_DENOTE_FOR_RACELOG_TRACKING";
public final static String ACTION_START_RACELOG_TRACKING = "ACTION_START_RACELOG_TRACKING";
public final static String ACTION_COMPETITOR_REGISTRATIONS = "ACTION_COMPETITOR_REGISTRATIONS";
private final StringMessages stringMessages;
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
@@ -33,11 +34,14 @@ public class RaceLogTrackingEventManagementRaceImagesBarCell extends ImagesBarCe
result.add(new ImageSpec(ACTION_DENOTE_FOR_RACELOG_TRACKING, stringMessages.denoteForRaceLogTracking(), makeImagePrototype(resources.denoteForRaceLogTracking())));
}
if (object.getB().raceLogTrackingState.isForTracking() &&
object.getB().raceLogTrackingState != RaceLogTrackingState.TRACKING) {
if (object.getB().raceLogTrackerExists && object.getB().raceLogTrackingState != RaceLogTrackingState.TRACKING) {
result.add(new ImageSpec(ACTION_START_RACELOG_TRACKING, stringMessages.startRaceLogTracking(), makeImagePrototype(resources.startRaceLogTracking())));
}
if (object.getB().raceLogTrackingState.isForTracking()) {
result.add(new ImageSpec(ACTION_COMPETITOR_REGISTRATIONS, stringMessages.competitorRegistrations(), makeImagePrototype(resources.competitorRegistrations())));
}
return result;
}
}
@@ -350,7 +350,14 @@ public interface SailingService extends RemoteService {
DataMiningSerializationDummy pseudoMethodSoThatSomeDataMiningClassesAreAddedToTheGWTSerializationPolicy();
Iterable<CompetitorDTO> getCompetitorsOfLeaderboard(String leaderboardName);
/**
*
* @param leaderboardName
* @param lookInRaceLogs If set to {@code true}, the {@link RaceLog}s are checked for the competitor registrations.
* If set to {@code false}, the {@link RaceDefinition}s are checked instead.
* @return
*/
Iterable<CompetitorDTO> getCompetitorsOfLeaderboard(String leaderboardName, boolean lookInRaceLogs);
CompetitorDTO addOrUpdateCompetitor(CompetitorDTO competitor);
@@ -387,4 +394,8 @@ public interface SailingService extends RemoteService {
void denoteForRaceLogTracking(String leaderboardName) throws Exception;
void startRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName);
void setCompetitorRegistrations(String leaderboardName, String raceColumnName, String fleetName, Set<CompetitorDTO> competitors);
Iterable<CompetitorDTO> getCompetitorRegistrations(String leaderboardName, String raceColumnName, String fleetName);
}
@@ -474,7 +474,8 @@ public interface SailingServiceAsync {
void getCompetitors(AsyncCallback<Iterable<CompetitorDTO>> asyncCallback);
void getCompetitorsOfLeaderboard(String leaderboardName, AsyncCallback<Iterable<CompetitorDTO>> asyncCallback);
void getCompetitorsOfLeaderboard(String leaderboardName, boolean lookInRaceLogs,
AsyncCallback<Iterable<CompetitorDTO>> asyncCallback);
void addOrUpdateCompetitor(CompetitorDTO competitor, AsyncCallback<CompetitorDTO> asyncCallback);
@@ -528,5 +529,11 @@ public interface SailingServiceAsync {
void startRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName,
AsyncCallback<Void> callback);
void setCompetitorRegistrations(String leaderboardName, String raceColumnName, String fleetName,
Set<CompetitorDTO> competitors, AsyncCallback<Void> callback);
void getCompetitorRegistrations(String leaderboardName, String raceColumnName, String fleetName,
AsyncCallback<Iterable<CompetitorDTO>> callback);
}
@@ -964,4 +964,9 @@ public interface StringMessages extends Messages {
String denoteForRaceLogTracking();
String raceLogTracking();
String startRaceLogTracking();
String filterByLeaderboard();
String removeLeaderboardFilter();
String competitorRegistrations();
String trackerStatus();
String canOnlyBeEditedBeforeStartingTracking();
}
@@ -952,4 +952,9 @@ addRaceLogTracker=Add RaceLog Tracker
addRaceLogTrackers=Add RaceLog Trackers
denoteForRaceLogTracking=Denote for RaceLog tracking
raceLogTracking=RaceLog Tracking
startRaceLogTracking=Start RaceLog Tracking
startRaceLogTracking=Start RaceLog Tracking
filterByLeaderboard=Filter by Leaderboard
removeLeaderboardFilter=Remove Leaderboard filter
competitorRegistrations=Competitor Registrations
trackerStatus=Tracker Status
canOnlyBeEditedBeforeStartingTracking=Can only be edited before starting tracking
@@ -948,4 +948,9 @@ addRaceLogTracker=RaceLog Tracker hinzufügen
addRaceLogTrackers=RaceLog Tracker hinzufügen
denoteForRaceLogTracking=Für RaceLog Tracking markieren
raceLogTracking=RaceLog Tracking
startRaceLogTracking=RaceLog Tracking starten
startRaceLogTracking=RaceLog Tracking starten
filterByLeaderboard=Nach Rangliste filtern
removeLeaderboardFilter=Nicht nach Rangliste filtern
competitorRegistrations=Team Anmeldungen
trackerStatus=Tracker-Status
canOnlyBeEditedBeforeStartingTracking=Kann nur vor Beginn des Trackings bearbeitet werden
@@ -187,7 +187,9 @@ import com.sap.sailing.domain.racelog.state.racingprocedure.gate.ReadonlyGateSta
import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.ReadonlyRRS26RacingProcedure;
import com.sap.sailing.domain.racelog.tracking.RaceLogTrackingAdapter;
import com.sap.sailing.domain.racelog.tracking.RaceLogTrackingAdapterFactory;
import com.sap.sailing.domain.racelog.tracking.RegisterCompetitorEvent;
import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RaceLogTrackingStateAnalyzer;
import com.sap.sailing.domain.racelog.tracking.analyzing.impl.RegisteredCompetitorsAnalyzer;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingAdapter;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingAdapterFactory;
import com.sap.sailing.domain.swisstimingadapter.SwissTimingArchiveConfiguration;
@@ -3502,11 +3504,23 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
}
@Override
public Iterable<CompetitorDTO> getCompetitorsOfLeaderboard(String leaderboardName) {
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
return convertToCompetitorDTOs(leaderboard.getAllCompetitors());
public Iterable<CompetitorDTO> getCompetitorsOfLeaderboard(String leaderboardName, boolean lookInRaceLogs) {
if (lookInRaceLogs) {
Set<Competitor> result = new HashSet<Competitor>();
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
for (RaceColumn raceColumn : leaderboard.getRaceColumns()) {
for (Fleet fleet : raceColumn.getFleets()) {
RaceLog raceLog = raceColumn.getRaceLog(fleet);
result.addAll(new RegisteredCompetitorsAnalyzer(raceLog).analyze());
}
}
return convertToCompetitorDTOs(result);
} else {
Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName);
return convertToCompetitorDTOs(leaderboard.getAllCompetitors());
}
}
@Override
public CompetitorDTO addOrUpdateCompetitor(CompetitorDTO competitor) {
Nationality nationality = (competitor.getThreeLetterIocCountryCode() == null || competitor.getThreeLetterIocCountryCode().isEmpty()) ? null :
@@ -3873,15 +3887,60 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
getRaceLogTrackingAdapter().denoteForRaceLogTracking(getService(), leaderboard);
}
@Override
public void startRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName) {
private RaceLog getRaceLog(String leaderboardName, String raceColumnName, String fleetName) {
RaceColumn raceColumn = getService().getLeaderboardByName(leaderboardName).getRaceColumnByName(raceColumnName);
Fleet fleet = raceColumn.getFleetByName(fleetName);
RaceLog raceLog = raceColumn.getRaceLog(fleet);
return raceColumn.getRaceLog(fleet);
}
@Override
public void startRaceLogTracking(String leaderboardName, String raceColumnName, String fleetName) {
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
RaceLogEvent event = RaceLogEventFactory.INSTANCE.createStartTrackingEvent(MillisecondsTimePoint.now(),
getService().getServerAuthor(), raceLog.getCurrentPassId());
raceLog.add(event);
}
@Override
public Iterable<CompetitorDTO> getCompetitorRegistrations(String leaderboardName, String raceColumnName, String fleetName) {
return convertToCompetitorDTOs(
new RegisteredCompetitorsAnalyzer(
getRaceLog(leaderboardName, raceColumnName, fleetName)).analyze());
}
private void unregisterCompetitor(RaceLog raceLog, Competitor competitor) {
for (RaceLogEvent event : raceLog.getUnrevokedEventsDescending()) {
if (event instanceof RegisterCompetitorEvent && ((RegisterCompetitorEvent) event).getCompetitor().equals(competitor)) {
raceLog.add(RaceLogEventFactory.INSTANCE.createRevokeEvent(MillisecondsTimePoint.now(),
getService().getServerAuthor(), raceLog.getCurrentPassId(), event.getId()));
}
}
}
@Override
public void setCompetitorRegistrations(String leaderboardName, String raceColumnName, String fleetName,
Set<CompetitorDTO> competitors) {
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
Set<Competitor> alreadyRegistered = new HashSet<Competitor>(new RegisteredCompetitorsAnalyzer(raceLog).analyze());
Set<Competitor> toBeRegistered = new HashSet<Competitor>();
for (CompetitorDTO dto : competitors) {
toBeRegistered.add(getService().getCompetitorStore().getExistingCompetitorByIdAsString(dto.getIdAsString()));
}
Set<Competitor> toBeRemoved = new HashSet<Competitor>(alreadyRegistered);
toBeRemoved.removeAll(toBeRegistered);
toBeRegistered.removeAll(alreadyRegistered);
for (Competitor c : toBeRegistered) {
raceLog.add(RaceLogEventFactory.INSTANCE.createRegisterCompetitorEvent(MillisecondsTimePoint.now(),
getService().getServerAuthor(), raceLog.getCurrentPassId(), c));
}
for (Competitor c : toBeRemoved) {
unregisterCompetitor(raceLog, c);
}
}
}