From e218a924fdafca1c1336cee20f867515cfdc0d57 Mon Sep 17 00:00:00 2001 From: jenkins Date: Fri, 9 Mar 2018 15:07:24 +0100 Subject: [PATCH 01/16] [GITFLOW]updating poms for 0.17.0-SNAPSHOT development --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/bundles.pom | 2 +- sormas-base/dependencies/gf-modules.pom | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 5 ++--- sormas-ear/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 5 ++--- sormas-widgetset/pom.xml | 2 +- 11 files changed, 13 insertions(+), 15 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index 06e3d3d5ab7..82343a1f51d 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 0.16.0-SNAPSHOT + 0.17.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index b1ab3c38b7b..71c5313268f 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.16.0-SNAPSHOT + 0.17.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 7e8f6327ef6..e93aba098c5 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.16.0-SNAPSHOT + 0.17.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/bundles.pom b/sormas-base/dependencies/bundles.pom index 827b7e62e01..36abefa6f78 100644 --- a/sormas-base/dependencies/bundles.pom +++ b/sormas-base/dependencies/bundles.pom @@ -9,7 +9,7 @@ sormas-base de.symeda.sormas - 0.16.0-SNAPSHOT + 0.17.0-SNAPSHOT ../ diff --git a/sormas-base/dependencies/gf-modules.pom b/sormas-base/dependencies/gf-modules.pom index 67f8175b57a..8465014a2d8 100644 --- a/sormas-base/dependencies/gf-modules.pom +++ b/sormas-base/dependencies/gf-modules.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 0.16.0-SNAPSHOT + 0.17.0-SNAPSHOT ../ diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index dea5ba864ff..d8d7347cb11 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 0.16.0-SNAPSHOT + 0.17.0-SNAPSHOT ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index a35729038d5..ed100d0e1f3 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -1,12 +1,11 @@ - + 4.0.0 de.symeda.sormas sormas-base pom - 0.16.0-SNAPSHOT + 0.17.0-SNAPSHOT 3.0 diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 5f99ddae59a..4f9d307818b 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 0.16.0-SNAPSHOT + 0.17.0-SNAPSHOT ../sormas-base diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 3735f1c0434..23f59d0b89b 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 0.16.0-SNAPSHOT + 0.17.0-SNAPSHOT ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 3214384be6c..41ea6cb63bb 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -1,10 +1,9 @@ - + sormas-base de.symeda.sormas - 0.16.0-SNAPSHOT + 0.17.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 1bf060fc65b..16f2848bc8a 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.16.0-SNAPSHOT + 0.17.0-SNAPSHOT ../sormas-base 4.0.0 From 21d09b6efeaf459378bae4040bb12cb4cd8184c9 Mon Sep 17 00:00:00 2001 From: jenkins Date: Fri, 9 Mar 2018 15:11:58 +0100 Subject: [PATCH 02/16] [GITFLOW]updating develop poms to master versions to avoid merge conflicts --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/bundles.pom | 2 +- sormas-base/dependencies/gf-modules.pom | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index 82343a1f51d..34e991a0c1e 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 0.17.0-SNAPSHOT + 0.16.0 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 71c5313268f..ff5e6f2c461 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.16.0 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index e93aba098c5..a699bc06b30 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.16.0 ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/bundles.pom b/sormas-base/dependencies/bundles.pom index 36abefa6f78..84cba8aec49 100644 --- a/sormas-base/dependencies/bundles.pom +++ b/sormas-base/dependencies/bundles.pom @@ -9,7 +9,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.16.0 ../ diff --git a/sormas-base/dependencies/gf-modules.pom b/sormas-base/dependencies/gf-modules.pom index 8465014a2d8..bdd279175f9 100644 --- a/sormas-base/dependencies/gf-modules.pom +++ b/sormas-base/dependencies/gf-modules.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.16.0 ../ diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index d8d7347cb11..c7fba26a126 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.16.0 ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index ed100d0e1f3..512008c1b7b 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 0.17.0-SNAPSHOT + 0.16.0 3.0 diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 4f9d307818b..42aa4ffa417 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 0.17.0-SNAPSHOT + 0.16.0 ../sormas-base diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 23f59d0b89b..2a5405c8a60 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 0.17.0-SNAPSHOT + 0.16.0 ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 41ea6cb63bb..d16a90c5ac3 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.16.0 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 16f2848bc8a..028b3f60a38 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.16.0 ../sormas-base 4.0.0 From 11b8dd7f26c1727b7400f76a73fce03b74051398 Mon Sep 17 00:00:00 2001 From: jenkins Date: Fri, 9 Mar 2018 15:12:00 +0100 Subject: [PATCH 03/16] [GITFLOW]Updating develop poms back to pre merge state --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/bundles.pom | 2 +- sormas-base/dependencies/gf-modules.pom | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index 34e991a0c1e..82343a1f51d 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 0.16.0 + 0.17.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index ff5e6f2c461..71c5313268f 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.16.0 + 0.17.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index a699bc06b30..e93aba098c5 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.16.0 + 0.17.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/bundles.pom b/sormas-base/dependencies/bundles.pom index 84cba8aec49..36abefa6f78 100644 --- a/sormas-base/dependencies/bundles.pom +++ b/sormas-base/dependencies/bundles.pom @@ -9,7 +9,7 @@ sormas-base de.symeda.sormas - 0.16.0 + 0.17.0-SNAPSHOT ../ diff --git a/sormas-base/dependencies/gf-modules.pom b/sormas-base/dependencies/gf-modules.pom index bdd279175f9..8465014a2d8 100644 --- a/sormas-base/dependencies/gf-modules.pom +++ b/sormas-base/dependencies/gf-modules.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 0.16.0 + 0.17.0-SNAPSHOT ../ diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index c7fba26a126..d8d7347cb11 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 0.16.0 + 0.17.0-SNAPSHOT ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 512008c1b7b..ed100d0e1f3 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 0.16.0 + 0.17.0-SNAPSHOT 3.0 diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 42aa4ffa417..4f9d307818b 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 0.16.0 + 0.17.0-SNAPSHOT ../sormas-base diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 2a5405c8a60..23f59d0b89b 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 0.16.0 + 0.17.0-SNAPSHOT ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index d16a90c5ac3..41ea6cb63bb 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.16.0 + 0.17.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 028b3f60a38..16f2848bc8a 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.16.0 + 0.17.0-SNAPSHOT ../sormas-base 4.0.0 From 4fc614743374a6b5df21986a3190802a04be1883 Mon Sep 17 00:00:00 2001 From: MateStrysewskeSym Date: Fri, 9 Mar 2018 16:20:38 +0100 Subject: [PATCH 04/16] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ab87b49e98e..00a53bd5e7c 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ For information on what libs are used see pom.xml in sormas-base project: https: * Edit sql/sormas_schema.sql * ``Remove everything until after the INSERT with the read schema version`` * ``Surround the remaining with BEGIN; and COMMIT;`` - * Update the Database schema: ``psql -U sormas_user -W sormas_db < sql/sormas_schema.sql`` + * Update the Database schema: ``psql -U sormas_user -h localhost -W sormas_db < sql/sormas_schema.sql`` * If something goes wrong, restorte the database using ``pg_restore -U sormas_user -Fc -d sormas_db < sormas_db_....`` #### Web Applications From 6b1797060d48b5f36f2759329f5f17f83988c5ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 15 Mar 2018 13:55:15 +0100 Subject: [PATCH 05/16] #512 - added case import functionality - automatically built template that can be downloaded, .csv file parsing that creates a case for every line contained in it and an automatically generated error report file --- .../de/symeda/sormas/api/ConfigFacade.java | 2 +- .../de/symeda/sormas/api/FacadeProvider.java | 6 +- .../sormas/api/export/ExportFacade.java | 19 - .../sormas/api/facility/FacilityFacade.java | 1 + .../DatabaseTable.java | 2 +- .../DatabaseTableType.java | 2 +- .../api/importexport/ImportExportFacade.java | 31 + .../importexport/InvalidColumnException.java | 18 + .../sormas/api/person/PersonFacade.java | 2 + .../sormas/api/region/CommunityFacade.java | 4 +- .../sormas/api/region/DistrictFacade.java | 2 +- .../sormas/api/region/RegionFacade.java | 1 + .../de/symeda/sormas/api/user/UserRight.java | 3 + .../symeda/sormas/api/utils/DateHelper.java | 27 + sormas-backend/pom.xml | 8 +- .../sormas/backend/caze/CaseFacadeEjb.java | 8 +- .../sormas/backend/caze/CaseService.java | 41 ++ .../backend/common/ConfigFacadeEjb.java | 6 +- .../sormas/backend/common/CronService.java | 6 +- .../sormas/backend/common/ImportIgnore.java | 21 + .../common/StartupShutdownService.java | 14 + .../sormas/backend/epidata/EpiData.java | 9 +- .../backend/epidata/EpiDataService.java | 8 + .../backend/export/ExportFacadeEjb.java | 219 ------- .../backend/facility/FacilityService.java | 14 + .../hospitalization/Hospitalization.java | 5 +- .../HospitalizationService.java | 8 + .../importexport/ImportErrorException.java | 34 ++ .../importexport/ImportExportFacadeEjb.java | 557 ++++++++++++++++++ .../backend/person/PersonFacadeEjb.java | 9 + .../backend/region/CommunityService.java | 15 + .../backend/region/DistrictService.java | 14 + .../sormas/backend/region/RegionService.java | 14 + .../sormas/backend/symptoms/Symptoms.java | 3 + .../symeda/sormas/backend/util/CSVUtils.java | 23 + .../glassfish-config/sormas.properties | 4 +- sormas-base/pom.xml | 11 +- .../sormas/ui/caze/CaseImportLayout.java | 188 ++++++ .../de/symeda/sormas/ui/caze/CasesView.java | 17 + .../ui/statistics/DatabaseExportView.java | 4 +- .../symeda/sormas/ui/utils/DownloadUtil.java | 31 +- .../themes/sormas/components/upload.scss | 30 + .../webapp/VAADIN/themes/sormas/global.scss | 19 +- .../webapp/VAADIN/themes/sormas/sormas.scss | 2 + 44 files changed, 1178 insertions(+), 284 deletions(-) delete mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/export/ExportFacade.java rename sormas-api/src/main/java/de/symeda/sormas/api/{export => importexport}/DatabaseTable.java (98%) rename sormas-api/src/main/java/de/symeda/sormas/api/{export => importexport}/DatabaseTableType.java (59%) create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportExportFacade.java create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/importexport/InvalidColumnException.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/common/ImportIgnore.java delete mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/export/ExportFacadeEjb.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportErrorException.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportExportFacadeEjb.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/util/CSVUtils.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseImportLayout.java create mode 100644 sormas-ui/src/main/webapp/VAADIN/themes/sormas/components/upload.scss diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/ConfigFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/ConfigFacade.java index 67c79158190..7dfdd67e7c0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/ConfigFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/ConfigFacade.java @@ -21,6 +21,6 @@ public interface ConfigFacade { String getSmsAuthSecret(); - String getExportPath(); + String getTempFilesPath(); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java b/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java index 9ba8a66523d..0677a801162 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/FacadeProvider.java @@ -8,9 +8,9 @@ import de.symeda.sormas.api.epidata.EpiDataFacade; import de.symeda.sormas.api.event.EventFacade; import de.symeda.sormas.api.event.EventParticipantFacade; -import de.symeda.sormas.api.export.ExportFacade; import de.symeda.sormas.api.facility.FacilityFacade; import de.symeda.sormas.api.hospitalization.HospitalizationFacade; +import de.symeda.sormas.api.importexport.ImportExportFacade; import de.symeda.sormas.api.outbreak.OutbreakFacade; import de.symeda.sormas.api.person.PersonFacade; import de.symeda.sormas.api.region.CommunityFacade; @@ -137,8 +137,8 @@ public static ConfigFacade getConfigFacade() { return get().lookupEjbRemote(ConfigFacade.class); } - public static ExportFacade getExportFacade() { - return get().lookupEjbRemote(ExportFacade.class); + public static ImportExportFacade getImportExportFacade() { + return get().lookupEjbRemote(ImportExportFacade.class); } @SuppressWarnings("unchecked") diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/export/ExportFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/export/ExportFacade.java deleted file mode 100644 index bda2e4d92d6..00000000000 --- a/sormas-api/src/main/java/de/symeda/sormas/api/export/ExportFacade.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.symeda.sormas.api.export; - -import java.util.List; - -import javax.ejb.Remote; - -import de.symeda.sormas.api.utils.ExportErrorException; - -@Remote -public interface ExportFacade { - - /** - * Exports the passed database tables as .csv files to the export folder specified in the - * properties file, creates a zip archive containing these .csv files and returns the path - * to the zip archive that can then be used to offer it as a download. - */ - String generateDatabaseExportArchive(List databaseTables) throws ExportErrorException; - -} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/facility/FacilityFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/facility/FacilityFacade.java index 5854cafb7f3..2f36b304c4b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/facility/FacilityFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/facility/FacilityFacade.java @@ -27,4 +27,5 @@ public interface FacilityFacade { FacilityDto getByUuid(String uuid); List getAllUuids(String userUuid); + } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/export/DatabaseTable.java b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTable.java similarity index 98% rename from sormas-api/src/main/java/de/symeda/sormas/api/export/DatabaseTable.java rename to sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTable.java index 79809640d32..ea290fb6586 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/export/DatabaseTable.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTable.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.api.export; +package de.symeda.sormas.api.importexport; import de.symeda.sormas.api.I18nProperties; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/export/DatabaseTableType.java b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTableType.java similarity index 59% rename from sormas-api/src/main/java/de/symeda/sormas/api/export/DatabaseTableType.java rename to sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTableType.java index 10e28b13642..270fe88cf70 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/export/DatabaseTableType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTableType.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.api.export; +package de.symeda.sormas.api.importexport; public enum DatabaseTableType { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportExportFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportExportFacade.java new file mode 100644 index 00000000000..8fc45f5ead7 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportExportFacade.java @@ -0,0 +1,31 @@ +package de.symeda.sormas.api.importexport; + +import java.io.IOException; +import java.util.List; + +import javax.ejb.Remote; + +import de.symeda.sormas.api.utils.ExportErrorException; + +@Remote +public interface ImportExportFacade { + + /** + * Exports the passed database tables as .csv files to the export folder specified in the + * properties file, creates a zip archive containing these .csv files and returns the path + * to the zip archive that can then be used to offer it as a download. + */ + String generateDatabaseExportArchive(List databaseTables) throws ExportErrorException, IOException; + + /** + * Creates a .csv file with one row containing all relevant column names of the case entity + * and its sub-entities and returns the path to the .csv file that can then be used to offer + * it as a download. + */ + void generateCaseImportTemplateFile() throws IOException; + + String getCaseImportTemplateFilePath(); + + String importCasesFromCsvFile(String csvFilePath, String userUuid) throws IOException, InvalidColumnException; + +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/importexport/InvalidColumnException.java b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/InvalidColumnException.java new file mode 100644 index 00000000000..889adee561d --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/InvalidColumnException.java @@ -0,0 +1,18 @@ +package de.symeda.sormas.api.importexport; + +public class InvalidColumnException extends Exception { + + private static final long serialVersionUID = -1597100047088745699L; + + private String columnName; + + public InvalidColumnException(String columnName) { + super(); + this.columnName = columnName; + } + + public String getColumnName() { + return columnName; + } + +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonFacade.java index e58b2960a99..edcf912ae61 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/person/PersonFacade.java @@ -31,4 +31,6 @@ public interface PersonFacade { List getAllUuids(String userUuid); List getByUuids(List uuids); + + PersonDto buildPerson(); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/region/CommunityFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/region/CommunityFacade.java index 1be1e8dbbde..69d79fb164c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/region/CommunityFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/region/CommunityFacade.java @@ -16,4 +16,6 @@ public interface CommunityFacade { List getAllUuids(String userUuid); - CommunityReferenceDto getCommunityReferenceByUuid(String uuid);} + CommunityReferenceDto getCommunityReferenceByUuid(String uuid); + +} \ No newline at end of file diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/region/DistrictFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/region/DistrictFacade.java index e075fa58a04..a604083f6ae 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/region/DistrictFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/region/DistrictFacade.java @@ -21,5 +21,5 @@ public interface DistrictFacade { List getAllAsReference(); List getAllUuids(String userUuid); - + } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/region/RegionFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/region/RegionFacade.java index 98e994306d5..b8c995520e1 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/region/RegionFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/region/RegionFacade.java @@ -17,4 +17,5 @@ public interface RegionFacade { RegionReferenceDto getRegionReferenceByUuid(String uuid); List getAllUuids(String userUuid); + } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java index 57551c0b64e..74cf7c92143 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRight.java @@ -97,6 +97,9 @@ public enum UserRight { CASE_DELETE( ADMIN ), + CASE_IMPORT( + ADMIN + ), SAMPLE_CREATE( ADMIN, NATIONAL_USER, diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/DateHelper.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/DateHelper.java index 8e3eb93f509..58b52c9eed0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/DateHelper.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/DateHelper.java @@ -21,6 +21,8 @@ public final class DateHelper { private static final SimpleDateFormat SHORT_DATE_FORMAT = new SimpleDateFormat("dd/MM/yy"); private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy"); + private static final SimpleDateFormat DATE_FORMAT_DOTS = new SimpleDateFormat("dd.MM.yyyy"); + private static final SimpleDateFormat DATE_FORMAT_HYPHEN = new SimpleDateFormat("dd-MM-yyyy"); private static final SimpleDateFormat DATE_TIME_FORMAT = new SimpleDateFormat("dd/MM/yyyy HH:mm"); private static final SimpleDateFormat SHORT_DATE_TIME_FORMAT = new SimpleDateFormat("dd/MM/yyyy HH:mm"); private static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm"); @@ -60,6 +62,31 @@ public static Date parseDate(String date) { return null; } } + + public static Date parseDateWithException(String date) throws ParseException { + if (date != null) { + try { + SimpleDateFormat dateFormat = clone(DATE_FORMAT); + dateFormat.setLenient(false); + return dateFormat.parse(date); + } catch (ParseException e) { + // Try next format + } + try { + SimpleDateFormat dateFormat = clone(DATE_FORMAT_DOTS); + dateFormat.setLenient(false); + return dateFormat.parse(date); + } catch (ParseException e) { + // Try next format + } + // If this fails, an exception is thrown + SimpleDateFormat dateFormat = clone(DATE_FORMAT_HYPHEN); + dateFormat.setLenient(false); + return dateFormat.parse(date); + } else { + return null; + } + } public static String formatShortDate(Date date) { if (date != null) { diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index e93aba098c5..27393f2405e 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -1,5 +1,6 @@ - + sormas-base de.symeda.sormas @@ -50,6 +51,11 @@ client + + com.opencsv + opencsv + + diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index d58975dad05..463424cf6df 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -81,6 +81,7 @@ import de.symeda.sormas.backend.location.LocationFacadeEjb.LocationFacadeEjbLocal; import de.symeda.sormas.backend.person.Person; import de.symeda.sormas.backend.person.PersonFacadeEjb; +import de.symeda.sormas.backend.person.PersonFacadeEjb.PersonFacadeEjbLocal; import de.symeda.sormas.backend.person.PersonService; import de.symeda.sormas.backend.region.Community; import de.symeda.sormas.backend.region.CommunityFacadeEjb; @@ -99,6 +100,7 @@ import de.symeda.sormas.backend.task.TaskService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb; +import de.symeda.sormas.backend.user.UserFacadeEjb.UserFacadeEjbLocal; import de.symeda.sormas.backend.user.UserService; import de.symeda.sormas.backend.util.DtoHelper; import de.symeda.sormas.backend.util.ModelConstants; @@ -108,7 +110,7 @@ public class CaseFacadeEjb implements CaseFacade { @PersistenceContext(unitName = ModelConstants.PERSISTENCE_UNIT_NAME) protected EntityManager em; - + @EJB private CaseService caseService; @EJB @@ -118,6 +120,8 @@ public class CaseFacadeEjb implements CaseFacade { @EJB private UserService userService; @EJB + private UserFacadeEjbLocal userFacade; + @EJB private SymptomsFacadeEjbLocal symptomsFacade; @EJB private LocationFacadeEjbLocal locationFacade; @@ -147,6 +151,8 @@ public class CaseFacadeEjb implements CaseFacade { private MessagingService messagingService; @EJB private EventParticipantService eventParticipantService; + @EJB + private PersonFacadeEjbLocal personFacade; private static final Logger logger = LoggerFactory.getLogger(CaseFacadeEjb.class); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index 2b04d2c5d1a..083b8e83539 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -6,8 +6,10 @@ import java.util.Map; import java.util.stream.Collectors; +import javax.annotation.Resource; import javax.ejb.EJB; import javax.ejb.LocalBean; +import javax.ejb.SessionContext; import javax.ejb.Stateless; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; @@ -21,11 +23,14 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseCriteria; +import de.symeda.sormas.api.caze.CaseOutcome; import de.symeda.sormas.api.caze.DashboardCaseDto; +import de.symeda.sormas.api.caze.InvestigationStatus; import de.symeda.sormas.api.caze.MapCaseDto; import de.symeda.sormas.api.caze.StatisticsCaseDto; import de.symeda.sormas.api.person.PresentCondition; import de.symeda.sormas.api.user.UserRole; +import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.backend.common.AbstractAdoService; import de.symeda.sormas.backend.common.AbstractDomainObject; import de.symeda.sormas.backend.contact.Contact; @@ -33,30 +38,45 @@ import de.symeda.sormas.backend.epidata.EpiData; import de.symeda.sormas.backend.epidata.EpiDataBurial; import de.symeda.sormas.backend.epidata.EpiDataGathering; +import de.symeda.sormas.backend.epidata.EpiDataService; import de.symeda.sormas.backend.epidata.EpiDataTravel; import de.symeda.sormas.backend.facility.Facility; import de.symeda.sormas.backend.hospitalization.Hospitalization; +import de.symeda.sormas.backend.hospitalization.HospitalizationService; import de.symeda.sormas.backend.hospitalization.PreviousHospitalization; import de.symeda.sormas.backend.location.Location; import de.symeda.sormas.backend.person.Person; import de.symeda.sormas.backend.person.PersonFacadeEjb.PersonFacadeEjbLocal; +import de.symeda.sormas.backend.person.PersonService; import de.symeda.sormas.backend.region.District; import de.symeda.sormas.backend.region.Region; import de.symeda.sormas.backend.sample.Sample; import de.symeda.sormas.backend.sample.SampleService; import de.symeda.sormas.backend.symptoms.Symptoms; import de.symeda.sormas.backend.user.User; +import de.symeda.sormas.backend.user.UserService; @Stateless @LocalBean public class CaseService extends AbstractAdoService { + @Resource + private SessionContext sessionContext; + @EJB ContactService contactService; @EJB SampleService sampleService; @EJB PersonFacadeEjbLocal personFacade; + @EJB + PersonService personService; + @EJB + HospitalizationService hospitalizationService; + @EJB + EpiDataService epiDataService; + @EJB + UserService userService; public CaseService() { super(Case.class); @@ -68,6 +88,27 @@ public Case createCase(Person person) { caze.setPerson(person); return caze; } + + public Case createCase() { + Case caze = new Case(); + caze.setUuid(DataHelper.createUuid()); + + caze.setInvestigationStatus(InvestigationStatus.PENDING); + caze.setCaseClassification(CaseClassification.NOT_CLASSIFIED); + caze.setOutcome(CaseOutcome.NO_OUTCOME); + + caze.setPerson(personService.createPerson()); + caze.setHospitalization(hospitalizationService.createHospitalization()); + caze.setEpiData(epiDataService.createEpiData()); + + caze.setReportDate(new Date()); + User user = userService.getByUserName(sessionContext.getCallerPrincipal().getName()); + caze.setReportingUser(user); + caze.setRegion(user.getRegion()); + caze.setDistrict(user.getDistrict()); + + return caze; + } public List getAllByDisease(Disease disease, User user) { CriteriaBuilder cb = em.getCriteriaBuilder(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/ConfigFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/ConfigFacadeEjb.java index 74580b99763..1b50b26b0cd 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/ConfigFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/ConfigFacadeEjb.java @@ -21,7 +21,7 @@ public class ConfigFacadeEjb implements ConfigFacade { private static final String APP_URL = "app.url"; - private static final String EXPORT_PATH = "export.path"; + private static final String TEMP_FILES_PATH = "temp.path"; private static final String EMAIL_SENDER_ADDRESS = "email.sender.address"; private static final String EMAIL_SENDER_NAME = "email.sender.name"; @@ -61,8 +61,8 @@ public String getAppUrl() { } @Override - public String getExportPath() { - return getProperty(EXPORT_PATH, "/tmp/sormas_export/"); + public String getTempFilesPath() { + return getProperty(TEMP_FILES_PATH, "/opt/sormas-temp/"); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CronService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CronService.java index 3aaa5fdcf61..122c7c95a68 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CronService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CronService.java @@ -53,11 +53,11 @@ public void runRepeatedlyPerHour() { public void runAtMidnight() { // Remove all files with the sormas_export prefix from the export folder that are older than two hours Date now = new Date(); - File exportFolder = new File(configFacade.getExportPath()); + File exportFolder = new File(configFacade.getTempFilesPath()); int numberOfDeletedFiles = 0; for (final File fileEntry : exportFolder.listFiles()) { - // Skip the file if it's a directory or not a sormas export file - if (!fileEntry.isFile() || !fileEntry.getName().startsWith("sormas_export")) { + // Skip the file if it's a directory or not a sormas export or import file + if (!fileEntry.isFile() || (!fileEntry.getName().startsWith("sormas"))) { continue; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/ImportIgnore.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/ImportIgnore.java new file mode 100644 index 00000000000..7caed47cd82 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/ImportIgnore.java @@ -0,0 +1,21 @@ +package de.symeda.sormas.backend.common; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Fields whose getters are annotated with this annotation are ignored when building .csv templates + * and importing entities. + * + * @author Mate Strysewske + */ +@Target({ + ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface ImportIgnore { + +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java index d73cdfd9552..f53ccf673a9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/StartupShutdownService.java @@ -1,5 +1,6 @@ package de.symeda.sormas.backend.common; +import java.io.IOException; import java.sql.Timestamp; import java.util.List; import java.util.NoSuchElementException; @@ -30,6 +31,7 @@ import de.symeda.sormas.backend.event.EventParticipantService; import de.symeda.sormas.backend.facility.Facility; import de.symeda.sormas.backend.facility.FacilityService; +import de.symeda.sormas.backend.importexport.ImportExportFacadeEjb.ImportExportFacadeEjbLocal; import de.symeda.sormas.backend.person.PersonService; import de.symeda.sormas.backend.region.Community; import de.symeda.sormas.backend.region.CommunityService; @@ -77,6 +79,8 @@ public class StartupShutdownService { private CommunityService communityService; @EJB private FacilityService facilityService; + @EJB + private ImportExportFacadeEjbLocal importExportFacade; @PostConstruct public void startup() { @@ -90,6 +94,8 @@ public void startup() { initDefaultUsers(); upgrade(); + + createImportTemplateFiles(); } public void importAdministrativeDivisions(String countryName) { @@ -181,6 +187,14 @@ private void upgrade() { } + + private void createImportTemplateFiles() { + try { + importExportFacade.generateCaseImportTemplateFile(); + } catch (IOException e) { + logger.error("Could not create case import template .csv file."); + } + } @PreDestroy public void shutdown() { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiData.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiData.java index 13f97b6563c..0f77523fad4 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiData.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiData.java @@ -18,6 +18,7 @@ import de.symeda.sormas.api.epidata.WaterSource; import de.symeda.sormas.api.utils.YesNoUnknown; import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.common.ImportIgnore; @Entity @Audited @@ -97,7 +98,8 @@ public class EpiData extends AbstractDomainObject { private List burials = new ArrayList<>(); private List gatherings = new ArrayList<>(); private List travels = new ArrayList<>(); - + + @ImportIgnore @Enumerated(EnumType.STRING) public YesNoUnknown getBurialAttended() { return burialAttended; @@ -105,7 +107,8 @@ public YesNoUnknown getBurialAttended() { public void setBurialAttended(YesNoUnknown burialAttended) { this.burialAttended = burialAttended; } - + + @ImportIgnore @Enumerated(EnumType.STRING) public YesNoUnknown getGatheringAttended() { return gatheringAttended; @@ -114,6 +117,7 @@ public void setGatheringAttended(YesNoUnknown gatheringAttended) { this.gatheringAttended = gatheringAttended; } + @ImportIgnore @Enumerated(EnumType.STRING) public YesNoUnknown getTraveled() { return traveled; @@ -374,6 +378,7 @@ public void setTravels(List travels) { * This change date has to be set whenever one of the embedded lists is modified: !oldList.equals(newList) * @return */ + @ImportIgnore public Date getChangeDateOfEmbeddedLists() { return changeDateOfEmbeddedLists; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiDataService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiDataService.java index 950698850be..918b5f1e384 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiDataService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiDataService.java @@ -7,6 +7,7 @@ import javax.persistence.criteria.From; import javax.persistence.criteria.Predicate; +import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.backend.common.AbstractAdoService; import de.symeda.sormas.backend.user.User; @@ -17,6 +18,13 @@ public class EpiDataService extends AbstractAdoService { public EpiDataService() { super(EpiData.class); } + + public EpiData createEpiData() { + EpiData epiData = new EpiData(); + epiData.setUuid(DataHelper.createUuid()); + + return epiData; + } @Override public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From from, User user) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/export/ExportFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/export/ExportFacadeEjb.java deleted file mode 100644 index e227bc7c6f0..00000000000 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/export/ExportFacadeEjb.java +++ /dev/null @@ -1,219 +0,0 @@ -package de.symeda.sormas.backend.export; - -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Date; -import java.util.List; -import java.util.Random; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import javax.ejb.EJB; -import javax.ejb.LocalBean; -import javax.ejb.Stateless; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import de.symeda.sormas.api.FacadeProvider; -import de.symeda.sormas.api.export.DatabaseTable; -import de.symeda.sormas.api.export.ExportFacade; -import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.api.utils.ExportErrorException; -import de.symeda.sormas.backend.caze.Case; -import de.symeda.sormas.backend.caze.CaseFacadeEjb; -import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal; -import de.symeda.sormas.backend.contact.Contact; -import de.symeda.sormas.backend.epidata.EpiData; -import de.symeda.sormas.backend.epidata.EpiDataBurial; -import de.symeda.sormas.backend.epidata.EpiDataGathering; -import de.symeda.sormas.backend.epidata.EpiDataTravel; -import de.symeda.sormas.backend.event.Event; -import de.symeda.sormas.backend.event.EventParticipant; -import de.symeda.sormas.backend.facility.Facility; -import de.symeda.sormas.backend.hospitalization.Hospitalization; -import de.symeda.sormas.backend.hospitalization.PreviousHospitalization; -import de.symeda.sormas.backend.location.Location; -import de.symeda.sormas.backend.outbreak.Outbreak; -import de.symeda.sormas.backend.person.Person; -import de.symeda.sormas.backend.region.Community; -import de.symeda.sormas.backend.region.District; -import de.symeda.sormas.backend.region.Region; -import de.symeda.sormas.backend.sample.Sample; -import de.symeda.sormas.backend.sample.SampleTest; -import de.symeda.sormas.backend.symptoms.Symptoms; -import de.symeda.sormas.backend.task.Task; -import de.symeda.sormas.backend.util.ModelConstants; -import de.symeda.sormas.backend.visit.Visit; - -@Stateless(name = "ExportFacade") -public class ExportFacadeEjb implements ExportFacade { - - @PersistenceContext(unitName = ModelConstants.PERSISTENCE_UNIT_NAME) - protected EntityManager em; - - @EJB - private ConfigFacadeEjbLocal configFacade; - - private static final Logger logger = LoggerFactory.getLogger(CaseFacadeEjb.class); - - @Override - public String generateDatabaseExportArchive(List databaseTables) throws ExportErrorException { - // Create the folder if it doesn't exist - try { - Files.createDirectories(Paths.get(configFacade.getExportPath())); - } catch (IOException e) { - logger.error("Export directory doesn't exist and creation failed."); - throw new ExportErrorException(); - } - - // Export all selected tables to .csv files - String date = DateHelper.formatDateForExport(new Date()); - int randomNumber = new Random().nextInt(Integer.MAX_VALUE); - for (DatabaseTable databaseTable : databaseTables) { - switch (databaseTable) { - case CASES: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Case.TABLE_NAME).getResultList(); - break; - case HOSPITALIZATIONS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Hospitalization.TABLE_NAME).getResultList(); - break; - case PREVIOUSHOSPITALIZATIONS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, PreviousHospitalization.TABLE_NAME).getResultList(); - break; - case EPIDATA: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, EpiData.TABLE_NAME).getResultList(); - break; - case EPIDATABURIALS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, EpiDataBurial.TABLE_NAME).getResultList(); - break; - case EPIDATAGATHERINGS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, EpiDataGathering.TABLE_NAME).getResultList(); - break; - case EPIDATATRAVELS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, EpiDataTravel.TABLE_NAME).getResultList(); - break; - case CONTACTS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Contact.TABLE_NAME).getResultList(); - break; - case VISITS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Visit.TABLE_NAME).getResultList(); - break; - case EVENTS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Event.TABLE_NAME).getResultList(); - break; - case EVENTPARTICIPANTS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, EventParticipant.TABLE_NAME).getResultList(); - break; - case SAMPLES: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Sample.TABLE_NAME).getResultList(); - break; - case SAMPLETESTS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, SampleTest.TABLE_NAME).getResultList(); - break; - case TASKS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Task.TABLE_NAME).getResultList(); - break; - case PERSONS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Person.TABLE_NAME).getResultList(); - break; - case LOCATIONS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Location.TABLE_NAME).getResultList(); - break; - case REGIONS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Region.TABLE_NAME).getResultList(); - break; - case DISTRICTS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, District.TABLE_NAME).getResultList(); - break; - case COMMUNITIES: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Community.TABLE_NAME).getResultList(); - break; - case FACILITIES: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Facility.TABLE_NAME).getResultList(); - break; - case OUTBREAKS: - generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Outbreak.TABLE_NAME).getResultList(); - break; - case CASE_SYMPTOMS: - generateCsvExportJoinQuery(databaseTable.getFileName(), date, randomNumber, Symptoms.TABLE_NAME, Case.TABLE_NAME, "id", "symptoms_id").getResultList(); - break; - case VISIT_SYMPTOMS: - generateCsvExportJoinQuery(databaseTable.getFileName(), date, randomNumber, Symptoms.TABLE_NAME, Visit.TABLE_NAME, "id", "symptoms_id").getResultList(); - break; - } - } - - // Create a zip containing all created .csv files - return createZipFromCsvFiles(databaseTables, date, randomNumber); - } - - /** - * Creates a zip by collecting all .csv files that match the file names of the passed databaseTables plus - * the date and randomNumber suffixes. The zip is stored in the same export folder that contains the .csv files - * and its file path is returned. - */ - private String createZipFromCsvFiles(List databaseTables, String date, int randomNumber) throws ExportErrorException { - try { - Path path = new File(configFacade.getExportPath()).toPath(); - String name = "sormas_export_" + date + "_" + randomNumber + ".zip"; - Path filePath = path.resolve(name); - String zipPath = filePath.toString(); - FileOutputStream fos = new FileOutputStream(zipPath); - BufferedOutputStream bos = new BufferedOutputStream(fos); - ZipOutputStream zos = new ZipOutputStream(bos); - - for (DatabaseTable databaseTable : databaseTables) { - name = "sormas_export_" + databaseTable.getFileName() + "_" + date + "_" + randomNumber + ".csv"; - filePath = path.resolve(name); - zos.putNextEntry(new ZipEntry(databaseTable.getFileName() + ".csv")); - byte[] bytes = Files.readAllBytes(filePath); - zos.write(bytes, 0, bytes.length); - zos.closeEntry(); - } - - zos.close(); - return zipPath; - } catch (IOException e) { - logger.error("Failed to generate a zip file for database export."); - throw new ExportErrorException(); - } - } - - /** - * Generates the query used to create a .csv file of this table. In order to gain access to the server file system, a function - * that needs to be defined in the database is used. The path to save the .csv file to needs to be specified in the sormas.properties file. - */ - private Query generateCsvExportQuery(String fileName, String date, int randomNumber, String tableName) { - Path path = new File(FacadeProvider.getConfigFacade().getExportPath()).toPath(); - String name = "sormas_export_" + fileName + "_" + date + "_" + randomNumber + ".csv"; - Path filePath = path.resolve(name); - return em.createNativeQuery("SELECT export_database('" + tableName + "', '" + filePath + "');"); - } - - /** - * Generates the query used to create a .csv file of a this table, joined with another table. This is specifially used to only retrieve - * the symptoms of cases or visits to export two different tables for this data. - */ - private Query generateCsvExportJoinQuery(String fileName, String date, int randomNumber, String tableName, String joinTableName, String columnName, String joinColumnName) { - Path path = new File(FacadeProvider.getConfigFacade().getExportPath()).toPath(); - String name = "sormas_export_" + fileName + "_" + date + "_" + randomNumber + ".csv"; - Path filePath = path.resolve(name); - return em.createNativeQuery("SELECT export_database_join('" + tableName + "', '" + joinTableName + "', '" + tableName + "." + columnName + "', '" + joinTableName + "." + joinColumnName + "', '" + - filePath + "');"); - } - - @LocalBean - @Stateless - public static class ExportFacadeEjbLocal extends ExportFacadeEjb { - } - -} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/facility/FacilityService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/facility/FacilityService.java index 2e8379a3228..020863df81d 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/facility/FacilityService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/facility/FacilityService.java @@ -8,6 +8,7 @@ import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; +import javax.persistence.NoResultException; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.From; @@ -151,6 +152,19 @@ public List getAllLaboratories() { return facilities; } + public Facility getByName(String name) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(getElementClass()); + Root from = cq.from(getElementClass()); + + cq.where(cb.equal(from.get(Facility.NAME), name)); + try { + return em.createQuery(cq).getSingleResult(); + } catch (NoResultException e) { + return null; + } + } + @SuppressWarnings("rawtypes") @Override public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From from, User user) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/hospitalization/Hospitalization.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/hospitalization/Hospitalization.java index 752b0044ff7..6f574b37a1a 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/hospitalization/Hospitalization.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/hospitalization/Hospitalization.java @@ -15,6 +15,7 @@ import de.symeda.auditlog.api.Audited; import de.symeda.sormas.api.utils.YesNoUnknown; import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.common.ImportIgnore; @Entity @Audited @@ -73,7 +74,8 @@ public Date getIsolationDate() { public void setIsolationDate(Date isolationDate) { this.isolationDate = isolationDate; } - + + @ImportIgnore @Enumerated(EnumType.STRING) public YesNoUnknown getHospitalizedPreviously() { return hospitalizedPreviously; @@ -102,6 +104,7 @@ public void setAdmittedToHealthFacility(YesNoUnknown admittedToHealthFacility) { * This change date has to be set whenever one of the embedded lists is modified: !oldList.equals(newList) * @return */ + @ImportIgnore public Date getChangeDateOfEmbeddedLists() { return changeDateOfEmbeddedLists; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/hospitalization/HospitalizationService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/hospitalization/HospitalizationService.java index 3e607289a70..08fca44efce 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/hospitalization/HospitalizationService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/hospitalization/HospitalizationService.java @@ -7,6 +7,7 @@ import javax.persistence.criteria.From; import javax.persistence.criteria.Predicate; +import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.backend.common.AbstractAdoService; import de.symeda.sormas.backend.user.User; @@ -17,6 +18,13 @@ public class HospitalizationService extends AbstractAdoService public HospitalizationService() { super(Hospitalization.class); } + + public Hospitalization createHospitalization() { + Hospitalization hospitalization = new Hospitalization(); + hospitalization.setUuid(DataHelper.createUuid()); + + return hospitalization; + } @Override public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From from, User user) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportErrorException.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportErrorException.java new file mode 100644 index 00000000000..bc72bc79683 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportErrorException.java @@ -0,0 +1,34 @@ +package de.symeda.sormas.backend.importexport; + +public class ImportErrorException extends Exception { + + private static final long serialVersionUID = -5852533615013283186L; + + private String value; + private String columnName; + private String customMessage; + + public ImportErrorException(String customMessage) { + super(); + this.customMessage = customMessage; + } + + public ImportErrorException(String value, String columnName) { + super(); + this.value = value; + this.columnName = columnName; + } + + public String getValue() { + return value; + } + + public String getColumnName() { + return columnName; + } + + public String getCustomMessage() { + return customMessage; + } + +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportExportFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportExportFacadeEjb.java new file mode 100644 index 00000000000..22b3c773c47 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportExportFacadeEjb.java @@ -0,0 +1,557 @@ +package de.symeda.sormas.backend.importexport; + +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Random; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import javax.ejb.EJB; +import javax.ejb.LocalBean; +import javax.ejb.Stateless; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.opencsv.CSVReader; +import com.opencsv.CSVWriter; + +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.importexport.DatabaseTable; +import de.symeda.sormas.api.importexport.ImportExportFacade; +import de.symeda.sormas.api.importexport.InvalidColumnException; +import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.utils.ExportErrorException; +import de.symeda.sormas.backend.caze.Case; +import de.symeda.sormas.backend.caze.CaseFacadeEjb; +import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal; +import de.symeda.sormas.backend.caze.CaseService; +import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.common.ConfigFacadeEjb.ConfigFacadeEjbLocal; +import de.symeda.sormas.backend.common.ImportIgnore; +import de.symeda.sormas.backend.contact.Contact; +import de.symeda.sormas.backend.epidata.EpiData; +import de.symeda.sormas.backend.epidata.EpiDataBurial; +import de.symeda.sormas.backend.epidata.EpiDataGathering; +import de.symeda.sormas.backend.epidata.EpiDataService; +import de.symeda.sormas.backend.epidata.EpiDataTravel; +import de.symeda.sormas.backend.event.Event; +import de.symeda.sormas.backend.event.EventParticipant; +import de.symeda.sormas.backend.facility.Facility; +import de.symeda.sormas.backend.facility.FacilityService; +import de.symeda.sormas.backend.hospitalization.Hospitalization; +import de.symeda.sormas.backend.hospitalization.HospitalizationService; +import de.symeda.sormas.backend.hospitalization.PreviousHospitalization; +import de.symeda.sormas.backend.location.Location; +import de.symeda.sormas.backend.outbreak.Outbreak; +import de.symeda.sormas.backend.person.Person; +import de.symeda.sormas.backend.person.PersonService; +import de.symeda.sormas.backend.region.Community; +import de.symeda.sormas.backend.region.CommunityService; +import de.symeda.sormas.backend.region.District; +import de.symeda.sormas.backend.region.DistrictService; +import de.symeda.sormas.backend.region.Region; +import de.symeda.sormas.backend.region.RegionService; +import de.symeda.sormas.backend.sample.Sample; +import de.symeda.sormas.backend.sample.SampleTest; +import de.symeda.sormas.backend.symptoms.Symptoms; +import de.symeda.sormas.backend.task.Task; +import de.symeda.sormas.backend.user.User; +import de.symeda.sormas.backend.user.UserService; +import de.symeda.sormas.backend.util.CSVUtils; +import de.symeda.sormas.backend.util.ModelConstants; +import de.symeda.sormas.backend.visit.Visit; + +@Stateless(name = "ImportExportFacade") +public class ImportExportFacadeEjb implements ImportExportFacade { + + @PersistenceContext(unitName = ModelConstants.PERSISTENCE_UNIT_NAME) + protected EntityManager em; + + @EJB + private ConfigFacadeEjbLocal configFacade; + @EJB + private CaseFacadeEjbLocal caseFacade; + @EJB + private CaseService caseService; + @EJB + private UserService userService; + @EJB + private RegionService regionService; + @EJB + private DistrictService districtService; + @EJB + private CommunityService communityService; + @EJB + private FacilityService facilityService; + @EJB + private PersonService personService; + @EJB + private HospitalizationService hospitalizationService; + @EJB + private EpiDataService epiDataService; + + private static final String CASE_IMPORT_TEMPLATE_FILE_NAME = "sormas_import_case_template.csv"; + private static final String ERROR_COLUMN_NAME = "Error description"; + + private static final Logger logger = LoggerFactory.getLogger(CaseFacadeEjb.class); + + @Override + public String generateDatabaseExportArchive(List databaseTables) throws ExportErrorException, IOException { + // Create the folder if it doesn't exist + try { + Files.createDirectories(Paths.get(configFacade.getTempFilesPath())); + } catch (IOException e) { + logger.error("Temp directory doesn't exist and creation failed."); + throw e; + } + + // Export all selected tables to .csv files + String date = DateHelper.formatDateForExport(new Date()); + int randomNumber = new Random().nextInt(Integer.MAX_VALUE); + for (DatabaseTable databaseTable : databaseTables) { + switch (databaseTable) { + case CASES: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Case.TABLE_NAME).getResultList(); + break; + case HOSPITALIZATIONS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Hospitalization.TABLE_NAME).getResultList(); + break; + case PREVIOUSHOSPITALIZATIONS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, PreviousHospitalization.TABLE_NAME).getResultList(); + break; + case EPIDATA: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, EpiData.TABLE_NAME).getResultList(); + break; + case EPIDATABURIALS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, EpiDataBurial.TABLE_NAME).getResultList(); + break; + case EPIDATAGATHERINGS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, EpiDataGathering.TABLE_NAME).getResultList(); + break; + case EPIDATATRAVELS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, EpiDataTravel.TABLE_NAME).getResultList(); + break; + case CONTACTS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Contact.TABLE_NAME).getResultList(); + break; + case VISITS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Visit.TABLE_NAME).getResultList(); + break; + case EVENTS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Event.TABLE_NAME).getResultList(); + break; + case EVENTPARTICIPANTS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, EventParticipant.TABLE_NAME).getResultList(); + break; + case SAMPLES: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Sample.TABLE_NAME).getResultList(); + break; + case SAMPLETESTS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, SampleTest.TABLE_NAME).getResultList(); + break; + case TASKS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Task.TABLE_NAME).getResultList(); + break; + case PERSONS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Person.TABLE_NAME).getResultList(); + break; + case LOCATIONS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Location.TABLE_NAME).getResultList(); + break; + case REGIONS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Region.TABLE_NAME).getResultList(); + break; + case DISTRICTS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, District.TABLE_NAME).getResultList(); + break; + case COMMUNITIES: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Community.TABLE_NAME).getResultList(); + break; + case FACILITIES: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Facility.TABLE_NAME).getResultList(); + break; + case OUTBREAKS: + generateCsvExportQuery(databaseTable.getFileName(), date, randomNumber, Outbreak.TABLE_NAME).getResultList(); + break; + case CASE_SYMPTOMS: + generateCsvExportJoinQuery(databaseTable.getFileName(), date, randomNumber, Symptoms.TABLE_NAME, Case.TABLE_NAME, "id", "symptoms_id").getResultList(); + break; + case VISIT_SYMPTOMS: + generateCsvExportJoinQuery(databaseTable.getFileName(), date, randomNumber, Symptoms.TABLE_NAME, Visit.TABLE_NAME, "id", "symptoms_id").getResultList(); + break; + } + } + + // Create a zip containing all created .csv files + return createZipFromCsvFiles(databaseTables, date, randomNumber); + } + + @Override + public void generateCaseImportTemplateFile() throws IOException { + // Create the export directory if it doesn't exist + try { + Files.createDirectories(Paths.get(configFacade.getTempFilesPath())); + } catch (IOException e) { + logger.error("Temp directory doesn't exist and creation failed."); + throw e; + } + + List columnNames = new ArrayList<>(); + try { + buildListOfFields(columnNames, Case.class, ""); + } catch (IntrospectionException e) { + throw new IOException(e); + } + + Path filePath = Paths.get(getCaseImportTemplateFilePath()); + CSVWriter writer = CSVUtils.createCSVWriter(new FileWriter(filePath.toString())); + writer.writeNext(columnNames.toArray(new String[columnNames.size()])); + writer.flush(); + writer.close(); + } + + @Override + public String getCaseImportTemplateFilePath() { + Path exportDirectory = Paths.get(configFacade.getTempFilesPath()); + Path filePath = exportDirectory.resolve(CASE_IMPORT_TEMPLATE_FILE_NAME); + return filePath.toString(); + } + + @Override + public String importCasesFromCsvFile(String csvFilePath, String userUuid) throws IOException, InvalidColumnException { + File file = new File(csvFilePath); + if (!file.exists()) { + throw new FileNotFoundException("Cases .csv file does not exist"); + } + + CSVReader reader = CSVUtils.createCSVReader(new FileReader(csvFilePath)); + + // Build dictionary of column paths + String[] headersLine = reader.readNext(); + List headers = new ArrayList<>(); + for (String header : headersLine) { + String[] headerPath = header.split("\\."); + headers.add(headerPath); + } + + // Create error report file + Path exportDirectory = Paths.get(configFacade.getTempFilesPath()); + Path errorReportFilePath = exportDirectory.resolve("sormas_error_report_" + DataHelper.getShortUuid(userUuid) + "_" + DateHelper.formatDateForExport(new Date()) + ".csv"); + generateCaseErrorReportFile(headersLine, errorReportFilePath.toString()); + CSVWriter errorReportWriter = CSVUtils.createCSVWriter(new FileWriter(errorReportFilePath.toString(), true)); + + // Create a new case for each line in the .csv file + String[] nextLine; + boolean hasImportError = false; + while ((nextLine = reader.readNext()) != null) { + // Check whether the new line has the same length as the header line + if (nextLine.length > headersLine.length) { + hasImportError = true; + writeImportErrorToFile(errorReportWriter, nextLine, "This line is longer than the header line."); + continue; + } + + Case newCase = caseService.createCase(); + boolean caseHasImportError = false; + for (int i = 0; i < nextLine.length; i++) { + String entry = nextLine[i]; + if (entry == null || entry.isEmpty()) { + continue; + } + + String[] entryHeaderPath = headers.get(i); + // Error description column is ignored + if (entryHeaderPath[0].equals(ERROR_COLUMN_NAME)) { + continue; + } + + try { + insertColumnEntryIntoCase(newCase, entry, entryHeaderPath); + } catch (ImportErrorException e) { + hasImportError = true; + caseHasImportError = true; + if (e.getCustomMessage() != null) { + writeImportErrorToFile(errorReportWriter, nextLine, e.getCustomMessage()); + } else { + writeImportErrorToFile(errorReportWriter, nextLine, "Invalid value " + e.getValue() + " in column " + e.getColumnName()); + } + break; + } catch (InvalidColumnException e) { + reader.close(); + errorReportWriter.flush(); + errorReportWriter.close(); + throw e; + } + } + + if (!caseHasImportError) { + // Check whether there are any infrastructure errors + if (!newCase.getDistrict().getRegion().equals(newCase.getRegion())) { + hasImportError = true; + writeImportErrorToFile(errorReportWriter, nextLine, "Could not find a database entry for the specified district in the specified region."); + continue; + } + if (newCase.getCommunity() != null && !newCase.getCommunity().getDistrict().equals(newCase.getDistrict())) { + hasImportError = true; + writeImportErrorToFile(errorReportWriter, nextLine, "Could not find a database entry for the specified community in the specified district."); + continue; + } + if (newCase.getCommunity() == null && !newCase.getHealthFacility().getDistrict().equals(newCase.getDistrict())) { + hasImportError = true; + writeImportErrorToFile(errorReportWriter, nextLine, "Could not find a database entry for the specified health facility in the specified district."); + continue; + } + if (newCase.getCommunity() != null && !newCase.getHealthFacility().getCommunity().equals(newCase.getCommunity())) { + hasImportError = true; + writeImportErrorToFile(errorReportWriter, nextLine, "Could not find a database entry for the specified health facility in the specified community."); + continue; + } + + personService.ensurePersisted(newCase.getPerson()); + hospitalizationService.ensurePersisted(newCase.getHospitalization()); + epiDataService.ensurePersisted(newCase.getEpiData()); + caseFacade.saveCase(CaseFacadeEjbLocal.toDto(newCase)); + } + } + + reader.close(); + errorReportWriter.flush(); + errorReportWriter.close(); + return hasImportError ? errorReportFilePath.toString() : null; + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private void insertColumnEntryIntoCase(Case caze, String entry, String[] entryHeaderPath) throws InvalidColumnException, ImportErrorException { + Object currentElement = caze; + for (int i = 0; i < entryHeaderPath.length; i++) { + String headerPathElementName = entryHeaderPath[i]; + + try { + if (i == entryHeaderPath.length - 1) { + PropertyDescriptor pd = new PropertyDescriptor(headerPathElementName, currentElement.getClass()); + Class propertyType = pd.getPropertyType(); + + if (propertyType.isEnum()) { + pd.getWriteMethod().invoke(currentElement, Enum.valueOf((Class) propertyType, entry)); + } else if (propertyType.isAssignableFrom(Date.class)) { + pd.getWriteMethod().invoke(currentElement, DateHelper.parseDateWithException(entry)); + } else if (propertyType.isAssignableFrom(Integer.class)) { + pd.getWriteMethod().invoke(currentElement, Integer.parseInt(entry)); + } else if (propertyType.isAssignableFrom(Double.class)) { + pd.getWriteMethod().invoke(currentElement, Double.parseDouble(entry)); + } else if (propertyType.isAssignableFrom(Float.class)) { + pd.getWriteMethod().invoke(currentElement, Float.parseFloat(entry)); + } else if (propertyType.isAssignableFrom(Boolean.class)) { + pd.getWriteMethod().invoke(currentElement, Boolean.parseBoolean(entry)); + } else if (propertyType.isAssignableFrom(Region.class)) { + Region region = regionService.getByName(entry); + if (region != null) { + pd.getWriteMethod().invoke(currentElement, region); + } else { + throw new ImportErrorException("Invalid value \"" + entry + "\" in column " + buildHeaderPathString(entryHeaderPath) + "; Entry does not exist in the database"); + } + } else if (propertyType.isAssignableFrom(District.class)) { + District district = districtService.getByName(entry); + if (district != null) { + pd.getWriteMethod().invoke(currentElement, district); + } else { + throw new ImportErrorException("Invalid value \"" + entry + "\" in column " + buildHeaderPathString(entryHeaderPath) + "; Entry does not exist in the database"); + } + } else if (propertyType.isAssignableFrom(Community.class)) { + Community community = communityService.getByName(entry); + if (community != null) { + pd.getWriteMethod().invoke(currentElement, community); + } else { + throw new ImportErrorException("Invalid value \"" + entry + "\" in column " + buildHeaderPathString(entryHeaderPath) + "; Entry does not exist in the database"); + } + } else if (propertyType.isAssignableFrom(Facility.class)) { + Facility facility = facilityService.getByName(entry); + if (facility != null) { + pd.getWriteMethod().invoke(currentElement, facility); + } else { + throw new ImportErrorException("Invalid value \"" + entry + "\" in column " + buildHeaderPathString(entryHeaderPath) + "; Entry does not exist in the database"); + } + } else if (propertyType.isAssignableFrom(User.class)) { + User user = userService.getByUserName(entry); + if (user != null) { + pd.getWriteMethod().invoke(currentElement, user); + } else { + throw new ImportErrorException("Invalid value \"" + entry + "\" in column " + buildHeaderPathString(entryHeaderPath) + "; Entry does not exist in the database"); + } + } else if (propertyType.isAssignableFrom(String.class)) { + pd.getWriteMethod().invoke(currentElement, entry); + } else { + throw new UnsupportedOperationException ("Property type " + propertyType.getName() + " not allowed when importing cases."); + } + } else { + currentElement = new PropertyDescriptor(headerPathElementName, currentElement.getClass()).getReadMethod().invoke(currentElement); + } + } catch (IntrospectionException e) { + throw new InvalidColumnException(buildHeaderPathString(entryHeaderPath)); + } catch (InvocationTargetException | IllegalAccessException e) { + throw new ImportErrorException("The import failed because of an error in column " + buildHeaderPathString(entryHeaderPath)); + } catch (IllegalArgumentException e) { + throw new ImportErrorException(entry, buildHeaderPathString(entryHeaderPath)); + } catch (ParseException e) { + throw new ImportErrorException("Invalid date in column " + buildHeaderPathString(entryHeaderPath) + "; Allowed date formats are dd/MM/yyyy, dd.MM.yyyy and dd-MM-yyyy"); + } + } + } + + private void writeImportErrorToFile(CSVWriter errorReportWriter, String[] nextLine, String message) throws IOException { + List nextLineAsList = new ArrayList<>(); + nextLineAsList.add(message); + nextLineAsList.addAll(Arrays.asList(nextLine)); + errorReportWriter.writeNext(nextLineAsList.toArray(new String[nextLineAsList.size()])); + } + + private String buildHeaderPathString(String[] entryHeaderPath) { + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (String headerPathElement : entryHeaderPath) { + if (first) { + sb.append(headerPathElement); + first = false; + } else { + sb.append(".").append(headerPathElement); + } + } + + return sb.toString(); + } + + /** + * Creates a zip by collecting all .csv files that match the file names of the passed databaseTables plus + * the date and randomNumber suffixes. The zip is stored in the same export folder that contains the .csv files + * and its file path is returned. + */ + private String createZipFromCsvFiles(List databaseTables, String date, int randomNumber) throws ExportErrorException { + try { + Path path = new File(configFacade.getTempFilesPath()).toPath(); + String name = "sormas_export_" + date + "_" + randomNumber + ".zip"; + Path filePath = path.resolve(name); + String zipPath = filePath.toString(); + FileOutputStream fos = new FileOutputStream(zipPath); + BufferedOutputStream bos = new BufferedOutputStream(fos); + ZipOutputStream zos = new ZipOutputStream(bos); + + for (DatabaseTable databaseTable : databaseTables) { + name = "sormas_export_" + databaseTable.getFileName() + "_" + date + "_" + randomNumber + ".csv"; + filePath = path.resolve(name); + zos.putNextEntry(new ZipEntry(databaseTable.getFileName() + ".csv")); + byte[] bytes = Files.readAllBytes(filePath); + zos.write(bytes, 0, bytes.length); + zos.closeEntry(); + } + + zos.close(); + return zipPath; + } catch (IOException e) { + logger.error("Failed to generate a zip file for database export."); + throw new ExportErrorException(); + } + } + + /** + * Generates the query used to create a .csv file of this table. In order to gain access to the server file system, a function + * that needs to be defined in the database is used. The path to save the .csv file to needs to be specified in the sormas.properties file. + */ + private Query generateCsvExportQuery(String fileName, String date, int randomNumber, String tableName) { + Path path = new File(FacadeProvider.getConfigFacade().getTempFilesPath()).toPath(); + String name = "sormas_export_" + fileName + "_" + date + "_" + randomNumber + ".csv"; + Path filePath = path.resolve(name); + return em.createNativeQuery("SELECT export_database('" + tableName + "', '" + filePath + "');"); + } + + /** + * Generates the query used to create a .csv file of a this table, joined with another table. This is specifially used to only retrieve + * the symptoms of cases or visits to export two different tables for this data. + */ + private Query generateCsvExportJoinQuery(String fileName, String date, int randomNumber, String tableName, String joinTableName, String columnName, String joinColumnName) { + Path path = new File(FacadeProvider.getConfigFacade().getTempFilesPath()).toPath(); + String name = "sormas_export_" + fileName + "_" + date + "_" + randomNumber + ".csv"; + Path filePath = path.resolve(name); + return em.createNativeQuery("SELECT export_database_join('" + tableName + "', '" + joinTableName + "', '" + tableName + "." + columnName + "', '" + joinTableName + "." + joinColumnName + "', '" + + filePath + "');"); + } + + private void buildListOfFields(List fieldNames, Class clazz, String prefix) throws IntrospectionException { + for (PropertyDescriptor pd : Introspector.getBeanInfo(clazz).getPropertyDescriptors()) { + // Fields with the @ImportIgnore annotation are ignored + if (pd.getReadMethod().isAnnotationPresent(ImportIgnore.class)) { + continue; + } + // Fields without a getter or whose getters are declared in a superclass are ignored + if (pd.getReadMethod() == null || pd.getReadMethod().getDeclaringClass() != clazz) { + continue; + } + // List types are ignored + if (Collection.class.isAssignableFrom(pd.getPropertyType())) { + continue; + } + // Certain field types are ignored + if (pd.getPropertyType() == User.class) { + continue; + } + // Other non-infrastructure entity class, recursively call this method to include fields of the sub-entity + if (AbstractDomainObject.class.isAssignableFrom(pd.getPropertyType()) && !isInfrastructureClass(pd.getPropertyType())) { + buildListOfFields(fieldNames, pd.getPropertyType(), prefix == null || prefix.isEmpty() ? pd.getName() + "." : prefix + pd.getName() + "."); + } else { + // All other field types + fieldNames.add(prefix + pd.getName()); + } + } + } + + private void generateCaseErrorReportFile(String[] columns, String filePath) throws IOException { + List columnNames = new ArrayList<>(); + columnNames.add(ERROR_COLUMN_NAME); + for (String column : columns) { + columnNames.add(column); + } + + // If the file already exists, delete it + File errorReportFile = new File(filePath); + if (errorReportFile.exists()) { + errorReportFile.delete(); + } + + CSVWriter writer = CSVUtils.createCSVWriter(new FileWriter(filePath)); + writer.writeNext(columnNames.toArray(new String[columnNames.size()])); + writer.flush(); + writer.close(); + } + + private boolean isInfrastructureClass(Class clazz) { + return clazz == Region.class || clazz == District.class || clazz == Community.class || clazz == Facility.class; + } + + @LocalBean + @Stateless + public static class ImportExportFacadeEjbLocal extends ImportExportFacadeEjb { + } + +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java index 3cf437595f5..18ba6ec62ec 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/person/PersonFacadeEjb.java @@ -23,6 +23,7 @@ import de.symeda.sormas.api.person.PersonReferenceDto; import de.symeda.sormas.api.region.DistrictReferenceDto; import de.symeda.sormas.api.user.UserReferenceDto; +import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DataHelper.Pair; import de.symeda.sormas.backend.facility.FacilityFacadeEjb; import de.symeda.sormas.backend.facility.FacilityService; @@ -194,6 +195,14 @@ public PersonDto savePerson(PersonDto dto) { } + @Override + public PersonDto buildPerson() { + PersonDto person = new PersonDto(); + person.setUuid(DataHelper.createUuid()); + + return person; + } + public Person fromDto(@NotNull PersonDto source) { Person target = personService.getByUuid(source.getUuid()); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/region/CommunityService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/region/CommunityService.java index c94b8bd3e18..3090611bfbe 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/region/CommunityService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/region/CommunityService.java @@ -6,10 +6,12 @@ import javax.ejb.LocalBean; import javax.ejb.Stateless; +import javax.persistence.NoResultException; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.From; import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import de.symeda.sormas.backend.common.AbstractAdoService; import de.symeda.sormas.backend.user.User; @@ -24,6 +26,19 @@ public CommunityService() { super(Community.class); } + public Community getByName(String name) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(getElementClass()); + Root from = cq.from(getElementClass()); + + cq.where(cb.equal(from.get(Community.NAME), name)); + try { + return em.createQuery(cq).getSingleResult(); + } catch (NoResultException e) { + return null; + } + } + @Override public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From from, User user) { // no fitler by user needed diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/region/DistrictService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/region/DistrictService.java index a881c26feee..2b0e6932f03 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/region/DistrictService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/region/DistrictService.java @@ -6,6 +6,7 @@ import javax.ejb.LocalBean; import javax.ejb.Stateless; +import javax.persistence.NoResultException; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.From; @@ -47,6 +48,19 @@ public int getCountByRegion(Region region) { return em.createQuery(cq).getSingleResult().intValue(); } + + public District getByName(String name) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(getElementClass()); + Root from = cq.from(getElementClass()); + + cq.where(cb.equal(from.get(District.NAME), name)); + try { + return em.createQuery(cq).getSingleResult(); + } catch (NoResultException e) { + return null; + } + } @Override public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From from, User user) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/region/RegionService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/region/RegionService.java index 67f7182c4ab..c6a0917ed9b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/region/RegionService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/region/RegionService.java @@ -5,6 +5,7 @@ import javax.ejb.LocalBean; import javax.ejb.Stateless; +import javax.persistence.NoResultException; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.From; @@ -44,6 +45,19 @@ public List getAllWithoutPopulationData() { return em.createQuery(cq).getResultList(); } + public Region getByName(String name) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(getElementClass()); + Root from = cq.from(getElementClass()); + + cq.where(cb.equal(from.get(Region.NAME), name)); + try { + return em.createQuery(cq).getSingleResult(); + } catch (NoResultException e) { + return null; + } + } + @Override public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From from, User user) { // no fitler by user needed diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/symptoms/Symptoms.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/symptoms/Symptoms.java index bab7e56234b..65021d2c3a5 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/symptoms/Symptoms.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/symptoms/Symptoms.java @@ -13,6 +13,7 @@ import de.symeda.sormas.api.symptoms.SymptomState; import de.symeda.sormas.api.symptoms.TemperatureSource; import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.common.ImportIgnore; @Entity @Audited @@ -124,6 +125,7 @@ public void setOnsetDate(Date onsetDate) { this.onsetDate = onsetDate; } + @ImportIgnore @Column(length = 255) public String getPatientIllLocation() { return patientIllLocation; @@ -502,6 +504,7 @@ public SymptomState getSeizures() { return seizures; } + @ImportIgnore public Boolean getSymptomatic() { return symptomatic; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/util/CSVUtils.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/CSVUtils.java new file mode 100644 index 00000000000..cfbbe424a6c --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/util/CSVUtils.java @@ -0,0 +1,23 @@ +package de.symeda.sormas.backend.util; + +import java.io.FileReader; +import java.io.FileWriter; + +import com.opencsv.CSVParserBuilder; +import com.opencsv.CSVReader; +import com.opencsv.CSVReaderBuilder; +import com.opencsv.CSVWriter; + +public class CSVUtils { + + private static final char DEFAULT_SEPARATOR = ';'; + + public static CSVReader createCSVReader(FileReader fileReader) { + return new CSVReaderBuilder(fileReader).withCSVParser(new CSVParserBuilder().withSeparator(DEFAULT_SEPARATOR).build()).build(); + } + + public static CSVWriter createCSVWriter(FileWriter fileWriter) { + return new CSVWriter(fileWriter, DEFAULT_SEPARATOR, CSVWriter.DEFAULT_QUOTE_CHARACTER, CSVWriter.DEFAULT_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END); + } + +} diff --git a/sormas-base/glassfish-config/sormas.properties b/sormas-base/glassfish-config/sormas.properties index 373bbcc9f0a..d719264ea64 100644 --- a/sormas-base/glassfish-config/sormas.properties +++ b/sormas-base/glassfish-config/sormas.properties @@ -2,9 +2,9 @@ country.name=nigeria app.url=https://sormas.symeda.de/download/sormas-debug.apk -# Path where exports will be saved - both payara and PostgreSQL need read and write access to this folder; +# Path where temporary files will be saved - both payara and PostgreSQL need read and write access to this folder; # make sure this uses the right separators based on the operating system used (\\ (escaped) for Windows, / for Linux) -export.path=/tmp/sormas_export/ +temp.path=/opt/sormas-temp/ email.sender.address=noreply@symeda.de email.sender.name=SORMAS diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index ed100d0e1f3..d24c1ba2a5a 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 de.symeda.sormas @@ -270,6 +271,14 @@ client 3.3.0 + + + + com.opencsv + opencsv + 4.1 + + diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseImportLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseImportLayout.java new file mode 100644 index 00000000000..3ed09cd6afc --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseImportLayout.java @@ -0,0 +1,188 @@ +package de.symeda.sormas.ui.caze; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Paths; +import java.util.Date; + +import com.vaadin.server.FileDownloader; +import com.vaadin.server.FontAwesome; +import com.vaadin.server.Page; +import com.vaadin.server.Resource; +import com.vaadin.server.StreamResource; +import com.vaadin.ui.Button; +import com.vaadin.ui.Label; +import com.vaadin.ui.Notification; +import com.vaadin.ui.Notification.Type; +import com.vaadin.ui.Upload; +import com.vaadin.ui.Upload.Receiver; +import com.vaadin.ui.Upload.SucceededEvent; +import com.vaadin.ui.Upload.SucceededListener; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.themes.ValoTheme; + +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.importexport.InvalidColumnException; +import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.ui.login.LoginHelper; +import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.DownloadUtil; + +@SuppressWarnings("serial") +public class CaseImportLayout extends VerticalLayout { + + private Button downloadErrorReportButton; + + public CaseImportLayout() { + setMargin(true); + + // Step 1: Download SORMAS Import Guide + String headline = "Download and read the SORMAS Import Guide"; + String infoText = "If this is your first time importing data into SORMAS, we strongly recommend to read the import guide first."; + Resource buttonIcon = FontAwesome.DOWNLOAD; + String buttonCaption = "Download Import Guide"; + CaseImportLayoutComponent importGuideComponent = new CaseImportLayoutComponent(1, headline, infoText, buttonIcon, buttonCaption); + importGuideComponent.getButton().addClickListener(e -> { + // TODO implement + // TODO add expected encoding to guide + }); + CssStyles.style(importGuideComponent, CssStyles.VSPACE_2); + addComponent(importGuideComponent); + + // Step 2: Download case import template + headline = "Download the case import template"; + infoText = "You can use this template .csv file to bring your data into a format SORMAS can read. Please do this every time you import data," + + " never use a file you have downloaded before."; + buttonCaption = "Download Case Import Template"; + CaseImportLayoutComponent importTemplateComponent = new CaseImportLayoutComponent(2, headline, infoText, buttonIcon, buttonCaption); + String filePath = FacadeProvider.getImportExportFacade().getCaseImportTemplateFilePath().toString(); + StreamResource streamResource = DownloadUtil.createStreamResource(null, filePath, "sormas_import_case_template.csv", "text/csv", + "Template not available", "The template file is not available. Please contact an admin and tell them about this issue."); + FileDownloader fileDownloader = new FileDownloader(streamResource); + fileDownloader.extend(importTemplateComponent.getButton()); + CssStyles.style(importTemplateComponent, CssStyles.VSPACE_2); + addComponent(importTemplateComponent); + + // Step 3: Upload .csv file + headline = "Import .csv file"; + infoText = "Depending on the amount of cases you want to import, this may take a while. You will receive a notification when the import process" + + "has finished."; + CaseImportLayoutComponent importCasesComponent = new CaseImportLayoutComponent(3, headline, infoText, null, null); + addComponent(importCasesComponent); + CaseImportUploader receiver = new CaseImportUploader(); + Upload upload = new Upload("", receiver); + upload.setButtonCaption("Upload Case List"); + CssStyles.style(upload, ValoTheme.BUTTON_PRIMARY, CssStyles.VSPACE_2); + upload.addSucceededListener(receiver); + addComponent(upload); + + // Step 4: Download error report + headline = "Download error report"; + infoText = "If there were any cases that could not be imported, you will be offered a .csv file containing all these cases " + + " as well as the error descriptions."; + buttonIcon = FontAwesome.DOWNLOAD; + buttonCaption = "Download Error Report"; + CaseImportLayoutComponent errorReportComponent = new CaseImportLayoutComponent(4, headline, infoText, buttonIcon, buttonCaption); + downloadErrorReportButton = errorReportComponent.getButton(); + errorReportComponent.getButton().setEnabled(false); + errorReportComponent.getButton().addClickListener(e -> { + + }); + addComponent(errorReportComponent); + } + + private class CaseImportLayoutComponent extends VerticalLayout { + + private Label headlineLabel; + private Label infoTextLabel; + private Button button; + + public CaseImportLayoutComponent(int step, String headline, String infoText, Resource buttonIcon, String buttonCaption) { + setSpacing(false); + + headlineLabel = new Label("Step " + step + ": " + headline); + CssStyles.style(headlineLabel, CssStyles.H3); + addComponent(headlineLabel); + + infoTextLabel = new Label(infoText); + addComponent(infoTextLabel); + + if (buttonCaption != null) { + button = new Button(buttonCaption, buttonIcon); + CssStyles.style(button, ValoTheme.BUTTON_PRIMARY, CssStyles.VSPACE_TOP_3); + addComponent(button); + } + } + + public Button getButton() { + return button; + } + + } + + private class CaseImportUploader implements Receiver, SucceededListener { + private File file; + @Override + public OutputStream receiveUpload(String fileName, String mimeType) { + // Reject empty files + if (fileName == null || fileName.isEmpty()) { + new Notification("No file", "You have not selected a file to upload. Please select a .csv file containing the cases you want to import from your computer.", Type.ERROR_MESSAGE, false).show(Page.getCurrent()); + // Workaround because returning null here throws an uncatchable UploadException + return new ByteArrayOutputStream(); + } + // Reject all files except .csv files - we also need to accept excel files here + if (!mimeType.equals("text/csv") && !mimeType.equals("application/vnd.ms-excel")) { + new Notification("Wrong file type", "Please provide a .csv file containing the cases you want to import. It's recommended to use the case import template file as a starting point.", Type.ERROR_MESSAGE, false).show(Page.getCurrent()); + // Workaround because returning null here throws an uncatchable UploadException + return new ByteArrayOutputStream(); + } + + FileOutputStream fos = null; + try { + String newFileName = "sormas_case_import_" + DateHelper.formatDateForExport(new Date()) + "_" + DataHelper.getShortUuid(LoginHelper.getCurrentUser().getUuid()) + ".csv"; + file = new File(Paths.get(FacadeProvider.getConfigFacade().getTempFilesPath()).resolve(newFileName).toString()); + fos = new FileOutputStream(file); + } catch (FileNotFoundException e) { + new Notification("Import error", "Could not import file.", Type.ERROR_MESSAGE, false).show(Page.getCurrent()); + // Workaround because returning null here throws an uncatchable UploadException + return new ByteArrayOutputStream(); + } + + downloadErrorReportButton.setEnabled(false); + return fos; + } + + @Override + public void uploadSucceeded(SucceededEvent event) { + if (file == null) { + return; + } + + try { + String errorReportFilePath = FacadeProvider.getImportExportFacade().importCasesFromCsvFile(file.getPath(), LoginHelper.getCurrentUser().getUuid()); + if (errorReportFilePath == null) { + new Notification("Import successful", "All cases have been imported. You can now close this window.", Type.HUMANIZED_MESSAGE, false).show(Page.getCurrent()); + } else { + new Notification("Import successful", "The import has been successful, but some of the cases could not be imported due to malformed data. Please download the error report below.", Type.WARNING_MESSAGE, false).show(Page.getCurrent()); + + StreamResource streamResource = DownloadUtil.createStreamResource(null, errorReportFilePath, "sormas_import_error_report.csv", "text/csv", + "Error report not available", "The error report file is not available. Please contact an admin and tell them about this issue."); + FileDownloader fileDownloader = new FileDownloader(streamResource); + fileDownloader.extend(downloadErrorReportButton); + downloadErrorReportButton.setEnabled(true); + } + } catch (IOException e) { + new Notification("Import failed", "The import failed due to a critical error. Please contact your admin and inform them about this issue.", Type.ERROR_MESSAGE, false).show(Page.getCurrent()); + } catch (InvalidColumnException e) { + new Notification("Invalid column", "The column \"" + e.getColumnName() + "\" is not part of the case or one of its connected entities. Please remove it from the .csv file and upload it again.", Type.ERROR_MESSAGE, false).show(Page.getCurrent()); + } + } + + } + +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java index 46655d03372..5c0e297ca57 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java @@ -7,6 +7,7 @@ import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.TextField; import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; import com.vaadin.ui.themes.ValoTheme; import de.symeda.sormas.api.Disease; @@ -29,6 +30,7 @@ import de.symeda.sormas.ui.login.LoginHelper; import de.symeda.sormas.ui.utils.AbstractView; import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.VaadinUiUtil; /** * A view for performing create-read-update-delete operations on products. @@ -45,6 +47,7 @@ public class CasesView extends AbstractView { public static final String SEARCH_FIELD = "searchField"; private CaseGrid grid; + private Button importButton; private Button createButton; private VerticalLayout gridLayout; @@ -52,6 +55,20 @@ public class CasesView extends AbstractView { public CasesView() { super(VIEW_NAME); + if (LoginHelper.hasUserRight(UserRight.CASE_IMPORT)) { + importButton = new Button("Import"); + importButton.addStyleName(ValoTheme.BUTTON_PRIMARY); + importButton.setIcon(FontAwesome.UPLOAD); + importButton.addClickListener(e -> { + Window popupWindow = VaadinUiUtil.showPopupWindow(new CaseImportLayout()); + popupWindow.setCaption("Import cases"); + popupWindow.addCloseListener(c -> { + grid.reload(); + }); + }); + addHeaderComponent(importButton); + } + if (LoginHelper.hasUserRight(UserRight.CASE_CREATE)) { createButton = new Button("New case"); createButton.addStyleName(ValoTheme.BUTTON_PRIMARY); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/statistics/DatabaseExportView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/statistics/DatabaseExportView.java index 8ad761ecc9f..801da4ea4e6 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/statistics/DatabaseExportView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/statistics/DatabaseExportView.java @@ -19,8 +19,8 @@ import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; -import de.symeda.sormas.api.export.DatabaseTable; -import de.symeda.sormas.api.export.DatabaseTableType; +import de.symeda.sormas.api.importexport.DatabaseTable; +import de.symeda.sormas.api.importexport.DatabaseTableType; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.DownloadUtil; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DownloadUtil.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DownloadUtil.java index 52a89f5bcd1..3795a1f98c0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DownloadUtil.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DownloadUtil.java @@ -9,12 +9,15 @@ import java.util.List; import java.util.Map; +import com.vaadin.server.Page; import com.vaadin.server.StreamResource; import com.vaadin.server.StreamResource.StreamSource; import com.vaadin.ui.CheckBox; +import com.vaadin.ui.Notification; +import com.vaadin.ui.Notification.Type; import de.symeda.sormas.api.FacadeProvider; -import de.symeda.sormas.api.export.DatabaseTable; +import de.symeda.sormas.api.importexport.DatabaseTable; import de.symeda.sormas.api.utils.ExportErrorException; import de.symeda.sormas.ui.statistics.DatabaseExportView; @@ -38,11 +41,9 @@ public InputStream getStream() { } } - String zipPath = FacadeProvider.getExportFacade().generateDatabaseExportArchive(tablesToExport); + String zipPath = FacadeProvider.getImportExportFacade().generateDatabaseExportArchive(tablesToExport); return new BufferedInputStream(Files.newInputStream(new File(zipPath).toPath())); - } catch (IOException e) { - throw new RuntimeException(e.getMessage(), e); - } catch (ExportErrorException e) { + } catch (IOException | ExportErrorException e) { // TODO This currently requires the user to click the "Export" button again or reload the page as the UI // is not automatically updated; this should be changed once Vaadin push is enabled (see #516) databaseExportView.showExportErrorNotification(); @@ -54,5 +55,25 @@ public InputStream getStream() { streamResource.setCacheTime(0); return streamResource; } + + @SuppressWarnings("serial") + public static StreamResource createStreamResource(AbstractView sourceView, String filePath, String fileName, String mimeType, String errorTitle, String errorText) { + StreamResource streamResource = new StreamResource(new StreamSource() { + @Override + public InputStream getStream() { + try { + return new BufferedInputStream(Files.newInputStream(new File(filePath).toPath())); + } catch (IOException e) { + // TODO This currently requires the user to click the "Export" button again or reload the page as the UI + // is not automatically updated; this should be changed once Vaadin push is enabled (see #516) + new Notification(errorTitle, errorText, Type.ERROR_MESSAGE, false).show(Page.getCurrent()); + return null; + } + } + }, fileName); + streamResource.setMIMEType(mimeType); + streamResource.setCacheTime(0); + return streamResource; + } } \ No newline at end of file diff --git a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/components/upload.scss b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/components/upload.scss new file mode 100644 index 00000000000..e4658546bb7 --- /dev/null +++ b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/components/upload.scss @@ -0,0 +1,30 @@ + +@mixin sormas-upload { + + .v-upload { + margin-top: -5px; + } + + .v-upload .v-button { + margin-top: 10px; + display: block; + width: 164px; + @extend .v-button-primary; + border: none; + } + + .v-upload .v-button .v-button-caption { + margin-top: 8px; + margin-left: 38px; + position: absolute; + } + + .v-upload .v-button:before { + content: "\f093"; + font-family: FontAwesome; + left: 20px; + position: absolute; + margin-top: 7px; + } + +} \ No newline at end of file diff --git a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/global.scss b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/global.scss index 89ae9b1e46d..0fbe5086707 100644 --- a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/global.scss +++ b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/global.scss @@ -44,23 +44,8 @@ } h3, .h3 { - margin-bottom: 16px; - - &::before { - background: #EEF2F8; - content: ""; - display: block; - position: relative; - top: 15px; - height: 2px; - width: 100%; - } - - span { - background: #FFF; - position: relative; - padding-right: 8px; - } + color: $s-secondary-color; + font-weight: 600; } h4, .h4 { diff --git a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/sormas.scss b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/sormas.scss index 389d7eb4752..9c69176c41c 100644 --- a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/sormas.scss +++ b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/sormas.scss @@ -76,6 +76,7 @@ $editor-caption-font-color: valo-font-color($editor-background-color, 0.5) !defa @import "components/svg.scss"; @import "components/customcomponent.scss"; @import "components/textarea.scss"; +@import "components/upload.scss"; @import "views/view.scss"; @import "views/about.scss"; @@ -117,6 +118,7 @@ $editor-caption-font-color: valo-font-color($editor-background-color, 0.5) !defa @include sormas-svg; @include sormas-customcomponent; @include sormas-textarea; + @include sormas-upload; @include sormas-view; @include sormas-about-view; From ec4f3570080a27bd6d60ef1f8dd177db43177c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 15 Mar 2018 15:20:43 +0100 Subject: [PATCH 06/16] #512 - added import guide --- .../api/importexport/ImportExportFacade.java | 2 ++ .../importexport/ImportExportFacadeEjb.java | 10 ++++++++++ .../sormas/ui/caze/CaseImportLayout.java | 19 ++++++++++--------- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportExportFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportExportFacade.java index 8fc45f5ead7..9a0be3f21a4 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportExportFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/ImportExportFacade.java @@ -26,6 +26,8 @@ public interface ImportExportFacade { String getCaseImportTemplateFilePath(); + String getSormasImportGuideFilePath(); + String importCasesFromCsvFile(String csvFilePath, String userUuid) throws IOException, InvalidColumnException; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportExportFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportExportFacadeEjb.java index 22b3c773c47..064cb476907 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportExportFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportExportFacadeEjb.java @@ -114,6 +114,7 @@ public class ImportExportFacadeEjb implements ImportExportFacade { private EpiDataService epiDataService; private static final String CASE_IMPORT_TEMPLATE_FILE_NAME = "sormas_import_case_template.csv"; + private static final String SORMAS_IMPORT_GUIDE_FILE_NAME = "SORMAS_Import_Guide.pdf"; private static final String ERROR_COLUMN_NAME = "Error description"; private static final Logger logger = LoggerFactory.getLogger(CaseFacadeEjb.class); @@ -239,6 +240,13 @@ public String getCaseImportTemplateFilePath() { Path filePath = exportDirectory.resolve(CASE_IMPORT_TEMPLATE_FILE_NAME); return filePath.toString(); } + + @Override + public String getSormasImportGuideFilePath() { + Path exportDirectory = Paths.get(configFacade.getTempFilesPath()); + Path filePath = exportDirectory.resolve(SORMAS_IMPORT_GUIDE_FILE_NAME); + return filePath.toString(); + } @Override public String importCasesFromCsvFile(String csvFilePath, String userUuid) throws IOException, InvalidColumnException { @@ -256,6 +264,8 @@ public String importCasesFromCsvFile(String csvFilePath, String userUuid) throws String[] headerPath = header.split("\\."); headers.add(headerPath); } + + // TODO NOT NULL CONSTRAINTS! // Create error report file Path exportDirectory = Paths.get(configFacade.getTempFilesPath()); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseImportLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseImportLayout.java index 3ed09cd6afc..5c3054a163a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseImportLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseImportLayout.java @@ -47,10 +47,11 @@ public CaseImportLayout() { Resource buttonIcon = FontAwesome.DOWNLOAD; String buttonCaption = "Download Import Guide"; CaseImportLayoutComponent importGuideComponent = new CaseImportLayoutComponent(1, headline, infoText, buttonIcon, buttonCaption); - importGuideComponent.getButton().addClickListener(e -> { - // TODO implement - // TODO add expected encoding to guide - }); + String importGuideFilePath = FacadeProvider.getImportExportFacade().getSormasImportGuideFilePath().toString(); + StreamResource importGuideResource = DownloadUtil.createStreamResource(null, importGuideFilePath, "SORMAS_Import_Guide.pdf", "application/pdf", "Import guide not available", + "The SORMAS Import Guide can not be found on the server. Please contact an admin and tell them about this issue."); + FileDownloader importGuideDownloader = new FileDownloader(importGuideResource); + importGuideDownloader.extend(importGuideComponent.getButton()); CssStyles.style(importGuideComponent, CssStyles.VSPACE_2); addComponent(importGuideComponent); @@ -60,11 +61,11 @@ public CaseImportLayout() { + " never use a file you have downloaded before."; buttonCaption = "Download Case Import Template"; CaseImportLayoutComponent importTemplateComponent = new CaseImportLayoutComponent(2, headline, infoText, buttonIcon, buttonCaption); - String filePath = FacadeProvider.getImportExportFacade().getCaseImportTemplateFilePath().toString(); - StreamResource streamResource = DownloadUtil.createStreamResource(null, filePath, "sormas_import_case_template.csv", "text/csv", + String templateFilePath = FacadeProvider.getImportExportFacade().getCaseImportTemplateFilePath().toString(); + StreamResource templateResource = DownloadUtil.createStreamResource(null, templateFilePath, "sormas_import_case_template.csv", "text/csv", "Template not available", "The template file is not available. Please contact an admin and tell them about this issue."); - FileDownloader fileDownloader = new FileDownloader(streamResource); - fileDownloader.extend(importTemplateComponent.getButton()); + FileDownloader templateFileDownloader = new FileDownloader(templateResource); + templateFileDownloader.extend(importTemplateComponent.getButton()); CssStyles.style(importTemplateComponent, CssStyles.VSPACE_2); addComponent(importTemplateComponent); @@ -136,7 +137,7 @@ public OutputStream receiveUpload(String fileName, String mimeType) { return new ByteArrayOutputStream(); } // Reject all files except .csv files - we also need to accept excel files here - if (!mimeType.equals("text/csv") && !mimeType.equals("application/vnd.ms-excel")) { + if (!(mimeType.equals("text/csv") || mimeType.equals("application/vnd.ms-excel"))) { new Notification("Wrong file type", "Please provide a .csv file containing the cases you want to import. It's recommended to use the case import template file as a starting point.", Type.ERROR_MESSAGE, false).show(Page.getCurrent()); // Workaround because returning null here throws an uncatchable UploadException return new ByteArrayOutputStream(); From 4c103841d6cacb5b5e403fcd981d63947a397ba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 15 Mar 2018 15:22:00 +0100 Subject: [PATCH 07/16] #512 - added current version of import guide to resources folder --- .../src/main/resources/SORMAS_Import_Guide.pdf | Bin 0 -> 368002 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 sormas-backend/src/main/resources/SORMAS_Import_Guide.pdf diff --git a/sormas-backend/src/main/resources/SORMAS_Import_Guide.pdf b/sormas-backend/src/main/resources/SORMAS_Import_Guide.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ac52f1d6065ccf685050581926039f00cba99a80 GIT binary patch literal 368002 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

