Skip to content
This repository was archived by the owner on May 5, 2021. It is now read-only.

Commit 6519e3e

Browse files
Merge pull request SORMAS-Foundation#3078 from hzi-braunschweig/feature-2981-diagram-percentage-stacks
SORMAS-Foundation#2981 - Changes to allow percentage diagrams to work with stacks
2 parents a781f24 + 9a02e74 commit 6519e3e

6 files changed

Lines changed: 92 additions & 26 deletions

File tree

sormas-api/src/main/java/de/symeda/sormas/api/campaign/diagram/CampaignDiagramDataDto.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class CampaignDiagramDataDto implements Serializable {
1313
private Number valueSum;
1414
private Object groupingKey;
1515
private String groupingCaption;
16+
private String stack;
1617

1718
public CampaignDiagramDataDto(
1819
String formMetaUuid,
@@ -21,15 +22,16 @@ public CampaignDiagramDataDto(
2122
String fieldCaption,
2223
Number valueSum,
2324
Object groupingKey,
24-
String groupingCaption) {
25+
String groupingCaption,
26+
String stack) {
2527
this.formMetaUuid = formMetaUuid;
2628
this.formId = formId;
2729
this.fieldId = fieldId;
2830
this.fieldCaption = fieldCaption;
2931
this.valueSum = valueSum;
3032
this.groupingKey = groupingKey;
3133
this.groupingCaption = groupingCaption;
32-
34+
this.stack = stack;
3335
}
3436

3537
public String getFormMetaUuid() {
@@ -87,4 +89,12 @@ public String getGroupingCaption() {
8789
public void setGroupingCaption(String groupingCaption) {
8890
this.groupingCaption = groupingCaption;
8991
}
92+
93+
public String getStack() {
94+
return stack;
95+
}
96+
97+
public void setStack(String stack) {
98+
this.stack = stack;
99+
}
90100
}

sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/data/CampaignFormDataFacadeEjb.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,8 @@ public List<CampaignDiagramDataDto> getDiagramData(List<CampaignDiagramSeries> d
468468
(String) result[3],
469469
(Number) result[4],
470470
(String) result[5],
471-
(String) result[6]))
471+
(String) result[6],
472+
series.getStack()))
472473
.collect(Collectors.toList()));
473474
}
474475
return resultData;

sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/campaigns/CampaignDashboardDataProvider.java

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import java.util.List;
1717
import java.util.Map;
1818
import java.util.Optional;
19-
import java.util.stream.Collectors;
2019

2120
public class CampaignDashboardDataProvider {
2221

@@ -26,11 +25,11 @@ public class CampaignDashboardDataProvider {
2625
private DistrictReferenceDto district;
2726

2827
private final Map<CampaignDashboardDiagramDto, List<CampaignDiagramDataDto>> campaignFormDataMap = new HashMap<>();
29-
private final Map<CampaignDashboardDiagramDto, Map<Object, Double>> campaignFormTotalValues = new HashMap<>();
28+
private final Map<CampaignDashboardDiagramDto, Map<CampaignDashboardTotalsReference, Double>> campaignFormTotalsMap = new HashMap<>();
3029

3130
public void refreshData() {
3231
campaignFormDataMap.clear();
33-
campaignFormTotalValues.clear();
32+
campaignFormTotalsMap.clear();
3433

3534
final List<CampaignDashboardElement> campaignDashboardElements =
3635
FacadeProvider.getCampaignFacade().getCampaignDashboardElements(campaign != null ? campaign.getUuid() : null);
@@ -60,12 +59,15 @@ public void refreshData() {
6059
.getDiagramData(
6160
campaignDashboardDiagramDto.getCampaignDiagramDefinitionDto().getCampaignSeriesTotal(),
6261
new CampaignDiagramCriteria(campaign, area, region, district));
63-
Map<Object, List<CampaignDiagramDataDto>> percentageDiagramDataMap =
64-
percentageDiagramData.stream().collect(Collectors.groupingBy(CampaignDiagramDataDto::getGroupingKey));
65-
Map<Object, Double> percentageDiagramPercentageMap = new HashMap<>();
66-
percentageDiagramDataMap
67-
.forEach((k, v) -> percentageDiagramPercentageMap.put(k, v.stream().mapToDouble(d -> d.getValueSum().doubleValue()).sum()));
68-
campaignFormTotalValues.put(campaignDashboardDiagramDto, percentageDiagramPercentageMap);
62+
63+
Map<CampaignDashboardTotalsReference, Double> percentageMap = new HashMap<>();
64+
for (CampaignDiagramDataDto data : percentageDiagramData) {
65+
CampaignDashboardTotalsReference totals = new CampaignDashboardTotalsReference(data.getGroupingKey(), data.getStack());
66+
Double value = percentageMap.getOrDefault(totals, 0D);
67+
value += data.getValueSum().doubleValue();
68+
percentageMap.put(totals, value);
69+
}
70+
campaignFormTotalsMap.put(campaignDashboardDiagramDto, percentageMap);
6971
}
7072
});
7173
}
@@ -110,7 +112,7 @@ public Map<CampaignDashboardDiagramDto, List<CampaignDiagramDataDto>> getCampaig
110112
return campaignFormDataMap;
111113
}
112114

