Merge remote-tracking branch 'server/master'

This commit is contained in:
Axel Uhl
2012-03-23 12:15:55 +01:00
12 changed files with 341 additions and 62 deletions
@@ -88,6 +88,8 @@
display: none;
}
.breadcrumbPanel-ActiveBreadcrumb {
font-size: 18px;
font-family: 'UbuntuLight',Arial,Verdana,sans-serif;
+12 -26
View File
@@ -182,32 +182,6 @@ input.magnifier {
width: 100%;
}
.collapsablePanel {
background: #b6b6b6;
margin: 0 0 12px 0;
border-radius: 7px;
overflow: hidden;
}
.collapsablePanel-content {
background: #fff;
margin: 12px;
border-radius: 10px;
width: auto !important;
}
.collapsablePanel-header {
background: url(images/titlebar-background.png) 0 0 repeat-x;
padding: 0;
margin: 0;
height: 42px;
}
.collapsablePanel-open {
}
.collapsablePanel-closed {
}
.raceBoardPanelHeader {
@@ -361,4 +335,16 @@ input.magnifier {
display: block;
height: 127px;
width: 29px;
}
.groupOverviewPanel-groupDescription {
padding: 10px;
}
.groupOverviewPanel-searchLabel {
margin: 3px 5px 0 5px;
}
.groupOverviewPanel-searchInputField {
margin: 0 5px 0 0;
}
@@ -282,4 +282,6 @@ public interface StringMessages extends Messages {
String speedPlaySpeedUp();
String showHideComponent(String localizedShortName);
String degreesBoatToTheWind();
String racesInLeaderboard();
String leaderboardsInGroup();
}
@@ -276,4 +276,6 @@ backToLive=Jump back to live time point
slowPlaySpeedDown=Slow play speed down
speedPlaySpeedUp=Speed play speed up
showHideComponent=Show/Hide {0}
degreesBoatToTheWind=Angle to wind
degreesBoatToTheWind=Angle to wind
racesInLeaderboard=Races in leaderboard
leaderboardsInGroup=Leaderboards in group
@@ -277,4 +277,6 @@ backToLive=Zum Live-Zeitpunkte springen
slowPlaySpeedDown=Abspielgeschwindigkeit verlangsamen
speedPlaySpeedUp=Abspielgeschwindigkeit erhöhen
showHideComponent={0} anzeigen/verstecken
degreesBoatToTheWind=Winkel zum Wind
degreesBoatToTheWind=Winkel zum Wind
racesInLeaderboard=Rennen im Leaderboard
leaderboardsInGroup=Leaderboards in der Gruppe
@@ -399,6 +399,18 @@ public class LeaderboardDTO implements IsSerializable {
}
return leaderboardPlaces;
}
/**
* @return <code>true</code> if the leaderboard contains a race which is live
*/
public boolean containsLiveRace() {
for (RaceInLeaderboardDTO race : getRaceList()) {
if (race.isLive()) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
@@ -80,6 +80,18 @@ public class LeaderboardGroupDTO extends NamedDTO implements IsSerializable {
return places;
}
/**
* @return <code>true</code> if the group contains a race which is live.
*/
public boolean containsLiveRace() {
for (LeaderboardDTO leaderboard : leaderboards) {
if (leaderboard.containsLiveRace()) {
return true;
}
}
return false;
}
@Override
public int hashCode() {
final int prime = 31;
@@ -80,6 +80,17 @@ public class RaceInLeaderboardDTO implements IsSerializable {
}
return places;
}
/**
* @return <code>true</code> if the startOfTracking is after the current date and there's no end of the race
*/
public boolean isLive() {
if (trackedRaceIdentifier != null && race != null) {
return race.endOfRace == null && (race.startOfTracking != null ? new Date().after(race.startOfTracking) : false);
} else {
return false;
}
}
@Override
public int hashCode() {
@@ -7,6 +7,7 @@ import java.util.List;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
@@ -30,6 +31,8 @@ import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.view.client.ListDataProvider;
import com.google.gwt.view.client.NoSelectionModel;
import com.google.gwt.view.client.SelectionChangeEvent;
import com.google.gwt.view.client.SingleSelectionModel;
import com.sap.sailing.domain.common.EventNameAndRaceName;
import com.sap.sailing.gwt.ui.adminconsole.LeaderboardConfigPanel.AnchorCell;
@@ -72,18 +75,19 @@ public class LeaderboardGroupOverviewPanel extends FormPanel {
private ListDataProvider<LeaderboardGroupDTO> groupsDataProvider;
private SingleSelectionModel<LeaderboardGroupDTO> groupsSelectionModel;
private CollapsablePanel collapsableDetailsPanel;
private Label noGroupSelectedLabel;
private FlowPanel groupDetailsPanel;
private HTML groupDescription;
private HTML groupDescriptionHTML;
private CellTable<LeaderboardDTO> leaderboardsTable;
private ListDataProvider<LeaderboardDTO> leaderboardsDataProvider;
private SingleSelectionModel<LeaderboardDTO> leaderboardsSelectionModel;
private FlowPanel leaderboardDetailsPanel;
private CellTable<RaceInLeaderboardDTO> racesTable;
private SingleSelectionModel<RaceInLeaderboardDTO> racesSelectionModel;
private NoSelectionModel<RaceInLeaderboardDTO> racesSelectionModel;
private ListDataProvider<RaceInLeaderboardDTO> racesDataProvider;
private List<LeaderboardGroupDTO> availableGroups;
@@ -92,12 +96,21 @@ public class LeaderboardGroupOverviewPanel extends FormPanel {
this.errorReporter = errorReporter;
this.stringMessages = stringMessages;
availableGroups = new ArrayList<LeaderboardGroupDTO>();
LeaderboardGroupOverviewTableResources tableResources = GWT.create(LeaderboardGroupOverviewTableResources.class);
FlowPanel mainPanel = new FlowPanel();
this.setWidget(mainPanel);
mainPanel.setSize("100%", "100%");
// Build search GUI
mainPanel.add(createSearchGUI());
mainPanel.add(createGroupsGUI(tableResources));
mainPanel.add(createDetailsGUI(tableResources));
loadGroups();
}
private CollapsablePanel createSearchGUI() {
FlowPanel searchPanel = new FlowPanel();
searchPanel.setWidth("100%");
@@ -106,7 +119,6 @@ public class LeaderboardGroupOverviewPanel extends FormPanel {
collapsableSearchPanel.setCollapsingEnabled(false);
collapsableSearchPanel.setOpen(true);
collapsableSearchPanel.setWidth("100%");
mainPanel.add(collapsableSearchPanel);
Label locationLabel = new Label(this.stringMessages.location() + ":");
locationLabel.setStyleName(STYLE_NAME_PREFIX + "searchLabel");
@@ -179,7 +191,10 @@ public class LeaderboardGroupOverviewPanel extends FormPanel {
});
searchPanel.add(untilTextBox);
//Build group GUI
return collapsableSearchPanel;
}
private CollapsablePanel createGroupsGUI(LeaderboardGroupOverviewTableResources tableResources) {
FlowPanel groupPanel = new FlowPanel();
groupPanel.setStyleName(STYLE_NAME_PREFIX + "groupPanel");
@@ -187,7 +202,6 @@ public class LeaderboardGroupOverviewPanel extends FormPanel {
collapsableGroupPanel.setContent(groupPanel);
collapsableGroupPanel.setOpen(true);
collapsableGroupPanel.setWidth("100%");
mainPanel.add(collapsableGroupPanel);
TextColumn<LeaderboardGroupDTO> groupsLocationColumn = new TextColumn<LeaderboardGroupDTO>() {
@Override
@@ -238,9 +252,15 @@ public class LeaderboardGroupOverviewPanel extends FormPanel {
};
groupsStartDateColumn.setSortable(true);
groupsTable = new CellTable<LeaderboardGroupDTO>();
groupsTable = new CellTable<LeaderboardGroupDTO>(200, tableResources);
groupsTable.setWidth("100%");
groupsSelectionModel = new SingleSelectionModel<LeaderboardGroupDTO>();
groupsSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
onGroupSelectionChanged();
}
});
groupsTable.setSelectionModel(groupsSelectionModel);
groupsTable.addColumn(groupsLocationColumn, this.stringMessages.location());
@@ -281,14 +301,16 @@ public class LeaderboardGroupOverviewPanel extends FormPanel {
});
groupsTable.addColumnSortHandler(groupsListHandler);
//Build details GUI
return collapsableGroupPanel;
}
private CollapsablePanel createDetailsGUI(LeaderboardGroupOverviewTableResources tableResources) {
FlowPanel detailsPanel = new FlowPanel();
detailsPanel.setStyleName(STYLE_NAME_PREFIX + "detailsPanel");
CollapsablePanel collapsableDetailsPanel = new CollapsablePanel(this.stringMessages.details(), false);
collapsableDetailsPanel = new CollapsablePanel(this.stringMessages.details(), false);
collapsableDetailsPanel.setContent(detailsPanel);
collapsableDetailsPanel.setWidth("100%");
mainPanel.add(collapsableDetailsPanel);
noGroupSelectedLabel = new Label(this.stringMessages.noGroupSelected());
detailsPanel.add(noGroupSelectedLabel);
@@ -296,21 +318,24 @@ public class LeaderboardGroupOverviewPanel extends FormPanel {
//Build group details GUI
groupDetailsPanel = new FlowPanel();
groupDetailsPanel.setVisible(false);
groupDetailsPanel.setSize("100%", "100%");
groupDetailsPanel.setStyleName(STYLE_NAME_PREFIX + "groupDetailsPanel");
groupDetailsPanel.getElement().getStyle().setFloat(Style.Float.LEFT);
detailsPanel.add(groupDetailsPanel);
groupDescription = new HTML();
groupDescription.setStyleName(STYLE_NAME_PREFIX + "groupDescription");
groupDescription.setVisible(false);
groupDetailsPanel.add(groupDescription);
groupDescriptionHTML = new HTML();
groupDescriptionHTML.setStyleName(STYLE_NAME_PREFIX + "groupDescription");
groupDetailsPanel.add(groupDescriptionHTML);
Label groupDetailsLabel = new Label(stringMessages.leaderboardsInGroup()+ ": ");
groupDetailsLabel.getElement().getStyle().setPadding(5, Unit.PX);
groupDetailsPanel.add(groupDetailsLabel);
TextColumn<LeaderboardDTO> leaderboardsLocationColumn = new TextColumn<LeaderboardDTO>() {
@Override
public String getValue(LeaderboardDTO leaderboard) {
PlacemarkOrderDTO leaderboardPlaces = leaderboard.getPlaces();
return leaderboardPlaces == null ? LeaderboardGroupOverviewPanel.this.stringMessages
.locationNotAvailable() : leaderboardPlaces.placemarksAsString();
.notAvailable() : leaderboardPlaces.placemarksAsString();
}
};
@@ -352,9 +377,16 @@ public class LeaderboardGroupOverviewPanel extends FormPanel {
}
};
leaderboardsTable = new CellTable<LeaderboardDTO>();
leaderboardsTable = new CellTable<LeaderboardDTO>(200, tableResources);
leaderboardsTable.setWidth("100%");
leaderboardsSelectionModel = new SingleSelectionModel<LeaderboardDTO>();
leaderboardsSelectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
@Override
public void onSelectionChange(SelectionChangeEvent event) {
onLeaderboardSelectionChanged();
}
});
leaderboardsTable.setSelectionModel(leaderboardsSelectionModel);
leaderboardsTable.addColumn(leaderboardsLocationColumn, this.stringMessages.location());
@@ -366,7 +398,17 @@ public class LeaderboardGroupOverviewPanel extends FormPanel {
leaderboardsDataProvider = new ListDataProvider<LeaderboardDTO>();
leaderboardsDataProvider.addDataDisplay(leaderboardsTable);
//Build leaderboard details GUI TODO
//Build leaderboard details GUI
leaderboardDetailsPanel = new FlowPanel();
leaderboardDetailsPanel.setSize("100%", "100%");
leaderboardDetailsPanel.setStyleName(STYLE_NAME_PREFIX + "leaderboardDetailsPanel");
leaderboardDetailsPanel.setVisible(false);
leaderboardDetailsPanel.getElement().setPropertyString("clear", "right");
detailsPanel.add(leaderboardDetailsPanel);
Label leaderboardDetailsLabel = new Label(stringMessages.racesInLeaderboard() + ":");
leaderboardDetailsLabel.getElement().getStyle().setPadding(5, Unit.PX);
leaderboardDetailsPanel.add(leaderboardDetailsLabel);
TextColumn<RaceInLeaderboardDTO> racesLocationColumn = new TextColumn<RaceInLeaderboardDTO>() {
@Override
@@ -406,23 +448,23 @@ public class LeaderboardGroupOverviewPanel extends FormPanel {
}
};
racesTable = new CellTable<RaceInLeaderboardDTO>();
racesTable = new CellTable<RaceInLeaderboardDTO>(200, tableResources);
racesTable.setWidth("100%");
racesTable.setVisible(false);
racesTable.getElement().setPropertyString("clear", "right");
racesSelectionModel = new SingleSelectionModel<RaceInLeaderboardDTO>();
racesSelectionModel = new NoSelectionModel<RaceInLeaderboardDTO>();
racesTable.setSelectionModel(racesSelectionModel);
racesTable.addColumn(racesLocationColumn, this.stringMessages.location());
racesTable.addColumn(racesNameColumn, this.stringMessages.name());
racesTable.addColumn(racesStartDateColumn, this.stringMessages.startDate());
detailsPanel.add(racesTable);
leaderboardDetailsPanel.add(racesTable);
//Loading the data
loadData();
racesDataProvider = new ListDataProvider<RaceInLeaderboardDTO>();
racesDataProvider.addDataDisplay(racesTable);
return collapsableDetailsPanel;
}
private void loadData() {
private void loadGroups() {
sailingService.getLeaderboardGroups(new AsyncCallback<List<LeaderboardGroupDTO>>() {
@Override
public void onSuccess(List<LeaderboardGroupDTO> result) {
@@ -437,13 +479,60 @@ public class LeaderboardGroupOverviewPanel extends FormPanel {
});
}
private void onGroupSelectionChanged() {
LeaderboardGroupDTO selectedGroup = groupsSelectionModel.getSelectedObject();
LeaderboardDTO selectedLeaderboard = leaderboardsSelectionModel.getSelectedObject();
if (selectedGroup != null) {
setGroupDetailsVisible(true);
if (selectedLeaderboard != null) {
setLeaderboardDetailsVisible(selectedGroup.leaderboards.contains(selectedLeaderboard));
}
fillGroupDetails(selectedGroup);
} else {
setGroupDetailsVisible(false);
setLeaderboardDetailsVisible(false);
}
}
private void setGroupDetailsVisible(boolean visible) {
noGroupSelectedLabel.setVisible(!visible);
groupDetailsPanel.setVisible(visible);
if (visible) {
collapsableDetailsPanel.setOpen(true);
}
}
private void fillGroupDetails(LeaderboardGroupDTO group) {
groupDescriptionHTML.setHTML(new SafeHtmlBuilder().appendEscapedLines(group.description).toSafeHtml());
leaderboardsDataProvider.getList().clear();
leaderboardsDataProvider.getList().addAll(group.leaderboards);
}
private void onLeaderboardSelectionChanged() {
LeaderboardDTO selectedLeaderboard = leaderboardsSelectionModel.getSelectedObject();
setLeaderboardDetailsVisible(selectedLeaderboard != null);
if (selectedLeaderboard != null) {
fillLeaderboardDetails(selectedLeaderboard);
}
}
private void setLeaderboardDetailsVisible(boolean visible) {
leaderboardDetailsPanel.setVisible(visible);
}
private void fillLeaderboardDetails(LeaderboardDTO leaderboard) {
racesDataProvider.getList().clear();
racesDataProvider.getList().addAll(leaderboard.getRaceList());
}
private void onCheckBoxLiveChange() {
if (onlyLiveCheckBox.getValue()) {
String today = DateTimeFormat.getFormat("dd.MM.yyyy").format(new Date()).toString();
fromTextBox.setText(today);
fromTextBox.setEnabled(false);
untilTextBox.setText(today);
untilTextBox.setText("");
untilTextBox.setEnabled(false);
} else {
fromTextBox.setText("");
@@ -491,7 +580,9 @@ public class LeaderboardGroupOverviewPanel extends FormPanel {
if (result && name != null && !name.equals("")) {
result = textContainsStringsToCheck(forGroup.name, name.split("\\s"));
}
if (result) {
if (result && onlyLiveCheckBox.getValue()) {
result = forGroup.containsLiveRace();
}else if (result) {
Date startDate = forGroup.getGroupStartDate();
if (startDate != null) {
if (from != null && until != null) {
@@ -0,0 +1,146 @@
.cellTableWidget {
border-left: 1px solid #c9caca;
border-top: 1px solid #c9caca;
}
/** v-align images in the table header
* grey background for table header
*/
.cellTableHeader {
position: relative;
vertical-align: bottom;
background-color: #e5e5e5;
border-right: 1px solid #ffffff !important;
border-top: none !important;
border-bottom: 1px solid #c9caca !important;
padding: 3px 12px;
padding-bottom: 5px;
text-align: center;
}
.cellTableFirstColumnHeader {
position: relative;
vertical-align: bottom;
background-color: #e5e5e5;
border-left: none !important;
border-right: 1px solid #ffffff !important;
border-top: none !important;
border-bottom: 1px solid #c9caca !important;
padding: 3px 12px;
padding-bottom: 5px;
text-align: center;
}
.cellTableLastColumnHeader {
position: relative;
vertical-align: bottom;
background-color: #e5e5e5;
border-right: 1px solid #c9caca !important;
border-top: none !important;
border-bottom: 1px solid #c9caca !important;
padding: 3px 12px;
padding-bottom: 5px;
text-align: center;
}
.cellTableHeader > span > img:first-child {
position: relative;
vertical-align: middle;
}
.cellTableEvenRow {
border-bottom: 1px solid #e5e5e5;
background-color: rgba(255,255,255,0.5);
}
.cellTableEvenRowCell {
border-right: 1px solid #c9caca !important;
border-left: none;
border-top: none !important;
border-bottom: 1px solid #c9caca !important;
padding: 5px 17px 5px !important;
white-space: nowrap;
}
.cellTableOddRow {
border-bottom: 1px solid #e5e5e5;
background-color: rgba(242,242,242,0.5);
}
.cellTableOddRowCell {
border-left: none !important;
border-right: 1px solid #c9caca !important;
border-top: none !important;
border-bottom: 1px solid #c9caca !important;
padding: 5px 17px 5px !important;
white-space: nowrap;
}
.cellTableHoveredRow {
background-color: rgba(229,242,249,0.5);
border-bottom: 1px solid #e5e5e5;
}
.cellTableSelectedRow {
color: #000000;
background-color: rgba(229,242,249,0.5);
border-right: 2px solid #21a0e4 !important;
border-left: 2px solid #21a0e4 !important;
border: 2px solid #21a0e4;
}
.cellTableSelectedRow > td:FIRST-CHILD {
border-left: 2px solid rgba(33,160,228,0.5) !important;
}
.cellTableSelectedRow > td:LAST-CHILD {
border-right: 2px solid rgba(33,160,228,0.5) !important;
}
.cellTableSelectedRowCell {
border-left: none;
border-right: 1px solid #e5e5e5;
border-top: 2px solid #21a0e4 !important;
border-bottom: 2px solid #21a0e4 !important;
}
.cellTableRaceColumnHeader {
background-color: #e0e0e0;
}
.cellTableRaceColumnHeader span:first-child{
display: block;
}
.cellTableRaceColumnHeader span input, .cellTableRaceColumnHeader span img{
margin: 0 auto;
}
.cellTableRaceColumnHeader span img {
float: left;
}
.cellTableLegColumnHeader {
background-color: #efefef;
}
.cellTableLegDetailColumnHeader {
background-color: #f4f5f6;
}
.cellTableRaceColumn {
background-color: #e0e0e0 !important;
}
.cellTableLegColumn {
background-color: #efefef !important;
}
.cellTableLegDetailColumn {
background-color: #ffffff !important;
}
.cellTableTotalColumn {
background-color: #e0e0e0 !important;
}
@@ -0,0 +1,12 @@
package com.sap.sailing.gwt.ui.spectator;
import com.google.gwt.user.cellview.client.CellTable;
import com.sap.sailing.gwt.ui.adminconsole.AdminConsoleTableResources.AdminConsoleTableStyle;
public interface LeaderboardGroupOverviewTableResources extends CellTable.Resources {
@Source({ CellTable.Style.DEFAULT_CSS, "LeaderboardGroupOverviewTable.css" })
AdminConsoleTableStyle cellTableStyle();
interface LeaderboardGroupTableStyle extends CellTable.Style {
}
}
@@ -55,9 +55,10 @@ public class SpectatorEntryPoint extends AbstractEntryPoint implements EventRefr
rootPanel.add(logoAndTitlePanel);
if (groupName == null) {
//TODO Enable code below, when the LeaderboardGroupOverviewPanel was styled
// panelToDisplay = new LeaderboardGroupOverviewPanel(sailingService, this, stringMessages);
Window.alert("No leaderboard group name was given.");
FlowPanel groupOverviewPanel = new FlowPanel();
groupOverviewPanel.addStyleName("contentOuterPanel");
groupOverviewPanel.add(new LeaderboardGroupOverviewPanel(sailingService, this, stringMessages));
rootPanel.add(groupOverviewPanel);
} else {
LeaderboardGroupPanel groupPanel = new LeaderboardGroupPanel(sailingService, stringMessages, this, groupName, root, viewModeParamValue);
groupPanel.getElement().getStyle().setFloat(Style.Float.LEFT);
@@ -74,7 +75,7 @@ public class SpectatorEntryPoint extends AbstractEntryPoint implements EventRefr
feedbackPanel.addStyleName("feedbackPanel");
Anchor feedbackLink = new Anchor(new SafeHtmlBuilder().appendHtmlConstant(
"<img class=\"linkNoBorder\" src=\"/gwt/images/feedbackPanel-bg.png\"/>").toSafeHtml());//TODO set image
feedbackLink.setHref("mailto:axel.uhl%40sap.com?subject=[SAP Sailing] Feedback");
feedbackLink.setHref("mailto:sailing_analytics%40sap.com?subject=[SAP Sailing] Feedback");
feedbackLink.addStyleName("feedbackLink");
feedbackPanel.add(feedbackLink);