Bug 5085: initial version of template creation dialogs

This commit is contained in:
Steffen Jacobs committed 2019-08-21 19:05:05 +02:00
1 parent f5aea750e2
commit cb0191dbe1
12 files changed
+389 -14

No files matched your search

@@ -0,0 +1,129 @@
package com.sap.sailing.gwt.ui.adminconsole.coursecreation;
import java.util.Optional;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.SuggestBox;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sailing.gwt.ui.adminconsole.coursecreation.ControlPointEditDialog.ControlPointEditDTO;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.courseCreation.MarkTemplateDTO;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class ControlPointEditDialog extends DataEntryDialog<ControlPointEditDTO> {
private final StringMessages stringMessages;
private final SuggestBox suggestMarkTemplate1;
private final SuggestBox suggestMarkTemplate2Optional;
private final SuggestBox suggestPassingInstruction;
private MarkTemplateSuggestOracle markTemplateOracle;
public ControlPointEditDialog(final SailingServiceAsync sailingServiceAsync, final StringMessages stringMessages,
ControlPointEditDTO courseTemplateToEdit, DialogCallback<ControlPointEditDTO> callback) {
super(stringMessages.edit() + " " + stringMessages.waypoints(), null, stringMessages.ok(),
stringMessages.cancel(), new Validator<ControlPointEditDTO>() {
@Override
public String getErrorMessage(ControlPointEditDTO valueToValidate) {
String result = null;
if (valueToValidate.getPassingInstruction() == null) {
result = stringMessages.pleaseSelectAValidPassingInstruction();
} else {
if (valueToValidate.getMarkTemplate1() == null) {
result = stringMessages.pleaseSelectAValidMarkTemplate();
}
if (valueToValidate.getPassingInstruction().applicability[0] == 2
&& !valueToValidate.getMarkTemplate2().isPresent()) {
result = stringMessages.pleaseSelectAValidMarkTemplate() + " (2)";
}
}
return result;
}
}, /* animationEnabled */true, callback);
this.ensureDebugId("CourseTemplateToEditEditDialog");
this.stringMessages = stringMessages;
markTemplateOracle = new MarkTemplateSuggestOracle(sailingServiceAsync, stringMessages);
suggestMarkTemplate1 = new SuggestBox(markTemplateOracle);
suggestMarkTemplate2Optional = new SuggestBox(markTemplateOracle);
suggestPassingInstruction = new SuggestBox(new PassingInstructionSuggestOracle());
suggestPassingInstruction.getValueBox().addChangeHandler(e -> validateAndUpdate());
suggestPassingInstruction.getValueBox().addKeyUpHandler(e -> validateAndUpdate());
suggestPassingInstruction.getValueBox().addBlurHandler(e -> validateAndUpdate());
suggestMarkTemplate2Optional.getValueBox().addChangeHandler(e -> validateAndUpdate());
suggestMarkTemplate2Optional.getValueBox().addKeyUpHandler(e -> validateAndUpdate());
suggestMarkTemplate2Optional.getValueBox().addBlurHandler(e -> validateAndUpdate());
suggestMarkTemplate1.getValueBox().addChangeHandler(e -> validateAndUpdate());
suggestMarkTemplate1.getValueBox().addKeyUpHandler(e -> validateAndUpdate());
suggestMarkTemplate1.getValueBox().addBlurHandler(e -> validateAndUpdate());
}
@Override
protected FocusWidget getInitialFocusWidget() {
return suggestMarkTemplate1.getValueBox();
}
@Override
protected ControlPointEditDTO getResult() {
PassingInstruction passingInstruction = null;
try {
passingInstruction = PassingInstruction.valueOfIgnoringCase(suggestPassingInstruction.getValue());
} catch (IllegalArgumentException e) {
// use null -> fail during validation
}
final MarkTemplateDTO markTemplate1 = markTemplateOracle.fromString(suggestMarkTemplate1.getValue());
final MarkTemplateDTO markTemplate2 = markTemplateOracle.fromString(suggestMarkTemplate2Optional.getValue());
return new ControlPointEditDTO(markTemplate1, markTemplate2, passingInstruction);
}
@Override
protected Widget getAdditionalWidget() {
final Grid result = new Grid(3, 2);
result.setWidget(0, 0, new Label(stringMessages.markTemplate()));
result.setWidget(0, 1, suggestMarkTemplate1);
result.setWidget(1, 0, new Label(stringMessages.markTemplate2Optional()));
result.setWidget(1, 1, suggestMarkTemplate2Optional);
result.setWidget(2, 0, new Label(stringMessages.passingInstructions()));
result.setWidget(2, 1, suggestPassingInstruction);
return result;
}
public static class ControlPointEditDTO {
private MarkTemplateDTO markTemplate1;
private Optional<MarkTemplateDTO> markTemplate2;
private PassingInstruction passingInstruction;
public ControlPointEditDTO() {
}
public ControlPointEditDTO(MarkTemplateDTO markTemplate1, MarkTemplateDTO markTemplate2,
PassingInstruction passingInstruction) {
super();
this.markTemplate1 = markTemplate1;
this.markTemplate2 = Optional.ofNullable(markTemplate2);
this.passingInstruction = passingInstruction;
}
public MarkTemplateDTO getMarkTemplate1() {
return markTemplate1;
}
public Optional<MarkTemplateDTO> getMarkTemplate2() {
return markTemplate2;
}
public PassingInstruction getPassingInstruction() {
return passingInstruction;
}
}
}
@@ -1,20 +1,44 @@
package com.sap.sailing.gwt.ui.adminconsole.coursecreation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import com.google.gwt.cell.client.TextCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FocusWidget;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.sap.sailing.gwt.ui.adminconsole.coursecreation.ControlPointEditDialog.ControlPointEditDTO;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.courseCreation.CourseTemplateDTO;
import com.sap.sailing.gwt.ui.shared.courseCreation.MarkTemplateDTO;
import com.sap.sailing.gwt.ui.shared.courseCreation.WaypointTemplateDTO;
import com.sap.sse.gwt.adminconsole.AdminConsoleTableResources;
import com.sap.sse.gwt.client.celltable.BaseCelltable;
import com.sap.sse.gwt.client.dialog.DataEntryDialog;
public class CourseTemplateEditDialog extends DataEntryDialog<CourseTemplateDTO> {
private static AdminConsoleTableResources tableResources = GWT.create(AdminConsoleTableResources.class);
private final TextBox nameTextBox;
private final StringMessages stringMessages;
private final Button addWaypointTemplate;
public CourseTemplateEditDialog(final StringMessages stringMessages, CourseTemplateDTO courseTemplateToEdit,
DialogCallback<CourseTemplateDTO> callback) {
private CellTable<WaypointTemplateDTO> waypointTemplatesTable;
private Collection<WaypointTemplateDTO> waypointTemplates = new ArrayList<>();
public CourseTemplateEditDialog(final SailingServiceAsync sailingService, final StringMessages stringMessages,
CourseTemplateDTO courseTemplateToEdit, DialogCallback<CourseTemplateDTO> callback) {
super(stringMessages.edit() + " " + stringMessages.courseTemplates(), null, stringMessages.ok(),
stringMessages.cancel(), new Validator<CourseTemplateDTO>() {
@Override
@@ -32,6 +56,56 @@ public class CourseTemplateEditDialog extends DataEntryDialog<CourseTemplateDTO>
this.nameTextBox = createTextBox(courseTemplateToEdit.getName());
addWaypointTemplate = new Button(stringMessages.add());
addWaypointTemplate.addClickHandler(c -> {
ControlPointEditDialog dialog = new ControlPointEditDialog(sailingService, stringMessages,
new ControlPointEditDTO(), new DialogCallback<ControlPointEditDTO>() {
@Override
public void ok(ControlPointEditDTO editedObject) {
// create list with one or two elements based on passing instruction
final Collection<MarkTemplateDTO> markTemplates = editedObject
.getPassingInstruction().applicability[0] == 2
? Arrays.asList(editedObject.getMarkTemplate1(),
editedObject.getMarkTemplate2().get())
: Collections.singletonList(editedObject.getMarkTemplate1());
waypointTemplates
.add(new WaypointTemplateDTO(markTemplates, editedObject.getPassingInstruction()));
refreshWaypointsTable();
}
@Override
public void cancel() {
// nothing to do
}
});
dialog.show();
});
createWaypointTemplateTable();
waypointTemplates.addAll(courseTemplateToEdit.getWaypointTemplates());
refreshWaypointsTable();
nameTextBox.addKeyUpHandler(e -> validateAndUpdate());
}
private void refreshWaypointsTable() {
waypointTemplatesTable.setRowCount(waypointTemplates.size());
waypointTemplatesTable.setRowData(0, (List<? extends WaypointTemplateDTO>) waypointTemplates);
}
private void createWaypointTemplateTable() {
waypointTemplatesTable = new BaseCelltable<>(1000, tableResources);
waypointTemplatesTable.setWidth("100%");
Column<WaypointTemplateDTO, String> waypointTemplateColumn = new Column<WaypointTemplateDTO, String>(
new TextCell()) {
@Override
public String getValue(WaypointTemplateDTO waypointTemplate) {
return waypointTemplate.getMarkTemplatesForControlPoint().stream().map(m -> m.getName())
.collect(Collectors.joining("-"));
}
};
waypointTemplatesTable.addColumn(waypointTemplateColumn, stringMessages.name());
}
@Override
@@ -39,7 +113,6 @@ public class CourseTemplateEditDialog extends DataEntryDialog<CourseTemplateDTO>
return nameTextBox;
}
@Override
protected CourseTemplateDTO getResult() {
// TODO: implement
@@ -51,6 +124,8 @@ public class CourseTemplateEditDialog extends DataEntryDialog<CourseTemplateDTO>
Grid result = new Grid(6, 2);
result.setWidget(0, 0, new Label(stringMessages.name()));
result.setWidget(0, 1, nameTextBox);
result.setWidget(1, 0, addWaypointTemplate);
result.setWidget(1, 1, waypointTemplatesTable);
return result;
}
@@ -278,7 +278,8 @@ public class CourseTemplatePanel extends FlowPanel {
}
void openEditCourseTemplateDialog(final CourseTemplateDTO originalCourseTemplate) {
final CourseTemplateEditDialog dialog = new CourseTemplateEditDialog(stringMessages, originalCourseTemplate,
final CourseTemplateEditDialog dialog = new CourseTemplateEditDialog(sailingService, stringMessages,
originalCourseTemplate,
new DialogCallback<CourseTemplateDTO>() {
@Override
public void ok(CourseTemplateDTO courseTemplate) {
@@ -0,0 +1,90 @@
package com.sap.sailing.gwt.ui.adminconsole.coursecreation;
import java.util.ArrayList;
import java.util.Collection;
import java.util.stream.Collectors;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.shared.courseCreation.MarkTemplateDTO;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.suggestion.AbstractListSuggestOracle;
import com.sap.sse.security.ui.client.i18n.StringMessages;
/**
* Suggest oracle for use in {@link CourseTemplateEditDialog} which oracles the visible mark templates.
*/
public class MarkTemplateSuggestOracle extends AbstractListSuggestOracle<MarkTemplateDTO> {
private final Collection<MarkTemplateDTO> allTemplates = new ArrayList<>();
private final SailingServiceAsync sailingServiceAsync;
private final StringMessages stringMessages;
public MarkTemplateSuggestOracle(final SailingServiceAsync sailingServiceAsync,
final StringMessages stringMessages) {
this.sailingServiceAsync = sailingServiceAsync;
this.stringMessages = stringMessages;
refresh();
}
public void refresh() {
sailingServiceAsync.getMarkTemplates(new AsyncCallback<Iterable<MarkTemplateDTO>>() {
@Override
public void onFailure(Throwable caught) {
Window.alert(stringMessages.couldNotLoadMarkTemplates());
}
@Override
public void onSuccess(Iterable<MarkTemplateDTO> result) {
allTemplates.clear();
Util.addAll(result, allTemplates);
setSelectableValues(allTemplates);
}
});
}
/**
* Clears the oracle suggestions, adds all existing templates and finally removes the existing templates from the
* oracle.
*/
public void resetAndRemoveExistingTemplates(Iterable<String> existingTemplates) {
Collection<MarkTemplateDTO> templates = new ArrayList<>(allTemplates);
templates = templates.stream().filter(u -> !Util.contains(existingTemplates, u.getName()))
.collect(Collectors.toList());
super.setSelectableValues(templates);
}
/**
* @returns a {@link MarkTemplateDTO}-object from the current selectable values of this oracle, which is associated
* with the given template name.
*/
public MarkTemplateDTO fromString(final String templateName) {
if (this.getSelectableValues() == null) {
throw new NullPointerException("Mark Templates are not loaded yet or could not be loaded.");
}
for (MarkTemplateDTO template : this.getSelectableValues()) {
if (template.getName().equals(templateName)) {
return template;
}
}
return null;
}
@Override
protected String createSuggestionKeyString(MarkTemplateDTO value) {
return value.getName();
}
@Override
protected String createSuggestionAdditionalDisplayString(MarkTemplateDTO value) {
return null;
}
@Override
protected Iterable<String> getMatchingStrings(MarkTemplateDTO value) {
return this.getSelectableValues().stream().map(r -> createSuggestionKeyString(r)).collect(Collectors.toList());
}
}
@@ -0,0 +1,61 @@
package com.sap.sailing.gwt.ui.adminconsole.coursecreation;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.stream.Collectors;
import com.sap.sailing.domain.common.PassingInstruction;
import com.sap.sse.common.Util;
import com.sap.sse.gwt.client.suggestion.AbstractListSuggestOracle;
/**
* Suggest oracle for use in {@link ControlPointEditDialog} which oracles the available passing instructions.
*/
public class PassingInstructionSuggestOracle extends AbstractListSuggestOracle<PassingInstruction> {
private final Collection<PassingInstruction> allPassingInstructions;
public PassingInstructionSuggestOracle() {
allPassingInstructions = Arrays.asList(PassingInstruction.relevantValues());
}
/**
* Clears the oracle suggestions, adds all existing passing instructions and finally removes the existing passing
* instructions from the oracle.
*/
public void resetAndRemoveExistingPassingInstructions(Iterable<String> passingInstructions) {
Collection<PassingInstruction> users = new ArrayList<>(allPassingInstructions);
users = users.stream().filter(u -> !Util.contains(passingInstructions, u.name())).collect(Collectors.toList());
super.setSelectableValues(users);
}
/**
* @returns a {@link PassingInstruction}-object from the current selectable values of this oracle, which is
* associated with the given name.
*/
public PassingInstruction fromString(final String passingInstructionName) {
for (PassingInstruction instruction : this.getSelectableValues()) {
if (instruction.name().equals(passingInstructionName)) {
return instruction;
}
}
return null;
}
@Override
protected String createSuggestionKeyString(PassingInstruction value) {
return value.name();
}
@Override
protected String createSuggestionAdditionalDisplayString(PassingInstruction value) {
return null;
}
@Override
protected Iterable<String> getMatchingStrings(PassingInstruction value) {
return this.getSelectableValues().stream().map(r -> createSuggestionKeyString(r)).collect(Collectors.toList());
}
}
@@ -2270,8 +2270,12 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages,
String markTemplates();
String filterMarkPropertiesByName();
String markProperties();
String filterCourseTemplateByName();
String courseTemplates();
String markTemplate();
String markTemplate2Optional();
String pleaseSelectAValidPassingInstruction();
String pleaseSelectAValidMarkTemplate();
}
@@ -2275,4 +2275,8 @@ markTemplates=Mark Templates
filterMarkPropertiesByName=Filter mark properties
markProperties=Mark Properties
filterCourseTemplateByName=Filter course templates
courseTemplates=Course Templates
courseTemplates=Course Templates
markTemplate=Mark Template 1
markTemplate2Optional=Mark Template 2 (optional)
pleaseSelectAValidMarkTemplate=Please select a valid mark template
pleaseSelectAValidPassingInstruction=Please select a valid passing instruction
@@ -2262,9 +2262,13 @@ startMode=Startmodus
gateOpeningTime=Torstart Öffnungsdauer
protestTimeInMinutes=Protestzeit in Minuten
courseCreation=Kurserstellung
filterMarkTemplateByName=Markvorlagen filter
markTemplates=Markvorlagen
filterMarkPropertiesByName=Markeigenschaften filter
markProperties=Markeigenschaften
filterMarkTemplateByName=Bahnmarkenvorlagen filter
markTemplates=Bahnmarkenvorlagen
filterMarkPropertiesByName=Bahnmarkeneigenschaften filter
markProperties=Bahnmarkeneigenschaften
filterCourseTemplateByName=Kursvorlagen filtern
courseTemplates=Kursvorlagen
courseTemplates=Kursvorlagen
markTemplate=Bahnmarkenvorlage 1
markTemplate2Optional=Bahnmarkenvorlage 2 (optional)
pleaseSelectAValidMarkTemplate=Bitte eine gültige Bahnmarkenvorlage auswählen
pleaseSelectAValidPassingInstruction=Bitte eine gültige Passieranweisung auswählen
@@ -11,6 +11,10 @@ public class WaypointTemplateDTO {
private PassingInstruction passingInstruction;
public WaypointTemplateDTO() {
}
public WaypointTemplateDTO(Iterable<MarkTemplateDTO> markTemplatesForControlPoint,
PassingInstruction passingInstruction) {
super();
@@ -185,4 +185,5 @@ public interface StringMessages extends com.sap.sse.gwt.client.StringMessages {
String editRolesAndPermissionsForUser(String username);
String permissionType();
String couldNotLoadMarkTemplates();
}
@@ -189,4 +189,5 @@ filterPermission = Filter permission
permission=Permission
nullUserGroup=<Anonymous UserGroup>
editRolesAndPermissionsForUser=Edit roles and permissions for user {0}
permissionType: Permission Type
permissionType: Permission Type
couldNotLoadMarkTemplates=Could not load mark templates.
@@ -189,4 +189,5 @@ filterPermission = Berechtigungen filtern
permission=Berechtigung
nullUserGroup=<Anonyme Usergruppe>
editRolesAndPermissionsForUser=Rollen und Berechtigungen für Benutzer {0} editieren
permissionType=Berechtigungstyp
permissionType=Berechtigungstyp
couldNotLoadMarkTemplates=Markvorlagen konnten nicht geladen werden.