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

Commit 8a7a8b4

Browse files
committed
2644 move warning label below chart diagram + remove "view data table" option
1 parent 318fa83 commit 8a7a8b4

5 files changed

Lines changed: 69 additions & 89 deletions

File tree

sormas-api/src/main/resources/strings.properties

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,9 @@ errorReadingDocument = Error reading document '%s'
251251
errorProcessingTemplate = Error processing template '%s'
252252
errorSormasToSormasNotEditable = Readonly data can not be shared.
253253
errorCampaignDiagramTotalsCalculationError = At least part of the percentage values for the diagram '%s' could not be calculated. Please check the diagram definitions for errors.
254-
errorNoPopulationDataLocations = No population data was found for the following locations : %s
255-
errorNoPopulationDataFound = There is no population data available. Switching to default view
256-
errorFormIdPopulationAgeGroup = Both "Form Id" and "Population Age Group" options are set
254+
errorNoPopulationDataLocations=No population data was found for the following locations : %s
255+
errorNoPopulationDataFound=There is no population data available. Switching to absolute data view
256+
errorFormIdPopulationAgeGroup=Both "Form Id" and "Population Age Group" options are set
257257
# headings
258258
headingAccessDenied = Access denied
259259
headingAdditionalTests = Additional tests

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

Lines changed: 9 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
import de.symeda.sormas.api.region.AreaReferenceDto;
2626
import de.symeda.sormas.api.region.DistrictReferenceDto;
2727
import de.symeda.sormas.api.region.RegionReferenceDto;
28+
import org.apache.commons.collections.CollectionUtils;
29+
import org.slf4j.Logger;
30+
import org.slf4j.LoggerFactory;
2831