113-
public Map<CampaignDashboardDiagramDto, Map<Object, Double>> getCampaignFormTotalValues() {
114-
return campaignFormTotalValues;
115+
public Map<CampaignDashboardDiagramDto, Map<CampaignDashboardTotalsReference, Double>> getCampaignFormTotalsMap() {
116+
return campaignFormTotalsMap;
115117
}
116118
}

sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/campaigns/CampaignDashboardDiagramComponent.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,20 @@ public class CampaignDashboardDiagramComponent extends VerticalLayout {
2727
private final Map<String, Map<Object, CampaignDiagramDataDto>> diagramDataBySeriesAndXAxis = new HashMap<>();
2828
private final List<Object> axisKeys = new ArrayList<>();
2929
private final Map<Object, String> axisCaptions = new HashMap<>();
30-
private final Map<Object, Double> totalValues;
30+
private final Map<CampaignDashboardTotalsReference, Double> totalValuesMap;
3131
private boolean showPercentages;
3232

3333
private final HighChart campaignColumnChart;
3434

3535
public CampaignDashboardDiagramComponent(
3636
CampaignDiagramDefinitionDto diagramDefinition,
3737
List<CampaignDiagramDataDto> diagramDataList,
38-
Map<Object, Double> totalValues,
38+
Map<CampaignDashboardTotalsReference, Double> totalValuesMap,
3939
boolean showPercentages) {
4040

41-
this.totalValues = totalValues;
4241
this.diagramDefinition = diagramDefinition;
4342
this.showPercentages = showPercentages;
43+
this.totalValuesMap = totalValuesMap;
4444

4545
campaignColumnChart = new HighChart();
4646

@@ -88,7 +88,7 @@ public void buildDiagramChart(String title) {
8888
+ " enabled: true,");
8989
//@formatter:on
9090

91-
if (totalValues != null) {
91+
if (totalValuesMap != null) {
9292
hcjs.append(
9393
" menuItemDefinitions: { togglePercentages: { onclick: function() { window.changeDiagramState_" + diagramDefinition.getDiagramId()
9494
+ "(); }, text: '"
@@ -100,7 +100,7 @@ public void buildDiagramChart(String title) {
100100

101101
hcjs.append(" buttons:{ contextButton:{ theme:{ fill: 'transparent' }");
102102

103-
if (totalValues != null) {
103+
if (totalValuesMap != null) {
104104
hcjs.append(
105105
", menuItems: ['viewFullscreen', 'printChart', 'separator', 'downloadPNG', 'downloadJPEG', 'downloadPDF', 'downloadSVG', 'separator', 'downloadCSV', 'downloadXLS', 'viewData', 'separator', 'togglePercentages']");
106106
}
@@ -130,8 +130,8 @@ public void buildDiagramChart(String title) {
130130

131131
//@formatter:off
132132
hcjs.append("yAxis: { min: 0, title: { text: ''}");
133-
if (showPercentages && totalValues != null) {
134-
hcjs.append(", max: 100, ");
133+
if (showPercentages && totalValuesMap != null) {
134+
hcjs.append(", max: 100 ");
135135
}
136136
if (stackMap.size() > 1) {
137137
hcjs.append(
@@ -142,13 +142,13 @@ public void buildDiagramChart(String title) {
142142

143143
// series
144144

145-
if (stackMap.size() > 0 || (showPercentages && totalValues != null)) {
145+
if (stackMap.size() > 0 || (showPercentages && totalValuesMap != null)) {
146146
hcjs.append("plotOptions: {");
147147

148148
if (stackMap.size() > 0) {
149149
hcjs.append("column: { stacking: 'normal'}");
150150
}
151-
if (showPercentages && totalValues != null) {
151+
if (showPercentages && totalValuesMap != null) {
152152
hcjs.append(stackMap.size() > 0 ? ", " : "")
153153
.append("series: { dataLabels: { enabled: true, format: '{y} %', style: { fontSize: 14 + 'px' }}}");
154154
}
@@ -169,8 +169,9 @@ public void buildDiagramChart(String title) {
169169
hcjs.append("{ name:'").append(fieldName).append("', data: [");
170170
for (Object axisKey : axisKeys) {
171171
if (seriesData.containsKey(axisKey)) {
172-
if (showPercentages && totalValues != null) {
173-
double totalValue = totalValues.get(seriesData.get(axisKey).getGroupingKey());
172+
if (showPercentages && totalValuesMap != null) {
173+
double totalValue =
174+
totalValuesMap.get(new CampaignDashboardTotalsReference(seriesData.get(axisKey).getGroupingKey(), series.getStack()));
174175
if (totalValue > 0) {
175176
hcjs.append(
176177
BigDecimal.valueOf(seriesData.get(axisKey).getValueSum().doubleValue() / totalValue * 100)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* SORMAS® - Surveillance Outbreak Response Management & Analysis System
3+
* Copyright © 2016-2020 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
4+
* This program is free software: you can redistribute it and/or modify
5+
* it under the terms of the GNU General Public License as published by
6+
* the Free Software Foundation, either version 3 of the License, or
7+
* (at your option) any later version.
8+
* This program is distributed in the hope that it will be useful,
9+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+
* GNU General Public License for more details.
12+
* You should have received a copy of the GNU General Public License
13+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
14+
*/
15+
16+
package de.symeda.sormas.ui.dashboard.campaigns;
17+
18+
import java.util.Objects;
19+
20+
public class CampaignDashboardTotalsReference {
21+
22+
private final Object key;
23+
private final String stack;
24+
25+
public CampaignDashboardTotalsReference(Object key, String stack) {
26+
this.key = key;
27+
this.stack = stack;
28+
}
29+
30+
public Object getKey() {
31+
return key;
32+
}
33+
34+
public String getStack() {
35+
return stack;
36+
}
37+
38+
@Override
39+
public boolean equals(Object o) {
40+
if (this == o)
41+
return true;
42+
if (o == null || getClass() != o.getClass())
43+
return false;
44+
CampaignDashboardTotalsReference that = (CampaignDashboardTotalsReference) o;
45+
return Objects.equals(key, that.key) && Objects.equals(stack, that.stack);
46+
}
47+
48+
@Override
49+
public int hashCode() {
50+
return Objects.hash(key, stack);
51+
}
52+
}

sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/campaigns/CampaignDashboardView.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public void refreshDashboard() {
141141
final CampaignDashboardDiagramComponent diagramComponent = new CampaignDashboardDiagramComponent(
142142
campaignDiagramDefinitionDto,
143143
diagramData,
144-
dataProvider.getCampaignFormTotalValues().get(campaignDashboardDiagramDto),
144+
dataProvider.getCampaignFormTotalsMap().get(campaignDashboardDiagramDto),
145145
campaignDiagramDefinitionDto.isPercentageDefault());
146146
styles.add(createDiagramStyle(diagramCssClass, diagramId));
147147
diagramComponent.setStyleName(diagramCssClass);

0 commit comments

Comments
 (0)