Merge branch 'bug3638'

This commit is contained in:
Papick Garcia Taboada committed 2016-09-06 15:27:04 +02:00
commit 242a93a3ca
11 files changed
+314 -22

No files matched your search

@@ -3,6 +3,7 @@ package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.gwt.core.client.GWT;
@@ -91,7 +92,7 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
leaderboardsDisplayers = new HashSet<>();
leaderboardGroupsDisplayers = new HashSet<>();
final EventManagementPanel eventManagementPanel = new EventManagementPanel(sailingService, this, this, getStringMessages());
final EventManagementPanel eventManagementPanel = new EventManagementPanel(sailingService, this, this, getStringMessages(), panel);
eventManagementPanel.ensureDebugId("EventManagement");
panel.addToVerticalTabPanel(new DefaultRefreshableAdminConsolePanel<EventManagementPanel>(eventManagementPanel) {
@Override
@@ -137,6 +138,12 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
fillLeaderboards();
fillLeaderboardGroups();
}
@Override
public void setupWidgetByParams(Map<String, String> params) {
refreshAfterBecomingVisible(); //Refresh to sure that actual data is provided
setupLeaderboardGroups(leaderboardGroupConfigPanel, params);
}
}, getStringMessages().leaderboardGroups(), Permission.MANAGE_LEADERBOARD_GROUPS);
regattasDisplayers.add(leaderboardGroupConfigPanel);
leaderboardGroupsDisplayers.add(leaderboardGroupConfigPanel);
@@ -349,4 +356,9 @@ public class AdminConsoleEntryPoint extends AbstractSailingEntryPoint implements
}
}));
}
@Override
public void setupLeaderboardGroups(LeaderboardGroupsDisplayer displayer, Map<String, String> params) {
displayer.setupLeaderboardGroups(params);
}
}
@@ -7,11 +7,13 @@ import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.FieldUpdater;
import com.google.gwt.cell.client.SafeHtmlCell;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
@@ -40,6 +42,7 @@ import com.sap.sailing.gwt.ui.client.RegattaRefresher;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.client.shared.controls.FlushableCellTable;
import com.sap.sailing.gwt.ui.client.shared.controls.MultipleLinkCell;
import com.sap.sailing.gwt.ui.client.shared.controls.SelectionCheckboxColumn;
import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil;
import com.sap.sailing.gwt.ui.shared.CourseAreaDTO;
@@ -50,6 +53,7 @@ import com.sap.sailing.gwt.ui.shared.RegattaDTO;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.util.NaturalComparator;
import com.sap.sse.gwt.adminconsole.HandleTabSelectable;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.MarkedAsyncCallback;
import com.sap.sse.gwt.client.celltable.EntityIdentityComparator;
@@ -98,15 +102,17 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
private final AdminConsoleTableResources tableRes = GWT.create(AdminConsoleTableResources.class);
private final RegattaRefresher regattaRefresher;
private final EventsRefresher eventsRefresher;
private final HandleTabSelectable handleTabSelectable;
@SuppressWarnings("unchecked")
public EventListComposite(final SailingServiceAsync sailingService, final ErrorReporter errorReporter,
RegattaRefresher regattaRefresher, EventsRefresher eventsRefresher, final StringMessages stringMessages) {
RegattaRefresher regattaRefresher, EventsRefresher eventsRefresher, final HandleTabSelectable handleTabSelectable, final StringMessages stringMessages) {
this.sailingService = sailingService;
this.stringMessages = stringMessages;
this.errorReporter = errorReporter;
this.regattaRefresher = regattaRefresher;
this.eventsRefresher = eventsRefresher;
this.handleTabSelectable = handleTabSelectable;
availableLeaderboardGroups = Collections.emptyList();
allEvents = new ArrayList<EventDTO>();
@@ -268,25 +274,30 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
return builder.toSafeHtml();
}
};
SafeHtmlCell leaderboardGroupsCell = new SafeHtmlCell();
Column<EventDTO, SafeHtml> leaderboardGroupsColumn = new Column<EventDTO, SafeHtml>(leaderboardGroupsCell) {
MultipleLinkCell leaderboardGroupsCell = new MultipleLinkCell(true);
Column<EventDTO, List<MultipleLinkCell.CellLink>> leaderboardGroupsColumn = new Column<EventDTO, List<MultipleLinkCell.CellLink>>(
leaderboardGroupsCell) {
@Override
public SafeHtml getValue(EventDTO event) {
SafeHtmlBuilder builder = new SafeHtmlBuilder();
boolean first = true;
public List<MultipleLinkCell.CellLink> getValue(EventDTO event) {
List<MultipleLinkCell.CellLink> links = new ArrayList<>();
for (LeaderboardGroupDTO lg : event.getLeaderboardGroups()) {
if (first) {
first = false;
} else {
builder.appendHtmlConstant("<br>");
}
builder.appendEscaped(lg.getName());
links.add(new MultipleLinkCell.CellLink(lg.getName()));
}
return builder.toSafeHtml();
return links;
}
};
leaderboardGroupsCell.setOnLinkClickHandler(new ValueUpdater<String>() {
@Override
public void update(String value) {
Map<String, String> params = new HashMap<>();
params.put("LeaderBoardGroupName", value);
handleTabSelectable.selectTabByNames(stringMessages.leaderboards(), stringMessages.leaderboardGroups(),
params);
}
});
TextColumn<EventDTO> imagesColumn = new TextColumn<EventDTO>() {
@Override
public String getValue(EventDTO event) {
@@ -738,4 +749,8 @@ public class EventListComposite extends Composite implements EventsRefresher, Le
public RefreshableMultiSelectionModel<EventDTO> getRefreshableMultiSelectionModel() {
return refreshableEventSelectionModel;
}
@Override
public void setupLeaderboardGroups(Map<String, String> params) {
}
}
@@ -1,5 +1,6 @@
package com.sap.sailing.gwt.ui.adminconsole;
import java.util.Map;
import java.util.Set;
import com.google.gwt.user.client.ui.CaptionPanel;
@@ -14,6 +15,7 @@ import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sailing.gwt.ui.shared.EventDTO;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
import com.sap.sse.gwt.adminconsole.HandleTabSelectable;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.celltable.RefreshableMultiSelectionModel;
@@ -30,7 +32,7 @@ public class EventManagementPanel extends SimplePanel implements EventsRefresher
private final RefreshableMultiSelectionModel<EventDTO> refreshableEventSelectionModel;
public EventManagementPanel(final SailingServiceAsync sailingService, final ErrorReporter errorReporter,
RegattaRefresher regattaRefresher, final StringMessages stringMessages) {
RegattaRefresher regattaRefresher, final StringMessages stringMessages, final HandleTabSelectable handleTabSelectable) {
VerticalPanel mainPanel = new VerticalPanel();
setWidget(mainPanel);
mainPanel.setWidth("100%");
@@ -39,8 +41,8 @@ public class EventManagementPanel extends SimplePanel implements EventsRefresher
mainPanel.add(eventsPanel);
VerticalPanel eventsContentPanel = new VerticalPanel();
eventsPanel.setContentWidget(eventsContentPanel);
eventListComposite = new EventListComposite(sailingService, errorReporter, regattaRefresher, this, stringMessages);
eventListComposite = new EventListComposite(sailingService, errorReporter, regattaRefresher, this, handleTabSelectable, stringMessages);
eventListComposite.ensureDebugId("EventListComposite");
eventsContentPanel.add(eventListComposite);
@@ -80,4 +82,9 @@ public class EventManagementPanel extends SimplePanel implements EventsRefresher
public void fillLeaderboardGroups(Iterable<LeaderboardGroupDTO> leaderboardGroups) {
eventListComposite.fillLeaderboardGroups(leaderboardGroups);
}
@Override
public void setupLeaderboardGroups(Map<String, String> params) {
eventListComposite.setupLeaderboardGroups(params);
}
}
@@ -6,6 +6,7 @@ import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.google.gwt.cell.client.FieldUpdater;
@@ -958,4 +959,23 @@ public class LeaderboardGroupConfigPanel extends AbstractRegattaPanel implements
private LeaderboardGroupDTO getSelectedGroup() {
return refreshableGroupsSelectionModel.getSelectedSet().isEmpty() ? null : refreshableGroupsSelectionModel.getSelectedSet().iterator().next();
}
@Override
public void setupLeaderboardGroups(Map<String, String> params) {
String nameLeaderBoardGroup = params.get("LeaderBoardGroupName");
if (nameLeaderBoardGroup == null) {
return;
}
//setup filter value to name from params
groupsFilterablePanel.getTextBox().setValue(nameLeaderBoardGroup);
//deselect all leaderboard groups except one which name is from params
for (LeaderboardGroupDTO leaderboardGroupDTO : availableLeaderboardGroups) {
if (nameLeaderBoardGroup.equals(leaderboardGroupDTO.getName())) {
groupsTable.getSelectionModel().setSelected(leaderboardGroupDTO, true);
} else if(groupsTable.getSelectionModel().isSelected(leaderboardGroupDTO)){
groupsTable.getSelectionModel().setSelected(leaderboardGroupDTO, false);
}
}
}
}
@@ -1,7 +1,11 @@
package com.sap.sailing.gwt.ui.client;
import java.util.Map;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
public interface LeaderboardGroupsDisplayer {
void fillLeaderboardGroups(Iterable<LeaderboardGroupDTO> leaderboardGroups);
void setupLeaderboardGroups(Map<String, String> params);
}
@@ -1,5 +1,7 @@
package com.sap.sailing.gwt.ui.client;
import java.util.Map;
import com.sap.sailing.gwt.ui.shared.LeaderboardGroupDTO;
public interface LeaderboardGroupsRefresher {
@@ -21,4 +23,13 @@ public interface LeaderboardGroupsRefresher {
* the update originated in <code>origin</code> and hence no notification is required.
*/
void updateLeaderboardGroups(Iterable<LeaderboardGroupDTO> updatedLeaderboardGroups, LeaderboardGroupsDisplayer origin);
/**
* Setup the state {@link LeaderboardGroupsDisplayer} using parameters
*
* @param params
* {@link Map} {@link String} parameters to setup the displayer
*/
public void setupLeaderboardGroups(LeaderboardGroupsDisplayer displayer, Map<String, String> params);
}
@@ -0,0 +1,145 @@
package com.sap.sailing.gwt.ui.client.shared.controls;
import static com.google.gwt.dom.client.BrowserEvents.CLICK;
import static com.google.gwt.dom.client.BrowserEvents.MOUSEDOWN;
import java.util.List;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.NativeEvent;
import com.google.gwt.safehtml.client.SafeHtmlTemplates;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.cell.client.AbstractCell;
import com.google.gwt.cell.client.ValueUpdater;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.EventTarget;
import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
/**
* Represent cell with multiple links. Link is represented as static nested class {@link CellLink}.
* <p>
* There are two behaviors depending on field isBlockLinkEvent:
* <ul>
* <li>If isBlockLinkEvent is true then click on link would work depending on onLinkClickHandler.</li>
* <li>If isBlockLinkEvent is false then link was work as real link.</li>
* </ul>
*
* @author Alexander Tatarinovich (C5237435)
*/
public class MultipleLinkCell extends AbstractCell<List<MultipleLinkCell.CellLink>> {
private ValueUpdater<String> onLinkClickHandler;
private boolean isBlockLinkEvent = false;
/**
* Represent Link for cell.
* <p>
* There are three fields which use in template {@link LinkTemplates} for link.
*/
public static class CellLink {
private final String target;
private final String href;
private final String text;
public String getTarget() {
return target;
}
public String getHref() {
return href;
}
public String getText() {
return text;
}
public CellLink(String text) {
super();
this.text = text;
this.href = "";
this.target = "";
}
public CellLink(String target, String href, String text) {
super();
this.target = target;
this.href = href;
this.text = text;
}
}
/**
* Template for link.
* <p>
* &lt;a target=\"{Target}\" href=\"{Href}\"&gt{Text}&lt/a&gt.
*/
interface LinkTemplates extends SafeHtmlTemplates {
@SafeHtmlTemplates.Template("<a target=\"{0}\" href=\"{1}\">{2}</a>")
SafeHtml cell(String target, String href, String text);
}
private static LinkTemplates linkTemplates = GWT.create(LinkTemplates.class);
public MultipleLinkCell() {
super(CLICK, MOUSEDOWN);
}
public MultipleLinkCell(boolean isBlockLinkEvent) {
super(CLICK, MOUSEDOWN);
this.isBlockLinkEvent = isBlockLinkEvent;
}
public ValueUpdater<String> getOnLinkClickHandler() {
return onLinkClickHandler;
}
public void setOnLinkClickHandler(ValueUpdater<String> handler) {
this.onLinkClickHandler = handler;
}
public boolean isBlockLinkEvent() {
return isBlockLinkEvent;
}
public void setBlockLinkEvent(boolean isBlockLinkEvent) {
this.isBlockLinkEvent = isBlockLinkEvent;
}
@Override
public void onBrowserEvent(Context context, Element parent, List<MultipleLinkCell.CellLink> value,
NativeEvent event, ValueUpdater<List<MultipleLinkCell.CellLink>> valueUpdater) {
super.onBrowserEvent(context, parent, value, event, valueUpdater);
if (isBlockLinkEvent) {
event.preventDefault();
EventTarget eventTarget = event.getEventTarget();
if (parent.isOrHasChild(Element.as(eventTarget))) {
Element el = Element.as(eventTarget);
if (el.getNodeName().equalsIgnoreCase("a")) {
onLinkClickHandler.update(el.getInnerText());
}
}
}
};
@Override
public void render(com.google.gwt.cell.client.Cell.Context context, List<MultipleLinkCell.CellLink> links,
SafeHtmlBuilder sb) {
if (links.isEmpty()) {
return;
}
SafeHtml rendered;
boolean isFirst = true;
for (CellLink link : links) {
if (isFirst) {
isFirst = false;
} else {
sb.appendHtmlConstant("<br>");
}
rendered = linkTemplates.cell(link.getTarget(), link.getHref(), link.getText());
sb.append(rendered);
}
}
}
@@ -66,7 +66,7 @@ import com.sap.sse.security.ui.shared.UserDTO;
* @author Axel Uhl (D043530)
*
*/
public class AdminConsolePanel extends DockLayoutPanel {
public class AdminConsolePanel extends DockLayoutPanel implements HandleTabSelectable{
private final UserService userService;
/**
@@ -137,7 +137,7 @@ public class AdminConsolePanel extends DockLayoutPanel {
* If the <code>widgetMaybeWrappedByScrollPanel</code> is a scroll panel, returns the content widget,
* otherwise <code>widgetMaybeWrappedByScrollPanel</code> is returned.
*/
private Widget unwrapScrollPanel(Widget widgetMaybeWrappedByScrollPanel) {
public Widget unwrapScrollPanel(Widget widgetMaybeWrappedByScrollPanel) {
final Widget target;
if (widgetMaybeWrappedByScrollPanel instanceof ScrollPanel) {
target = ((ScrollPanel) widgetMaybeWrappedByScrollPanel).getWidget();
@@ -189,6 +189,17 @@ public class AdminConsolePanel extends DockLayoutPanel {
public Widget getPanel() {
return topLevelTabPanel;
}
@Override
public void selectTab(int index) {
topLevelTabPanel.selectTab(index);
}
@Override
public int getWidgetIndex(Widget child) {
return topLevelTabPanel.getWidgetIndex(child);
}
};
final DockPanel informationPanel = new DockPanel();
informationPanel.setSize("100%", "95%");
@@ -232,6 +243,10 @@ public class AdminConsolePanel extends DockLayoutPanel {
void remove(Widget child);
Widget getPanel();
void selectTab(int index);
int getWidgetIndex(Widget child);
}
/**
@@ -282,6 +297,17 @@ public class AdminConsolePanel extends DockLayoutPanel {
public Widget getPanel() {
return tabPanel;
}
@Override
public void selectTab(int index) {
tabPanel.selectTab(index);
}
@Override
public int getWidgetIndex(Widget child) {
return tabPanel.getWidgetIndex(child);
}
};
addToTabPanel(wrapper, panelToAdd, tabTitle, requiresAnyOfThesePermissions);
}
@@ -336,6 +362,32 @@ public class AdminConsolePanel extends DockLayoutPanel {
}
}
@Override
public void selectTabByNames(String verticalTabName, String horizontalTabName, Map<String, String> params) {
if (verticalTabName == null) {
return;
}
Widget widgetForSetup = null; //Remember widget for set up
for (Triple<VerticalOrHorizontalTabLayoutPanel, Widget, String> e : roleSpecificTabs) {
VerticalOrHorizontalTabLayoutPanel panel = e.getA();
Widget currentWidget = e.getB();
if (panel == topLevelTabPanelWrapper && verticalTabName.equals(e.getC())) { // for vertical panel
int index = panel.getWidgetIndex(currentWidget);
panel.selectTab(index);
if (horizontalTabName == null) {//If we don't have horizontal tab will setup vertical tab.
widgetForSetup = currentWidget;
}
} else if (horizontalTabName != null && horizontalTabName.equals(e.getC())) { // for horizontal panel
int index = panel.getWidgetIndex(currentWidget);
panel.selectTab(index);
widgetForSetup = currentWidget;
}
}
panelsByWidget.get((new TabSelectionHandler()).unwrapScrollPanel(widgetForSetup)).setupWidgetByParams(params);;
}
/**
* A user is defined to have permission to see a widget if the widget's required permissions imply any of the permissions the
* user has. This may at first seem the wrong way around. However, the problem is that a widget cannot express a general permission
@@ -1,5 +1,7 @@
package com.sap.sse.gwt.adminconsole;
import java.util.Map;
import com.google.gwt.user.client.ui.Widget;
public class DefaultRefreshableAdminConsolePanel<W extends Widget> implements RefreshableAdminConsolePanel {
@@ -13,6 +15,10 @@ public class DefaultRefreshableAdminConsolePanel<W extends Widget> implements Re
this.widget = widget;
}
@Override
public void setupWidgetByParams(Map<String, String> params){
}
@Override
public W getWidget() {
return widget;
@@ -0,0 +1,13 @@
package com.sap.sse.gwt.adminconsole;
import java.util.Map;
public interface HandleTabSelectable {
/**
* Select tab by names
* @param verticalTabName - vertical name tab menu
* @param horizontalTabName - subtab name of vertical tab menu
* @param params - map of strings parameters
*/
void selectTabByNames(String verticalTabName, String horizontalTabName, Map<String, String> params);
}
@@ -1,5 +1,7 @@
package com.sap.sse.gwt.adminconsole;
import java.util.Map;
import com.google.gwt.user.client.ui.Widget;
public interface RefreshableAdminConsolePanel {
@@ -13,4 +15,9 @@ public interface RefreshableAdminConsolePanel {
* The widget representing the panel to place in the administration console
*/
Widget getWidget();
/**
* Invoked when the we handle selected tab by name {@link HandleTabSelectable} to set up a tab with parameters.
*/
void setupWidgetByParams(Map<String, String> params);
}