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

Commit 6deed0e

Browse files
author
barnabartha
committed
SORMAS-Foundation#3368 - add sub tab id to the CampaignDashboardElement
1 parent c9e8f60 commit 6deed0e

8 files changed

Lines changed: 147 additions & 8 deletions

File tree

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
package de.symeda.sormas.api.campaign.diagram;
22

33
import java.io.Serializable;
4-
import java.util.Objects;
54

65
public class CampaignDashboardElement implements Serializable {
76

87
public static String DIAGRAM_ID = "diagramId";
98
public static String TAB_ID = "tabId";
9+
public static String SUB_TAB_ID = "subTabId";
1010
public static String ORDER = "order";
1111
public static String WIDTH = "width";
1212
public static String HEIGHT = "height";
1313

1414
private String diagramId;
1515
private String tabId;
16+
private String subTabId;
1617
private Integer order;
1718
private Integer width;
1819
private Integer height;
@@ -28,6 +29,11 @@ public CampaignDashboardElement(String diagramId, String tabId, Integer order, I
2829
this.height = height;
2930
}
3031

32+
public CampaignDashboardElement(String diagramId, String tabId, String subTabId, Integer order, Integer width, Integer height) {
33+
this(diagramId, tabId, order, width, height);
34+
this.subTabId = subTabId;
35+
}
36+
3137
public String getDiagramId() {
3238
return diagramId;
3339
}
@@ -44,6 +50,14 @@ public void setTabId(String tabId) {
4450
this.tabId = tabId;
4551
}
4652

53+
public String getSubTabId() {
54+
return subTabId;
55+
}
56+
57+
public void setSubTabId(String subTabId) {
58+
this.subTabId = subTabId;
59+
}
60+
4761
public Integer getOrder() {
4862
return order;
4963
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package de.symeda.sormas.api.campaign.diagram;
22

33
import de.symeda.sormas.api.EntityDto;
4+
import de.symeda.sormas.api.campaign.CampaignDto;
5+
import de.symeda.sormas.api.utils.DataHelper;
46

57
import java.util.List;
68

@@ -13,6 +15,12 @@ public class CampaignDiagramDefinitionDto extends EntityDto {
1315
private List<CampaignDiagramSeries> campaignSeriesTotal;
1416
private boolean percentageDefault;
1517

18+
public static CampaignDiagramDefinitionDto build() {
19+
CampaignDiagramDefinitionDto campaignDiagramDefinition = new CampaignDiagramDefinitionDto();
20+
campaignDiagramDefinition.setUuid(DataHelper.createUuid());
21+
return campaignDiagramDefinition;
22+
}
23+
1624
public String getDiagramId() {
1725
return diagramId;
1826
}

sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ public interface Captions {
157157
String campaignDashboardChartHeight = "campaignDashboardChartHeight";
158158
String campaignDashboardChartWidth = "campaignDashboardChartWidth";
159159
String campaignDashboardOrder = "campaignDashboardOrder";
160+
String campaignDashboardSubTabName = "campaignDashboardSubTabName";
160161
String campaignDashboardTabName = "campaignDashboardTabName";
161162
String CampaignFormData_area = "CampaignFormData.area";
162163
String CampaignFormData_campaign = "CampaignFormData.campaign";

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ campaignAdditionalForm=Add form
201201
campaignAdditionalChart=Add chart
202202
campaignDashboardChart=Campaign data chart
203203
campaignDashboardTabName=Tab name
204+
campaignDashboardSubTabName=Sub-tab name
204205
campaignDashboardChartWidth=Width in %
205206
campaignDashboardChartHeight=Height in %
206207
campaignDashboardOrder=Order

sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjb.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
import java.util.Collections;
66
import java.util.Comparator;
77
import java.util.Date;
8+
import java.util.HashMap;
89
import java.util.List;
10+
import java.util.Map;
911
import java.util.Set;
1012
import java.util.stream.Collectors;
1113

@@ -200,9 +202,17 @@ public void validate(CampaignReferenceDto campaignReferenceDto) {
200202
validate(getByUuid(campaignReferenceDto.getUuid()));
201203
}
202204

203-
private void validate(CampaignDto campaignDto) {
205+
protected void validate(CampaignDto campaignDto) {
204206
final List<CampaignDashboardElement> campaignDashboardElements = campaignDto.getCampaignDashboardElements();
205207
if (campaignDashboardElements != null) {
208+
209+
final Map<String, Boolean> oneSubTabIsNotNullOrEmptyMap = new HashMap<>();
210+
campaignDashboardElements.stream().forEach(cde -> {
211+
if (!oneSubTabIsNotNullOrEmptyMap.containsKey(cde.getTabId())){
212+
oneSubTabIsNotNullOrEmptyMap.put(cde.getTabId(), false);
213+
}
214+
});
215+
206216
for (CampaignDashboardElement cde : campaignDashboardElements) {
207217
final String diagramId = cde.getDiagramId();
208218
if (diagramId == null) {
@@ -212,8 +222,8 @@ private void validate(CampaignDto campaignDto) {
212222
CampaignDashboardElement.DIAGRAM_ID,
213223
campaignDto.getName()));
214224
} else if (!campaignDiagramDefinitionFacade.exists(diagramId)) {
215-
throw new ValidationRuntimeException(
216-
I18nProperties.getValidationError(Validations.campaignDashboardChartIdDoesNotExist, diagramId, campaignDto.getName()));
225+
throw new ValidationRuntimeException(
226+
I18nProperties.getValidationError(Validations.campaignDashboardChartIdDoesNotExist, diagramId, campaignDto.getName()));
217227
}
218228

219229
if (cde.getTabId() == null) {
@@ -222,6 +232,18 @@ private void validate(CampaignDto campaignDto) {
222232
.getValidationError(Validations.campaignDashboardChartValueNull, CampaignDashboardElement.TAB_ID, campaignDto.getName()));
223233
}
224234

235+
if (cde.getSubTabId() == null || cde.getSubTabId().isEmpty()) {
236+
if (oneSubTabIsNotNullOrEmptyMap.get(cde.getTabId())) {
237+
throw new ValidationRuntimeException(
238+
I18nProperties.getValidationError(
239+
Validations.campaignDashboardChartValueNull,
240+
CampaignDashboardElement.SUB_TAB_ID,
241+
campaignDto.getName()));
242+
}
243+
} else {
244+
oneSubTabIsNotNullOrEmptyMap.put(cde.getTabId(), true);
245+
}
246+
225247
if (cde.getOrder() == null) {
226248
throw new ValidationRuntimeException(
227249
I18nProperties
@@ -292,6 +314,9 @@ public List<CampaignDashboardElement> getCampaignDashboardElements(String campai
292314
if (cde.getTabId() == null) {
293315
cde.setTabId(StringUtils.EMPTY);
294316
}
317+
if (cde.getSubTabId() == null) {
318+
cde.setSubTabId(StringUtils.EMPTY);
319+
}
295320
if (cde.getOrder() == null) {
296321
cde.setOrder(0);
297322
}

sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@
3737
import de.symeda.sormas.api.campaign.CampaignReferenceDto;
3838
import de.symeda.sormas.api.campaign.data.CampaignFormDataDto;
3939
import de.symeda.sormas.api.campaign.data.CampaignFormDataEntry;
40+
import de.symeda.sormas.api.campaign.diagram.CampaignDiagramDefinitionDto;
41+
import de.symeda.sormas.api.campaign.diagram.DiagramType;
4042
import de.symeda.sormas.api.campaign.form.CampaignFormMetaDto;
4143
import de.symeda.sormas.api.campaign.form.CampaignFormMetaReferenceDto;
4244
import de.symeda.sormas.api.caze.CaseClassification;
@@ -975,6 +977,15 @@ public CampaignDto createCampaign(UserDto user) {
975977
return campaign;
976978
}
977979

980+
public CampaignDiagramDefinitionDto createCampaignDiagramDefinition(String diagramId, String diagramCaption){
981+
CampaignDiagramDefinitionDto campaignDiagramDefinition = CampaignDiagramDefinitionDto.build();
982+
campaignDiagramDefinition.setDiagramType(DiagramType.COLUMN);
983+
campaignDiagramDefinition.setDiagramId(diagramId);
984+
campaignDiagramDefinition.setDiagramCaption(diagramCaption);
985+
986+
return campaignDiagramDefinition;
987+
}
988+
978989
public CampaignFormMetaDto createCampaignForm(CampaignDto campaign) throws IOException {
979990

980991
CampaignFormMetaDto campaignForm;

sormas-backend/src/test/java/de/symeda/sormas/backend/campaign/CampaignFacadeEjbTest.java

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
11
package de.symeda.sormas.backend.campaign;
22

3+
import java.util.ArrayList;
34
import java.util.Date;
4-
import java.util.List;
55

6-
import de.symeda.sormas.backend.MockProducer;
76
import org.junit.Assert;
87
import org.junit.Test;
98

109
import de.symeda.sormas.api.campaign.CampaignDto;
1110
import de.symeda.sormas.api.campaign.CampaignReferenceDto;
11+
import de.symeda.sormas.api.campaign.diagram.CampaignDashboardElement;
1212
import de.symeda.sormas.api.user.UserDto;
1313
import de.symeda.sormas.api.user.UserRole;
14+
import de.symeda.sormas.api.utils.ValidationRuntimeException;
1415
import de.symeda.sormas.backend.AbstractBeanTest;
1516
import de.symeda.sormas.backend.TestDataCreator;
1617

17-
import static org.mockito.Mockito.when;
18-
1918
public class CampaignFacadeEjbTest extends AbstractBeanTest {
2019

2120
public static final int ONE_DAY_IN_MILLIS = 24 * 60 * 60 * 1000;
@@ -38,4 +37,66 @@ public void testGetLastStartedCampaign() {
3837
CampaignReferenceDto lastStartedCampaign = getCampaignFacade().getLastStartedCampaign();
3938
Assert.assertEquals(campaign2.getUuid(), lastStartedCampaign.getUuid());
4039
}
40+
41+
@Test
42+
public void testCampaignDashboardElementsValidation() {
43+
44+
final TestDataCreator.RDCF rdcf = creator.createRDCF("Region", "District", "Community", "Facility");
45+
final UserDto user = creator.createUser(rdcf, UserRole.SURVEILLANCE_SUPERVISOR);
46+
47+
final CampaignDto campaign = creator.createCampaign(user);
48+
final ArrayList<CampaignDashboardElement> campaignDashboardElements = new ArrayList<>();
49+
campaignDashboardElements.add(new CampaignDashboardElement("diagram1", "tab1", null, 1, 50, 50));
50+
campaignDashboardElements.add(new CampaignDashboardElement("diagram2", "tab1", null, 1, 50, 50));
51+
campaignDashboardElements.add(new CampaignDashboardElement("diagram3", "tab2", null, 1, 50, 50));
52+
campaign.setCampaignDashboardElements(campaignDashboardElements);
53+
54+
getCampaignDiagramDefinitionFacade().save(creator.createCampaignDiagramDefinition("diagram1", "Diagram one"));
55+
getCampaignDiagramDefinitionFacade().save(creator.createCampaignDiagramDefinition("diagram2", "Diagram two"));
56+
getCampaignDiagramDefinitionFacade().save(creator.createCampaignDiagramDefinition("diagram3", "Diagram three"));
57+
58+
try {
59+
((CampaignFacadeEjb.CampaignFacadeEjbLocal) getCampaignFacade()).validate(campaign);
60+
} catch (ValidationRuntimeException e) {
61+
Assert.fail(e.getMessage());
62+
}
63+
64+
campaign.getCampaignDashboardElements().get(0).setSubTabId("subTab1");
65+
try {
66+
((CampaignFacadeEjb.CampaignFacadeEjbLocal) getCampaignFacade()).validate(campaign);
67+
} catch (ValidationRuntimeException e) {
68+
Assert.assertEquals("Campaign dashboard elements subTabId of campaign CampaignName are missing!", e.getMessage());
69+
}
70+
71+
campaign.getCampaignDashboardElements().get(0).setSubTabId(null);
72+
campaign.getCampaignDashboardElements().get(1).setSubTabId("subTab2");
73+
try {
74+
((CampaignFacadeEjb.CampaignFacadeEjbLocal) getCampaignFacade()).validate(campaign);
75+
} catch (ValidationRuntimeException e) {
76+
Assert.assertEquals("Campaign dashboard elements subTabId of campaign CampaignName are missing!", e.getMessage());
77+
}
78+
79+
campaign.getCampaignDashboardElements().get(0).setSubTabId("subTab1");
80+
campaign.getCampaignDashboardElements().get(1).setSubTabId("subTab2");
81+
campaign.getCampaignDashboardElements().get(2).setSubTabId("subTab3");
82+
try {
83+
((CampaignFacadeEjb.CampaignFacadeEjbLocal) getCampaignFacade()).validate(campaign);
84+
} catch (ValidationRuntimeException e) {
85+
Assert.fail(e.getMessage());
86+
}
87+
88+
campaign.getCampaignDashboardElements().get(2).setSubTabId(null);
89+
try {
90+
((CampaignFacadeEjb.CampaignFacadeEjbLocal) getCampaignFacade()).validate(campaign);
91+
} catch (ValidationRuntimeException e) {
92+
Assert.fail(e.getMessage());
93+
}
94+
95+
campaign.getCampaignDashboardElements().get(0).setDiagramId("nonExistingDiagramId");
96+
try {
97+
((CampaignFacadeEjb.CampaignFacadeEjbLocal) getCampaignFacade()).validate(campaign);
98+
} catch (ValidationRuntimeException e) {
99+
Assert.assertEquals("Diagram nonExistingDiagramId from campaign CampaignName does not exist!", e.getMessage());
100+
}
101+
}
41102
}

sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigns/CampaignDashboardElementsGridComponent.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,24 @@ protected Binder<CampaignDashboardElement> addColumnsBinder(List<CampaignDashboa
7777
.setCaption(I18nProperties.getCaption(Captions.campaignDashboardTabName));
7878
tabIdColumn.setEditorBinding(tabIdBind);
7979

80+
final List<String> existingSubTabIds = allElements.stream()
81+
.map(campaignDiagramDefinitionDto -> campaignDiagramDefinitionDto.getSubTabId())
82+
.filter(s -> StringUtils.isNotEmpty(s))
83+
.distinct()
84+
.collect(Collectors.toList());
85+
final ComboBox<String> subTabIdCombo = new ComboBox<>(Captions.campaignDashboardSubTabName, existingSubTabIds);
86+
87+
subTabIdCombo.setEmptySelectionAllowed(true);
88+
subTabIdCombo.setTextInputAllowed(true);
89+
subTabIdCombo.setNewItemProvider((ComboBox.NewItemProvider<String>) s -> Optional.of(s));
90+
91+
final Binder.Binding<CampaignDashboardElement, String> subTabIdBind =
92+
binder.bind(subTabIdCombo, CampaignDashboardElement::getSubTabId, CampaignDashboardElement::setSubTabId);
93+
final Grid.Column<CampaignDashboardElement, String> subTabIdColumn =
94+
grid.addColumn(campaignDashboardElement -> campaignDashboardElement.getSubTabId())
95+
.setCaption(I18nProperties.getCaption(Captions.campaignDashboardSubTabName));
96+
subTabIdColumn.setEditorBinding(subTabIdBind);
97+
8098
TextField width = new TextField(Captions.campaignDashboardChartWidth);
8199
Binder.Binding<CampaignDashboardElement, String> widthBind = binder.forField(width)
82100
.withValidator(percentValidator(), I18nProperties.getValidationError(Validations.campaignDashboardChartPercentage))

0 commit comments

Comments
 (0)