mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-07 21:01:03 +00:00
Splitted the regatta table in RegattaManagementPanel into a smaller regatta overview list and a details view for a selected regatta.
Added sorting and filtering to the overview list. Improved series editing.
This commit is contained in:
1 parent
3b0ef2bb01
commit
a28d185a71
12 files changed
+832
-306
No files matched your search
+30
@@ -0,0 +1,30 @@
|
||||
package com.sap.sailing.gwt.ui.adminconsole;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.text.shared.SafeHtmlRenderer;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
|
||||
public class EventConfigImagesBarCell extends ImagesBarCell {
|
||||
static final String ACTION_REMOVE = "ACTION_REMOVE";
|
||||
static final String ACTION_EDIT = "ACTION_EDIT";
|
||||
private final StringMessages stringMessages;
|
||||
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
|
||||
|
||||
public EventConfigImagesBarCell(StringMessages stringConstants) {
|
||||
super();
|
||||
this.stringMessages = stringConstants;
|
||||
}
|
||||
|
||||
public EventConfigImagesBarCell(SafeHtmlRenderer<String> renderer, StringMessages stringMessages) {
|
||||
super();
|
||||
this.stringMessages = stringMessages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<ImageSpec> getImageSpecs() {
|
||||
return Arrays.asList(new ImageSpec(ACTION_EDIT, stringMessages.actionEdit(), makeImagePrototype(resources.editIcon())),
|
||||
new ImageSpec(ACTION_REMOVE, stringMessages.actionRemove(), makeImagePrototype(resources.removeIcon())));
|
||||
}
|
||||
}
|
||||
+49
-49
@@ -37,7 +37,8 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
|
||||
private final boolean hasOneSeries;
|
||||
private Grid raceColumnsGrid;
|
||||
private VerticalPanel additionalWidgetPanel;
|
||||
|
||||
private final SeriesDTO preSelectedSeries;
|
||||
|
||||
private static class RaceDialogValidator implements Validator<Pair<SeriesDTO, List<RaceColumnDTO>>> {
|
||||
private StringMessages stringConstants;
|
||||
private RegattaDTO regatta;
|
||||
@@ -54,66 +55,63 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
|
||||
List<RaceColumnDTO> raceColumnsToValidate = valueToValidate.getB();
|
||||
|
||||
String errorMessage = null;
|
||||
if(seriesToValidate == null) {
|
||||
errorMessage = stringConstants.pleaseSelectASeries();
|
||||
} else {
|
||||
for (SeriesDTO seriesDTO: regatta.series) {
|
||||
if(!seriesDTO.name.equals(seriesToValidate.name)) {
|
||||
for(RaceColumnDTO raceColumn: seriesDTO.getRaceColumns()) {
|
||||
raceColumnNamesOfOtherSeries.add(raceColumn.name);
|
||||
}
|
||||
for (SeriesDTO seriesDTO: regatta.series) {
|
||||
if(!seriesDTO.name.equals(seriesToValidate.name)) {
|
||||
for(RaceColumnDTO raceColumn: seriesDTO.getRaceColumns()) {
|
||||
raceColumnNamesOfOtherSeries.add(raceColumn.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
boolean raceColumnNameNotEmpty = true;
|
||||
RaceColumnDTO wrongRaceColumn = null;
|
||||
|
||||
for (RaceColumnDTO raceColumn : raceColumnsToValidate) {
|
||||
raceColumnNameNotEmpty = raceColumn.name != null && raceColumn.name.length() > 0;
|
||||
if (!raceColumnNameNotEmpty) {
|
||||
wrongRaceColumn = raceColumn;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
boolean raceColumnUniqueInSeries = true;
|
||||
boolean raceColumnUniqueInRegatta = true;
|
||||
|
||||
HashSet<String> setToFindDuplicates = new HashSet<String>();
|
||||
for (RaceColumnDTO raceColumn : raceColumnsToValidate) {
|
||||
if (!setToFindDuplicates.add(raceColumn.name)) {
|
||||
raceColumnUniqueInSeries = false;
|
||||
wrongRaceColumn = raceColumn;
|
||||
break;
|
||||
} else if(raceColumnNamesOfOtherSeries.contains(raceColumn.name)) {
|
||||
raceColumnUniqueInRegatta = false;
|
||||
wrongRaceColumn = raceColumn;
|
||||
break;
|
||||
}
|
||||
}
|
||||
boolean raceColumnNameNotEmpty = true;
|
||||
RaceColumnDTO wrongRaceColumn = null;
|
||||
|
||||
for (RaceColumnDTO raceColumn : raceColumnsToValidate) {
|
||||
raceColumnNameNotEmpty = raceColumn.name != null && raceColumn.name.length() > 0;
|
||||
if (!raceColumnNameNotEmpty) {
|
||||
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
|
||||
+ stringConstants.pleaseEnterAName();
|
||||
} else if (!raceColumnUniqueInSeries) {
|
||||
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
|
||||
+ stringConstants.raceWithThisNameAlreadyExists();
|
||||
} else if (!raceColumnUniqueInRegatta) {
|
||||
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
|
||||
+ stringConstants.raceWithThisNameAlreadyExistsInRegatta();
|
||||
wrongRaceColumn = raceColumn;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
boolean raceColumnUniqueInSeries = true;
|
||||
boolean raceColumnUniqueInRegatta = true;
|
||||
|
||||
HashSet<String> setToFindDuplicates = new HashSet<String>();
|
||||
for (RaceColumnDTO raceColumn : raceColumnsToValidate) {
|
||||
if (!setToFindDuplicates.add(raceColumn.name)) {
|
||||
raceColumnUniqueInSeries = false;
|
||||
wrongRaceColumn = raceColumn;
|
||||
break;
|
||||
} else if(raceColumnNamesOfOtherSeries.contains(raceColumn.name)) {
|
||||
raceColumnUniqueInRegatta = false;
|
||||
wrongRaceColumn = raceColumn;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!raceColumnNameNotEmpty) {
|
||||
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
|
||||
+ stringConstants.pleaseEnterAName();
|
||||
} else if (!raceColumnUniqueInSeries) {
|
||||
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
|
||||
+ stringConstants.raceWithThisNameAlreadyExists();
|
||||
} else if (!raceColumnUniqueInRegatta) {
|
||||
errorMessage = stringConstants.race() + " " + wrongRaceColumn.name + ": "
|
||||
+ stringConstants.raceWithThisNameAlreadyExistsInRegatta();
|
||||
}
|
||||
|
||||
return errorMessage;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public RaceColumnInRegattaSeriesDialog(RegattaDTO regatta, StringMessages stringConstants,
|
||||
public RaceColumnInRegattaSeriesDialog(RegattaDTO regatta, SeriesDTO preSelectedSeries, StringMessages stringConstants,
|
||||
DialogCallback<Pair<SeriesDTO, List<RaceColumnDTO>>> callback) {
|
||||
super(stringConstants.actionEditRaces(), null, stringConstants.ok(), stringConstants.cancel(),
|
||||
new RaceDialogValidator(regatta, stringConstants), callback);
|
||||
this.regatta = regatta;
|
||||
this.preSelectedSeries = preSelectedSeries;
|
||||
this.stringMessages = stringConstants;
|
||||
this.hasOneSeries = regatta.series.size() == 1;
|
||||
seriesListBox = createListBox(false);
|
||||
@@ -206,9 +204,13 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
|
||||
raceNamePrefixTextBox.setText(seriesName.substring(0, 1).toUpperCase());
|
||||
}
|
||||
} else {
|
||||
seriesListBox.addItem(stringMessages.pleaseSelectASeries());
|
||||
int i = 0;
|
||||
for (SeriesDTO series : regatta.series) {
|
||||
seriesListBox.addItem(series.name);
|
||||
if(series.name.equals(preSelectedSeries.name)) {
|
||||
seriesListBox.setSelectedIndex(i);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -233,7 +235,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
|
||||
addRacesPanel.setSpacing(3);
|
||||
addRacesPanel.add(new Label(stringMessages.add()));
|
||||
addRacesPanel.add(addRacesListBox);
|
||||
for(int i = 1; i <= 10; i++) {
|
||||
for(int i = 1; i <= 50; i++) {
|
||||
addRacesListBox.addItem("" + i);
|
||||
}
|
||||
addRacesListBox.setSelectedIndex(0);
|
||||
@@ -270,9 +272,7 @@ public class RaceColumnInRegattaSeriesDialog extends DataEntryDialog<Pair<Series
|
||||
additionalWidgetPanel.add(createHeadlineLabel(stringMessages.races()));
|
||||
additionalWidgetPanel.add(raceColumnsGrid);
|
||||
|
||||
if(hasOneSeries) {
|
||||
fillExistingRacesOfSeries();
|
||||
}
|
||||
fillExistingRacesOfSeries();
|
||||
|
||||
return additionalWidgetPanel;
|
||||
}
|
||||
|
||||
+1
-3
@@ -8,7 +8,6 @@ import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
|
||||
public class RegattaConfigImagesBarCell extends ImagesBarCell {
|
||||
static final String ACTION_REMOVE = "ACTION_REMOVE";
|
||||
static final String ACTION_EDIT = "ACTION_EDIT";
|
||||
private final StringMessages stringMessages;
|
||||
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
|
||||
|
||||
@@ -24,7 +23,6 @@ public class RegattaConfigImagesBarCell extends ImagesBarCell {
|
||||
|
||||
@Override
|
||||
protected Iterable<ImageSpec> getImageSpecs() {
|
||||
return Arrays.asList(new ImageSpec(ACTION_EDIT, stringMessages.actionEdit(), makeImagePrototype(resources.editIcon())),
|
||||
new ImageSpec(ACTION_REMOVE, stringMessages.actionRemove(), makeImagePrototype(resources.removeIcon())));
|
||||
return Arrays.asList(new ImageSpec(ACTION_REMOVE, stringMessages.actionRemove(), makeImagePrototype(resources.removeIcon())));
|
||||
}
|
||||
}
|
||||
+268
@@ -0,0 +1,268 @@
|
||||
package com.sap.sailing.gwt.ui.adminconsole;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gwt.cell.client.FieldUpdater;
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.user.cellview.client.CellTable;
|
||||
import com.google.gwt.user.cellview.client.TextColumn;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.CaptionPanel;
|
||||
import com.google.gwt.user.client.ui.Composite;
|
||||
import com.google.gwt.user.client.ui.Grid;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.VerticalPanel;
|
||||
import com.google.gwt.view.client.ListDataProvider;
|
||||
import com.google.gwt.view.client.SelectionChangeEvent;
|
||||
import com.google.gwt.view.client.SelectionModel;
|
||||
import com.google.gwt.view.client.SingleSelectionModel;
|
||||
import com.sap.sailing.domain.common.RegattaIdentifier;
|
||||
import com.sap.sailing.domain.common.RegattaName;
|
||||
import com.sap.sailing.domain.common.ScoringSchemeType;
|
||||
import com.sap.sailing.domain.common.impl.Util.Pair;
|
||||
import com.sap.sailing.gwt.ui.client.ErrorReporter;
|
||||
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.client.DataEntryDialog.DialogCallback;
|
||||
import com.sap.sailing.gwt.ui.leaderboard.ScoringSchemeTypeFormatter;
|
||||
import com.sap.sailing.gwt.ui.shared.FleetDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceColumnDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceColumnInSeriesDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.SeriesDTO;
|
||||
|
||||
|
||||
public class RegattaDetailsComposite extends Composite {
|
||||
private RegattaDTO regatta;
|
||||
|
||||
private final CaptionPanel mainPanel;
|
||||
|
||||
private final SailingServiceAsync sailingService;
|
||||
private final ErrorReporter errorReporter;
|
||||
private final StringMessages stringMessages;
|
||||
private final RegattaRefresher regattaRefresher;
|
||||
|
||||
private final Label regattaName;
|
||||
private final Label boatClassName;
|
||||
private final Label scoringSystem;
|
||||
|
||||
private final SelectionModel<SeriesDTO> seriesSelectionModel;
|
||||
private final CellTable<SeriesDTO> seriesTable;
|
||||
private ListDataProvider<SeriesDTO> seriesListDataProvider;
|
||||
|
||||
private static AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
|
||||
|
||||
public RegattaDetailsComposite(final SailingServiceAsync sailingService, final RegattaRefresher regattaRefresher,
|
||||
final ErrorReporter errorReporter, final StringMessages stringMessages) {
|
||||
this.sailingService = sailingService;
|
||||
this.regattaRefresher = regattaRefresher;
|
||||
this.errorReporter = errorReporter;
|
||||
this.stringMessages = stringMessages;
|
||||
|
||||
regatta = null;
|
||||
|
||||
mainPanel = new CaptionPanel(stringMessages.regatta());
|
||||
VerticalPanel vPanel = new VerticalPanel();
|
||||
mainPanel.add(vPanel);
|
||||
|
||||
Grid grid = new Grid(3, 2);
|
||||
vPanel.add(grid);
|
||||
|
||||
regattaName = new Label();
|
||||
grid.setWidget(0 , 0, new Label(stringMessages.regattaName() + ":"));
|
||||
grid.setWidget(0 , 1, regattaName);
|
||||
|
||||
boatClassName = new Label();
|
||||
grid.setWidget(1 , 0, new Label(stringMessages.boatClass() + ":"));
|
||||
grid.setWidget(1 , 1, boatClassName);
|
||||
|
||||
scoringSystem = new Label();
|
||||
grid.setWidget(2 , 0, new Label(stringMessages.scoringSystem() + ":"));
|
||||
grid.setWidget(2 , 1, scoringSystem);
|
||||
|
||||
seriesTable = createRegattaSeriesTable();
|
||||
seriesSelectionModel = new SingleSelectionModel<SeriesDTO>();
|
||||
seriesSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
|
||||
@Override
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
}
|
||||
});
|
||||
seriesTable.setSelectionModel(seriesSelectionModel);
|
||||
|
||||
seriesListDataProvider = new ListDataProvider<SeriesDTO>();
|
||||
seriesListDataProvider.addDataDisplay(seriesTable);
|
||||
vPanel.add(seriesTable);
|
||||
|
||||
initWidget(mainPanel);
|
||||
}
|
||||
|
||||
private CellTable<SeriesDTO> createRegattaSeriesTable() {
|
||||
CellTable<SeriesDTO> table = new CellTable<SeriesDTO>(/* pageSize */10000, tableRes);
|
||||
table.setWidth("100%");
|
||||
|
||||
TextColumn<SeriesDTO> seriesNameColumn = new TextColumn<SeriesDTO>() {
|
||||
@Override
|
||||
public String getValue(SeriesDTO series) {
|
||||
return series.name;
|
||||
}
|
||||
};
|
||||
|
||||
TextColumn<SeriesDTO> isMedalSeriesColumn = new TextColumn<SeriesDTO>() {
|
||||
@Override
|
||||
public String getValue(SeriesDTO series) {
|
||||
return series.isMedal() ? stringMessages.yes() : stringMessages.no();
|
||||
}
|
||||
};
|
||||
|
||||
TextColumn<SeriesDTO> racesColumn = new TextColumn<SeriesDTO>() {
|
||||
@Override
|
||||
public String getValue(SeriesDTO series) {
|
||||
String result = "";
|
||||
if(!series.getRaceColumns().isEmpty()) {
|
||||
int raceColumnsCount = series.getRaceColumns().size();
|
||||
int i = 1;
|
||||
for(RaceColumnDTO raceColumn: series.getRaceColumns()) {
|
||||
result += raceColumn.getRaceColumnName();
|
||||
if(i < raceColumnsCount) {
|
||||
result += ", ";
|
||||
}
|
||||
i++;
|
||||
}
|
||||
} else {
|
||||
result = stringMessages.noRacesYet();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
TextColumn<SeriesDTO> fleetsColumn = new TextColumn<SeriesDTO>() {
|
||||
@Override
|
||||
public String getValue(SeriesDTO series) {
|
||||
String result = "";
|
||||
int fleetsCount = series.getFleets().size();
|
||||
int i = 1;
|
||||
for(FleetDTO fleet: series.getFleets()) {
|
||||
result += fleet.name;
|
||||
result += "(" + fleet.getOrderNo() + ") ";
|
||||
if (i < fleetsCount) {
|
||||
result += ", ";
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
ImagesBarColumn<SeriesDTO, SeriesConfigImagesBarCell> seriesActionColumn = new ImagesBarColumn<SeriesDTO, SeriesConfigImagesBarCell>(
|
||||
new SeriesConfigImagesBarCell(stringMessages));
|
||||
seriesActionColumn.setFieldUpdater(new FieldUpdater<SeriesDTO, String>() {
|
||||
@Override
|
||||
public void update(int index, SeriesDTO series, String value) {
|
||||
if (SeriesConfigImagesBarCell.ACTION_EDIT.equals(value)) {
|
||||
editRacesOfRegattaSeries(regatta, series);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
table.addColumn(seriesNameColumn, stringMessages.series());
|
||||
table.addColumn(isMedalSeriesColumn, stringMessages.medalSeries());
|
||||
table.addColumn(racesColumn, stringMessages.races());
|
||||
table.addColumn(fleetsColumn, stringMessages.fleets());
|
||||
table.addColumn(seriesActionColumn, stringMessages.actions());
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
public RegattaDTO getRegatta() {
|
||||
return regatta;
|
||||
}
|
||||
|
||||
public void setRegatta(RegattaDTO regatta) {
|
||||
this.regatta = regatta;
|
||||
|
||||
updateRegattaDetails();
|
||||
}
|
||||
|
||||
private void editRacesOfRegattaSeries(final RegattaDTO regatta, final SeriesDTO series) {
|
||||
RaceColumnInRegattaSeriesDialog raceDialog = new RaceColumnInRegattaSeriesDialog(regatta, series, stringMessages,
|
||||
new DialogCallback<Pair<SeriesDTO, List<RaceColumnDTO>>>() {
|
||||
@Override
|
||||
public void cancel() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ok(final Pair<SeriesDTO, List<RaceColumnDTO>> result) {
|
||||
updateRacesOfRegattaSeries(regatta, result.getA(), result.getB());
|
||||
}
|
||||
});
|
||||
raceDialog.show();
|
||||
}
|
||||
|
||||
private void updateRacesOfRegattaSeries(final RegattaDTO regatta, final SeriesDTO series, List<RaceColumnDTO> newRaceColumns) {
|
||||
final RegattaIdentifier regattaIdentifier = new RegattaName(regatta.name);
|
||||
|
||||
List<RaceColumnDTO> existingRaceColumns = series.getRaceColumns();
|
||||
final List<String> raceColumnsToAdd = new ArrayList<String>();
|
||||
final List<String> raceColumnsToRemove = new ArrayList<String>();
|
||||
|
||||
for(RaceColumnDTO newRaceColumn: newRaceColumns) {
|
||||
if(!existingRaceColumns.contains(newRaceColumn)) {
|
||||
raceColumnsToAdd.add(newRaceColumn.name);
|
||||
}
|
||||
}
|
||||
|
||||
for(RaceColumnDTO existingRaceColumn: existingRaceColumns) {
|
||||
if(!newRaceColumns.contains(existingRaceColumn)) {
|
||||
raceColumnsToRemove.add(existingRaceColumn.name);
|
||||
}
|
||||
}
|
||||
|
||||
sailingService.addRaceColumnsToSeries(regattaIdentifier, series.name, raceColumnsToAdd, new AsyncCallback<List<RaceColumnInSeriesDTO>>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Error trying to add race columns "
|
||||
+ raceColumnsToAdd + " to series " + series.name
|
||||
+ ": " + caught.getMessage());
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(List<RaceColumnInSeriesDTO> raceColumns) {
|
||||
regattaRefresher.fillRegattas();
|
||||
updateRegattaDetails();
|
||||
}
|
||||
});
|
||||
|
||||
sailingService.removeRaceColumnsFromSeries(regattaIdentifier, series.name, raceColumnsToRemove, new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Error trying to remove race columns "
|
||||
+ raceColumnsToAdd + " from series " + series.name
|
||||
+ ": " + caught.getMessage());
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(Void v) {
|
||||
regattaRefresher.fillRegattas();
|
||||
updateRegattaDetails();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void updateRegattaDetails() {
|
||||
if(regatta != null) {
|
||||
regattaName.setText(regatta.name);
|
||||
boatClassName.setText(regatta.boatClass != null ? regatta.boatClass.name : "");
|
||||
|
||||
ScoringSchemeType scoringScheme = regatta.scoringScheme;
|
||||
String scoringSystemText = scoringScheme == null ? "" : ScoringSchemeTypeFormatter.format(scoringScheme, stringMessages);
|
||||
scoringSystem.setText(scoringSystemText);
|
||||
|
||||
seriesListDataProvider.getList().clear();
|
||||
seriesListDataProvider.getList().addAll(regatta.series);
|
||||
}
|
||||
}
|
||||
}
|
||||
+255
@@ -0,0 +1,255 @@
|
||||
package com.sap.sailing.gwt.ui.adminconsole;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gwt.cell.client.AbstractCell;
|
||||
import com.google.gwt.cell.client.FieldUpdater;
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.event.dom.client.KeyUpEvent;
|
||||
import com.google.gwt.event.dom.client.KeyUpHandler;
|
||||
import com.google.gwt.safehtml.shared.SafeHtml;
|
||||
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
|
||||
import com.google.gwt.user.cellview.client.CellTable;
|
||||
import com.google.gwt.user.cellview.client.ColumnSortEvent;
|
||||
import com.google.gwt.user.cellview.client.ColumnSortEvent.ListHandler;
|
||||
import com.google.gwt.user.cellview.client.TextColumn;
|
||||
import com.google.gwt.user.client.Window;
|
||||
import com.google.gwt.user.client.rpc.AsyncCallback;
|
||||
import com.google.gwt.user.client.ui.HasVerticalAlignment;
|
||||
import com.google.gwt.user.client.ui.HorizontalPanel;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.SimplePanel;
|
||||
import com.google.gwt.user.client.ui.TextBox;
|
||||
import com.google.gwt.user.client.ui.VerticalPanel;
|
||||
import com.google.gwt.view.client.ListDataProvider;
|
||||
import com.google.gwt.view.client.SelectionChangeEvent;
|
||||
import com.google.gwt.view.client.SelectionModel;
|
||||
import com.google.gwt.view.client.SingleSelectionModel;
|
||||
import com.sap.sailing.domain.common.RegattaIdentifier;
|
||||
import com.sap.sailing.domain.common.RegattaName;
|
||||
import com.sap.sailing.gwt.ui.client.ErrorReporter;
|
||||
import com.sap.sailing.gwt.ui.client.RegattaDisplayer;
|
||||
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
|
||||
import com.sap.sailing.gwt.ui.client.RegattaSelectionProvider;
|
||||
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
|
||||
|
||||
public class RegattaListComposite extends SimplePanel implements RegattaDisplayer {
|
||||
|
||||
private final SelectionModel<RegattaDTO> regattaSelectionModel;
|
||||
private final CellTable<RegattaDTO> regattaTable;
|
||||
private ListDataProvider<RegattaDTO> regattaListDataProvider;
|
||||
private List<RegattaDTO> allRegattas;
|
||||
private final VerticalPanel panel;
|
||||
|
||||
private final Label noRegattasLabel;
|
||||
|
||||
private final SailingServiceAsync sailingService;
|
||||
private final RegattaSelectionProvider regattaSelectionProvider;
|
||||
private final ErrorReporter errorReporter;
|
||||
private final RegattaRefresher regattaRefresher;
|
||||
private final StringMessages stringMessages;
|
||||
|
||||
private final TextBox filterRegattasTextbox;
|
||||
|
||||
private static AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
|
||||
|
||||
public static class AnchorCell extends AbstractCell<SafeHtml> {
|
||||
@Override
|
||||
public void render(com.google.gwt.cell.client.Cell.Context context, SafeHtml safeHtml, SafeHtmlBuilder sb) {
|
||||
sb.append(safeHtml);
|
||||
}
|
||||
}
|
||||
|
||||
public RegattaListComposite(final SailingServiceAsync sailingService, final RegattaSelectionProvider regattaSelectionProvider,
|
||||
RegattaRefresher regattaRefresher, final ErrorReporter errorReporter, final StringMessages stringMessages) {
|
||||
this.sailingService = sailingService;
|
||||
this.regattaSelectionProvider = regattaSelectionProvider;
|
||||
this.regattaRefresher = regattaRefresher;
|
||||
this.errorReporter = errorReporter;
|
||||
this.stringMessages = stringMessages;
|
||||
|
||||
panel = new VerticalPanel();
|
||||
setWidget(panel);
|
||||
|
||||
HorizontalPanel filterPanel = new HorizontalPanel();
|
||||
panel.add(filterPanel);
|
||||
Label filterRegattasLabel = new Label(stringMessages.filterRacesByName() + ":");
|
||||
filterRegattasLabel.setWordWrap(false);
|
||||
filterPanel.setSpacing(5);
|
||||
filterPanel.add(filterRegattasLabel);
|
||||
filterPanel.setCellVerticalAlignment(filterRegattasLabel, HasVerticalAlignment.ALIGN_MIDDLE);
|
||||
filterRegattasTextbox = new TextBox();
|
||||
filterRegattasTextbox.addKeyUpHandler(new KeyUpHandler() {
|
||||
@Override
|
||||
public void onKeyUp(KeyUpEvent event) {
|
||||
updateFilteredRegattasList();
|
||||
}
|
||||
});
|
||||
filterPanel.add(filterRegattasTextbox);
|
||||
|
||||
noRegattasLabel = new Label(stringMessages.noRacesYet());
|
||||
noRegattasLabel.setWordWrap(false);
|
||||
panel.add(noRegattasLabel);
|
||||
|
||||
regattaListDataProvider = new ListDataProvider<RegattaDTO>();
|
||||
regattaTable = createRegattaTable();
|
||||
regattaTable.setVisible(false);
|
||||
|
||||
regattaSelectionModel = new SingleSelectionModel<RegattaDTO>();
|
||||
regattaSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
|
||||
@Override
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
List<RegattaDTO> selectedRegattas = getSelectedRegattas();
|
||||
List<RegattaIdentifier> selectedRaceIdentifiers = new ArrayList<RegattaIdentifier>();
|
||||
for (RegattaDTO selectedRegatta : selectedRegattas) {
|
||||
selectedRaceIdentifiers.add(selectedRegatta.getRegattaIdentifier());
|
||||
}
|
||||
RegattaListComposite.this.regattaSelectionProvider.setSelection(selectedRaceIdentifiers);
|
||||
}
|
||||
});
|
||||
regattaTable.setSelectionModel(regattaSelectionModel);
|
||||
|
||||
panel.add(regattaTable);
|
||||
}
|
||||
|
||||
private CellTable<RegattaDTO> createRegattaTable() {
|
||||
CellTable<RegattaDTO> table = new CellTable<RegattaDTO>(/* pageSize */10000, tableRes);
|
||||
regattaListDataProvider.addDataDisplay(table);
|
||||
table.setWidth("100%");
|
||||
|
||||
ListHandler<RegattaDTO> columnSortHandler = new ListHandler<RegattaDTO>(regattaListDataProvider.getList());
|
||||
table.addColumnSortHandler(columnSortHandler);
|
||||
|
||||
TextColumn<RegattaDTO> regattaNameColumn = new TextColumn<RegattaDTO>() {
|
||||
@Override
|
||||
public String getValue(RegattaDTO regatta) {
|
||||
return regatta.name;
|
||||
}
|
||||
};
|
||||
regattaNameColumn.setSortable(true);
|
||||
columnSortHandler.setComparator(regattaNameColumn, new Comparator<RegattaDTO>() {
|
||||
@Override
|
||||
public int compare(RegattaDTO r1, RegattaDTO r2) {
|
||||
return r1.name.compareTo(r2.name);
|
||||
}
|
||||
});
|
||||
|
||||
TextColumn<RegattaDTO> regattaBoatClassColumn = new TextColumn<RegattaDTO>() {
|
||||
@Override
|
||||
public String getValue(RegattaDTO regatta) {
|
||||
return regatta.boatClass != null ? regatta.boatClass.name : "";
|
||||
}
|
||||
};
|
||||
regattaBoatClassColumn.setSortable(true);
|
||||
columnSortHandler.setComparator(regattaBoatClassColumn, new Comparator<RegattaDTO>() {
|
||||
@Override
|
||||
public int compare(RegattaDTO r1, RegattaDTO r2) {
|
||||
return r1.boatClass.name.compareTo(r2.boatClass.name);
|
||||
}
|
||||
});
|
||||
|
||||
ImagesBarColumn<RegattaDTO, RegattaConfigImagesBarCell> regattaActionColumn = new ImagesBarColumn<RegattaDTO, RegattaConfigImagesBarCell>(
|
||||
new RegattaConfigImagesBarCell(stringMessages));
|
||||
regattaActionColumn.setFieldUpdater(new FieldUpdater<RegattaDTO, String>() {
|
||||
@Override
|
||||
public void update(int index, RegattaDTO regatta, String value) {
|
||||
if (RegattaConfigImagesBarCell.ACTION_REMOVE.equals(value)) {
|
||||
if (Window.confirm(stringMessages.doYouReallyWantToRemoveRegatta(regatta.name))) {
|
||||
removeRegatta(regatta);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
table.addColumn(regattaNameColumn, stringMessages.regattaName());
|
||||
table.addColumn(regattaBoatClassColumn, stringMessages.boatClass());
|
||||
table.addColumn(regattaActionColumn, stringMessages.actions());
|
||||
|
||||
return table;
|
||||
}
|
||||
|
||||
private void updateFilteredRegattasList() {
|
||||
String text = filterRegattasTextbox.getText();
|
||||
List<String> wordsToFilter = Arrays.asList(text.split(" "));
|
||||
regattaListDataProvider.getList().clear();
|
||||
if (text != null && !text.isEmpty()) {
|
||||
for (RegattaDTO regattaDTO : allRegattas) {
|
||||
boolean failed = false;
|
||||
for (String word : wordsToFilter) {
|
||||
String textAsUppercase = word.toUpperCase().trim();
|
||||
if (!regattaDTO.name.toUpperCase().contains(textAsUppercase)
|
||||
&& !regattaDTO.boatClass.name.toUpperCase().contains(textAsUppercase)
|
||||
&& !regattaDTO.name.toUpperCase().contains(textAsUppercase)) {
|
||||
failed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!failed) {
|
||||
regattaListDataProvider.getList().add(regattaDTO);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (RegattaDTO regatta : allRegattas) {
|
||||
regattaListDataProvider.getList().add(regatta);
|
||||
}
|
||||
}
|
||||
// now sort again according to selected criterion
|
||||
ColumnSortEvent.fire(regattaTable, regattaTable.getColumnSortList());
|
||||
}
|
||||
|
||||
private void removeRegatta(final RegattaDTO regatta) {
|
||||
final RegattaIdentifier regattaIdentifier = new RegattaName(regatta.name);
|
||||
sailingService.removeRegatta(regattaIdentifier, new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Error trying to remove regatta " + regatta.name + ": " + caught.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(Void result) {
|
||||
regattaRefresher.fillRegattas();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private List<RegattaDTO> getSelectedRegattas() {
|
||||
List<RegattaDTO> result = new ArrayList<RegattaDTO>();
|
||||
if (regattaListDataProvider != null) {
|
||||
for (RegattaDTO regatta : regattaListDataProvider.getList()) {
|
||||
if (regattaSelectionModel.isSelected(regatta)) {
|
||||
result.add(regatta);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void fillRegattas(List<RegattaDTO> regattas) {
|
||||
if (regattas.isEmpty()) {
|
||||
regattaTable.setVisible(false);
|
||||
noRegattasLabel.setVisible(true);
|
||||
} else {
|
||||
regattaTable.setVisible(true);
|
||||
noRegattasLabel.setVisible(false);
|
||||
}
|
||||
List<RegattaDTO> newAllRegattas = new ArrayList<RegattaDTO>(regattas);
|
||||
List<RegattaIdentifier> newAllRaceIdentifiers = new ArrayList<RegattaIdentifier>();
|
||||
for (RegattaDTO regatta : regattas) {
|
||||
newAllRaceIdentifiers.add(regatta.getRegattaIdentifier());
|
||||
}
|
||||
allRegattas = newAllRegattas;
|
||||
updateFilteredRegattasList();
|
||||
|
||||
regattaSelectionProvider.setAllRegattas(newAllRaceIdentifiers);
|
||||
}
|
||||
|
||||
public List<RegattaDTO> getAllRegattas() {
|
||||
return allRegattas;
|
||||
}
|
||||
}
|
||||
+44
-249
@@ -6,49 +6,37 @@ import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
|
||||
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.Unit;
|
||||
import com.google.gwt.event.dom.client.ChangeEvent;
|
||||
import com.google.gwt.event.dom.client.ChangeHandler;
|
||||
import com.google.gwt.event.dom.client.ClickEvent;
|
||||
import com.google.gwt.event.dom.client.ClickHandler;
|
||||
import com.google.gwt.safehtml.shared.SafeHtml;
|
||||
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
|
||||
import com.google.gwt.user.cellview.client.CellTable;
|
||||
import com.google.gwt.user.cellview.client.Column;
|
||||
import com.google.gwt.user.cellview.client.TextColumn;
|
||||
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.CaptionPanel;
|
||||
import com.google.gwt.user.client.ui.Grid;
|
||||
import com.google.gwt.user.client.ui.HasVerticalAlignment;
|
||||
import com.google.gwt.user.client.ui.HorizontalPanel;
|
||||
import com.google.gwt.user.client.ui.Label;
|
||||
import com.google.gwt.user.client.ui.ListBox;
|
||||
import com.google.gwt.user.client.ui.Panel;
|
||||
import com.google.gwt.user.client.ui.SimplePanel;
|
||||
import com.google.gwt.user.client.ui.VerticalPanel;
|
||||
import com.google.gwt.view.client.ListDataProvider;
|
||||
import com.google.gwt.view.client.SelectionChangeEvent;
|
||||
import com.google.gwt.view.client.SingleSelectionModel;
|
||||
import com.sap.sailing.domain.common.Color;
|
||||
import com.sap.sailing.domain.common.RegattaIdentifier;
|
||||
import com.sap.sailing.domain.common.RegattaName;
|
||||
import com.sap.sailing.domain.common.ScoringSchemeType;
|
||||
import com.sap.sailing.domain.common.impl.Util.Pair;
|
||||
import com.sap.sailing.domain.common.impl.Util.Triple;
|
||||
import com.sap.sailing.gwt.ui.client.DataEntryDialog.DialogCallback;
|
||||
import com.sap.sailing.gwt.ui.client.ErrorReporter;
|
||||
import com.sap.sailing.gwt.ui.client.RegattaDisplayer;
|
||||
import com.sap.sailing.gwt.ui.client.RegattaRefresher;
|
||||
import com.sap.sailing.gwt.ui.client.RegattaSelectionChangeListener;
|
||||
import com.sap.sailing.gwt.ui.client.RegattaSelectionModel;
|
||||
import com.sap.sailing.gwt.ui.client.RegattaSelectionProvider;
|
||||
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
import com.sap.sailing.gwt.ui.leaderboard.ScoringSchemeTypeFormatter;
|
||||
import com.sap.sailing.gwt.ui.shared.EventDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.FleetDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.NamedDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceColumnDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RaceColumnInSeriesDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.RegattaDTO;
|
||||
import com.sap.sailing.gwt.ui.shared.SeriesDTO;
|
||||
|
||||
@@ -59,7 +47,7 @@ import com.sap.sailing.gwt.ui.shared.SeriesDTO;
|
||||
* @author Frank Mittag (C5163974)
|
||||
*
|
||||
*/
|
||||
public class RegattaStructureManagementPanel extends SimplePanel implements RegattaDisplayer {
|
||||
public class RegattaStructureManagementPanel extends SimplePanel implements RegattaDisplayer, RegattaSelectionChangeListener {
|
||||
private final SailingServiceAsync sailingService;
|
||||
private final ErrorReporter errorReporter;
|
||||
private final StringMessages stringMessages;
|
||||
@@ -67,18 +55,17 @@ public class RegattaStructureManagementPanel extends SimplePanel implements Rega
|
||||
private final List<EventDTO> events;
|
||||
private ListBox eventsComboBox;
|
||||
private EventDTO selectedEvent;
|
||||
|
||||
private CaptionPanel eventDetailsCaptionPanel;
|
||||
|
||||
private Label eventVenueLabel;
|
||||
private CellTable<RegattaDTO> regattaTable;
|
||||
private SingleSelectionModel<RegattaDTO> regattaSelectionModel;
|
||||
private ListDataProvider<RegattaDTO> regattaProvider;
|
||||
|
||||
private final RegattaRefresher regattaRefresher;
|
||||
private RegattaSelectionProvider regattaSelectionProvider;
|
||||
|
||||
private RegattaListComposite regattaListComposite;
|
||||
private RegattaDetailsComposite regattaDetailsComposite;
|
||||
|
||||
private final AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
|
||||
private boolean supportEvents = false;
|
||||
|
||||
|
||||
public RegattaStructureManagementPanel(SailingServiceAsync sailingService, ErrorReporter errorReporter,
|
||||
StringMessages stringMessages, RegattaRefresher regattaRefresher) {
|
||||
this.sailingService = sailingService;
|
||||
@@ -155,226 +142,19 @@ public class RegattaStructureManagementPanel extends SimplePanel implements Rega
|
||||
}
|
||||
});
|
||||
|
||||
// regatta table
|
||||
TextColumn<RegattaDTO> regattaNameColumn = new TextColumn<RegattaDTO>() {
|
||||
@Override
|
||||
public String getValue(RegattaDTO regatta) {
|
||||
return regatta.name;
|
||||
}
|
||||
};
|
||||
|
||||
TextColumn<RegattaDTO> regattaBoatClassColumn = new TextColumn<RegattaDTO>() {
|
||||
@Override
|
||||
public String getValue(RegattaDTO regatta) {
|
||||
final NamedDTO boatClass = regatta.boatClass;
|
||||
return boatClass==null?"(null)":boatClass.name;
|
||||
}
|
||||
};
|
||||
|
||||
TextColumn<RegattaDTO> regattaScoringSystemColumn = new TextColumn<RegattaDTO>() {
|
||||
@Override
|
||||
public String getValue(RegattaDTO regatta) {
|
||||
ScoringSchemeType scoringScheme = regatta.scoringScheme;
|
||||
String scoringSystem = scoringScheme == null ? "" : ScoringSchemeTypeFormatter.format(scoringScheme, stringMessages);
|
||||
return scoringSystem;
|
||||
}
|
||||
};
|
||||
Grid grid = new Grid(1 ,2);
|
||||
parentPanel.add(grid);
|
||||
|
||||
final SafeHtmlCell seriesCell = new SafeHtmlCell();
|
||||
Column<RegattaDTO, SafeHtml> regattaSeriesColumn = new Column<RegattaDTO, SafeHtml>(seriesCell) {
|
||||
@Override
|
||||
public SafeHtml getValue(RegattaDTO regatta) {
|
||||
SafeHtmlBuilder builder = new SafeHtmlBuilder();
|
||||
int seriesCount = regatta.series.size();
|
||||
int i = 1;
|
||||
for (SeriesDTO serie : regatta.series) {
|
||||
builder.appendEscaped(i + ". " + serie.name);
|
||||
if (serie.isMedal()) {
|
||||
builder.appendEscaped(" (" + stringMessages.medalSeries() + ")");
|
||||
}
|
||||
if (i < seriesCount) {
|
||||
builder.appendHtmlConstant("<br>");
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return builder.toSafeHtml();
|
||||
}
|
||||
};
|
||||
|
||||
final SafeHtmlCell regattaRacesCell = new SafeHtmlCell();
|
||||
Column<RegattaDTO, SafeHtml> regattaRacesColumn = new Column<RegattaDTO, SafeHtml>(regattaRacesCell) {
|
||||
@Override
|
||||
public SafeHtml getValue(RegattaDTO regatta) {
|
||||
SafeHtmlBuilder builder = new SafeHtmlBuilder();
|
||||
|
||||
int seriesCount = regatta.series.size();
|
||||
int i = 1;
|
||||
for (SeriesDTO serie : regatta.series) {
|
||||
int raceColumnsCount = serie.getRaceColumns().size();
|
||||
int j = 1;
|
||||
if(!serie.getRaceColumns().isEmpty()) {
|
||||
for(RaceColumnDTO raceColumn: serie.getRaceColumns()) {
|
||||
builder.appendEscaped(j + ". " + raceColumn.getRaceColumnName());
|
||||
if(j < raceColumnsCount) {
|
||||
builder.appendEscaped(", ");
|
||||
}
|
||||
j++;
|
||||
}
|
||||
} else {
|
||||
builder.appendEscaped(stringMessages.noRacesYet());
|
||||
}
|
||||
if(i < seriesCount) {
|
||||
builder.appendHtmlConstant("<br>");
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return builder.toSafeHtml();
|
||||
}
|
||||
};
|
||||
|
||||
final SafeHtmlCell fleetsCell = new SafeHtmlCell();
|
||||
Column<RegattaDTO, SafeHtml> regattaFleetsColumn = new Column<RegattaDTO, SafeHtml>(fleetsCell) {
|
||||
@Override
|
||||
public SafeHtml getValue(RegattaDTO regatta) {
|
||||
SafeHtmlBuilder builder = new SafeHtmlBuilder();
|
||||
int seriesCount = regatta.series.size();
|
||||
int i = 1;
|
||||
for (SeriesDTO serie : regatta.series) {
|
||||
int fleetsCount = serie.getFleets().size();
|
||||
int j = 1;
|
||||
for(FleetDTO fleet: serie.getFleets()) {
|
||||
builder.appendEscaped(j + ". " + fleet.name);
|
||||
builder.appendEscaped(" (" + fleet.getOrderNo() + ") ");
|
||||
if (j < fleetsCount) {
|
||||
builder.appendEscaped(", ");
|
||||
}
|
||||
j++;
|
||||
}
|
||||
if(i < seriesCount) {
|
||||
builder.appendHtmlConstant("<br>");
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return builder.toSafeHtml();
|
||||
}
|
||||
};
|
||||
|
||||
ImagesBarColumn<RegattaDTO, RegattaConfigImagesBarCell> regattaActionColumn = new ImagesBarColumn<RegattaDTO, RegattaConfigImagesBarCell>(
|
||||
new RegattaConfigImagesBarCell(stringMessages));
|
||||
regattaActionColumn.setFieldUpdater(new FieldUpdater<RegattaDTO, String>() {
|
||||
@Override
|
||||
public void update(int index, RegattaDTO regatta, String value) {
|
||||
if (RegattaConfigImagesBarCell.ACTION_REMOVE.equals(value)) {
|
||||
if (Window.confirm(stringMessages.doYouReallyWantToRemoveRegatta(regatta.name))) {
|
||||
removeRegatta(regatta);
|
||||
}
|
||||
} else if (RegattaConfigImagesBarCell.ACTION_EDIT.equals(value)) {
|
||||
editRacesOfRegattaSeries(regatta);
|
||||
}
|
||||
}
|
||||
});
|
||||
regattaSelectionProvider = new RegattaSelectionModel(false);
|
||||
regattaSelectionProvider.addRegattaSelectionChangeListener(this);
|
||||
|
||||
regattaTable = new CellTable<RegattaDTO>(10000, tableRes);
|
||||
regattaTable.setWidth("100%");
|
||||
regattaTable.addColumn(regattaNameColumn, stringMessages.regattaName());
|
||||
regattaTable.addColumn(regattaBoatClassColumn, stringMessages.boatClass());
|
||||
regattaTable.addColumn(regattaScoringSystemColumn, stringMessages.scoringSystem());
|
||||
regattaTable.addColumn(regattaSeriesColumn, stringMessages.series());
|
||||
regattaTable.addColumn(regattaRacesColumn, stringMessages.races());
|
||||
regattaTable.addColumn(regattaFleetsColumn, stringMessages.fleets());
|
||||
regattaTable.addColumn(regattaActionColumn, stringMessages.actions());
|
||||
|
||||
regattaSelectionModel = new SingleSelectionModel<RegattaDTO>();
|
||||
regattaSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
|
||||
@Override
|
||||
public void onSelectionChange(SelectionChangeEvent event) {
|
||||
}
|
||||
});
|
||||
regattaTable.setSelectionModel(regattaSelectionModel);
|
||||
|
||||
regattaProvider = new ListDataProvider<RegattaDTO>();
|
||||
regattaProvider.addDataDisplay(regattaTable);
|
||||
parentPanel.add(regattaTable);
|
||||
}
|
||||
|
||||
private void editRacesOfRegattaSeries(final RegattaDTO regatta) {
|
||||
RaceColumnInRegattaSeriesDialog raceDialog = new RaceColumnInRegattaSeriesDialog(regatta, stringMessages,
|
||||
new DialogCallback<Pair<SeriesDTO, List<RaceColumnDTO>>>() {
|
||||
@Override
|
||||
public void cancel() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ok(final Pair<SeriesDTO, List<RaceColumnDTO>> result) {
|
||||
updateRacesOfRegattaSeries(regatta, result.getA(), result.getB());
|
||||
}
|
||||
});
|
||||
raceDialog.show();
|
||||
}
|
||||
|
||||
private void updateRacesOfRegattaSeries(final RegattaDTO regatta, final SeriesDTO series, List<RaceColumnDTO> newRaceColumns) {
|
||||
final RegattaIdentifier regattaIdentifier = new RegattaName(regatta.name);
|
||||
|
||||
List<RaceColumnDTO> existingRaceColumns = series.getRaceColumns();
|
||||
final List<String> raceColumnsToAdd = new ArrayList<String>();
|
||||
final List<String> raceColumnsToRemove = new ArrayList<String>();
|
||||
|
||||
for(RaceColumnDTO newRaceColumn: newRaceColumns) {
|
||||
if(!existingRaceColumns.contains(newRaceColumn)) {
|
||||
raceColumnsToAdd.add(newRaceColumn.name);
|
||||
}
|
||||
}
|
||||
|
||||
for(RaceColumnDTO existingRaceColumn: existingRaceColumns) {
|
||||
if(!newRaceColumns.contains(existingRaceColumn)) {
|
||||
raceColumnsToRemove.add(existingRaceColumn.name);
|
||||
}
|
||||
}
|
||||
|
||||
sailingService.addRaceColumnsToSeries(regattaIdentifier, series.name, raceColumnsToAdd, new AsyncCallback<List<RaceColumnInSeriesDTO>>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Error trying to add race columns "
|
||||
+ raceColumnsToAdd + " to series " + series.name
|
||||
+ ": " + caught.getMessage());
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(List<RaceColumnInSeriesDTO> raceColumns) {
|
||||
regattaRefresher.fillRegattas();
|
||||
}
|
||||
});
|
||||
|
||||
sailingService.removeRaceColumnsFromSeries(regattaIdentifier, series.name, raceColumnsToRemove, new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Error trying to remove race columns "
|
||||
+ raceColumnsToAdd + " from series " + series.name
|
||||
+ ": " + caught.getMessage());
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(Void v) {
|
||||
regattaRefresher.fillRegattas();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void removeRegatta(final RegattaDTO regatta) {
|
||||
final RegattaIdentifier regattaIdentifier = new RegattaName(regatta.name);
|
||||
sailingService.removeRegatta(regattaIdentifier, new AsyncCallback<Void>() {
|
||||
@Override
|
||||
public void onFailure(Throwable caught) {
|
||||
errorReporter.reportError("Error trying to remove regatta " + regatta.name + ": " + caught.getMessage());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onSuccess(Void result) {
|
||||
regattaRefresher.fillRegattas();
|
||||
}
|
||||
});
|
||||
regattaListComposite = new RegattaListComposite(sailingService, regattaSelectionProvider, regattaRefresher, errorReporter, stringMessages);
|
||||
grid.setWidget(0, 0, regattaListComposite);
|
||||
grid.getRowFormatter().setVerticalAlign(0, HasVerticalAlignment.ALIGN_TOP);
|
||||
grid.getColumnFormatter().getElement(1).getStyle().setPaddingTop(2.0, Unit.EM);
|
||||
regattaDetailsComposite = new RegattaDetailsComposite(sailingService, regattaRefresher, errorReporter, stringMessages);
|
||||
regattaDetailsComposite.setVisible(false);
|
||||
grid.setWidget(0, 1, regattaDetailsComposite);
|
||||
}
|
||||
|
||||
private void onEventSelectionChanged() {
|
||||
@@ -411,7 +191,7 @@ public class RegattaStructureManagementPanel extends SimplePanel implements Rega
|
||||
if(supportEvents) {
|
||||
existingRegattas = Collections.unmodifiableCollection(selectedEvent.regattas);
|
||||
} else {
|
||||
existingRegattas = Collections.unmodifiableCollection(regattaProvider.getList());
|
||||
existingRegattas = Collections.unmodifiableCollection(regattaListComposite.getAllRegattas());
|
||||
}
|
||||
|
||||
RegattaWithSeriesAndFleetsCreateDialog dialog = new RegattaWithSeriesAndFleetsCreateDialog(existingRegattas, stringMessages,
|
||||
@@ -442,8 +222,7 @@ public class RegattaStructureManagementPanel extends SimplePanel implements Rega
|
||||
|
||||
@Override
|
||||
public void onSuccess(List<RegattaDTO> regattas) {
|
||||
regattaProvider.getList().clear();
|
||||
regattaProvider.getList().addAll(regattas);
|
||||
regattaListComposite.fillRegattas(regattas);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -524,7 +303,23 @@ public class RegattaStructureManagementPanel extends SimplePanel implements Rega
|
||||
|
||||
@Override
|
||||
public void fillRegattas(List<RegattaDTO> regattas) {
|
||||
regattaProvider.getList().clear();
|
||||
regattaProvider.getList().addAll(regattas);
|
||||
regattaListComposite.fillRegattas(regattas);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRegattaSelectionChange(List<RegattaIdentifier> selectedRegattas) {
|
||||
RegattaIdentifier selectedRegatta = selectedRegattas.iterator().next();
|
||||
if(selectedRegatta != null && regattaListComposite.getAllRegattas() != null) {
|
||||
for(RegattaDTO regattaDTO: regattaListComposite.getAllRegattas()) {
|
||||
if(regattaDTO.getRegattaIdentifier().equals(selectedRegatta)) {
|
||||
regattaDetailsComposite.setRegatta(regattaDTO);
|
||||
regattaDetailsComposite.setVisible(true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
regattaDetailsComposite.setRegatta(null);
|
||||
regattaDetailsComposite.setVisible(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -97,16 +97,16 @@ public class SailingEventManagementPanel extends SimplePanel {
|
||||
}
|
||||
};
|
||||
|
||||
ImagesBarColumn<EventDTO, RegattaConfigImagesBarCell> eventActionColumn = new ImagesBarColumn<EventDTO, RegattaConfigImagesBarCell>(
|
||||
new RegattaConfigImagesBarCell(stringMessages));
|
||||
ImagesBarColumn<EventDTO, EventConfigImagesBarCell> eventActionColumn = new ImagesBarColumn<EventDTO, EventConfigImagesBarCell>(
|
||||
new EventConfigImagesBarCell(stringMessages));
|
||||
eventActionColumn.setFieldUpdater(new FieldUpdater<EventDTO, String>() {
|
||||
@Override
|
||||
public void update(int index, EventDTO event, String value) {
|
||||
if (RegattaConfigImagesBarCell.ACTION_REMOVE.equals(value)) {
|
||||
if (EventConfigImagesBarCell.ACTION_REMOVE.equals(value)) {
|
||||
if (Window.confirm(stringMessages.doYouReallyWantToRemoveRegatta(event.name))) {
|
||||
removeEvent(event);
|
||||
}
|
||||
} else if (RegattaConfigImagesBarCell.ACTION_EDIT.equals(value)) {
|
||||
} else if (EventConfigImagesBarCell.ACTION_EDIT.equals(value)) {
|
||||
openEditEventDialog(event);
|
||||
}
|
||||
}
|
||||
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package com.sap.sailing.gwt.ui.adminconsole;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import com.google.gwt.core.client.GWT;
|
||||
import com.google.gwt.text.shared.SafeHtmlRenderer;
|
||||
import com.sap.sailing.gwt.ui.client.StringMessages;
|
||||
|
||||
public class SeriesConfigImagesBarCell extends ImagesBarCell {
|
||||
static final String ACTION_REMOVE = "ACTION_REMOVE";
|
||||
static final String ACTION_EDIT = "ACTION_EDIT";
|
||||
private final StringMessages stringMessages;
|
||||
private static AdminConsoleResources resources = GWT.create(AdminConsoleResources.class);
|
||||
|
||||
public SeriesConfigImagesBarCell(StringMessages stringConstants) {
|
||||
super();
|
||||
this.stringMessages = stringConstants;
|
||||
}
|
||||
|
||||
public SeriesConfigImagesBarCell(SafeHtmlRenderer<String> renderer, StringMessages stringMessages) {
|
||||
super();
|
||||
this.stringMessages = stringMessages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Iterable<ImageSpec> getImageSpecs() {
|
||||
return Arrays.asList(new ImageSpec(ACTION_EDIT, stringMessages.actionEdit(), makeImagePrototype(resources.editIcon())),
|
||||
new ImageSpec(ACTION_REMOVE, stringMessages.actionRemove(), makeImagePrototype(resources.removeIcon())));
|
||||
}
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
package com.sap.sailing.gwt.ui.client;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.sap.sailing.domain.common.RegattaIdentifier;
|
||||
|
||||
/**
|
||||
* Allows UI components to observe a regatta selector, such as a drop-down box showing a list of regattas
|
||||
*
|
||||
* @author Axel Uhl (d043530)
|
||||
*
|
||||
*/
|
||||
public interface RegattaSelectionChangeListener {
|
||||
|
||||
/**
|
||||
* The first element is the first one selected
|
||||
*
|
||||
* @param selectedRegattas a non-<code>null</code> list which is empty if nothing is selected
|
||||
*/
|
||||
void onRegattaSelectionChange(List<RegattaIdentifier> selectedRegattas);
|
||||
|
||||
}
|
||||
+96
@@ -0,0 +1,96 @@
|
||||
package com.sap.sailing.gwt.ui.client;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import com.sap.sailing.domain.common.RegattaIdentifier;
|
||||
|
||||
public class RegattaSelectionModel implements RegattaSelectionProvider {
|
||||
private final List<RegattaIdentifier> selection;
|
||||
|
||||
private final List<RegattaIdentifier> allRegattas;
|
||||
|
||||
private final Set<RegattaSelectionChangeListener> listeners;
|
||||
|
||||
private final boolean hasMultiSelection;
|
||||
|
||||
public RegattaSelectionModel(boolean hasMultiSelection) {
|
||||
this.hasMultiSelection = hasMultiSelection;
|
||||
this.selection = new ArrayList<RegattaIdentifier>();
|
||||
this.allRegattas = new ArrayList<RegattaIdentifier>();
|
||||
listeners = new HashSet<RegattaSelectionChangeListener>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RegattaIdentifier> getSelectedRegattas() {
|
||||
return Collections.unmodifiableList(selection);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addRegattaSelectionChangeListener(RegattaSelectionChangeListener listener) {
|
||||
listeners.add(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeRegattaSelectionChangeListener(RegattaSelectionChangeListener listener) {
|
||||
listeners.remove(listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSelection(List<RegattaIdentifier> newSelection, RegattaSelectionChangeListener... listenersNotToNotify) {
|
||||
boolean notify = !selection.equals(newSelection);
|
||||
selection.clear();
|
||||
selection.addAll(newSelection);
|
||||
if (notify) {
|
||||
notifyListeners(listenersNotToNotify);
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyListeners(RegattaSelectionChangeListener[] listenersNotToNotify) {
|
||||
List<RegattaIdentifier> selectedRaces = getSelectedRegattas();
|
||||
for (RegattaSelectionChangeListener listener : listeners) {
|
||||
if (listenersNotToNotify == null || !Arrays.asList(listenersNotToNotify).contains(listener)) {
|
||||
listener.onRegattaSelectionChange(selectedRaces);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the universe of all regattas from which this selection model may select. An equal list will subsequently be
|
||||
* returned by {@link #getAllRegattas()}. Regattas from the {@link #getSelectedRegattas() selection} not in
|
||||
* <code>newAllRegattas</code> are removed from the selection. If this happens, the selection listeners are notified.
|
||||
*/
|
||||
@Override
|
||||
public void setAllRegattas(List<RegattaIdentifier> newAllRaces, RegattaSelectionChangeListener... listenersNotToNotify) {
|
||||
allRegattas.clear();
|
||||
for (RegattaIdentifier r : newAllRaces) {
|
||||
allRegattas.add(r);
|
||||
}
|
||||
boolean notify = false;
|
||||
for (Iterator<RegattaIdentifier> i=selection.iterator(); i.hasNext(); ) {
|
||||
RegattaIdentifier selectedRegatta = i.next();
|
||||
if (!allRegattas.contains(selectedRegatta)) {
|
||||
notify = true;
|
||||
i.remove();
|
||||
}
|
||||
}
|
||||
if (notify) {
|
||||
notifyListeners(listenersNotToNotify);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<RegattaIdentifier> getAllRegattas() {
|
||||
return Collections.unmodifiableList(allRegattas);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasMultiSelection() {
|
||||
return hasMultiSelection;
|
||||
}
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
package com.sap.sailing.gwt.ui.client;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import com.sap.sailing.domain.common.RegattaIdentifier;
|
||||
|
||||
public interface RegattaSelectionProvider {
|
||||
/**
|
||||
* @return a non-<code>null</code> list which may be empty
|
||||
*/
|
||||
List<RegattaIdentifier> getSelectedRegattas();
|
||||
|
||||
void addRegattaSelectionChangeListener(RegattaSelectionChangeListener listener);
|
||||
|
||||
void removeRegattaSelectionChangeListener(RegattaSelectionChangeListener listener);
|
||||
|
||||
void setSelection(List<RegattaIdentifier> newSelection, RegattaSelectionChangeListener... listenersNotToNotify);
|
||||
|
||||
boolean hasMultiSelection();
|
||||
|
||||
/**
|
||||
* @return a non-<code>null</code> list which may be empty
|
||||
*/
|
||||
List<RegattaIdentifier> getAllRegattas();
|
||||
|
||||
void setAllRegattas(List<RegattaIdentifier> newAllRaces, RegattaSelectionChangeListener... listenersNotToNotify);
|
||||
}
|
||||
+6
-1
@@ -4,6 +4,8 @@ import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import com.google.gwt.user.client.rpc.IsSerializable;
|
||||
import com.sap.sailing.domain.common.RegattaIdentifier;
|
||||
import com.sap.sailing.domain.common.RegattaName;
|
||||
import com.sap.sailing.domain.common.ScoringSchemeType;
|
||||
|
||||
public class RegattaDTO extends NamedDTO implements IsSerializable {
|
||||
@@ -19,10 +21,13 @@ public class RegattaDTO extends NamedDTO implements IsSerializable {
|
||||
|
||||
public RegattaDTO(String name, ScoringSchemeType scoringScheme /*, List<CompetitorDTO> competitors*/) {
|
||||
super(name);
|
||||
this.name = name;
|
||||
this.scoringScheme = scoringScheme;
|
||||
}
|
||||
|
||||
public RegattaIdentifier getRegattaIdentifier() {
|
||||
return new RegattaName(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The start date of the first {@link #races Race}, or <code>null</code> if the start date isn't set
|
||||
*/
|
||||
|
||||
Reference in new issue
Block a user