=ra 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 literal 0 HcmV?d00001 From 16353c5f42fc6644b29575d702e095e1183c13d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 16 Mar 2018 08:43:23 +0100 Subject: [PATCH 08/16] #512 - added checks for required fields, updated import guide --- .../sormas/backend/caze/CaseService.java | 2 -- .../importexport/ImportExportFacadeEjb.java | 23 ++++++++++++++++-- .../main/resources/SORMAS_Import_Guide.pdf | Bin 368002 -> 367527 bytes 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index 083b8e83539..811c2c7bb40 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -104,8 +104,6 @@ public Case createCase() { caze.setReportDate(new Date()); User user = userService.getByUserName(sessionContext.getCallerPrincipal().getName()); caze.setReportingUser(user); - caze.setRegion(user.getRegion()); - caze.setDistrict(user.getDistrict()); return caze; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportExportFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportExportFacadeEjb.java index 064cb476907..8dfbd802d00 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportExportFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/ImportExportFacadeEjb.java @@ -264,8 +264,6 @@ public String importCasesFromCsvFile(String csvFilePath, String userUuid) throws String[] headerPath = header.split("\\."); headers.add(headerPath); } - - // TODO NOT NULL CONSTRAINTS! // Create error report file Path exportDirectory = Paths.get(configFacade.getTempFilesPath()); @@ -318,6 +316,27 @@ public String importCasesFromCsvFile(String csvFilePath, String userUuid) throws } if (!caseHasImportError) { + // Check whether any required field that does not have a not null constraint in the database is empty + if (newCase.getRegion() == null) { + hasImportError = true; + writeImportErrorToFile(errorReportWriter, nextLine, "You have to specify a valid region."); + continue; + } + if (newCase.getDistrict() == null) { + hasImportError = true; + writeImportErrorToFile(errorReportWriter, nextLine, "You have to specify a valid district."); + continue; + } + if (newCase.getHealthFacility() == null) { + hasImportError = true; + writeImportErrorToFile(errorReportWriter, nextLine, "You have to specify a valid health facility."); + continue; + } + if (newCase.getDisease() == null) { + hasImportError = true; + writeImportErrorToFile(errorReportWriter, nextLine, "You have to specify a valid disease."); + continue; + } // Check whether there are any infrastructure errors if (!newCase.getDistrict().getRegion().equals(newCase.getRegion())) { hasImportError = true; diff --git a/sormas-backend/src/main/resources/SORMAS_Import_Guide.pdf b/sormas-backend/src/main/resources/SORMAS_Import_Guide.pdf index ac52f1d6065ccf685050581926039f00cba99a80..c2dc084a04dd31bf6f665495b7edb8c6d07cc363 100644 GIT binary patch delta 13971 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

*~^XR9td)d~C=qrG zZ1ILua#Rre>6Rp_LNa3Yn(dmpriu@)Mj1*jn^Bq%jgQZICL@E*V!B zlhikxC3Xn!>~3gDc~U!qFpLq5_5Bd=7Ah0aXbP6%tvmv~z+l#NFz3RbdCOL{H0@h$ z7Uj(#YEjB>+SdV!kTvMC!*Z0*qY47x6 zy8x};DhU%KMq+om&3Yb4S<-P0yE}1TT<2UFt4lSlVTk_)<67#R7xN`Aw5A%UDQx_* zf~#|vXx$grayN<%T@V&i(IxE6+Ha9UvU`N7vP3@(@W`c5;TXoAbi+WZv%Ukbd0-5Y zPAltbr+>Bv+C2I*FJG*N3+c$D+k1PA;OP`Nom1H^7W$r(RzczXis&r#r zh%OZ@V6f$%V5(u_Yrr=Rfn?3bFa;=DxS&6@)RJC<7c*G6g`8l*=|9@`>z1z1R-`OO zjo*1i9;kdb z!jr5#=t^BILa{i5ULhz2F-zeKV?o7Ie)F7e+0_Y4HFVNKg=(sQMY=4(A^EFkj^hWD z&p;T_zzC88ELw2JM?v_( z>bNtf$u=z_eqF8B8l05{4|1qegj$b(Jc0+q7q$LI8POzDrgWj-fKIy5DUns_Ta`{h zI>>P+dF)K_?4h^=d}s(gH#_Hnap*M+=F6+_hRNW@@s~s@9{c)GZA!a?JM8^p6R$(E zuv}B-x}~zl%hg>+54r4KH=Q}pc1Sgu{ilQdH<~%ihuQ~k(;XI%kKMp-@yy#_iBheG z$lD;_F}7xV362d}0llgFOY4vamx`dX-|SjPORj}JvfIqU3k>iSzt+_Kn!*LWx2n}b zVuy{m1?4>O+`pY>v=0ZYA$#Aw{|PH)6cXJ&1kaURwyR5GP@O+d?|$IZ?LA_7-=*dREpvHZNN3@wqEIL!foIh_SzS! z?k$nr*o+IJZz=K}b_kg0&u~Zu0lA ztpYxtE*_lhU*%bEQrh=(9CySHzBbLoK)Zn_h1_crD8Jd8A z1qWeDrs^_CL;;!%?}&+glmpsa{IR24`1Yr1>P;^Vl}R*9_c=!j-#4Y{Mz3Vy^$8Q< zNB3zV$vVV18ya1wW&G4i*&QwOD=z46O|K9X5K%>?#ohJ0CydVMBP*xpGuUGcQ6$CB z`+j|mNj4+_zi9|xQgi6coi}2X*}d1cAWC9&;0UVF+yLf7JKC%)&!p08kkelUF1iL- zI!?eB6g!Db5C~BnM2AyaPsWrt(lUq{s%J%IxKW?MuJn0iBjeQ33Gip?VUOM(zaveE z5lFwP>Ph9n`PPz^ew~bC@70v_$=nLL2ruBc#sJ(B~5MB4w ziXr0kdsp8OPGr)cxt%cl!~f$oEY>i?3Ftg162ZqMssfe! zb1IWRQuW5-8REkJ0w|#ULI38R*&{pcv1kI{7Z1P-9_xcr)YPvidadY-Lgx+-xCkSq z$q5`f0GEY_n243K$|=a6%*j{ufjTlNcVn}#*Geysuw&giXCXAy$RIc4?-C|5Idd}XRG+;# z`_%wwiJ1D^J`LH#vNY1xiG1m+N+cv#x$1o98c#w0f`Ow|>2MNkkx5c1mt*4?-Nrb~ z1Wl1+RHJui3Sb~#I_iqeFMl%;WVk!8y4Ib?{NmFMrSi#6e>TMVhYU>zgNu-^c>m4& z!UfC~(2PlTcQUV2r4sV2R_S1;Hn$Z(`w7<|(i!gp9MZmx8{XM{{bfnHz0Q4W1FMr}b7MwSOt}yWrAN zLn?sscSq6%`0s^->AGvO_Psy!N-N%;+BnJ)svZ1B-4^XhX=k76DsQ3A)2_}T%_sl_ zV~H9(Lgvl)j=$i!W?|8`JrrQEXX8;h+Wdx{ucVbsz+XVSe$T6DDp@F~<@suVcxZgy z)mfun(Yn!QP!7tTY)Ho3=4u&C9kl(no8^=iSn(1H)V;=%pEsgk|) zmDs>>O#Rp;=6%zmdbLUh-+P%h6kgcQYHzLAXmw4l*K>$YZzXEw(3pRphcQQImc(X_ z?d%%7*3;We5IYuWu<(dH+o59P`g?x@=25{^=JLT7uU!$|#an zT+EtjjX!>L7oRB?ql~H&dQFlz0(*wS6P_s}=D{U)v)wmGR+^+mIAtnbNqW9X5qhe-F9j1Xju zFMhk4I1abNIBaa9b!u!-0q7}d_@B{Q2C;#Cbr6|b`Z;ytt6eC2mqrul(n4r zO_r4A-oDXw^et1Oeyws z*HPd+i|UH!1k0azCpwxYT@K-FfU<>J^zE=o9V#NJ|DZD|*He_y{l!nL=XF8vi`37)H8FP+SEy8lYO?fv!%QGs+do zG+!`bo&V|jG96qZl5$cCSg&eeWE-Y!sA{e7-pg_xHHUvKUU)UEv(`Pm`ZHyn246FS z)&!ve{R_LD4|U|kB<3~qmD@)%_Mo&>;sy_p>|_7c%Mw-%x*fUW5dq1p0WIot3sVv_ zt}{kzgH=m~nX5#&LpslpxBj0=oqt;m_lSs&cm(1K!X9k}7Hk}akB11A^*+H(G_HjI z;d`)Pe&{r}6$lI^CnAOA=7KsB5W|86on~1cMENhy#s&RFOarALK!j59DboJ~*!>OTas9P=lH(cU{YBZHG2S8XAB-mo z&E`YX+d&#(L!L;TB6VPOtUKUXUbRdf5-o=zMplstSKGIs7Bo|N1?e9&nT5?!ltPi*|AI>igUys zfptQyPk9@QrwWj}l8nf*%AkBp@WO@VL5;%DRYu_JD@8^)u5>RLvC}|lhhagmLh|9s zayyZg9T#E3;lwOtB@Ln&-A2rmKvX8@cX2Y~HchPh{q|09t`Ffz0*Vf964CZM-`-xE_>0f_Mv!BIx2RG`Z%=DE z$zKjjM!g_F*AFtI#PLNy2~wt{Y$bR_!--^>eu5j~66A|De$ZSQ5OTS<1iIk|S)`_^ z{G8bbRDpU`oAq0{`-dP7OwX10NwDmBj(^AcgGiRnLdgATWshG0PQu_*2kR#ej}MM^ z()`$id`RA%C-4$9A>yF2=+_ZDjxm}sXd#867h`2D@k!DBs>tI^y^go!2cf>rIFoV1 zLtZqz9n~oO)eKoz38x7M391S0521#UD4QMa8$cUz%rFfcR*r>86Vs=lYrijh3zvfr zrU3^AhCE+M8dga<#z;Qw*(Kl=hQ)ptku7V2 z3VR!f7>hh@Qr7yfY}0Y5Ubm*3c|V~Py0uaUfkAs`Ou56sE_jMKXg<@!PN~NkZ0k+B zyFm4nE`lV8EG5&F*S9fg;2m+sXjXncztS$*L};Gvbh5@pC_VR(8A*4GI^UsbKdm8H zLm?*VB~8(QoE5jmk`k`ETsn4^7Imn-3Vt?g`*wbsxB0h7JBH%yv=s4;%%f1&H%ni} zS}2P{(lGS-yNn;U4NH_27`#@k87`^cu>vjvh8@Pajv90Cws#Lv4pX<$&j+iz$%{T7 zzG^S&zV$^i&{{1%hOB z)tb-S^(QmEAFBp(Gv8Hb?l-h|Pp-}W^nsj|8Qi)hYp|%^)Cs%nHQkEo+?Zs3N(WM- z@7$ftn$t`Qd5xBk>{FHfpk0|JYrJ-T^93E56o$evhV^>}D65!g;d6W6uW7y%`^G4! zGN*K|9K?Uu55I`7{KCQ4Z}!>|ao7X-lj2*tfUly|*Z3OS*DrVELw{Smrx-QQG^Z&M z3Ew^c0Y%}}-W5UcI1-z}q__QZ>4G+jyiCoig{23$!94$YAu#$n5f#FTg>=%Pny_`0 zm$rDPj+NKM=DUbFzlv1*c@e!5JaDnG?2?th?kK)FJiZ

