bug5275: make checkbox instance instead of class scoped; pass through leaderboard's canBoatsChange

This commit is contained in:
Axel Uhl
2020-05-14 14:13:40 +02:00
parent 28cb39d9aa
commit 4c5674177b
5 changed files with 41 additions and 51 deletions
@@ -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<Iterable<String>>() {
@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() {
@@ -459,9 +459,9 @@ public class CompetitorTableWrapper<S extends RefreshableSelectionModel<Competit
dialog.show();
}
void openCompetitorWithBoatAddDialog(final CompetitorWithBoatDTO newCompetitor) {
void openCompetitorWithBoatAddDialog(final CompetitorWithBoatDTO newCompetitor, boolean createWithBoatByDefault) {
final CompetitorWithOptionalBoatAddDialog dialog = new CompetitorWithOptionalBoatAddDialog(getStringMessages(),
newCompetitor, new DialogCallback<CompetitorWithBoatDTO>() {
newCompetitor, createWithBoatByDefault, new DialogCallback<CompetitorWithBoatDTO>() {
@Override
public void ok(final CompetitorWithBoatDTO competitor) {
if (competitor.hasBoat()) {
@@ -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 <code>null</code> if your boat is
* already initialized or you don't want a default boat class.
*/
public CompetitorWithOptionalBoatAddDialog(StringMessages stringMessages, CompetitorWithBoatDTO competitorToAdd,
DialogCallback<CompetitorWithBoatDTO> 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<CompetitorWithBoatDTO> 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<CompetitorWithBoatDTO> 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<CompetitorWithBoatDTO> {
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();
}
}
}
@@ -17,6 +17,7 @@ public class EditCompetitorsDialog extends DataEntryDialog<List<CompetitorWithBo
private final ErrorReporter errorReporter;
private final String leaderboardName;
private final String boatClassName;
private final boolean createWithBoatByDefault;
protected static class CompetitorsValidator implements Validator<List<CompetitorWithBoatDTO>> {
public CompetitorsValidator() {
@@ -30,8 +31,8 @@ public class EditCompetitorsDialog extends DataEntryDialog<List<CompetitorWithBo
}
public EditCompetitorsDialog(final SailingServiceWriteAsync sailingServiceWrite, final UserService userService,
final String leaderboardName, final String boatClassName, final StringMessages stringMessages,
final ErrorReporter errorReporter, DialogCallback<List<CompetitorWithBoatDTO>> callback) {
final String leaderboardName, final String boatClassName, boolean createWithBoatByDefault,
final StringMessages stringMessages, final ErrorReporter errorReporter, DialogCallback<List<CompetitorWithBoatDTO>> callback) {
super(stringMessages.actionEditCompetitors(), null, stringMessages.ok(), stringMessages.cancel(),
new CompetitorsValidator(), callback);
this.sailingServiceWrite = sailingServiceWrite;
@@ -40,6 +41,7 @@ public class EditCompetitorsDialog extends DataEntryDialog<List<CompetitorWithBo
this.errorReporter = errorReporter;
this.leaderboardName = leaderboardName;
this.boatClassName = boatClassName;
this.createWithBoatByDefault = createWithBoatByDefault;
}
@Override
@@ -50,7 +52,7 @@ public class EditCompetitorsDialog extends DataEntryDialog<List<CompetitorWithBo
@Override
protected Widget getAdditionalWidget() {
CompetitorPanel competitorPanel = new CompetitorPanel(sailingServiceWrite, userService, leaderboardName,
boatClassName, stringMessages, errorReporter);
boatClassName, createWithBoatByDefault, stringMessages, errorReporter);
return competitorPanel;
}
}
@@ -313,8 +313,9 @@ public class LeaderboardConfigPanel extends AbstractLeaderboardConfigPanel
leaderboardActionColumn.addAction(LeaderboardConfigImagesBarCell.ACTION_EDIT_COMPETITORS, UPDATE,
leaderboardDTO -> {
EditCompetitorsDialog editCompetitorsDialog = new EditCompetitorsDialog(sailingServiceWrite, userService,
leaderboardDTO.getName(), leaderboardDTO.boatClassName, stringMessages, errorReporter,
new DialogCallback<List<CompetitorWithBoatDTO>>() {
leaderboardDTO.getName(), leaderboardDTO.boatClassName,
/* createWithBoatByDefault */ !leaderboardDTO.canBoatsOfCompetitorsChangePerRace,
stringMessages, errorReporter, new DialogCallback<List<CompetitorWithBoatDTO>>() {
@Override
public void cancel() {
}