Fixed AbstractCompetitorLeaderBoardChart rendering of new inputs.

This commit is contained in:
Dennis Aulenbacher committed 2021-07-29 17:41:46 +02:00
1 parent 51b50bd471
commit 3a8965e827
1 file changed
+27 -92
@@ -1,13 +1,11 @@
package com.sap.sailing.gwt.ui.client.shared.charts;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.moxieapps.gwt.highcharts.client.Axis;
import org.moxieapps.gwt.highcharts.client.Chart;
@@ -41,6 +39,7 @@ import com.sap.sailing.gwt.ui.client.DetailTypeFormatter;
import com.sap.sailing.gwt.ui.client.SailingServiceAsync;
import com.sap.sailing.gwt.ui.client.StringMessages;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Triple;
import com.sap.sse.common.filter.Filter;
import com.sap.sse.common.filter.FilterSet;
import com.sap.sse.common.settings.generic.GenericSerializableSettings;
@@ -212,11 +211,15 @@ public abstract class AbstractCompetitorLeaderboardChart<SettingsType extends Ge
if (result == null) {
result = chart.createSeries().setType(Series.Type.LINE).setName(competitor.getName());
result.setPlotOptions(new LinePlotOptions()
.setLineWidth(LINE_WIDTH)
.setMarker(new Marker().setEnabled(true).setRadius(4).setSymbol(Symbol.DIAMOND))
.setShadow(true).setHoverStateLineWidth(LINE_WIDTH)
.setColor(competitorSelectionProvider.getColor(competitor).getAsHtml()).setSelected(true));
.setLineWidth(LINE_WIDTH)
.setMarker(new Marker().setEnabled(true).setRadius(4).setSymbol(Symbol.DIAMOND))
.setShadow(true)
.setHoverStateLineWidth(LINE_WIDTH)
.setColor(competitorSelectionProvider.getColor(competitor).getAsHtml())
.setSelected(true)
);
competitorSeries.put(competitor, result);
chart.addSeries(result, false, true);
}
return result;
}
@@ -247,34 +250,20 @@ public abstract class AbstractCompetitorLeaderboardChart<SettingsType extends Ge
sailingService, leaderboardName, /* date */ null, selectedDetailType);
asyncActionsExecutor.execute(getLeaderboardDataEntriesAction, LODA_LEADERBOARD_CHART_DATA_CATEGORY,
new AsyncCallback<List<com.sap.sse.common.Util.Triple<String, List<CompetitorDTO>, List<Double>>>>() {
new AsyncCallback<List<Triple<String, List<CompetitorDTO>, List<Double>>>>() {
@Override
public void onSuccess(List<com.sap.sse.common.Util.Triple<String, List<CompetitorDTO>, List<Double>>> result) {
List<Series> chartSeries = new ArrayList<Series>(Arrays.asList(chart.getSeries()));
public void onSuccess(List<Triple<String, List<CompetitorDTO>, List<Double>>> result) {
chart.hideLoading();
setWidget(chart);
raceColumnNames.clear();
switch (selectedDetailType) {
case OVERALL_RANK:
case REGATTA_RANK:
fillTotalRanksSeries(result, chartSeries);
break;
case REGATTA_NET_POINTS_SUM:
fillTotalPointsSeries(result, chartSeries);
break;
default:
break;
}
fillSeries(result);
// TODO will removing the following line do harm on any usage of this abstract base class?
// chart.setSizeToMatchContainer();
// it's important here to recall the redraw method, otherwise the bug fix for wrong checkbox
// positions (nativeAdjustCheckboxPosition)
// in the BaseChart class would not be called
// positions (nativeAdjustCheckboxPosition) in the BaseChart class would not be called
chart.redraw();
chartDataUpdateCallbacks.forEach(Runnable::run);
}
@Override
public void onFailure(Throwable caught) {
chart.hideLoading();
@@ -284,82 +273,22 @@ public abstract class AbstractCompetitorLeaderboardChart<SettingsType extends Ge
});
}
private void fillTotalRanksSeries(List<com.sap.sse.common.Util.Triple<String, List<CompetitorDTO>, List<Double>>> result, List<Series> chartSeries) {
Set<Series> unusedSeries = new HashSet<>(competitorSeries.values());
for (Series series : competitorSeries.values()) {
for (Point p : new ArrayList<Point>(Arrays.asList(series.getPoints()))) {
series.removePoint(p, /* redraw */false, /* animation */false);
}
}
private void fillSeries(List<Triple<String, List<CompetitorDTO>, List<Double>>> result) {
int raceColumnNumber = 0;
int maxCompetitorCount = 0;
for (com.sap.sse.common.Util.Triple<String, List<CompetitorDTO>, List<Double>> entry : result) {
List<Double> dataValues = entry.getC();
raceColumnNames.add(entry.getA());
if(hasValidValues(dataValues)) {
raceColumnNamesWithData.add(entry.getA());
int index = 0;
maxCompetitorCount = Math.max(maxCompetitorCount, entry.getB().size());
for (CompetitorDTO competitor : entry.getB()) {
if (isCompetitorVisible(competitor)) {
Series series = getOrCreateSeries(competitor);
Double dataValue = dataValues.get(index);
if (dataValue != null) {
series.addPoint(raceColumnNumber, dataValue, /* redraw */false, /* shift */false, /* animation */ false);
}
unusedSeries.remove(series);
if (!chartSeries.contains(series)) {
chart.addSeries(series);
chartSeries.add(series);
}
}
index++;
}
raceColumnNumber++;
}
}
setHeight();
}
private void setHeight() {
chart.setSize(chart.getOffsetWidth(), Window.getClientHeight());
}
private void fillTotalPointsSeries(
List<com.sap.sse.common.Util.Triple<String, List<CompetitorDTO>, List<Double>>> result,
List<Series> chartSeries) {
Double maxTotalPoints = 0.0;
Set<Series> unusedSeries = new HashSet<Series>(competitorSeries.values());
for (Series series : competitorSeries.values()) {
for (Point p : new ArrayList<Point>(Arrays.asList(series.getPoints()))) {
series.removePoint(p, /* redraw */ false, /* animation */ false);
}
}
int raceColumnNumber = 0;
int maxCompetitorCount = 0;
for (com.sap.sse.common.Util.Triple<String, List<CompetitorDTO>, List<Double>> entry : result) {
List<Double> dataValues = entry.getC();
final Map<CompetitorDTO, Point[]> competitorWithCoordinatePoints = new ConcurrentHashMap<>();
for (Triple<String, List<CompetitorDTO>, List<Double>> entry : result) {
final List<Double> dataValues = entry.getC();
raceColumnNames.add(entry.getA());
if (hasValidValues(dataValues)) {
raceColumnNamesWithData.add(entry.getA());
int index = 0;
maxCompetitorCount = Math.max(maxCompetitorCount, entry.getB().size());
for (CompetitorDTO competitor : entry.getB()) {
if (isCompetitorVisible(competitor)) {
Series series = getOrCreateSeries(competitor);
Double dataValue = dataValues.get(index);
if (dataValue != null) {
Double sumTotalPoints = dataValue;
series.addPoint(raceColumnNumber, sumTotalPoints, /* redraw */ false, /* shift */ false, /* animation */ false);
if (sumTotalPoints > maxTotalPoints) {
maxTotalPoints = sumTotalPoints;
}
}
unusedSeries.remove(series);
if (!chartSeries.contains(series)) {
chart.addSeries(series);
chartSeries.add(series);
final Point[] points = competitorWithCoordinatePoints
.computeIfAbsent(competitor, c -> new Point[result.size()]);
points[raceColumnNumber] = new Point(raceColumnNumber, dataValue);
}
}
index++;
@@ -367,9 +296,15 @@ public abstract class AbstractCompetitorLeaderboardChart<SettingsType extends Ge
raceColumnNumber++;
}
}
competitorWithCoordinatePoints
.forEach((competitor, points) -> getOrCreateSeries(competitor).setPoints(points, false));
setHeight();
}
private void setHeight() {
chart.setSize(chart.getOffsetWidth(), Window.getClientHeight());
}
private boolean hasValidValues(List<Double> values) {
boolean result = false;
for(Double value: values) {