From 41342301892a453fbcb865121fceffbe4997edb4 Mon Sep 17 00:00:00 2001 From: dmitry Date: Mon, 11 May 2020 12:17:20 +0300 Subject: [PATCH 01/10] bug5275:Creation of CompetitorWithBoat not possible in Leaderboards and Competitors tabs --- .../sailing/domain/common/dto/BoatDTO.java | 4 + .../AbstractCompetitorWithBoatDialog.java | 62 +++++--- .../gwt/ui/adminconsole/CompetitorPanel.java | 16 +- .../adminconsole/CompetitorTableWrapper.java | 53 +++++++ .../CompetitorWithBoatCreateDialog.java | 130 ---------------- .../CompetitorWithBoatEditDialog.java | 20 +-- .../CompetitorWithOptionalBoatAddDialog.java | 139 ++++++++++++++++++ .../adminconsole/EditCompetitorsDialog.java | 7 +- .../adminconsole/LeaderboardConfigPanel.java | 2 +- .../sailing/gwt/ui/client/StringMessages.java | 3 + .../gwt/ui/client/StringMessages.properties | 3 + 11 files changed, 264 insertions(+), 175 deletions(-) delete mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithBoatCreateDialog.java create mode 100644 java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/BoatDTO.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/BoatDTO.java index fa069b1b2dd..284c67e5aaa 100755 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/BoatDTO.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/dto/BoatDTO.java @@ -57,6 +57,10 @@ public class BoatDTO extends NamedSecuredObjectDTO implements WithID, Serializab return boatClass; } + public void setBoatClass(BoatClassDTO boatClass) { + this.boatClass = boatClass; + } + public String getDisplayName() { final StringBuilder sb = new StringBuilder(); final boolean hasSailId = sailId != null && !sailId.isEmpty(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorWithBoatDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorWithBoatDialog.java index 3e1ea39f232..8e3fd954ec4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorWithBoatDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/AbstractCompetitorWithBoatDialog.java @@ -3,12 +3,15 @@ package com.sap.sailing.gwt.ui.adminconsole; import com.google.gwt.user.client.ui.FocusWidget; import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.TextBox; +import com.sap.sailing.domain.common.dto.BoatClassDTO; import com.sap.sailing.domain.common.dto.BoatDTO; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTO; import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTOImpl; import com.sap.sailing.gwt.common.client.suggestion.BoatClassMasterdataSuggestOracle; import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sse.common.Color; +import com.sap.sse.common.Distance; import com.sap.sse.gwt.client.ColorTextBox; /** @@ -76,45 +79,64 @@ public abstract class AbstractCompetitorWithBoatDialog extends CompetitorEditDia } } - /** * The class creates the UI-dialog to type in the Data about a competitor. * - * @param competitorToEdit - * The 'competitorToEdit' parameter contains the competitor which should be changed or initialized. + * @param competitorWithBoat + * The 'competitorWithBoat' parameter contains the competitor which should be changed or initialized. * @param boatClass * The boat class is the default shown boat class for new boats. Set null if your boat is * already initialized or you don't want a default boat class. + * @param The + * {@link Validator} for competitor with boat */ - public AbstractCompetitorWithBoatDialog(String dialogTitle, StringMessages stringMessages, CompetitorWithBoatDTO competitorToEdit, - DialogCallback callback, String boatClass) { - super(dialogTitle, stringMessages, competitorToEdit, - new AbstractCompetitorWithBoatDialog.CompetitorWithBoatValidator(stringMessages, - competitorToEdit.getBoat()), - callback); - - final BoatDTO boatToEdit = competitorToEdit.getBoat(); + public AbstractCompetitorWithBoatDialog(String dialogTitle, StringMessages stringMessages, + CompetitorWithBoatDTO competitorWithBoat, DialogCallback callback, String boatClass, + CompetitorWithoutBoatValidator validator) { + super(dialogTitle, stringMessages, competitorWithBoat, validator, callback); + final BoatDTO boat = competitorWithBoat.getBoat(); this.boatClassNameTextBox = createSuggestBox(new BoatClassMasterdataSuggestOracle()); boatClassNameTextBox.ensureDebugId("BoatClassNameSuggestBox"); - if (boatToEdit.getBoatClass() != null) { - boatClassNameTextBox.setValue(boatToEdit.getBoatClass().getName()); - boatClassNameTextBox.setEnabled(false); + if (boat.getBoatClass() != null) { + boatClassNameTextBox.setValue(boat.getBoatClass().getName()); + setBoatClassNameEnabled(boatClassNameTextBox, false); } else { boatClassNameTextBox.setValue(boatClass); // widgets have to accept null values here } - this.boatNameTextBox = createTextBox(boatToEdit.getName()); + this.boatNameTextBox = createTextBox(boat.getName()); boatNameTextBox.ensureDebugId("BoatNameTextBox"); - this.boatDisplayColorTextBox = createColorTextBox(boatToEdit.getColor()); - this.sailIdTextBox = createTextBox(boatToEdit.getSailId()); + this.boatDisplayColorTextBox = createColorTextBox(boat.getColor()); + this.sailIdTextBox = createTextBox(boat.getSailId()); sailIdTextBox.ensureDebugId("SailIdTextBox"); } + public AbstractCompetitorWithBoatDialog(String dialogTitle, StringMessages stringMessages, + CompetitorWithBoatDTO competitorWithBoat, DialogCallback callback, + String boatClass) { + this(dialogTitle, stringMessages, competitorWithBoat, callback, boatClass, + new AbstractCompetitorWithBoatDialog.CompetitorWithBoatValidator(stringMessages, + competitorWithBoat.getBoat())); + } + @Override protected FocusWidget getInitialFocusWidget() { return super.getInitialFocusWidget(); } - protected abstract BoatDTO getBoat(); + protected BoatDTO getBoat() { + BoatDTO result = null; + Color boatColor; + if (boatDisplayColorTextBox.isValid()) { + boatColor = boatDisplayColorTextBox.getColor(); + } else { + boatColor = new InvalidColor(new IllegalArgumentException(boatDisplayColorTextBox.getValue()), + getStringMessages()); + } + BoatClassDTO boatClass = new BoatClassDTO(boatClassNameTextBox.getValue(), Distance.NULL, Distance.NULL); + result = new BoatDTO(getCompetitorToEdit().getBoat().getIdAsString(), boatNameTextBox.getValue(), boatClass, + sailIdTextBox.getValue(), boatColor); + return result; + } @Override protected CompetitorWithBoatDTO getResult() { @@ -129,4 +151,8 @@ public abstract class AbstractCompetitorWithBoatDialog extends CompetitorEditDia return result; } + protected void setBoatClassNameEnabled(SuggestBox boatClassNameTextBox, boolean enabled) { + boatClassNameTextBox.setEnabled(enabled); + } + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java index 91de341b95f..0846efc4698 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java @@ -9,6 +9,8 @@ import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.SimplePanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.sap.sailing.domain.common.CompetitorDescriptor; +import com.sap.sailing.domain.common.dto.BoatClassDTO; +import com.sap.sailing.domain.common.dto.BoatDTO; import com.sap.sailing.domain.common.dto.CompetitorDTO; import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTOImpl; import com.sap.sailing.gwt.ui.adminconsole.CompetitorImportProviderSelectionDialog.MatchImportedCompetitorsDialogFactory; @@ -32,18 +34,19 @@ public class CompetitorPanel extends SimplePanel implements BusyDisplay { private final CompetitorTableWrapper> competitorTable; private final RefreshableMultiSelectionModel refreshableCompetitorSelectionModel; private final String leaderboardName; - + private final String boatClassName; private final BusyIndicator busyIndicator; public CompetitorPanel(final SailingServiceAsync sailingService, final UserService userService, final StringMessages stringMessages, final ErrorReporter errorReporter) { - this(sailingService, userService, null, stringMessages, errorReporter); + this(sailingService, userService, null, null, stringMessages, errorReporter); } public CompetitorPanel(final SailingServiceAsync sailingService, final UserService userService, final String leaderboardName, - final StringMessages stringMessages, final ErrorReporter errorReporter) { + String boatClassName, final StringMessages stringMessages, final ErrorReporter errorReporter) { super(); this.leaderboardName = leaderboardName; + this.boatClassName = boatClassName; this.competitorTable = new CompetitorTableWrapper<>(sailingService, userService, stringMessages, errorReporter, /* multiSelection */ true, /* enablePager */ true, /* filterCompetitorWithBoat */ false, /* filterCompetitorsWithoutBoat */ false); this.refreshableCompetitorSelectionModel = (RefreshableMultiSelectionModel) competitorTable.getSelectionModel(); @@ -135,8 +138,11 @@ public class CompetitorPanel extends SimplePanel implements BusyDisplay { private void openAddCompetitorDialog() { CompetitorWithBoatDTOImpl competitorDTO = new CompetitorWithBoatDTOImpl(); - competitorDTO.setBoat(null); - competitorTable.openEditCompetitorWithoutBoatDialog(competitorDTO); + BoatClassDTO boatClassDTO = new BoatClassDTO(boatClassName, null, null); + BoatDTO boatDTO = new BoatDTO(); + boatDTO.setBoatClass(boatClassDTO); + competitorDTO.setBoat(boatDTO); + competitorTable.openCompetitorWithBoatAddDialog(competitorDTO); } public void refreshCompetitorList() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java index 040f346ada6..0f56ae4727e 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java @@ -459,6 +459,49 @@ public class CompetitorTableWrapper() { + @Override + public void ok(final CompetitorWithBoatDTO competitor) { + if (competitor.hasBoat()) { + sailingService.addOrUpdateCompetitorWithBoat(competitor, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + logCompetitorAddError(caught); + } + + @Override + public void onSuccess(CompetitorWithBoatDTO addedCompetitor) { + onCompetitorAddSuccess(addedCompetitor); + } + }); + } else { + sailingService.addOrUpdateCompetitorWithoutBoat(competitor, + new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + logCompetitorAddError(caught); + } + + @Override + public void onSuccess(CompetitorDTO addedCompetitor) { + onCompetitorAddSuccess(addedCompetitor); + } + }); + } + + } + + @Override + public void cancel() { + } + }); + dialog.show(); + + } + void openEditCompetitorWithoutBoatDialog(final CompetitorDTO originalCompetitor) { final CompetitorEditDialog dialog = CompetitorEditDialog.create(getStringMessages(), originalCompetitor, new DialogCallback() { @Override @@ -534,4 +577,14 @@ public class CompetitorTableWrapper> existingBoatsTable; - - /** - * The class creates the UI-dialog to type in the Data about a competitor. - * - * @param competitorToEdit - * The 'competitorToEdit' parameter contains the competitor which should be changed or initialized. - * @param boatClass - * The boat class is the default shown boat class for new boats. Set null if your boat is - * already initialized or you don't want a default boat class. - */ - public CompetitorWithBoatCreateDialog(SailingServiceAsync sailingService, final UserService userService, StringMessages stringMessages, ErrorReporter errorReporter, CompetitorWithBoatDTO competitorToEdit, - DialogCallback callback, String boatClass) { - super("Add competitor with boat", stringMessages, competitorToEdit, callback, boatClass); - this.ensureDebugId("CompetitorWithBoatCreateDialog"); - this.useNewBoatRadioButton = this.createRadioButton("BoatCreationSelection", "Create new boat"); - this.useExistingBoatRadioButton = this.createRadioButton("BoatCreationSelection", "Use existing boat"); - this.useNewBoatRadioButton.setValue(true); - useNewBoatRadioButton.addValueChangeHandler(new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - updateBoatPanels(); - } - }); - useExistingBoatRadioButton.addValueChangeHandler(new ValueChangeHandler() { - @Override - public void onValueChange(ValueChangeEvent event) { - updateBoatPanels(); - } - }); - newBoatPanel = new VerticalPanel(); - existingBoatPanel = new VerticalPanel(); - this.existingBoatsTable = new BoatTableWrapper<>(sailingService, userService, stringMessages, errorReporter, /* multiSelection */ false, - /* enablePager */ true, /* pagingSize*/ 10, false); - existingBoatsTable.refreshBoatList(true, /* callback */ null); - this.existingBoatsTable.getSelectionModel().addSelectionChangeHandler(new SelectionChangeEvent.Handler() { - @Override - public void onSelectionChange(SelectionChangeEvent event) { - CompetitorWithBoatCreateDialog.this.validateAndUpdate(); - } - }); - } - - private void updateBoatPanels() { - boolean isUseExistingBoatSelected = useExistingBoatRadioButton.getValue(); - newBoatPanel.setVisible(!isUseExistingBoatSelected); - existingBoatPanel.setVisible(isUseExistingBoatSelected); - } - - @Override - protected BoatDTO getBoat() { - BoatDTO result = null; - boolean isUseExistingBoatSelected = useExistingBoatRadioButton.getValue(); - if (isUseExistingBoatSelected) { - Set selectedSet = existingBoatsTable.getSelectionModel().getSelectedSet(); - if (!selectedSet.isEmpty()) { - result = selectedSet.iterator().next(); - } - } else { - BoatClassDTO boatClass = new BoatClassDTO(boatClassNameTextBox.getValue(), Distance.NULL, Distance.NULL); - final Color boatColor = boatDisplayColorTextBox.isValid() ? boatDisplayColorTextBox.getColor() - : new InvalidColor(new IllegalArgumentException(boatDisplayColorTextBox.getValue()), - getStringMessages()); - result = new BoatDTO(getCompetitorToEdit().getBoat().getIdAsString(), boatNameTextBox.getName(), boatClass, sailIdTextBox.getText(), boatColor); - } - return result; - } - - @Override - protected Widget getAdditionalWidget() { - VerticalPanel result = new VerticalPanel(); - result.add(super.getAdditionalWidget()); - result.add(createHeadlineLabel(getStringMessages().boat())); - HorizontalPanel hPanel = new HorizontalPanel(); - hPanel.add(useNewBoatRadioButton); - hPanel.add(useExistingBoatRadioButton); - result.add(hPanel); - result.add(newBoatPanel); - result.add(existingBoatPanel); - Grid grid = new Grid(4, 2); - grid.setWidget(0, 0, new Label(getStringMessages().name())); - grid.setWidget(0, 1, boatNameTextBox); - grid.setWidget(1, 0, new Label(getStringMessages().sailNumber())); - grid.setWidget(1, 1, sailIdTextBox); - grid.setWidget(2, 0, new Label(getStringMessages().color())); - grid.setWidget(2, 1, boatDisplayColorTextBox); - grid.setWidget(3, 0, new Label(getStringMessages().boatClass())); - grid.setWidget(3, 1, boatClassNameTextBox); - result.add(grid); - newBoatPanel.add(grid); - existingBoatPanel.add(existingBoatsTable); - updateBoatPanels(); - return result; - } - -} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithBoatEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithBoatEditDialog.java index e8e0ac34af5..3bd08ca3b99 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithBoatEditDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithBoatEditDialog.java @@ -4,12 +4,8 @@ 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.user.client.ui.Widget; -import com.sap.sailing.domain.common.dto.BoatClassDTO; -import com.sap.sailing.domain.common.dto.BoatDTO; import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTO; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sse.common.Color; -import com.sap.sse.common.Distance; /** * An edit for a competitor with a boat @@ -27,24 +23,10 @@ public class CompetitorWithBoatEditDialog extends AbstractCompetitorWithBoatDial */ public CompetitorWithBoatEditDialog(StringMessages stringMessages, CompetitorWithBoatDTO competitorToEdit, DialogCallback callback, String boatClass) { - super("Edit competitor with boat", stringMessages, competitorToEdit, callback, boatClass); + super(stringMessages.editCompetitorWithBoat(), stringMessages, competitorToEdit, callback, boatClass); this.ensureDebugId("CompetitorWithBoatEditDialog"); } - @Override - protected BoatDTO getBoat() { - BoatDTO result = null; - Color boatColor; - if (boatDisplayColorTextBox.isValid()) { - boatColor = boatDisplayColorTextBox.getColor(); - } else { - boatColor = new InvalidColor(new IllegalArgumentException(boatDisplayColorTextBox.getValue()), getStringMessages()); - } - BoatClassDTO boatClass = new BoatClassDTO(boatClassNameTextBox.getValue(), Distance.NULL, Distance.NULL); - result = new BoatDTO(getCompetitorToEdit().getBoat().getIdAsString(), boatNameTextBox.getValue(), boatClass, sailIdTextBox.getValue(), boatColor); - return result; - } - @Override protected Widget getAdditionalWidget() { VerticalPanel result = new VerticalPanel(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java new file mode 100644 index 00000000000..4e154628182 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java @@ -0,0 +1,139 @@ +package com.sap.sailing.gwt.ui.adminconsole; + +import com.google.gwt.dom.client.Style.Unit; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.Grid; +import com.google.gwt.user.client.ui.HorizontalPanel; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.SuggestBox; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.domain.common.dto.BoatDTO; +import com.sap.sailing.domain.common.dto.CompetitorWithBoatDTO; +import com.sap.sailing.gwt.ui.client.StringMessages; + +/** + * An Add dialog for a competitor with an optional boat. If {@link #withBoatCheckBox} is checked the + * {@link #boatDataPanel} is visible and validated + * + * @author Dmitry Bilyk + */ + +public class CompetitorWithOptionalBoatAddDialog extends AbstractCompetitorWithBoatDialog { + + private static CheckBox withBoatCheckBox; + private final VerticalPanel boatDataPanel; + + /** + * The class creates the UI-dialog to type in the Data about a competitor. + * + * @param competitorToAdd + * The 'competitorToAdd' parameter contains the competitor which should be initialized. + * @param boatClass + * The boat class is the default shown boat class for new boats. Set null if your boat is + * already initialized or you don't want a default boat class. + */ + public CompetitorWithOptionalBoatAddDialog(StringMessages stringMessages, CompetitorWithBoatDTO competitorToAdd, + DialogCallback callback) { + super(stringMessages.addCompetitor(), stringMessages, competitorToAdd, callback, null, + new CompetitorWithOptionalBoatAddDialog.CompetitorWithOptionalBoatValidator(stringMessages)); + initWithBoatCheckBox(); + boatDataPanel = new VerticalPanel(); + boatDataPanel.setVisible(false); + this.ensureDebugId("CompetitorWithBoatEditDialog"); + } + + private void initWithBoatCheckBox() { + withBoatCheckBox = new CheckBox(); + withBoatCheckBox.addClickHandler(new ClickHandler() { + @Override + public void onClick(ClickEvent event) { + boatDataPanel.setVisible(withBoatCheckBox.getValue()); + validateAndUpdate(); + } + }); + withBoatCheckBox.setValue(false); + } + + @Override + protected Widget getAdditionalWidget() { + VerticalPanel result = new VerticalPanel(); + result.add(super.getAdditionalWidget()); + result.add(createWithBoatCheckBoxPanel()); + boatDataPanel.add(createHeadlineLabel(getStringMessages().boat())); + Grid grid = new Grid(5, 2); + grid.setWidget(0, 0, new Label(getStringMessages().name())); + grid.setWidget(0, 1, boatNameTextBox); + grid.setWidget(1, 0, new Label(getStringMessages().sailNumber())); + grid.setWidget(1, 1, sailIdTextBox); + grid.setWidget(2, 0, new Label(getStringMessages().boatClass())); + grid.setWidget(2, 1, boatClassNameTextBox); + grid.setWidget(3, 0, new Label(getStringMessages().color())); + grid.setWidget(3, 1, boatDisplayColorTextBox); + boatDataPanel.add(grid); + result.add(boatDataPanel); + return result; + } + + @Override + protected CompetitorWithBoatDTO getResult() { + CompetitorWithBoatDTO competitorWithOptionalBoat = super.getResult(); + if (!withBoatCheckBox.getValue()) { + competitorWithOptionalBoat.setBoat(null); + } + return competitorWithOptionalBoat; + } + + private HorizontalPanel createWithBoatCheckBoxPanel() { + HorizontalPanel withBoatCheckBoxPanel = new HorizontalPanel(); + withBoatCheckBoxPanel.add(new Label(getStringMessages().withBoat())); + withBoatCheckBoxPanel.getElement().getStyle().setMarginTop(10, Unit.PX); + withBoatCheckBoxPanel.getElement().getStyle().setMarginLeft(20, Unit.PX); + withBoatCheckBoxPanel.getElement().getStyle().setMarginBottom(10, Unit.PX); + withBoatCheckBoxPanel.add(withBoatCheckBox); + return withBoatCheckBoxPanel; + } + + @Override + protected void setBoatClassNameEnabled(SuggestBox boatClassNameTextBox, boolean enabled) { + super.setBoatClassNameEnabled(boatClassNameTextBox, true); + } + + protected static class CompetitorWithOptionalBoatValidator + extends CompetitorWithoutBoatValidator { + protected final StringMessages stringMessages; + + public CompetitorWithOptionalBoatValidator(StringMessages stringMessages) { + super(stringMessages); + this.stringMessages = stringMessages; + } + + @Override + public String getErrorMessage(CompetitorWithBoatDTO competitorToValidate) { + String result = super.getErrorMessage(competitorToValidate); + if (withBoatCheckBox.getValue()) { + if (result == null) { + BoatDTO boatToValidate = competitorToValidate.getBoat(); + boolean invalidSailId = boatToValidate.getSailId() == null || boatToValidate.getSailId().isEmpty(); + boolean invalidName = boatToValidate.getName() == null || boatToValidate.getName().isEmpty(); + if (invalidSailId && invalidName) { + result = stringMessages.pleaseEnterASailNumberOrABoatName(); + } else if (boatToValidate.getColor() != null && boatToValidate.getColor() instanceof InvalidColor) { + result = boatToValidate.getColor().getAsHtml(); + } else if (isBoatClassInvalid(boatToValidate)) { + result = stringMessages.pleaseEnterABoatClass(); + } + } + } + return result; + } + + private boolean isBoatClassInvalid(BoatDTO boatToValidate) { + return boatToValidate.getBoatClass().getName() == null || boatToValidate.getBoatClass().getName().isEmpty(); + } + + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EditCompetitorsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EditCompetitorsDialog.java index 5a67cf0be7c..53648b51a38 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EditCompetitorsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EditCompetitorsDialog.java @@ -16,6 +16,7 @@ public class EditCompetitorsDialog extends DataEntryDialog> { public CompetitorsValidator() { @@ -28,7 +29,8 @@ public class EditCompetitorsDialog extends DataEntryDialog> callback) { super(stringMessages.actionEditCompetitors(), null, stringMessages.ok(), stringMessages.cancel(), new CompetitorsValidator(), callback); this.sailingService = sailingService; @@ -36,6 +38,7 @@ public class EditCompetitorsDialog extends DataEntryDialog { EditCompetitorsDialog editCompetitorsDialog = new EditCompetitorsDialog(sailingService, userService, - leaderboardDTO.getName(), stringMessages, errorReporter, + leaderboardDTO.getName(), leaderboardDTO.boatClassName, stringMessages, errorReporter, new DialogCallback>() { @Override public void cancel() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java index a94a995693f..f040ad5a8d9 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.java @@ -976,6 +976,9 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages, String editCompetitor(); String pleaseEnterASailNumber(); String pleaseEnterASailNumberOrABoatName(); + String addCompetitor(); + String editCompetitorWithBoat(); + String withBoat(); String successfullyAllowedCompetitorReset(String names); String successfullyAllowedBoatReset(String names); String allowReload(); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties index f4cc9432ef9..6d94f6c7968 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties @@ -966,6 +966,9 @@ filterBoats=Filter boats by name, boat class, sail number or ID editCompetitor=Edit Competitor pleaseEnterASailNumber=Please enter a sail number pleaseEnterASailNumberOrABoatName=Please enter a sail number or a boat name +addCompetitor=Add Competitor +editCompetitorWithBoat=Edit competitor with boat +withBoat=With Boat successfullyAllowedCompetitorReset=Successfully allowed reload of competitor(s) {0}. successfullyAllowedBoatReset=Successfully allowed reload of boats(s) {0}. id=ID From 0fd9a6360f447599c5916f3586a5e62bba1432ae Mon Sep 17 00:00:00 2001 From: dmitry Date: Mon, 11 May 2020 14:49:51 +0300 Subject: [PATCH 02/10] bug5275:Creation of CompetitorWithBoat not possible in Leaderboards and Competitors tabs --- .../adminconsole/CompetitorTableWrapper.java | 48 ++++++------------- .../adminconsole/EditCompetitorsDialog.java | 12 +++-- 2 files changed, 22 insertions(+), 38 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java index 0f56ae4727e..186ffd5b918 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java @@ -465,33 +465,10 @@ public class CompetitorTableWrapper() { - @Override - public void onFailure(Throwable caught) { - logCompetitorAddError(caught); - } - - @Override - public void onSuccess(CompetitorWithBoatDTO addedCompetitor) { - onCompetitorAddSuccess(addedCompetitor); - } - }); + sailingService.addOrUpdateCompetitorWithBoat(competitor, createAddCompetitorCallback()); } else { - sailingService.addOrUpdateCompetitorWithoutBoat(competitor, - new AsyncCallback() { - @Override - public void onFailure(Throwable caught) { - logCompetitorAddError(caught); - } - - @Override - public void onSuccess(CompetitorDTO addedCompetitor) { - onCompetitorAddSuccess(addedCompetitor); - } - }); + sailingService.addOrUpdateCompetitorWithoutBoat(competitor, createAddCompetitorCallback()); } - } @Override @@ -578,13 +555,18 @@ public class CompetitorTableWrapper AsyncCallback createAddCompetitorCallback() { + return new AsyncCallback() { + @Override + public void onFailure(Throwable caught) { + errorReporter.reportError("Error trying to add competitor: " + caught.getMessage()); + } + + @Override + public void onSuccess(T addedCompetitor) { + getFilterField().add(addedCompetitor); + getDataProvider().refresh(); + } + }; } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EditCompetitorsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EditCompetitorsDialog.java index 53648b51a38..4c347e5074b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EditCompetitorsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EditCompetitorsDialog.java @@ -29,10 +29,11 @@ public class EditCompetitorsDialog extends DataEntryDialog> callback) { - super(stringMessages.actionEditCompetitors(), null, stringMessages.ok(), stringMessages.cancel(), new CompetitorsValidator(), callback); + super(stringMessages.actionEditCompetitors(), null, stringMessages.ok(), stringMessages.cancel(), + new CompetitorsValidator(), callback); this.sailingService = sailingService; this.userService = userService; this.stringMessages = stringMessages; @@ -48,7 +49,8 @@ public class EditCompetitorsDialog extends DataEntryDialog Date: Tue, 12 May 2020 10:58:19 +0300 Subject: [PATCH 03/10] bug5275:fixed selenium tests --- .../ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java | 2 +- .../adminconsole/tracking/TrackedRacesCompetitorsPanelPO.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java index 4e154628182..77771b2b55d 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java @@ -42,7 +42,7 @@ public class CompetitorWithOptionalBoatAddDialog extends AbstractCompetitorWithB initWithBoatCheckBox(); boatDataPanel = new VerticalPanel(); boatDataPanel.setVisible(false); - this.ensureDebugId("CompetitorWithBoatEditDialog"); + this.ensureDebugId("CompetitorWithBoatAddDialog"); } private void initWithBoatCheckBox() { diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorsPanelPO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorsPanelPO.java index 8dfb2de64ad..80d5e95454b 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorsPanelPO.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorsPanelPO.java @@ -27,7 +27,7 @@ public class TrackedRacesCompetitorsPanelPO extends PageArea { public TrackedRacesCompetitorEditDialogPO pushAddCompetitorButton() { this.addCompetitorButton.click(); waitForAjaxRequests(); - WebElement dialog = findElementBySeleniumId(this.driver, "CompetitorEditDialog"); + WebElement dialog = findElementBySeleniumId(this.driver, "CompetitorWithBoatAddDialog"); return new TrackedRacesCompetitorEditDialogPO(this.driver, dialog); } From 4c5674177b10b911ffa3638adbc6ae24b4ebeaa1 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 May 2020 14:13:40 +0200 Subject: [PATCH 04/10] bug5275: make checkbox instance instead of class scoped; pass through leaderboard's canBoatsChange --- .../gwt/ui/adminconsole/CompetitorPanel.java | 21 +++----- .../adminconsole/CompetitorTableWrapper.java | 4 +- .../CompetitorWithOptionalBoatAddDialog.java | 54 +++++++++---------- .../adminconsole/EditCompetitorsDialog.java | 8 +-- .../adminconsole/LeaderboardConfigPanel.java | 5 +- 5 files changed, 41 insertions(+), 51 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java index 8a476ab24fc..fbb2abbc9f3 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorPanel.java @@ -39,11 +39,12 @@ public class CompetitorPanel extends SimplePanel implements BusyDisplay { public CompetitorPanel(final SailingServiceWriteAsync sailingServiceWrite, final UserService userService, final StringMessages stringMessages, final ErrorReporter errorReporter) { - this(sailingServiceWrite, userService, null, null, stringMessages, errorReporter); + this(sailingServiceWrite, userService, /* leaderboardName */ null, /* boatClassName */ null, /* createWithBoatByDefault */ true, + stringMessages, errorReporter); } public CompetitorPanel(final SailingServiceWriteAsync sailingServiceWrite, final UserService userService, final String leaderboardName, - String boatClassName, final StringMessages stringMessages, final ErrorReporter errorReporter) { + String boatClassName, boolean createWithBoatByDefault, final StringMessages stringMessages, final ErrorReporter errorReporter) { super(); this.leaderboardName = leaderboardName; this.boatClassName = boatClassName; @@ -56,27 +57,22 @@ public class CompetitorPanel extends SimplePanel implements BusyDisplay { this.setWidget(mainPanel); final AccessControlledButtonPanel buttonPanel = new AccessControlledButtonPanel(userService, COMPETITOR); mainPanel.add(buttonPanel); - final Button refreshButton = buttonPanel.addUnsecuredAction(stringMessages.refresh(), this::refreshCompetitorList); refreshButton.ensureDebugId("RefreshButton"); - final Button allowReloadButton = buttonPanel.addUnsecuredAction(stringMessages.allowReload(), () -> competitorTable.allowUpdate(refreshableCompetitorSelectionModel.getSelectedSet())); refreshableCompetitorSelectionModel.addSelectionChangeHandler( event -> allowReloadButton.setEnabled(!refreshableCompetitorSelectionModel.getSelectedSet().isEmpty())); allowReloadButton.setEnabled(!refreshableCompetitorSelectionModel.getSelectedSet().isEmpty()); - final Button addCompetitorButton = buttonPanel.addCreateAction(stringMessages.add(), - this::openAddCompetitorDialog); + ()->openAddCompetitorDialog(createWithBoatByDefault)); addCompetitorButton.ensureDebugId("AddCompetitorButton"); - buttonPanel.addUnsecuredAction(stringMessages.selectAll(), () -> { for (CompetitorDTO c : competitorTable.getDataProvider().getList()) { refreshableCompetitorSelectionModel.setSelected(c, true); } }); - buttonPanel.addCreateAction(stringMessages.importCompetitors(), () -> { sailingServiceWrite.getCompetitorProviderNames(new AsyncCallback>() { @Override @@ -96,7 +92,6 @@ public class CompetitorPanel extends SimplePanel implements BusyDisplay { } }); }); - // only if this competitor panel is connected to a leaderboard, we want to enable invitations if (leaderboardName != null) { buttonPanel.addCreateAction(stringMessages.inviteSelectedCompetitors(), () -> { @@ -106,10 +101,8 @@ public class CompetitorPanel extends SimplePanel implements BusyDisplay { helper.inviteCompetitors(competitors, leaderboardName); }); } - mainPanel.add(busyIndicator); mainPanel.add(competitorTable); - if (leaderboardName != null) { refreshCompetitorList(); } @@ -136,13 +129,13 @@ public class CompetitorPanel extends SimplePanel implements BusyDisplay { }; } - private void openAddCompetitorDialog() { + private void openAddCompetitorDialog(boolean createWithBoatByDefault) { CompetitorWithBoatDTOImpl competitorDTO = new CompetitorWithBoatDTOImpl(); - BoatClassDTO boatClassDTO = new BoatClassDTO(boatClassName, null, null); + BoatClassDTO boatClassDTO = new BoatClassDTO(boatClassName, /* hullLength */ null, /* hullBeam */ null); BoatDTO boatDTO = new BoatDTO(); boatDTO.setBoatClass(boatClassDTO); competitorDTO.setBoat(boatDTO); - competitorTable.openCompetitorWithBoatAddDialog(competitorDTO); + competitorTable.openCompetitorWithBoatAddDialog(competitorDTO, createWithBoatByDefault); } public void refreshCompetitorList() { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java index 5c4cf9d2390..08e00819ac2 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorTableWrapper.java @@ -459,9 +459,9 @@ public class CompetitorTableWrapper() { + newCompetitor, createWithBoatByDefault, new DialogCallback() { @Override public void ok(final CompetitorWithBoatDTO competitor) { if (competitor.hasBoat()) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java index 77771b2b55d..b8825f0952c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java @@ -1,11 +1,9 @@ package com.sap.sailing.gwt.ui.adminconsole; -import com.google.gwt.dom.client.Style.Unit; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.Grid; -import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.VerticalPanel; @@ -16,14 +14,16 @@ import com.sap.sailing.gwt.ui.client.StringMessages; /** * An Add dialog for a competitor with an optional boat. If {@link #withBoatCheckBox} is checked the - * {@link #boatDataPanel} is visible and validated + * {@link #boatDataPanel} is visible and validated. While the dialog always returns a + * {@link CompetitorWithBoatDTO}, the resulting object may still have {@link CompetitorWithBoatDTO#hasBoat() hasBoat()==false} + * in which case the {@link #withBoatCheckBox} was not ticked. * * @author Dmitry Bilyk */ public class CompetitorWithOptionalBoatAddDialog extends AbstractCompetitorWithBoatDialog { - private static CheckBox withBoatCheckBox; + private final CheckBox withBoatCheckBox; private final VerticalPanel boatDataPanel; /** @@ -31,37 +31,40 @@ public class CompetitorWithOptionalBoatAddDialog extends AbstractCompetitorWithB * * @param competitorToAdd * The 'competitorToAdd' parameter contains the competitor which should be initialized. + * @param createWithBoatByDefault + * decides the default setting of the {@link #withBoatCheckBox}. * @param boatClass * The boat class is the default shown boat class for new boats. Set null if your boat is * already initialized or you don't want a default boat class. */ public CompetitorWithOptionalBoatAddDialog(StringMessages stringMessages, CompetitorWithBoatDTO competitorToAdd, - DialogCallback callback) { - super(stringMessages.addCompetitor(), stringMessages, competitorToAdd, callback, null, - new CompetitorWithOptionalBoatAddDialog.CompetitorWithOptionalBoatValidator(stringMessages)); - initWithBoatCheckBox(); - boatDataPanel = new VerticalPanel(); - boatDataPanel.setVisible(false); - this.ensureDebugId("CompetitorWithBoatAddDialog"); + boolean createWithBoatByDefault, DialogCallback callback) { + this(stringMessages, competitorToAdd, new CheckBox(stringMessages.withBoat()), createWithBoatByDefault, callback); } - - private void initWithBoatCheckBox() { - withBoatCheckBox = new CheckBox(); - withBoatCheckBox.addClickHandler(new ClickHandler() { + + public CompetitorWithOptionalBoatAddDialog(StringMessages stringMessages, CompetitorWithBoatDTO competitorToAdd, + CheckBox withBoatCheckBox, boolean createWithBoatByDefault, DialogCallback callback) { + super(stringMessages.addCompetitor(), stringMessages, competitorToAdd, callback, null, + new CompetitorWithOptionalBoatAddDialog.CompetitorWithOptionalBoatValidator(withBoatCheckBox, stringMessages)); + this.withBoatCheckBox = withBoatCheckBox; + this.withBoatCheckBox.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { boatDataPanel.setVisible(withBoatCheckBox.getValue()); validateAndUpdate(); } }); - withBoatCheckBox.setValue(false); + this.withBoatCheckBox.setValue(createWithBoatByDefault); + boatDataPanel = new VerticalPanel(); + boatDataPanel.setVisible(createWithBoatByDefault); + this.ensureDebugId("CompetitorWithBoatAddDialog"); } @Override protected Widget getAdditionalWidget() { VerticalPanel result = new VerticalPanel(); result.add(super.getAdditionalWidget()); - result.add(createWithBoatCheckBoxPanel()); + result.add(withBoatCheckBox); boatDataPanel.add(createHeadlineLabel(getStringMessages().boat())); Grid grid = new Grid(5, 2); grid.setWidget(0, 0, new Label(getStringMessages().name())); @@ -86,16 +89,6 @@ public class CompetitorWithOptionalBoatAddDialog extends AbstractCompetitorWithB return competitorWithOptionalBoat; } - private HorizontalPanel createWithBoatCheckBoxPanel() { - HorizontalPanel withBoatCheckBoxPanel = new HorizontalPanel(); - withBoatCheckBoxPanel.add(new Label(getStringMessages().withBoat())); - withBoatCheckBoxPanel.getElement().getStyle().setMarginTop(10, Unit.PX); - withBoatCheckBoxPanel.getElement().getStyle().setMarginLeft(20, Unit.PX); - withBoatCheckBoxPanel.getElement().getStyle().setMarginBottom(10, Unit.PX); - withBoatCheckBoxPanel.add(withBoatCheckBox); - return withBoatCheckBoxPanel; - } - @Override protected void setBoatClassNameEnabled(SuggestBox boatClassNameTextBox, boolean enabled) { super.setBoatClassNameEnabled(boatClassNameTextBox, true); @@ -103,10 +96,12 @@ public class CompetitorWithOptionalBoatAddDialog extends AbstractCompetitorWithB protected static class CompetitorWithOptionalBoatValidator extends CompetitorWithoutBoatValidator { - protected final StringMessages stringMessages; + private final StringMessages stringMessages; + private final CheckBox withBoatCheckBox; - public CompetitorWithOptionalBoatValidator(StringMessages stringMessages) { + public CompetitorWithOptionalBoatValidator(CheckBox withBoatCheckBox, StringMessages stringMessages) { super(stringMessages); + this.withBoatCheckBox = withBoatCheckBox; this.stringMessages = stringMessages; } @@ -133,7 +128,6 @@ public class CompetitorWithOptionalBoatAddDialog extends AbstractCompetitorWithB private boolean isBoatClassInvalid(BoatDTO boatToValidate) { return boatToValidate.getBoatClass().getName() == null || boatToValidate.getBoatClass().getName().isEmpty(); } - } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EditCompetitorsDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EditCompetitorsDialog.java index f424ee0bd99..d42ec8f7b0f 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EditCompetitorsDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/EditCompetitorsDialog.java @@ -17,6 +17,7 @@ public class EditCompetitorsDialog extends DataEntryDialog> { public CompetitorsValidator() { @@ -30,8 +31,8 @@ public class EditCompetitorsDialog extends DataEntryDialog> callback) { + final String leaderboardName, final String boatClassName, boolean createWithBoatByDefault, + final StringMessages stringMessages, final ErrorReporter errorReporter, DialogCallback> callback) { super(stringMessages.actionEditCompetitors(), null, stringMessages.ok(), stringMessages.cancel(), new CompetitorsValidator(), callback); this.sailingServiceWrite = sailingServiceWrite; @@ -40,6 +41,7 @@ public class EditCompetitorsDialog extends DataEntryDialog { EditCompetitorsDialog editCompetitorsDialog = new EditCompetitorsDialog(sailingServiceWrite, userService, - leaderboardDTO.getName(), leaderboardDTO.boatClassName, stringMessages, errorReporter, - new DialogCallback>() { + leaderboardDTO.getName(), leaderboardDTO.boatClassName, + /* createWithBoatByDefault */ !leaderboardDTO.canBoatsOfCompetitorsChangePerRace, + stringMessages, errorReporter, new DialogCallback>() { @Override public void cancel() { } From f23679b2a78efe721b99f09c56c0cbdc613c752a Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 May 2020 14:15:57 +0200 Subject: [PATCH 05/10] bug5275: added German i18n strings --- .../com/sap/sailing/gwt/ui/client/StringMessages_de.properties | 3 +++ 1 file changed, 3 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties index 7b249e5a36d..08d290eab14 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_de.properties @@ -950,6 +950,9 @@ filterBoats=Filtere Boote nach Name, Bootsklasse, Segelnummer oder ID editCompetitor=Teilnehmer bearbeiten pleaseEnterASailNumber=Bitte die Segelnummer eingeben pleaseEnterASailNumberOrABoatName=Bitte die Segelnummer oder den Bootsnamen eingeben +addCompetitor=Teilnehmer hinzufügen +editCompetitorWithBoat=Teilnehmer mit Boot bearbeiten +withBoat=Mit Boot successfullyAllowedCompetitorReset=Aktualisierung der Daten zu Teilnehmer(n) {0} erfolgreich ermöglicht.id=ID successfullyAllowedBoatReset=Aktualisierung der Daten zu Boot(en) {0} erfolgreich ermöglicht.id=ID allowReload=Aktualisierung ermöglichen From 26eac3a4a8f8726f859be1b128f23c7befa3f7c3 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 May 2020 17:00:49 +0200 Subject: [PATCH 06/10] bug5275: fixed UI test for competitor creation --- .../CompetitorWithOptionalBoatAddDialog.java | 1 + .../tracking/TrackedRacesCompetitorEditDialogPO.java | 11 +++++++++++ .../test/adminconsole/TestCompetitorCreation.java | 2 ++ 3 files changed, 14 insertions(+) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java index b8825f0952c..f332c059f18 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorWithOptionalBoatAddDialog.java @@ -47,6 +47,7 @@ public class CompetitorWithOptionalBoatAddDialog extends AbstractCompetitorWithB super(stringMessages.addCompetitor(), stringMessages, competitorToAdd, callback, null, new CompetitorWithOptionalBoatAddDialog.CompetitorWithOptionalBoatValidator(withBoatCheckBox, stringMessages)); this.withBoatCheckBox = withBoatCheckBox; + this.withBoatCheckBox.ensureDebugId("WithBoatCheckBox"); this.withBoatCheckBox.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorEditDialogPO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorEditDialogPO.java index 8da5ae7fc10..57d8ca44377 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorEditDialogPO.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorEditDialogPO.java @@ -6,6 +6,7 @@ import org.openqa.selenium.WebElement; import com.sap.sailing.selenium.core.BySeleniumId; import com.sap.sailing.selenium.core.FindBy; import com.sap.sailing.selenium.pages.common.DataEntryDialogPO; +import com.sap.sailing.selenium.pages.gwt.CheckBoxPO; public class TrackedRacesCompetitorEditDialogPO extends DataEntryDialogPO { @FindBy(how = BySeleniumId.class, using = "NameTextBox") @@ -14,11 +15,17 @@ public class TrackedRacesCompetitorEditDialogPO extends DataEntryDialogPO { @FindBy(how = BySeleniumId.class, using = "ShortNameTextBox") private WebElement shortNameTextBox; + @FindBy(how = BySeleniumId.class, using = "WithBoatCheckBox") + private WebElement withBoatCheckBoxElement; + @FindBy(how = BySeleniumId.class, using = "OkButton") private WebElement okButton; + private final CheckBoxPO withBoatCheckBox; + public TrackedRacesCompetitorEditDialogPO(WebDriver driver, WebElement element) { super(driver, element); + withBoatCheckBox = CheckBoxPO.create(driver, withBoatCheckBoxElement); } public void setNameTextBox(String name) { @@ -30,4 +37,8 @@ public class TrackedRacesCompetitorEditDialogPO extends DataEntryDialogPO { this.shortNameTextBox.clear(); this.shortNameTextBox.sendKeys(name); } + + public void setWithBoat(boolean withBoat) { + this.withBoatCheckBox.setSelected(withBoat); + } } diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestCompetitorCreation.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestCompetitorCreation.java index d17cffa2bf1..5001c469185 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestCompetitorCreation.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestCompetitorCreation.java @@ -10,6 +10,7 @@ import org.junit.Test; import com.sap.sailing.selenium.pages.adminconsole.AdminConsolePage; import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetitorEditDialogPO; import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetitorTablePO.CompetitorEntry; +import com.sap.sailing.selenium.pages.gwt.CheckBoxPO; import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetitorsPanelPO; import com.sap.sailing.selenium.test.AbstractSeleniumTest; @@ -42,6 +43,7 @@ public class TestCompetitorCreation extends AbstractSeleniumTest { final String shortName = "NRV"; dialog.setNameTextBox(name); dialog.setShortNameTextBox(shortName); + dialog.setWithBoat(false); dialog.pressOk(); boolean found = false; for (final CompetitorEntry it : competitorsPanel.getCompetitorTable().getEntries()) { From 9b58a2bb96d2bf1962adb887c74583736da6bdc0 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 May 2020 17:01:20 +0200 Subject: [PATCH 07/10] consolidated imports, avoiding warnings --- .../selenium/test/adminconsole/TestCompetitorCreation.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestCompetitorCreation.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestCompetitorCreation.java index 5001c469185..aebe4bddd58 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestCompetitorCreation.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestCompetitorCreation.java @@ -10,7 +10,6 @@ import org.junit.Test; import com.sap.sailing.selenium.pages.adminconsole.AdminConsolePage; import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetitorEditDialogPO; import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetitorTablePO.CompetitorEntry; -import com.sap.sailing.selenium.pages.gwt.CheckBoxPO; import com.sap.sailing.selenium.pages.adminconsole.tracking.TrackedRacesCompetitorsPanelPO; import com.sap.sailing.selenium.test.AbstractSeleniumTest; From bb303f05349059236e6b8ea77fd951c88bb54214 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Thu, 14 May 2020 21:28:08 +0200 Subject: [PATCH 08/10] bug5275: fixed another test that was failing now due to validation of missing boat data --- .../test/adminconsole/TestRefreshableSelectionModel.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestRefreshableSelectionModel.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestRefreshableSelectionModel.java index 2429cb47649..d2240ab99a8 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestRefreshableSelectionModel.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestRefreshableSelectionModel.java @@ -76,21 +76,19 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest { setUpAuthenticatedSession(windowForEditDriver); final TrackedRacesCompetitorsPanelPO competitorsPanel = goToCompetitorsPanel( windowForEditDriver); - for (int i = 0; i < 2; i++) { TrackedRacesCompetitorEditDialogPO dialog = competitorsPanel.pushAddCompetitorButton(); dialog.setNameTextBox("" + System.currentTimeMillis()); dialog.setShortNameTextBox("" + System.currentTimeMillis()); + dialog.setWithBoat(false); dialog.pressOk(); } - TrackedRacesCompetitorEditDialogPO dialog = competitorsPanel.pushAddCompetitorButton(); final String name = "" + System.currentTimeMillis(); dialog.setNameTextBox(name); final String shortName = "" + System.currentTimeMillis(); dialog.setShortNameTextBox(shortName); dialog.pressOk(); - boolean found = false; for (final CompetitorEntry it : competitorsPanel.getCompetitorTable().getEntries()) { String itName = it.getName(); @@ -101,7 +99,6 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest { } } assertTrue(found); - TrackedRacesCompetitorsPanelPO competitorPanelForSelection = goToCompetitorsPanel( windowForSelection.switchToWindow()); found = false; @@ -115,7 +112,6 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest { } assertTrue(found); competitorPanelForSelection.getCompetitorTable().selectEntry(competitorEntryToSelect); - assertEquals(1, competitorPanelForSelection.getCompetitorTable().getSelectedEntries().size()); assertEquals(name, competitorPanelForSelection.getCompetitorTable().getSelectedEntries().get(0).getName()); assertEquals(shortName, competitorPanelForSelection.getCompetitorTable().getSelectedEntries().get(0).getShortName()); @@ -127,10 +123,8 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest { final String changedShortName = "" + System.currentTimeMillis(); dialog.setShortNameTextBox(changedShortName); dialog.pressOk(); - // assert selection windowForSelection.switchToWindow(); - competitorPanelForSelection.pushRefreshButton(); WebDriverWait waitTimer = new WebDriverWait(competitorPanelForSelection.driver, 10); ExpectedCondition condition = new ExpectedCondition() { @@ -140,7 +134,6 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest { } }; waitTimer.until(condition); - assertEquals(1, competitorPanelForSelection.getCompetitorTable().getSelectedEntries().size()); for (final CompetitorEntry it : competitorPanelForSelection.getCompetitorTable().getEntries()) { String itName = it.getName(); From 89745c35ca53aef605afa0bcae953134f614c862 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 May 2020 12:36:30 +0200 Subject: [PATCH 09/10] fixed obtaining the "With Boat" checkbox for the case when it's not there --- .../ui/adminconsole/CompetitorEditDialog.java | 1 - .../sap/sailing/selenium/pages/PageObject.java | 1 - .../TrackedRacesCompetitorEditDialogPO.java | 18 +++++++++++++----- .../TestRefreshableSelectionModel.java | 1 + 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java index dc06308d474..00adc7e4c20 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/CompetitorEditDialog.java @@ -102,7 +102,6 @@ public abstract class CompetitorEditDialog this.ensureDebugId("CompetitorEditDialog"); this.stringMessages = stringMessages; this.competitorToEdit = competitorToEdit; - this.name = createTextBox(competitorToEdit.getName()); name.ensureDebugId("NameTextBox"); this.shortName = createTextBox(competitorToEdit.getShortName()); diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/PageObject.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/PageObject.java index 0358bfe5374..53a352c21d0 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/PageObject.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/PageObject.java @@ -210,7 +210,6 @@ public class PageObject { public PageObject(WebDriver driver, SearchContext context) { this.driver = driver; this.context = context; - verify(); initElements(); } diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorEditDialogPO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorEditDialogPO.java index 57d8ca44377..639f693c229 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorEditDialogPO.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorEditDialogPO.java @@ -1,5 +1,9 @@ package com.sap.sailing.selenium.pages.adminconsole.tracking; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; @@ -15,9 +19,6 @@ public class TrackedRacesCompetitorEditDialogPO extends DataEntryDialogPO { @FindBy(how = BySeleniumId.class, using = "ShortNameTextBox") private WebElement shortNameTextBox; - @FindBy(how = BySeleniumId.class, using = "WithBoatCheckBox") - private WebElement withBoatCheckBoxElement; - @FindBy(how = BySeleniumId.class, using = "OkButton") private WebElement okButton; @@ -25,7 +26,12 @@ public class TrackedRacesCompetitorEditDialogPO extends DataEntryDialogPO { public TrackedRacesCompetitorEditDialogPO(WebDriver driver, WebElement element) { super(driver, element); - withBoatCheckBox = CheckBoxPO.create(driver, withBoatCheckBoxElement); + final List withBoatCheckBoxElement = driver.findElements(new BySeleniumId("WithBoatCheckBox")); + if (withBoatCheckBoxElement.isEmpty()) { + withBoatCheckBox = null; + } else { + withBoatCheckBox = CheckBoxPO.create(driver, withBoatCheckBoxElement.get(0)); + } } public void setNameTextBox(String name) { @@ -39,6 +45,8 @@ public class TrackedRacesCompetitorEditDialogPO extends DataEntryDialogPO { } public void setWithBoat(boolean withBoat) { - this.withBoatCheckBox.setSelected(withBoat); + if (withBoatCheckBox != null) { + this.withBoatCheckBox.setSelected(withBoat); + } } } diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestRefreshableSelectionModel.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestRefreshableSelectionModel.java index d2240ab99a8..0e3c318314d 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestRefreshableSelectionModel.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/test/adminconsole/TestRefreshableSelectionModel.java @@ -88,6 +88,7 @@ public class TestRefreshableSelectionModel extends AbstractSeleniumTest { dialog.setNameTextBox(name); final String shortName = "" + System.currentTimeMillis(); dialog.setShortNameTextBox(shortName); + dialog.setWithBoat(false); dialog.pressOk(); boolean found = false; for (final CompetitorEntry it : competitorsPanel.getCompetitorTable().getEntries()) { From e9dc000126f5e13b602b94f9890928706cd75a0f Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 15 May 2020 13:54:34 +0200 Subject: [PATCH 10/10] consolidated imports to avoid warnings --- .../tracking/TrackedRacesCompetitorEditDialogPO.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorEditDialogPO.java b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorEditDialogPO.java index 639f693c229..5a3e9cf9d71 100644 --- a/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorEditDialogPO.java +++ b/java/com.sap.sailing.selenium.test/src/com/sap/sailing/selenium/pages/adminconsole/tracking/TrackedRacesCompetitorEditDialogPO.java @@ -1,9 +1,7 @@ package com.sap.sailing.selenium.pages.adminconsole.tracking; import java.util.List; -import java.util.concurrent.TimeUnit; -import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement;