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

Commit 20c7ace

Browse files
Issue SORMAS-Foundation#3426 Adds import button in EventParticipantView
1 parent 6971b58 commit 20c7ace

10 files changed

Lines changed: 132 additions & 3 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ public interface Strings {
323323
String headingImportedCaseInfo = "headingImportedCaseInfo";
324324
String headingImportedPersonInfo = "headingImportedPersonInfo";
325325
String headingImportError = "headingImportError";
326+
String headingImportEventParticipant = "headingImportEventParticipant";
326327
String headingImportFacilities = "headingImportFacilities";
327328
String headingImportFailed = "headingImportFailed";
328329
String headingImportPointsOfEntry = "headingImportPointsOfEntry";

sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportFacade.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ public interface ImportFacade {
3333
*/
3434
void generateCaseImportTemplateFile() throws IOException;
3535

36+
void generateEventParticipantImportTemplateFile() throws IOException;
37+
3638
void generateCampaignFormImportTemplateFile(String campaignFormUuid) throws IOException;
3739

3840
void generateCaseContactImportTemplateFile() throws IOException;
@@ -57,6 +59,8 @@ public interface ImportFacade {
5759

5860
String getCaseImportTemplateFilePath();
5961

62+
String getEventParticipantImportTemplateFilePath();
63+
6064
String getCampaignFormImportTemplateFilePath();
6165

6266
String getPointOfEntryImportTemplateFilePath();

sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,15 @@ public enum UserRight {
686686
ADMIN,
687687
NATIONAL_USER
688688
),
689+
EVENTPARTICIPANT_IMPORT(
690+
ADMIN,
691+
NATIONAL_USER,
692+
SURVEILLANCE_SUPERVISOR,
693+
ADMIN_SUPERVISOR,
694+
SURVEILLANCE_OFFICER,
695+
EVENT_OFFICER,
696+
IMPORT_USER
697+
),
689698
WEEKLYREPORT_CREATE(
690699
HOSPITAL_INFORMANT,
691700
COMMUNITY_INFORMANT,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ headingImportCampaign = Import campaign form data
346346
headingImportCsvFile = Import CSV File
347347
headingImportDistricts = Import Districts
348348
headingImportError = Import error
349+
headingImportEventParticipant = Import event participants
349350
headingImportedCaseInfo = Imported Case Information
350351
headingImportedPersonInfo = Imported Person Information
351352
headingImportFailed = Import failed

sormas-api/src/main/resources/strings_fr-FR.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ headingImportCampaign = Importer les données du formulaire de campagne
346346
headingImportCsvFile = Importer un fichier CSV
347347
headingImportDistricts = Importer des départements
348348
headingImportError = Erreur d'import
349+
headingImportEventParticipant = Importer les participants de l'événement
349350
headingImportedCaseInfo = Informations de cas importées
350351
headingImportedPersonInfo = Informations de personne importées
351352
headingImportFailed = Importation échouée

sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,11 @@ private void createImportTemplateFiles() {
715715
} catch (IOException e) {
716716
logger.error("Could not create facility/laboratory import template .csv file.");
717717
}
718+
try {
719+
importFacade.generateEventParticipantImportTemplateFile();
720+
} catch (IOException e) {
721+
logger.error("Could not create eventparticipant import template .csv file.");
722+
}
718723
}
719724

720725
private void createMissingDiseaseConfigurations() {

sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportFacadeEjb.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
import de.symeda.sormas.api.caze.PlagueType;
8282
import de.symeda.sormas.api.caze.RabiesType;
8383
import de.symeda.sormas.api.contact.ContactDto;
84+
import de.symeda.sormas.api.event.EventParticipantDto;
8485
import de.symeda.sormas.api.facility.FacilityDto;
8586
import de.symeda.sormas.api.facility.FacilityReferenceDto;
8687
import de.symeda.sormas.api.facility.FacilityType;
@@ -129,6 +130,7 @@ public class ImportFacadeEjb implements ImportFacade {
129130
private CampaignFormMetaFacadeEjbLocal campaignFormMetaFacade;
130131

131132
private static final String CASE_IMPORT_TEMPLATE_FILE_NAME = ImportExportUtils.FILE_PREFIX + "_import_case_template.csv";
133+
private static final String EVENT_PARTICIPANT_IMPORT_TEMPLATE_FILE_NAME = ImportExportUtils.FILE_PREFIX + "_import_eventparticipant_template.csv";
132134
private static final String CASE_CONTACT_IMPORT_TEMPLATE_FILE_NAME = ImportExportUtils.FILE_PREFIX + "_import_case_contact_template.csv";
133135
private static final String CASE_LINE_LISTING_IMPORT_TEMPLATE_FILE_NAME = ImportExportUtils.FILE_PREFIX + "_import_line_listing_template.csv";
134136
private static final String POINT_OF_ENTRY_IMPORT_TEMPLATE_FILE_NAME = ImportExportUtils.FILE_PREFIX + "_import_point_of_entry_template.csv";
@@ -156,6 +158,21 @@ public void generateCaseImportTemplateFile() throws IOException {
156158
writeTemplate(Paths.get(getCaseImportTemplateFilePath()), importColumns, true);
157159
}
158160

161+
@Override
162+
public void generateEventParticipantImportTemplateFile() throws IOException {
163+
164+
createExportDirectoryIfNecessary();
165+
166+
char separator = configFacade.getCsvSeparator();
167+
168+
List<ImportColumn> importColumns = new ArrayList<>();
169+
importColumns.add(ImportColumn.from(PersonDto.class, PERSON + "." + PersonDto.FIRST_NAME, String.class, separator));
170+
importColumns.add(ImportColumn.from(PersonDto.class, PERSON + "." + PersonDto.LAST_NAME, String.class, separator));
171+
importColumns.add(ImportColumn.from(EventParticipantDto.class, EventParticipantDto.INVOLVEMENT_DESCRIPTION, String.class, separator));
172+
173+
writeTemplate(Paths.get(getEventParticipantImportTemplateFilePath()), importColumns, true);
174+
}
175+
159176
@Override
160177
public void generateCampaignFormImportTemplateFile(String campaignFormUuid) throws IOException {
161178

@@ -338,6 +355,14 @@ public String getCaseImportTemplateFilePath() {
338355
return filePath.toString();
339356
}
340357

358+
@Override
359+
public String getEventParticipantImportTemplateFilePath() {
360+
361+
Path exportDirectory = Paths.get(configFacade.getGeneratedFilesPath());
362+
Path filePath = exportDirectory.resolve(EVENT_PARTICIPANT_IMPORT_TEMPLATE_FILE_NAME);
363+
return filePath.toString();
364+
}
365+
341366
@Override
342367
public String getCampaignFormImportTemplateFilePath() {
343368

sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsGrid.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,7 @@ public EventParticipantsGrid(EventParticipantCriteria criteria) {
4949

5050
setInEagerMode(true);
5151
setCriteria(criteria);
52-
ListDataProvider<EventParticipantIndexDto> dataProvider =
53-
DataProvider.fromStream(FacadeProvider.getEventParticipantFacade().getIndexList(getCriteria(), null, null, null).stream());
54-
setDataProvider(dataProvider);
52+
setEagerDataProvider();
5553

5654
if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) {
5755
setSelectionMode(SelectionMode.MULTI);
@@ -117,12 +115,19 @@ public EventParticipantsGrid(EventParticipantCriteria criteria) {
117115
e -> ControllerProvider.getEventParticipantController().navigateToData(e.getUuid())));
118116
}
119117

118+
public void setEagerDataProvider() {
119+
ListDataProvider<EventParticipantIndexDto> dataProvider =
120+
DataProvider.fromStream(FacadeProvider.getEventParticipantFacade().getIndexList(getCriteria(), null, null, null).stream());
121+
setDataProvider(dataProvider);
122+
}
123+
120124
public void reload() {
121125

122126
if (getSelectionModel().isUserSelectionAllowed()) {
123127
deselectAll();
124128
}
125129

126130
getDataProvider().refreshAll();
131+
setEagerDataProvider();
127132
}
128133
}

sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.vaadin.ui.HorizontalLayout;
2727
import com.vaadin.ui.MenuBar;
2828
import com.vaadin.ui.VerticalLayout;
29+
import com.vaadin.ui.Window;
2930
import com.vaadin.ui.themes.ValoTheme;
3031

3132
import de.symeda.sormas.api.event.EventParticipantCriteria;
@@ -37,13 +38,15 @@
3738
import de.symeda.sormas.ui.ControllerProvider;
3839
import de.symeda.sormas.ui.UserProvider;
3940
import de.symeda.sormas.ui.ViewModelProviders;
41+
import de.symeda.sormas.ui.events.eventparticipantimporter.EventParticipantImportLayout;
4042
import de.symeda.sormas.ui.utils.ButtonHelper;
4143
import de.symeda.sormas.ui.utils.CssStyles;
4244
import de.symeda.sormas.ui.utils.DetailSubComponentWrapper;
4345
import de.symeda.sormas.ui.utils.EventParticipantDownloadUtil;
4446
import de.symeda.sormas.ui.utils.GridExportStreamResource;
4547
import de.symeda.sormas.ui.utils.LayoutUtil;
4648
import de.symeda.sormas.ui.utils.MenuBarHelper;
49+
import de.symeda.sormas.ui.utils.VaadinUiUtil;
4750

4851
public class EventParticipantsView extends AbstractEventView {
4952

@@ -83,6 +86,18 @@ public HorizontalLayout createTopBar() {
8386
exportLayout.setWidth(250, Unit.PIXELS);
8487
}
8588

89+
// import
90+
if (UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_IMPORT)) {
91+
Button importButton = ButtonHelper.createIconButton(Captions.actionImport, VaadinIcons.UPLOAD, e -> {
92+
Window popupWindow = VaadinUiUtil.showPopupWindow(new EventParticipantImportLayout(getEventRef()));
93+
popupWindow.setCaption(I18nProperties.getString(Strings.headingImportEventParticipant));
94+
popupWindow.addCloseListener(c -> this.grid.reload());
95+
}, ValoTheme.BUTTON_PRIMARY);
96+
97+
addHeaderComponent(importButton);
98+
}
99+
100+
// export
86101
PopupButton exportPopupButton = ButtonHelper.createIconPopupButton(Captions.export, VaadinIcons.DOWNLOAD, exportLayout);
87102
addHeaderComponent(exportPopupButton);
88103

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*******************************************************************************
2+
* SORMAS® - Surveillance Outbreak Response Management & Analysis System
3+
* Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI)
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <https://www.gnu.org/licenses/>.
17+
*******************************************************************************/
18+
package de.symeda.sormas.ui.events.eventparticipantimporter;
19+
20+
import java.io.IOException;
21+
22+
import com.opencsv.exceptions.CsvValidationException;
23+
import com.vaadin.server.ClassResource;
24+
import com.vaadin.server.Page;
25+
import com.vaadin.ui.Notification;
26+
import com.vaadin.ui.Notification.Type;
27+
28+
import de.symeda.sormas.api.FacadeProvider;
29+
import de.symeda.sormas.api.event.EventReferenceDto;
30+
import de.symeda.sormas.api.i18n.I18nProperties;
31+
import de.symeda.sormas.api.i18n.Strings;
32+
import de.symeda.sormas.ui.importer.AbstractImportLayout;
33+
import de.symeda.sormas.ui.importer.ImportReceiver;
34+
35+
@SuppressWarnings("serial")
36+
public class EventParticipantImportLayout extends AbstractImportLayout {
37+
38+
public EventParticipantImportLayout(EventReferenceDto event) {
39+
40+
super();
41+
42+
addDownloadResourcesComponent(1, new ClassResource("/SORMAS_Import_Guide.pdf"), new ClassResource("/doc/SORMAS_Data_Dictionary.xlsx"));
43+
addDownloadImportTemplateComponent(
44+
2,
45+
FacadeProvider.getImportFacade().getEventParticipantImportTemplateFilePath(),
46+
"sormas_import_eventparticipant_template.csv");
47+
addImportCsvComponent(3, new ImportReceiver("_eventparticipant_import_", file -> {
48+
resetDownloadErrorReportButton();
49+
50+
try {
51+
EventParticipantImporter importer = new EventParticipantImporter(file, true, currentUser, event);
52+
importer.startImport(resource -> extendDownloadErrorReportButton(resource), currentUI, true);
53+
} catch (IOException | CsvValidationException e) {
54+
new Notification(
55+
I18nProperties.getString(Strings.headingImportFailed),
56+
I18nProperties.getString(Strings.messageImportFailed),
57+
Type.ERROR_MESSAGE,
58+
false).show(Page.getCurrent());
59+
}
60+
}));
61+
addDownloadErrorReportComponent(4);
62+
}
63+
}

0 commit comments

Comments
 (0)