mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-25 21:43:49 +00:00
added course definition dialog
This commit is contained in:
1 parent
2dbec9dbbf
commit
69b10da77e
18 files changed
+697
-182
No files matched your search
+4
@@ -95,4 +95,8 @@ public interface SharedDomainFactory extends CompetitorFactory {
|
||||
* Hm.
|
||||
*/
|
||||
DeviceConfigurationMatcher getOrCreateDeviceConfigurationMatcher(DeviceConfigurationMatcherType type, List<String> clientIdentifiers);
|
||||
|
||||
Mark getExistingMarkByIdAsString(String toStringRepresentationOfID);
|
||||
|
||||
Mark getExistingMarkById(Serializable id);
|
||||
}
|
||||
+10
@@ -312,5 +312,15 @@ public class SharedDomainFactoryImpl implements SharedDomainFactory {
|
||||
}
|
||||
return matcher;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mark getExistingMarkById(Serializable id) {
|
||||
return markCache.get(id);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mark getExistingMarkByIdAsString(String toStringRepresentationOfID) {
|
||||
return markCache.get(markIdCache.get(toStringRepresentationOfID));
|
||||
}
|
||||
|
||||
}
|
||||
+8
-8
@@ -1,8 +1,8 @@
|
||||
package com.sap.sailing.domain.racelog.tracking.analyzing.impl;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import com.sap.sailing.domain.base.Mark;
|
||||
import com.sap.sailing.domain.racelog.RaceLog;
|
||||
@@ -10,21 +10,21 @@ import com.sap.sailing.domain.racelog.RaceLogEvent;
|
||||
import com.sap.sailing.domain.racelog.analyzing.impl.RaceLogAnalyzer;
|
||||
import com.sap.sailing.domain.racelog.tracking.DefineMarkEvent;
|
||||
|
||||
public class DefinedMarkFinder extends RaceLogAnalyzer<Iterable<Mark>> {
|
||||
public class DefinedMarkFinder extends RaceLogAnalyzer<Collection<Mark>> {
|
||||
public DefinedMarkFinder(RaceLog raceLog) {
|
||||
super(raceLog);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<Mark> performAnalysis() {
|
||||
Map<Serializable, Mark> result = new HashMap<Serializable, Mark>();
|
||||
protected Collection<Mark> performAnalysis() {
|
||||
List< Mark> result = new ArrayList<Mark>();
|
||||
for (RaceLogEvent event : getAllEvents()) {
|
||||
if (event instanceof DefineMarkEvent) {
|
||||
DefineMarkEvent dME = (DefineMarkEvent) event;
|
||||
result.put(dME.getMark().getId(), dME.getMark());
|
||||
result.add(dME.getMark());
|
||||
}
|
||||
}
|
||||
return result.values();
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
+65
-21
@@ -1,11 +1,15 @@
|
||||
package com.sap.sailing.gwt.ui.adminconsole;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.gwt.cell.client.FieldUpdater;
|
||||
import com.google.gwt.cell.client.SafeHtmlCell;
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.dom.client.Style.FontWeight;
|
||||
@@ -32,6 +36,7 @@ import com.google.gwt.view.client.SelectionChangeEvent.Handler;
|
||||
import com.google.gwt.view.client.SelectionModel;
|
||||
import com.google.gwt.view.client.SingleSelectionModel;
|
||||
import com.sap.sailing.domain.common.PassingInstruction;
|
||||
import com.sap.sailing.domain.common.impl.Util.Pair;
|
||||
import com.sap.sailing.gwt.ui.client.ErrorReporter;
|
||||
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
@@ -178,7 +183,7 @@ public abstract class CourseManagementWidget implements IsWidget {
|
||||
protected final Handler markSelectionChangeHandler;
|
||||
protected final Button insertWaypointBefore;
|
||||
protected final Button insertWaypointAfter;
|
||||
protected final Button removeWaypointBtn;
|
||||
protected final Button saveButton;
|
||||
protected boolean ignoreWaypointAndOldAndNewMarkSelectionChange;
|
||||
|
||||
@Override
|
||||
@@ -249,6 +254,19 @@ public abstract class CourseManagementWidget implements IsWidget {
|
||||
|
||||
};
|
||||
controlPointsTable.addColumn(newMarkColumn, stringMessages.newMark());
|
||||
|
||||
ImagesBarColumn<ControlPointAndOldAndNewMark, CourseManagementWidgetWaypointsImagesBarCell> actionColumn =
|
||||
new ImagesBarColumn<ControlPointAndOldAndNewMark, CourseManagementWidgetWaypointsImagesBarCell>(
|
||||
new CourseManagementWidgetWaypointsImagesBarCell(stringMessages));
|
||||
actionColumn.setFieldUpdater(new FieldUpdater<ControlPointAndOldAndNewMark, String>() {
|
||||
@Override
|
||||
public void update(int index, ControlPointAndOldAndNewMark controlPoint, String value) {
|
||||
if (CourseManagementWidgetWaypointsImagesBarCell.ACTION_DELETE.equals(value)) {
|
||||
removeSelectedWaypoints(sailingService);
|
||||
}
|
||||
}
|
||||
});
|
||||
controlPointsTable.addColumn(actionColumn, stringMessages.actions());
|
||||
controlPointDataProvider = new ListDataProvider<ControlPointAndOldAndNewMark>();
|
||||
controlPointDataProvider.addDataDisplay(controlPointsTable);
|
||||
|
||||
@@ -290,15 +308,6 @@ public abstract class CourseManagementWidget implements IsWidget {
|
||||
});
|
||||
insertWaypointAfter.setEnabled(false);
|
||||
courseActionsPanel.add(insertWaypointAfter);
|
||||
removeWaypointBtn = new Button(stringMessages.remove());
|
||||
removeWaypointBtn.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
removeSelectedWaypoints(sailingService);
|
||||
}
|
||||
});
|
||||
removeWaypointBtn.setEnabled(false);
|
||||
courseActionsPanel.add(removeWaypointBtn);
|
||||
Button refreshBtn = new Button(stringMessages.refresh());
|
||||
refreshBtn.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
@@ -307,14 +316,32 @@ public abstract class CourseManagementWidget implements IsWidget {
|
||||
}
|
||||
});
|
||||
courseActionsPanel.add(refreshBtn);
|
||||
Button saveBtn = new Button(stringMessages.save());
|
||||
saveBtn.addClickHandler(new ClickHandler() {
|
||||
saveButton = new Button(stringMessages.save());
|
||||
saveButton.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
saveCourse(sailingService, stringMessages);
|
||||
Set<ControlPointDTO> oldControlPointsFromTableAlreadyHandled = new HashSet<ControlPointDTO>();
|
||||
List<Pair<ControlPointDTO, PassingInstruction>> controlPoints = new ArrayList<Pair<ControlPointDTO, PassingInstruction>>();
|
||||
for (ControlPointAndOldAndNewMark cpaoanb : controlPointDataProvider.getList()) {
|
||||
if (!oldControlPointsFromTableAlreadyHandled.contains(cpaoanb.getControlPoint())) {
|
||||
oldControlPointsFromTableAlreadyHandled.add(cpaoanb.getControlPoint());
|
||||
ControlPointDTO controlPointToAdd;
|
||||
if (controlPointsNeedingReplacement.contains(cpaoanb.getControlPoint())) {
|
||||
if (cpaoanb.getControlPoint() instanceof GateDTO) {
|
||||
controlPointToAdd = createGate((GateDTO) cpaoanb.getControlPoint());
|
||||
} else {
|
||||
controlPointToAdd = cpaoanb.getNewMark();
|
||||
}
|
||||
} else {
|
||||
controlPointToAdd = cpaoanb.getControlPoint();
|
||||
}
|
||||
controlPoints.add(new Pair<ControlPointDTO, PassingInstruction>(controlPointToAdd, cpaoanb.passingInstructions));
|
||||
}
|
||||
}
|
||||
saveCourse(controlPoints);
|
||||
}
|
||||
});␍ courseActionsPanel.add(saveBtn);
|
||||
courseActionsPanel.setVisible(false);
|
||||
});␍ courseActionsPanel.add(saveButton);
|
||||
// courseActionsPanel.setVisible(false);
|
||||
|
||||
mainPanel.add(courseActionsPanel);
|
||||
}
|
||||
@@ -325,8 +352,7 @@ public abstract class CourseManagementWidget implements IsWidget {
|
||||
markSelectionModel.setSelected(markSelectionModel.getSelectedObject(), false);
|
||||
final int selectionSize = controlPointsSelectionModel.getSelectedSet().size();
|
||||
insertWaypointAfter.setEnabled(selectionSize==1);
|
||||
insertWaypointBefore.setEnabled(selectionSize==1);
|
||||
removeWaypointBtn.setEnabled(selectionSize>=1);
|
||||
insertWaypointBefore.setEnabled(selectionSize==1 || controlPointDataProvider.getList().isEmpty());
|
||||
if (selectionSize == 1) {
|
||||
MarkDTO newMark = controlPointsSelectionModel.getSelectedSet().iterator().next().getNewMark();
|
||||
if (newMark != null) {
|
||||
@@ -342,7 +368,7 @@ public abstract class CourseManagementWidget implements IsWidget {
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract void saveCourse(SailingServiceAsync sailingService, final StringMessages stringMessages);
|
||||
protected abstract void saveCourse(List<Pair<ControlPointDTO, PassingInstruction>> controlPoints);
|
||||
|
||||
/**
|
||||
* When a gate needs replacement, its entries in {@link #controlPointDataProvider} are looked up, and a new
|
||||
@@ -474,13 +500,19 @@ public abstract class CourseManagementWidget implements IsWidget {
|
||||
@Override
|
||||
public void ok(ControlPointDTO result) {
|
||||
Set<ControlPointAndOldAndNewMark> selectedElements = controlPointsSelectionModel.getSelectedSet();
|
||||
if (!selectedElements.isEmpty()) {
|
||||
int index = -1;
|
||||
if (controlPointDataProvider.getList().isEmpty()) {
|
||||
index = 0;
|
||||
} else if (!selectedElements.isEmpty()) {
|
||||
ControlPointAndOldAndNewMark selectedElement = selectedElements.iterator().next();
|
||||
int insertPos = controlPointDataProvider.getList().indexOf(selectedElement) + (beforeSelection?0:1);
|
||||
index = controlPointDataProvider.getList().indexOf(selectedElement) + (beforeSelection?0:1);
|
||||
}
|
||||
if (index != -1) {
|
||||
for (MarkDTO markDTO : result.getMarks()) {
|
||||
controlPointDataProvider.getList().add(insertPos++, new ControlPointAndOldAndNewMark(result, null, markDTO));
|
||||
controlPointDataProvider.getList().add(index++, new ControlPointAndOldAndNewMark(result, null, markDTO));
|
||||
}
|
||||
}
|
||||
handleControlPointSelectionChange();
|
||||
}
|
||||
}).show();
|
||||
}
|
||||
@@ -513,8 +545,20 @@ public abstract class CourseManagementWidget implements IsWidget {
|
||||
ControlPointAndOldAndNewMark next = i.next();
|
||||
if (selectedControlPoints.contains(next.getControlPoint())) {
|
||||
i.remove();
|
||||
controlPointsSelectionModel.setSelected(next, false);
|
||||
}
|
||||
}
|
||||
handleControlPointSelectionChange();
|
||||
}
|
||||
|
||||
protected void updateMarksTable(Collection<MarkDTO> marks) {
|
||||
markDataProvider.getList().clear();
|
||||
markDataProvider.getList().addAll(marks);
|
||||
Collections.sort(markDataProvider.getList(), new Comparator<MarkDTO>() {
|
||||
@Override
|
||||
public int compare(MarkDTO o1, MarkDTO o2) {
|
||||
return o1.getName().compareTo(o2.getName());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
package com.sap.sailing.gwt.ui.adminconsole;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.client.shared.components.ImagesBarCell;
|
||||
|
||||
public class CourseManagementWidgetWaypointsImagesBarCell extends ImagesBarCell {
|
||||
public static final String ACTION_DELETE = "ACTION_DELETE";
|
||||
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
|
||||
private final StringMessages stringMessages;
|
||||
|
||||
public CourseManagementWidgetWaypointsImagesBarCell(StringMessages stringMessages) {
|
||||
super();
|
||||
this.stringMessages = stringMessages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<ImageSpec> getImageSpecs() {
|
||||
ArrayList<ImageSpec> result = new ArrayList<ImageSpec>();
|
||||
result.add(new ImageSpec(ACTION_DELETE, stringMessages.remove(), makeImagePrototype(resources.removeIcon())));
|
||||
return result;
|
||||
}
|
||||
}
|
||||
+107
@@ -0,0 +1,107 @@
|
||||
package com.sap.sailing.gwt.ui.adminconsole;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gwt.user.client.ui.Grid;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.ListBox;
|
||||
import com.google.gwt.user.client.ui.TextBox;
|
||||
import com.google.gwt.user.client.ui.Widget;
|
||||
import com.sap.sailing.domain.common.MarkType;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.shared.HtmlPredefinedColor;
|
||||
import com.sap.sailing.gwt.ui.shared.MarkDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.racemap.Pattern;
|
||||
import com.sap.sailing.gwt.ui.shared.racemap.Shape;
|
||||
import com.sap.sse.gwt.ui.DataEntryDialog;
|
||||
|
||||
public class MarkEditDialog extends DataEntryDialog<MarkDTO> {
|
||||
private final MarkDTO markToEdit; //color, shape, pattern, type
|
||||
private final TextBox name;
|
||||
private final ListBox shape;
|
||||
private final ListBox pattern;
|
||||
private final ListBox type;
|
||||
private final ListBox color;
|
||||
private final StringMessages stringMessages;
|
||||
|
||||
public MarkEditDialog(final StringMessages stringMessages, MarkDTO markToEdit, boolean isNewMark,
|
||||
DialogCallback<MarkDTO> callback) {
|
||||
super(isNewMark ? stringMessages.add(stringMessages.mark()) : stringMessages.edit(stringMessages.mark()),
|
||||
isNewMark ? stringMessages.add(stringMessages.mark()) : stringMessages.edit(stringMessages.mark()),
|
||||
stringMessages.ok(), stringMessages.cancel(), new Validator<MarkDTO>() {
|
||||
@Override
|
||||
public String getErrorMessage(MarkDTO valueToValidate) {
|
||||
String result = null;
|
||||
if (valueToValidate.getName() == null || valueToValidate.getName().isEmpty()) {
|
||||
result = stringMessages.pleaseEnterAName();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}, /* animationEnabled */true, callback);
|
||||
this.stringMessages = stringMessages;
|
||||
this.markToEdit = markToEdit;
|
||||
|
||||
this.name = createTextBox(markToEdit.getName());
|
||||
this.shape = createAndSelectListBox(Shape.values(), markToEdit.shape, true);
|
||||
this.type = createAndSelectListBox(MarkType.values(), markToEdit.type == null ? null : markToEdit.type.name(), false);
|
||||
this.color = createAndSelectListBox(HtmlPredefinedColor.values(), markToEdit.color, true);
|
||||
this.pattern = createAndSelectListBox(Pattern.values(), markToEdit.pattern, true);
|
||||
}
|
||||
|
||||
private <T extends Enum<T>> ListBox createAndSelectListBox(T[] values, String toSelect, boolean emptySelectionPossible) {
|
||||
ListBox result = createListBox(/* isMultipleSelect */ false);
|
||||
int i=0;
|
||||
List<String> list = new ArrayList<String>();
|
||||
for (T t : values) {
|
||||
list.add(t.name());
|
||||
}
|
||||
if (emptySelectionPossible) {
|
||||
list.add("");
|
||||
}
|
||||
Collections.sort(list);
|
||||
for (String name : list) {
|
||||
result.addItem(name);
|
||||
if (name.equals(toSelect)) {
|
||||
result.setSelectedIndex(i);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void show() {
|
||||
super.show();
|
||||
name.setFocus(true);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected MarkDTO getResult() {
|
||||
MarkDTO result = new MarkDTO(markToEdit.getIdAsString(), name.getText());
|
||||
result.shape = shape.getItemText(shape.getSelectedIndex());
|
||||
result.type = MarkType.valueOf(type.getItemText(type.getSelectedIndex()));
|
||||
result.color = color.getItemText(color.getSelectedIndex());
|
||||
result.pattern = pattern.getItemText(pattern.getSelectedIndex());
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Widget getAdditionalWidget() {
|
||||
Grid result = new Grid(5, 2);
|
||||
result.setWidget(0, 0, new Label(stringMessages.name()));
|
||||
result.setWidget(0, 1, name);
|
||||
result.setWidget(1, 0, new Label(stringMessages.shape()));
|
||||
result.setWidget(1, 1, shape);
|
||||
result.setWidget(2, 0, new Label(stringMessages.type()));
|
||||
result.setWidget(2, 1, type);
|
||||
result.setWidget(3, 0, new Label(stringMessages.color()));
|
||||
result.setWidget(3, 1, color);
|
||||
result.setWidget(4, 0, new Label(stringMessages.pattern()));
|
||||
result.setWidget(4, 1, pattern);
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
+3
-39
@@ -1,12 +1,7 @@
|
||||
package com.sap.sailing.gwt.ui.adminconsole;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
@@ -17,8 +12,6 @@ import com.sap.sailing.gwt.ui.client.RegattaRefresher;
|
||||
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.shared.ControlPointDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.GateDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.MarkDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
|
||||
|
||||
/**
|
||||
@@ -39,25 +32,7 @@ public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
|
||||
courseManagementWidget = new CourseManagementWidget(sailingService, errorReporter, stringMessages) {
|
||||
|
||||
@Override
|
||||
protected void saveCourse(SailingServiceAsync sailingService, final StringMessages stringMessages) {
|
||||
Set<ControlPointDTO> oldControlPointsFromTableAlreadyHandled = new HashSet<ControlPointDTO>();
|
||||
List<Pair<ControlPointDTO, PassingInstruction>> controlPoints = new ArrayList<Pair<ControlPointDTO, PassingInstruction>>();
|
||||
for (ControlPointAndOldAndNewMark cpaoanb : controlPointDataProvider.getList()) {
|
||||
if (!oldControlPointsFromTableAlreadyHandled.contains(cpaoanb.getControlPoint())) {
|
||||
oldControlPointsFromTableAlreadyHandled.add(cpaoanb.getControlPoint());
|
||||
ControlPointDTO controlPointToAdd;
|
||||
if (controlPointsNeedingReplacement.contains(cpaoanb.getControlPoint())) {
|
||||
if (cpaoanb.getControlPoint() instanceof GateDTO) {
|
||||
controlPointToAdd = createGate((GateDTO) cpaoanb.getControlPoint());
|
||||
} else {
|
||||
controlPointToAdd = cpaoanb.getNewMark();
|
||||
}
|
||||
} else {
|
||||
controlPointToAdd = cpaoanb.getControlPoint();
|
||||
}
|
||||
controlPoints.add(new Pair<ControlPointDTO, PassingInstruction>(controlPointToAdd, cpaoanb.passingInstructions));
|
||||
}
|
||||
}
|
||||
protected void saveCourse(List<Pair<ControlPointDTO, PassingInstruction>> controlPoints) {
|
||||
sailingService.updateRaceCourse(singleSelectedRace, controlPoints, new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
@@ -75,13 +50,13 @@ public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
|
||||
@Override
|
||||
public void refresh() {
|
||||
if (singleSelectedRace != null && selectedRaceDTO != null) {
|
||||
courseActionsPanel.setVisible(true);
|
||||
// courseActionsPanel.setVisible(true);
|
||||
// TODO bug 1351: never use System.currentTimeMillis() on the client when trying to compare anything with "server time"; this one is not so urgent as it is reached only in the AdminConsole and we expect administrators to have proper client-side time settings
|
||||
sailingService.getRaceCourse(singleSelectedRace, new Date(), new AsyncCallback<RaceCourseDTO>() {
|
||||
@Override
|
||||
public void onSuccess(RaceCourseDTO raceCourseDTO) {
|
||||
updateWaypointTable(raceCourseDTO);
|
||||
updateMarksTable(raceCourseDTO);
|
||||
updateMarksTable(raceCourseDTO.getMarks());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -95,17 +70,6 @@ public class RaceCourseManagementPanel extends AbstractRaceManagementPanel {
|
||||
courseActionsPanel.setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateMarksTable(RaceCourseDTO raceCourseDTO) {
|
||||
markDataProvider.getList().clear();
|
||||
markDataProvider.getList().addAll(raceCourseDTO.getMarks());
|
||||
Collections.sort(markDataProvider.getList(), new Comparator<MarkDTO>() {
|
||||
@Override
|
||||
public int compare(MarkDTO o1, MarkDTO o2) {
|
||||
return o1.getName().compareTo(o2.getName());
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
this.selectedRaceContentPanel.add(courseManagementWidget);
|
||||
}
|
||||
|
||||
+67
-72
@@ -8,27 +8,56 @@ 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.google.gwt.user.client.ui.Panel;
|
||||
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,
|
||||
public class RaceLogTrackingCompetitorRegistrationsDialog extends RaceLogTrackingDialog {
|
||||
private CompetitorTableWrapper competitorTable;
|
||||
private final boolean filterByLeaderBoardInitially = false;
|
||||
private final boolean editable;
|
||||
|
||||
public RaceLogTrackingCompetitorRegistrationsDialog(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();
|
||||
super(sailingService, stringMessages, errorReporter, leaderboardName, raceColumnName, fleetName);
|
||||
this.editable = editable;
|
||||
|
||||
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) {}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addButtons(Panel buttonPanel) {
|
||||
final Button toggleOnlyLeaderboard = new Button(filterByLeaderBoardInitially ? stringMessages.removeLeaderboardFilter():
|
||||
stringMessages.filterByLeaderboard());
|
||||
toggleOnlyLeaderboard.addClickHandler(new ClickHandler() {
|
||||
@@ -50,72 +79,38 @@ public class CompetitorRegistrationsDialog extends DialogBox {
|
||||
}
|
||||
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);
|
||||
|
||||
|
||||
super.addButtons(buttonPanel);
|
||||
|
||||
saveButton.setEnabled(editable);
|
||||
saveButton.setTitle(stringMessages.canOnlyBeEditedBeforeStartingTracking());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addMainContent(Panel mainPanel) {
|
||||
super.addMainContent(mainPanel);
|
||||
|
||||
competitorTable = new CompetitorTableWrapper(sailingService, stringMessages, errorReporter);
|
||||
mainPanel.add(competitorTable);
|
||||
|
||||
competitorTable.refreshCompetitorList(filterByLeaderBoardInitially ? leaderboardName : null,
|
||||
true, new Callback<Iterable<CompetitorDTO>, Throwable>() {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void save() {
|
||||
sailingService.setCompetitorRegistrations(leaderboardName, raceColumnName, fleetName,
|
||||
competitorTable.getSelectionModel().getSelectedSet(), new AsyncCallback<Void>() {
|
||||
@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());
|
||||
}
|
||||
});
|
||||
public void onSuccess(Void result) {
|
||||
hide();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable reason) {}
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Could not save competitor registrations: " + caught.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
+136
@@ -0,0 +1,136 @@
|
||||
package com.sap.sailing.gwt.ui.adminconsole;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
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.Panel;
|
||||
import com.sap.sailing.domain.common.PassingInstruction;
|
||||
import com.sap.sailing.domain.common.impl.Util.Pair;
|
||||
import com.sap.sailing.gwt.ui.client.ErrorReporter;
|
||||
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.shared.ControlPointDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.MarkDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
|
||||
import com.sap.sse.gwt.ui.DataEntryDialog.DialogCallback;
|
||||
|
||||
public class RaceLogTrackingCourseDefinitionDialog extends RaceLogTrackingDialog {
|
||||
private class RaceLogCourseManagementWidget extends CourseManagementWidget {
|
||||
public RaceLogCourseManagementWidget(final SailingServiceAsync sailingService, final ErrorReporter errorReporter,
|
||||
final StringMessages stringMessages) {
|
||||
super(sailingService, errorReporter, stringMessages);
|
||||
|
||||
Button addMark = new Button(stringMessages.add(stringMessages.mark()));
|
||||
addMark.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
new MarkEditDialog(stringMessages, new MarkDTO(null, null), true, new DialogCallback<MarkDTO>() {
|
||||
@Override
|
||||
public void ok(MarkDTO mark) {
|
||||
sailingService.addMarkToRaceLog(leaderboardName, raceColumnName, fleetName, mark, new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onSuccess(Void result) {
|
||||
courseManagementWidget.refresh();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Could not add mark: " + caught.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void cancel() {}
|
||||
}).show();
|
||||
}
|
||||
});
|
||||
courseActionsPanel.insert(addMark, courseActionsPanel.getWidgetIndex(RaceLogCourseManagementWidget.this.saveButton));
|
||||
|
||||
Button cancel = new Button(stringMessages.cancel());
|
||||
cancel.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
hide();
|
||||
}
|
||||
});
|
||||
courseActionsPanel.insert(cancel, courseActionsPanel.getWidgetIndex(RaceLogCourseManagementWidget.this.saveButton));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void saveCourse(List<Pair<ControlPointDTO, PassingInstruction>> controlPoints) {
|
||||
sailingService.addCourseDefinitionToRaceLog(leaderboardName, raceColumnName, fleetName, controlPoints, new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onSuccess(Void result) {
|
||||
hide();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Could note save course: " + caught.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void refresh() {
|
||||
sailingService.getLastCourseDefinitionInRaceLog(leaderboardName, raceColumnName, fleetName, new AsyncCallback<RaceCourseDTO>() {
|
||||
@Override
|
||||
public void onSuccess(RaceCourseDTO result) {
|
||||
updateWaypointTable(result);
|
||||
if (result.waypoints.isEmpty()) {
|
||||
insertWaypointBefore.setEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Could not load course: " + caught.getMessage());
|
||||
}
|
||||
});
|
||||
|
||||
sailingService.getMarksInRaceLog(leaderboardName, raceColumnName, fleetName, new AsyncCallback<Collection<MarkDTO>>() {
|
||||
@Override
|
||||
public void onSuccess(Collection<MarkDTO> result) {
|
||||
updateMarksTable(result);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Could not load marks: " + caught.getMessage());
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
private CourseManagementWidget courseManagementWidget;
|
||||
|
||||
public RaceLogTrackingCourseDefinitionDialog(final SailingServiceAsync sailingService, final StringMessages stringMessages,
|
||||
final ErrorReporter errorReporter, final String leaderboardName, final String raceColumnName, final String fleetName) {
|
||||
super(sailingService, stringMessages, errorReporter, leaderboardName, raceColumnName, fleetName);
|
||||
|
||||
courseManagementWidget.refresh();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addMainContent(Panel mainPanel) {
|
||||
super.addMainContent(mainPanel);
|
||||
|
||||
courseManagementWidget = new RaceLogCourseManagementWidget(sailingService, errorReporter, stringMessages);
|
||||
mainPanel.add(courseManagementWidget);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addButtons(Panel buttonPanel) {
|
||||
//reuse buttons of widget
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void save() {
|
||||
//won't be called, as we are reusing widget buttons
|
||||
}
|
||||
}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
package com.sap.sailing.gwt.ui.adminconsole;
|
||||
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
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.Panel;
|
||||
import com.google.gwt.user.client.ui.VerticalPanel;
|
||||
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 abstract class RaceLogTrackingDialog extends DialogBox {
|
||||
protected final SailingServiceAsync sailingService;
|
||||
protected final StringMessages stringMessages;
|
||||
protected final ErrorReporter errorReporter;
|
||||
protected final String leaderboardName;
|
||||
protected final String raceColumnName;
|
||||
protected final String fleetName;
|
||||
protected Button saveButton;
|
||||
|
||||
public RaceLogTrackingDialog(SailingServiceAsync sailingService, StringMessages stringMessages,
|
||||
ErrorReporter errorReporter, String leaderboardName, String raceColumnName, String fleetName) {
|
||||
this.sailingService = sailingService;
|
||||
this.stringMessages = stringMessages;
|
||||
this.errorReporter = errorReporter;
|
||||
this.leaderboardName = leaderboardName;
|
||||
this.raceColumnName = raceColumnName;
|
||||
this.fleetName = fleetName;
|
||||
|
||||
VerticalPanel mainPanel = new VerticalPanel();
|
||||
setWidget(mainPanel);
|
||||
|
||||
addMainContent(mainPanel);
|
||||
center();
|
||||
}
|
||||
|
||||
protected void addMainContent(Panel mainPanel) {
|
||||
HorizontalPanel buttonPanel = new HorizontalPanel();
|
||||
mainPanel.add(buttonPanel);
|
||||
|
||||
addButtons(buttonPanel);
|
||||
}
|
||||
|
||||
protected void addButtons(Panel buttonPanel) {
|
||||
Button cancel = new Button(stringMessages.cancel());
|
||||
cancel.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
hide();
|
||||
}
|
||||
});
|
||||
saveButton = new Button(stringMessages.save());
|
||||
saveButton.setTitle(stringMessages.canOnlyBeEditedBeforeStartingTracking());
|
||||
saveButton.addClickHandler(new ClickHandler() {
|
||||
@Override
|
||||
public void onClick(ClickEvent event) {
|
||||
save();
|
||||
}
|
||||
});
|
||||
buttonPanel.add(cancel);
|
||||
buttonPanel.add(saveButton);
|
||||
}
|
||||
|
||||
protected abstract void save();
|
||||
}
|
||||
+5
-2
@@ -101,6 +101,9 @@ public class RaceLogTrackingEventManagementPanel extends AbstractLeaderboardConf
|
||||
raceActionColumn.setFieldUpdater(new FieldUpdater<RaceColumnDTOAndFleetDTOWithNameBasedEquality, String>() {
|
||||
@Override
|
||||
public void update(int index, RaceColumnDTOAndFleetDTOWithNameBasedEquality object, String value) {
|
||||
String leaderboardName = getSelectedLeaderboardName();
|
||||
String raceColumnName = object.getA().getName();
|
||||
String fleetName = object.getB().getName();
|
||||
if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_ADD_RACELOG_TRACKER.equals(value)) {
|
||||
addRaceLogTracker(object.getA(), object.getB());
|
||||
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_DENOTE_FOR_RACELOG_TRACKING.equals(value)) {
|
||||
@@ -109,10 +112,10 @@ public class RaceLogTrackingEventManagementPanel extends AbstractLeaderboardConf
|
||||
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,
|
||||
new RaceLogTrackingCompetitorRegistrationsDialog(sailingService, stringMessages, errorReporter,
|
||||
getSelectedLeaderboardName(), object.getA().getName(), object.getB().getName(), editable).show();
|
||||
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_DEFINE_COURSE.equals(value)) {
|
||||
//TODO
|
||||
new RaceLogTrackingCourseDefinitionDialog(sailingService, stringMessages, errorReporter, leaderboardName, raceColumnName, fleetName).show();
|
||||
} else if (RaceLogTrackingEventManagementRaceImagesBarCell.ACTION_MAP_DEVICES.equals(value)) {
|
||||
//TODO
|
||||
}
|
||||
|
||||
+15
@@ -12,6 +12,7 @@ import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
|
||||
import com.sap.sailing.datamining.shared.DataMiningSerializationDummy;
|
||||
import com.sap.sailing.datamining.shared.QueryDefinition;
|
||||
import com.sap.sailing.datamining.shared.QueryResult;
|
||||
import com.sap.sailing.domain.base.RaceDefinition;
|
||||
import com.sap.sailing.domain.common.DetailType;
|
||||
import com.sap.sailing.domain.common.LeaderboardType;
|
||||
import com.sap.sailing.domain.common.MasterDataImportObjectCreationCount;
|
||||
@@ -35,6 +36,7 @@ import com.sap.sailing.domain.common.dto.RegattaCreationParametersDTO;
|
||||
import com.sap.sailing.domain.common.impl.Util.Pair;
|
||||
import com.sap.sailing.domain.common.impl.Util.Triple;
|
||||
import com.sap.sailing.domain.common.racelog.tracking.RaceNotCreatedException;
|
||||
import com.sap.sailing.domain.racelog.RaceLog;
|
||||
import com.sap.sailing.gwt.ui.shared.BulkScoreCorrectionDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.CompactRaceMapDataDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.CompetitorsRaceDataDTO;
|
||||
@@ -48,6 +50,7 @@ import com.sap.sailing.gwt.ui.shared.EventDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.ManeuverDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.MarkDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceGroupDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceLogDTO;
|
||||
@@ -398,4 +401,16 @@ public interface SailingService extends RemoteService {
|
||||
void setCompetitorRegistrations(String leaderboardName, String raceColumnName, String fleetName, Set<CompetitorDTO> competitors);
|
||||
|
||||
Iterable<CompetitorDTO> getCompetitorRegistrations(String leaderboardName, String raceColumnName, String fleetName);
|
||||
|
||||
void addMarkToRaceLog(String leaderboardName, String raceColumnName, String fleetName, MarkDTO markDTO);
|
||||
|
||||
Collection<MarkDTO> getMarksInRaceLog(String leaderboardName, String raceColumnName, String fleetName);
|
||||
|
||||
/**
|
||||
* Adds the course definition to the racelog, while trying to reuse existing marks, controlpoints and waypoints
|
||||
* from the previous course definition in the racelog.
|
||||
*/
|
||||
void addCourseDefinitionToRaceLog(String leaderboardName, String raceColumnName, String fleetName, List<Pair<ControlPointDTO, PassingInstruction>> course);
|
||||
|
||||
RaceCourseDTO getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName, String fleetName);
|
||||
}
|
||||
+13
@@ -47,6 +47,7 @@ import com.sap.sailing.gwt.ui.shared.EventDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.GPSFixDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.ManeuverDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.MarkDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceCourseDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceGroupDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceLogDTO;
|
||||
@@ -535,5 +536,17 @@ public interface SailingServiceAsync {
|
||||
|
||||
void getCompetitorRegistrations(String leaderboardName, String raceColumnName, String fleetName,
|
||||
AsyncCallback<Iterable<CompetitorDTO>> callback);
|
||||
|
||||
void addMarkToRaceLog(String leaderboardName, String raceColumnName, String fleetName, MarkDTO markDTO,
|
||||
AsyncCallback<Void> callback);
|
||||
|
||||
void getMarksInRaceLog(String leaderboardName, String raceColumnName, String fleetName,
|
||||
AsyncCallback<Collection<MarkDTO>> callback);
|
||||
|
||||
void addCourseDefinitionToRaceLog(String leaderboardName, String raceColumnName, String fleetName,
|
||||
List<Pair<ControlPointDTO, PassingInstruction>> course, AsyncCallback<Void> callback);
|
||||
|
||||
void getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName, String fleetName,
|
||||
AsyncCallback<RaceCourseDTO> callback);
|
||||
}
|
||||
|
||||
+7
@@ -971,4 +971,11 @@ public interface StringMessages extends Messages {
|
||||
String canOnlyBeEditedBeforeStartingTracking();
|
||||
String defineCourse();
|
||||
String mapDevices();
|
||||
@Key("edit_what")
|
||||
String edit(String what);
|
||||
@Key("add_what")
|
||||
String add(String what);
|
||||
@Key("remove_what")
|
||||
String remove(String what);
|
||||
String pleaseEnterA(String what);
|
||||
}
|
||||
+5
-1
@@ -959,4 +959,8 @@ competitorRegistrations=Competitor Registrations
|
||||
trackerStatus=Tracker Status
|
||||
canOnlyBeEditedBeforeStartingTracking=Can only be edited before starting tracking
|
||||
defineCourse=Define Course Layout
|
||||
mapDevices=Map Devices to Competitors and Marks
|
||||
mapDevices=Map Devices to Competitors and Marks
|
||||
edit_what=Edit {0}
|
||||
add_what=Add {0}
|
||||
remove_what=Remove {0}
|
||||
pleaseEnterA=Please enter a {0}
|
||||
+5
-1
@@ -955,4 +955,8 @@ competitorRegistrations=Team Anmeldungen
|
||||
trackerStatus=Tracker-Status
|
||||
canOnlyBeEditedBeforeStartingTracking=Kann nur vor Beginn des Trackings bearbeitet werden
|
||||
defineCourse=Kurs definieren
|
||||
mapDevices=Gerätezuordnung zu Teams und Tonnen
|
||||
mapDevices=Gerätezuordnung zu Teams und Tonnen
|
||||
edit_what={0} bearbeiten
|
||||
add_what={0} hinzufügen
|
||||
remove_what={0} entfernen
|
||||
pleaseEnterA=Bitte {0} eingeben.
|
||||
+150
-38
@@ -86,6 +86,8 @@ import com.sap.sailing.domain.base.configuration.impl.RRS26ConfigurationImpl;
|
||||
import com.sap.sailing.domain.base.configuration.impl.RacingProcedureConfigurationImpl;
|
||||
import com.sap.sailing.domain.base.configuration.impl.RegattaConfigurationImpl;
|
||||
import com.sap.sailing.domain.base.impl.BoatImpl;
|
||||
import com.sap.sailing.domain.base.impl.CourseDataImpl;
|
||||
import com.sap.sailing.domain.base.impl.CourseImpl;
|
||||
import com.sap.sailing.domain.base.impl.DynamicBoat;
|
||||
import com.sap.sailing.domain.base.impl.DynamicPerson;
|
||||
import com.sap.sailing.domain.base.impl.DynamicTeam;
|
||||
@@ -180,6 +182,7 @@ import com.sap.sailing.domain.racelog.RaceLogEventFactory;
|
||||
import com.sap.sailing.domain.racelog.RaceLogFlagEvent;
|
||||
import com.sap.sailing.domain.racelog.RaceStateOfSameDayHelper;
|
||||
import com.sap.sailing.domain.racelog.analyzing.impl.AbortingFlagFinder;
|
||||
import com.sap.sailing.domain.racelog.analyzing.impl.LastPublishedCourseDesignFinder;
|
||||
import com.sap.sailing.domain.racelog.state.ReadonlyRaceState;
|
||||
import com.sap.sailing.domain.racelog.state.impl.ReadonlyRaceStateImpl;
|
||||
import com.sap.sailing.domain.racelog.state.racingprocedure.FlagPoleState;
|
||||
@@ -188,6 +191,7 @@ import com.sap.sailing.domain.racelog.state.racingprocedure.rrs26.ReadonlyRRS26R
|
||||
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.DefinedMarkFinder;
|
||||
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;
|
||||
@@ -1620,7 +1624,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
} else {
|
||||
final Position posOfFirst = trackedRace.getOrCreateTrack(controlPoint.getMarks().iterator().next()).
|
||||
getEstimatedPosition(timePoint, /* extrapolate */ false);
|
||||
result = new MarkDTO(controlPoint.getId().toString(), controlPoint.getName(), posOfFirst.getLatDeg(), posOfFirst.getLngDeg());
|
||||
result = new MarkDTO(controlPoint.getId().toString(), controlPoint.getName(), posOfFirst == null ? -1 : posOfFirst.getLatDeg(), posOfFirst == null ? -1 : posOfFirst.getLngDeg());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -1637,6 +1641,55 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* For each {@link ControlPointDTO} in <code>controlPoints</code> tries to find the best-matching waypoint
|
||||
* from the {@code old} {@code CourseBase}.
|
||||
* If such a waypoint is found, its control point is added to the control point list for the new course.
|
||||
* Otherwise, a new control point is created using the default {@link com.sap.sailing.domain.base.DomainFactory}
|
||||
* instance.
|
||||
*/
|
||||
private List<Pair<ControlPoint, PassingInstruction>> resolveControlPoints(
|
||||
CourseBase old, List<Pair<ControlPointDTO, PassingInstruction>> controlPoints) {
|
||||
Iterable<Waypoint> waypoints = old.getWaypoints();
|
||||
List<Pair<ControlPoint, PassingInstruction>> newControlPoints = new ArrayList<Pair<ControlPoint, PassingInstruction>>();
|
||||
int lastMatchPosition = -1;
|
||||
for (Pair<ControlPointDTO, PassingInstruction> controlPointAndPassingInstruction : controlPoints) {
|
||||
ControlPointDTO controlPointDTO = controlPointAndPassingInstruction.getA();
|
||||
ControlPoint matchFromOldCourse = null;
|
||||
for (int i=lastMatchPosition+1; matchFromOldCourse == null && i<Util.size(waypoints); i++) {
|
||||
Waypoint waypointAtI = Util.get(waypoints, i);
|
||||
ControlPoint controlPointAtI = waypointAtI.getControlPoint();
|
||||
if (controlPointAtI.getId().toString().equals(controlPointDTO.getIdAsString()) && markIDsMatch(controlPointAtI.getMarks(), controlPointDTO.getMarks())) {
|
||||
matchFromOldCourse = controlPointAtI;
|
||||
newControlPoints.add(new Pair<ControlPoint, PassingInstruction>(matchFromOldCourse, null));
|
||||
lastMatchPosition = i;
|
||||
}
|
||||
}
|
||||
if (matchFromOldCourse == null) {
|
||||
// no match found; create new control point:
|
||||
ControlPoint newControlPoint;
|
||||
if (controlPointDTO instanceof GateDTO) {
|
||||
GateDTO gateDTO = (GateDTO) controlPointDTO;
|
||||
final Serializable id;
|
||||
if (gateDTO.getIdAsString() == null) {
|
||||
id = UUID.randomUUID();
|
||||
} else {
|
||||
id = gateDTO.getIdAsString();
|
||||
}
|
||||
Mark left = baseDomainFactory.getOrCreateMark(gateDTO.getLeft().getIdAsString(), gateDTO.getLeft().getName());
|
||||
Mark right = baseDomainFactory.getOrCreateMark(gateDTO.getRight().getIdAsString(), gateDTO.getRight().getName());
|
||||
newControlPoint = baseDomainFactory.createControlPointWithTwoMarks(id, left, right, gateDTO.getName());
|
||||
newControlPoints.add(new Pair<ControlPoint, PassingInstruction>(newControlPoint, null));
|
||||
} else {
|
||||
newControlPoint = baseDomainFactory.getOrCreateMark(controlPointDTO.getIdAsString(), controlPointDTO.getName());
|
||||
PassingInstruction passingInstructions = controlPointAndPassingInstruction.getB();
|
||||
newControlPoints.add(new Pair<ControlPoint, PassingInstruction>(newControlPoint, passingInstructions));
|
||||
}
|
||||
}
|
||||
}
|
||||
return newControlPoints;
|
||||
}
|
||||
|
||||
/**
|
||||
* For each {@link ControlPointDTO} in <code>controlPoints</code> tries to find the best-matching waypoint
|
||||
* from the course that belongs to the race identified by <code>raceIdentifier</code>. If such a waypoint is
|
||||
@@ -1650,43 +1703,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
TrackedRace trackedRace = getExistingTrackedRace(raceIdentifier);
|
||||
if (trackedRace != null) {
|
||||
Course course = trackedRace.getRace().getCourse();
|
||||
Iterable<Waypoint> waypoints = course.getWaypoints();
|
||||
List<Pair<ControlPoint, PassingInstruction>> newControlPoints = new ArrayList<Pair<ControlPoint, PassingInstruction>>();
|
||||
int lastMatchPosition = -1;
|
||||
for (Pair<ControlPointDTO, PassingInstruction> controlPointAndPassingInstruction : controlPoints) {
|
||||
ControlPointDTO controlPointDTO = controlPointAndPassingInstruction.getA();
|
||||
ControlPoint matchFromOldCourse = null;
|
||||
for (int i=lastMatchPosition+1; matchFromOldCourse == null && i<Util.size(waypoints); i++) {
|
||||
Waypoint waypointAtI = Util.get(waypoints, i);
|
||||
ControlPoint controlPointAtI = waypointAtI.getControlPoint();
|
||||
if (controlPointAtI.getId().toString().equals(controlPointDTO.getIdAsString()) && markIDsMatch(controlPointAtI.getMarks(), controlPointDTO.getMarks())) {
|
||||
matchFromOldCourse = controlPointAtI;
|
||||
newControlPoints.add(new Pair<ControlPoint, PassingInstruction>(matchFromOldCourse, null));
|
||||
lastMatchPosition = i;
|
||||
}
|
||||
}
|
||||
if (matchFromOldCourse == null) {
|
||||
// no match found; create new control point:
|
||||
ControlPoint newControlPoint;
|
||||
if (controlPointDTO instanceof GateDTO) {
|
||||
GateDTO gateDTO = (GateDTO) controlPointDTO;
|
||||
final Serializable id;
|
||||
if (gateDTO.getIdAsString() == null) {
|
||||
id = UUID.randomUUID();
|
||||
} else {
|
||||
id = gateDTO.getIdAsString();
|
||||
}
|
||||
Mark left = baseDomainFactory.getOrCreateMark(gateDTO.getLeft().getIdAsString(), gateDTO.getLeft().getName());
|
||||
Mark right = baseDomainFactory.getOrCreateMark(gateDTO.getRight().getIdAsString(), gateDTO.getRight().getName());
|
||||
newControlPoint = baseDomainFactory.createControlPointWithTwoMarks(id, left, right, gateDTO.getName());
|
||||
newControlPoints.add(new Pair<ControlPoint, PassingInstruction>(newControlPoint, null));
|
||||
} else {
|
||||
newControlPoint = baseDomainFactory.getOrCreateMark(controlPointDTO.getIdAsString(), controlPointDTO.getName());
|
||||
PassingInstruction passingInstructions = controlPointAndPassingInstruction.getB();
|
||||
newControlPoints.add(new Pair<ControlPoint, PassingInstruction>(newControlPoint, passingInstructions));
|
||||
}
|
||||
}
|
||||
}
|
||||
List<Pair<ControlPoint, PassingInstruction>> newControlPoints = resolveControlPoints(course, controlPoints);
|
||||
try {
|
||||
course.update(newControlPoints, baseDomainFactory);
|
||||
} catch (Exception e) {
|
||||
@@ -3943,4 +3960,99 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
unregisterCompetitor(raceLog, c);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates new id, does not resolve against domain factory.
|
||||
*/
|
||||
private Mark convertToMark(MarkDTO dto) {
|
||||
// Mark existing = baseDomainFactory.getExistingMarkByIdAsString(dto.getIdAsString());
|
||||
// if (existing != null) {
|
||||
// return existing;
|
||||
// }
|
||||
|
||||
// Serializable id = dto.getIdAsString();
|
||||
// if (id == null) {
|
||||
Serializable id = UUID.randomUUID();
|
||||
// }
|
||||
|
||||
return baseDomainFactory.getOrCreateMark(id, dto.getName(), dto.type, dto.color, dto.shape, dto.pattern);
|
||||
}
|
||||
|
||||
private Collection<MarkDTO> convertToMarkDTOs(Iterable<Mark> marks) {
|
||||
List<MarkDTO> dtos = new ArrayList<MarkDTO>();
|
||||
for (Mark mark : marks) {
|
||||
dtos.add(convertToMarkDTO(mark, null));
|
||||
}
|
||||
return dtos;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addMarkToRaceLog(String leaderboardName, String raceColumnName, String fleetName, MarkDTO markDTO) {
|
||||
Mark mark = convertToMark(markDTO);
|
||||
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
|
||||
RaceLogEvent event = RaceLogEventFactory.INSTANCE.createDefineMarkEvent(MillisecondsTimePoint.now(),
|
||||
getService().getServerAuthor(), raceLog.getCurrentPassId(), mark);
|
||||
raceLog.add(event);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<MarkDTO> getMarksInRaceLog(String leaderboardName, String raceColumnName, String fleetName) {
|
||||
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
|
||||
Collection<Mark> marks = new DefinedMarkFinder(raceLog).analyze();
|
||||
return convertToMarkDTOs(marks);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addCourseDefinitionToRaceLog(String leaderboardName, String raceColumnName, String fleetName,
|
||||
List<Pair<ControlPointDTO, PassingInstruction>> courseDTO) {
|
||||
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
|
||||
String name = String.format("Course for %s - %s - %s", leaderboardName, raceColumnName, fleetName);
|
||||
|
||||
CourseBase lastPublishedCourse = new LastPublishedCourseDesignFinder(raceLog).analyze();
|
||||
if (lastPublishedCourse == null) {
|
||||
lastPublishedCourse = new CourseDataImpl(name);
|
||||
}
|
||||
|
||||
List<Pair<ControlPoint, PassingInstruction>> waypoints = resolveControlPoints(lastPublishedCourse, courseDTO);
|
||||
Course course = new CourseImpl(name, lastPublishedCourse.getWaypoints());
|
||||
|
||||
try {
|
||||
course.update(waypoints, baseDomainFactory);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
RaceLogEvent event = RaceLogEventFactory.INSTANCE.createCourseDesignChangedEvent(MillisecondsTimePoint.now(),
|
||||
getService().getServerAuthor(), raceLog.getCurrentPassId(), course);
|
||||
raceLog.add(event);
|
||||
}
|
||||
|
||||
private WaypointDTO convertToWaypointDTO(Waypoint waypoint) {
|
||||
ControlPointDTO cp = convertToControlPointDTO(waypoint.getControlPoint());
|
||||
List<MarkDTO> marks = new ArrayList<MarkDTO>();
|
||||
Util.addAll(cp.getMarks(), marks);
|
||||
return new WaypointDTO(waypoint.getName(), cp, marks, waypoint.getPassingInstructions());
|
||||
}
|
||||
|
||||
private RaceCourseDTO convertToRaceCourseDTO(CourseBase course) {
|
||||
List<WaypointDTO> waypointDTOs = new ArrayList<WaypointDTO>();
|
||||
RaceCourseDTO result = new RaceCourseDTO(waypointDTOs);
|
||||
for (Waypoint waypoint : course.getWaypoints()) {
|
||||
waypointDTOs.add(convertToWaypointDTO(waypoint));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RaceCourseDTO getLastCourseDefinitionInRaceLog(String leaderboardName, String raceColumnName,
|
||||
String fleetName) {
|
||||
RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName);
|
||||
|
||||
CourseBase lastPublishedCourse = new LastPublishedCourseDesignFinder(raceLog).analyze();
|
||||
if (lastPublishedCourse == null) {
|
||||
lastPublishedCourse = new CourseDataImpl("");
|
||||
}
|
||||
|
||||
return convertToRaceCourseDTO(lastPublishedCourse);
|
||||
}
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package com.sap.sailing.gwt.ui.shared;
|
||||
|
||||
public enum HtmlPredefinedColor {
|
||||
aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, orange, purple, red, silver, teal, white, yellow
|
||||
}
|
||||
Reference in new issue
Block a user