diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java index 6cf8c90d4ad..a0e4260963c 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardConfigPanel.java @@ -783,9 +783,6 @@ public class LeaderboardConfigPanel extends FormPanel implements EventDisplayer, } private void addNewLeaderboard() { - List leaderboardNames = new ArrayList(); - for (LeaderboardDTO dao : leaderboardList.getList()) - leaderboardNames.add(dao.name); LeaderboardCreateDialog dialog = new LeaderboardCreateDialog(Collections.unmodifiableCollection(leaderboardList .getList()), stringMessages, errorReporter, new AsyncCallback() { @Override diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java index ee60b6bf10e..42b94e034fa 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupConfigPanel.java @@ -1,9 +1,12 @@ package com.sap.sailing.gwt.ui.adminconsole; +import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.List; import com.google.gwt.cell.client.FieldUpdater; +import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyUpEvent; @@ -11,9 +14,12 @@ import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlUtils; import com.google.gwt.user.cellview.client.CellTable; +import com.google.gwt.user.cellview.client.CellTable.Resources; import com.google.gwt.user.cellview.client.Column; 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.Button; import com.google.gwt.user.client.ui.CaptionPanel; import com.google.gwt.user.client.ui.HorizontalPanel; @@ -40,6 +46,7 @@ import com.sap.sailing.gwt.ui.shared.RaceInLeaderboardDTO; public class LeaderboardGroupConfigPanel extends AbstractEventPanel { private VerticalPanel mainPanel; + private HorizontalPanel splitPanel; private TextBox filterGroupsTextBox; private CellTable leaderboardGroupsTable; @@ -55,29 +62,81 @@ public class LeaderboardGroupConfigPanel extends AbstractEventPanel { private MultiSelectionModel leaderboardsSelectionModel; private ListDataProvider leaderboardsProvider; - private HorizontalPanel splitPanel; + private ArrayList availableLeaderboardGroups; + private ArrayList availableLeaderboards; public LeaderboardGroupConfigPanel(SailingServiceAsync sailingService, EventRefresher eventRefresher, ErrorReporter errorReporter, StringMessages stringMessages) { super(sailingService, eventRefresher, errorReporter, stringMessages); + AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class); + availableLeaderboardGroups = new ArrayList(); + availableLeaderboards = new ArrayList(); + //Build GUI mainPanel = new VerticalPanel(); + mainPanel.setSpacing(5); mainPanel.setWidth("95%"); add(mainPanel); - mainPanel.add(createLeaderboardGroupsGUI()); + mainPanel.add(createLeaderboardGroupsGUI(tableRes)); splitPanel = new HorizontalPanel(); + splitPanel.setSpacing(5); + splitPanel.setWidth("100%"); splitPanel.setVisible(false); mainPanel.add(splitPanel); - - splitPanel.add(createLeaderboardGroupDetailsGUI()); + + splitPanel.setVerticalAlignment(HorizontalPanel.ALIGN_TOP); + splitPanel.add(createLeaderboardGroupDetailsGUI(tableRes)); + splitPanel.setVerticalAlignment(HorizontalPanel.ALIGN_MIDDLE); splitPanel.add(createSwitchLeaderboardsGUI()); - splitPanel.add(createLeaderboardsGUI()); + splitPanel.setVerticalAlignment(HorizontalPanel.ALIGN_TOP); + splitPanel.add(createLeaderboardsGUI(tableRes)); + + //Load Data + loadGroups(); + loadLeaderboards(); + } + + private void loadGroups() { + sailingService.getLeaderboardGroups(new AsyncCallback>() { + @Override + public void onSuccess(List groups) { + availableLeaderboardGroups.clear(); + if (groups != null) { + availableLeaderboardGroups.addAll(groups); + } + leaderboardGroupsProvider.getList().clear(); + leaderboardGroupsProvider.getList().addAll(availableLeaderboardGroups); + } + @Override + public void onFailure(Throwable t) { + errorReporter.reportError("Error trying to obtain list of leaderboard groups: " + t.getMessage()); + } + }); + } + + private void loadLeaderboards() { + sailingService.getLeaderboards(new AsyncCallback>() { + @Override + public void onFailure(Throwable t) { + errorReporter.reportError("Error trying to obtain list of leaderboards: " + t.getMessage()); + } + @Override + public void onSuccess(List leaderboards) { + availableLeaderboards.clear(); + if (leaderboards != null) { + availableLeaderboards.addAll(leaderboards); + } + leaderboardGroupsProvider.getList().clear(); + leaderboardGroupsProvider.getList().addAll(availableLeaderboardGroups); + } + }); } private Widget createSwitchLeaderboardsGUI() { VerticalPanel switchLeaderboardsPanel = new VerticalPanel(); + switchLeaderboardsPanel.setSpacing(5); switchLeaderboardsPanel.setWidth("5%"); Button moveToLeaderboards = new Button("->"); @@ -103,15 +162,16 @@ public class LeaderboardGroupConfigPanel extends AbstractEventPanel { return switchLeaderboardsPanel; } - private Widget createLeaderboardsGUI() { + private Widget createLeaderboardsGUI(Resources tableRes) { CaptionPanel leaderboardsCaptionPanel = new CaptionPanel(stringConstants.leaderboards()); - leaderboardsCaptionPanel.setWidth("47%"); + leaderboardsCaptionPanel.setWidth("95%"); VerticalPanel leaderboardsPanel = new VerticalPanel(); leaderboardsCaptionPanel.add(leaderboardsPanel); //Create leaderboards functional elements HorizontalPanel leaderboardsFunctionPanel = new HorizontalPanel(); + leaderboardsFunctionPanel.setSpacing(5); leaderboardsPanel.add(leaderboardsFunctionPanel); Label filterLeaderboardsLabel = new Label(stringConstants.filterLeaderboardsByName() + ":"); @@ -136,6 +196,7 @@ public class LeaderboardGroupConfigPanel extends AbstractEventPanel { return leaderboard.name; } }; + leaderboardsNameColumn.setSortable(true); leaderboardsListHandler.setComparator(leaderboardsNameColumn, new Comparator() { @Override public int compare(LeaderboardDTO l1, LeaderboardDTO l2) { @@ -161,8 +222,9 @@ public class LeaderboardGroupConfigPanel extends AbstractEventPanel { return result; } }; - - leaderboardsTable = new CellTable(); + + leaderboardsTable = new CellTable(200, tableRes); + leaderboardsTable.setWidth("100%"); leaderboardsTable.addColumnSortHandler(leaderboardsListHandler); leaderboardsTable.addColumn(leaderboardsNameColumn, stringConstants.name()); leaderboardsTable.addColumn(leaderboardsRacesColumn, stringConstants.races()); @@ -182,9 +244,9 @@ public class LeaderboardGroupConfigPanel extends AbstractEventPanel { return leaderboardsCaptionPanel; } - private Widget createLeaderboardGroupDetailsGUI() { + private Widget createLeaderboardGroupDetailsGUI(Resources tableRes) { CaptionPanel groupDetailsCaptionPanel = new CaptionPanel(); - groupDetailsCaptionPanel.setWidth("48%"); + groupDetailsCaptionPanel.setWidth("95%"); VerticalPanel groupDetailsPanel = new VerticalPanel(); groupDetailsCaptionPanel.add(groupDetailsPanel); @@ -215,8 +277,9 @@ public class LeaderboardGroupConfigPanel extends AbstractEventPanel { return result; } }; - - groupDetailsTable = new CellTable(); + + groupDetailsTable = new CellTable(200, tableRes); + groupDetailsTable.setWidth("100%"); groupDetailsTable.addColumn(groupDetailsNameColumn, stringConstants.name()); groupDetailsTable.addColumn(groupDetailsRacesColumn, stringConstants.races()); @@ -235,6 +298,7 @@ public class LeaderboardGroupConfigPanel extends AbstractEventPanel { //Create details functionality HorizontalPanel groupDetailsFunctionPanel = new HorizontalPanel(); + groupDetailsFunctionPanel.setSpacing(5); groupDetailsPanel.add(groupDetailsFunctionPanel); Button leaderboardUp = new Button(stringConstants.columnMoveUp()); @@ -260,7 +324,7 @@ public class LeaderboardGroupConfigPanel extends AbstractEventPanel { return groupDetailsCaptionPanel; } - private Widget createLeaderboardGroupsGUI() { + private Widget createLeaderboardGroupsGUI(Resources tableRes) { CaptionPanel leaderboardGroupsCaptionPanel = new CaptionPanel(stringConstants.leaderboardGroups()); VerticalPanel leaderboardsGroupPanel = new VerticalPanel(); @@ -268,6 +332,7 @@ public class LeaderboardGroupConfigPanel extends AbstractEventPanel { //Create functional elements for the leaderboard groups HorizontalPanel leaderboardGroupsFunctionPanel = new HorizontalPanel(); + leaderboardGroupsFunctionPanel.setSpacing(5); leaderboardsGroupPanel.add(leaderboardGroupsFunctionPanel); Label filterLeaderboardGroupsLbl = new Label(stringConstants.filterLeaderboardGroupsByName() + ":"); @@ -285,8 +350,8 @@ public class LeaderboardGroupConfigPanel extends AbstractEventPanel { Button createGroupButton = new Button(stringConstants.createNewLeaderboardGroup()); createGroupButton.addClickHandler(new ClickHandler() { @Override - public void onClick(ClickEvent arg0) { - // TODO Auto-generated method stub + public void onClick(ClickEvent event) { + addNewGroup(); } }); leaderboardGroupsFunctionPanel.add(createGroupButton); @@ -314,24 +379,40 @@ public class LeaderboardGroupConfigPanel extends AbstractEventPanel { TextColumn groupDescriptionColumn = new TextColumn() { @Override public String getValue(LeaderboardGroupDTO group) { + //TODO Display line breaks in description return group.description; } }; - ImagesBarColumn groupActionsColumn = new ImagesBarColumn( - new LeaderboardConfigImagesBarCell(stringConstants)); + ImagesBarColumn groupActionsColumn = new ImagesBarColumn( + new LeaderboardGroupConfigImagesBarCell(stringConstants)); groupActionsColumn.setFieldUpdater(new FieldUpdater() { @Override public void update(int index, LeaderboardGroupDTO group, String command) { - if (command.equals(stringConstants.actionEdit())) { - //TODO - } else if (command.equals(stringConstants.actionRemove())) { + if (command.equals("ACTION_EDIT")) { + final String oldGroupName = group.name; + ArrayList otherExistingGroups = new ArrayList(availableLeaderboardGroups); + otherExistingGroups.remove(group); + LeaderboardGroupEditDialog dialog = new LeaderboardGroupEditDialog(group, otherExistingGroups, stringConstants, new AsyncCallback() { + @Override + public void onFailure(Throwable t) {} + @Override + public void onSuccess(LeaderboardGroupDTO group) { + updateGroup(oldGroupName, group); + } + }); + dialog.show(); + } else if (command.equals("ACTION_REMOVE")) { //TODO + if (Window.confirm("Do you really want to remove the leaderboard: '" + group.name + "' ?")) { + removeLeaderboardGroup(group); + } } } }); - leaderboardGroupsTable = new CellTable(); + leaderboardGroupsTable = new CellTable(200, tableRes); + leaderboardGroupsTable.setWidth("100%"); leaderboardGroupsTable.addColumn(groupNameColumn, stringConstants.name()); leaderboardGroupsTable.addColumn(groupDescriptionColumn, stringConstants.description()); leaderboardGroupsTable.addColumn(groupActionsColumn, stringConstants.actions()); @@ -341,7 +422,7 @@ public class LeaderboardGroupConfigPanel extends AbstractEventPanel { leaderboardGroupsSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() { @Override public void onSelectionChange(SelectionChangeEvent event) { - // TODO Auto-generated method stub + groupSelectionChanged(); } }); leaderboardGroupsTable.setSelectionModel(leaderboardGroupsSelectionModel); @@ -352,6 +433,87 @@ public class LeaderboardGroupConfigPanel extends AbstractEventPanel { return leaderboardGroupsCaptionPanel; } + private void addNewGroup() { + LeaderboardGroupCreateDialog dialog = new LeaderboardGroupCreateDialog( + Collections.unmodifiableCollection(availableLeaderboardGroups), stringConstants, + new AsyncCallback() { + @Override + public void onFailure(Throwable t) {} + @Override + public void onSuccess(LeaderboardGroupDTO newGroup) { + createNewGroup(newGroup); + } + }); + dialog.show(); + } + + private void createNewGroup(final LeaderboardGroupDTO newGroup) { + sailingService.createLeaderboardGroup(newGroup.name, newGroup.description, new AsyncCallback() { + @Override + public void onFailure(Throwable t) { + errorReporter.reportError("Error trying to create new leaderboard group" + newGroup.name + + ": " + t.getMessage()); + } + @Override + public void onSuccess(LeaderboardGroupDTO newGroup) { + availableLeaderboardGroups.add(newGroup); + leaderboardGroupsProvider.getList().add(newGroup); + leaderboardGroupsSelectionModel.setSelected(newGroup, true); + groupSelectionChanged(); + } + }); + } + + private void updateGroup(final String oldGroupName, final LeaderboardGroupDTO groupToUpdate) { + sailingService.updateLeaderboardGroup(oldGroupName, groupToUpdate.name, groupToUpdate.description, new AsyncCallback() { + @Override + public void onFailure(Throwable t) { + errorReporter.reportError("Error trying to update leaderboard group " + oldGroupName + ": " + + t.getMessage()); + } + @Override + public void onSuccess(Void v) { + //Update the availableLeaderboardGroups and the list of displayed groups + for (int i = 0; i < availableLeaderboardGroups.size(); i++) { + LeaderboardGroupDTO group = availableLeaderboardGroups.get(i); + if (oldGroupName.equals(group.name)) { + availableLeaderboardGroups.set(i, groupToUpdate); + int displayedIndex = leaderboardGroupsProvider.getList().indexOf(group); + if (displayedIndex != -1) { + leaderboardGroupsProvider.getList().set(displayedIndex, groupToUpdate); + } + } + } + leaderboardGroupsProvider.refresh(); + } + }); + } + + private void removeLeaderboardGroup(final LeaderboardGroupDTO group) { + sailingService.removeLeaderboardGroup(group.name, new AsyncCallback() { + @Override + public void onFailure(Throwable t) { + errorReporter.reportError("Error trying to remove leaderboard group " + group.name + ": " + + t.getMessage()); + } + @Override + public void onSuccess(Void v) { + availableLeaderboardGroups.remove(group); + leaderboardGroupsProvider.getList().remove(group); + + //Check if the removed group was the selected one + LeaderboardGroupDTO selectedGroup = leaderboardGroupsSelectionModel.getSelectedObject(); + if (selectedGroup != null && selectedGroup.name.equals(group.name)) { + leaderboardGroupsSelectionModel.setSelected(null, true); + } + } + }); + } + + private void groupSelectionChanged() { + //TODO what happens when the group selection changes + } + @Override public void fillEvents(List result) { } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupCreateDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupCreateDialog.java new file mode 100644 index 00000000000..5e087f3acc9 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupCreateDialog.java @@ -0,0 +1,20 @@ +package com.sap.sailing.gwt.ui.adminconsole; + +import java.util.Collection; + +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; + +public class LeaderboardGroupCreateDialog extends LeaderboardGroupDialog { + + public LeaderboardGroupCreateDialog(Collection existingGroups, + StringMessages stringConstants, AsyncCallback callback) { + super(new LeaderboardGroupDTO(), new LeaderboardGroupParameterValidator(stringConstants, existingGroups), + stringConstants, callback); + + nameEntryField = createTextBox(null); + descriptionEntryField = createTextArea(null); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupDialog.java new file mode 100644 index 00000000000..42c129b5450 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupDialog.java @@ -0,0 +1,99 @@ +package com.sap.sailing.gwt.ui.adminconsole; + +import java.util.ArrayList; +import java.util.Collection; + +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.google.gwt.user.client.ui.Label; +import com.google.gwt.user.client.ui.TextArea; +import com.google.gwt.user.client.ui.TextBox; +import com.google.gwt.user.client.ui.VerticalPanel; +import com.google.gwt.user.client.ui.Widget; +import com.sap.sailing.gwt.ui.client.DataEntryDialog; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; + +public class LeaderboardGroupDialog extends DataEntryDialog { + + protected StringMessages stringConstants; + protected LeaderboardGroupDTO group; + + protected TextBox nameEntryField; + protected TextArea descriptionEntryField; + + protected static class LeaderboardGroupParameterValidator implements Validator { + + private StringMessages stringConstants; + private ArrayList existingGroups; + + public LeaderboardGroupParameterValidator(StringMessages stringConstants, + Collection existingGroups) { + this.stringConstants = stringConstants; + this.existingGroups = new ArrayList(existingGroups); + } + + @Override + public String getErrorMessage(LeaderboardGroupDTO groupToValidate) { + String errorMessage = null; + boolean nameNotEmpty = groupToValidate.name != null && groupToValidate.name.length() > 0; + boolean descrNotEmpty = groupToValidate.description != null && groupToValidate.description.length() > 0; + + boolean unique = true; + for (LeaderboardGroupDTO group : existingGroups) { + if (group.name.equals(groupToValidate.name)) { + unique = false; + break; + } + } + + if (!nameNotEmpty) { + errorMessage = stringConstants.pleaseEnterNonEmptyName(); + } else if (!descrNotEmpty) { + errorMessage = stringConstants.pleaseEnterNonEmptyDescription(); + } else if (!unique) { + errorMessage = stringConstants.groupWithThisNameAlreadyExists(); + } + + return errorMessage; + } + + } + + public LeaderboardGroupDialog(LeaderboardGroupDTO group, LeaderboardGroupParameterValidator validator, + StringMessages stringConstants, AsyncCallback callback) { + super(stringConstants.leaderboardGroup(), "", stringConstants.ok(), stringConstants.cancel(), validator, callback); + this.stringConstants = stringConstants; + this.group = group; + } + + @Override + protected LeaderboardGroupDTO getResult() { + group.name = nameEntryField.getText(); + group.description = descriptionEntryField.getText(); + return group; + } + + @Override + protected Widget getAdditionalWidget() { + VerticalPanel panel = new VerticalPanel(); + Widget additionalWidget = super.getAdditionalWidget(); + if (additionalWidget != null) { + panel.add(additionalWidget); + } + panel.add(new Label(stringConstants.name())); + panel.add(nameEntryField); + panel.add(new Label(stringConstants.description())); + descriptionEntryField.setCharacterWidth(30); + descriptionEntryField.setVisibleLines(6); + descriptionEntryField.getElement().getStyle().setProperty("resize", "none"); + panel.add(descriptionEntryField); + return panel; + } + + @Override + public void show() { + super.show(); + nameEntryField.setFocus(true); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupEditDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupEditDialog.java new file mode 100644 index 00000000000..35ec533fc43 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/LeaderboardGroupEditDialog.java @@ -0,0 +1,19 @@ +package com.sap.sailing.gwt.ui.adminconsole; + +import java.util.Collection; + +import com.google.gwt.user.client.rpc.AsyncCallback; +import com.sap.sailing.gwt.ui.client.StringMessages; +import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO; + +public class LeaderboardGroupEditDialog extends LeaderboardGroupDialog { + + public LeaderboardGroupEditDialog(LeaderboardGroupDTO group, Collection otherExistingGroups, + StringMessages stringConstants, AsyncCallback callback) { + super(group, new LeaderboardGroupParameterValidator(stringConstants, otherExistingGroups), stringConstants, callback); + + nameEntryField = createTextBox(group.name); + descriptionEntryField = createTextArea(group.description); + } + +} diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DataEntryDialog.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DataEntryDialog.java index 17e4c1886bd..bbff8c994b4 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DataEntryDialog.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/DataEntryDialog.java @@ -14,6 +14,7 @@ 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.LongBox; +import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; @@ -129,6 +130,26 @@ public abstract class DataEntryDialog { return textBox; } + /** + * Creates a text area with a key-up listener attached which ensures the value is updated after each + * key-up event and the entire dialog is {@link #validate() validated} in this case. + * + * @param initialValue Initial value to show in text area; null is permissible + */ + public TextArea createTextArea(String initialValue) { + TextArea textArea = new TextArea(); + textArea.setText(initialValue == null ? "" : initialValue); + AbstractEntryPoint.addFocusUponKeyUpToggler(textArea); + textArea.addChangeHandler(new ChangeHandler() { + @Override + public void onChange(ChangeEvent arg0) { + validate(); + } + }); + AbstractEntryPoint.linkEscapeToButton(getCancelButton(), textArea); + return textArea; + } + /** * Creates a text box with a key-up listener attached which ensures the value is updated after each * key-up event and the entire dialog is {@link #validate() validated} in this case. 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 05222590dc4..3ae2246f4e7 100644 --- 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 @@ -227,4 +227,7 @@ public interface StringMessages extends Messages { String leaderboardGroupConfiguration(); String legs(); String currentLeg(); + String leaderboardGroup(); + String pleaseEnterNonEmptyDescription(); + String groupWithThisNameAlreadyExists(); } \ No newline at end of file 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 63e49c75131..c9f81843a35 100644 --- 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 @@ -154,7 +154,7 @@ metersUnit=[m] failedToLoadRaceData=Failed to laod race data. close=Close compareCompetitors=Compare competitors -description=description +description=Description sailNumber=Sail number country=Country no3LetterCodes=Unable to find the IOC 3-letter-codes. @@ -221,4 +221,7 @@ filterLeaderboardGroupsByName=Filter leaderboard groups by name createNewLeaderboardGroup=Create leaderboard group leaderboardGroupConfiguration=Leaderboard Group Configuration legs=Legs -currentLeg=Current Leg \ No newline at end of file +currentLeg=Current Leg +leaderboardGroup=Leaderboard Group +pleaseEnterNonEmptyDescription=Please enter a non-empty description +groupWithThisNameAlreadyExists=Leaderboard group with this name already exists \ No newline at end of file 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 6ff1e699704..d2d7f9d34b3 100644 --- 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 @@ -222,4 +222,7 @@ filterLeaderboardGroupsByName=Bestenlisten Gruppen nach Name filtern createNewLeaderboardGroup=Neue Bestenlisten Gruppe erstellen leaderboardGroupConfiguration=Bestenlistengruppen-Konfiguration legs=Schenkel -currentLeg=Aktueller Schenkel \ No newline at end of file +currentLeg=Aktueller Schenkel +leaderboardGroup=Bestenlisten Gruppe +pleaseEnterNonEmptyDescription=Bitte eine nicht-leere Beschreibung eingeben +groupWithThisNameAlreadyExists=Bestenlisten-Gruppe mit diesem Namen existiert bereits \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index a3d051784ac..ead652256e4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -1590,7 +1590,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS @Override public LeaderboardGroupDTO getLeaderboardGroupByName(String groupName) { - return convertToLeaderboardGroupDTO(getService().getLeaderboardGroubByName(groupName)); + return convertToLeaderboardGroupDTO(getService().getLeaderboardGroupByName(groupName)); } private LeaderboardGroupDTO convertToLeaderboardGroupDTO(LeaderboardGroup leaderboardGroup) { @@ -1623,7 +1623,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS @Override public void addLeaderboardToGroup(String leaderboardName, String groupName) { - LeaderboardGroup leaderboardGroup = getService().getLeaderboardGroubByName(groupName); + LeaderboardGroup leaderboardGroup = getService().getLeaderboardGroupByName(groupName); Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); if (leaderboardGroup != null) { if (leaderboard != null) { @@ -1639,7 +1639,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS @Override public void removeLeaderboardFromGroup(String leaderboardName, String groupName) { - LeaderboardGroup leaderboardGroup = getService().getLeaderboardGroubByName(groupName); + LeaderboardGroup leaderboardGroup = getService().getLeaderboardGroupByName(groupName); Leaderboard leaderboard = getService().getLeaderboardByName(leaderboardName); if (leaderboardGroup != null) { if (leaderboard != null) { @@ -1658,7 +1658,7 @@ public class SailingServiceImpl extends RemoteServiceServlet implements SailingS if (!oldName.equals(newName)) { getService().renameLeaderboardGroup(oldName, newName); } - LeaderboardGroup leaderboardGroup = getService().getLeaderboardGroubByName(newName); + LeaderboardGroup leaderboardGroup = getService().getLeaderboardGroupByName(newName); if (!description.equals(leaderboardGroup.getDescription())) { leaderboardGroup.setDescriptiom(description); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/LeaderboardGroupDTO.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/LeaderboardGroupDTO.java index 117c3c105eb..88c6247e1e6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/LeaderboardGroupDTO.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/shared/LeaderboardGroupDTO.java @@ -1,5 +1,6 @@ package com.sap.sailing.gwt.ui.shared; +import java.util.ArrayList; import java.util.List; import com.google.gwt.user.client.rpc.IsSerializable; @@ -9,8 +10,19 @@ public class LeaderboardGroupDTO extends NamedDTO implements IsSerializable { public String description; public List leaderboards; - public LeaderboardGroupDTO() {} + /** + * Creates a new LeaderboardGroupDTO with empty but non-null name, description and an empty but non-null list for the leaderboards. + */ + public LeaderboardGroupDTO() { + this.name = ""; + this.description = ""; + this.leaderboards = new ArrayList(); + } + /** + * Creates a new LeaderboardGroupDTO with the given parameters as attributes.
+ * All parameters can be null but then the attributes will also be null. + */ public LeaderboardGroupDTO(String name, String description, List leaderboards) { super(name); this.description = description; diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java index 6a07740c65b..8ceaa3b486f 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/RacingEventService.java @@ -228,7 +228,7 @@ public interface RacingEventService extends TrackedEventRegistry { Map getLeaderboardGroups(); - LeaderboardGroup getLeaderboardGroubByName(String groupName); + LeaderboardGroup getLeaderboardGroupByName(String groupName); LeaderboardGroup addLeaderboardGroup(String groupName, String description, List leaderboardNames); diff --git a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java index 7c69d11b9a9..72d5f5c9f41 100755 --- a/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java +++ b/java/com.sap.sailing.server/src/com/sap/sailing/server/impl/RacingEventServiceImpl.java @@ -672,7 +672,7 @@ public class RacingEventServiceImpl implements RacingEventService, EventFetcher, } @Override - public LeaderboardGroup getLeaderboardGroubByName(String groupName) { + public LeaderboardGroup getLeaderboardGroupByName(String groupName) { synchronized (leaderboardGroupsByName) { return leaderboardGroupsByName.get(groupName); } @@ -713,7 +713,7 @@ public class RacingEventServiceImpl implements RacingEventService, EventFetcher, if (!leaderboardGroupsByName.containsKey(oldName)) { throw new IllegalArgumentException("No leaderboard group with name " + oldName + " found"); } - if (!leaderboardGroupsByName.containsKey(newName)) { + if (leaderboardGroupsByName.containsKey(newName)) { throw new IllegalArgumentException("Leaderboard group with name " + newName + " already exists"); } LeaderboardGroup toRename = leaderboardGroupsByName.remove(oldName);