2932
public class CampaignDashboardDataProvider {
3033

@@ -38,6 +41,8 @@ public class CampaignDashboardDataProvider {
3841
private final Map<CampaignDashboardDiagramDto, List<CampaignDiagramDataDto>> campaignFormDataMap = new HashMap<>();
3942
private final Map<CampaignDashboardDiagramDto, Map<CampaignDashboardTotalsReference, Double>> campaignFormTotalsMap = new HashMap<>();
4043

44+
private final Logger logger = LoggerFactory.getLogger(getClass());
45+
4146
public void refreshDashboardData() {
4247

4348
if (campaign != null) {
@@ -65,15 +70,16 @@ protected void refreshDiagramsData(String tabId, String subTabId) {
6570
if (campaignDashboardDiagramDto.getCampaignDiagramDefinitionDto().getCampaignSeriesTotal() != null) {
6671
Optional populationGroup = campaignSeriesTotal.stream().filter(e -> Objects.nonNull(e.getPopulationGroup())).findFirst();
6772
Optional formIdOptional = campaignSeriesTotal.stream().filter(e -> Objects.nonNull(e.getFormId())).findFirst();
68-
if (populationGroup.isPresent() && formIdOptional.isPresent()) {
69-
Notification.show(String.format(I18nProperties.getString(Strings.errorFormIdPopulationAgeGroup)), ERROR_MESSAGE);
70-
} else {
73+
{
7174
if (populationGroup.isPresent()) {
7275
percentageDiagramData = FacadeProvider.getCampaignFormDataFacade()
7376
.getDiagramDataByAgeGroup(
7477
(CampaignDiagramSeries) populationGroup.get(),
7578
campaignDashboardDiagramDto.getCampaignDiagramDefinitionDto().getCampaignDiagramSeries().get(0),
7679
new CampaignDiagramCriteria(campaign, area, region, district));
80+
if (formIdOptional.isPresent()) {
81+
logger.warn(String.format(I18nProperties.getString(Strings.errorFormIdPopulationAgeGroup)));
82+
}
7783
} else {
7884
percentageDiagramData = FacadeProvider.getCampaignFormDataFacade()
7985
.getDiagramData(
@@ -94,46 +100,6 @@ protected void refreshDiagramsData(String tabId, String subTabId) {
94100
});
95101
}
96102

97-
private void buildCampaignFormTotalsMap(CampaignDashboardDiagramDto campaignDashboardDiagramDto) {
98-
List<CampaignDiagramDataDto> diagramData = FacadeProvider.getCampaignFormDataFacade()
99-
.getDiagramData(
100-
campaignDashboardDiagramDto.getCampaignDiagramDefinitionDto().getCampaignDiagramSeries(),
101-
new CampaignDiagramCriteria(campaign, area, region, district));
102-
campaignFormDataMap.put(campaignDashboardDiagramDto, diagramData);
103-
List<CampaignDiagramSeries> campaignSeriesTotal = campaignDashboardDiagramDto.getCampaignDiagramDefinitionDto().getCampaignSeriesTotal();
104-
List<CampaignDiagramDataDto> percentageDiagramData = null;
105-
if (campaignSeriesTotal != null) {
106-
if (Objects.nonNull(campaignSeriesTotal)) {
107-
Optional populationGroup = campaignSeriesTotal.stream().filter(e -> Objects.nonNull(e.getPopulationGroup())).findFirst();
108-
Optional formIdOptional = campaignSeriesTotal.stream().filter(e -> Objects.nonNull(e.getFormId())).findFirst();
109-
if (populationGroup.isPresent()) {
110-
if (formIdOptional.isPresent()) {
111-
Notification.show(String.format(I18nProperties.getString(Strings.errorFormIdPopulationAgeGroup)), ERROR_MESSAGE);
112-
} else {
113-
percentageDiagramData = FacadeProvider.getCampaignFormDataFacade()
114-
.getDiagramDataByAgeGroup(
115-
(CampaignDiagramSeries) populationGroup.get(),
116-
campaignDashboardDiagramDto.getCampaignDiagramDefinitionDto().getCampaignDiagramSeries().get(0),
117-
new CampaignDiagramCriteria(campaign, area, region, district));
118-
}
119-
} else {
120-
percentageDiagramData = FacadeProvider.getCampaignFormDataFacade()
121-
.getDiagramData(
122-
campaignDashboardDiagramDto.getCampaignDiagramDefinitionDto().getCampaignSeriesTotal(),
123-
new CampaignDiagramCriteria(campaign, area, region, district));
124-
}
125-
Map<CampaignDashboardTotalsReference, Double> percentageMap = new HashMap<>();
126-
for (CampaignDiagramDataDto data : percentageDiagramData) {
127-
CampaignDashboardTotalsReference totals = new CampaignDashboardTotalsReference(data.getGroupingKey(), data.getStack());
128-
Double value = percentageMap.getOrDefault(totals, 0D);
129-
value += data.getValueSum().doubleValue();
130-
percentageMap.put(totals, value);
131-
}
132-
campaignFormTotalsMap.put(campaignDashboardDiagramDto, percentageMap);
133-
}
134-
}
135-
}
136-
137103
private void createCampaignDashboardDiagramDefinitionsMap() {
138104
if (!campaignDiagramDefinitionsMap.containsKey(campaign)) {
139105
final List<CampaignDashboardDiagramDto> campaignDashboardDiagramDtos = new ArrayList<>();

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

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
import java.util.function.Function;
1616
import java.util.stream.Collectors;
1717

18+
import com.vaadin.ui.Label;
19+
import org.apache.commons.collections.CollectionUtils;
20+
import org.apache.commons.collections.MapUtils;
1821
import org.apache.commons.text.StringEscapeUtils;
1922

2023
import com.vaadin.ui.Notification;
@@ -39,21 +42,19 @@ public class CampaignDashboardDiagramComponent extends VerticalLayout {
3942
private final Map<CampaignDashboardTotalsReference, Double> totalValuesMap;
4043
private boolean totalValuesWithoutStacks;
4144
private boolean showPercentages;
42-
private String populationGroupDiagramTitle;
43-
45+
private List<String> noPopulationDataLocations;
4446
private final HighChart campaignColumnChart;
4547

4648
public CampaignDashboardDiagramComponent(
4749
CampaignDiagramDefinitionDto diagramDefinition,
4850
List<CampaignDiagramDataDto> diagramDataList,
4951
Map<CampaignDashboardTotalsReference, Double> totalValuesMap,
5052
boolean showPercentages,
51-
String populationGroupDiagramTitle,
52-
boolean isCampaignGrouping) {
53-
this.populationGroupDiagramTitle = populationGroupDiagramTitle;
53+
boolean isCommunityGrouping) {
5454
this.diagramDefinition = diagramDefinition;
5555
this.showPercentages = showPercentages;
5656
this.totalValuesMap = totalValuesMap;
57+
noPopulationDataLocations = new LinkedList<>();
5758

5859
if (this.totalValuesMap != null && this.totalValuesMap.keySet().stream().noneMatch(r -> r.getStack() != null)) {
5960
totalValuesWithoutStacks = true;
@@ -84,10 +85,10 @@ public CampaignDashboardDiagramComponent(
8485
objectCampaignDiagramDataDtoMap.put(diagramData.getGroupingKey(), diagramData);
8586
}
8687

87-
buildDiagramChart(diagramDefinition.getDiagramCaption(), isCampaignGrouping);
88+
buildDiagramChart(diagramDefinition.getDiagramCaption(), isCommunityGrouping);
8889
}
8990

90-
public void buildDiagramChart(String title, boolean isCampaignGrouping) {
91+
public void buildDiagramChart(String title, boolean isCommunityGrouping) {
9192
final StringBuilder hcjs = new StringBuilder();
9293

9394
//@formatter:off
@@ -174,7 +175,14 @@ public void buildDiagramChart(String title, boolean isCampaignGrouping) {
174175
}
175176

176177
hcjs.append("series: [");
177-
List<String> noPopulationLocations = new LinkedList<>();
178+
noPopulationDataLocations.clear();
179+
if (Objects.nonNull(totalValuesMap)) {
180+
for (Object key : axisCaptions.keySet()) {
181+
if ((Double.valueOf(0)).equals(totalValuesMap.get(new CampaignDashboardTotalsReference(key, null)))) {
182+
noPopulationDataLocations.add(axisCaptions.get(key));
183+
}
184+
}
185+
}
178186
for (CampaignDiagramSeries series : diagramDefinition.getCampaignDiagramSeries()) {
179187
String seriesKey = series.getFormId() + series.getFieldId();
180188
if (!diagramDataBySeriesAndXAxis.containsKey(seriesKey))
@@ -183,12 +191,19 @@ public void buildDiagramChart(String title, boolean isCampaignGrouping) {
183191
Map<Object, CampaignDiagramDataDto> seriesData = diagramDataBySeriesAndXAxis.get(seriesKey);
184192
Collection<CampaignDiagramDataDto> values = seriesData.values();
185193
Iterator<CampaignDiagramDataDto> iterator = values.iterator();
186-
String fieldName;
187-
if (Objects.nonNull(populationGroupDiagramTitle)) {
188-
fieldName = populationGroupDiagramTitle;
189-
} else {
190-
fieldName = iterator.hasNext() ? iterator.next().getFieldCaption() : seriesKey;
194+
String fieldName = (iterator.hasNext() ? iterator.next().getFieldCaption() : seriesKey);
195+
if (showPercentages) {
196+
if (isCommunityGrouping) {
197+
fieldName = I18nProperties.getString(Strings.populationDataByCommunity);
198+
} /*
199+
* else if (!noPopulationLocations.isEmpty()) {
200+
* fieldName = fieldName
201+
* + ("<br/>" + String
202+
* .format(I18nProperties.getString(Strings.errorNoPopulationDataLocations), String.join(",", noPopulationLocations)));
203+
* }
204+
*/
191205
}
206+
192207
hcjs.append("{ name:'").append(StringEscapeUtils.escapeEcmaScript(fieldName)).append("', data: [");
193208
for (Object axisKey : axisKeys) {
194209
if (seriesData.containsKey(axisKey)) {
@@ -198,9 +213,7 @@ public void buildDiagramChart(String title, boolean isCampaignGrouping) {
198213
seriesData.get(axisKey).getGroupingKey(),
199214
totalValuesWithoutStacks ? null : series.getStack()));
200215
if (totalValue == null) {
201-
if (isCampaignGrouping) {
202-
Notification.show(String.format(I18nProperties.getString(Strings.populationDataByCommunity)), ERROR_MESSAGE);
203-
} else {
216+
if (!isCommunityGrouping) {
204217
Notification.show(
205218
String.format(
206219
I18nProperties.getString(Strings.errorCampaignDiagramTotalsCalculationError),
@@ -216,9 +229,6 @@ public void buildDiagramChart(String title, boolean isCampaignGrouping) {
216229
} else {
217230
hcjs.append("0,");
218231
}
219-
if ((Double.valueOf(0)).equals(totalValue)) {
220-
noPopulationLocations.add(seriesData.get(axisKey).getGroupingCaption());
221-
}
222232
} else {
223233
hcjs.append(seriesData.get(axisKey).getValueSum().toString()).append(",");
224234
}
@@ -234,13 +244,6 @@ public void buildDiagramChart(String title, boolean isCampaignGrouping) {
234244
}
235245
hcjs.append("]");
236246
hcjs.append("}");
237-
if (!noPopulationLocations.isEmpty() && showPercentages)
238-
239-
{
240-
Notification.show(
241-
String.format(I18nProperties.getString(Strings.errorNoPopulationDataLocations), String.join(",", noPopulationLocations)),
242-
ERROR_MESSAGE);
243-
}
244247
campaignColumnChart.setHcjs(hcjs.toString());
245248
}
246249

@@ -251,4 +254,12 @@ public boolean isShowPercentages() {
251254
public void setShowPercentages(boolean showPercentages) {
252255
this.showPercentages = showPercentages;
253256
}
257+
258+
public List<String> getNoPopulationDataLocations() {
259+
return noPopulationDataLocations;
260+
}
261+
262+
public void setNoPopulationDataLocations(List<String> noPopulationDataLocations) {
263+
this.noPopulationDataLocations = noPopulationDataLocations;
264+
}
254265
}

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

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import java.util.UUID;
88
import java.util.stream.Collectors;
99

10+
import com.vaadin.ui.Alignment;
11+
import com.vaadin.ui.Label;
1012
import org.apache.commons.collections.CollectionUtils;
1113
import org.apache.commons.lang3.StringUtils;
1214

@@ -181,32 +183,19 @@ private void refreshDiagrams(Page page, VerticalLayout layout, String tabId, Str
181183
gridTemplateAreaCreator.getGridRows(),
182184
gridTemplateAreaCreator.getGridColumns()));
183185
diagramsLayout.setStyleName(gridCssClass);
186+
Label noPopulationLocationsLabel = new Label();
187+
VerticalLayout locationLayout = new VerticalLayout();
184188

185189
campaignFormDataMap.forEach((campaignDashboardDiagramDto, diagramData) -> {
186190
final CampaignDiagramDefinitionDto campaignDiagramDefinitionDto = campaignDashboardDiagramDto.getCampaignDiagramDefinitionDto();
187191
final String diagramId = campaignDiagramDefinitionDto.getDiagramId();
188192
final String diagramCssClass = diagramId + generateRandomString();
189-
String diagramTitle = null;
190-
List<CampaignDiagramSeries> campaignSeriesTotal = campaignDiagramDefinitionDto.getCampaignSeriesTotal();
191-
if (!CollectionUtils.isEmpty(campaignSeriesTotal) && campaignDiagramDefinitionDto.isPercentageDefault()) {
192-
if (campaignSeriesTotal.stream().filter(e -> Objects.nonNull(e.getPopulationGroup())).findAny().isPresent()) {
193-
if (Objects.isNull(dataProvider.getArea())) {
194-
diagramTitle = I18nProperties.getString(Strings.populationDataByArea);
195-
} else if (Objects.isNull(dataProvider.getRegion())) {
196-
diagramTitle = I18nProperties.getString(Strings.populationDataByRegion);
197-
} else if (Objects.isNull(dataProvider.getDistrict())) {
198-
diagramTitle = I18nProperties.getString(Strings.populationDataByDistrict);
199-
} else {
200-
diagramTitle = I18nProperties.getString(Strings.populationDataByCommunity);
201-
}
202-
}
203-
}
193+
204194
final CampaignDashboardDiagramComponent diagramComponent = new CampaignDashboardDiagramComponent(
205195
campaignDiagramDefinitionDto,
206196
diagramData,
207197
dataProvider.getCampaignFormTotalsMap().get(campaignDashboardDiagramDto),
208198
campaignDiagramDefinitionDto.isPercentageDefault(),
209-
diagramTitle,
210199
Objects.nonNull(dataProvider.getDistrict()));
211200
styles.add(createDiagramStyle(diagramCssClass, diagramId));
212201
diagramComponent.setStyleName(diagramCssClass);
@@ -219,6 +208,20 @@ private void refreshDiagrams(Page page, VerticalLayout layout, String tabId, Str
219208
diagramComponent
220209
.buildDiagramChart(campaignDiagramDefinitionDto.getDiagramCaption(), Objects.nonNull(dataProvider.getDistrict()));
221210
diagramsLayout.addComponent(diagramComponent, index);
211+
if (diagramComponent.isShowPercentages()) {
212+
if (!diagramComponent.getNoPopulationDataLocations().isEmpty()) {
213+
214+
noPopulationLocationsLabel.setValue(
215+
String.format(
216+
I18nProperties.getString(Strings.errorNoPopulationDataLocations),
217+
String.join(",", diagramComponent.getNoPopulationDataLocations())));
218+
locationLayout.addComponent(noPopulationLocationsLabel);
219+
locationLayout.setComponentAlignment(noPopulationLocationsLabel, Alignment.MIDDLE_CENTER);
220+
diagramsLayout.addComponent(locationLayout);
221+
}
222+
} else {
223+
locationLayout.removeComponent(noPopulationLocationsLabel);
224+
}
222225
});
223226

224227
diagramsLayout.addComponent(diagramComponent);

sormas-ui/src/main/resources/de/symeda/sormas/ui/highcharts/highcharts-export-data.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)