9(3hTp$v?zRGBDQn?@_ zkT%o-?WuO1p?{gh#P-1ab}X+!owV;z*pHBSCQeJo zvN)r&irC`g0GPsT5yh29G41w;8w>vahTdZy<3x*jF;sZGJZe#n zdnGTo;X2R6YN79Z?uK-BWJoAxEHL>ly_N6ehULIEb@uEYwo)Mn<@uh2590ZgB%u!> z5ep{~1GSKd!IC<`LU>ah;}D2jURT1#gPt=^soPbsrY*A7uoTa=|H-Owga30L-a*Hl z`#7 zU%A7waKZZS!l|iQWSOt}>S~Jooz>FN5pk;P#9r|pQocOFB)GD9xpvxUX*Jb<=U6*&WIiK$g)0 zWduzXpPZU3>nA!@VTp(}RIxklQ&C-}#xY0mg^p`Y@k)?c-$~O4IY~3y1gB!ajfCTKa0?OV?l_0xi$;UJeW5OeIJ}7*E|!M2IK- z_h16T|L>6mKUZo36oCZ9m0ATwAXEKEMowPJK$wSLyKzeaQNtptPV=dWPv3hVOoT2Ap>LFR4uzq`0Tk3;3H6F(DL&>)iX0va--lOL|UW7QVwi)_76{7rNAitv|ET0*ww<&=}e3;0HIKJ@6D;#FE zK;av;P_86X3XBb`*j$uhSM&9mjyZ#x5~?E`L$o3DS!|Q4_}yq4?I%P z-v$YW@ID95|LN$njOXt@J*JO7V! z?2k-|G1x+xqJG$TUn!{Ja^8^ z1wlulqmx#ZK~EjaLLmSD-~@-7yOlTPKlp1^2saP! HKOOvED!o2J delta 14361 zcmb7rbyytFvNrDS8r*$ZU~zYM3-0bNi+ivoIE3I3JOl_3Gz53I1P|^K{3H3Dd+)h9 z&-cged3L7vo!ai|>fV}~w`R(k3BuY4k~N|EQna*Rc9mK*AWBY34GtM@N-oadH4zaG zX%<0xiMb>H?Ix%dZ_E|=J?2k3yMWu6JhY<`5k_I=Tmmj#XjBr&f_%0c;{vUp?Yrd z;p5I87wVSTP_7w8}$%{}kM84Bm)fw;NppWdn}vjoowMq`_2l=>t`FME=gp*Btv@z> zfS~2~WQcfsjWdVhjh2&>S~}YC;|J+feb$+m(1cV5pE^St9X~G9M4B*uoZ?E7dLOw& zzWxb=XxrbQQNaFcBGdF?{uePT%0hD;44Bq&dHpV>ZgRx7U5-Y-rD#{)}Xsoy=@1uAqAhcs;$S%3_lRk1x0sgKC1JJh_K~-WMvY$;OgY{bYN)QQDRj% z-A{XhEBv7O$^Eb)DpeAUPiD_CnCqRv7E9hY&{~!z;gnfA@Bz;Wb*Ar&m>`I`+~BaP zWc7-lojo@!$xVH+vz+dNX4@ajG-Rl~^+(wRi7tF+_K~Kk>2z5>I}kCyGHC?9o5kQM z3=@XR!ds-9-lPLL`V`Ns-;~-o8g=99H7n9*pVMwk z5sR90%w}(F)DD<6>TdN^ejh$|m^xz7A?Iq!J^6t8#C%&4whaaHrj{G_@!P4#qIEZeeb_Th^-i#X=e*__#nx(fi<_Hp1 ziUYO1uyi%u-`XBvo_;|gH++aX9o1=5zsALCmyPYr@j$E)8$Ut2a!gM@M~!Y$JJ7A% zF4*;&=`mZePtfcX!T{sb*j1LwJmFJqLK0;p+IBWy3F0jrWQT>Am}lj z#$Y2oRKFR);|v#vjwr*U(pgRX);m5MJl6NN{Cte)Yij^43lArEQNA1?EWD`xmK~GK!HzhiT?;ahzOulNXvl9{N9n> z^*Kj=(s}9|GYz?n&_{oLYdUsBT-*LEoRD9u^^&)E(>}k>MwjOqUqyB=CeW!43LKe* zeXq>DNd&-?a=M*@TS;NqSVvK=Yn_+v<%EtrqXU2(WoWw=e{F-6KaehdgcFMFG$7yme7DIaIc$eX=;5SaY>rYeg&e_SEZO65yBdp zQR6yIhF6+kFte|eiPOs8C(jLogVAp!8w=c*TV?bRE%QMJ`yRdS>?l>P6e*B&Jc#*n zav_S9&{TdW7uz}~ZN*UCpz7&k$!|Y@HQ$?$VMkX!5QQ@r#l$v94hul|2%Q-I^kJPR z;-j%GR0zzk73>kQBAt@tAztw!a5%YgMsQ?6MHkARvr+Xpo6&2T+#41!&p8}Huh+?k zSBdu>E$Zqq;EK$1hanqm=V-jNh{I3sLOe_qslEkN?Nq5vB(-&vOO_;VCa;ZEVt`;z z&&S|)>?#7+Ckk=D@_Rp8uNO>`p(5X+-sMlYTJj7sO5&<#E!PIUA`0LkRKeav(ajZn zJ&kydTOf4bhH`CQ9Vo(jtElFm?Juo$$D^8G&&?WpcV`CVP+ACG{bXyT6SW&*CX1RixdHnW% z4Q*^*oWJUmD}sn_<&~9MuBO%8Iv|2VFcB2`QNY`nV(l)E2LX{&b!ld3O-q}{3ArZO z1|20YAG`{U-LKBN%4FIoF85tGAz_(W%ToYL%^ye?88GC;g^+g~@|9Lo>*JJH#!&Lw zcduVKQ1IfQP*Vw83<#Nrs2_cS*EseMU4eubLH42Fc>+uiAuWA$ySLL0$^t2_0w13H9b;xD3$!oJkC1Vff07{OI>XaX7_2?R!-;-(gV%An_zS^Q@4TBY zH}sso=nRn$%B`*YyV8+te{dJ!JPMXQYHk&rS>8v0Y!urQZ!%GIAHKo zw7wAm*}mw7(xV|N)XnNykI8PYuph$aG{>ryklc{<#k&V)A`i_+WBT#MqlzhjV^dPWx z5k_;JQf!8zf^YZE2CTrAoVdk2e%93P%xNf2coZ|S5guMobej~(ruhA#R`5rha9-p^ zS(m9EHxPOXQQk==%}a>h>8 zpi_VZ6BlYqpms?cEXJiB4m53bdj*#Fz_{9JDWr62+jlc(2tgUNn5o&B!uFtUz00qXJg(&|%$qNJHCbknAQs-fJjRUd`t)LXBJx)`BZ5?UMij z<;nd;^Vj?3Nyer48}vJvh)1KZFEBEagOZ5G-k$oUOHI*LUkeg#=n%HpjrlhN_b1?8 z7UJGpuY4lvSr$aat=xSoFB6-kGiaCaSoo1sO=awex>n@8#FG1gxw+hRi{&xXw)m;I zi~;tw45j=YTD?fKTQaHKM-(t=LX3phAP83jJX>mC_CcXoM0X@YSC(sZpWJn>@>?z% z%C@9An{wxK0FTd8YKE`Q=78`nC!esY^I^U=DHV>=8!~4P`|uzIci_34ORlsg0VuF! zDCDDdHD0@#5Dp#LniaUfP>xj(f9vWV)(F2sN+Ae2L%fPMc`z1_bp#x$C#oS|sU!c! z;F_MXj)P(?Bvs5gUhwc|RC*<{>JP+zzf?23iH%Z9Dd<;VukcUtSh5sdTh#F_y`1zq z>lgkMueJ)snk`iEf?%zaN+3cV)bKJ%#;nHJ`z9&zKduIqrJapGXMx#EQ`-fhPmdzc zdIp8Mqm*ql&jOf3rWnB5m&H1$p3!C3HKAV~Rsjy?K%x^{tm_F;Q`f%25B&3#@E z?)V8&TFm3U&Z;Q5XBww-(3F5FSZ*!63lm3V!V~3JGTdV#$4}f;4EkJcvdYWn*En+B z9jpi)?fiht9ZbV2fpXJo2mLB;cx278aP3t`Jb}Ja_1e8F!vQWrl{o6ck8e55{1sw% z6bT5rUk{p7o@KE17$i7(eim)GYs@5+bJlIAPsSp(sS}d}=buf-E@A5A?co!do(3I| zWntLlRvHyZ!2J;L^+)iW)Mse*nVnVAGvN~+xnd_!A37TRHI~QcLs?-YoaaD;Rnpa( z)qAX%1_Nj5r%!x6Ooj8Ymkjn>f=N?M!?_ZZn1{O}^r9Xqy1EI<>E~a@hiYUX0j#*aroKxp?4%|f6PBYiD*^CU)|NEw-9+|Rb%Kyi31k1Q zEYsc&i;?c>vC9#-h6{%L{i-RF8*8^OW;!<2@(X;&w^Fux9IwVvl#260@9yz3QA8>U zh}>ybW=iA}YsT@I=)U!Q@XU5CPiUz&5QzVZx2MT>3>L~o*{g14&_eTy^sJ%UJr|t? zID46VoqT>QD{Nud*yOn?7$0;r|zEdlOjxrK{ute ztjcsM>lYb+kREm4^&>W+w%tj9^r7)FCD_CcG)iagpCJnW`C2g|vY53F{;R+b<$e_| zxx%10YOovgSBp+iUA>BrC}cpc_%)IImH_8bDH}{+kW`V(zPv4M##b;eWB`WL2)&)D zh}Cr_0|BKSnKR*5y31ze0(g9J7=}Xk<(T!`9IYaP*LuXK8|9Bcax8O3{Hv>M@|Fq` z*{6u|nD%~HBg6fsL(!X^LzTQYruH=tiLE7SJYb6Dg7WWC9!jc_EcOdw?*03b{SZ_4 zT*YXHxxUUvfv-)V1Eq+xEhTos*`EUNwnRRW9}mW$y{B|dunSzyW)b$UklmK-H#s2WF^DsB|;MqlOrLSeg+P?2jIZhk);w3!)GBZ_?K=m z1c7I%EI!+XCeWuZ13mF=XOFzN`Ml5%f^{|b0vA4A;eWkNk=IPR4j#AnijAom*)76Q z&^>idp6wT2jx5QRIvb+qL;o%eg+z!^!Y4llzqi4;xnAdOD?x4|$kQ`JPgNSh>`Tr3 z#f)RP9%(<}Ng9uHTb;e6jyEu#+;G#d<*!aSrn-#KeG)>X zQ=!N2>2z|C;7zB%G%DG&P}>-^;(mZfb!ZthdrUimSMJ6lE#ZzQ^(cFB>dicQr*bV- zceqJK{CFiE3#B!jBA$}-54)^$pTTFFWDf6!^{5mQRo;JSa(<-J=ApZ!y;h}?L-uhOq^$DtE3*M1*Skt`5NQ$wMU^qTEQPqXgUU# zdg$pXndSbz;(-O^90!EFZJ(FXd{u13$1J?M=AKSNzTYXSL{bKb&g3 zG@qXy1lh`b=74k=AY0;GCnymIN0+eNn2-Fr!}5k}q$paG*nxy8Z(I$8rw6Ay1vPsd z3kuFj@wsv|ls;@w6syZFTYw$>>-Dp}vv%Iw*WsfG8nt+A?{3-(OUCb9%#duNK-+$&de7P07+?OB* zx&?Y_?H6Xx(gz-n$`cEdZ@`rap2gG@o+X5Pe7ZjQczMV`_Uw5aHw}J1E^nD0wX@8X z)wk9Hq;z}oh?+3-31ra@cvq$2Npd}9rL&X!)pK`W#wC%BPBaB=r$ygU3Z8pb(ifv* z^x{kS$AjQ;zplhkfDQ5Ec-@O(y+ z){nRyWU>>W*6sGr?Ex=KX%@&fe(Rhx@ICq4M={0^6`k*JOE_}#4f*eRV00*K(xCzY<;UuCW`fpB@ zLqeHD#l_vp%#p*wjFJnoLPP~QBu0Ul5UIV0))6s4^FaEE=^&3p127cbtAt9BA213M%@P4a= z0Q%DcgoB(F;!ZXM%?lAG--8HHprs7ZDE#*r|BLtiM?H?;-Mv6E0Lp)H#Xw3f{(ltV zqWnV({||l4A;Uun;Cdm90g#qgjL;y+`YZjHy&wf0n1_>x?{C)F$z`SG)6*-;=THh8 z6j^L(4URtZ(ACiLMrk{Z-JWD0g~y6SDBJbdLu zem<%l9+@m+ina$m54)V`-EAfv{`BdrYX(1Q)wMlcv5XxXcMg4!N=wBDE6{zm)Yy*I zNcbR?UgcoiDe$m<#d3XcZ$jk3=q9=M^I*RA`xBEzE<=UoJR)sYkLXw&kcqn>yVu40 zar^26-cN!ix1wWqx02Ez}4m>(t6_KP7=W{awfzjx{2mtd~9?{oGD?D9`Z!fUhXR2m} zpH@G%IyBL-UZ6JI#Z)(TwxpA2%A~(NJ#Tda` zJdRm?WigUe_y{@!v;yYi@@JOf7{@jCzbq8m7ALVP9P-G2<<@Of?GyK1yjz}Kf)*mL zE`Wu7YZZZq9bt+8;7xTdYUpu3j-LBg#3VJ5We&DuuZZJR9@og9I5SmIe3?&~KR=q^ zBhj4Ty+LI8j?`EYiPf7jDrV_)q&>~W*$6?l)yK6MsE)@-;~!w?GzOk1a0(H~+^t-F zHKh_-8p|pnx>5HngWooHl(__Hzq4DzZu(iW0v=g;#mVBwNdT}plg(b*`eDcFr-h|Su zkv|;JZRCvfus6Xt@3&)!b{hjs6K5H`J510bs`gqDvFeYLCecwV2=hM_Gq3VzsLU}V z7C>EdS&`T2#Yw^Z^c!?rE*ZhqhuV{pPD8_t4b-0^*s@A|&2M;0Kcu;RO9fbq)*>#) zNjmKj_~<#=yl$5`d}SL9>brVPkgA`LFTc%&7?88mZaxndRP&2w>`rcXSMRzB3X@_P zGnBLCU-~*_LYpn&IoeqM;PBy%+cM8CLkPs8@d-OHG}p6};Qf88O|!Cxx$KlgG<4^i z(ofK8KS^eK`DP+azlq&FotZKQ9Dl74|Aa*0aI%Y?Y-0Pkcs!Zm85mzH*F>*<2fTSV zrb}^&6i3Yje(0kZkld3i!@Rk|Dj~-4fR`J(7*=~A3=xsn%xAhrcq(7x%&HW7C#N&S zD$hSS^W(WoMMhuSs6}E2~tVVL@B9ZVkD8l+Y`r!@llagjA*aqQl%)YXvVJs|e8VTHuyUkp= z3LAz|P}|ry&ovnOy~HaBK6k2>ROj*0-4EBEd7;AdW(^ zX!C)JVdkvU9{sPQ^szX|dybbNg=1_#Y|sJC)W9jm0JQ~)*uZJOt!08F5YSEqMrEsu z)8l&!F6>gtjQu=8y#+KlKwy{1u5NM;t8H?|U5D4^XqcTFE%6IVLX!5uzuJdf??cyP z)i6u!?{ccMdLLKyXQ3>!#gh3c?ormWGN1tlKnO zyNJCi=aAOKC|-e^wUV-X45?c~s@*xh?Ai<*xPE-M?r5^qD#yDZ$S*#S{Iu;`AMG@# z6#W`2pw}=G<0Hk-(nHa7PIOxqvyIm`DzFI=vD~YI81*>x1YWgj1&nhQ#@K)Yf-Hcv z;C_ty#fcl(yPVxDZGVC#BO+{gZi$lc`tF8%!2Unlfa?EHfz7&Zt8Xpp>LRaY2 zKhD8yC`eu9ASpMXk@oJbT8#d>l38h2Xpd`WfrG?OvJD zA>&o53Q5vz+vLU31U9{=I=#olB9|8vIKyYmXksj^7fHOOe^qekE4HQmHAdOo$f)m! z?&%n1!XXHfnse4^+5Jymv**)x+GIj9B4mq}l_MBpgvhBL0CAl$>NwY8Dtuu`HwRMp8z2an}R&X|lD(v$= z#J0L?)Oc-^^`O?|YB?D3C+)m@g{A1BN+Y0tto&6HS3Uu{-A^FxG71F*&&W`Oq&gWJ zw~dc)dH*G=W@9B|c!dyUn)8*q26#(Pr^|^%Kux_dioA-7#Cg!(4PD=WR{BiXL2Yk? z1b{)!5LhTUgH+7fvD<^(%B#TRGr7Z+Gpdq^pCkO z>YItPis`e8!NZfjA}=fps~1NRux=vOtUhGr=Z#|1;vhnWSz0~F?jK9T0pIUPReTp1 zOEFl{Wr~v;)rn1}j3_FQK`muAS&^wgQET7^?t+Gqv66n+Ml!USF2$CDsqS6y9<1(9 z&{`~?%cwpabuz;djd@v1!wahwRiJWmd_EZutBrUYKg8yG!0fh4-To~Z=drFLO~q|f zE9dEQo#yyD;NiYZbvM=A6&(9LoLzB~46Tu@q-dfy04QqVBwz+6cUVUct|$mEx%eQe zDc=U(-_;x+_GmER3XBvo8OiLC2enDqu7$ZTt;Rz|sj!D-oL$7b*3--tNxzL`Yi9MUh}{DA{SwAEMUB_%J-$hffUUZ2AZ6N5uAg8U64b*gnNGp zt$Mi`LCQ9HW#*h+6I27- zFC>{~#znsku#@t~mPltX&)EX zyqL-co!N^`Jx=$#_U}_|wLRq_PHv-hFmBHdwwYR748KRkC=)Fn67!V$-US zcg@HbR6WY{em4bWneA#(?dRAGMhFvY9wAT70HmITjUEed4~8$B{Rt0MVTP^#X*wjn z)tjurc+uLAnz@XZji!}1X)8NzAUQewo8*_GM2>~V(tbR7JZSNcwIQX7w^kd@Z^gxW z``syyW~-hE$jyB)tZ_1!!^R5Y1jB_Ct}S`!0vZaQwcumk*Zui2*oj_YpmC3YotJBT@&crdpX}3#zpiC42&IC2qiUf=~5004Jwzi zgs$Q5;D3c}(FES#woz30Tn0T7uVe>$^ozC45|utD4uL;VbQF|@zC$Z$hl`4)i)=#+ z_BPzykUOlTL}#prN9GZ1$A1$TXKJA}=*E|;oy<|-DT@Ib2}-jZ*d0WB7#Lz87VSvp z;r=28C`*+2@`YM5hB>lFJB(+3SrDx2;u0vcT{yoXS+X@+vkzuY@0DwVDN!rR{e*Ea zHM+OFf&rGj#n?B_r(4O}`DQRlE(UK%wAiudV-yhY1;yF805-@*3HEF<#i6)_U+{Nn zWjTmyi+m(nPu{h0MO$mQ#$USrLiHukjw03w|EVM`8R`C6&ul$UW5dgNa6=(vHVvl)!18i6`#SsO zm`Qx%<_2@sRKvCOOQ>;ES-7ma&$}eQg2gv+yG&6Ilc`msjm4zZ^D>1b4CSt6TNd-+ z%cOG2vL<`Z%ApyyRc2SA2xiG^)lxcXCU#kMW^EEzb2X#$Pby0I8ZA3@@V>)Yy4{aI zL~7ntZl}t@kGURC%9!+3tEuO-GQCk-W#e6UmyQT`ln~lfCNh!Y{1`SlnGolUHnAu7 z_2Cw6={uZj9QW%9 z!U#seI5~6_*nHoTg3pt=e#xU~HcVfwg_(a`3f?QfH~A40-%&W=r_s`34zx3l1Zzd& zPYU(leV{2EphXCibtp)w{i44l5-e-m=LLQU_1u1G)&iY%}eFZb@Og5O*oP17;PkiBmkQ@H?c_@VTrq{70xmv&6uDZ$#v zuA6+B$1Wok_T}Sqx-I(Bdw1+Pd*Iy|w&k#?!)A1%5dKubIw9%>@;>qD+k+R@)?P1R zeP{eoNuwIBe<+cUZLr3WW;Gf|7JvFGEBLF0=dOd&hC3z=QT1XUYHnt;#LrC2RA)xPSrZM8=_~8&dreWL8>b!fHkTWs>`$;!PvZ*$ z+$#=6Yh0B9mWEE4h4bW+Dd0}HGNh~ZMjyV`inRfpeV)U?`u1{3&a2kDIpfoBCBnig zp__h}acq#Mqus}F=ldA;IUhvHNR`VELo0c{i+yW>Z{~IB{C1{htq>P#tQf)(PpsVE zr}iw?rw^}OhR5EOHVuH(UjQH>rqzQ4S zJS9qtLAgPEMub4p(%jul<-&^62;vG`i1CML@3PvGEOw$+0wH7K-P1dVv=3|2XQ`6F zBd$+%P01Q*C0!_CvOCS;9le(`>UEQ^+o5yb;-jp$D((pRLeC&+>Zr?R(I|Cu>fbQ8 zFnxH1>%CVR-*1qM_yNp-GB%rMK$xAw)ksgqk1Svx`m40 zBwOt^A7CK7YTF3m`BKxh)OtAaO5bU1n_uaSWmUXya5!Q--J!VNRm1sB1yFV`dZuuM zF0Ne`96D;6BW1kykxd9N#{CL|@pb>EH?yVW#zCUyCjQk2r zli%wMSQPOMZQisI|9M_x}9KB5Y3{*R4#%*FrrF zMf3jEb|j)G+y^YH_maS9r2<@RlY{<|HBD=r>zloeHM`@dC&E?i5HRb5&F8Ke)w(OQ zQ7jrQ{}}8_SDGFv`l;$V&H?vgt6%3qb~arl_fyl!r$Kw*794D$!P#;t0>}0kxYeuz zhPN#~WnR_=H>B`6a$R3S`b;&mBCh;D<^(tRw-(CtpM&;XQS}p(j85ea8s4f*oFuXl zR5{}0r&5$1rClEmZkGT-vwr2Ts)l2MN}~Ao9o$95qNyH}iK;`b0$_pE8g=vcaMRp) zx|&RcfpfpW?%{8#nXq8LyC>~lrHamx#WInrY& zF)kh&P4&a4CZMm+WSsc7`m~Lh?y8;TA4xn5gQ-f@Fqe)cL5h8%?yPxbX{-BsOu>!a zr7~w#_xWWp`&|M=Y&{e+GJ?`8wuCgGtvmG2}Q04ug5I-v%!r6n#T; zmz|^+T2AejKvotUN<+21YY`>rKt`6~WO@DVdH7lg)tnvjAaSyqO+^q3Sl>v6c1PHL zD0~Y56fxZ%`Ppb#Aig>BqcY@eAm{cy6W_#0E|5n14qPkjCXJ3jf3?2$3~f}5Bm9Sr z^zelIbwR{Ch z=a!ZDLxpnu4|B@*hlu=lq7(32J5nu3&}MESwWcve^>`tQ3HPUvGivCTglO^asACrLQN)`7Vw!qE0D-!6)SJXY zs!d1v%%uUL7Av7|(yH{P~g;~DJL>Ye#^yS@^m-+3QL5{93y(6 zmui6%CAxQGJ=qgPi>YT@Ob);pj0%+Aryfpr9Z;9&wj@eL^^4RZsiUgF1aCSSK!@w?B8M_hV`VkmSy~?bBIel^r|zS2d|0B8a}2I9 zEb$0RvGRPz7HR<*9hmntj^Ky{SL{j$IyjbC?Mqnti!Ywbp=X7P!D3$LutT`T7|e*F zxVH_3T39^0q{V2J2+-jVVoe3VZwuKu_VEy<2&v|i_i^l%CzdRk_!XX9Wy=%cx~Cgd zQ*gGwr&i?iJGWp2OXuj0-Ws`F9WgbQ=adIAT2Xh?Uj=xxjGx@CfTK=@`zfe5Yci#F zClOpfTzVT~V4|=%VX~Z{IAD$;HR}?yJOtR*vsx4P1!T6T{c(#= zyc)_6+@@LM-MBx9YVoP;`R-jHJ?HpZyZ=jOn=krBR z<+<_{T=wN|hP6f|XQ$G4HFwpRru2Gjez?_mpCGt=j9_%>>LlZrQCqNZwe@J<(wjj? zf8*LWvwob1=ITa-E@gzx@vQ;#o685ag~2*}A-by&{l|I@^%KJ2&aFjYQpprD;6_7@aP#|Kfq|i@Nzd3SHVy~ z!+-$4fg*2>x5^MvaIVJ#iV80D|v#en(B13!cQt5oIEcq zLsZQj5pN<-g9g%P7=lTdJ*zygwZV_DZ26HMY9Y_M^$2u=em~T@(rfGDimX7x z#P_}&wFY6IutuhU`}uBG1-V*h?r#@c>9<5&s^YVdh)~|&t{|*BJX1rL6q?tSsJ{bm@ zC!;1Aegp=@pW&YZpA5~Lftm_W0_OYs0;;EBWzC^!=l_x~<>SzO$%|3~DFH^592zbz zo-bcsf(8zGXKNQqz@GquLte^Ih(}VA6Cf@Q0PzE*fjmGi2~H_#PM|oy6eq6~h?9>~ z$_%D%+52^4JU?A`RzCiO#w6RB+VSPKh6`6C>j~9NIH?DIiE?F^mMDF;0vYggn zQa&b5P;3sqoR;LxM63pNDjWXL>P^5?d*1^9;>Qi)@~E9Yd!3LCPu3fLxACh z2gjCTA9Kkr)Z09e+mkaO61VbZz$6Z)Zxl?Z&W|-KZ0dNWJ5#f+I3qd|*laVXV}?Fw z2LEI*blf|40Nx436rMn(+6@mT3K5U##zK=Mk}<`j=7hGuige420MSw+Gs#IJG$e0TB*h zNGMqof4cw_Uw12ObQDfX5GZ5sE&QvDX9&CynE%E8zYC@F%c(zw2LyZxm4281!FV}; zM`wRw0N$7R`U~U!omTz}1A<;w#9tWS@40>{;D7G~#Pbpq{v`+k{RhU!3H(ot>pvCb zz<`$_E1cht{B%u<+jnU&Oe$0lY84;qUU_mf_+C{*G1u!g&8f zK`w4S(EsZAjFb)^4hzG_ouQru zj|&a_=fLyNf%l&SUxr^6JRSIDP=7bW%f~D72WjNNQ_dhq|HyZ?*V`Y*rs;uh81t-L8;2L93~$8Xp9 la`W-~>x&&kL`Z(WvS;S*`OkluoA+hua-yTq(MhYy{6BvW^M?Qc From a9ad863bdb691405ae3a0917541e8b8e3b830de1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 16 Mar 2018 10:08:25 +0100 Subject: [PATCH 09/16] #517 - enabled null selection for all ComboBoxes --- .../sormas/ui/person/PersonEditForm.java | 547 +++++++++--------- .../sormas/ui/utils/AbstractEditForm.java | 7 +- 2 files changed, 289 insertions(+), 265 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonEditForm.java index ef69a85e9fe..939cbcdbc19 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonEditForm.java @@ -42,17 +42,17 @@ public class PersonEditForm extends AbstractEditForm { private static final long serialVersionUID = -1L; - + private static final String FACILITY_REGION = "facilityRegion"; private static final String FACILITY_DISTRICT = "facilityDistrict"; private static final String FACILITY_COMMUNITY = "facilityCommunity"; - + private static final String OCCUPATION_HEADER = "occupationHeader"; private static final String ADDRESS_HEADER = "addressHeader"; - + private Label occupationHeader = new Label(LayoutUtil.h3("Occupation"), ContentMode.HTML); private Label addressHeader = new Label(LayoutUtil.h3("Permanent residence of person"), ContentMode.HTML); - + private boolean facilityFieldsInitialized = false; private Disease disease; private String diseaseDetails; @@ -60,265 +60,267 @@ public class PersonEditForm extends AbstractEditForm { private ComboBox causeOfDeathDiseaseField; private TextField causeOfDeathDetailsField; private final ViewMode viewMode; - - private static final String HTML_LAYOUT = - LayoutUtil.h3("Person information")+ + + private static final String HTML_LAYOUT = + LayoutUtil.h3("Person information")+ LayoutUtil.fluidRowLocs(PersonDto.FIRST_NAME, PersonDto.LAST_NAME) + LayoutUtil.fluidRowLocs(PersonDto.NICKNAME, PersonDto.MOTHERS_MAIDEN_NAME) + LayoutUtil.fluidRow( LayoutUtil.fluidRowLocs(PersonDto.BIRTH_DATE_YYYY, PersonDto.BIRTH_DATE_MM, PersonDto.BIRTH_DATE_DD), LayoutUtil.fluidRowLocs(PersonDto.APPROXIMATE_AGE, PersonDto.APPROXIMATE_AGE_TYPE) - ) + + ) + LayoutUtil.fluidRowLocs(PersonDto.SEX, PersonDto.PRESENT_CONDITION) + LayoutUtil.fluidRow( LayoutUtil.oneOfFourCol(PersonDto.DEATH_DATE), LayoutUtil.oneOfFourCol(PersonDto.CAUSE_OF_DEATH), LayoutUtil.fluidColumnLocCss(CssStyles.LAYOUT_COL_HIDE_INVSIBLE, 3, 0, PersonDto.CAUSE_OF_DEATH_DISEASE), LayoutUtil.oneOfFourCol(PersonDto.CAUSE_OF_DEATH_DETAILS) - ) + + ) + LayoutUtil.fluidRow( LayoutUtil.oneOfFourCol(PersonDto.DEATH_PLACE_TYPE), LayoutUtil.oneOfFourCol(PersonDto.DEATH_PLACE_DESCRIPTION) - ) + + ) + LayoutUtil.fluidRow( LayoutUtil.oneOfFourCol(PersonDto.BURIAL_DATE), LayoutUtil.oneOfFourCol(PersonDto.BURIAL_CONDUCTOR), LayoutUtil.oneOfTwoCol(PersonDto.BURIAL_PLACE_DESCRIPTION) - ) + + ) + LayoutUtil.fluidRowLocs(PersonDto.PHONE, PersonDto.PHONE_OWNER) + - LayoutUtil.loc(OCCUPATION_HEADER) + - LayoutUtil.divsCss( - CssStyles.VSPACE_3, - LayoutUtil.fluidRowLocs(PersonDto.OCCUPATION_TYPE, PersonDto.OCCUPATION_DETAILS), - LayoutUtil.fluidRowLocs(FACILITY_REGION, FACILITY_DISTRICT, FACILITY_COMMUNITY, PersonDto.OCCUPATION_FACILITY) - ) + - LayoutUtil.loc(ADDRESS_HEADER) + + LayoutUtil.loc(OCCUPATION_HEADER) + + LayoutUtil.divsCss( + CssStyles.VSPACE_3, + LayoutUtil.fluidRowLocs(PersonDto.OCCUPATION_TYPE, PersonDto.OCCUPATION_DETAILS), + LayoutUtil.fluidRowLocs(FACILITY_REGION, FACILITY_DISTRICT, FACILITY_COMMUNITY, PersonDto.OCCUPATION_FACILITY) + ) + + LayoutUtil.loc(ADDRESS_HEADER) + LayoutUtil.fluidRowLocs(PersonDto.ADDRESS) ; - public PersonEditForm(Disease disease, String diseaseDetails, UserRight editOrCreateUserRight, ViewMode viewMode) { - super(PersonDto.class, PersonDto.I18N_PREFIX, editOrCreateUserRight); - this.disease = disease; - this.diseaseDetails = diseaseDetails; - this.viewMode = viewMode; - - getContent().addComponent(occupationHeader, OCCUPATION_HEADER); - getContent().addComponent(addressHeader, ADDRESS_HEADER); - + public PersonEditForm(Disease disease, String diseaseDetails, UserRight editOrCreateUserRight, ViewMode viewMode) { + super(PersonDto.class, PersonDto.I18N_PREFIX, editOrCreateUserRight); + this.disease = disease; + this.diseaseDetails = diseaseDetails; + this.viewMode = viewMode; + + getContent().addComponent(occupationHeader, OCCUPATION_HEADER); + getContent().addComponent(addressHeader, ADDRESS_HEADER); + addFields(); - } + } - @Override + @Override protected void addFields() { - if (disease == null) { + if (disease == null) { return; } - + // Add fields - - addField(PersonDto.FIRST_NAME, TextField.class); - addField(PersonDto.LAST_NAME, TextField.class); - ComboBox sex = addField(PersonDto.SEX, ComboBox.class); - addField(PersonDto.NICKNAME, TextField.class); - addField(PersonDto.MOTHERS_MAIDEN_NAME, TextField.class); - ComboBox presentCondition = addField(PersonDto.PRESENT_CONDITION, ComboBox.class); - ComboBox days = addField(PersonDto.BIRTH_DATE_DD, ComboBox.class); - // @TODO: Done for nullselection Bug, fixed in Vaadin 7.7.3 - days.setNullSelectionAllowed(true); - days.setNullSelectionItemId(""); - days.addItems(DateHelper.getDaysInMonth()); - ComboBox months = addField(PersonDto.BIRTH_DATE_MM, ComboBox.class); - // @TODO: Done for nullselection Bug, fixed in Vaadin 7.7.3 - months.setNullSelectionAllowed(true); - months.setNullSelectionItemId(""); - months.addItems(DateHelper.getMonthsInYear()); - months.setPageLength(12); - setItemCaptionsForMonths(months); - ComboBox years = addField(PersonDto.BIRTH_DATE_YYYY, ComboBox.class); - years.setCaption(I18nProperties.getPrefixFieldCaption(PersonDto.I18N_PREFIX, "birthdate")); - // @TODO: Done for nullselection Bug, fixed in Vaadin 7.7.3 - years.setNullSelectionAllowed(true); - years.setNullSelectionItemId(""); + + addField(PersonDto.FIRST_NAME, TextField.class); + addField(PersonDto.LAST_NAME, TextField.class); + ComboBox sex = addField(PersonDto.SEX, ComboBox.class); + addField(PersonDto.NICKNAME, TextField.class); + addField(PersonDto.MOTHERS_MAIDEN_NAME, TextField.class); + ComboBox presentCondition = addField(PersonDto.PRESENT_CONDITION, ComboBox.class); + ComboBox days = addField(PersonDto.BIRTH_DATE_DD, ComboBox.class); + // @TODO: Done for nullselection Bug, fixed in Vaadin 7.7.3 + days.setNullSelectionAllowed(true); + days.addItems(DateHelper.getDaysInMonth()); + ComboBox months = addField(PersonDto.BIRTH_DATE_MM, ComboBox.class); + // @TODO: Done for nullselection Bug, fixed in Vaadin 7.7.3 + months.setNullSelectionAllowed(true); + months.addItems(DateHelper.getMonthsInYear()); + months.setPageLength(12); + setItemCaptionsForMonths(months); + ComboBox years = addField(PersonDto.BIRTH_DATE_YYYY, ComboBox.class); + years.setCaption(I18nProperties.getPrefixFieldCaption(PersonDto.I18N_PREFIX, "birthdate")); + // @TODO: Done for nullselection Bug, fixed in Vaadin 7.7.3 + years.setNullSelectionAllowed(true); years.addItems(DateHelper.getYearsToNow()); years.setItemCaptionMode(ItemCaptionMode.ID_TOSTRING); - DateField deathDate = addField(PersonDto.DEATH_DATE, DateField.class); - addField(PersonDto.APPROXIMATE_AGE, TextField.class); - addField(PersonDto.APPROXIMATE_AGE_TYPE, ComboBox.class); - AbstractSelect deathPlaceType = addField(PersonDto.DEATH_PLACE_TYPE, ComboBox.class); - deathPlaceType.setNullSelectionAllowed(true); - TextField deathPlaceDesc = addField(PersonDto.DEATH_PLACE_DESCRIPTION, TextField.class); - DateField burialDate = addField(PersonDto.BURIAL_DATE, DateField.class); - TextField burialPlaceDesc = addField(PersonDto.BURIAL_PLACE_DESCRIPTION, TextField.class); - ComboBox burialConductor = addField(PersonDto.BURIAL_CONDUCTOR, ComboBox.class); - addField(PersonDto.ADDRESS, LocationEditForm.class).setCaption(null); - addField(PersonDto.PHONE, TextField.class); - addField(PersonDto.PHONE_OWNER, TextField.class); - addField(PersonDto.OCCUPATION_TYPE, ComboBox.class); - addField(PersonDto.OCCUPATION_DETAILS, TextField.class); - causeOfDeathField = addField(PersonDto.CAUSE_OF_DEATH, ComboBox.class); - causeOfDeathDiseaseField = addField(PersonDto.CAUSE_OF_DEATH_DISEASE, ComboBox.class); - causeOfDeathDetailsField = addField(PersonDto.CAUSE_OF_DEATH_DETAILS, TextField.class); - ComboBox facilityRegion = new ComboBox(); - facilityRegion.setCaption(I18nProperties.getPrefixFieldCaption(PersonDto.I18N_PREFIX, FACILITY_REGION)); - facilityRegion.setImmediate(true); - facilityRegion.setWidth(100, Unit.PERCENTAGE); - getContent().addComponent(facilityRegion, FACILITY_REGION); - ComboBox facilityDistrict = new ComboBox(); - facilityDistrict.setCaption(I18nProperties.getPrefixFieldCaption(PersonDto.I18N_PREFIX, FACILITY_DISTRICT)); - facilityDistrict.setImmediate(true); - facilityDistrict.setWidth(100, Unit.PERCENTAGE); - getContent().addComponent(facilityDistrict, FACILITY_DISTRICT); - ComboBox facilityCommunity = new ComboBox(); - facilityCommunity.setCaption(I18nProperties.getPrefixFieldCaption(PersonDto.I18N_PREFIX, FACILITY_COMMUNITY)); - facilityCommunity.setImmediate(true); - facilityCommunity.setWidth(100, Unit.PERCENTAGE); - getContent().addComponent(facilityCommunity, FACILITY_COMMUNITY); - ComboBox occupationFacility = addField(PersonDto.OCCUPATION_FACILITY, ComboBox.class); - occupationFacility.setImmediate(true); - + DateField deathDate = addField(PersonDto.DEATH_DATE, DateField.class); + addField(PersonDto.APPROXIMATE_AGE, TextField.class); + addField(PersonDto.APPROXIMATE_AGE_TYPE, ComboBox.class); + AbstractSelect deathPlaceType = addField(PersonDto.DEATH_PLACE_TYPE, ComboBox.class); + deathPlaceType.setNullSelectionAllowed(true); + TextField deathPlaceDesc = addField(PersonDto.DEATH_PLACE_DESCRIPTION, TextField.class); + DateField burialDate = addField(PersonDto.BURIAL_DATE, DateField.class); + TextField burialPlaceDesc = addField(PersonDto.BURIAL_PLACE_DESCRIPTION, TextField.class); + ComboBox burialConductor = addField(PersonDto.BURIAL_CONDUCTOR, ComboBox.class); + addField(PersonDto.ADDRESS, LocationEditForm.class).setCaption(null); + addField(PersonDto.PHONE, TextField.class); + addField(PersonDto.PHONE_OWNER, TextField.class); + addField(PersonDto.OCCUPATION_TYPE, ComboBox.class); + addField(PersonDto.OCCUPATION_DETAILS, TextField.class); + causeOfDeathField = addField(PersonDto.CAUSE_OF_DEATH, ComboBox.class); + causeOfDeathDiseaseField = addField(PersonDto.CAUSE_OF_DEATH_DISEASE, ComboBox.class); + causeOfDeathDetailsField = addField(PersonDto.CAUSE_OF_DEATH_DETAILS, TextField.class); + ComboBox facilityRegion = new ComboBox(); + facilityRegion.setCaption(I18nProperties.getPrefixFieldCaption(PersonDto.I18N_PREFIX, FACILITY_REGION)); + facilityRegion.setImmediate(true); + facilityRegion.setWidth(100, Unit.PERCENTAGE); + facilityRegion.setNullSelectionAllowed(true); + getContent().addComponent(facilityRegion, FACILITY_REGION); + ComboBox facilityDistrict = new ComboBox(); + facilityDistrict.setCaption(I18nProperties.getPrefixFieldCaption(PersonDto.I18N_PREFIX, FACILITY_DISTRICT)); + facilityDistrict.setImmediate(true); + facilityDistrict.setWidth(100, Unit.PERCENTAGE); + facilityDistrict.setNullSelectionAllowed(true); + getContent().addComponent(facilityDistrict, FACILITY_DISTRICT); + ComboBox facilityCommunity = new ComboBox(); + facilityCommunity.setCaption(I18nProperties.getPrefixFieldCaption(PersonDto.I18N_PREFIX, FACILITY_COMMUNITY)); + facilityCommunity.setImmediate(true); + facilityCommunity.setWidth(100, Unit.PERCENTAGE); + facilityCommunity.setNullSelectionAllowed(true); + getContent().addComponent(facilityCommunity, FACILITY_COMMUNITY); + ComboBox occupationFacility = addField(PersonDto.OCCUPATION_FACILITY, ComboBox.class); + occupationFacility.setImmediate(true); + occupationFacility.setNullSelectionAllowed(true); + // Set requirements that don't need visibility changes and read only status - - setRequired(true, - PersonDto.FIRST_NAME, - PersonDto.LAST_NAME); - setVisible(false, - PersonDto.OCCUPATION_DETAILS, - PersonDto.OCCUPATION_FACILITY, - FACILITY_REGION, - FACILITY_DISTRICT, - FACILITY_COMMUNITY, - PersonDto.DEATH_DATE, - PersonDto.DEATH_PLACE_TYPE, - PersonDto.DEATH_PLACE_DESCRIPTION, - PersonDto.BURIAL_DATE, - PersonDto.BURIAL_PLACE_DESCRIPTION, - PersonDto.BURIAL_CONDUCTOR, - PersonDto.CAUSE_OF_DEATH, - PersonDto.CAUSE_OF_DEATH_DETAILS, - PersonDto.CAUSE_OF_DEATH_DISEASE); - - FieldHelper.addSoftRequiredStyle(presentCondition, sex, deathDate, deathPlaceDesc, deathPlaceType, - causeOfDeathField, causeOfDeathDiseaseField, causeOfDeathDetailsField, - burialDate, burialPlaceDesc, burialConductor); - - // Set initial visibilities - + + setRequired(true, + PersonDto.FIRST_NAME, + PersonDto.LAST_NAME); + setVisible(false, + PersonDto.OCCUPATION_DETAILS, + PersonDto.OCCUPATION_FACILITY, + FACILITY_REGION, + FACILITY_DISTRICT, + FACILITY_COMMUNITY, + PersonDto.DEATH_DATE, + PersonDto.DEATH_PLACE_TYPE, + PersonDto.DEATH_PLACE_DESCRIPTION, + PersonDto.BURIAL_DATE, + PersonDto.BURIAL_PLACE_DESCRIPTION, + PersonDto.BURIAL_CONDUCTOR, + PersonDto.CAUSE_OF_DEATH, + PersonDto.CAUSE_OF_DEATH_DETAILS, + PersonDto.CAUSE_OF_DEATH_DISEASE); + + FieldHelper.addSoftRequiredStyle(presentCondition, sex, deathDate, deathPlaceDesc, deathPlaceType, + causeOfDeathField, causeOfDeathDiseaseField, causeOfDeathDetailsField, + burialDate, burialPlaceDesc, burialConductor); + + // Set initial visibilities + initializeVisibilitiesAndAllowedVisibilities(disease, viewMode); - + if (!getField(PersonDto.OCCUPATION_TYPE).isVisible()) occupationHeader.setVisible(false); if (!getField(PersonDto.ADDRESS).isVisible()) addressHeader.setVisible(false); - // Add listeners - - addFieldListeners(PersonDto.BIRTH_DATE_DD, e -> { - updateApproximateAge(); - updateReadyOnlyApproximateAge(); - }); - - addFieldListeners(PersonDto.BIRTH_DATE_MM, e -> { - updateApproximateAge(); - updateReadyOnlyApproximateAge(); - }); - - addFieldListeners(PersonDto.BIRTH_DATE_YYYY, e -> { - updateApproximateAge(); - updateReadyOnlyApproximateAge(); - }); - - addFieldListeners(PersonDto.DEATH_DATE, e -> updateApproximateAge()); - addFieldListeners(PersonDto.OCCUPATION_TYPE, e -> { - updateOccupationFieldCaptions(); - toogleOccupationMetaFields(); - }); - - facilityRegion.addValueChangeListener(e -> { - RegionReferenceDto regionDto = (RegionReferenceDto)e.getProperty().getValue(); - FieldHelper.updateItems(facilityDistrict, regionDto != null ? FacadeProvider.getDistrictFacade().getAllByRegion(regionDto.getUuid()) : null); - }); - - facilityDistrict.addValueChangeListener(e -> { - if (facilityCommunity.getValue() == null) { - FieldHelper.removeItems(occupationFacility); - } - FieldHelper.removeItems(facilityCommunity); - DistrictReferenceDto districtDto = (DistrictReferenceDto)e.getProperty().getValue(); - FieldHelper.updateItems(facilityCommunity, districtDto != null ? FacadeProvider.getCommunityFacade().getAllByDistrict(districtDto.getUuid()) : null); - FieldHelper.updateItems(occupationFacility, districtDto != null ? FacadeProvider.getFacilityFacade().getHealthFacilitiesByDistrict(districtDto, true) : null); - }); - - facilityCommunity.addValueChangeListener(e -> { - if(facilityFieldsInitialized || occupationFacility.getValue() == null) { - FieldHelper.removeItems(occupationFacility); - CommunityReferenceDto communityDto = (CommunityReferenceDto)e.getProperty().getValue(); - FieldHelper.updateItems(occupationFacility, communityDto != null ? FacadeProvider.getFacilityFacade().getHealthFacilitiesByCommunity(communityDto, true) : - facilityDistrict.getValue() != null ? FacadeProvider.getFacilityFacade().getHealthFacilitiesByDistrict((DistrictReferenceDto) facilityDistrict.getValue(), true) : - null); - } - }); + // Add listeners + + addFieldListeners(PersonDto.BIRTH_DATE_DD, e -> { + updateApproximateAge(); + updateReadyOnlyApproximateAge(); + }); + + addFieldListeners(PersonDto.BIRTH_DATE_MM, e -> { + updateApproximateAge(); + updateReadyOnlyApproximateAge(); + }); + + addFieldListeners(PersonDto.BIRTH_DATE_YYYY, e -> { + updateApproximateAge(); + updateReadyOnlyApproximateAge(); + }); + + addFieldListeners(PersonDto.DEATH_DATE, e -> updateApproximateAge()); + addFieldListeners(PersonDto.OCCUPATION_TYPE, e -> { + updateOccupationFieldCaptions(); + toogleOccupationMetaFields(); + }); + + facilityRegion.addValueChangeListener(e -> { + RegionReferenceDto regionDto = (RegionReferenceDto)e.getProperty().getValue(); + FieldHelper.updateItems(facilityDistrict, regionDto != null ? FacadeProvider.getDistrictFacade().getAllByRegion(regionDto.getUuid()) : null); + }); + + facilityDistrict.addValueChangeListener(e -> { + if (facilityCommunity.getValue() == null) { + FieldHelper.removeItems(occupationFacility); + } + FieldHelper.removeItems(facilityCommunity); + DistrictReferenceDto districtDto = (DistrictReferenceDto)e.getProperty().getValue(); + FieldHelper.updateItems(facilityCommunity, districtDto != null ? FacadeProvider.getCommunityFacade().getAllByDistrict(districtDto.getUuid()) : null); + FieldHelper.updateItems(occupationFacility, districtDto != null ? FacadeProvider.getFacilityFacade().getHealthFacilitiesByDistrict(districtDto, true) : null); + }); + + facilityCommunity.addValueChangeListener(e -> { + if(facilityFieldsInitialized || occupationFacility.getValue() == null) { + FieldHelper.removeItems(occupationFacility); + CommunityReferenceDto communityDto = (CommunityReferenceDto)e.getProperty().getValue(); + FieldHelper.updateItems(occupationFacility, communityDto != null ? FacadeProvider.getFacilityFacade().getHealthFacilitiesByCommunity(communityDto, true) : + facilityDistrict.getValue() != null ? FacadeProvider.getFacilityFacade().getHealthFacilitiesByDistrict((DistrictReferenceDto) facilityDistrict.getValue(), true) : + null); + } + }); facilityRegion.addItems(FacadeProvider.getRegionFacade().getAllAsReference()); addFieldListeners(PersonDto.OCCUPATION_FACILITY, e -> fillFacilityFields()); - addFieldListeners(PersonDto.PRESENT_CONDITION, e -> toogleDeathAndBurialFields()); - - causeOfDeathField.addValueChangeListener(e -> { - toggleCauseOfDeathFields(true); - }); - - causeOfDeathDiseaseField.addValueChangeListener(e -> { - toggleCauseOfDeathFields(true); - }); - - addValueChangeListener(e -> { - fillDeathAndBurialFields(deathPlaceType, deathPlaceDesc, burialPlaceDesc); - }); - - } - + addFieldListeners(PersonDto.PRESENT_CONDITION, e -> toogleDeathAndBurialFields()); + + causeOfDeathField.addValueChangeListener(e -> { + toggleCauseOfDeathFields(true); + }); + + causeOfDeathDiseaseField.addValueChangeListener(e -> { + toggleCauseOfDeathFields(true); + }); + + addValueChangeListener(e -> { + fillDeathAndBurialFields(deathPlaceType, deathPlaceDesc, burialPlaceDesc); + }); + + } + @Override protected String createHtmlLayout() { - return HTML_LAYOUT; + return HTML_LAYOUT; } - + private void updateReadyOnlyApproximateAge() { boolean readonly = false; if(getFieldGroup().getField(PersonDto.BIRTH_DATE_YYYY).getValue()!=null) { readonly = true; } - + getFieldGroup().getField(PersonDto.APPROXIMATE_AGE).setReadOnly(readonly); getFieldGroup().getField(PersonDto.APPROXIMATE_AGE_TYPE).setReadOnly(readonly); } - + private void updateApproximateAge() { if (getFieldGroup().getField(PersonDto.BIRTH_DATE_YYYY).getValue() != null) { Calendar birthdate = new GregorianCalendar(); birthdate.set( (Integer)getFieldGroup().getField(PersonDto.BIRTH_DATE_YYYY).getValue(), getFieldGroup().getField(PersonDto.BIRTH_DATE_MM).getValue()!=null?(Integer) getFieldGroup().getField(PersonDto.BIRTH_DATE_MM).getValue()-1:0, - getFieldGroup().getField(PersonDto.BIRTH_DATE_DD).getValue()!=null?(Integer) getFieldGroup().getField(PersonDto.BIRTH_DATE_DD).getValue():1); + getFieldGroup().getField(PersonDto.BIRTH_DATE_DD).getValue()!=null?(Integer) getFieldGroup().getField(PersonDto.BIRTH_DATE_DD).getValue():1); Pair pair = ApproximateAgeHelper.getApproximateAge( (Date) birthdate.getTime(), (Date) getFieldGroup().getField(PersonDto.DEATH_DATE).getValue() ); - + TextField approximateAgeField = (TextField)getFieldGroup().getField(PersonDto.APPROXIMATE_AGE); approximateAgeField.setReadOnly(false); approximateAgeField.setValue(pair.getElement0()!=null?String.valueOf(pair.getElement0()):null); approximateAgeField.setReadOnly(true); - + AbstractSelect approximateAgeTypeSelect = (AbstractSelect)getFieldGroup().getField(PersonDto.APPROXIMATE_AGE_TYPE); approximateAgeTypeSelect.setReadOnly(false); approximateAgeTypeSelect.setValue(String.valueOf(pair.getElement1())); approximateAgeTypeSelect.setReadOnly(true); } } - + private void toogleOccupationMetaFields() { OccupationType type = (OccupationType) ((AbstractSelect)getFieldGroup().getField(PersonDto.OCCUPATION_TYPE)).getValue(); - switch(type) { + if (type != null) { + switch(type) { case BUSINESSMAN_WOMAN: case TRANSPORTER: case OTHER: @@ -328,55 +330,40 @@ private void toogleOccupationMetaFields() { FACILITY_DISTRICT, FACILITY_COMMUNITY); setVisible(true, - PersonDto.OCCUPATION_DETAILS); + PersonDto.OCCUPATION_DETAILS); break; case HEALTHCARE_WORKER: setVisible(true, PersonDto.OCCUPATION_DETAILS, - PersonDto.OCCUPATION_FACILITY, - FACILITY_REGION, - FACILITY_DISTRICT, - FACILITY_COMMUNITY); + PersonDto.OCCUPATION_FACILITY); + getContent().getComponent(FACILITY_REGION).setVisible(true); + getContent().getComponent(FACILITY_DISTRICT).setVisible(true); + getContent().getComponent(FACILITY_COMMUNITY).setVisible(true); break; default: setVisible(false, - PersonDto.OCCUPATION_DETAILS, - PersonDto.OCCUPATION_FACILITY, - FACILITY_REGION, + PersonDto.OCCUPATION_DETAILS, + PersonDto.OCCUPATION_FACILITY, + FACILITY_REGION, FACILITY_DISTRICT, FACILITY_COMMUNITY); break; + } + } else { + setVisible(false, + PersonDto.OCCUPATION_DETAILS, + PersonDto.OCCUPATION_FACILITY, + FACILITY_REGION, + FACILITY_DISTRICT, + FACILITY_COMMUNITY); } } - + private void toogleDeathAndBurialFields() { -// List diseaseSpecificFields = Arrays.asList(PersonDto.DEATH_PLACE_TYPE, PersonDto.DEATH_PLACE_DESCRIPTION, PersonDto.BURIAL_DATE, -// PersonDto.BURIAL_PLACE_DESCRIPTION, PersonDto.BURIAL_CONDUCTOR); + // List diseaseSpecificFields = Arrays.asList(PersonDto.DEATH_PLACE_TYPE, PersonDto.DEATH_PLACE_DESCRIPTION, PersonDto.BURIAL_DATE, + // PersonDto.BURIAL_PLACE_DESCRIPTION, PersonDto.BURIAL_CONDUCTOR); PresentCondition type = (PresentCondition) ((AbstractSelect)getFieldGroup().getField(PersonDto.PRESENT_CONDITION)).getValue(); - switch (type) { - case DEAD: - setVisible(true, - PersonDto.DEATH_DATE, - PersonDto.DEATH_PLACE_TYPE, - PersonDto.DEATH_PLACE_DESCRIPTION); - toggleCauseOfDeathFields(true); - setVisible(false, - PersonDto.BURIAL_DATE, - PersonDto.BURIAL_PLACE_DESCRIPTION, - PersonDto.BURIAL_CONDUCTOR); - break; - case BURIED: - setVisible(true, - PersonDto.DEATH_DATE, - PersonDto.DEATH_PLACE_TYPE, - PersonDto.DEATH_PLACE_DESCRIPTION, - PersonDto.BURIAL_DATE, - PersonDto.BURIAL_PLACE_DESCRIPTION, - PersonDto.BURIAL_CONDUCTOR); - toggleCauseOfDeathFields(true); - break; - - default: + if (type == null) { setVisible(false, PersonDto.DEATH_DATE, PersonDto.DEATH_PLACE_TYPE, @@ -385,20 +372,53 @@ private void toogleDeathAndBurialFields() { PersonDto.BURIAL_PLACE_DESCRIPTION, PersonDto.BURIAL_CONDUCTOR); toggleCauseOfDeathFields(false); - break; + } else { + switch (type) { + case DEAD: + setVisible(true, + PersonDto.DEATH_DATE, + PersonDto.DEATH_PLACE_TYPE, + PersonDto.DEATH_PLACE_DESCRIPTION); + toggleCauseOfDeathFields(true); + setVisible(false, + PersonDto.BURIAL_DATE, + PersonDto.BURIAL_PLACE_DESCRIPTION, + PersonDto.BURIAL_CONDUCTOR); + break; + case BURIED: + setVisible(true, + PersonDto.DEATH_DATE, + PersonDto.DEATH_PLACE_TYPE, + PersonDto.DEATH_PLACE_DESCRIPTION, + PersonDto.BURIAL_DATE, + PersonDto.BURIAL_PLACE_DESCRIPTION, + PersonDto.BURIAL_CONDUCTOR); + toggleCauseOfDeathFields(true); + break; + default: + setVisible(false, + PersonDto.DEATH_DATE, + PersonDto.DEATH_PLACE_TYPE, + PersonDto.DEATH_PLACE_DESCRIPTION, + PersonDto.BURIAL_DATE, + PersonDto.BURIAL_PLACE_DESCRIPTION, + PersonDto.BURIAL_CONDUCTOR); + toggleCauseOfDeathFields(false); + break; + } } - + // Make sure that disease specific fields are only shown when required -// for (Object propertyId : diseaseSpecificFields) { -// boolean visible = DiseasesConfiguration.isDefinedOrMissing(PersonDto.class, (String)propertyId, disease); -// if (!visible) { -// getFieldGroup().getField(propertyId).setVisible(false); -// } -// } - + // for (Object propertyId : diseaseSpecificFields) { + // boolean visible = DiseasesConfiguration.isDefinedOrMissing(PersonDto.class, (String)propertyId, disease); + // if (!visible) { + // getFieldGroup().getField(propertyId).setVisible(false); + // } + // } + fillDeathAndBurialFields((AbstractSelect)getField(PersonDto.DEATH_PLACE_TYPE), (TextField)getField(PersonDto.DEATH_PLACE_DESCRIPTION), (TextField)getField(PersonDto.BURIAL_PLACE_DESCRIPTION)); } - + private void toggleCauseOfDeathFields(boolean causeOfDeathVisible) { if (!causeOfDeathVisible) { causeOfDeathField.setVisible(false); @@ -411,7 +431,7 @@ private void toggleCauseOfDeathFields(boolean causeOfDeathVisible) { if (causeOfDeathField.getValue() == null && disease != null) { causeOfDeathField.setValue(CauseOfDeath.EPIDEMIC_DISEASE); } - + if (causeOfDeathField.getValue() == null) { causeOfDeathDiseaseField.setVisible(false); causeOfDeathDetailsField.setVisible(false); @@ -440,37 +460,38 @@ private void toggleCauseOfDeathFields(boolean causeOfDeathVisible) { } } } - + private void fillFacilityFields() { if(facilityFieldsInitialized) return; FacilityReferenceDto facilityRef = (FacilityReferenceDto) getFieldGroup().getField(PersonDto.OCCUPATION_FACILITY).getValue(); if(facilityRef == null) return; FacilityDto facility = FacadeProvider.getFacilityFacade().getByUuid(facilityRef.getUuid()); - + ComboBox facilityRegion = (ComboBox) getField(FACILITY_REGION); - ComboBox facilityDistrict = (ComboBox) getField(FACILITY_DISTRICT); - ComboBox facilityCommunity = (ComboBox) getField(FACILITY_COMMUNITY); - ComboBox occupationFacility = (ComboBox) getField(PersonDto.OCCUPATION_FACILITY); - facilityRegion.select(facility.getRegion()); - facilityDistrict.addItems(FacadeProvider.getDistrictFacade().getAllByRegion(facility.getRegion().getUuid())); - facilityDistrict.select(facility.getDistrict()); - facilityCommunity.addItems(FacadeProvider.getCommunityFacade().getAllByDistrict(facility.getDistrict().getUuid())); - facilityCommunity.select(facility.getCommunity()); - if (facility.getCommunity() != null) { - occupationFacility.addItems(FacadeProvider.getFacilityFacade().getHealthFacilitiesByCommunity(facility.getCommunity(), false)); - occupationFacility.select(facility); - } else { - occupationFacility.addItems(FacadeProvider.getFacilityFacade().getHealthFacilitiesByDistrict(facility.getDistrict(), false)); - occupationFacility.select(facility); - } - - facilityFieldsInitialized = true; + ComboBox facilityDistrict = (ComboBox) getField(FACILITY_DISTRICT); + ComboBox facilityCommunity = (ComboBox) getField(FACILITY_COMMUNITY); + ComboBox occupationFacility = (ComboBox) getField(PersonDto.OCCUPATION_FACILITY); + facilityRegion.select(facility.getRegion()); + facilityDistrict.addItems(FacadeProvider.getDistrictFacade().getAllByRegion(facility.getRegion().getUuid())); + facilityDistrict.select(facility.getDistrict()); + facilityCommunity.addItems(FacadeProvider.getCommunityFacade().getAllByDistrict(facility.getDistrict().getUuid())); + facilityCommunity.select(facility.getCommunity()); + if (facility.getCommunity() != null) { + occupationFacility.addItems(FacadeProvider.getFacilityFacade().getHealthFacilitiesByCommunity(facility.getCommunity(), false)); + occupationFacility.select(facility); + } else { + occupationFacility.addItems(FacadeProvider.getFacilityFacade().getHealthFacilitiesByDistrict(facility.getDistrict(), false)); + occupationFacility.select(facility); + } + + facilityFieldsInitialized = true; } - + private void updateOccupationFieldCaptions() { OccupationType type = (OccupationType) ((AbstractSelect)getFieldGroup().getField(PersonDto.OCCUPATION_TYPE)).getValue(); - Field od = getFieldGroup().getField(PersonDto.OCCUPATION_DETAILS); - switch(type) { + if (type != null) { + Field od = getFieldGroup().getField(PersonDto.OCCUPATION_DETAILS); + switch(type) { case BUSINESSMAN_WOMAN: od.setCaption(I18nProperties.getFieldCaption(getPropertyI18nPrefix()+".business."+PersonDto.OCCUPATION_DETAILS)); break; @@ -486,10 +507,10 @@ private void updateOccupationFieldCaptions() { default: od.setCaption(I18nProperties.getFieldCaption(getPropertyI18nPrefix()+"."+PersonDto.OCCUPATION_DETAILS)); break; - + } } } - + private void setItemCaptionsForMonths(AbstractSelect months) { months.setItemCaption(1, I18nProperties.getEnumCaption(Month.JANUARY)); months.setItemCaption(2, I18nProperties.getEnumCaption(Month.FEBRUARY)); @@ -504,15 +525,15 @@ private void setItemCaptionsForMonths(AbstractSelect months) { months.setItemCaption(11, I18nProperties.getEnumCaption(Month.NOVEMBER)); months.setItemCaption(12, I18nProperties.getEnumCaption(Month.DECEMBER)); } - + private void fillDeathAndBurialFields(AbstractSelect deathPlaceType, TextField deathPlaceDesc, TextField burialPlaceDesc) { if (deathPlaceType.isVisible() && deathPlaceType.getValue() == null) { deathPlaceType.setValue(DeathPlaceType.OTHER); if (deathPlaceDesc.isVisible() && (deathPlaceDesc.getValue() == null || deathPlaceDesc.getValue().isEmpty())) { - deathPlaceDesc.setValue(getValue().getAddress().toString()); - } + deathPlaceDesc.setValue(getValue().getAddress().toString()); + } } - + if (burialPlaceDesc.isVisible() && (burialPlaceDesc.getValue() == null || deathPlaceDesc.getValue().isEmpty())) { burialPlaceDesc.setValue(getValue().getAddress().toString()); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java index d4e265f8e1f..7e9794b953e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/AbstractEditForm.java @@ -98,13 +98,16 @@ public T createField(Class type, Class fieldType) { if (field instanceof OptionGroup) { CssStyles.style(field, ValoTheme.OPTIONGROUP_HORIZONTAL); } else if (field instanceof ComboBox) { - ((ComboBox)field).setFilteringMode(FilteringMode.CONTAINS); + ((ComboBox) field).setFilteringMode(FilteringMode.CONTAINS); + ((ComboBox) field).setNullSelectionAllowed(true); } return field; } } else if (AbstractSelect.class.isAssignableFrom(fieldType)) { - return (T) createCompatibleSelect((Class) fieldType); + AbstractSelect field = createCompatibleSelect((Class) fieldType); + field.setNullSelectionAllowed(true); + return (T) field; } else if (LocationEditForm.class.isAssignableFrom(fieldType)) { return (T) new LocationEditForm(editOrCreateUserRight); From 3182ac0a7a77b07f7c78cba549203a416d2e58f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 16 Mar 2018 12:47:50 +0100 Subject: [PATCH 10/16] #513 - state filter for dashboard --- .../symeda/sormas/api/caze/CaseCriteria.java | 12 ++++++- .../de/symeda/sormas/api/caze/CaseFacade.java | 4 +-- .../sormas/api/contact/ContactFacade.java | 3 +- .../symeda/sormas/api/event/EventFacade.java | 3 +- .../sormas/api/sample/SampleFacade.java | 3 +- .../sormas/api/sample/SampleTestFacade.java | 3 +- .../sormas/backend/caze/CaseFacadeEjb.java | 10 +++--- .../sormas/backend/caze/CaseService.java | 29 +++++++++++++-- .../backend/contact/ContactFacadeEjb.java | 9 +++-- .../backend/contact/ContactService.java | 12 ++++++- .../sormas/backend/event/EventFacadeEjb.java | 9 +++-- .../sormas/backend/event/EventService.java | 15 +++++--- .../backend/sample/SampleFacadeEjb.java | 11 ++++-- .../sormas/backend/sample/SampleService.java | 11 +++++- .../backend/sample/SampleTestFacadeEjb.java | 10 ++++-- .../backend/sample/SampleTestService.java | 12 ++++++- .../backend/caze/CaseFacadeEjbTest.java | 4 +-- .../backend/contact/ContactFacadeEjbTest.java | 2 +- .../backend/event/EventFacadeEjbTest.java | 2 +- .../sample/SampleTestFacadeEjbTest.java | 4 +-- .../ui/dashboard/DashboardDataProvider.java | 36 +++++++++++-------- .../sormas/ui/dashboard/DashboardView.java | 19 ++++++++++ .../ui/dashboard/EpiCurveComponent.java | 2 ++ .../sormas/ui/dashboard/MapComponent.java | 7 ++-- 24 files changed, 179 insertions(+), 53 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseCriteria.java index 65c0cf87b25..fa3a3c0fc0f 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseCriteria.java @@ -4,8 +4,8 @@ import java.util.Date; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.person.PresentCondition; import de.symeda.sormas.api.region.DistrictReferenceDto; +import de.symeda.sormas.api.region.RegionReferenceDto; import de.symeda.sormas.api.user.UserRole; public class CaseCriteria implements Serializable { @@ -15,6 +15,7 @@ public class CaseCriteria implements Serializable { private UserRole reportingUserRole; private Disease disease; private CaseOutcome outcome; + private RegionReferenceDto region; private DistrictReferenceDto district; private Date newCaseDateFrom; private Date newCaseDateTo; @@ -34,6 +35,11 @@ public CaseCriteria diseaseEquals(Disease disease) { return this; } + public CaseCriteria regionEquals(RegionReferenceDto region) { + this.region = region; + return this; + } + public CaseCriteria districtEquals(DistrictReferenceDto district) { this.district = district; return this; @@ -57,6 +63,10 @@ public Disease getDisease() { return disease; } + public RegionReferenceDto getRegion() { + return region; + } + public DistrictReferenceDto getDistrict() { return district; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java index 02dfe1d151c..8e07c7fb388 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseFacade.java @@ -40,9 +40,9 @@ public interface CaseFacade { List getByUuids(List uuids); - List getNewCasesForDashboard(DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid); + List getNewCasesForDashboard(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid); - List getCasesForMap(DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid); + List getCasesForMap(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid); List getCasesForStatistics(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactFacade.java index 2816d5f45a0..b165345ff41 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactFacade.java @@ -8,6 +8,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.MapCaseDto; import de.symeda.sormas.api.region.DistrictReferenceDto; +import de.symeda.sormas.api.region.RegionReferenceDto; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.visit.VisitReferenceDto; @@ -32,7 +33,7 @@ public interface ContactFacade { List getByUuids(List uuids); - List getContactsForMap(DistrictReferenceDto districtRef, Disease disease, Date fromDate, Date toDate, String userUuid, List mapCaseDtos); + List getContactsForMap(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date fromDate, Date toDate, String userUuid, List mapCaseDtos); void deleteContact(ContactReferenceDto contactRef, String userUuid); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventFacade.java index 65ff269af5c..b0194834aaa 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventFacade.java @@ -7,6 +7,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.region.DistrictReferenceDto; +import de.symeda.sormas.api.region.RegionReferenceDto; import de.symeda.sormas.api.user.UserReferenceDto; @Remote @@ -16,7 +17,7 @@ public interface EventFacade { List getAllEventsBetween(Date fromDate, Date toDate, DistrictReferenceDto districtRef, Disease disease, String userUuid); - List getNewEventsForDashboard(DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid); + List getNewEventsForDashboard(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid); EventDto getEventByUuid(String uuid); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleFacade.java index 38941a762af..2cc571b84c1 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleFacade.java @@ -8,6 +8,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.region.DistrictReferenceDto; +import de.symeda.sormas.api.region.RegionReferenceDto; @Remote public interface SampleFacade { @@ -30,7 +31,7 @@ public interface SampleFacade { List getByUuids(List uuids); - List getNewSamplesForDashboard(DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid); + List getNewSamplesForDashboard(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid); void deleteSample(SampleReferenceDto sampleRef, String userUuid); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleTestFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleTestFacade.java index 2d3e95f725a..4b41bd78536 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleTestFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/SampleTestFacade.java @@ -7,6 +7,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.region.DistrictReferenceDto; +import de.symeda.sormas.api.region.RegionReferenceDto; @Remote public interface SampleTestFacade { @@ -23,7 +24,7 @@ public interface SampleTestFacade { List getByUuids(List uuids); - List getNewTestResultsForDashboard(DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid); + List getNewTestResultsForDashboard(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid); void deleteSampleTest(SampleTestReferenceDto sampleTestRef, String userUuid); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java index 463424cf6df..8cde005eafc 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseFacadeEjb.java @@ -232,19 +232,21 @@ public List getSelectableCases(UserReferenceDto userRef) { } @Override - public List getNewCasesForDashboard(DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid) { + public List getNewCasesForDashboard(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid) { + Region region = regionService.getByReferenceDto(regionRef); District district = districtService.getByReferenceDto(districtRef); User user = userService.getByUuid(userUuid); - return caseService.getNewCasesForDashboard(district, disease, from, to, user); + return caseService.getNewCasesForDashboard(region, district, disease, from, to, user); } @Override - public List getCasesForMap(DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid) { + public List getCasesForMap(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid) { + Region region = regionService.getByReferenceDto(regionRef); District district = districtService.getByReferenceDto(districtRef); User user = userService.getByUuid(userUuid); - return caseService.getCasesForMap(district, disease, from, to, user); + return caseService.getCasesForMap(region, district, disease, from, to, user); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java index 811c2c7bb40..1c5c83ea595 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseService.java @@ -175,7 +175,7 @@ public List getAllBetween(Date onsetFromDate, Date onsetToDate, District d return resultList; } - public List getNewCasesForDashboard(District district, Disease disease, Date from, Date to, User user) { + public List getNewCasesForDashboard(Region region, District district, Disease disease, Date from, Date to, User user) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(DashboardCaseDto.class); Root caze = cq.from(getElementClass()); @@ -192,6 +192,15 @@ public List getNewCasesForDashboard(District district, Disease filter = dateFilter; } + if (region != null) { + Predicate regionFilter = cb.equal(caze.get(Case.REGION), region); + if (filter != null) { + filter = cb.and(filter, regionFilter); + } else { + filter = regionFilter; + } + } + if (district != null) { Predicate districtFilter = cb.equal(caze.get(Case.DISTRICT), district); if (filter != null) { @@ -231,7 +240,7 @@ public List getNewCasesForDashboard(District district, Disease return result; } - public List getCasesForMap(District district, Disease disease, Date from, Date to, User user) { + public List getCasesForMap(Region region, District district, Disease disease, Date from, Date to, User user) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(MapCaseDto.class); Root caze = cq.from(getElementClass()); @@ -247,6 +256,15 @@ public List getCasesForMap(District district, Disease disease, Date filter = dateFilter; } + if (region != null) { + Predicate regionFilter = cb.equal(caze.get(Case.REGION), region); + if (filter != null) { + filter = cb.and(filter, regionFilter); + } else { + filter = regionFilter; + } + } + if (district != null) { Predicate districtFilter = cb.equal(caze.get(Case.DISTRICT), district); if (filter != null) { @@ -567,6 +585,8 @@ public Predicate createNewCaseFilter(CriteriaBuilder cb, Root caze, Date f public Predicate buildCriteriaFilter(CaseCriteria caseCriteria, CriteriaBuilder cb, Root from) { Join person = from.join(Case.PERSON, JoinType.LEFT); + Join region = from.join(Case.REGION, JoinType.LEFT); + Join district = from.join(Case.DISTRICT, JoinType.LEFT); Predicate filter = null; if (caseCriteria.getReportingUserRole() != null) { filter = and(cb, filter, cb.isMember( @@ -579,8 +599,11 @@ public Predicate buildCriteriaFilter(CaseCriteria caseCriteria, CriteriaBuilder if (caseCriteria.getOutcome() != null) { filter = and(cb, filter, cb.equal(from.get(Case.OUTCOME), caseCriteria.getOutcome())); } + if (caseCriteria.getRegion() != null) { + filter = and(cb, filter, cb.equal(region.get(Region.UUID), caseCriteria.getRegion().getUuid())); + } if (caseCriteria.getDistrict() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.DISTRICT), caseCriteria.getDistrict())); + filter = and(cb, filter, cb.equal(district.get(District.UUID), caseCriteria.getDistrict().getUuid())); } if (caseCriteria.getNewCaseDateFrom() != null && caseCriteria.getNewCaseDateTo() != null) { filter = and(cb, filter, createNewCaseFilter(cb, from, caseCriteria.getNewCaseDateFrom(), caseCriteria.getNewCaseDateTo())); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java index f0eae973ec3..e400e36ffbc 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactFacadeEjb.java @@ -37,6 +37,7 @@ import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.contact.MapContactDto; import de.symeda.sormas.api.region.DistrictReferenceDto; +import de.symeda.sormas.api.region.RegionReferenceDto; import de.symeda.sormas.api.task.TaskContext; import de.symeda.sormas.api.task.TaskCriteria; import de.symeda.sormas.api.task.TaskStatus; @@ -56,6 +57,7 @@ import de.symeda.sormas.backend.region.District; import de.symeda.sormas.backend.region.DistrictService; import de.symeda.sormas.backend.region.Region; +import de.symeda.sormas.backend.region.RegionService; import de.symeda.sormas.backend.task.Task; import de.symeda.sormas.backend.task.TaskService; import de.symeda.sormas.backend.user.User; @@ -88,6 +90,8 @@ public class ContactFacadeEjb implements ContactFacade { @EJB private TaskService taskService; @EJB + private RegionService regionService; + @EJB private DistrictService districtService; @EJB private CaseFacadeEjbLocal caseFacade; @@ -177,8 +181,9 @@ public List getSelectableContacts(UserReferenceDto userRef) } @Override - public List getContactsForMap(DistrictReferenceDto districtRef, Disease disease, Date fromDate, Date toDate, String userUuid, List mapCaseDtos) { + public List getContactsForMap(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date fromDate, Date toDate, String userUuid, List mapCaseDtos) { User user = userService.getByUuid(userUuid); + Region region = regionService.getByReferenceDto(regionRef); District district = districtService.getByReferenceDto(districtRef); List caseUuids = new ArrayList<>(); for (MapCaseDto mapCaseDto : mapCaseDtos) { @@ -189,7 +194,7 @@ public List getContactsForMap(DistrictReferenceDto districtRef, D return Collections.emptyList(); } - return contactService.getContactsForMap(district, disease, fromDate, toDate, user, caseUuids); + return contactService.getContactsForMap(region, district, disease, fromDate, toDate, user, caseUuids); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java index 577a8b89365..d64ffcf7cb2 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactService.java @@ -38,6 +38,7 @@ import de.symeda.sormas.backend.person.Person; import de.symeda.sormas.backend.person.PersonFacadeEjb.PersonFacadeEjbLocal; import de.symeda.sormas.backend.region.District; +import de.symeda.sormas.backend.region.Region; import de.symeda.sormas.backend.symptoms.Symptoms; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.util.DateHelper8; @@ -139,7 +140,7 @@ public List getByPersonAndDisease(Person person, Disease disease) { return result; } - public List getContactsForMap(District district, Disease disease, Date fromDate, Date toDate, User user, List caseUuids) { + public List getContactsForMap(Region region, District district, Disease disease, Date fromDate, Date toDate, User user, List caseUuids) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(MapContactDto.class); Root contact = cq.from(getElementClass()); @@ -164,6 +165,15 @@ public List getContactsForMap(District district, Disease disease, // If no cases are shown, there should also be no contacts shown return Collections.emptyList(); } + + if (region != null) { + Predicate regionFilter = cb.equal(caze.get(Case.REGION), region); + if (filter != null) { + filter = cb.and(filter, regionFilter); + } else { + filter = regionFilter; + } + } if (district != null) { Predicate districtFilter = cb.equal(caze.get(Case.DISTRICT), district); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index ebeaa65430a..647eb289de7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -27,6 +27,7 @@ import de.symeda.sormas.api.event.EventIndexDto; import de.symeda.sormas.api.event.EventReferenceDto; import de.symeda.sormas.api.region.DistrictReferenceDto; +import de.symeda.sormas.api.region.RegionReferenceDto; import de.symeda.sormas.api.task.TaskCriteria; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.user.UserRole; @@ -39,6 +40,7 @@ import de.symeda.sormas.backend.region.District; import de.symeda.sormas.backend.region.DistrictService; import de.symeda.sormas.backend.region.Region; +import de.symeda.sormas.backend.region.RegionService; import de.symeda.sormas.backend.task.Task; import de.symeda.sormas.backend.task.TaskService; import de.symeda.sormas.backend.user.User; @@ -66,6 +68,8 @@ public class EventFacadeEjb implements EventFacade { @EJB private LocationFacadeEjbLocal locationFacade; @EJB + private RegionService regionService; + @EJB private DistrictService districtService; @Override @@ -116,11 +120,12 @@ public List getAllEventsBetween(Date fromDate, Date toDate, DistrictRe } @Override - public List getNewEventsForDashboard(DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid) { + public List getNewEventsForDashboard(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid) { User user = userService.getByUuid(userUuid); + Region region = regionService.getByReferenceDto(regionRef); District district = districtService.getByReferenceDto(districtRef); - return eventService.getNewEventsForDashboard(district, disease, from, to, user); + return eventService.getNewEventsForDashboard(region, district, disease, from, to, user); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java index 1f909d67be2..7ff6feab5f7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventService.java @@ -16,17 +16,15 @@ import javax.persistence.criteria.Root; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.contact.ContactCriteria; import de.symeda.sormas.api.event.DashboardEventDto; import de.symeda.sormas.api.event.EventCriteria; import de.symeda.sormas.api.user.UserRole; -import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.common.AbstractAdoService; import de.symeda.sormas.backend.common.AbstractDomainObject; -import de.symeda.sormas.backend.contact.Contact; import de.symeda.sormas.backend.location.Location; import de.symeda.sormas.backend.region.District; import de.symeda.sormas.backend.region.DistrictFacadeEjb.DistrictFacadeEjbLocal; +import de.symeda.sormas.backend.region.Region; import de.symeda.sormas.backend.user.User; @Stateless @@ -73,7 +71,7 @@ public List getAllBetween(Date fromDate, Date toDate, District district, return resultList; } - public List getNewEventsForDashboard(District district, Disease disease, Date from, Date to, User user) { + public List getNewEventsForDashboard(Region region, District district, Disease disease, Date from, Date to, User user) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(DashboardEventDto.class); Root event = cq.from(getElementClass()); @@ -88,6 +86,15 @@ public List getNewEventsForDashboard(District district, Disea filter = dateFilter; } + if (region != null) { + Predicate regionFilter = cb.equal(eventLocation.get(Location.REGION), region); + if (filter != null) { + filter = cb.and(filter, regionFilter); + } else { + filter = regionFilter; + } + } + if (district != null) { Predicate districtFilter = cb.equal(eventLocation.get(Location.DISTRICT), district); if (filter != null) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java index 2c68bf019e0..a8a17fa591b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleFacadeEjb.java @@ -22,6 +22,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.region.DistrictReferenceDto; +import de.symeda.sormas.api.region.RegionReferenceDto; import de.symeda.sormas.api.sample.DashboardSampleDto; import de.symeda.sormas.api.sample.SampleCriteria; import de.symeda.sormas.api.sample.SampleDto; @@ -32,8 +33,8 @@ import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.caze.CaseFacadeEjb; import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal; -import de.symeda.sormas.backend.common.AbstractAdoService; import de.symeda.sormas.backend.caze.CaseService; +import de.symeda.sormas.backend.common.AbstractAdoService; import de.symeda.sormas.backend.facility.Facility; import de.symeda.sormas.backend.facility.FacilityFacadeEjb; import de.symeda.sormas.backend.facility.FacilityFacadeEjb.FacilityFacadeEjbLocal; @@ -44,6 +45,7 @@ import de.symeda.sormas.backend.region.DistrictService; import de.symeda.sormas.backend.region.Region; import de.symeda.sormas.backend.region.RegionFacadeEjb.RegionFacadeEjbLocal; +import de.symeda.sormas.backend.region.RegionService; import de.symeda.sormas.backend.sample.SampleTestFacadeEjb.SampleTestFacadeEjbLocal; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb; @@ -66,6 +68,8 @@ public class SampleFacadeEjb implements SampleFacade { @EJB private CaseService caseService; @EJB + private RegionService regionService; + @EJB private DistrictService districtService; @EJB private FacilityService facilityService; @@ -191,11 +195,12 @@ public List getIndexList(String userUuid, SampleCriteria sampleC } @Override - public List getNewSamplesForDashboard(DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid) { + public List getNewSamplesForDashboard(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid) { User user = userService.getByUuid(userUuid); + Region region = regionService.getByReferenceDto(regionRef); District district = districtService.getByReferenceDto(districtRef); - return sampleService.getNewSamplesForDashboard(district, disease, from, to, user); + return sampleService.getNewSamplesForDashboard(region, district, disease, from, to, user); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java index 33899a20d3e..caf8e7754f7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleService.java @@ -85,7 +85,7 @@ public void updateMainSampleTest(Sample sample) { } } - public List getNewSamplesForDashboard(District district, Disease disease, Date from, Date to, User user) { + public List getNewSamplesForDashboard(Region region, District district, Disease disease, Date from, Date to, User user) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(DashboardSampleDto.class); Root sample = cq.from(getElementClass()); @@ -98,6 +98,15 @@ public List getNewSamplesForDashboard(District district, Dis } else { filter = dateFilter; } + + if (region != null) { + Predicate regionFilter = cb.equal(caze.get(Case.REGION), region); + if (filter != null) { + filter = cb.and(filter, regionFilter); + } else { + filter = regionFilter; + } + } if (district != null) { Predicate districtFilter = cb.equal(caze.get(Case.DISTRICT), district); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleTestFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleTestFacadeEjb.java index 2b843aafea8..4029d33d1a6 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleTestFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleTestFacadeEjb.java @@ -19,6 +19,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.I18nProperties; import de.symeda.sormas.api.region.DistrictReferenceDto; +import de.symeda.sormas.api.region.RegionReferenceDto; import de.symeda.sormas.api.sample.DashboardTestResultDto; import de.symeda.sormas.api.sample.SampleReferenceDto; import de.symeda.sormas.api.sample.SampleTestDto; @@ -35,6 +36,8 @@ import de.symeda.sormas.backend.facility.FacilityService; import de.symeda.sormas.backend.region.District; import de.symeda.sormas.backend.region.DistrictService; +import de.symeda.sormas.backend.region.Region; +import de.symeda.sormas.backend.region.RegionService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb; import de.symeda.sormas.backend.user.UserService; @@ -52,6 +55,8 @@ public class SampleTestFacadeEjb implements SampleTestFacade { @EJB private SampleService sampleService; @EJB + private RegionService regionService; + @EJB private DistrictService districtService; @EJB private FacilityService facilityService; @@ -109,11 +114,12 @@ public List getAllBySample(SampleReferenceDto sampleRef) { } @Override - public List getNewTestResultsForDashboard(DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid) { + public List getNewTestResultsForDashboard(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date from, Date to, String userUuid) { User user = userService.getByUuid(userUuid); + Region region = regionService.getByReferenceDto(regionRef); District district = districtService.getByReferenceDto(districtRef); - return sampleTestService.getNewTestResultsForDashboard(district, disease, from, to, user); + return sampleTestService.getNewTestResultsForDashboard(region, district, disease, from, to, user); } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleTestService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleTestService.java index 4e1eb3446e0..fd03afaebd7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleTestService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleTestService.java @@ -21,6 +21,7 @@ import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.common.AbstractAdoService; import de.symeda.sormas.backend.region.District; +import de.symeda.sormas.backend.region.Region; import de.symeda.sormas.backend.user.User; @Stateless @@ -48,7 +49,7 @@ public List getAllBySample(Sample sample) { return resultList; } - public List getNewTestResultsForDashboard(District district, Disease disease, Date from, Date to, User user) { + public List getNewTestResultsForDashboard(Region region, District district, Disease disease, Date from, Date to, User user) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(DashboardTestResultDto.class); Root sampleTest = cq.from(getElementClass()); @@ -63,6 +64,15 @@ public List getNewTestResultsForDashboard(District distr filter = dateFilter; } + if (region != null) { + Predicate regionFilter = cb.equal(caze.get(Case.REGION), region); + if (filter != null) { + filter = cb.and(filter, regionFilter); + } else { + filter = regionFilter; + } + } + if (district != null) { Predicate districtFilter = cb.equal(caze.get(Case.DISTRICT), district); if (filter != null) { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java index 482f9d3810d..98c6bc90761 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java @@ -103,7 +103,7 @@ public void testDashboardCaseListCreation() { CaseDataDto caze = creator.createCase(user.toReference(), cazePerson.toReference(), Disease.EVD, CaseClassification.PROBABLE, InvestigationStatus.PENDING, new Date(), rdcf); - List dashboardCaseDtos = getCaseFacade().getNewCasesForDashboard(caze.getDistrict(), caze.getDisease(), DateHelper.subtractDays(new Date(), 1), DateHelper.addDays(new Date(), 1), user.getUuid()); + List dashboardCaseDtos = getCaseFacade().getNewCasesForDashboard(caze.getRegion(), caze.getDistrict(), caze.getDisease(), DateHelper.subtractDays(new Date(), 1), DateHelper.addDays(new Date(), 1), user.getUuid()); // List should have one entry assertEquals(1, dashboardCaseDtos.size()); @@ -118,7 +118,7 @@ public void testMapCaseListCreation() { CaseDataDto caze = creator.createCase(user.toReference(), cazePerson.toReference(), Disease.EVD, CaseClassification.PROBABLE, InvestigationStatus.PENDING, new Date(), rdcf); - List mapCaseDtos = getCaseFacade().getCasesForMap(caze.getDistrict(), caze.getDisease(), DateHelper.subtractDays(new Date(), 1), DateHelper.addDays(new Date(), 1), user.getUuid()); + List mapCaseDtos = getCaseFacade().getCasesForMap(caze.getRegion(), caze.getDistrict(), caze.getDisease(), DateHelper.subtractDays(new Date(), 1), DateHelper.addDays(new Date(), 1), user.getUuid()); // List should have one entry assertEquals(1, mapCaseDtos.size()); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java index 3bef4f51978..5a90fc9957f 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/contact/ContactFacadeEjbTest.java @@ -145,7 +145,7 @@ public void testMapContactListCreation() { creator.createContact(user.toReference(), user.toReference(), contactPerson.toReference(), caze.toReference(), new Date(), new Date()); MapCaseDto mapCaseDto = new MapCaseDto(caze.getUuid(), caze.getReportDate(), caze.getCaseClassification(), caze.getDisease(), caze.getHealthFacility().getUuid(), caze.getPerson().getUuid(), caze.getReportLat(), caze.getReportLon(), caze.getReportLat(), caze.getReportLon()); - List mapContactDtos = getContactFacade().getContactsForMap(caze.getDistrict(), caze.getDisease(), DateHelper.subtractDays(new Date(), 1), DateHelper.addDays(new Date(), 1), user.getUuid(), Arrays.asList(mapCaseDto)); + List mapContactDtos = getContactFacade().getContactsForMap(caze.getRegion(), caze.getDistrict(), caze.getDisease(), DateHelper.subtractDays(new Date(), 1), DateHelper.addDays(new Date(), 1), user.getUuid(), Arrays.asList(mapCaseDto)); // List should have one entry assertEquals(1, mapContactDtos.size()); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/event/EventFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/event/EventFacadeEjbTest.java index 8de42d2239d..5795ac29b32 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/event/EventFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/event/EventFacadeEjbTest.java @@ -40,7 +40,7 @@ public void testDashboardEventListCreation() { eventLocation.setDistrict(getDistrictFacade().getDistrictReferenceByUuid(rdcf.district.getUuid())); EventDto event = creator.createEvent(EventType.OUTBREAK, EventStatus.POSSIBLE, "Description", "First", "Name", "12345", TypeOfPlace.PUBLIC_PLACE, DateHelper.subtractDays(new Date(), 1), new Date(), user.toReference(), user.toReference(), Disease.EVD, eventLocation); - List dashboardEventDtos = getEventFacade().getNewEventsForDashboard(eventLocation.getDistrict(), event.getDisease(), DateHelper.subtractDays(new Date(), 1), DateHelper.addDays(new Date(), 1), user.getUuid()); + List dashboardEventDtos = getEventFacade().getNewEventsForDashboard(eventLocation.getRegion(), eventLocation.getDistrict(), event.getDisease(), DateHelper.subtractDays(new Date(), 1), DateHelper.addDays(new Date(), 1), user.getUuid()); // List should have one entry assertEquals(1, dashboardEventDtos.size()); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleTestFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleTestFacadeEjbTest.java index fbc0ddad215..f3b30ce4e7d 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleTestFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleTestFacadeEjbTest.java @@ -38,7 +38,7 @@ public void testDashboardSampleResultListCreation() { InvestigationStatus.PENDING, new Date(), rdcf); creator.createSample(caze.toReference(), new Date(), new Date(), user.toReference(), SampleMaterial.BLOOD, rdcf.facility); - List dashboardSampleDtos = getSampleFacade().getNewSamplesForDashboard(caze.getDistrict(), caze.getDisease(), DateHelper.subtractDays(new Date(), 1), DateHelper.addDays(new Date(), 1), user.getUuid()); + List dashboardSampleDtos = getSampleFacade().getNewSamplesForDashboard(caze.getRegion(), caze.getDistrict(), caze.getDisease(), DateHelper.subtractDays(new Date(), 1), DateHelper.addDays(new Date(), 1), user.getUuid()); // List should have one entry assertEquals(1, dashboardSampleDtos.size()); @@ -55,7 +55,7 @@ public void testDashboardTestResultListCreation() { SampleDto sample = creator.createSample(caze.toReference(), new Date(), new Date(), user.toReference(), SampleMaterial.BLOOD, rdcf.facility); creator.createSampleTest(sample.toReference(), SampleTestType.MICROSCOPY, new Date(), rdcf.facility, user.toReference(), SampleTestResultType.POSITIVE, "Positive", true); - List dashboardTestResultDtos = getSampleTestFacade().getNewTestResultsForDashboard(caze.getDistrict(), caze.getDisease(), DateHelper.subtractDays(new Date(), 1), DateHelper.addDays(new Date(), 1), user.getUuid()); + List dashboardTestResultDtos = getSampleTestFacade().getNewTestResultsForDashboard(caze.getRegion(), caze.getDistrict(), caze.getDisease(), DateHelper.subtractDays(new Date(), 1), DateHelper.addDays(new Date(), 1), user.getUuid()); // List should have one entry assertEquals(1, dashboardTestResultDtos.size()); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardDataProvider.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardDataProvider.java index 352ae5afa41..2183e73f7fa 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardDataProvider.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardDataProvider.java @@ -9,6 +9,7 @@ import de.symeda.sormas.api.caze.DashboardCaseDto; import de.symeda.sormas.api.event.DashboardEventDto; import de.symeda.sormas.api.region.DistrictReferenceDto; +import de.symeda.sormas.api.region.RegionReferenceDto; import de.symeda.sormas.api.sample.DashboardSampleDto; import de.symeda.sormas.api.sample.DashboardTestResultDto; import de.symeda.sormas.api.task.DashboardTaskDto; @@ -19,6 +20,7 @@ public class DashboardDataProvider { + private RegionReferenceDto region; private DistrictReferenceDto district; private Disease disease; private DateFilterOption dateFilterOption; @@ -46,16 +48,16 @@ public void refreshData() { Date previousFromDate = DateHelper.subtractDays(fromDate, period); Date previousToDate = DateHelper.subtractDays(toDate, period); // Cases - setCases(FacadeProvider.getCaseFacade().getNewCasesForDashboard(district, disease, fromDate, toDate, userUuid)); - setPreviousCases(FacadeProvider.getCaseFacade().getNewCasesForDashboard(district, disease, previousFromDate, previousToDate, userUuid)); + setCases(FacadeProvider.getCaseFacade().getNewCasesForDashboard(region, district, disease, fromDate, toDate, userUuid)); + setPreviousCases(FacadeProvider.getCaseFacade().getNewCasesForDashboard(region, district, disease, previousFromDate, previousToDate, userUuid)); // Events - setEvents(FacadeProvider.getEventFacade().getNewEventsForDashboard(district, disease, fromDate, toDate, userUuid)); - setPreviousEvents(FacadeProvider.getEventFacade().getNewEventsForDashboard(district, disease, previousFromDate, previousToDate, userUuid)); + setEvents(FacadeProvider.getEventFacade().getNewEventsForDashboard(region, district, disease, fromDate, toDate, userUuid)); + setPreviousEvents(FacadeProvider.getEventFacade().getNewEventsForDashboard(region, district, disease, previousFromDate, previousToDate, userUuid)); // Test results - setTestResults(FacadeProvider.getSampleTestFacade().getNewTestResultsForDashboard(district, disease, fromDate, toDate, userUuid)); - setPreviousTestResults(FacadeProvider.getSampleTestFacade().getNewTestResultsForDashboard(district, disease, previousFromDate, previousToDate, userUuid)); + setTestResults(FacadeProvider.getSampleTestFacade().getNewTestResultsForDashboard(region, district, disease, fromDate, toDate, userUuid)); + setPreviousTestResults(FacadeProvider.getSampleTestFacade().getNewTestResultsForDashboard(region, district, disease, previousFromDate, previousToDate, userUuid)); // Samples - setSamples(FacadeProvider.getSampleFacade().getNewSamplesForDashboard(district, disease, fromDate, toDate, userUuid)); + setSamples(FacadeProvider.getSampleFacade().getNewSamplesForDashboard(region, district, disease, fromDate, toDate, userUuid)); } else { int period = toWeek.getWeek() - fromWeek.getWeek() + 1; Date epiWeekStart = DateHelper.getEpiWeekStart(fromWeek); @@ -63,16 +65,16 @@ public void refreshData() { Date previousEpiWeekStart = DateHelper.getEpiWeekStart(DateHelper.getPreviousEpiWeek(fromWeek, period)); Date previousEpiWeekEnd = DateHelper.getEpiWeekEnd(DateHelper.getPreviousEpiWeek(toWeek, period)); // Cases - setCases(FacadeProvider.getCaseFacade().getNewCasesForDashboard(district, disease, epiWeekStart, epiWeekEnd, userUuid)); - setPreviousCases(FacadeProvider.getCaseFacade().getNewCasesForDashboard(district, disease, previousEpiWeekStart, previousEpiWeekEnd, userUuid)); + setCases(FacadeProvider.getCaseFacade().getNewCasesForDashboard(region, district, disease, epiWeekStart, epiWeekEnd, userUuid)); + setPreviousCases(FacadeProvider.getCaseFacade().getNewCasesForDashboard(region, district, disease, previousEpiWeekStart, previousEpiWeekEnd, userUuid)); // Events - setEvents(FacadeProvider.getEventFacade().getNewEventsForDashboard(district, disease, epiWeekStart, epiWeekEnd, userUuid)); - setPreviousEvents(FacadeProvider.getEventFacade().getNewEventsForDashboard(district, disease, previousEpiWeekStart, previousEpiWeekEnd, userUuid)); + setEvents(FacadeProvider.getEventFacade().getNewEventsForDashboard(region, district, disease, epiWeekStart, epiWeekEnd, userUuid)); + setPreviousEvents(FacadeProvider.getEventFacade().getNewEventsForDashboard(region, district, disease, previousEpiWeekStart, previousEpiWeekEnd, userUuid)); // Test results - setTestResults(FacadeProvider.getSampleTestFacade().getNewTestResultsForDashboard(district, disease, epiWeekStart, epiWeekEnd, userUuid)); - setPreviousTestResults(FacadeProvider.getSampleTestFacade().getNewTestResultsForDashboard(district, disease, previousEpiWeekStart, previousEpiWeekEnd, userUuid)); + setTestResults(FacadeProvider.getSampleTestFacade().getNewTestResultsForDashboard(region, district, disease, epiWeekStart, epiWeekEnd, userUuid)); + setPreviousTestResults(FacadeProvider.getSampleTestFacade().getNewTestResultsForDashboard(region, district, disease, previousEpiWeekStart, previousEpiWeekEnd, userUuid)); // Samples - setSamples(FacadeProvider.getSampleFacade().getNewSamplesForDashboard(district, disease, epiWeekStart, epiWeekEnd, userUuid)); + setSamples(FacadeProvider.getSampleFacade().getNewSamplesForDashboard(region, district, disease, epiWeekStart, epiWeekEnd, userUuid)); } // Tasks setTasks(FacadeProvider.getTaskFacade().getAllByUserForDashboard(null, @@ -134,6 +136,12 @@ public List getPendingTasks() { public void setPendingTasks(List pendingTasks) { this.pendingTasks = pendingTasks; } + public RegionReferenceDto getRegion() { + return region; + } + public void setRegion(RegionReferenceDto region) { + this.region = region; + } public DistrictReferenceDto getDistrict() { return district; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardView.java index 7eaa88ef622..384f5005547 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardView.java @@ -23,6 +23,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.I18nProperties; import de.symeda.sormas.api.region.DistrictReferenceDto; +import de.symeda.sormas.api.region.RegionReferenceDto; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.EpiWeek; import de.symeda.sormas.ui.login.LoginHelper; @@ -87,6 +88,7 @@ public class DashboardView extends AbstractView { private StatisticsComponent statisticsComponent; // Filters + private RegionReferenceDto region; private DistrictReferenceDto district; private Disease disease; private DateFilterOption dateFilterOption; @@ -148,6 +150,7 @@ private HorizontalLayout createFilterBar() { filterLayout.addStyleName(CssStyles.VSPACE_3); filterLayout.setMargin(new MarginInfo(true, true, false, true)); + ComboBox regionFilter = new ComboBox(); ComboBox districtFilter = new ComboBox(); ComboBox diseaseFilter = new ComboBox(); ComboBox dateFilterOptionFilter = new ComboBox(); @@ -162,6 +165,8 @@ private HorizontalLayout createFilterBar() { applyButton.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { + region = (RegionReferenceDto) regionFilter.getValue(); + dashboardDataProvider.setRegion(region); district = (DistrictReferenceDto) districtFilter.getValue(); dashboardDataProvider.setDistrict(district); disease = (Disease) diseaseFilter.getValue(); @@ -183,6 +188,20 @@ public void buttonClick(ClickEvent event) { refreshDashboard(); } }); + + // Region filter + if (LoginHelper.getCurrentUser().getRegion() == null) { + regionFilter.setWidth(200, Unit.PIXELS); + regionFilter.setInputPrompt("State"); + regionFilter.addItems(FacadeProvider.getRegionFacade().getAllAsReference()); + regionFilter.addValueChangeListener(e -> { + applyButton.addStyleName(ValoTheme.BUTTON_PRIMARY); + }); + regionFilter.setCaption("State"); + filterLayout.addComponent(regionFilter); + region = (RegionReferenceDto) regionFilter.getValue(); + dashboardDataProvider.setRegion(region); + } // District filter if (LoginHelper.getCurrentUser().getRegion() != null) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/EpiCurveComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/EpiCurveComponent.java index 8604bcda0bc..a4616e6e1ca 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/EpiCurveComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/EpiCurveComponent.java @@ -127,6 +127,7 @@ public void clearAndFillEpiCurveChart() { CaseCriteria caseCriteria = new CaseCriteria() .diseaseEquals(dashboardDataProvider.getDisease()) + .regionEquals(dashboardDataProvider.getRegion()) .districtEquals(dashboardDataProvider.getDistrict()); if (epiCurveGrouping == EpiCurveGrouping.DAY) { caseCriteria.newCaseDateBetween(DateHelper.getStartOfDay(date), DateHelper.getEndOfDay(date)); @@ -192,6 +193,7 @@ public void clearAndFillEpiCurveChart() { CaseCriteria caseCriteria = new CaseCriteria() .diseaseEquals(dashboardDataProvider.getDisease()) + .regionEquals(dashboardDataProvider.getRegion()) .districtEquals(dashboardDataProvider.getDistrict()); if (epiCurveGrouping == EpiCurveGrouping.DAY) { caseCriteria.newCaseDateBetween(DateHelper.getStartOfDay(date), DateHelper.getEndOfDay(date)); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/MapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/MapComponent.java index 981f6c41f79..7eae2867c78 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/MapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/MapComponent.java @@ -189,6 +189,7 @@ public void refreshMap() { DateHelper.getEpiWeekStart(dashboardDataProvider.getFromWeek()); Date toDate = dashboardDataProvider.getDateFilterOption() == DateFilterOption.DATE ? dashboardDataProvider.getToDate() : DateHelper.getEpiWeekEnd(dashboardDataProvider.getToWeek()); + RegionReferenceDto region = dashboardDataProvider.getRegion(); DistrictReferenceDto district = dashboardDataProvider.getDistrict(); Disease disease = dashboardDataProvider.getDisease(); @@ -196,15 +197,15 @@ public void refreshMap() { showRegionsShapes(caseMeasure, fromDate, toDate, dashboardDataProvider.getDisease()); } if (showCases) { - showCaseMarkers(FacadeProvider.getCaseFacade().getCasesForMap(district, disease, fromDate, toDate, LoginHelper.getCurrentUser().getUuid())); + showCaseMarkers(FacadeProvider.getCaseFacade().getCasesForMap(region, district, disease, fromDate, toDate, LoginHelper.getCurrentUser().getUuid())); } if (showContacts) { if (!showCases) { // Case lists need to be filled even when cases are hidden because they are needed to retrieve the contacts - fillCaseLists(FacadeProvider.getCaseFacade().getCasesForMap(district, disease, fromDate, toDate, LoginHelper.getCurrentUser().getUuid())); + fillCaseLists(FacadeProvider.getCaseFacade().getCasesForMap(region, district, disease, fromDate, toDate, LoginHelper.getCurrentUser().getUuid())); } showContactMarkers(FacadeProvider.getContactFacade() - .getContactsForMap(district, disease, fromDate, toDate, + .getContactsForMap(region, district, disease, fromDate, toDate, LoginHelper.getCurrentUser().getUuid(), mapAndFacilityCases)); } if (showEvents) { From 1057cce19b40e51bd56b87e99bbbc0e4bb32ddc7 Mon Sep 17 00:00:00 2001 From: Sormas-open Date: Fri, 16 Mar 2018 15:43:41 +0100 Subject: [PATCH 11/16] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 00a53bd5e7c..ca9353b7d7f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ ## Project Structure +Creative Commons License
SORMAS- Surveillance Outbreak Response Management and Analysis System by Helmholtz Centre for Infection Research (HZI) is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.
Based on a work at www.sormas.org. The project consists of the following modules: - sormas-api: general business logic and definitions for data exchange between app and server From 640e413dc978d70010a8be8f14c8a5fd374e9801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 20 Mar 2018 10:48:07 +0100 Subject: [PATCH 12/16] #510 - added date range filter to case list, moved date and epi week filter to custom component --- .../de/symeda/sormas/ui/caze/CaseGrid.java | 6 + .../de/symeda/sormas/ui/caze/CasesView.java | 461 +++++++++++------- .../sormas/ui/dashboard/DashboardView.java | 140 ++---- .../sormas/ui/statistics/StatisticsView.java | 115 +---- .../de/symeda/sormas/ui/utils/CssStyles.java | 1 + .../utils/EpiWeekAndDateFilterComponent.java | 160 ++++++ .../symeda/sormas/ui/utils/VaadinUiUtil.java | 5 +- 7 files changed, 505 insertions(+), 383 deletions(-) create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/utils/EpiWeekAndDateFilterComponent.java diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseGrid.java index eaf1a0f1628..989154dc987 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseGrid.java @@ -1,6 +1,7 @@ package de.symeda.sormas.ui.caze; import java.util.ArrayList; +import java.util.Date; import java.util.List; import com.vaadin.data.Container.Filter; @@ -172,6 +173,11 @@ public void setPresentConditionFilter(PresentCondition presentCondition) { } } + public void setDateFilter(Date fromDate, Date toDate) { + caseCriteria.newCaseDateBetween(fromDate, toDate); + reload(); + } + public void filterByText(String text) { getContainer().removeContainerFilters(CaseIndexDto.UUID); getContainer().removeContainerFilters(CaseIndexDto.PERSON_FIRST_NAME); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java index 5c0e297ca57..cbd7aa7d1ad 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java @@ -1,7 +1,10 @@ package de.symeda.sormas.ui.caze; +import java.util.Date; + import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.FontAwesome; +import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.ComboBox; import com.vaadin.ui.HorizontalLayout; @@ -26,10 +29,14 @@ import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.user.UserRole; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.utils.EpiWeek; import de.symeda.sormas.ui.ControllerProvider; +import de.symeda.sormas.ui.dashboard.DateFilterOption; import de.symeda.sormas.ui.login.LoginHelper; import de.symeda.sormas.ui.utils.AbstractView; import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.EpiWeekAndDateFilterComponent; import de.symeda.sormas.ui.utils.VaadinUiUtil; /** @@ -41,202 +48,282 @@ public class CasesView extends AbstractView { private static final long serialVersionUID = -3533557348144005469L; - + public static final String VIEW_NAME = "cases"; - + public static final String SEARCH_FIELD = "searchField"; private CaseGrid grid; private Button importButton; - private Button createButton; + private Button createButton; private VerticalLayout gridLayout; + private HorizontalLayout firstFilterRowLayout; + private HorizontalLayout secondFilterRowLayout; + private HorizontalLayout dateFilterRowLayout; + + private DateFilterOption dateFilterOption; + private Date fromDate = null; + private Date toDate = null; + + public CasesView() { + super(VIEW_NAME); + + if (LoginHelper.hasUserRight(UserRight.CASE_IMPORT)) { + importButton = new Button("Import"); + importButton.addStyleName(ValoTheme.BUTTON_PRIMARY); + importButton.setIcon(FontAwesome.UPLOAD); + importButton.addClickListener(e -> { + Window popupWindow = VaadinUiUtil.showPopupWindow(new CaseImportLayout()); + popupWindow.setCaption("Import cases"); + popupWindow.addCloseListener(c -> { + grid.reload(); + }); + }); + addHeaderComponent(importButton); + } + + if (LoginHelper.hasUserRight(UserRight.CASE_CREATE)) { + createButton = new Button("New case"); + createButton.addStyleName(ValoTheme.BUTTON_PRIMARY); + createButton.setIcon(FontAwesome.PLUS_CIRCLE); + createButton.addClickListener(e -> ControllerProvider.getCaseController().create()); + addHeaderComponent(createButton); + } + + grid = new CaseGrid(); + + gridLayout = new VerticalLayout(); + gridLayout.addComponent(createTopBar()); + gridLayout.addComponent(createFilterBar()); + gridLayout.addComponent(grid); + gridLayout.setMargin(true); + gridLayout.setSpacing(false); + gridLayout.setSizeFull(); + gridLayout.setExpandRatio(grid, 1); + gridLayout.setStyleName("crud-main-layout"); - public CasesView() { - super(VIEW_NAME); - - if (LoginHelper.hasUserRight(UserRight.CASE_IMPORT)) { - importButton = new Button("Import"); - importButton.addStyleName(ValoTheme.BUTTON_PRIMARY); - importButton.setIcon(FontAwesome.UPLOAD); - importButton.addClickListener(e -> { - Window popupWindow = VaadinUiUtil.showPopupWindow(new CaseImportLayout()); - popupWindow.setCaption("Import cases"); - popupWindow.addCloseListener(c -> { - grid.reload(); - }); - }); - addHeaderComponent(importButton); - } - - if (LoginHelper.hasUserRight(UserRight.CASE_CREATE)) { - createButton = new Button("New case"); - createButton.addStyleName(ValoTheme.BUTTON_PRIMARY); - createButton.setIcon(FontAwesome.PLUS_CIRCLE); - createButton.addClickListener(e -> ControllerProvider.getCaseController().create()); - addHeaderComponent(createButton); - } - - grid = new CaseGrid(); - - gridLayout = new VerticalLayout(); - gridLayout.addComponent(createTopBar()); - gridLayout.addComponent(createFilterBar()); - gridLayout.addComponent(grid); - gridLayout.setMargin(true); - gridLayout.setSpacing(false); - gridLayout.setSizeFull(); - gridLayout.setExpandRatio(grid, 1); - gridLayout.setStyleName("crud-main-layout"); - - addComponent(gridLayout); - } + addComponent(gridLayout); + } public HorizontalLayout createTopBar() { - HorizontalLayout topLayout = new HorizontalLayout(); - topLayout.setSpacing(true); - topLayout.setSizeUndefined(); - topLayout.addStyleName(CssStyles.VSPACE_3); - - Button statusAll = new Button("all", e -> grid.setInvestigationFilter(null)); - statusAll.setStyleName(ValoTheme.BUTTON_LINK); - topLayout.addComponent(statusAll); - - for (InvestigationStatus status : InvestigationStatus.values()) { - Button statusButton = new Button(status.toString(), e -> grid.setInvestigationFilter(status)); - statusButton.setStyleName(ValoTheme.BUTTON_LINK); - topLayout.addComponent(statusButton); - } - - return topLayout; - } - - public HorizontalLayout createFilterBar() { - HorizontalLayout filterLayout = new HorizontalLayout(); - filterLayout.setSpacing(true); - filterLayout.setSizeUndefined(); - filterLayout.addStyleName(CssStyles.VSPACE_3); - - ComboBox outcomeFilter = new ComboBox(); - outcomeFilter.setWidth(140, Unit.PIXELS); - outcomeFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.OUTCOME)); - outcomeFilter.addItems((Object[]) CaseOutcome.values()); - outcomeFilter.addValueChangeListener(e -> grid.setOutcomeFilter(((CaseOutcome) e.getProperty().getValue()))); - filterLayout.addComponent(outcomeFilter); - outcomeFilter.setValue(CaseOutcome.NO_OUTCOME); - - ComboBox diseaseFilter = new ComboBox(); - diseaseFilter.setWidth(140, Unit.PIXELS); - diseaseFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.DISEASE)); - diseaseFilter.addItems((Object[])Disease.values()); - diseaseFilter.addValueChangeListener(e->grid.setDiseaseFilter(((Disease)e.getProperty().getValue()))); - filterLayout.addComponent(diseaseFilter); - - ComboBox classificationFilter = new ComboBox(); - classificationFilter.setWidth(140, Unit.PIXELS); - classificationFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.CASE_CLASSIFICATION)); - classificationFilter.addItems((Object[])CaseClassification.values()); - classificationFilter.addValueChangeListener(e->grid.setClassificationFilter(((CaseClassification)e.getProperty().getValue()))); - filterLayout.addComponent(classificationFilter); - - ComboBox presentConditionFilter = new ComboBox(); - presentConditionFilter.setWidth(140, Unit.PIXELS); - presentConditionFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(PersonDto.I18N_PREFIX, PersonDto.PRESENT_CONDITION)); - presentConditionFilter.addItems((Object[])PresentCondition.values()); - presentConditionFilter.addValueChangeListener(e->grid.setPresentConditionFilter(((PresentCondition)e.getProperty().getValue()))); - filterLayout.addComponent(presentConditionFilter); - - UserDto user = LoginHelper.getCurrentUser(); - - ComboBox regionFilter = new ComboBox(); - if (user.getRegion() == null) { - regionFilter.setWidth(140, Unit.PIXELS); - regionFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.REGION)); - regionFilter.addItems(FacadeProvider.getRegionFacade().getAllAsReference()); - regionFilter.addValueChangeListener(e -> { - RegionReferenceDto region = (RegionReferenceDto)e.getProperty().getValue(); - grid.setRegionFilter(region); - }); - filterLayout.addComponent(regionFilter); - } - - ComboBox districtFilter = new ComboBox(); - districtFilter.setWidth(140, Unit.PIXELS); - districtFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.DISTRICT)); - districtFilter.setDescription("Select a district in the state"); - districtFilter.addValueChangeListener(e->grid.setDistrictFilter(((DistrictReferenceDto)e.getProperty().getValue()))); - - if (user.getRegion() != null) { - districtFilter.addItems(FacadeProvider.getDistrictFacade().getAllByRegion(user.getRegion().getUuid())); - districtFilter.setEnabled(true); - } else { - regionFilter.addValueChangeListener(e -> { - RegionReferenceDto region = (RegionReferenceDto)e.getProperty().getValue(); - districtFilter.removeAllItems(); - if (region != null) { - districtFilter.addItems(FacadeProvider.getDistrictFacade().getAllByRegion(region.getUuid())); - districtFilter.setEnabled(true); - } else { - districtFilter.setEnabled(false); - } - }); - districtFilter.setEnabled(false); - } - filterLayout.addComponent(districtFilter); - - ComboBox facilityFilter = new ComboBox(); - facilityFilter.setWidth(140, Unit.PIXELS); - facilityFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.HEALTH_FACILITY)); - facilityFilter.setDescription("Select a facility in the LGA"); - facilityFilter.addValueChangeListener(e->grid.setHealthFacilityFilter(((FacilityReferenceDto)e.getProperty().getValue()))); - facilityFilter.setEnabled(false); - filterLayout.addComponent(facilityFilter); - - districtFilter.addValueChangeListener(e-> { - facilityFilter.removeAllItems(); - DistrictReferenceDto district = (DistrictReferenceDto)e.getProperty().getValue(); - if (district != null) { - facilityFilter.addItems(FacadeProvider.getFacilityFacade().getHealthFacilitiesByDistrict(district, true)); - facilityFilter.setEnabled(true); - } else { - facilityFilter.setEnabled(false); - } - }); - - ComboBox officerFilter = new ComboBox(); - officerFilter.setWidth(140, Unit.PIXELS); - officerFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.SURVEILLANCE_OFFICER)); - if (user.getRegion() != null) { - officerFilter.addItems(FacadeProvider.getUserFacade().getUsersByRegionAndRoles(user.getRegion(), UserRole.SURVEILLANCE_OFFICER)); - } - officerFilter.addValueChangeListener(e->grid.setSurveillanceOfficerFilter(((UserReferenceDto)e.getProperty().getValue()))); - filterLayout.addComponent(officerFilter); - - ComboBox reportedByFilter = new ComboBox(); - reportedByFilter.setWidth(140, Unit.PIXELS); - reportedByFilter.setInputPrompt("Reported By"); - reportedByFilter.addItems((Object[]) UserRole.values()); - reportedByFilter.addValueChangeListener(e -> { - grid.setReportedByFilter((UserRole) e.getProperty().getValue()); - }); - filterLayout.addComponent(reportedByFilter); - - TextField searchField = new TextField(); - searchField.setWidth(200, Unit.PIXELS); - searchField.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, SEARCH_FIELD)); - searchField.addTextChangeListener(e->grid.filterByText(e.getText())); - filterLayout.addComponent(searchField); - - return filterLayout; - } - - @Override - public void enter(ViewChangeEvent event) { - grid.reload(); - } - - public void clearSelection() { - grid.getSelectionModel().reset(); - } + HorizontalLayout topLayout = new HorizontalLayout(); + topLayout.setSpacing(true); + topLayout.setSizeUndefined(); + topLayout.addStyleName(CssStyles.VSPACE_3); + + Button statusAll = new Button("all", e -> grid.setInvestigationFilter(null)); + statusAll.setStyleName(ValoTheme.BUTTON_LINK); + topLayout.addComponent(statusAll); + + for (InvestigationStatus status : InvestigationStatus.values()) { + Button statusButton = new Button(status.toString(), e -> grid.setInvestigationFilter(status)); + statusButton.setStyleName(ValoTheme.BUTTON_LINK); + topLayout.addComponent(statusButton); + } + + return topLayout; + } + + public VerticalLayout createFilterBar() { + VerticalLayout filterLayout = new VerticalLayout(); + filterLayout.setWidth(100, Unit.PERCENTAGE); + filterLayout.addStyleName(CssStyles.VSPACE_3); + + firstFilterRowLayout = new HorizontalLayout(); + firstFilterRowLayout.setSpacing(true); + firstFilterRowLayout.setWidth(100, Unit.PERCENTAGE); + { + ComboBox outcomeFilter = new ComboBox(); + outcomeFilter.setWidth(140, Unit.PIXELS); + outcomeFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.OUTCOME)); + outcomeFilter.addItems((Object[]) CaseOutcome.values()); + outcomeFilter.addValueChangeListener(e -> grid.setOutcomeFilter(((CaseOutcome) e.getProperty().getValue()))); + firstFilterRowLayout.addComponent(outcomeFilter); + outcomeFilter.setValue(CaseOutcome.NO_OUTCOME); + + ComboBox diseaseFilter = new ComboBox(); + diseaseFilter.setWidth(140, Unit.PIXELS); + diseaseFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.DISEASE)); + diseaseFilter.addItems((Object[])Disease.values()); + diseaseFilter.addValueChangeListener(e->grid.setDiseaseFilter(((Disease)e.getProperty().getValue()))); + firstFilterRowLayout.addComponent(diseaseFilter); + + ComboBox classificationFilter = new ComboBox(); + classificationFilter.setWidth(140, Unit.PIXELS); + classificationFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.CASE_CLASSIFICATION)); + classificationFilter.addItems((Object[])CaseClassification.values()); + classificationFilter.addValueChangeListener(e->grid.setClassificationFilter(((CaseClassification)e.getProperty().getValue()))); + firstFilterRowLayout.addComponent(classificationFilter); + + TextField searchField = new TextField(); + searchField.setWidth(200, Unit.PIXELS); + searchField.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, SEARCH_FIELD)); + searchField.addTextChangeListener(e->grid.filterByText(e.getText())); + firstFilterRowLayout.addComponent(searchField); + + addShowMoreOrLessFiltersButtons(firstFilterRowLayout); + } + filterLayout.addComponent(firstFilterRowLayout); + + secondFilterRowLayout = new HorizontalLayout(); + secondFilterRowLayout.setSpacing(true); + secondFilterRowLayout.setSizeUndefined(); + { + ComboBox presentConditionFilter = new ComboBox(); + presentConditionFilter.setWidth(140, Unit.PIXELS); + presentConditionFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(PersonDto.I18N_PREFIX, PersonDto.PRESENT_CONDITION)); + presentConditionFilter.addItems((Object[])PresentCondition.values()); + presentConditionFilter.addValueChangeListener(e->grid.setPresentConditionFilter(((PresentCondition)e.getProperty().getValue()))); + secondFilterRowLayout.addComponent(presentConditionFilter); + + UserDto user = LoginHelper.getCurrentUser(); + + ComboBox regionFilter = new ComboBox(); + if (user.getRegion() == null) { + regionFilter.setWidth(140, Unit.PIXELS); + regionFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.REGION)); + regionFilter.addItems(FacadeProvider.getRegionFacade().getAllAsReference()); + regionFilter.addValueChangeListener(e -> { + RegionReferenceDto region = (RegionReferenceDto)e.getProperty().getValue(); + grid.setRegionFilter(region); + }); + secondFilterRowLayout.addComponent(regionFilter); + } + + ComboBox districtFilter = new ComboBox(); + districtFilter.setWidth(140, Unit.PIXELS); + districtFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.DISTRICT)); + districtFilter.setDescription("Select a district in the state"); + districtFilter.addValueChangeListener(e->grid.setDistrictFilter(((DistrictReferenceDto)e.getProperty().getValue()))); + + if (user.getRegion() != null) { + districtFilter.addItems(FacadeProvider.getDistrictFacade().getAllByRegion(user.getRegion().getUuid())); + districtFilter.setEnabled(true); + } else { + regionFilter.addValueChangeListener(e -> { + RegionReferenceDto region = (RegionReferenceDto)e.getProperty().getValue(); + districtFilter.removeAllItems(); + if (region != null) { + districtFilter.addItems(FacadeProvider.getDistrictFacade().getAllByRegion(region.getUuid())); + districtFilter.setEnabled(true); + } else { + districtFilter.setEnabled(false); + } + }); + districtFilter.setEnabled(false); + } + secondFilterRowLayout.addComponent(districtFilter); + + ComboBox facilityFilter = new ComboBox(); + facilityFilter.setWidth(140, Unit.PIXELS); + facilityFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.HEALTH_FACILITY)); + facilityFilter.setDescription("Select a facility in the LGA"); + facilityFilter.addValueChangeListener(e->grid.setHealthFacilityFilter(((FacilityReferenceDto)e.getProperty().getValue()))); + facilityFilter.setEnabled(false); + secondFilterRowLayout.addComponent(facilityFilter); + + districtFilter.addValueChangeListener(e-> { + facilityFilter.removeAllItems(); + DistrictReferenceDto district = (DistrictReferenceDto)e.getProperty().getValue(); + if (district != null) { + facilityFilter.addItems(FacadeProvider.getFacilityFacade().getHealthFacilitiesByDistrict(district, true)); + facilityFilter.setEnabled(true); + } else { + facilityFilter.setEnabled(false); + } + }); + + ComboBox officerFilter = new ComboBox(); + officerFilter.setWidth(140, Unit.PIXELS); + officerFilter.setInputPrompt(I18nProperties.getPrefixFieldCaption(CaseDataDto.I18N_PREFIX, CaseDataDto.SURVEILLANCE_OFFICER)); + if (user.getRegion() != null) { + officerFilter.addItems(FacadeProvider.getUserFacade().getUsersByRegionAndRoles(user.getRegion(), UserRole.SURVEILLANCE_OFFICER)); + } + officerFilter.addValueChangeListener(e->grid.setSurveillanceOfficerFilter(((UserReferenceDto)e.getProperty().getValue()))); + secondFilterRowLayout.addComponent(officerFilter); + + ComboBox reportedByFilter = new ComboBox(); + reportedByFilter.setWidth(140, Unit.PIXELS); + reportedByFilter.setInputPrompt("Reported By"); + reportedByFilter.addItems((Object[]) UserRole.values()); + reportedByFilter.addValueChangeListener(e -> { + grid.setReportedByFilter((UserRole) e.getProperty().getValue()); + }); + secondFilterRowLayout.addComponent(reportedByFilter); + } + filterLayout.addComponent(secondFilterRowLayout); + secondFilterRowLayout.setVisible(false); + + dateFilterRowLayout = new HorizontalLayout(); + dateFilterRowLayout.setSpacing(true); + dateFilterRowLayout.setSizeUndefined(); + { + Button applyButton = new Button("Apply date filter"); + + EpiWeekAndDateFilterComponent weekAndDateFilter = new EpiWeekAndDateFilterComponent(applyButton, false, false); + weekAndDateFilter.getWeekFromFilter().setInputPrompt("New cases from epi week..."); + weekAndDateFilter.getWeekToFilter().setInputPrompt("... to epi week"); + weekAndDateFilter.getDateFromFilter().setInputPrompt("New cases from..."); + weekAndDateFilter.getDateToFilter().setInputPrompt("... to"); + dateFilterRowLayout.addComponent(weekAndDateFilter); + dateFilterRowLayout.addComponent(applyButton); + + applyButton.addClickListener(e -> { + dateFilterOption = (DateFilterOption) weekAndDateFilter.getDateFilterOptionFilter().getValue(); + if (dateFilterOption == DateFilterOption.DATE) { + fromDate = weekAndDateFilter.getDateFromFilter().getValue(); + toDate = weekAndDateFilter.getDateToFilter().getValue(); + } else { + fromDate = DateHelper.getEpiWeekStart((EpiWeek) weekAndDateFilter.getWeekFromFilter().getValue()); + toDate = DateHelper.getEpiWeekEnd((EpiWeek) weekAndDateFilter.getWeekToFilter().getValue()); + } + applyButton.removeStyleName(ValoTheme.BUTTON_PRIMARY); + grid.setDateFilter(fromDate, toDate); + }); + } + filterLayout.addComponent(dateFilterRowLayout); + dateFilterRowLayout.setVisible(false); + + return filterLayout; + } + + private void addShowMoreOrLessFiltersButtons(HorizontalLayout parentLayout) { + Button showMoreButton = new Button("Show More Filters", FontAwesome.CHEVRON_DOWN); + CssStyles.style(showMoreButton, ValoTheme.BUTTON_BORDERLESS, CssStyles.VSPACE_TOP_NONE); + Button showLessButton = new Button("Show Less Filters", FontAwesome.CHEVRON_UP); + CssStyles.style(showLessButton, ValoTheme.BUTTON_BORDERLESS, CssStyles.VSPACE_TOP_NONE); + + showMoreButton.addClickListener(e -> { + showMoreButton.setVisible(false); + showLessButton.setVisible(true); + secondFilterRowLayout.setVisible(true); + dateFilterRowLayout.setVisible(true); + }); + + showLessButton.addClickListener(e -> { + showLessButton.setVisible(false); + showMoreButton.setVisible(true); + secondFilterRowLayout.setVisible(false); + dateFilterRowLayout.setVisible(false); + }); + + parentLayout.addComponent(showMoreButton); + parentLayout.addComponent(showLessButton); + parentLayout.setComponentAlignment(showMoreButton, Alignment.TOP_RIGHT); + parentLayout.setComponentAlignment(showLessButton, Alignment.TOP_RIGHT); + parentLayout.setExpandRatio(showMoreButton, 1); + parentLayout.setExpandRatio(showLessButton, 1); + showLessButton.setVisible(false); + } + + @Override + public void enter(ViewChangeEvent event) { + grid.reload(); + } + + public void clearSelection() { + grid.getSelectionModel().reset(); + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardView.java index 384f5005547..1ac1f661246 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardView.java @@ -2,7 +2,6 @@ import java.util.Calendar; import java.util.Date; -import java.util.List; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.FontAwesome; @@ -13,7 +12,6 @@ import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.ComboBox; -import com.vaadin.ui.DateField; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.VerticalLayout; @@ -29,6 +27,7 @@ import de.symeda.sormas.ui.login.LoginHelper; import de.symeda.sormas.ui.utils.AbstractView; import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.EpiWeekAndDateFilterComponent; @SuppressWarnings("serial") public class DashboardView extends AbstractView { @@ -153,41 +152,10 @@ private HorizontalLayout createFilterBar() { ComboBox regionFilter = new ComboBox(); ComboBox districtFilter = new ComboBox(); ComboBox diseaseFilter = new ComboBox(); - ComboBox dateFilterOptionFilter = new ComboBox(); - DateField dateFromFilter = new DateField(); - DateField dateToFilter = new DateField(); - ComboBox weekFromFilter = new ComboBox(); - ComboBox weekToFilter = new ComboBox(); // 'Apply Filter' button Button applyButton = new Button(I18nProperties.getPrefixFieldCaption(I18N_PREFIX, APPLY)); CssStyles.style(applyButton, CssStyles.FORCE_CAPTION); - applyButton.addClickListener(new ClickListener() { - @Override - public void buttonClick(ClickEvent event) { - region = (RegionReferenceDto) regionFilter.getValue(); - dashboardDataProvider.setRegion(region); - district = (DistrictReferenceDto) districtFilter.getValue(); - dashboardDataProvider.setDistrict(district); - disease = (Disease) diseaseFilter.getValue(); - dashboardDataProvider.setDisease(disease); - dateFilterOption = (DateFilterOption) dateFilterOptionFilter.getValue(); - dashboardDataProvider.setDateFilterOption(dateFilterOption); - if (dateFilterOption == DateFilterOption.DATE) { - fromDate = dateFromFilter.getValue(); - dashboardDataProvider.setFromDate(fromDate); - toDate = dateToFilter.getValue(); - dashboardDataProvider.setToDate(toDate); - } else { - fromWeek = (EpiWeek) weekFromFilter.getValue(); - dashboardDataProvider.setFromWeek(fromWeek); - toWeek = (EpiWeek) weekToFilter.getValue(); - dashboardDataProvider.setToWeek(toWeek); - } - applyButton.removeStyleName(ValoTheme.BUTTON_PRIMARY); - refreshDashboard(); - } - }); // Region filter if (LoginHelper.getCurrentUser().getRegion() == null) { @@ -230,85 +198,53 @@ public void buttonClick(ClickEvent event) { Calendar c = Calendar.getInstance(); c.setTime(new Date()); - // Date filter options - dateFilterOptionFilter.setWidth(200, Unit.PIXELS); - CssStyles.style(dateFilterOptionFilter, CssStyles.FORCE_CAPTION); - dateFilterOptionFilter.addItems((Object[])DateFilterOption.values()); - dateFilterOptionFilter.setNullSelectionAllowed(false); - dateFilterOptionFilter.select(DateFilterOption.EPI_WEEK); - dateFilterOptionFilter.addValueChangeListener(e -> { - if (e.getProperty().getValue() == DateFilterOption.DATE) { - filterLayout.removeComponent(weekFromFilter); - filterLayout.removeComponent(weekToFilter); - filterLayout.addComponent(dateFromFilter, filterLayout.getComponentIndex(dateFilterOptionFilter) + 1); - dateFromFilter.setValue(DateHelper.subtractDays(c.getTime(), 7)); - filterLayout.addComponent(dateToFilter, filterLayout.getComponentIndex(dateFromFilter) + 1); - dateToFilter.setValue(c.getTime()); - } else { - filterLayout.removeComponent(dateFromFilter); - filterLayout.removeComponent(dateToFilter); - filterLayout.addComponent(weekFromFilter, filterLayout.getComponentIndex(dateFilterOptionFilter) + 1); - weekFromFilter.setValue(DateHelper.getEpiWeek(c.getTime())); - filterLayout.addComponent(weekToFilter, filterLayout.getComponentIndex(weekFromFilter) + 1); - weekToFilter.setValue(DateHelper.getEpiWeek(c.getTime())); - } - }); - filterLayout.addComponent(dateFilterOptionFilter); - dateFilterOption = (DateFilterOption) dateFilterOptionFilter.getValue(); + // Date & Epi Week filter + EpiWeekAndDateFilterComponent weekAndDateFilter = new EpiWeekAndDateFilterComponent(applyButton, true, true); + filterLayout.addComponent(weekAndDateFilter); + dateFilterOption = (DateFilterOption) weekAndDateFilter.getDateFilterOptionFilter().getValue(); dashboardDataProvider.setDateFilterOption(dateFilterOption); - - // Epi week filter - List epiWeekList = DateHelper.createEpiWeekList(c.get(Calendar.YEAR), c.get(Calendar.WEEK_OF_YEAR)); - - weekFromFilter.setWidth(200, Unit.PIXELS); - for (EpiWeek week : epiWeekList) { - weekFromFilter.addItem(week); - } - weekFromFilter.setNullSelectionAllowed(false); - weekFromFilter.setValue(DateHelper.getEpiWeek(c.getTime())); - weekFromFilter.setCaption(I18nProperties.getPrefixFieldCaption(I18N_PREFIX, FROM_WEEK)); - weekFromFilter.addValueChangeListener(e -> { - applyButton.addStyleName(ValoTheme.BUTTON_PRIMARY); - }); - filterLayout.addComponent(weekFromFilter); - dashboardDataProvider.setFromWeek((EpiWeek) weekFromFilter.getValue()); - - weekToFilter.setWidth(200, Unit.PIXELS); - for (EpiWeek week : epiWeekList) { - weekToFilter.addItem(week); - } - weekToFilter.setNullSelectionAllowed(false); - weekToFilter.setValue(DateHelper.getEpiWeek(c.getTime())); - weekToFilter.setCaption(I18nProperties.getPrefixFieldCaption(I18N_PREFIX, TO_WEEK)); - weekToFilter.addValueChangeListener(e -> { - applyButton.addStyleName(ValoTheme.BUTTON_PRIMARY); - }); - filterLayout.addComponent(weekToFilter); - dashboardDataProvider.setToWeek((EpiWeek) weekToFilter.getValue()); + fromWeek = (EpiWeek) weekAndDateFilter.getWeekFromFilter().getValue(); + dashboardDataProvider.setFromWeek(fromWeek); + toWeek = (EpiWeek) weekAndDateFilter.getWeekToFilter().getValue(); + dashboardDataProvider.setToWeek(toWeek); - // Date filter - dateFromFilter.setDateFormat(DateHelper.getShortDateFormat().toPattern()); - dateFromFilter.setWidth(200, Unit.PIXELS); - dateFromFilter.setCaption(I18nProperties.getPrefixFieldCaption(I18N_PREFIX, FROM_DATE)); - dateFromFilter.addValueChangeListener(e -> { - applyButton.addStyleName(ValoTheme.BUTTON_PRIMARY); - }); - - dateToFilter.setDateFormat(DateHelper.getShortDateFormat().toPattern()); - dateToFilter.setWidth(200, Unit.PIXELS); - dateToFilter.setCaption(I18nProperties.getPrefixFieldCaption(I18N_PREFIX, TO_DATE)); - dateToFilter.addValueChangeListener(e -> { - applyButton.addStyleName(ValoTheme.BUTTON_PRIMARY); - }); filterLayout.addComponent(applyButton); Label infoLabel = new Label(FontAwesome.INFO_CIRCLE.getHtml(), ContentMode.HTML); infoLabel.setSizeUndefined(); - infoLabel.setDescription("All Dashboard elements that display cases (the 'New Cases' statistics, the Epidemiological Curve and the Case Status Map) use the onset date of the first symptom for the date/epi week filter. If this date is not available, the date of report is used instead."); + infoLabel.setDescription("All Dashboard elements that display cases (the 'New Cases' statistics, the Epidemiological Curve and the Case Status Map) use the onset date of the first symptom for the date/epi week filter. If this date is not available, the reception date or date of report is used instead."); CssStyles.style(infoLabel, CssStyles.LABEL_XLARGE, CssStyles.LABEL_SECONDARY); filterLayout.addComponent(infoLabel); filterLayout.setComponentAlignment(infoLabel, Alignment.MIDDLE_RIGHT); + // Apply button listener + applyButton.addClickListener(new ClickListener() { + @Override + public void buttonClick(ClickEvent event) { + region = (RegionReferenceDto) regionFilter.getValue(); + dashboardDataProvider.setRegion(region); + district = (DistrictReferenceDto) districtFilter.getValue(); + dashboardDataProvider.setDistrict(district); + disease = (Disease) diseaseFilter.getValue(); + dashboardDataProvider.setDisease(disease); + dateFilterOption = (DateFilterOption) weekAndDateFilter.getDateFilterOptionFilter().getValue(); + dashboardDataProvider.setDateFilterOption(dateFilterOption); + if (dateFilterOption == DateFilterOption.DATE) { + fromDate = weekAndDateFilter.getDateFromFilter().getValue(); + dashboardDataProvider.setFromDate(fromDate); + toDate = weekAndDateFilter.getDateToFilter().getValue(); + dashboardDataProvider.setToDate(toDate); + } else { + fromWeek = (EpiWeek) weekAndDateFilter.getWeekFromFilter().getValue(); + dashboardDataProvider.setFromWeek(fromWeek); + toWeek = (EpiWeek) weekAndDateFilter.getWeekToFilter().getValue(); + dashboardDataProvider.setToWeek(toWeek); + } + applyButton.removeStyleName(ValoTheme.BUTTON_PRIMARY); + refreshDashboard(); + } + }); + return filterLayout; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/statistics/StatisticsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/statistics/StatisticsView.java index 302cc50c9b6..fa8096fd0e2 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/statistics/StatisticsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/statistics/StatisticsView.java @@ -2,7 +2,6 @@ import java.util.Calendar; import java.util.Date; -import java.util.List; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.FontAwesome; @@ -11,7 +10,6 @@ import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.ComboBox; -import com.vaadin.ui.DateField; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.VerticalLayout; @@ -26,6 +24,7 @@ import de.symeda.sormas.ui.dashboard.DateFilterOption; import de.symeda.sormas.ui.login.LoginHelper; import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.EpiWeekAndDateFilterComponent; public class StatisticsView extends AbstractStatisticsView { @@ -67,30 +66,10 @@ public HorizontalLayout createFilterBar() { ComboBox regionFilter = new ComboBox(); ComboBox districtFilter = new ComboBox(); ComboBox diseaseFilter = new ComboBox(); - ComboBox dateFilterOptionFilter = new ComboBox(); - DateField dateFromFilter = new DateField(); - DateField dateToFilter = new DateField(); - ComboBox weekFromFilter = new ComboBox(); - ComboBox weekToFilter = new ComboBox(); // 'Apply Filter' button Button applyButton = new Button("Apply filters"); CssStyles.style(applyButton, CssStyles.FORCE_CAPTION); - applyButton.addClickListener(e -> { - region = (RegionReferenceDto) regionFilter.getValue(); - district = (DistrictReferenceDto) districtFilter.getValue(); - disease = (Disease) diseaseFilter.getValue(); - DateFilterOption dateFilterOption = (DateFilterOption) dateFilterOptionFilter.getValue(); - if (dateFilterOption == DateFilterOption.DATE) { - fromDate = dateFromFilter.getValue(); - toDate = dateToFilter.getValue(); - } else { - fromDate = DateHelper.getEpiWeekStart((EpiWeek) weekFromFilter.getValue()); - toDate = DateHelper.getEpiWeekEnd((EpiWeek) weekToFilter.getValue()); - } - applyButton.removeStyleName(ValoTheme.BUTTON_PRIMARY); - refreshStatistics(); - }); // Region/District filter if (LoginHelper.getCurrentUser().getRegion() == null) { @@ -128,83 +107,35 @@ public HorizontalLayout createFilterBar() { Calendar c = Calendar.getInstance(); c.setTime(new Date()); - // Date filter options - dateFilterOptionFilter.setWidth(200, Unit.PIXELS); - CssStyles.style(dateFilterOptionFilter, CssStyles.FORCE_CAPTION); - dateFilterOptionFilter.addItems((Object[])DateFilterOption.values()); - dateFilterOptionFilter.setNullSelectionAllowed(false); - dateFilterOptionFilter.select(DateFilterOption.EPI_WEEK); - dateFilterOptionFilter.addValueChangeListener(e -> { - if (e.getProperty().getValue() == DateFilterOption.DATE) { - filterLayout.removeComponent(weekFromFilter); - filterLayout.removeComponent(weekToFilter); - filterLayout.addComponent(dateFromFilter, filterLayout.getComponentIndex(dateFilterOptionFilter) + 1); - dateFromFilter.setValue(DateHelper.subtractDays(c.getTime(), 7)); - filterLayout.addComponent(dateToFilter, filterLayout.getComponentIndex(dateFromFilter) + 1); - dateToFilter.setValue(c.getTime()); - } else { - filterLayout.removeComponent(dateFromFilter); - filterLayout.removeComponent(dateToFilter); - filterLayout.addComponent(weekFromFilter, filterLayout.getComponentIndex(dateFilterOptionFilter) + 1); - weekFromFilter.setValue(DateHelper.getEpiWeek(c.getTime())); - filterLayout.addComponent(weekToFilter, filterLayout.getComponentIndex(weekFromFilter) + 1); - weekToFilter.setValue(DateHelper.getEpiWeek(c.getTime())); - } - }); - filterLayout.addComponent(dateFilterOptionFilter); - - // Epi week filter - List epiWeekList = DateHelper.createEpiWeekList(c.get(Calendar.YEAR), c.get(Calendar.WEEK_OF_YEAR)); - - weekFromFilter.setWidth(200, Unit.PIXELS); - for (EpiWeek week : epiWeekList) { - weekFromFilter.addItem(week); - } - weekFromFilter.setNullSelectionAllowed(false); - weekFromFilter.setValue(DateHelper.getEpiWeek(c.getTime())); - weekFromFilter.setCaption("From Epi Week"); - weekFromFilter.addValueChangeListener(e -> { - applyButton.addStyleName(ValoTheme.BUTTON_PRIMARY); - }); - filterLayout.addComponent(weekFromFilter); - fromDate = DateHelper.getEpiWeekStart((EpiWeek) weekFromFilter.getValue()); - - weekToFilter.setWidth(200, Unit.PIXELS); - for (EpiWeek week : epiWeekList) { - weekToFilter.addItem(week); - } - weekToFilter.setNullSelectionAllowed(false); - weekToFilter.setValue(DateHelper.getEpiWeek(c.getTime())); - weekToFilter.setCaption("To Epi Week"); - weekToFilter.addValueChangeListener(e -> { - applyButton.addStyleName(ValoTheme.BUTTON_PRIMARY); - }); - filterLayout.addComponent(weekToFilter); - toDate = DateHelper.getEpiWeekEnd((EpiWeek) weekToFilter.getValue()); - - // Date filter - dateFromFilter.setDateFormat(DateHelper.getShortDateFormat().toPattern()); - dateFromFilter.setWidth(200, Unit.PIXELS); - dateFromFilter.setCaption("From"); - dateFromFilter.addValueChangeListener(e -> { - applyButton.addStyleName(ValoTheme.BUTTON_PRIMARY); - }); - - dateToFilter.setDateFormat(DateHelper.getShortDateFormat().toPattern()); - dateToFilter.setWidth(200, Unit.PIXELS); - dateToFilter.setCaption("To"); - dateToFilter.addValueChangeListener(e -> { - applyButton.addStyleName(ValoTheme.BUTTON_PRIMARY); - }); + EpiWeekAndDateFilterComponent weekAndDateFilter = new EpiWeekAndDateFilterComponent(applyButton, true, true); + filterLayout.addComponent(weekAndDateFilter); + fromDate = DateHelper.getEpiWeekStart((EpiWeek) weekAndDateFilter.getWeekFromFilter().getValue()); + toDate = DateHelper.getEpiWeekEnd((EpiWeek) weekAndDateFilter.getWeekToFilter().getValue()); filterLayout.addComponent(applyButton); Label infoLabel = new Label(FontAwesome.INFO_CIRCLE.getHtml(), ContentMode.HTML); infoLabel.setSizeUndefined(); - infoLabel.setDescription("All Statistics elements use the onset date of the first symptom for the date/epi week filter. If this date is not available, the date of report is used instead."); + infoLabel.setDescription("All Statistics elements use the onset date of the first symptom for the date/epi week filter. If this date is not available, the reception date or date of report is used instead."); CssStyles.style(infoLabel, CssStyles.LABEL_XLARGE, CssStyles.LABEL_SECONDARY); filterLayout.addComponent(infoLabel); filterLayout.setComponentAlignment(infoLabel, Alignment.MIDDLE_RIGHT); - + + applyButton.addClickListener(e -> { + region = (RegionReferenceDto) regionFilter.getValue(); + district = (DistrictReferenceDto) districtFilter.getValue(); + disease = (Disease) diseaseFilter.getValue(); + DateFilterOption dateFilterOption = (DateFilterOption) weekAndDateFilter.getDateFilterOptionFilter().getValue(); + if (dateFilterOption == DateFilterOption.DATE) { + fromDate = weekAndDateFilter.getDateFromFilter().getValue(); + toDate = weekAndDateFilter.getDateToFilter().getValue(); + } else { + fromDate = DateHelper.getEpiWeekStart((EpiWeek) weekAndDateFilter.getWeekFromFilter().getValue()); + toDate = DateHelper.getEpiWeekEnd((EpiWeek) weekAndDateFilter.getWeekToFilter().getValue()); + } + applyButton.removeStyleName(ValoTheme.BUTTON_PRIMARY); + refreshStatistics(); + }); + return filterLayout; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java index 410f55646a2..031e3264b7e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java @@ -55,6 +55,7 @@ public final class CssStyles { public static final String INDENT_LEFT_2 = "indent-left-2"; public static final String VAADIN_LABEL = "v-label"; + // Font colors public static final String LABEL_PRIMARY = "primary"; public static final String LABEL_SECONDARY = "secondary"; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/EpiWeekAndDateFilterComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/EpiWeekAndDateFilterComponent.java new file mode 100644 index 00000000000..9927c465a95 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/EpiWeekAndDateFilterComponent.java @@ -0,0 +1,160 @@ +package de.symeda.sormas.ui.utils; + +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import com.vaadin.ui.Button; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.PopupDateField; +import com.vaadin.ui.themes.ValoTheme; + +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.utils.EpiWeek; +import de.symeda.sormas.ui.dashboard.DateFilterOption; + +public class EpiWeekAndDateFilterComponent extends HorizontalLayout { + + private static final long serialVersionUID = 8752630393182185034L; + + private ComboBox dateFilterOptionFilter; + private ComboBox weekFromFilter; + private ComboBox weekToFilter; + private PopupDateField dateFromFilter; + private PopupDateField dateToFilter; + + public EpiWeekAndDateFilterComponent(Button applyButton, boolean fillAutomatically, boolean showCaption) { + setSpacing(true); + + Calendar c = Calendar.getInstance(); + c.setTime(new Date()); + + dateFilterOptionFilter = new ComboBox(); + weekFromFilter = new ComboBox(); + weekToFilter = new ComboBox(); + dateFromFilter = new PopupDateField(); + dateToFilter = new PopupDateField(); + + // Date filter options + dateFilterOptionFilter.setWidth(200, Unit.PIXELS); + dateFilterOptionFilter.addItems((Object[])DateFilterOption.values()); + dateFilterOptionFilter.setNullSelectionAllowed(false); + dateFilterOptionFilter.select(DateFilterOption.EPI_WEEK); + if (showCaption) { + CssStyles.style(dateFilterOptionFilter, CssStyles.FORCE_CAPTION); + } + + dateFilterOptionFilter.addValueChangeListener(e -> { + if (e.getProperty().getValue() == DateFilterOption.DATE) { + removeComponent(weekFromFilter); + removeComponent(weekToFilter); + addComponent(dateFromFilter, getComponentIndex(dateFilterOptionFilter) + 1); + addComponent(dateToFilter, getComponentIndex(dateFromFilter) + 1); + + if (fillAutomatically) { + dateFromFilter.setValue(DateHelper.subtractDays(c.getTime(), 7)); + } + if (fillAutomatically) { + dateToFilter.setValue(c.getTime()); + } + } else { + removeComponent(dateFromFilter); + removeComponent(dateToFilter); + addComponent(weekFromFilter, getComponentIndex(dateFilterOptionFilter) + 1); + addComponent(weekToFilter, getComponentIndex(weekFromFilter) + 1); + + if (fillAutomatically) { + weekFromFilter.setValue(DateHelper.getEpiWeek(c.getTime())); + } + if (fillAutomatically) { + weekToFilter.setValue(DateHelper.getEpiWeek(c.getTime())); + } + } + }); + addComponent(dateFilterOptionFilter); + + // Epi week filter + List epiWeekList = DateHelper.createEpiWeekList(c.get(Calendar.YEAR), c.get(Calendar.WEEK_OF_YEAR)); + + weekFromFilter.setWidth(200, Unit.PIXELS); + for (EpiWeek week : epiWeekList) { + weekFromFilter.addItem(week); + } + weekFromFilter.setNullSelectionAllowed(false); + if (fillAutomatically) { + weekFromFilter.setValue(DateHelper.getEpiWeek(c.getTime())); + } + if (showCaption) { + weekFromFilter.setCaption("From Epi Week"); + } + if (applyButton != null) { + weekFromFilter.addValueChangeListener(e -> { + applyButton.addStyleName(ValoTheme.BUTTON_PRIMARY); + }); + } + addComponent(weekFromFilter); + + weekToFilter.setWidth(200, Unit.PIXELS); + for (EpiWeek week : epiWeekList) { + weekToFilter.addItem(week); + } + weekToFilter.setNullSelectionAllowed(false); + if (fillAutomatically) { + weekToFilter.setValue(DateHelper.getEpiWeek(c.getTime())); + } + if (showCaption) { + weekToFilter.setCaption("To Epi Week"); + } + if (applyButton != null) { + weekToFilter.addValueChangeListener(e -> { + applyButton.addStyleName(ValoTheme.BUTTON_PRIMARY); + }); + } + addComponent(weekToFilter); + + // Date filter + dateFromFilter.setDateFormat(DateHelper.getShortDateFormat().toPattern()); + dateFromFilter.setWidth(200, Unit.PIXELS); + if (showCaption) { + dateFromFilter.setCaption("From"); + } + if (applyButton != null) { + dateFromFilter.addValueChangeListener(e -> { + applyButton.addStyleName(ValoTheme.BUTTON_PRIMARY); + }); + } + + dateToFilter.setDateFormat(DateHelper.getShortDateFormat().toPattern()); + dateToFilter.setWidth(200, Unit.PIXELS); + if (showCaption) { + dateToFilter.setCaption("To"); + } + if (applyButton != null) { + dateToFilter.addValueChangeListener(e -> { + applyButton.addStyleName(ValoTheme.BUTTON_PRIMARY); + }); + } + } + + public ComboBox getDateFilterOptionFilter() { + return dateFilterOptionFilter; + } + + public ComboBox getWeekFromFilter() { + return weekFromFilter; + } + + public ComboBox getWeekToFilter() { + return weekToFilter; + } + + public PopupDateField getDateFromFilter() { + return dateFromFilter; + } + + public PopupDateField getDateToFilter() { + return dateToFilter; + } + +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/VaadinUiUtil.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/VaadinUiUtil.java index 769971bbf08..ef06237eb81 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/VaadinUiUtil.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/VaadinUiUtil.java @@ -109,9 +109,9 @@ public Class getType() { public static Window showConfirmationPopup(String caption, String description, Consumer resultConsumer) { return showConfirmationPopup(caption, description, "Confirm", "Cancel", resultConsumer); } - + public static Window showConfirmationPopup(String caption, String description, String confirmCaption, String cancelCaption, Consumer resultConsumer) { - + Window popupWindow = VaadinUiUtil.createPopupWindow(); popupWindow.setWidth(400, Unit.PIXELS); popupWindow.setCaption(caption); @@ -155,4 +155,5 @@ public void windowClose(CloseEvent e) { UI.getCurrent().addWindow(popupWindow); return popupWindow; } + } From fbbbf9f2d76aeb82ff2a2aa4610fcffca8d786ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 21 Mar 2018 07:55:29 +0100 Subject: [PATCH 13/16] #527 - changed CFR calculation, added info icon #528 - increased incubation period of Lassa to 21 days --- .../java/de/symeda/sormas/api/DiseaseHelper.java | 2 +- .../sormas/ui/dashboard/StatisticsComponent.java | 15 ++++++++++----- .../java/de/symeda/sormas/ui/utils/CssStyles.java | 2 ++ .../main/webapp/VAADIN/themes/sormas/global.scss | 4 ++++ .../VAADIN/themes/sormas/views/dashboard.scss | 5 +++++ 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/DiseaseHelper.java b/sormas-api/src/main/java/de/symeda/sormas/api/DiseaseHelper.java index 8304116fb5e..7a3d95b972e 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/DiseaseHelper.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/DiseaseHelper.java @@ -43,6 +43,7 @@ public static int getIncubationPeriodDays(Disease disease, PlagueType plagueType case EVD: case MEASLES: case MONKEYPOX: + case LASSA: case OTHER: return 21; case AVIAN_INFLUENCA: @@ -53,7 +54,6 @@ public static int getIncubationPeriodDays(Disease disease, PlagueType plagueType return 10; case PLAGUE: return 7; - case LASSA: case YELLOW_FEVER: return 6; case CHOLERA: diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/StatisticsComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/StatisticsComponent.java index 5c05a5a4ab2..36c77aa0f2f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/StatisticsComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/StatisticsComponent.java @@ -328,15 +328,20 @@ private void updateNewCasesComponent(int amountOfDisplayedDiseases) { newCasesComponent.addComponentToContent(caseInvestigationStatusDone); newCasesComponent.addComponentToContent(caseInvestigationStatusDiscarded); Label separator = new Label("
", ContentMode.HTML); -// separator.setWidth(100, Unit.PERCENTAGE); -// separator.setHeightUndefined(); -// CssStyles.style(separator, CssStyles.SEPARATOR_HORIZONTAL, CssStyles.VSPACE_4); newCasesComponent.addComponentToContent(separator); HorizontalLayout fatalityLayout = new HorizontalLayout(); fatalityLayout.setWidth(100, Unit.PERCENTAGE); VerticalLayout fatalityRateLayout = new VerticalLayout(); fatalityRateLayout.addComponent(caseFatalityRateLabel); - fatalityRateLayout.addComponent(caseFatalityRateCaption); + HorizontalLayout fatalityCaptionLayout = new HorizontalLayout(); + fatalityCaptionLayout.addComponent(caseFatalityRateCaption); + Label infoLabel = new Label(FontAwesome.INFO_CIRCLE.getHtml(), ContentMode.HTML); + infoLabel.setSizeUndefined(); + infoLabel.setDescription("The fatality rate is calculated based on the number of confirmed cases. Unconfirmed, suspect and probable cases are not taken into account."); + CssStyles.style(infoLabel, CssStyles.LABEL_LARGE, CssStyles.HSPACE_LEFT_4, CssStyles.NEGATIVE_VSPACE_TOP_5, CssStyles.LABEL_SECONDARY); + fatalityCaptionLayout.addComponent(infoLabel); + fatalityCaptionLayout.setComponentAlignment(infoLabel, Alignment.TOP_RIGHT); + fatalityRateLayout.addComponent(fatalityCaptionLayout); fatalityLayout.addComponent(fatalityRateLayout); fatalityLayout.addComponent(caseFatalities); newCasesComponent.addComponentToContent(fatalityLayout); @@ -380,7 +385,7 @@ private void updateNewCasesComponent(int amountOfDisplayedDiseases) { previousFatalitiesCount == 0 ? fatalitiesCount > 0 ? Float.MIN_VALUE : 0 : new BigDecimal(fatalitiesCount).subtract(new BigDecimal(previousFatalitiesCount)).divide(new BigDecimal(fatalitiesCount), 1, RoundingMode.HALF_UP).multiply(new BigDecimal(100)).floatValue(); float fatalityRate = fatalitiesCount == 0 ? 0 : newCasesCount == 0 ? 0 : - new BigDecimal(fatalitiesCount).multiply(new BigDecimal(100)).divide(new BigDecimal(newCasesCount), 1, RoundingMode.HALF_UP).floatValue(); + new BigDecimal(fatalitiesCount).multiply(new BigDecimal(100)).divide(new BigDecimal(confirmedCasesCount), 1, RoundingMode.HALF_UP).floatValue(); caseInvestigationStatusDone.update(investigatedCasesCount, investigatedCasesGrowth, true); caseInvestigationStatusDiscarded.update(discardedCasesCount, discardedCasesGrowth, false); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java index 031e3264b7e..21c1f87d561 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/CssStyles.java @@ -34,6 +34,8 @@ public final class CssStyles { public static final String VSPACE_TOP_5 = "vspace-top-5"; public static final String VSPACE_TOP_NONE = "vspace-top-none"; + public static final String NEGATIVE_VSPACE_TOP_5 = "negative-vspace-top-5"; + // Horizontal space public static final String HSPACE_LEFT_0 = "hspace-left-0"; public static final String HSPACE_LEFT_1 = "hspace-left-1"; diff --git a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/global.scss b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/global.scss index 0fbe5086707..287d5135fe2 100644 --- a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/global.scss +++ b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/global.scss @@ -101,6 +101,10 @@ margin-top: 0 !important; } + .negative-vspace-top-5 { + margin-top: -2px; + } + .hspace-left-0 { margin-left: 64px; } diff --git a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/views/dashboard.scss b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/views/dashboard.scss index aaf16e2a79b..7549cad707b 100644 --- a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/views/dashboard.scss +++ b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/views/dashboard.scss @@ -33,4 +33,9 @@ .googlemap gm-style { background-color: white; } + + hr { + margin-top: 0px; + margin-bottom: 0px; + } } \ No newline at end of file From a9d06b4f155435704c1720dec7eeaf06fc7186cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 21 Mar 2018 08:17:25 +0100 Subject: [PATCH 14/16] #512 - notifications stay open until user clicks them --- .../java/de/symeda/sormas/ui/caze/CaseImportLayout.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseImportLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseImportLayout.java index 5c3054a163a..372cf17a99d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseImportLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseImportLayout.java @@ -167,9 +167,13 @@ public void uploadSucceeded(SucceededEvent event) { try { String errorReportFilePath = FacadeProvider.getImportExportFacade().importCasesFromCsvFile(file.getPath(), LoginHelper.getCurrentUser().getUuid()); if (errorReportFilePath == null) { - new Notification("Import successful", "All cases have been imported. You can now close this window.", Type.HUMANIZED_MESSAGE, false).show(Page.getCurrent()); + Notification notification = new Notification("Import successful", "All cases have been imported. You can now close this window.", Type.HUMANIZED_MESSAGE, false); + notification.setDelayMsec(-1); + notification.show(Page.getCurrent()); } else { - new Notification("Import successful", "The import has been successful, but some of the cases could not be imported due to malformed data. Please download the error report below.", Type.WARNING_MESSAGE, false).show(Page.getCurrent()); + Notification notification = new Notification("Import successful", "The import has been successful, but some of the cases could not be imported due to malformed data. Please download the error report below.", Type.WARNING_MESSAGE, false); + notification.setDelayMsec(-1); + notification.show(Page.getCurrent()); StreamResource streamResource = DownloadUtil.createStreamResource(null, errorReportFilePath, "sormas_import_error_report.csv", "text/csv", "Error report not available", "The error report file is not available. Please contact an admin and tell them about this issue."); From d6551f7f7572a0f385b71e2445433fb7f0654383 Mon Sep 17 00:00:00 2001 From: jenkins Date: Wed, 21 Mar 2018 08:42:08 +0100 Subject: [PATCH 15/16] [GITFLOW]updating poms for 0.17.0 branch with snapshot versions --- sormas-backend/pom.xml | 3 +-- sormas-base/pom.xml | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 27393f2405e..f4afdf7af93 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -1,6 +1,5 @@ - + sormas-base de.symeda.sormas diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index d24c1ba2a5a..b537dac18f9 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -1,6 +1,5 @@ - + 4.0.0 de.symeda.sormas From 9c7efc4339a0e1d0a82cd82120e270c6c5ae67c2 Mon Sep 17 00:00:00 2001 From: jenkins Date: Wed, 21 Mar 2018 08:42:15 +0100 Subject: [PATCH 16/16] [GITFLOW]updating poms for branch'release-0.17.0' with non-snapshot versions --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/bundles.pom | 2 +- sormas-base/dependencies/gf-modules.pom | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index 82343a1f51d..06c2216f638 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 0.17.0-SNAPSHOT + 0.17.0 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 71c5313268f..308cf035fc2 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.17.0 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index f4afdf7af93..c785fdbf21a 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.17.0 ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/bundles.pom b/sormas-base/dependencies/bundles.pom index 36abefa6f78..bf73b548002 100644 --- a/sormas-base/dependencies/bundles.pom +++ b/sormas-base/dependencies/bundles.pom @@ -9,7 +9,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.17.0 ../ diff --git a/sormas-base/dependencies/gf-modules.pom b/sormas-base/dependencies/gf-modules.pom index 8465014a2d8..4141e7d6127 100644 --- a/sormas-base/dependencies/gf-modules.pom +++ b/sormas-base/dependencies/gf-modules.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.17.0 ../ diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index d8d7347cb11..19ad4b4a239 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.17.0 ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index b537dac18f9..fbd54d4cde3 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 0.17.0-SNAPSHOT + 0.17.0 3.0 diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 4f9d307818b..48d4c38c66b 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 0.17.0-SNAPSHOT + 0.17.0 ../sormas-base diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 23f59d0b89b..c9cb3b45926 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 0.17.0-SNAPSHOT + 0.17.0 ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 41ea6cb63bb..7b0136241c8 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.17.0 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 16f2848bc8a..c2d26899755 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 0.17.0-SNAPSHOT + 0.17.0 ../sormas-base 4.0.0