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

Commit 0677975

Browse files
authored
Merge pull request SORMAS-Foundation#3040 from hzi-braunschweig/feature-2855-ExtendCampaignForm
Feature 2855 extend campaign form
2 parents ebd4557 + caff6a8 commit 0677975

20 files changed

Lines changed: 700 additions & 32 deletions

File tree

sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignDto.java

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

33
import java.util.Date;
4+
import java.util.List;
5+
import java.util.Set;
46

57
import de.symeda.sormas.api.EntityDto;
8+
import de.symeda.sormas.api.campaign.diagram.CampaignDashboardElement;
9+
import de.symeda.sormas.api.campaign.form.CampaignFormMetaReferenceDto;
610
import de.symeda.sormas.api.user.UserReferenceDto;
711
import de.symeda.sormas.api.utils.DataHelper;
812

@@ -23,6 +27,8 @@ public class CampaignDto extends EntityDto {
2327
private Date startDate;
2428
private Date endDate;
2529
private UserReferenceDto creatingUser;
30+
private Set<CampaignFormMetaReferenceDto> campaignFormMetas;
31+
private List<CampaignDashboardElement> campaignDashboardElements;
2632

2733
public static CampaignDto build() {
2834
CampaignDto campaign = new CampaignDto();
@@ -69,4 +75,20 @@ public UserReferenceDto getCreatingUser() {
6975
public void setCreatingUser(UserReferenceDto creatingUser) {
7076
this.creatingUser = creatingUser;
7177
}
78+
79+
public Set<CampaignFormMetaReferenceDto> getCampaignFormMetas() {
80+
return campaignFormMetas;
81+
}
82+
83+
public void setCampaignFormMetas(Set<CampaignFormMetaReferenceDto> campaignFormMetas) {
84+
this.campaignFormMetas = campaignFormMetas;
85+
}
86+
87+
public List<CampaignDashboardElement> getCampaignDashboardElements() {
88+
return campaignDashboardElements;
89+
}
90+
91+
public void setCampaignDashboardElements(List<CampaignDashboardElement> campaignDashboardElements) {
92+
this.campaignDashboardElements = campaignDashboardElements;
93+
}
7294
}

sormas-api/src/main/java/de/symeda/sormas/api/campaign/CampaignFacade.java

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

3-
import de.symeda.sormas.api.campaign.diagram.CampaignDashboardElement;
4-
import de.symeda.sormas.api.utils.SortProperty;
3+
import java.util.List;
54

65
import javax.ejb.Remote;
7-
import java.util.List;
6+
7+
import de.symeda.sormas.api.campaign.diagram.CampaignDashboardElement;
8+
import de.symeda.sormas.api.utils.SortProperty;
89

910
@Remote
1011
public interface CampaignFacade {
@@ -28,4 +29,8 @@ public interface CampaignFacade {
2829
void deleteCampaign(String uuid);
2930

3031
void archiveOrDearchiveCampaign(String campaignUuid, boolean archive);
32+
33+
CampaignReferenceDto getReferenceByUuid(String uuid);
34+
35+
boolean exists(String uuid);
3136
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,18 @@ public interface Captions {
139139
String Campaign_name = "Campaign.name";
140140
String Campaign_startDate = "Campaign.startDate";
141141
String campaignActiveCampaigns = "campaignActiveCampaigns";
142+
String campaignAdditionalChart = "campaignAdditionalChart";
143+
String campaignAdditionalForm = "campaignAdditionalForm";
142144
String campaignAllCampaigns = "campaignAllCampaigns";
143145
String campaignArchivedCampaigns = "campaignArchivedCampaigns";
144146
String campaignCampaignData = "campaignCampaignData";
145147
String campaignCampaignDataForm = "campaignCampaignDataForm";
146148
String campaignCampaignForm = "campaignCampaignForm";
149+
String campaignDashboardChart = "campaignDashboardChart";
150+
String campaignDashboardChartHeight = "campaignDashboardChartHeight";
151+
String campaignDashboardChartWidth = "campaignDashboardChartWidth";
152+
String campaignDashboardOrder = "campaignDashboardOrder";
153+
String campaignDashboardTabName = "campaignDashboardTabName";
147154
String CampaignFormData_campaign = "CampaignFormData.campaign";
148155
String CampaignFormData_campaignFormMeta = "CampaignFormData.campaignFormMeta";
149156
String CampaignFormData_formDate = "CampaignFormData.formDate";
@@ -1184,6 +1191,7 @@ public interface Captions {
11841191
String regionAllRegions = "regionAllRegions";
11851192
String regionArchivedRegions = "regionArchivedRegions";
11861193
String regionName = "regionName";
1194+
String remove = "remove";
11871195
String Sample = "Sample";
11881196
String Sample_additionalTestingRequested = "Sample.additionalTestingRequested";
11891197
String Sample_associatedCase = "Sample.associatedCase";

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ public interface Strings {
104104
String confirmationMergeCaseAndDeleteOther = "confirmationMergeCaseAndDeleteOther";
105105
String confirmationPickCaseAndDeleteOther = "confirmationPickCaseAndDeleteOther";
106106
String confirmationReduceQuarantine = "confirmationReduceQuarantine";
107+
String confirmationRemoveGridRowCancel = "confirmationRemoveGridRowCancel";
108+
String confirmationRemoveGridRowConfirm = "confirmationRemoveGridRowConfirm";
109+
String confirmationRemoveGridRowMessage = "confirmationRemoveGridRowMessage";
110+
String confirmationRemoveGridRowTitle = "confirmationRemoveGridRowTitle";
107111
String confirmationRemoveUserAsOfficer = "confirmationRemoveUserAsOfficer";
108112
String confirmationUpdateCompleteness = "confirmationUpdateCompleteness";
109113
String confirmNetworkDiagramTooManyContacts = "confirmNetworkDiagramTooManyContacts";
@@ -185,6 +189,8 @@ public interface Strings {
185189
String headingArchiveCase = "headingArchiveCase";
186190
String headingArchiveEvent = "headingArchiveEvent";
187191
String headingArchivingNotPossible = "headingArchivingNotPossible";
192+
String headingCampaignBasics = "headingCampaignBasics";
193+
String headingCampaignDashboard = "headingCampaignDashboard";
188194
String headingCampaignData = "headingCampaignData";
189195
String headingCaseComparison = "headingCaseComparison";
190196
String headingCaseData = "headingCaseData";
@@ -468,6 +474,7 @@ public interface Strings {
468474
String infoStatisticsFilter = "infoStatisticsFilter";
469475
String infoStatisticsResults = "infoStatisticsResults";
470476
String infoSurveillanceDashboard = "infoSurveillanceDashboard";
477+
String infoUsageOfEditableCampaignGrids = "infoUsageOfEditableCampaignGrids";
471478
String infoUserEmail = "infoUserEmail";
472479
String infoUserPhoneNumber = "infoUserPhoneNumber";
473480
String infoWeeklyReportsView = "infoWeeklyReportsView";

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public interface Validations {
1414
String afterDateSoft = "afterDateSoft";
1515
String beforeDate = "beforeDate";
1616
String beforeDateSoft = "beforeDateSoft";
17+
String campaignDashboardChartPercentage = "campaignDashboardChartPercentage";
1718
String campaignFormDependingOnNotFound = "campaignFormDependingOnNotFound";
1819
String campaignFormDependingOnValuesMissing = "campaignFormDependingOnValuesMissing";
1920
String campaignFormElementDuplicateId = "campaignFormElementDuplicateId";

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ inaccessibleValue=Confidential
5252
numberOfCharacters=Number of characters: %d / %d
5353
facility=Facility
5454
pointOfEntry=Point of entry
55+
remove=Remove
5556

5657
# About
5758
aboutSormasVersion=SORMAS Version
@@ -195,6 +196,13 @@ campaignCampaignData=Campaign Data
195196
campaignCampaignDataForm=Data Form
196197
campaignCampaignForm=Form
197198
campaignValidateForms=Validate Forms
199+
campaignAdditionalForm=Add form
200+
campaignAdditionalChart=Add chart
201+
campaignDashboardChart=Campaign data chart
202+
campaignDashboardTabName=Tab name
203+
campaignDashboardChartWidth=Width in %
204+
campaignDashboardChartHeight=Height in %
205+
campaignDashboardOrder=Order
198206

199207
Campaign=Campaign
200208
Campaign.name=Name

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@ confirmationRemoveUserAsOfficer = The user roles of this user have changed. Savi
167167
confirmationExtendQuarantine=Are you sure you want to extend the quarantine?
168168
confirmationReduceQuarantine=Are you sure you want to reduce the quarantine?
169169
confirmationExtendFollowUp=Would you also want the follow-up period to be extended accordingly?
170+
confirmationRemoveGridRowTitle=Confirm remove
171+
confirmationRemoveGridRowMessage=Are you sure you want to remove this row?
172+
confirmationRemoveGridRowConfirm=Yes
173+
confirmationRemoveGridRowCancel=No
170174
# Entities
171175
entityAction=Action
172176
entityActions=Actions
@@ -234,7 +238,9 @@ headingAnimalContacts = Animal Contacts
234238
headingArchiveCampaign = Archive Campaign
235239
headingArchiveCase = Archive case
236240
headingArchiveEvent = Archive event
241+
headingCampaignBasics = Campaign basics
237242
headingCampaignData = Campaign data
243+
headingCampaignDashboard = Campaign dashboard
238244
headingCaseData = Case data
239245
headingCaseImport = Case Import
240246
headingPointOfEntryImport = Point of Entry Import
@@ -523,6 +529,7 @@ infoContactsViewRegionDistrictFilter = When you select a region and/or district
523529
infoDeveloperOptions = You can use the controls below to generate dummy cases and contacts based on the selected restraints. Please note that generating a lot of data at once might take some time.
524530
infoCreateNewSampleDiscardsChanges = Creating a new sample will discard all unsaved changes made to this case
525531
infoCreateNewSampleDiscardsChangesEventParticipant = Creating a new sample will discard all unsaved changes made to this event participant
532+
infoUsageOfEditableCampaignGrids = You can edit the campaign data and dashboard definitions by clicking inside one of the cells in the grid, and you can reorder the dashboard elements by dragging and dropping the grid rows
526533

527534
# Messages
528535
messageActivateAccount = Account has to be activated

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ campaignFormTranslationLanguageCodeRequired = All translations must specify a la
109109
campaignFormElementDuplicateId = Field IDs need to be unique, but the campaign form contains at least two fields with ID %s.
110110
errorsInForm = There are errors in the form you tried to save. Please check the fields highlighted in red and make sure to only enter valid values.
111111
campaignFormInvalidIdInListElements = The ID %s in the campaign form list definition is not associated to any element of the form.
112+
campaignDashboardChartPercentage = Value must be a number that is multiple of 5!
112113
sormasToSormasCaseExists=This case already exists
113114
sormasToSormasContactExists=This contact already exists
114115
sormasToSormasContactCaseNotExists=The linked case does not exist

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

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

3-
import de.symeda.auditlog.api.Audited;
4-
import de.symeda.auditlog.api.AuditedIgnore;
5-
import de.symeda.sormas.api.campaign.diagram.CampaignDashboardElement;
6-
import de.symeda.sormas.backend.common.CoreAdo;
7-
import de.symeda.sormas.backend.user.User;
8-
import org.hibernate.annotations.Type;
3+
import java.util.Date;
4+
import java.util.HashSet;
5+
import java.util.List;
6+
import java.util.Set;
97

108
import javax.persistence.Column;
119
import javax.persistence.Entity;
10+
import javax.persistence.FetchType;
1211
import javax.persistence.JoinColumn;
12+
import javax.persistence.JoinTable;
13+
import javax.persistence.ManyToMany;
1314
import javax.persistence.ManyToOne;
1415
import javax.persistence.Temporal;
1516
import javax.persistence.TemporalType;
16-
import java.util.Date;
17-
import java.util.List;
17+
18+
import org.hibernate.annotations.Type;
19+
20+
import de.symeda.auditlog.api.Audited;
21+
import de.symeda.auditlog.api.AuditedIgnore;
22+
import de.symeda.sormas.api.campaign.diagram.CampaignDashboardElement;
23+
import de.symeda.sormas.backend.campaign.form.CampaignFormMeta;
24+
import de.symeda.sormas.backend.common.CoreAdo;
25+
import de.symeda.sormas.backend.user.User;
1826

1927
@Entity(name = "campaigns")
2028
@Audited
@@ -23,6 +31,7 @@ public class Campaign extends CoreAdo {
2331
private static final long serialVersionUID = -2744033662114826543L;
2432

2533
public static final String TABLE_NAME = "campaigns";
34+
public static final String CAMPAIGN_CAMPAIGNFORMMETA_TABLE_NAME = "campaign_campaignformmeta";
2635

2736
public static final String NAME = "name";
2837
public static final String DESCRIPTION = "description";
@@ -38,6 +47,7 @@ public class Campaign extends CoreAdo {
3847
private User creatingUser;
3948
private boolean archived;
4049
private List<CampaignDashboardElement> dashboardElements;
50+
private Set<CampaignFormMeta> campaignFormMetas = new HashSet<>();
4151

4252
@Column(length = 255)
4353
public String getName() {
@@ -109,4 +119,17 @@ public List<CampaignDashboardElement> getDashboardElements() {
109119
public void setDashboardElements(List<CampaignDashboardElement> dashboardElements) {
110120
this.dashboardElements = dashboardElements;
111121
}
122+
123+
@AuditedIgnore
124+
@ManyToMany(fetch = FetchType.LAZY)
125+
@JoinTable(name = CAMPAIGN_CAMPAIGNFORMMETA_TABLE_NAME,
126+
joinColumns = @JoinColumn(name = "campaign_id"),
127+
inverseJoinColumns = @JoinColumn(name = "campaignformmeta_id"))
128+
public Set<CampaignFormMeta> getCampaignFormMetas() {
129+
return campaignFormMetas;
130+
}
131+
132+
public void setCampaignFormMetas(Set<CampaignFormMeta> campaignFormMetas) {
133+
this.campaignFormMetas = campaignFormMetas;
134+
}
112135
}

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

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import java.sql.Timestamp;
44
import java.util.ArrayList;
5+
import java.util.Comparator;
56
import java.util.Date;
67
import java.util.List;
8+
import java.util.Set;
79
import java.util.stream.Collectors;
810

911
import javax.ejb.EJB;
@@ -20,17 +22,21 @@
2022
import javax.persistence.criteria.Root;
2123
import javax.validation.constraints.NotNull;
2224

25+
import org.apache.commons.collections.CollectionUtils;
26+
2327
import de.symeda.sormas.api.campaign.CampaignCriteria;
2428
import de.symeda.sormas.api.campaign.CampaignDto;
2529
import de.symeda.sormas.api.campaign.CampaignFacade;
2630
import de.symeda.sormas.api.campaign.CampaignIndexDto;
2731
import de.symeda.sormas.api.campaign.CampaignReferenceDto;
2832
import de.symeda.sormas.api.campaign.diagram.CampaignDashboardElement;
33+
import de.symeda.sormas.api.campaign.form.CampaignFormMetaReferenceDto;
2934
import de.symeda.sormas.api.i18n.I18nProperties;
3035
import de.symeda.sormas.api.i18n.Strings;
3136
import de.symeda.sormas.api.user.UserRight;
3237
import de.symeda.sormas.api.user.UserRole;
3338
import de.symeda.sormas.api.utils.SortProperty;
39+
import de.symeda.sormas.backend.campaign.form.CampaignFormMetaService;
3440
import de.symeda.sormas.backend.common.AbstractAdoService;
3541
import de.symeda.sormas.backend.common.AbstractDomainObject;
3642
import de.symeda.sormas.backend.user.User;
@@ -49,6 +55,8 @@ public class CampaignFacadeEjb implements CampaignFacade {
4955
@EJB
5056
private CampaignService campaignService;
5157
@EJB
58+
private CampaignFormMetaService campaignFormMetaService;
59+
@EJB
5260
private UserService userService;
5361
@EJB
5462
private UserRoleConfigFacadeEjbLocal userRoleConfigFacade;
@@ -164,11 +172,19 @@ public Campaign fromDto(@NotNull CampaignDto source) {
164172
target.setEndDate(source.getEndDate());
165173
target.setName(source.getName());
166174
target.setStartDate(source.getStartDate());
175+
final Set<CampaignFormMetaReferenceDto> campaignFormMetas = source.getCampaignFormMetas();
176+
if (!CollectionUtils.isEmpty(campaignFormMetas)) {
177+
target.setCampaignFormMetas(
178+
campaignFormMetas.stream()
179+
.map(campaignFormMetaReferenceDto -> campaignFormMetaService.getByUuid(campaignFormMetaReferenceDto.getUuid()))
180+
.collect(Collectors.toSet()));
181+
}
182+
target.setDashboardElements(source.getCampaignDashboardElements());
167183

168184
return target;
169185
}
170186

171-
public static CampaignDto toDto(Campaign source) {
187+
public CampaignDto toDto(Campaign source) {
172188

173189
if (source == null) {
174190
return null;
@@ -182,6 +198,9 @@ public static CampaignDto toDto(Campaign source) {
182198
target.setEndDate(source.getEndDate());
183199
target.setName(source.getName());
184200
target.setStartDate(source.getStartDate());
201+
target.setCampaignFormMetas(
202+
source.getCampaignFormMetas().stream().map(campaignFormMeta -> campaignFormMeta.toReference()).collect(Collectors.toSet()));
203+
target.setCampaignDashboardElements(source.getDashboardElements());
185204

186205
return target;
187206
}
@@ -206,7 +225,7 @@ public List<CampaignDashboardElement> getCampaignDashboardElements(String campai
206225
}
207226
});
208227
}
209-
return result;
228+
return result.stream().sorted(Comparator.comparingInt(CampaignDashboardElement::getOrder)).collect(Collectors.toList());
210229
}
211230

212231
@Override
@@ -247,6 +266,16 @@ public void archiveOrDearchiveCampaign(String campaignUuid, boolean archive) {
247266
campaignService.ensurePersisted(campaign);
248267
}
249268

269+
@Override
270+
public CampaignReferenceDto getReferenceByUuid(String uuid) {
271+
return toReferenceDto(campaignService.getByUuid(uuid));
272+
}
273+
274+
@Override
275+
public boolean exists(String uuid) {
276+
return campaignService.exists(uuid);
277+
}
278+
250279
public static CampaignReferenceDto toReferenceDto(Campaign entity) {
251280
if (entity == null) {
252281
return null;

0 commit comments

Comments
 (0)