From f041ee71381bbe6841c7bedf8dd572ee7b00f235 Mon Sep 17 00:00:00 2001 From: NORTH Date: Tue, 16 Nov 2021 10:31:08 +0000 Subject: [PATCH 01/71] #12880 - Working on the card, disease grid table layout... --- .../de/symeda/sormas/api/FacadeProvider.java | 7 +- .../symeda/sormas/api/caze/CaseCriteria.java | 32 + .../de/symeda/sormas/api/caze/CaseFacade.java | 12 +- .../sormas/api/caze/NewCaseDateType.java | 2 +- .../api/dashboard/DashboardCaseDto.java | 24 + .../sormas/api/disease/DiseaseBurdenDto.java | 128 ++++ .../sormas/api/disease/DiseaseFacade.java | 68 +++ .../sormas/api/event/EventCriteria.java | 20 +- .../de/symeda/sormas/api/i18n/Captions.java | 2 + .../sormas/api/person/PersonFacade.java | 4 + .../sormas/api/sample/SampleFacade.java | 3 + .../src/main/resources/captions.properties | 6 +- .../src/main/resources/strings.properties | 3 +- .../sormas/backend/caze/CaseFacadeEjb.java | 141 +++++ .../sormas/backend/caze/CaseService.java | 559 ++++++++++++++---- .../backend/caze/CaseUserFilterCriteria.java | 12 + .../backend/contact/ContactService.java | 101 +++- .../backend/disease/DiseaseFacadeEjb.java | 201 +++++++ .../event/EventParticipantService.java | 7 + .../backend/person/PersonFacadeEjb.java | 73 ++- .../backend/sample/SampleFacadeEjb.java | 5 + .../sormas/backend/sample/SampleService.java | 179 ++++-- .../de/symeda/sormas/backend/user/User.java | 5 +- .../symeda/sormas/backend/user/UserRole.java | 2 +- .../AbstractDashboardDataProvider.java | 9 + .../ui/dashboard/AbstractDashboardView.java | 113 +++- .../ui/dashboard/DashboardController.java | 8 + .../ui/dashboard/DashboardDataProvider.java | 57 +- .../sormas/ui/dashboard/DashboardType.java | 2 + .../components/DashboardFilterLayout.java | 76 ++- .../DiseaseDetailsComponent.java | 276 +++++++++ .../diseasedetails/DiseaseDetailsView.java | 62 ++ .../DiseaseDetailsViewLayout.java | 128 ++++ .../dashboard/sample/SampleDashboardView.java | 2 +- .../SurveillanceDashboardView.java | 2 +- .../disease/tile/DiseaseTileComponent.java | 121 +++- .../tile/RegionalDiseaseBurdenGrid.java | 151 +++++ 37 files changed, 2352 insertions(+), 251 deletions(-) create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java 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 a167261f297..60d731a75f3 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 @@ -41,6 +41,7 @@ import de.symeda.sormas.api.dashboard.sample.SampleDashboardFacade; import de.symeda.sormas.api.deletionconfiguration.DeletionConfigurationFacade; import de.symeda.sormas.api.disease.DiseaseConfigurationFacade; +import de.symeda.sormas.api.disease.DiseaseFacade; import de.symeda.sormas.api.docgeneneration.DocumentTemplateFacade; import de.symeda.sormas.api.docgeneneration.EventDocumentFacade; import de.symeda.sormas.api.docgeneneration.QuarantineOrderFacade; @@ -524,7 +525,11 @@ public static ManualMessageLogFacade getManualMessageLogFacade() { return get().lookupEjbRemote(ManualMessageLogFacade.class); } - @SuppressWarnings("unchecked") + public static DiseaseFacade getDiseaseFacade() { + return get().lookupEjbRemote(DiseaseFacade.class); + } + + @SuppressWarnings("unchecked") public

P lookupEjbRemote(Class

clazz) { try { return (P) get().ic.lookup(buildJndiLookupName(clazz)); 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 57c169db7c9..001bc767852 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 @@ -155,6 +155,10 @@ public class CaseCriteria extends CriteriaWithDateType implements ExternalShareC * Used for filtering merge-able cases to filter both lead and similar cases. */ private Set caseUuidsForMerge; + private String nameUuidEpidNumberLike; + + private Boolean deleted = Boolean.FALSE; + public Boolean excludeSharedCases; public CaseCriteria() { super(NewCaseDateType.class); @@ -793,4 +797,32 @@ public CaseCriteria caseUuidsForMerge(Set caseUuidsForMerge) { return this; } + + public void setNameUuidEpidNumberLike(String nameUuidEpidNumberLike) { + this.nameUuidEpidNumberLike = nameUuidEpidNumberLike; + } + + @IgnoreForUrl + public String getNameUuidEpidNumberLike() { + return nameUuidEpidNumberLike; + } + + public CaseCriteria deleted(Boolean deleted) { + this.deleted = deleted; + return this; + } + + @IgnoreForUrl + public Boolean getDeleted() { + return deleted; + } + + + public Boolean getExcludeSharedCases() { + return excludeSharedCases; + } + + public void setExcludeSharedCases(Boolean excludeSharedCases) { + this.excludeSharedCases = excludeSharedCases; + } } 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 298587e6997..3e4daf17c51 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 @@ -18,10 +18,7 @@ package de.symeda.sormas.api.caze; import java.math.BigDecimal; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Random; +import java.util.*; import javax.ejb.Remote; import javax.validation.Valid; @@ -40,6 +37,7 @@ import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.contact.ContactReferenceDto; +import de.symeda.sormas.api.dashboard.DashboardCaseDto; import de.symeda.sormas.api.event.EventParticipantReferenceDto; import de.symeda.sormas.api.externaldata.ExternalDataDto; import de.symeda.sormas.api.externaldata.ExternalDataUpdateException; @@ -231,4 +229,10 @@ List saveBulkEditWithFacilities( boolean hasOtherValidVaccination(CaseDataDto caze, String vaccinationUuid); Pair getRegionAndDistrictRefsOf(CaseReferenceDto caze); + + List getCasesForDashboard(CaseCriteria caseCriteria); + + String getLastReportedDistrictName(CaseCriteria caseCriteria, boolean b, boolean b1); + + Map getCaseCountByDisease(CaseCriteria caseCriteria, boolean excludeSharedCases, boolean excludeCasesFromContacts); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/NewCaseDateType.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/NewCaseDateType.java index 477ff198be2..3c316eda2b2 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/NewCaseDateType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/NewCaseDateType.java @@ -30,7 +30,7 @@ public enum NewCaseDateType MOST_RELEVANT, ONSET, - REPORT; + REPORT, CLASSIFICATION, CREATION, INVESTIGATION; @Override public String toString() { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java index 24012d904ab..cb0c259e646 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java @@ -19,6 +19,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseReferenceDefinition; +import de.symeda.sormas.api.caze.InvestigationStatus; import de.symeda.sormas.api.person.PresentCondition; import de.symeda.sormas.api.uuid.AbstractUuidDto; @@ -27,6 +28,8 @@ public class DashboardCaseDto extends AbstractUuidDto { private static final long serialVersionUID = -5705128377788207648L; public static final String I18N_PREFIX = "CaseData"; + private Date onsetDate; + private InvestigationStatus investigationStatus; private long id; private Date reportDate; @@ -60,6 +63,27 @@ public DashboardCaseDto( this.caseReferenceDefinition = caseReferenceDefinition; } + public DashboardCaseDto( + long id, + String uuid, + Date reportDate, + Date onsetDate, + CaseClassification caseClassification, + Disease disease, + InvestigationStatus investigationStatus, + PresentCondition casePersonCondition, + Disease causeOfDeathDisease) { + super(uuid); + + this.id = id; + this.reportDate = reportDate; + this.onsetDate = onsetDate; + this.caseClassification = caseClassification; + this.disease = disease; + this.investigationStatus = investigationStatus; + this.casePersonCondition = casePersonCondition; + this.causeOfDeathDisease = causeOfDeathDisease; + } public long getId() { return id; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java index 0e6ad2f6ed1..be03d1712f9 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java @@ -20,6 +20,7 @@ import java.io.Serializable; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.infrastructure.region.RegionDto; public class DiseaseBurdenDto implements Serializable { @@ -38,6 +39,12 @@ public class DiseaseBurdenDto implements Serializable { public static final String CASE_FATALITY_RATE = "caseFatalityRate"; public static final String LAST_REPORTED_DISTRICT_NAME = "lastReportedDistrictName"; + //Regional specific Disease Details + public static final String CASES_REGION = "region"; + public static final String CASES_ACTIVE_CASE = "caseActiveCases"; + public static final String CASES_RECOVERED_CASES = "caseRecoveredCase"; + public static final String CASES_DEATH_CASES = "caseDeathCase"; + private Disease disease; private Long caseCount; private Long previousCaseCount; @@ -46,6 +53,71 @@ public class DiseaseBurdenDto implements Serializable { private Long caseDeathCount; private String lastReportedDistrictName; + private Integer cfr; + private String lastReportedDistrict; + private String outbreakDistrict; + private Integer death; + + private RegionDto region; + private Long caseRecoveredCase; + private Long caseActiveCases; + + public DiseaseBurdenDto( + Disease disease, + Long caseCount, + Long previousCaseCount, + Long eventCount, + Long outbreakDistrictCount, + Long caseDeathCount, + String lastReportedDistrictName, + Integer cfr, + String lastReportedDistrict, + String outbreakDistrict, + Integer death) { + + this.disease = disease; + this.caseCount = caseCount; + this.previousCaseCount = previousCaseCount; + this.eventCount = eventCount; + this.outbreakDistrictCount = outbreakDistrictCount; + this.caseDeathCount = caseDeathCount; + this.lastReportedDistrictName = lastReportedDistrictName; + + this.cfr = cfr; + this.lastReportedDistrict = lastReportedDistrict; + this.outbreakDistrict = outbreakDistrict; + this.death = death; + } + + public DiseaseBurdenDto( + RegionDto regionDto, + Disease disease, + Long caseCount, + Long previousCaseCount, + Long eventCount, + Long outbreakDistrictCount, + Long caseDeathCount, + String lastReportedDistrictName, + Integer cfr, + String lastReportedDistrict, + String outbreakDistrict, + Integer death) { + + this.region = regionDto; + this.disease = disease; + this.caseCount = caseCount; + this.previousCaseCount = previousCaseCount; + this.eventCount = eventCount; + this.outbreakDistrictCount = outbreakDistrictCount; + this.caseDeathCount = caseDeathCount; + this.lastReportedDistrictName = lastReportedDistrictName; + + this.cfr = cfr; + this.lastReportedDistrict = lastReportedDistrict; + this.outbreakDistrict = outbreakDistrict; + this.death = death; + } + public DiseaseBurdenDto( Disease disease, Long caseCount, @@ -147,4 +219,60 @@ public void setLastReportedDistrictName(String name) { public Boolean hasCount() { return (caseCount + previousCaseCount + eventCount + outbreakDistrictCount) > 0; } + + public Integer getCfr() { + return cfr; + } + + public void setCfr(Integer cfr) { + this.cfr = cfr; + } + + public String getLastReportedDistrict() { + return lastReportedDistrict; + } + + public void setLastReportedDistrict(String lastReportedDistrict) { + this.lastReportedDistrict = lastReportedDistrict; + } + + public String getOutbreakDistrict() { + return outbreakDistrict; + } + + public void setOutbreakDistrict(String outbreakDistrict) { + this.outbreakDistrict = outbreakDistrict; + } + + public Integer getDeath() { + return death; + } + + public void setDeath(Integer death) { + this.death = death; + } + + public RegionDto getRegion() { + return region; + } + + public void setRegion(RegionDto region) { + this.region = region; + } + + public Long getCaseRecoveredCase() { + return caseRecoveredCase; + } + + public void setCaseRecoveredCase(Long caseRecoveredCase) { + this.caseRecoveredCase = caseRecoveredCase; + } + + public Long getCaseActiveCases() { + return caseActiveCases; + } + + public void setCaseActiveCases(Long caseActiveCases) { + this.caseActiveCases = caseActiveCases; + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java new file mode 100644 index 00000000000..8f423d6dffb --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *******************************************************************************/ +package de.symeda.sormas.api.disease; + +import java.util.Date; +import java.util.List; + +import javax.ejb.Remote; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; + + +@Remote +public interface DiseaseFacade { + + List getDiseaseBurdenForDashboard( + RegionReferenceDto regionRef, + DistrictReferenceDto districtRef, + Date from, + Date to, + Date previousFromDate, + Date previousToDate); + +// DiseaseBurdenDto diseaseForDashboard( +// RegionReferenceDto regionRef, +// DistrictReferenceDto districtRef, +// Disease disease, +// Date from, +// Date to, +// Date previousFromDate, +// Date previousToDate); + + DiseaseBurdenDto getDiseaseForDashboard( + RegionReferenceDto regionRef, + DistrictReferenceDto districtRef, + Disease disease, + Date from, + Date to, + Date previousFromDate, + Date previousToDate); + // + DiseaseBurdenDto getDiseaseGridForDashboard( + RegionReferenceDto regionRef, + DistrictReferenceDto districtRef, + Disease disease, + Date from, + Date to, + Date previousFromDate, + Date previousToDate); + +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventCriteria.java index 3bfb417870b..2f1d13d890a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventCriteria.java @@ -110,7 +110,8 @@ public class EventCriteria extends CriteriaWithDateType implements ExternalShare private Boolean onlyEntitiesNotSharedWithExternalSurvTool; private Boolean onlyEntitiesSharedWithExternalSurvTool; private Boolean onlyEntitiesChangedSinceLastSharedWithExternalSurvTool; - + private Date reportedDateFrom; + private Date reportedDateTo; public EventCriteria() { super(EventCriteriaDateType.class); } @@ -567,7 +568,14 @@ public DateFilterOption getActionDateFilterOption() { return actionDateFilterOption; } - public enum DateType { + public EventCriteria reportedBetween(Date reportedDateFrom, Date reportedDateTo) { + + this.reportedDateFrom = reportedDateFrom; + this.reportedDateTo = reportedDateTo; + return this; + } + + public enum DateType { EVENT, EVENT_SIGNAL_EVOLUTION, ACTION_CHANGE, @@ -707,4 +715,12 @@ public Boolean getOnlyEntitiesChangedSinceLastSharedWithExternalSurvTool() { public void setOnlyEntitiesChangedSinceLastSharedWithExternalSurvTool(Boolean onlyEntitiesChangedSinceLastSharedWithExternalSurvTool) { this.onlyEntitiesChangedSinceLastSharedWithExternalSurvTool = onlyEntitiesChangedSinceLastSharedWithExternalSurvTool; } + + public Date getReportedDateFrom() { + return reportedDateFrom; + } + + public Date getReportedDateTo() { + return reportedDateTo; + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java index d5ef293848c..749f8e43d68 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java @@ -2832,4 +2832,6 @@ public interface Captions { String WeeklyReportRegionSummary_region = "WeeklyReportRegionSummary.region"; String weeklyReportsInDistrict = "weeklyReportsInDistrict"; String years = "years"; + String dashboardLastReportedDistrict = "dashboardLastReportedDistrict"; + } 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 cabe7120b12..f8f236bd853 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 @@ -16,6 +16,7 @@ import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Set; import javax.ejb.Remote; @@ -26,6 +27,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EditPermissionFacade; import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.CaseCriteria; import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.externaldata.ExternalDataDto; import de.symeda.sormas.api.externaldata.ExternalDataUpdateException; @@ -97,4 +99,6 @@ void mergePerson( boolean isEnrolledInExternalJournal(String uuid); void copyHomeAddress(PersonReferenceDto source, PersonReferenceDto target); + + Map getDeathCountByDisease(CaseCriteria caseCriteria, boolean excludeSharedCases, boolean excludeCasesFromContacts); } 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 59c3efd5fd1..6db5218c9ba 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 @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.Date; import java.util.List; +import java.util.Map; import javax.ejb.Remote; import javax.validation.Valid; @@ -90,4 +91,6 @@ public interface SampleFacade extends DeletableFacade { Date getEarliestPositiveSampleDate(String contactUuid); List getAssociatedDiseaseVariants(String sampleUuid); + + Map getNewTestResultCountByResultType(List collect); } diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index 151ef53d2f0..1658b19e9b3 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -408,6 +408,9 @@ caseCreateNew=Create new case caseDataEnterHomeAddressNow=Enter home address of the case person now caseCancelDeletion=Cancel case deletion caseJurisdictionType=Jurisdiction type +caseDeathCase=Deaths +caseRecoveredCase=Recovered Cases + CaseData=Case CaseData.ageAndBirthDate=Age and birth date CaseData.additionalDetails=General comment @@ -2922,4 +2925,5 @@ ExternalEmailOptions.attachedDocuments=Attach document(s) externalEmailUsedTemplate=Template externalEmailSentBy=Sent by externalEmailSentTo=Sent to -externalEmailAttachedDocuments=Attached documents \ No newline at end of file +externalEmailAttachedDocuments=Attached documents +dashboardLastReportedDistrict=Last reported district diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 6188641d36f..c9c7900c7b7 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -98,7 +98,8 @@ classificationCriteriaForTestType = for test type classificationCriteriaForExposureType = for exposure type classificationDaysBeforeCaseStart = days before symptom onset/case report date classificationEventCluster = Case linked to a cluster event -classificationForDisease = for +#classificationForDisease = for +classificationForDisease = Disease details classificationGeneratedFor = Generated for SORMAS classificationInfoText = ... when the case meets the following requirements:
classificationInfoNumberText = ... when the case meets %s of the following requirements:
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 26983a1d7fe..3b552f714b4 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 @@ -56,6 +56,7 @@ import javax.ejb.TransactionAttributeType; import javax.enterprise.concurrent.ManagedScheduledExecutorService; import javax.inject.Inject; +import javax.persistence.NoResultException; import javax.persistence.Tuple; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; @@ -74,6 +75,7 @@ import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import de.symeda.sormas.api.dashboard.DashboardCaseDto; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -4397,7 +4399,45 @@ public List getDuplicates(@Valid CasePersonDto casePerson, int re personFacade.getByUuid((String) casePersonUuids[1]))) .collect(Collectors.toList()); } + @Override + public List getCasesForDashboard(CaseCriteria caseCriteria) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(DashboardCaseDto.class); + Root caze = cq.from(Case.class); + Join symptoms = caze.join(Case.SYMPTOMS, JoinType.LEFT); + Join person = caze.join(Case.PERSON, JoinType.LEFT); + + Predicate filter = + caseService.createUserFilter(cb, cq, caze, new CaseUserFilterCriteria().excludeSharedCases(true).excludeCasesFromContacts(true)); + Predicate criteriaFilter = caseService.createCriteriaFilter(caseCriteria, cb, cq, caze); + filter = and(cb, filter, criteriaFilter); + + if (filter != null) { + cq.where(filter); + } + List result; + if (filter != null) { + cq.where(filter); + cq.multiselect( + caze.get(Case.ID), + caze.get(Case.UUID), + caze.get(Case.REPORT_DATE), + symptoms.get(Symptoms.ONSET_DATE), + caze.get(Case.CASE_CLASSIFICATION), + caze.get(Case.DISEASE), + caze.get(Case.INVESTIGATION_STATUS), + person.get(Person.PRESENT_CONDITION), + person.get(Person.CAUSE_OF_DEATH_DISEASE)); + + result = em.createQuery(cq).getResultList(); + } else { + result = Collections.emptyList(); + } + + return result; + } @Override public List getDuplicatesWithPathogenTest(@Valid PersonReferenceDto personReferenceDto, PathogenTestDto pathogenTestDto) { CriteriaBuilder cb = em.getCriteriaBuilder(); @@ -4437,6 +4477,37 @@ public List getByExternalId(String externalId) { return toPseudonymizedDtos(service.getByExternalId(externalId)); } + @Override + public String getLastReportedDistrictName(CaseCriteria caseCriteria, boolean excludeSharedCases, boolean excludeCasesFromContacts) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(String.class); + Root caze = cq.from(Case.class); + Join district = caze.join(Case.DISTRICT, JoinType.LEFT); + + Predicate filter = caseService.createUserFilter( + cb, + cq, + caze, + new CaseUserFilterCriteria().excludeSharedCases(excludeSharedCases).excludeCasesFromContacts(excludeCasesFromContacts)); + + filter = and(cb, filter, caseService.createCriteriaFilter(caseCriteria, cb, cq, caze)); + + if (filter != null) { + cq.where(filter); + } + + cq.select(district.get(District.NAME)); + cq.orderBy(cb.desc(caze.get(Case.REPORT_DATE))); + + TypedQuery query = em.createQuery(cq).setMaxResults(1); + try { + return query.getSingleResult(); + } catch (NoResultException e) { + return ""; + } + } + @Override @RightsAllowed(UserRight._CASE_EDIT) public void updateExternalData(@Valid List externalData) throws ExternalDataUpdateException { @@ -4454,6 +4525,76 @@ public void updateSymptomsByVisit(Visit visit) { caseSave(cazeDto, true, visit.getCaze(), cazeDto, true, true); } + @Override + public Map getCaseCountByDisease(CaseCriteria caseCriteria, boolean excludeSharedCases, boolean excludeCasesFromContacts) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Object[].class); + Root caze = cq.from(Case.class); + + Predicate filter = caseService.createUserFilter( + cb, + cq, + caze, + new CaseUserFilterCriteria().excludeSharedCases(excludeSharedCases).excludeCasesFromContacts(excludeCasesFromContacts)); + + filter =and(cb, filter, caseService.createCriteriaFilter(caseCriteria, cb, cq, caze)); + + if (filter != null) { + cq.where(filter); + } + + cq.groupBy(caze.get(Case.DISEASE)); + cq.multiselect(caze.get(Case.DISEASE), cb.count(caze)); + List results = em.createQuery(cq).getResultList(); + + Map resultMap = results.stream().collect(Collectors.toMap(e -> (Disease) e[0], e -> (Long) e[1])); + + return resultMap; + } + + public Map getLastReportedDistrictByDisease( + CaseCriteria caseCriteria, + boolean excludeSharedCases, + boolean excludeCasesFromContacts) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Object[].class); + Root caze = cq.from(Case.class); + Join districtJoin = caze.join(Case.DISTRICT, JoinType.LEFT); + + Predicate filter = caseService.createUserFilter( + cb, + cq, + caze, + new CaseUserFilterCriteria().excludeSharedCases(excludeSharedCases).excludeCasesFromContacts(excludeCasesFromContacts)); + + filter = and(cb, filter, caseService.createCriteriaFilter(caseCriteria, cb, cq, caze)); + + if (filter != null) { + cq.where(filter); + } + + Expression maxReportDate = cb.max(caze.get(Case.REPORT_DATE)); + cq.multiselect(caze.get(Case.DISEASE), districtJoin, maxReportDate); + cq.groupBy(caze.get(Case.DISEASE), districtJoin); + cq.orderBy(cb.desc(maxReportDate)); + + List results = em.createQuery(cq).getResultList(); + + Map resultMap = new HashMap<>(); + for (Object[] e : results) { + Disease disease = (Disease) e[0]; + if (!resultMap.containsKey(disease)) { + District district = (District) e[1]; + resultMap.put(disease, district); + } + } + + return resultMap; + } + + @LocalBean @Stateless 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 9ebaf4ffbf6..eb692689f8b 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 @@ -55,6 +55,8 @@ import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import de.symeda.sormas.api.dashboard.DashboardCaseDto; +import de.symeda.sormas.api.user.DefaultUserRole; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -186,6 +188,9 @@ import de.symeda.sormas.backend.visit.Visit; import de.symeda.sormas.backend.visit.VisitFacadeEjb; +import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; +import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.or; + @Stateless @LocalBean public class CaseService extends AbstractCoreAdoService { @@ -265,7 +270,7 @@ public List findBy(CaseCriteria caseCriteria, boolean ignoreUserFilter) { Predicate filter = createCriteriaFilter(caseCriteria, caseQueryContext); if (!ignoreUserFilter) { - filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(caseQueryContext)); + filter = and(cb, filter, createUserFilter(caseQueryContext)); } if (filter != null) { @@ -283,7 +288,7 @@ protected Predicate createRelevantDataFilter(CriteriaBuilder cb, CriteriaQuery c Predicate filter = createActiveCasesFilter(cb, from); if (getCurrentUser() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, createUserFilterInternal(cb, cq, from)); + filter = and(cb, filter, createUserFilterInternal(cb, cq, from)); } return filter; @@ -312,13 +317,13 @@ public List getAllActiveUuids() { if (getCurrentUser() != null) { Predicate userFilter = createUserFilter(cb, cq, from); - filter = CriteriaBuilderHelper.and(cb, filter, userFilter); + filter = and(cb, filter, userFilter); } if (RequestContextHolder.isMobileSync()) { Predicate predicate = createLimitedChangeDateFilter(cb, from); if (predicate != null) { - filter = CriteriaBuilderHelper.and(cb, filter, predicate); + filter = and(cb, filter, predicate); } } @@ -404,25 +409,22 @@ private Predicate createMapCasesFilter( // Userfilter filter = - CriteriaBuilderHelper.and(cb, filter, createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true))); + and(cb, filter, createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true))); // Filter by date. The relevancefilter uses a special algorithm that should reflect the current situation. if (dateType == null) { - filter = CriteriaBuilderHelper.and(cb, filter, createCaseRelevanceFilter(caseQueryContext, from, to)); + filter = and(cb, filter, createCaseRelevanceFilter(caseQueryContext, from, to)); } else { - filter = CriteriaBuilderHelper - .and(cb, filter, createNewCaseFilter(caseQueryContext, DateHelper.getStartOfDay(from), DateHelper.getEndOfDay(to), dateType)); + filter = and(cb, filter, createNewCaseFilter(caseQueryContext, DateHelper.getStartOfDay(from), DateHelper.getEndOfDay(to), dateType)); } // only show cases which actually have GPS coordinates provided - Predicate personLatLonNotNull = CriteriaBuilderHelper - .and(cb, cb.isNotNull(joins.getPersonAddress().get(Location.LONGITUDE)), cb.isNotNull(joins.getPersonAddress().get(Location.LATITUDE))); + Predicate personLatLonNotNull = and(cb, cb.isNotNull(joins.getPersonAddress().get(Location.LONGITUDE)), cb.isNotNull(joins.getPersonAddress().get(Location.LATITUDE))); Predicate reportLatLonNotNull = - CriteriaBuilderHelper.and(cb, cb.isNotNull(root.get(Case.REPORT_LON)), cb.isNotNull(root.get(Case.REPORT_LAT))); - Predicate facilityLatLonNotNull = CriteriaBuilderHelper - .and(cb, cb.isNotNull(joins.getFacility().get(Facility.LONGITUDE)), cb.isNotNull(joins.getFacility().get(Facility.LATITUDE))); - Predicate latLonProvided = CriteriaBuilderHelper.or(cb, personLatLonNotNull, reportLatLonNotNull, facilityLatLonNotNull); - filter = CriteriaBuilderHelper.and(cb, filter, latLonProvided); + and(cb, cb.isNotNull(root.get(Case.REPORT_LON)), cb.isNotNull(root.get(Case.REPORT_LAT))); + Predicate facilityLatLonNotNull = and(cb, cb.isNotNull(joins.getFacility().get(Facility.LONGITUDE)), cb.isNotNull(joins.getFacility().get(Facility.LATITUDE))); + Predicate latLonProvided = or(cb, personLatLonNotNull, reportLatLonNotNull, facilityLatLonNotNull); + filter = and(cb, filter, latLonProvided); if (region != null) { Predicate regionFilter = cb.equal(root.get(Case.REGION), region); @@ -502,10 +504,10 @@ public String getUuidByUuidEpidNumberOrExternalId(String searchTerm, CaseCriteri final CaseQueryContext caseQueryContext = new CaseQueryContext(cb, cq, root); filter = createCriteriaFilter(caseCriteria, caseQueryContext); // Userfilter - filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(caseQueryContext, new CaseUserFilterCriteria())); + filter = and(cb, filter, createUserFilter(caseQueryContext, new CaseUserFilterCriteria())); } - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, cb.or( @@ -675,94 +677,90 @@ public Predicate createCriteriaFilter(CaseCrite Predicate filter = null; if (caseCriteria.getReportingUserRole() != null) { Join rolesJoin = joins.getReportingUser().join(User.USER_ROLES, JoinType.LEFT); - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(rolesJoin.get(UserRole.UUID), caseCriteria.getReportingUserRole().getUuid())); + filter = and(cb, filter, cb.equal(rolesJoin.get(UserRole.UUID), caseCriteria.getReportingUserRole().getUuid())); } if (caseCriteria.getDisease() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.DISEASE), caseCriteria.getDisease())); + filter = and(cb, filter, cb.equal(from.get(Case.DISEASE), caseCriteria.getDisease())); } if (caseCriteria.getDiseaseVariant() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.DISEASE_VARIANT), caseCriteria.getDiseaseVariant())); + filter = and(cb, filter, cb.equal(from.get(Case.DISEASE_VARIANT), caseCriteria.getDiseaseVariant())); } if (caseCriteria.getOutcome() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.OUTCOME), caseCriteria.getOutcome())); + filter = and(cb, filter, cb.equal(from.get(Case.OUTCOME), caseCriteria.getOutcome())); } if (caseCriteria.getRegion() != null) { - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, CaseCriteriaHelper.createRegionCriteriaFilter(cb, joins, caseCriteria.getRegion(), caseCriteria.getJurisdictionType())); } if (caseCriteria.getDistrict() != null) { - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, CaseCriteriaHelper.createDistrictCriteriaFilter(cb, joins, caseCriteria.getDistrict(), caseCriteria.getJurisdictionType())); } if (caseCriteria.getCommunity() != null) { - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, CaseCriteriaHelper.createCommunityCriteriaFilter(cb, joins, caseCriteria.getCommunity(), caseCriteria.getJurisdictionType())); } if (caseCriteria.getFollowUpStatus() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.FOLLOW_UP_STATUS), caseCriteria.getFollowUpStatus())); + filter = and(cb, filter, cb.equal(from.get(Case.FOLLOW_UP_STATUS), caseCriteria.getFollowUpStatus())); } if (caseCriteria.getFollowUpUntilFrom() != null && caseCriteria.getFollowUpUntilTo() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.between(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilFrom(), caseCriteria.getFollowUpUntilTo())); + filter = and(cb, filter, cb.between(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilFrom(), caseCriteria.getFollowUpUntilTo())); } else if (caseCriteria.getFollowUpUntilFrom() != null) { filter = - CriteriaBuilderHelper.and(cb, filter, cb.greaterThanOrEqualTo(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilFrom())); + and(cb, filter, cb.greaterThanOrEqualTo(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilFrom())); } else if (caseCriteria.getFollowUpUntilTo() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.lessThanOrEqualTo(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilTo())); + filter = and(cb, filter, cb.lessThanOrEqualTo(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilTo())); } if (caseCriteria.getSymptomJournalStatus() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.equal(joins.getPerson().get(Person.SYMPTOM_JOURNAL_STATUS), caseCriteria.getSymptomJournalStatus())); + filter = and(cb, filter, cb.equal(joins.getPerson().get(Person.SYMPTOM_JOURNAL_STATUS), caseCriteria.getSymptomJournalStatus())); } if (caseCriteria.getVaccinationStatus() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.VACCINATION_STATUS), caseCriteria.getVaccinationStatus())); + filter = and(cb, filter, cb.equal(from.get(Case.VACCINATION_STATUS), caseCriteria.getVaccinationStatus())); } if (caseCriteria.getReinfectionStatus() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.REINFECTION_STATUS), caseCriteria.getReinfectionStatus())); + filter = and(cb, filter, cb.equal(from.get(Case.REINFECTION_STATUS), caseCriteria.getReinfectionStatus())); } if (caseCriteria.getReportDateTo() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.lessThanOrEqualTo(from.get(Case.REPORT_DATE), caseCriteria.getReportDateTo())); + filter = and(cb, filter, cb.lessThanOrEqualTo(from.get(Case.REPORT_DATE), caseCriteria.getReportDateTo())); } if (caseCriteria.getCaseOrigin() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.CASE_ORIGIN), caseCriteria.getCaseOrigin())); + filter = and(cb, filter, cb.equal(from.get(Case.CASE_ORIGIN), caseCriteria.getCaseOrigin())); } if (caseCriteria.getHealthFacility() != null) { filter = - CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getFacility().get(Facility.UUID), caseCriteria.getHealthFacility().getUuid())); + and(cb, filter, cb.equal(joins.getFacility().get(Facility.UUID), caseCriteria.getHealthFacility().getUuid())); } if (caseCriteria.getFacilityTypeGroup() != null) { filter = - CriteriaBuilderHelper.and(cb, filter, from.get(Case.FACILITY_TYPE).in(FacilityType.getTypes(caseCriteria.getFacilityTypeGroup()))); + and(cb, filter, from.get(Case.FACILITY_TYPE).in(FacilityType.getTypes(caseCriteria.getFacilityTypeGroup()))); } if (caseCriteria.getFacilityType() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.FACILITY_TYPE), caseCriteria.getFacilityType())); + filter = and(cb, filter, cb.equal(from.get(Case.FACILITY_TYPE), caseCriteria.getFacilityType())); } if (caseCriteria.getPointOfEntry() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.equal(joins.getPointOfEntry().get(PointOfEntry.UUID), caseCriteria.getPointOfEntry().getUuid())); + filter = and(cb, filter, cb.equal(joins.getPointOfEntry().get(PointOfEntry.UUID), caseCriteria.getPointOfEntry().getUuid())); } if (caseCriteria.getSurveillanceOfficer() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.equal(joins.getSurveillanceOfficer().get(User.UUID), caseCriteria.getSurveillanceOfficer().getUuid())); + filter = and(cb, filter, cb.equal(joins.getSurveillanceOfficer().get(User.UUID), caseCriteria.getSurveillanceOfficer().getUuid())); } if (caseCriteria.getCaseClassification() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.CASE_CLASSIFICATION), caseCriteria.getCaseClassification())); + filter = and(cb, filter, cb.equal(from.get(Case.CASE_CLASSIFICATION), caseCriteria.getCaseClassification())); } if (caseCriteria.getInvestigationStatus() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.INVESTIGATION_STATUS), caseCriteria.getInvestigationStatus())); + filter = and(cb, filter, cb.equal(from.get(Case.INVESTIGATION_STATUS), caseCriteria.getInvestigationStatus())); } if (caseCriteria.getPresentCondition() != null) { filter = - CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPerson().get(Person.PRESENT_CONDITION), caseCriteria.getPresentCondition())); + and(cb, filter, cb.equal(joins.getPerson().get(Person.PRESENT_CONDITION), caseCriteria.getPresentCondition())); } if (caseCriteria.getNewCaseDateFrom() != null && caseCriteria.getNewCaseDateTo() != null) { - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, createNewCaseFilter( @@ -772,18 +770,16 @@ public Predicate createCriteriaFilter(CaseCrite caseCriteria.getNewCaseDateType())); } if (caseCriteria.getCreationDateFrom() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.greaterThan(from.get(Case.CREATION_DATE), DateHelper.getStartOfDay(caseCriteria.getCreationDateFrom()))); + filter = and(cb, filter, cb.greaterThan(from.get(Case.CREATION_DATE), DateHelper.getStartOfDay(caseCriteria.getCreationDateFrom()))); } if (caseCriteria.getCreationDateTo() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.lessThan(from.get(Case.CREATION_DATE), DateHelper.getEndOfDay(caseCriteria.getCreationDateTo()))); + filter = and(cb, filter, cb.lessThan(from.get(Case.CREATION_DATE), DateHelper.getEndOfDay(caseCriteria.getCreationDateTo()))); } if (caseCriteria.getQuarantineType() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.QUARANTINE), caseCriteria.getQuarantineType())); + filter = and(cb, filter, cb.equal(from.get(Case.QUARANTINE), caseCriteria.getQuarantineType())); } if (caseCriteria.getQuarantineTo() != null) { - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, cb.between( @@ -792,11 +788,11 @@ public Predicate createCriteriaFilter(CaseCrite DateHelper.getEndOfDay(caseCriteria.getQuarantineTo()))); } if (caseCriteria.getPerson() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPerson().get(Person.UUID), caseCriteria.getPerson().getUuid())); + filter = and(cb, filter, cb.equal(joins.getPerson().get(Person.UUID), caseCriteria.getPerson().getUuid())); } if (caseCriteria.getMustHaveNoGeoCoordinates() != null && caseCriteria.getMustHaveNoGeoCoordinates() == true) { Join personAddress = joins.getPersonAddress(); - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, cb.and( @@ -804,8 +800,7 @@ public Predicate createCriteriaFilter(CaseCrite cb.or(cb.isNull(personAddress.get(Location.LATITUDE)), cb.isNull(personAddress.get(Location.LONGITUDE))))); } if (caseCriteria.getMustBePortHealthCaseWithoutFacility() != null && caseCriteria.getMustBePortHealthCaseWithoutFacility() == true) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.and(cb.equal(from.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY), cb.isNull(joins.getFacility()))); + filter = and(cb, filter, cb.and(cb.equal(from.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY), cb.isNull(joins.getFacility()))); } if (caseCriteria.getMustHaveCaseManagementData() != null && caseCriteria.getMustHaveCaseManagementData() == true) { Subquery prescriptionSubquery = cq.subquery(Prescription.class); @@ -818,23 +813,21 @@ public Predicate createCriteriaFilter(CaseCrite Root clinicalVisitRoot = clinicalVisitSubquery.from(ClinicalVisit.class); clinicalVisitSubquery.select(clinicalVisitRoot) .where(cb.equal(clinicalVisitRoot.get(ClinicalVisit.CLINICAL_COURSE), from.get(Case.CLINICAL_COURSE))); - filter = CriteriaBuilderHelper - .and(cb, filter, cb.or(cb.exists(prescriptionSubquery), cb.exists(treatmentSubquery), cb.exists(clinicalVisitSubquery))); + filter = and(cb, filter, cb.or(cb.exists(prescriptionSubquery), cb.exists(treatmentSubquery), cb.exists(clinicalVisitSubquery))); } if (Boolean.TRUE.equals(caseCriteria.getWithoutResponsibleOfficer())) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isNull(from.get(Case.SURVEILLANCE_OFFICER))); + filter = and(cb, filter, cb.isNull(from.get(Case.SURVEILLANCE_OFFICER))); } if (Boolean.TRUE.equals(caseCriteria.getWithExtendedQuarantine())) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isTrue(from.get(Case.QUARANTINE_EXTENDED))); + filter = and(cb, filter, cb.isTrue(from.get(Case.QUARANTINE_EXTENDED))); } if (Boolean.TRUE.equals(caseCriteria.getWithReducedQuarantine())) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isTrue(from.get(Case.QUARANTINE_REDUCED))); + filter = and(cb, filter, cb.isTrue(from.get(Case.QUARANTINE_REDUCED))); } if (Boolean.TRUE.equals(caseCriteria.getOnlyQuarantineHelpNeeded())) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.and(cb.notEqual(from.get(Case.QUARANTINE_HELP_NEEDED), ""), cb.isNotNull(from.get(Case.QUARANTINE_HELP_NEEDED)))); + filter = and(cb, filter, cb.and(cb.notEqual(from.get(Case.QUARANTINE_HELP_NEEDED), ""), cb.isNotNull(from.get(Case.QUARANTINE_HELP_NEEDED)))); } - filter = CriteriaBuilderHelper.and(cb, filter, createRelevanceStatusFilter(caseCriteria, caseQueryContext)); + filter = and(cb, filter, createRelevanceStatusFilter(caseCriteria, caseQueryContext)); if (!DataHelper.isNullOrEmpty(caseCriteria.getPersonLike())) { Predicate likeFilters = CriteriaBuilderHelper.buildFreeTextSearchPredicate( @@ -853,7 +846,7 @@ public Predicate createCriteriaFilter(CaseCrite CriteriaBuilderHelper.unaccentedIlike(cb, joins.getPersonAddress().get(Location.CITY), textFilter), CriteriaBuilderHelper.ilike(cb, joins.getPersonAddress().get(Location.POSTAL_CODE), textFilter))); - filter = CriteriaBuilderHelper.and(cb, filter, likeFilters); + filter = and(cb, filter, likeFilters); } if (!DataHelper.isNullOrEmpty(caseCriteria.getCaseLike())) { Predicate likeFilters = CriteriaBuilderHelper.buildFreeTextSearchPredicate( @@ -868,7 +861,7 @@ public Predicate createCriteriaFilter(CaseCrite CriteriaBuilderHelper.unaccentedIlike(cb, from.get(Case.HEALTH_FACILITY_DETAILS), textFilter), CriteriaBuilderHelper.unaccentedIlike(cb, from.get(Case.INTERNAL_TOKEN), textFilter))); - filter = CriteriaBuilderHelper.and(cb, filter, likeFilters); + filter = and(cb, filter, likeFilters); } boolean hasEventLikeCriteria = caseCriteria.getEventLike() != null && !caseCriteria.getEventLike().trim().isEmpty(); @@ -877,8 +870,7 @@ public Predicate createCriteriaFilter(CaseCrite Join eventParticipant = joins.getEventParticipants(); Join event = joins.getEventParticipantJoins().getEvent(); - filter = CriteriaBuilderHelper - .and(cb, filter, cb.isFalse(event.get(Event.DELETED)), cb.isFalse(eventParticipant.get(EventParticipant.DELETED))); + filter = and(cb, filter, cb.isFalse(event.get(Event.DELETED)), cb.isFalse(eventParticipant.get(EventParticipant.DELETED))); if (hasEventLikeCriteria) { String[] textFilters = caseCriteria.getEventLike().trim().split("\\s+"); @@ -888,11 +880,11 @@ public Predicate createCriteriaFilter(CaseCrite CriteriaBuilderHelper.unaccentedIlike(cb, event.get(Event.EVENT_TITLE), textFilter), CriteriaBuilderHelper.unaccentedIlike(cb, event.get(Event.INTERNAL_TOKEN), textFilter), CriteriaBuilderHelper.ilike(cb, event.get(Event.UUID), textFilter)); - filter = CriteriaBuilderHelper.and(cb, filter, likeFilters, cb.isFalse(eventParticipant.get(EventParticipant.DELETED))); + filter = and(cb, filter, likeFilters, cb.isFalse(eventParticipant.get(EventParticipant.DELETED))); } } if (hasOnlyCasesWithEventsCriteria) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(event.get(Event.ID))); + filter = and(cb, filter, cb.isNotNull(event.get(Event.ID))); } } if (caseCriteria.getReportingUserLike() != null) { @@ -902,20 +894,20 @@ public Predicate createCriteriaFilter(CaseCrite CriteriaBuilderHelper.unaccentedIlike(cb, joins.getReportingUser().get(User.FIRST_NAME), textFilter), CriteriaBuilderHelper.unaccentedIlike(cb, joins.getReportingUser().get(User.LAST_NAME), textFilter), CriteriaBuilderHelper.unaccentedIlike(cb, joins.getReportingUser().get(User.USER_NAME), textFilter)); - filter = CriteriaBuilderHelper.and(cb, filter, likeFilters); + filter = and(cb, filter, likeFilters); } } if (caseCriteria.getBirthdateYYYY() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPerson().get(Person.BIRTHDATE_YYYY), caseCriteria.getBirthdateYYYY())); + filter = and(cb, filter, cb.equal(joins.getPerson().get(Person.BIRTHDATE_YYYY), caseCriteria.getBirthdateYYYY())); } if (caseCriteria.getBirthdateMM() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPerson().get(Person.BIRTHDATE_MM), caseCriteria.getBirthdateMM())); + filter = and(cb, filter, cb.equal(joins.getPerson().get(Person.BIRTHDATE_MM), caseCriteria.getBirthdateMM())); } if (caseCriteria.getBirthdateDD() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPerson().get(Person.BIRTHDATE_DD), caseCriteria.getBirthdateDD())); + filter = and(cb, filter, cb.equal(joins.getPerson().get(Person.BIRTHDATE_DD), caseCriteria.getBirthdateDD())); } if (Boolean.TRUE.equals(caseCriteria.getOnlyContactsFromOtherInstances())) { - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, cb.or( @@ -923,20 +915,20 @@ public Predicate createCriteriaFilter(CaseCrite cb.isNotNull(from.get(Case.SORMAS_TO_SORMAS_ORIGIN_INFO)))); } if (Boolean.TRUE.equals(caseCriteria.getOnlyCasesWithReinfection())) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.RE_INFECTION), YesNoUnknown.YES)); + filter = and(cb, filter, cb.equal(from.get(Case.RE_INFECTION), YesNoUnknown.YES)); } if (Boolean.TRUE.equals(caseCriteria.getOnlyCasesWithDontShareWithExternalSurvTool())) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isTrue(from.get(Case.DONT_SHARE_WITH_REPORTING_TOOL))); + filter = and(cb, filter, cb.isTrue(from.get(Case.DONT_SHARE_WITH_REPORTING_TOOL))); } if (Boolean.TRUE.equals(caseCriteria.getOnlyShowCasesWithFulfilledReferenceDefinition())) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.CASE_REFERENCE_DEFINITION), CaseReferenceDefinition.FULFILLED)); + filter = and(cb, filter, cb.equal(from.get(Case.CASE_REFERENCE_DEFINITION), CaseReferenceDefinition.FULFILLED)); } if (caseCriteria.getWithOwnership() != null) { filter = - CriteriaBuilderHelper.and(cb, filter, createOwnershipPredicate(Boolean.TRUE.equals(caseCriteria.getWithOwnership()), from, cb, cq)); + and(cb, filter, createOwnershipPredicate(Boolean.TRUE.equals(caseCriteria.getWithOwnership()), from, cb, cq)); } - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, externalShareInfoService.buildShareCriteriaFilter( @@ -959,15 +951,15 @@ private Predicate createRelevanceStatusFilter(CaseCriteria caseCriteria, CaseQue if (caseCriteria.getRelevanceStatus() != null) { if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.ACTIVE) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.or(cb.equal(from.get(Case.ARCHIVED), false), cb.isNull(from.get(Case.ARCHIVED)))); + filter = and(cb, filter, cb.or(cb.equal(from.get(Case.ARCHIVED), false), cb.isNull(from.get(Case.ARCHIVED)))); } else if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.ARCHIVED) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.ARCHIVED), true)); + filter = and(cb, filter, cb.equal(from.get(Case.ARCHIVED), true)); } else if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.DELETED) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.DELETED), true)); + filter = and(cb, filter, cb.equal(from.get(Case.DELETED), true)); } } if (caseCriteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { - filter = CriteriaBuilderHelper.and(cb, filter, createDefaultFilter(cb, from)); + filter = and(cb, filter, createDefaultFilter(cb, from)); } return filter; } @@ -1396,7 +1388,7 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); if (currentUserHasRestrictedAccessToAssignedEntities()) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(casePath.get(Case.SURVEILLANCE_OFFICER).get(User.ID), currentUser.getId())); + filter = and(cb, filter, cb.equal(casePath.get(Case.SURVEILLANCE_OFFICER).get(User.ID), currentUser.getId())); } if (jurisdictionLevel != JurisdictionLevel.NATION) { @@ -1415,7 +1407,7 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil case REGION: final Region region = currentUser.getRegion(); if (region != null) { - filter = CriteriaBuilderHelper.or( + filter = or( cb, filter, cb.equal(casePath.get(Case.REGION).get(Region.ID), region.getId()), @@ -1425,7 +1417,7 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil case DISTRICT: final District district = currentUser.getDistrict(); if (district != null) { - filter = CriteriaBuilderHelper.or( + filter = or( cb, filter, cb.equal(casePath.get(Case.DISTRICT).get(District.ID), district.getId()), @@ -1435,14 +1427,13 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil case HEALTH_FACILITY: final Facility healthFacility = currentUser.getHealthFacility(); if (healthFacility != null) { - filter = CriteriaBuilderHelper - .or(cb, filter, cb.equal(casePath.get(Case.HEALTH_FACILITY).get(Facility.ID), healthFacility.getId())); + filter = or(cb, filter, cb.equal(casePath.get(Case.HEALTH_FACILITY).get(Facility.ID), healthFacility.getId())); } break; case COMMUNITY: final Community community = currentUser.getCommunity(); if (community != null) { - filter = CriteriaBuilderHelper.or( + filter = or( cb, filter, cb.equal(casePath.get(Case.COMMUNITY).get(Community.ID), community.getId()), @@ -1452,8 +1443,7 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil case POINT_OF_ENTRY: final PointOfEntry pointOfEntry = currentUser.getPointOfEntry(); if (pointOfEntry != null) { - filter = CriteriaBuilderHelper - .or(cb, filter, cb.equal(casePath.get(Case.POINT_OF_ENTRY).get(PointOfEntry.ID), pointOfEntry.getId())); + filter = or(cb, filter, cb.equal(casePath.get(Case.POINT_OF_ENTRY).get(PointOfEntry.ID), pointOfEntry.getId())); } break; case LABORATORY: @@ -1463,7 +1453,7 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil final Join cazeJoin = joins.getCaze(); sampleSubQuery.where(cb.and(cb.equal(cazeJoin, casePath), sampleService.createUserFilterWithoutAssociations(cb, joins))); sampleSubQuery.select(sampleRoot.get(Sample.ID)); - filter = CriteriaBuilderHelper.or(cb, filter, cb.exists(sampleSubQuery)); + filter = or(cb, filter, cb.exists(sampleSubQuery)); break; default: } @@ -1475,7 +1465,7 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil && Boolean.TRUE.equals(userFilterCriteria.getIncludeCasesFromOtherJurisdictions()))) { ContactQueryContext contactQueryContext = new ContactQueryContext(cb, cq, new ContactJoins(caseQueryContext.getJoins().getContacts())); - filter = CriteriaBuilderHelper.or(cb, filter, contactService.createUserFilterWithoutCase(contactQueryContext)); + filter = or(cb, filter, contactService.createUserFilterWithoutCase(contactQueryContext)); } // users can only be assigned to a task when they have also access to the case @@ -1485,19 +1475,19 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil // all users (without specific restrictions) get access to cases that have been made available to the whole country if ((userFilterCriteria == null || userFilterCriteria.getIncludeCasesFromOtherJurisdictions()) && !featureConfigurationFacade.isFeatureDisabled(FeatureType.NATIONAL_CASE_SHARING)) { - filter = CriteriaBuilderHelper.or(cb, filter, cb.isTrue(casePath.get(Case.SHARED_TO_COUNTRY))); + filter = or(cb, filter, cb.isTrue(casePath.get(Case.SHARED_TO_COUNTRY))); } } // only show cases of a specific disease if a limited disease is set - filter = CriteriaBuilderHelper.and(cb, filter, CriteriaBuilderHelper.limitedDiseasePredicate(cb, currentUser, casePath.get(Case.DISEASE))); + filter = and(cb, filter, CriteriaBuilderHelper.limitedDiseasePredicate(cb, currentUser, casePath.get(Case.DISEASE))); // port health users can only see port health cases if (currentUser.getUserRoles().stream().anyMatch(userRole -> userRole.isPortHealthUser())) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(casePath.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY)); + filter = and(cb, filter, cb.equal(casePath.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY)); } - filter = CriteriaBuilderHelper.or(cb, filter, filterResponsible); + filter = or(cb, filter, filterResponsible); if (RequestContextHolder.isMobileSync()) { if ((userFilterCriteria == null || !userFilterCriteria.isExcludeLimitedSyncRestrictions()) @@ -1509,12 +1499,12 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil cb.or( cb.notEqual(casePath.get(Case.REPORTING_USER), currentUser), cb.and(cb.equal(casePath.get(Case.REPORTING_USER), currentUser), cb.isNull(casePath.get(Case.CREATION_VERSION)))))); - filter = CriteriaBuilderHelper.and(cb, filter, limitedCaseSyncPredicate); + filter = and(cb, filter, limitedCaseSyncPredicate); } - Predicate limitedChangeDatePredicate = CriteriaBuilderHelper.and(cb, createLimitedChangeDateFilter(cb, casePath)); + Predicate limitedChangeDatePredicate = and(cb, createLimitedChangeDateFilter(cb, casePath)); if (limitedChangeDatePredicate != null) { - filter = CriteriaBuilderHelper.and(cb, filter, limitedChangeDatePredicate); + filter = and(cb, filter, limitedChangeDatePredicate); } } @@ -1559,14 +1549,42 @@ public Predicate createNewCaseFilter(CaseQueryContext caseQueryContext, Date fro return newCaseFilter; } + + private Predicate createNewCaseFilter(CriteriaBuilder cb, From caze, Date fromDate, Date toDate, CriteriaDateType newCaseDateType) { + + Join symptoms = caze.join(Case.SYMPTOMS, JoinType.LEFT); + + toDate = DateHelper.getEndOfDay(toDate); + + Predicate onsetDateFilter = cb.between(symptoms.get(Symptoms.ONSET_DATE), fromDate, toDate); + Predicate reportDateFilter = cb.between(caze.get(Case.REPORT_DATE), fromDate, toDate); + + Predicate newCaseFilter = null; + if (newCaseDateType == null || newCaseDateType == NewCaseDateType.MOST_RELEVANT) { + newCaseFilter = cb.or(onsetDateFilter, cb.and(cb.isNull(symptoms.get(Symptoms.ONSET_DATE)), reportDateFilter)); + } else if (newCaseDateType == NewCaseDateType.ONSET) { + newCaseFilter = onsetDateFilter; + } else if (newCaseDateType == NewCaseDateType.CLASSIFICATION) { + newCaseFilter = cb.between(caze.get(Case.CLASSIFICATION_DATE), fromDate, toDate); + } else if (newCaseDateType == NewCaseDateType.CREATION) { + newCaseFilter = cb.between(caze.get(Case.CREATION_DATE), fromDate, toDate); + } else if (newCaseDateType == NewCaseDateType.INVESTIGATION) { + newCaseFilter = cb.between(caze.get(Case.INVESTIGATED_DATE), fromDate, toDate); + //} else if (newCaseDateType == NewCaseDateType.LAST_TEST_RESULT) { + // newCaseFilter = cb.between(caze.get(Case.REPORT_DATE), fromDate, toDate); + } else { + newCaseFilter = reportDateFilter; + } + + return newCaseFilter; + } public Case getRelevantCaseForFollowUp(Person person, Disease disease, Date referenceDate) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Case.class); Root caseRoot = cq.from(Case.class); - Predicate filter = CriteriaBuilderHelper - .and(cb, createDefaultFilter(cb, caseRoot), buildRelevantCasesFilterForFollowUp(person, disease, referenceDate, cb, caseRoot)); + Predicate filter = and(cb, createDefaultFilter(cb, caseRoot), buildRelevantCasesFilterForFollowUp(person, disease, referenceDate, cb, caseRoot)); cq.where(filter); return em.createQuery(cq).getResultStream().findFirst().orElse(null); @@ -1583,20 +1601,20 @@ private Predicate buildRelevantCasesFilterForFollowUp(Person person, Disease dis Date referenceDateStart = DateHelper.getStartOfDay(referenceDate); Date referenceDateEnd = DateHelper.getEndOfDay(referenceDate); - Predicate filter = CriteriaBuilderHelper.and(cb, cb.equal(from.get(Case.PERSON), person), cb.equal(from.get(Case.DISEASE), disease)); + Predicate filter = and(cb, cb.equal(from.get(Case.PERSON), person), cb.equal(from.get(Case.DISEASE), disease)); - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, cb.lessThanOrEqualTo(from.get(Case.REPORT_DATE), DateHelper.addDays(referenceDateEnd, FollowUpLogic.ALLOWED_DATE_OFFSET))); - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, - CriteriaBuilderHelper.or( + or( cb, // If the case does not have a follow-up until date, use the case report date as a fallback - CriteriaBuilderHelper.and( + and( cb, cb.isNull(from.get(Case.FOLLOW_UP_UNTIL)), cb.greaterThanOrEqualTo( @@ -1807,11 +1825,11 @@ public List getCaseSelectionList(CaseCriteria caseCriteria) { cq.orderBy(cb.desc(latestChangedDateFunction)); Predicate filter = - CriteriaBuilderHelper.and(cb, createActiveCasesFilter(cb, root), createUserFilter(caseQueryContext, new CaseUserFilterCriteria())); + and(cb, createActiveCasesFilter(cb, root), createUserFilter(caseQueryContext, new CaseUserFilterCriteria())); if (caseCriteria != null) { if (caseCriteria.getDisease() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(root.get(Case.DISEASE), caseCriteria.getDisease())); + filter = and(cb, filter, cb.equal(root.get(Case.DISEASE), caseCriteria.getDisease())); } if (caseCriteria.getSourceCaseInfoLike() != null) { String[] textFilters = caseCriteria.getSourceCaseInfoLike().split("\\s+"); @@ -1822,7 +1840,7 @@ public List getCaseSelectionList(CaseCriteria caseCriteria) { CriteriaBuilderHelper.ilike(cb, root.get(Case.UUID), textFilter), CriteriaBuilderHelper.ilike(cb, root.get(Case.EPID_NUMBER), textFilter), CriteriaBuilderHelper.ilike(cb, root.get(Case.EXTERNAL_ID), textFilter)); - filter = CriteriaBuilderHelper.and(cb, filter, likeFilters); + filter = and(cb, filter, likeFilters); } } } @@ -1856,7 +1874,7 @@ public List getEntriesList(Long personId, Integer first, Integ caze.get(Case.CHANGE_DATE)); Predicate filter = cb.equal(caze.get(Case.PERSON_ID), personId); - filter = CriteriaBuilderHelper.and(cb, filter, cb.isFalse(caze.get(Case.DELETED))); + filter = and(cb, filter, cb.isFalse(caze.get(Case.DELETED))); cq.where(filter); cq.orderBy(cb.desc(caze.get(Case.CHANGE_DATE))); @@ -1948,7 +1966,7 @@ private Predicate getSimilarityFilters(CaseSimilarityCriteria criteria, Criteria Predicate regionFilter = null; RegionReferenceDto criteriaRegion = caseCriteria.getRegion(); if (criteriaRegion != null) { - regionFilter = CriteriaBuilderHelper.or(cb, regionFilter, CaseCriteriaHelper.createRegionCriteriaFilter(cb, joins, criteriaRegion, null)); + regionFilter = or(cb, regionFilter, CaseCriteriaHelper.createRegionCriteriaFilter(cb, joins, criteriaRegion, null)); } Predicate reportDateFilter = criteria.getReportDate() != null @@ -1959,11 +1977,11 @@ private Predicate getSimilarityFilters(CaseSimilarityCriteria criteria, Criteria : null; Predicate filter = createDefaultFilter(cb, root); - filter = CriteriaBuilderHelper.and(cb, filter, userFilter); - filter = CriteriaBuilderHelper.and(cb, filter, personSimilarityFilter); - filter = CriteriaBuilderHelper.and(cb, filter, diseaseFilter); - filter = CriteriaBuilderHelper.and(cb, filter, regionFilter); - filter = CriteriaBuilderHelper.and(cb, filter, reportDateFilter); + filter = and(cb, filter, userFilter); + filter = and(cb, filter, personSimilarityFilter); + filter = and(cb, filter, diseaseFilter); + filter = and(cb, filter, regionFilter); + filter = and(cb, filter, reportDateFilter); return filter; } @@ -2049,16 +2067,16 @@ public List getCasesForDuplicateMerging( CriteriaBuilderHelper.dateDiff(cb, symptoms.get(Symptoms.ONSET_DATE), symptoms2.get(Symptoms.ONSET_DATE)), SECONDS_30_DAYS)); - Predicate filter = CriteriaBuilderHelper.and(cb, userFilter, criteriaFilter, relevanceStatusRoot2Filter, nameSimilarityFilter, diseaseFilter); + Predicate filter = and(cb, userFilter, criteriaFilter, relevanceStatusRoot2Filter, nameSimilarityFilter, diseaseFilter); if (!showDuplicatesWithDifferentRegion) { Predicate regionFilter = cb.or( cb.equal(root.get(Case.RESPONSIBLE_REGION), root2.get(Case.RESPONSIBLE_REGION)), cb.and(cb.isNotNull(root.get(Case.REGION)), cb.equal(root.get(Case.REGION), root2.get(Case.REGION)))); - filter = CriteriaBuilderHelper.and(cb, filter, regionFilter); + filter = and(cb, filter, regionFilter); } - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, reportDateFilter, @@ -2195,7 +2213,7 @@ public PreviousCaseDto getMostRecentPreviousCase(String personUuid, Disease dise symptomsJoin.get(Symptoms.ONSET_DATE)); cq.where( - CriteriaBuilderHelper.and( + and( cb, cb.equal(personJoin.get(AbstractDomainObject.UUID), personUuid), cb.equal(root.get(Case.DISEASE), disease), @@ -2260,8 +2278,7 @@ public void updateVaccinationStatuses(Long personId, Disease disease, Vaccinatio Predicate datePredicate = vaccinationService.getRelevantVaccinationPredicate(root, cu, cb, vaccination); cu.where( - CriteriaBuilderHelper - .and(cb, cb.equal(root.get(Case.PERSON).get(Person.ID), personId), cb.equal(root.get(Case.DISEASE), disease), datePredicate)); + and(cb, cb.equal(root.get(Case.PERSON).get(Person.ID), personId), cb.equal(root.get(Case.DISEASE), disease), datePredicate)); em.createQuery(cu).executeUpdate(); } @@ -2354,4 +2371,298 @@ public String getCaseUuidForAutomaticSampleAssignment(Set uuids, Disease List caseUuids = em.createQuery(cq).getResultList(); return caseUuids.size() == 1 ? caseUuids.get(0) : null; } + + @SuppressWarnings("rawtypes") + public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From casePath, CaseUserFilterCriteria userFilterCriteria) { + + User currentUser = getCurrentUser(); + if (currentUser == null) { + return null; + } + + Predicate filterResponsible = null; + Predicate filter = null; + + final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); + if (jurisdictionLevel != JurisdictionLevel.NATION){ + //&& !currentUser.hasAnyUserRole(DefaultUserRole)) { + // whoever created the case or is assigned to it is allowed to access it + filterResponsible = cb.equal(casePath.join(Case.REPORTING_USER, JoinType.LEFT), currentUser); + filterResponsible = cb.or(filterResponsible, cb.equal(casePath.join(Case.SURVEILLANCE_OFFICER, JoinType.LEFT), currentUser)); + filterResponsible = cb.or(filterResponsible, cb.equal(casePath.join(Case.CASE_OFFICER, JoinType.LEFT), currentUser)); + + switch (jurisdictionLevel) { + case REGION: + final Region region = currentUser.getRegion(); + if (region != null) { + filter = or(cb, filter, cb.equal(casePath.get(Case.REGION), region)); + } + break; + case DISTRICT: + final District district = currentUser.getDistrict(); + if (district != null) { + filter = or(cb, filter, cb.equal(casePath.get(Case.DISTRICT), district)); + } + break; + case HEALTH_FACILITY: + final Facility healthFacility = currentUser.getHealthFacility(); + if (healthFacility != null) { + filter = or(cb, filter, cb.equal(casePath.get(Case.HEALTH_FACILITY), healthFacility)); + } + break; + case COMMUNITY: + final Community community = currentUser.getCommunity(); + if (community != null) { + filter = or(cb, filter, cb.equal(casePath.get(Case.COMMUNITY), community)); + } + break; + case POINT_OF_ENTRY: + final PointOfEntry pointOfEntry = currentUser.getPointOfEntry(); + if (pointOfEntry != null) { + filter = or(cb, filter, cb.equal(casePath.get(Case.POINT_OF_ENTRY), pointOfEntry)); + } + break; + case LABORATORY: + Subquery sampleCaseSubquery = cq.subquery(Long.class); + Root sampleRoot = sampleCaseSubquery.from(Sample.class); + sampleCaseSubquery.where(sampleService.createUserFilterWithoutCase(cb, new SampleJoins(sampleRoot))); + sampleCaseSubquery.select(sampleRoot.get(Sample.ASSOCIATED_CASE).get(Case.ID)); + filter = or(cb, filter, cb.in(casePath.get(Case.ID)).value(sampleCaseSubquery)); + break; + default: + } + + // get all cases based on the user's contact association + if (userFilterCriteria == null || !userFilterCriteria.isExcludeCasesFromContacts()) { + Subquery contactCaseSubquery = cq.subquery(Long.class); + Root contactRoot = contactCaseSubquery.from(Contact.class); + contactCaseSubquery.where(contactService.createUserFilterWithoutCase(cb, cq, contactRoot)); + contactCaseSubquery.select(contactRoot.get(Contact.CAZE).get(Case.ID)); + filter = or(cb, filter, cb.in(casePath.get(Case.ID)).value(contactCaseSubquery)); + } + + // users can only be assigned to a task when they have also access to the case + //Join tasksJoin = from.join(Case.TASKS, JoinType.LEFT); + //filter = cb.or(filter, cb.equal(tasksJoin.get(Task.ASSIGNEE_USER), user)); + + // all users (without specific restrictions) get access to cases that have been made available to the whole country + if ((userFilterCriteria == null || !userFilterCriteria.isExcludeSharedCases()) + && !featureConfigurationFacade.isFeatureDisabled(FeatureType.NATIONAL_CASE_SHARING)) { + filter = or(cb, filter, cb.isTrue(casePath.get(Case.SHARED_TO_COUNTRY))); + } + } + + // only show cases of a specific disease if a limited disease is set + if (currentUser.getLimitedDiseases() != null) { + filter = and(cb, filter, cb.equal(casePath.get(Case.DISEASE), currentUser.getLimitedDiseases())); + } + + // port health users can only see port health cases + if (UserRole.isPortHealthUser(currentUser.getUserRoles())) { + filter = and(cb, filter, cb.equal(casePath.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY)); + } + + filter = or(cb, filter, filterResponsible); + + return filter; + } + + + public Predicate createCriteriaFilter(CaseCriteria caseCriteria, CriteriaBuilder cb, CriteriaQuery cq, From from) { + + Join person = from.join(Case.PERSON, JoinType.LEFT); + Join reportingUser = from.join(Case.REPORTING_USER, JoinType.LEFT); + Join region = from.join(Case.REGION, JoinType.LEFT); + Join district = from.join(Case.DISTRICT, JoinType.LEFT); + Join community = from.join(Case.COMMUNITY, JoinType.LEFT); + Join facility = from.join(Case.HEALTH_FACILITY, JoinType.LEFT); + Predicate filter = null; + if (caseCriteria.getReportingUserRole() != null) { + filter = + and(cb, filter, cb.isMember(caseCriteria.getReportingUserRole(), from.join(Case.REPORTING_USER, JoinType.LEFT).get(User.USER_ROLES))); + } + if (caseCriteria.getDisease() != null) { + filter = and(cb, filter, cb.equal(from.get(Case.DISEASE), caseCriteria.getDisease())); + } + 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(district.get(District.UUID), caseCriteria.getDistrict().getUuid())); + } + if (caseCriteria.getCommunity() != null) { + filter = and(cb, filter, cb.equal(community.get(Community.UUID), caseCriteria.getCommunity().getUuid())); + } + if (Boolean.TRUE.equals(caseCriteria. + getExcludeSharedCases())) { + User currentUser = getCurrentUser(); + if (currentUser != null) { + if (currentUser.getDistrict() != null) { + filter = and( + cb, + filter, + cb.not( + cb.and( + cb.equal(from.get(Case.SHARED_TO_COUNTRY), true), + cb.notEqual(region.get(District.UUID), currentUser.getDistrict().getUuid())))); + } else if (currentUser.getRegion() != null) { + filter = and( + cb, + filter, + cb.not( + cb.and( + cb.equal(from.get(Case.SHARED_TO_COUNTRY), true), + cb.notEqual(region.get(Region.UUID), currentUser.getRegion().getUuid())))); + } + } + } + if (caseCriteria.getCaseOrigin() != null) { + filter = and(cb, filter, cb.equal(from.get(Case.CASE_ORIGIN), caseCriteria.getCaseOrigin())); + } + if (caseCriteria.getHealthFacility() != null) { + filter = and( + cb, + filter, + cb.equal(from.join(Case.HEALTH_FACILITY, JoinType.LEFT).get(Facility.UUID), caseCriteria.getHealthFacility().getUuid())); + } + if (caseCriteria.getPointOfEntry() != null) { + filter = and( + cb, + filter, + cb.equal(from.join(Case.POINT_OF_ENTRY, JoinType.LEFT).get(PointOfEntry.UUID), caseCriteria.getPointOfEntry().getUuid())); + } + if (caseCriteria.getSurveillanceOfficer() != null) { + filter = and( + cb, + filter, + cb.equal(from.join(Case.SURVEILLANCE_OFFICER, JoinType.LEFT).get(User.UUID), caseCriteria.getSurveillanceOfficer().getUuid())); + } + if (caseCriteria.getCaseClassification() != null) { + filter = and(cb, filter, cb.equal(from.get(Case.CASE_CLASSIFICATION), caseCriteria.getCaseClassification())); + } + if (caseCriteria.getInvestigationStatus() != null) { + filter = and(cb, filter, cb.equal(from.get(Case.INVESTIGATION_STATUS), caseCriteria.getInvestigationStatus())); + } + if (caseCriteria.getPresentCondition() != null) { + filter = and(cb, filter, cb.equal(person.get(Person.PRESENT_CONDITION), caseCriteria.getPresentCondition())); + } + if (caseCriteria.getNewCaseDateFrom() != null && caseCriteria.getNewCaseDateTo() != null) { + filter = and( + cb, + filter, + createNewCaseFilter( + cb, + from, + DateHelper.getStartOfDay(caseCriteria.getNewCaseDateFrom()), + DateHelper.getEndOfDay(caseCriteria.getNewCaseDateTo()), + caseCriteria.getNewCaseDateType())); + } + if (caseCriteria.getCreationDateFrom() != null) { + filter = and(cb, filter, cb.greaterThan(from.get(Case.CREATION_DATE), DateHelper.getStartOfDay(caseCriteria.getCreationDateFrom()))); + } + if (caseCriteria.getCreationDateTo() != null) { + filter = and(cb, filter, cb.lessThan(from.get(Case.CREATION_DATE), DateHelper.getEndOfDay(caseCriteria.getCreationDateTo()))); + } + if (caseCriteria.getQuarantineTo() != null) { + filter = and( + cb, + filter, + cb.between( + from.get(Case.QUARANTINE_TO), + DateHelper.getStartOfDay(caseCriteria.getQuarantineTo()), + DateHelper.getEndOfDay(caseCriteria.getQuarantineTo()))); + } + if (caseCriteria.getPerson() != null) { + filter = and(cb, filter, cb.equal(from.join(Case.PERSON, JoinType.LEFT).get(Person.UUID), caseCriteria.getPerson().getUuid())); + } + if (caseCriteria.getMustHaveNoGeoCoordinates() != null && caseCriteria.getMustHaveNoGeoCoordinates() == true) { + Join personAddress = person.join(Person.ADDRESS, JoinType.LEFT); + filter = and( + cb, + filter, + cb.and( + cb.or(cb.isNull(from.get(Case.REPORT_LAT)), cb.isNull(from.get(Case.REPORT_LON))), + cb.or(cb.isNull(personAddress.get(Location.LATITUDE)), cb.isNull(personAddress.get(Location.LONGITUDE))))); + } + if (caseCriteria.getMustBePortHealthCaseWithoutFacility() != null && caseCriteria.getMustBePortHealthCaseWithoutFacility() == true) { + filter = and( + cb, + filter, + cb.and(cb.equal(from.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY), cb.isNull(from.join(Case.HEALTH_FACILITY, JoinType.LEFT)))); + } + if (caseCriteria.getMustHaveCaseManagementData() != null && caseCriteria.getMustHaveCaseManagementData() == true) { + Subquery prescriptionSubquery = cq.subquery(Prescription.class); + Root prescriptionRoot = prescriptionSubquery.from(Prescription.class); + prescriptionSubquery.select(prescriptionRoot).where(cb.equal(prescriptionRoot.get(Prescription.THERAPY), from.get(Case.THERAPY))); + Subquery treatmentSubquery = cq.subquery(Treatment.class); + Root treatmentRoot = treatmentSubquery.from(Treatment.class); + treatmentSubquery.select(treatmentRoot).where(cb.equal(treatmentRoot.get(Treatment.THERAPY), from.get(Case.THERAPY))); + Subquery clinicalVisitSubquery = cq.subquery(ClinicalVisit.class); + Root clinicalVisitRoot = clinicalVisitSubquery.from(ClinicalVisit.class); + clinicalVisitSubquery.select(clinicalVisitRoot) + .where(cb.equal(clinicalVisitRoot.get(ClinicalVisit.CLINICAL_COURSE), from.get(Case.CLINICAL_COURSE))); + filter = and(cb, filter, cb.or(cb.exists(prescriptionSubquery), cb.exists(treatmentSubquery), cb.exists(clinicalVisitSubquery))); + } + if (Boolean.TRUE.equals(caseCriteria.getWithoutResponsibleOfficer())) { + filter = and(cb, filter, cb.isNull(from.get(Case.SURVEILLANCE_OFFICER))); + } + if (caseCriteria.getRelevanceStatus() != null) { + if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.ACTIVE) { + filter = and(cb, filter, cb.or(cb.equal(from.get(Case.ARCHIVED), false), cb.isNull(from.get(Case.ARCHIVED)))); + } else if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.ARCHIVED) { + filter = and(cb, filter, cb.equal(from.get(Case.ARCHIVED), true)); + } + } + if (caseCriteria.getDeleted() != null) { + filter = and(cb, filter, cb.equal(from.get(Case.DELETED), caseCriteria.getDeleted())); + } + if (caseCriteria.getNameUuidEpidNumberLike() != null) { + String[] textFilters = caseCriteria.getNameUuidEpidNumberLike().split("\\s+"); + for (int i = 0; i < textFilters.length; i++) { + String textFilter = "%" + textFilters[i].toLowerCase() + "%"; + if (!DataHelper.isNullOrEmpty(textFilter)) { + Predicate likeFilters = cb.or( + cb.like(cb.lower(person.get(Person.FIRST_NAME)), textFilter), + cb.like(cb.lower(person.get(Person.LAST_NAME)), textFilter), + cb.like(cb.lower(from.get(Case.UUID)), textFilter), + cb.like(cb.lower(from.get(Case.EPID_NUMBER)), textFilter), + cb.like(cb.lower(facility.get(Facility.NAME)), textFilter), + cb.like(cb.lower(from.get(Case.HEALTH_FACILITY_DETAILS)), textFilter)); + filter = and(cb, filter, likeFilters); + } + } + } + if (caseCriteria.getReportingUserLike() != null) { + String[] textFilters = caseCriteria.getReportingUserLike().split("\\s+"); + for (int i = 0; i < textFilters.length; i++) { + String textFilter = "%" + textFilters[i].toLowerCase() + "%"; + if (!DataHelper.isNullOrEmpty(textFilter)) { + Predicate likeFilters = cb.or( + cb.like(cb.lower(reportingUser.get(User.FIRST_NAME)), textFilter), + cb.like(cb.lower(reportingUser.get(User.LAST_NAME)), textFilter), + cb.like(cb.lower(reportingUser.get(User.USER_NAME)), textFilter)); + filter = and(cb, filter, likeFilters); + } + } + } + if (caseCriteria.getSourceCaseInfoLike() != null) { + String[] textFilters = caseCriteria.getSourceCaseInfoLike().split("\\s+"); + for (int i = 0; i < textFilters.length; i++) { + String textFilter = "%" + textFilters[i].toLowerCase() + "%"; + if (!DataHelper.isNullOrEmpty(textFilter)) { + Predicate likeFilters = cb.or( + cb.like(cb.lower(person.get(Person.FIRST_NAME)), textFilter), + cb.like(cb.lower(person.get(Person.LAST_NAME)), textFilter), + cb.like(cb.lower(from.get(Case.UUID)), textFilter), + cb.like(cb.lower(from.get(Case.EPID_NUMBER)), textFilter), + cb.like(cb.lower(from.get(Case.EXTERNAL_ID)), textFilter)); + filter = and(cb, filter, likeFilters); + } + } + } + return filter; + } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteria.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteria.java index 58a9cbe5687..63188d733c9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteria.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteria.java @@ -9,6 +9,7 @@ public class CaseUserFilterCriteria { private Boolean includeCasesFromOtherJurisdictions = Boolean.FALSE; private boolean excludeLimitedSyncRestrictions; private boolean restrictAccessToAssignedEntities; + private boolean excludeSharedCases; public boolean isExcludeCasesFromContacts() { return excludeCasesFromContacts; @@ -48,4 +49,15 @@ public boolean isRestrictAccessToAssignedEntities() { public void setRestrictAccessToAssignedEntities(boolean restrictAccessToAssignedEntities) { this.restrictAccessToAssignedEntities = restrictAccessToAssignedEntities; } + + public boolean isExcludeSharedCases() { + return excludeSharedCases; + } + + public CaseUserFilterCriteria excludeSharedCases(boolean excludeSharedCases) { + this.excludeSharedCases = excludeSharedCases; + return this; + } + + } 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 c09e4a77a67..b54a5ec9159 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 @@ -53,6 +53,7 @@ import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import de.symeda.sormas.backend.event.EventParticipantService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -146,6 +147,8 @@ import de.symeda.sormas.backend.visit.VisitFacadeEjb; import de.symeda.sormas.backend.visit.VisitService; +import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.or; + @Stateless @LocalBean public class ContactService extends AbstractCoreAdoService @@ -185,6 +188,10 @@ public class ContactService extends AbstractCoreAdoService samplePath) { +// Predicate filter = createUserFilterWithoutCase(cb, new SampleJoins(samplePath)); +// +// // whoever created the case the sample is associated with or is assigned to it +// // is allowed to access it +// Join casePath = samplePath.join(Sample.ASSOCIATED_CASE, JoinType.LEFT); +// +// Predicate caseFilter = caseService.createUserFilter(cb, cq, casePath); +// filter = or(cb, filter, caseFilter); +// +// return filter; +// } + + + + @SuppressWarnings("rawtypes") + public Predicate createUserFilterForJoin(CriteriaBuilder cb, CriteriaQuery cq, From contactPath) { + + Predicate userFilter = caseService.createUserFilter(cb, cq, contactPath.join(Contact.CAZE, JoinType.LEFT)); + Predicate filter; + if (userFilter != null) { + filter = cb.or(createUserFilterWithoutCase(cb, cq, contactPath), userFilter); + } else { + filter = createUserFilterWithoutCase(cb, cq, contactPath); + } + return filter; + } + + //@SuppressWarnings("rawtypes") + public Predicate createUserFilterWithoutCase(CriteriaBuilder cb, CriteriaQuery cq, From contactPath) { + + // National users can access all contacts in the system + User currentUser = getCurrentUser(); + final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); + if ((jurisdictionLevel == JurisdictionLevel.NATION && !UserRole.isPortHealthUser(currentUser.getUserRoles())) + //|| currentUser.hasAnyUserRole(UserRole.REST_USER + ) { + if (currentUser.getLimitedDiseases() != null) { + return cb.equal(contactPath.get(Contact.DISEASE), currentUser.getLimitedDiseases()); + } else { + return null; + } + } + + // whoever created it or is assigned to it is allowed to access it + Predicate filter = cb.equal(contactPath.join(Contact.REPORTING_USER, JoinType.LEFT), currentUser); + filter = cb.or(filter, cb.equal(contactPath.join(Contact.CONTACT_OFFICER, JoinType.LEFT), currentUser)); + + switch (jurisdictionLevel) { + case REGION: + final Region region = currentUser.getRegion(); + if (region != null) { + filter = cb.or(filter, cb.equal(contactPath.get(Contact.REGION), currentUser.getRegion())); + } + break; + case DISTRICT: + final District district = currentUser.getDistrict(); + if (district != null) { + filter = cb.or(filter, cb.equal(contactPath.get(Contact.DISTRICT), currentUser.getDistrict())); + } + break; + default: + } + + return filter; + } + public Predicate createUserFilterWithoutCase(ContactQueryContext qc, ContactCriteria contactCriteria) { @@ -1103,19 +1180,19 @@ public Predicate createUserFilterWithoutCase(ContactQueryContext qc, ContactCrit case REGION: final Region region = currentUser.getRegion(); if (region != null) { - filter = CriteriaBuilderHelper.or(cb, filter, cb.equal(contactRoot.get(Contact.REGION), currentUser.getRegion())); + filter = or(cb, filter, cb.equal(contactRoot.get(Contact.REGION), currentUser.getRegion())); } break; case DISTRICT: final District district = currentUser.getDistrict(); if (district != null) { - filter = CriteriaBuilderHelper.or(cb, filter, cb.equal(contactRoot.get(Contact.DISTRICT), currentUser.getDistrict())); + filter = or(cb, filter, cb.equal(contactRoot.get(Contact.DISTRICT), currentUser.getDistrict())); } break; case COMMUNITY: final Community community = currentUser.getCommunity(); if (community != null) { - filter = CriteriaBuilderHelper.or(cb, filter, cb.equal(contactRoot.get(Contact.COMMUNITY), currentUser.getCommunity())); + filter = or(cb, filter, cb.equal(contactRoot.get(Contact.COMMUNITY), currentUser.getCommunity())); } break; case LABORATORY: @@ -1126,7 +1203,7 @@ public Predicate createUserFilterWithoutCase(ContactQueryContext qc, ContactCrit sampleSubQuery.where(cb.and(cb.equal(contactJoin, contactRoot), sampleService.createUserFilterWithoutAssociations(cb, joins))); sampleSubQuery.select(sampleRoot.get(Sample.ID)); - filter = CriteriaBuilderHelper.or(cb, filter, cb.exists(sampleSubQuery)); + filter = or(cb, filter, cb.exists(sampleSubQuery)); break; default: } @@ -1179,7 +1256,7 @@ public Predicate buildCriteriaFilter(ContactCriteria contactCriteria, ContactQue filter = CriteriaBuilderHelper.and( cb, filter, - CriteriaBuilderHelper.or( + or( cb, cb.equal(joins.getRegion().get(Region.UUID), regionUuid), cb.equal(joins.getCaseRegion().get(Region.UUID), regionUuid), @@ -1192,7 +1269,7 @@ public Predicate buildCriteriaFilter(ContactCriteria contactCriteria, ContactQue filter = CriteriaBuilderHelper.and( cb, filter, - CriteriaBuilderHelper.or( + or( cb, cb.equal(joins.getDistrict().get(District.UUID), districtUuid), cb.equal(joins.getCaseDistrict().get(District.UUID), districtUuid), @@ -1203,7 +1280,7 @@ public Predicate buildCriteriaFilter(ContactCriteria contactCriteria, ContactQue filter = CriteriaBuilderHelper.and( cb, filter, - CriteriaBuilderHelper.or( + or( cb, cb.equal(joins.getCommunity().get(Community.UUID), communityUuid), cb.equal(joins.getCaseCommunity().get(Community.UUID), communityUuid), diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java new file mode 100644 index 00000000000..797a1ccb084 --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java @@ -0,0 +1,201 @@ +/******************************************************************************* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *******************************************************************************/ +package de.symeda.sormas.backend.disease; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.ejb.EJB; +import javax.ejb.LocalBean; +import javax.ejb.Stateless; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseCriteria; +import de.symeda.sormas.api.disease.DiseaseBurdenDto; +import de.symeda.sormas.api.disease.DiseaseFacade; +import de.symeda.sormas.api.event.EventCriteria; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.outbreak.OutbreakCriteria; + +import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal; +import de.symeda.sormas.backend.disease.DiseaseConfigurationFacadeEjb.DiseaseConfigurationFacadeEjbLocal; +import de.symeda.sormas.backend.event.EventFacadeEjb.EventFacadeEjbLocal; +import de.symeda.sormas.backend.infrastructure.district.District; +import de.symeda.sormas.backend.outbreak.OutbreakFacadeEjb.OutbreakFacadeEjbLocal; +import de.symeda.sormas.backend.person.PersonFacadeEjb.PersonFacadeEjbLocal; + +/** + * Provides the application configuration settings + */ +@Stateless(name = "DiseaseFacade") +public class DiseaseFacadeEjb implements DiseaseFacade { + + @EJB + private CaseFacadeEjbLocal caseFacade; + @EJB + private EventFacadeEjbLocal eventFacade; + @EJB + private OutbreakFacadeEjbLocal outbreakFacade; + @EJB + private PersonFacadeEjbLocal personFacade; + @EJB + private DiseaseConfigurationFacadeEjbLocal diseaseConfigurationFacade; + + @Override + public List getDiseaseBurdenForDashboard( + RegionReferenceDto regionRef, + DistrictReferenceDto districtRef, + Date from, + Date to, + Date previousFrom, + Date previousTo) { + + //diseases + List diseases = diseaseConfigurationFacade.getAllDiseases(true, true, true); + + //new cases + CaseCriteria caseCriteria = new CaseCriteria().newCaseDateBetween(from, to, null).region(regionRef).district(districtRef); + + Map newCases = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + + //events + Map events = + eventFacade.getEventCountByDisease(new EventCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); + + //outbreaks + Map outbreakDistrictsCount = outbreakFacade + .getOutbreakDistrictCountByDisease(new OutbreakCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); + + //last report district + Map lastReportedDistricts = caseFacade.getLastReportedDistrictByDisease(caseCriteria, true, true); + + //case fatalities + Map caseFatalities = personFacade.getDeathCountByDisease(caseCriteria, true, true); + + //previous cases + caseCriteria.newCaseDateBetween(previousFrom, previousTo, null); + Map previousCases = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + + //build diseasesBurden + List diseasesBurden = diseases.stream().map(disease -> { + Long caseCount = newCases.getOrDefault(disease, 0L); + Long previousCaseCount = previousCases.getOrDefault(disease, 0L); + Long eventCount = events.getOrDefault(disease, 0L); + Long outbreakDistrictCount = outbreakDistrictsCount.getOrDefault(disease, 0L); + Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); + District lastReportedDistrict = lastReportedDistricts.getOrDefault(disease, null); + + String lastReportedDistrictName = lastReportedDistrict == null ? "" : lastReportedDistrict.getName(); + + return new DiseaseBurdenDto( + disease, + caseCount, + previousCaseCount, + eventCount, + outbreakDistrictCount, + caseFatalityCount, + lastReportedDistrictName); + + }).collect(Collectors.toList()); + + return diseasesBurden; + } + + @Override + public DiseaseBurdenDto getDiseaseForDashboard( + RegionReferenceDto regionRef, + DistrictReferenceDto districtRef, + Disease disease, + Date from, + Date to, + Date previousFrom, + Date previousTo) { + + System.out.println("Disease Facade EJB getDiseaseForDashboard parameters:---- Disease: " + disease + " From and To Date: " +from + " To---: " + to); + + //new cases + CaseCriteria caseCriteria = new CaseCriteria() + .newCaseDateBetween(from, to, null).region(regionRef).district(districtRef).disease(disease); + + Map newCases = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + + //events + Map events = + eventFacade.getEventCountByDisease(new EventCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); + + //outbreaks + Map outbreakDistrictsCount = outbreakFacade + .getOutbreakDistrictCountByDisease(new OutbreakCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); + + //last report district + Map lastReportedDistricts = caseFacade.getLastReportedDistrictByDisease(caseCriteria, true, true); + + //case fatalities + Map caseFatalities = personFacade.getDeathCountByDisease(caseCriteria, true, true); + + //previous cases + caseCriteria.newCaseDateBetween(previousFrom, previousTo, null); + Map previousCases = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + + //build diseasesBurden + Long caseCount = newCases.getOrDefault(disease, 0L); + Long previousCaseCount = previousCases.getOrDefault(disease, 0L); + Long eventCount = events.getOrDefault(disease, 0L); + Long outbreakDistrictCount = outbreakDistrictsCount.getOrDefault(disease, 0L); + Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); + District lastReportedDistrict = lastReportedDistricts.getOrDefault(disease, null); + + String lastReportedDistrictName = lastReportedDistrict == null ? "" : lastReportedDistrict.getName(); + + return new DiseaseBurdenDto( + disease, + caseCount, + previousCaseCount, + eventCount, + outbreakDistrictCount, + caseFatalityCount, + lastReportedDistrictName); + +// return new DiseaseBurdenDto( +// disease, +// caseCount, +// previousCaseCount, +// eventCount, +// outbreakDistrictCount, +// caseFatalityCount, +// lastReportedDistrictName); +// +// }).collect(Collectors.toList()) + +// return null; + } + + @Override + public DiseaseBurdenDto getDiseaseGridForDashboard(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date from, Date to, Date previousFromDate, Date previousToDate) { + return null; + } + + @LocalBean + @Stateless + public static class DiseaseFacadeEjbLocal extends DiseaseFacadeEjb { + + } +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java index a9941a14f7e..6326ed79bc5 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java @@ -668,4 +668,11 @@ public Predicate createOwnershipPredicate(boolean withOwnership, From from cb.exists(sharesQuery)); } } + + public Predicate createUserFilterForJoin(CriteriaBuilder cb, CriteriaQuery cq, From eventParticipantPath) { + // can see the participants of all accessible events + Predicate filter = eventService.createUserFilter(cb, cq, eventParticipantPath.join(EventParticipant.EVENT, JoinType.LEFT)); + + return filter; + } } 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 8fe0f29b768..23abdaff3ce 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 @@ -14,6 +14,7 @@ */ package de.symeda.sormas.backend.person; +import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; import static java.util.Comparator.comparing; import static java.util.Objects.isNull; import static java.util.stream.Collectors.groupingBy; @@ -57,6 +58,7 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; +import de.symeda.sormas.backend.caze.*; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.SerializationUtils; import org.apache.commons.lang3.StringUtils; @@ -126,15 +128,9 @@ import de.symeda.sormas.api.utils.ValidationRuntimeException; import de.symeda.sormas.api.vaccination.VaccinationDto; import de.symeda.sormas.backend.FacadeHelper; -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.CaseJoins; -import de.symeda.sormas.backend.caze.CaseQueryContext; -import de.symeda.sormas.backend.caze.CaseService; import de.symeda.sormas.backend.common.AbstractBaseEjb; import de.symeda.sormas.backend.common.AbstractDomainObject; -import de.symeda.sormas.backend.common.CriteriaBuilderHelper; import de.symeda.sormas.backend.contact.Contact; import de.symeda.sormas.backend.contact.ContactFacadeEjb; import de.symeda.sormas.backend.contact.ContactFacadeEjb.ContactFacadeEjbLocal; @@ -701,11 +697,11 @@ private Stream getContactLatestFollowUpEndDates(Date since Predicate filter = contactService.createUserFilter(new ContactQueryContext(cb, cq, new ContactJoins(contactRoot))); if (since != null) { - filter = CriteriaBuilderHelper.and(cb, filter, contactService.createChangeDateFilter(cb, contactRoot, since)); + filter = and(cb, filter, contactService.createChangeDateFilter(cb, contactRoot, since)); } if (forSymptomJournal) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(personJoin.get(Person.SYMPTOM_JOURNAL_STATUS), SymptomJournalStatus.ACCEPTED)); + filter = and(cb, filter, cb.equal(personJoin.get(Person.SYMPTOM_JOURNAL_STATUS), SymptomJournalStatus.ACCEPTED)); } if (filter != null) { @@ -730,11 +726,11 @@ private Stream getCaseLatestFollowUpEndDates(Date since, b Predicate filter = caseService.createUserFilter(new CaseQueryContext(cb, cq, new CaseJoins(caseRoot))); if (since != null) { - filter = CriteriaBuilderHelper.and(cb, filter, caseService.createChangeDateFilter(cb, caseRoot, since)); + filter = and(cb, filter, caseService.createChangeDateFilter(cb, caseRoot, since)); } if (forSymptomJournal) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(personJoin.get(Person.SYMPTOM_JOURNAL_STATUS), SymptomJournalStatus.ACCEPTED)); + filter = and(cb, filter, cb.equal(personJoin.get(Person.SYMPTOM_JOURNAL_STATUS), SymptomJournalStatus.ACCEPTED)); } if (filter != null) { @@ -771,13 +767,13 @@ private Date getContactLatestFollowUpEndDate(String uuid) { Join personJoin = contactRoot.join(Contact.PERSON, JoinType.LEFT); Predicate filter = contactService.createUserFilter(new ContactQueryContext(cb, cq, new ContactJoins(contactRoot))); - filter = CriteriaBuilderHelper.and(cb, filter, cb.notEqual(contactRoot.get(Contact.FOLLOW_UP_STATUS), FollowUpStatus.CANCELED)); - filter = CriteriaBuilderHelper.and(cb, filter, cb.notEqual(contactRoot.get(Contact.FOLLOW_UP_STATUS), FollowUpStatus.NO_FOLLOW_UP)); + filter = and(cb, filter, cb.notEqual(contactRoot.get(Contact.FOLLOW_UP_STATUS), FollowUpStatus.CANCELED)); + filter = and(cb, filter, cb.notEqual(contactRoot.get(Contact.FOLLOW_UP_STATUS), FollowUpStatus.NO_FOLLOW_UP)); - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(contactRoot.get(Contact.DELETED), false)); + filter = and(cb, filter, cb.equal(contactRoot.get(Contact.DELETED), false)); if (uuid != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(personJoin.get(Person.UUID), uuid)); + filter = and(cb, filter, cb.equal(personJoin.get(Person.UUID), uuid)); } if (filter != null) { @@ -803,10 +799,10 @@ private Date getCaseLatestFollowUpEndDate(String uuid) { Predicate filter = caseService.createUserFilter(new CaseQueryContext(cb, cq, new CaseJoins(caseRoot))); - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(caseRoot.get(Case.DELETED), false)); + filter = and(cb, filter, cb.equal(caseRoot.get(Case.DELETED), false)); if (uuid != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(personJoin.get(Person.UUID), uuid)); + filter = and(cb, filter, cb.equal(personJoin.get(Person.UUID), uuid)); } if (filter != null) { @@ -833,10 +829,10 @@ FollowUpStatus getMostRelevantFollowUpStatusByUuid(String uuid) { Join personContactJoin = contactRoot.join(Contact.PERSON, JoinType.LEFT); Predicate contactFilter = contactService.createUserFilter(new ContactQueryContext(cb, cq, new ContactJoins(contactRoot))); - contactFilter = CriteriaBuilderHelper.and(cb, contactFilter, cb.equal(contactRoot.get(Contact.DELETED), false)); + contactFilter = and(cb, contactFilter, cb.equal(contactRoot.get(Contact.DELETED), false)); if (uuid != null) { - contactFilter = CriteriaBuilderHelper.and(cb, contactFilter, cb.equal(personContactJoin.get(Person.UUID), uuid)); + contactFilter = and(cb, contactFilter, cb.equal(personContactJoin.get(Person.UUID), uuid)); } if (contactFilter != null) { cq.where(contactFilter); @@ -849,10 +845,10 @@ FollowUpStatus getMostRelevantFollowUpStatusByUuid(String uuid) { Join personCaseJoin = caseRoot.join(Case.PERSON, JoinType.LEFT); Predicate caseFilter = caseService.createUserFilter(new CaseQueryContext(cb, cq, new CaseJoins(caseRoot))); - caseFilter = CriteriaBuilderHelper.and(cb, caseFilter, cb.equal(caseRoot.get(Case.DELETED), false)); + caseFilter = and(cb, caseFilter, cb.equal(caseRoot.get(Case.DELETED), false)); if (uuid != null) { - caseFilter = CriteriaBuilderHelper.and(cb, caseFilter, cb.equal(personCaseJoin.get(Person.UUID), uuid)); + caseFilter = and(cb, caseFilter, cb.equal(personCaseJoin.get(Person.UUID), uuid)); } if (caseFilter != null) { @@ -1078,8 +1074,7 @@ public boolean exists(String uuid) { @Override public boolean doesExternalTokenExist(String externalToken, String personUuid) { return service.exists( - (cb, personRoot, cq) -> CriteriaBuilderHelper - .and(cb, cb.equal(personRoot.get(Person.EXTERNAL_TOKEN), externalToken), cb.notEqual(personRoot.get(Person.UUID), personUuid))); + (cb, personRoot, cq) -> and(cb, cb.equal(personRoot.get(Person.EXTERNAL_TOKEN), externalToken), cb.notEqual(personRoot.get(Person.UUID), personUuid))); } @Override @@ -1604,7 +1599,7 @@ private Predicate createIndexListFilter(PersonCriteria criteria, PersonQueryCont filter = service.createUserFilter(personQueryContext, criteria); if (criteria != null) { final Predicate criteriaFilter = service.buildCriteriaFilter(criteria, personQueryContext); - filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); + filter = and(cb, filter, criteriaFilter); } return filter; @@ -2066,7 +2061,37 @@ public List getByNationalHealthId(String nationalHealthId) { .collect(Collectors.toList()); } - @LocalBean + @Override + public Map getDeathCountByDisease(CaseCriteria caseCriteria, boolean excludeSharedCases, boolean excludeCasesFromContacts) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Object[].class); + Root root = cq.from(Case.class); + Join person = root.join(Case.PERSON, JoinType.LEFT); + + Predicate filter = caseService.createUserFilter( + cb, + cq, + root, + new CaseUserFilterCriteria().excludeSharedCases(excludeSharedCases).excludeCasesFromContacts(excludeCasesFromContacts)); + filter = and(cb, filter, caseService.createCriteriaFilter(caseCriteria, cb, cq, root)); + filter = and(cb, filter, cb.equal(person.get(Person.CAUSE_OF_DEATH_DISEASE), root.get(Case.DISEASE))); + + if (filter != null) { + cq.where(filter); + } + + cq.multiselect(person.get(Person.CAUSE_OF_DEATH_DISEASE), cb.count(person)); + cq.groupBy(person.get(Person.CAUSE_OF_DEATH_DISEASE)); + + List results = em.createQuery(cq).getResultList(); + + Map outbreaks = results.stream().collect(Collectors.toMap(e -> (Disease) e[0], e -> (Long) e[1])); + + return outbreaks; + } + + @LocalBean @Stateless public static class PersonFacadeEjbLocal extends PersonFacadeEjb { 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 8870c1ba99b..d125b8b987d 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 @@ -217,6 +217,11 @@ public List getByContactUuids(List contactUuids) { return toPseudonymizedDtos(sampleService.getByContactUuids(contactUuids)); } + @Override + public Map getNewTestResultCountByResultType(List caseIds) { + return sampleService.getNewTestResultCountByResultType(caseIds); + } + @Override public List getSimilarSamples(SampleSimilarityCriteria criteria) { final CriteriaBuilder cb = em.getCriteriaBuilder(); 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 98be6064c07..3aee911ad90 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 @@ -17,6 +17,7 @@ *******************************************************************************/ package de.symeda.sormas.backend.sample; +import java.math.BigInteger; import java.sql.Timestamp; import java.time.Instant; import java.util.ArrayList; @@ -38,6 +39,7 @@ import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; +import javax.persistence.Query; import javax.persistence.Tuple; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; @@ -53,6 +55,7 @@ import javax.persistence.criteria.Selection; import javax.persistence.criteria.Subquery; +import de.symeda.sormas.api.sample.*; import org.apache.commons.collections.CollectionUtils; import de.symeda.sormas.api.EntityRelevanceStatus; @@ -68,14 +71,6 @@ import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; -import de.symeda.sormas.api.sample.PathogenTestResultType; -import de.symeda.sormas.api.sample.PathogenTestType; -import de.symeda.sormas.api.sample.SampleAssociationType; -import de.symeda.sormas.api.sample.SampleCriteria; -import de.symeda.sormas.api.sample.SampleIndexDto; -import de.symeda.sormas.api.sample.SampleJurisdictionFlagsDto; -import de.symeda.sormas.api.sample.SampleListEntryDto; -import de.symeda.sormas.api.sample.SampleReferenceDto; import de.symeda.sormas.api.user.JurisdictionLevel; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; @@ -114,6 +109,9 @@ import de.symeda.sormas.backend.util.Pseudonymizer; import de.symeda.sormas.backend.util.QueryHelper; +import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; +import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.or; + @Stateless @LocalBean public class SampleService extends AbstractDeletableAdoService @@ -157,7 +155,7 @@ public List findBy(SampleCriteria criteria, User user, String sortProper Predicate filter = buildCriteriaFilter(criteria, sampleQueryContext); if (user != null) { - filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(sampleQueryContext, null)); + filter = and(cb, filter, createUserFilter(sampleQueryContext, null)); } if (filter != null) { cq.where(filter); @@ -342,7 +340,7 @@ public List getIndexListIds(SampleCriteria sampleCriteria, Integer first, if (sampleCriteria != null) { Predicate criteriaFilter = buildCriteriaFilter(sampleCriteria, sampleQueryContext); - filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); + filter = and(cb, filter, criteriaFilter); } if (filter != null) { @@ -466,9 +464,9 @@ public List getEntriesList(SampleCriteria sampleCriteria, In selections.addAll(getJurisdictionSelections(sampleQueryContext)); cq.multiselect(selections); - Predicate filter = CriteriaBuilderHelper.and(cb, createDefaultFilter(cb, sample), createUserFilter(sampleQueryContext, sampleCriteria)); + Predicate filter = and(cb, createDefaultFilter(cb, sample), createUserFilter(sampleQueryContext, sampleCriteria)); Predicate criteriaFilter = buildSampleListCriteriaFilter(sampleCriteria, cb, joins, sample); - filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); + filter = and(cb, filter, criteriaFilter); if (filter != null) { cq.where(filter); @@ -487,7 +485,7 @@ protected Predicate createRelevantDataFilter(CriteriaBuilder cb, CriteriaQuery c Predicate filter = createActiveSamplesFilter(sampleQueryContext); if (getCurrentUser() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(sampleQueryContext, null)); + filter = and(cb, filter, createUserFilter(sampleQueryContext, null)); } return filter; @@ -504,7 +502,7 @@ public List getAllActiveUuids(User user) { if (user != null) { Predicate userFilter = createUserFilter(sampleQueryContext, null); - filter = CriteriaBuilderHelper.and(cb, filter, userFilter); + filter = and(cb, filter, userFilter); } cq.where(filter); @@ -632,21 +630,20 @@ public Predicate createUserFilter(SampleQueryContext sampleQueryContext, SampleC && criteria.getSampleAssociationType() != SampleAssociationType.PERSON) { final SampleAssociationType sampleAssociationType = criteria.getSampleAssociationType(); if (sampleAssociationType == SampleAssociationType.CASE) { - filter = CriteriaBuilderHelper.or(cb, filter, caseService.createUserFilter(new CaseQueryContext(cb, cq, joins.getCaseJoins()), null)); + filter = or(cb, filter, caseService.createUserFilter(new CaseQueryContext(cb, cq, joins.getCaseJoins()), null)); } else if (sampleAssociationType == SampleAssociationType.CONTACT && !RequestContextHolder.isMobileSync()) { - filter = CriteriaBuilderHelper - .or(cb, filter, contactService.createUserFilter(new ContactQueryContext(cb, cq, joins.getContactJoins()), null)); + filter = or(cb, filter, contactService.createUserFilter(new ContactQueryContext(cb, cq, joins.getContactJoins()), null)); } else if (sampleAssociationType == SampleAssociationType.EVENT_PARTICIPANT && !RequestContextHolder.isMobileSync()) { - filter = CriteriaBuilderHelper.or( + filter = or( cb, filter, eventParticipantService.createUserFilter(new EventParticipantQueryContext(cb, cq, joins.getEventParticipantJoins()))); } } else if (CollectionUtils.isNotEmpty(currentUser.getLimitedDiseases())) { - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, - CriteriaBuilderHelper.or( + or( cb, caseService.createUserFilter(new CaseQueryContext(cb, cq, joins.getCaseJoins()), null), RequestContextHolder.isMobileSync() @@ -656,7 +653,7 @@ public Predicate createUserFilter(SampleQueryContext sampleQueryContext, SampleC ? null : eventParticipantService.createUserFilter(new EventParticipantQueryContext(cb, cq, joins.getEventParticipantJoins())))); } else { - filter = CriteriaBuilderHelper.or( + filter = or( cb, filter, caseService.createUserFilter(new CaseQueryContext(cb, cq, joins.getCaseJoins()), null), @@ -684,12 +681,12 @@ public Predicate createUserFilterWithoutAssociations(CriteriaBuilder cb, SampleJ // Lab users can see samples assigned to their laboratory if (jurisdictionLevel == JurisdictionLevel.LABORATORY || jurisdictionLevel == JurisdictionLevel.EXTERNAL_LABORATORY) { if (currentUser.getLaboratory() != null) { - filter = CriteriaBuilderHelper.or(cb, filter, cb.equal(joins.getLab(), currentUser.getLaboratory())); + filter = or(cb, filter, cb.equal(joins.getLab(), currentUser.getLaboratory())); } } // Only show samples of a specific disease if a limited disease is set - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, CriteriaBuilderHelper.limitedDiseasePredicate( @@ -778,18 +775,18 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext Predicate filter = null; final SampleAssociationType sampleAssociationType = criteria.getSampleAssociationType(); if (sampleAssociationType == SampleAssociationType.CASE) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(joins.getCaze())); + filter = and(cb, filter, cb.isNotNull(joins.getCaze())); } else if (sampleAssociationType == SampleAssociationType.CONTACT) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(joins.getContact())); + filter = and(cb, filter, cb.isNotNull(joins.getContact())); } else if (sampleAssociationType == SampleAssociationType.EVENT_PARTICIPANT) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(joins.getEventParticipant())); + filter = and(cb, filter, cb.isNotNull(joins.getEventParticipant())); } if (criteria.getRegion() != null) { final String regionUuid = criteria.getRegion().getUuid(); - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, - CriteriaBuilderHelper.or( + or( cb, cb.equal(joins.getCaseRegion().get(Region.UUID), regionUuid), cb.equal(joins.getCaseResponsibleRegion().get(Region.UUID), regionUuid), @@ -801,10 +798,10 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext } if (criteria.getDistrict() != null) { final String districtUuid = criteria.getDistrict().getUuid(); - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, - CriteriaBuilderHelper.or( + or( cb, cb.equal(joins.getCaseDistrict().get(District.UUID), districtUuid), cb.equal(joins.getCaseResponsibleDistrict().get(District.UUID), districtUuid), @@ -816,26 +813,26 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext } if (criteria.getLaboratory() != null) { filter = - CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getLab().get(AbstractDomainObject.UUID), criteria.getLaboratory().getUuid())); + and(cb, filter, cb.equal(joins.getLab().get(AbstractDomainObject.UUID), criteria.getLaboratory().getUuid())); } if (criteria.getShipped() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sample.get(Sample.SHIPPED), criteria.getShipped())); + filter = and(cb, filter, cb.equal(sample.get(Sample.SHIPPED), criteria.getShipped())); } if (criteria.getReceived() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sample.get(Sample.RECEIVED), criteria.getReceived())); + filter = and(cb, filter, cb.equal(sample.get(Sample.RECEIVED), criteria.getReceived())); } if (criteria.getReferred() != null) { if (criteria.getReferred().equals(Boolean.TRUE)) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(sample.get(Sample.REFERRED_TO))); + filter = and(cb, filter, cb.isNotNull(sample.get(Sample.REFERRED_TO))); } else { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isNull(sample.get(Sample.REFERRED_TO))); + filter = and(cb, filter, cb.isNull(sample.get(Sample.REFERRED_TO))); } } if (criteria.getPathogenTestResult() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sample.get(Sample.PATHOGEN_TEST_RESULT), criteria.getPathogenTestResult())); + filter = and(cb, filter, cb.equal(sample.get(Sample.PATHOGEN_TEST_RESULT), criteria.getPathogenTestResult())); } if (criteria.getCaseClassification() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getCaze().get(Case.CASE_CLASSIFICATION), criteria.getCaseClassification())); + filter = and(cb, filter, cb.equal(joins.getCaze().get(Case.CASE_CLASSIFICATION), criteria.getCaseClassification())); } if (criteria.getDisease() != null) { Expression diseaseExpression = cb.selectCase() @@ -844,44 +841,42 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext cb.selectCase() .when(cb.isNotNull(joins.getContact()), joins.getContact().get(Contact.DISEASE)) .otherwise(joins.getEvent().get(Event.DISEASE))); - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(diseaseExpression, criteria.getDisease())); + filter = and(cb, filter, cb.equal(diseaseExpression, criteria.getDisease())); } if (criteria.getCaze() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getCaze().get(Case.UUID), criteria.getCaze().getUuid())); + filter = and(cb, filter, cb.equal(joins.getCaze().get(Case.UUID), criteria.getCaze().getUuid())); } if (criteria.getContact() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getContact().get(Contact.UUID), criteria.getContact().getUuid())); + filter = and(cb, filter, cb.equal(joins.getContact().get(Contact.UUID), criteria.getContact().getUuid())); } if (criteria.getEventParticipant() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.equal(joins.getEventParticipant().get(EventParticipant.UUID), criteria.getEventParticipant().getUuid())); + filter = and(cb, filter, cb.equal(joins.getEventParticipant().get(EventParticipant.UUID), criteria.getEventParticipant().getUuid())); } if (criteria.getSampleReportDateFrom() != null && criteria.getSampleReportDateTo() != null) { - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, cb.between(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateFrom(), criteria.getSampleReportDateTo())); } else if (criteria.getSampleReportDateFrom() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.greaterThanOrEqualTo(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateFrom())); + filter = and(cb, filter, cb.greaterThanOrEqualTo(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateFrom())); } else if (criteria.getSampleReportDateTo() != null) { filter = - CriteriaBuilderHelper.and(cb, filter, cb.lessThanOrEqualTo(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateTo())); + and(cb, filter, cb.lessThanOrEqualTo(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateTo())); } if (criteria.getSpecimenCondition() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sample.get(Sample.SPECIMEN_CONDITION), criteria.getSpecimenCondition())); + filter = and(cb, filter, cb.equal(sample.get(Sample.SPECIMEN_CONDITION), criteria.getSpecimenCondition())); } if (criteria.getRelevanceStatus() != null) { if (criteria.getRelevanceStatus() == EntityRelevanceStatus.ACTIVE) { - filter = CriteriaBuilderHelper.and(cb, filter, assignedToActiveEntity(cb, joins)); + filter = and(cb, filter, assignedToActiveEntity(cb, joins)); } else if (criteria.getRelevanceStatus() == EntityRelevanceStatus.ARCHIVED) { - filter = CriteriaBuilderHelper.and(cb, filter, allAssignedEntitiesAreArchived(cb, joins)); + filter = and(cb, filter, allAssignedEntitiesAreArchived(cb, joins)); } else if (criteria.getRelevanceStatus() == EntityRelevanceStatus.DELETED) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sample.get(Sample.DELETED), true)); + filter = and(cb, filter, cb.equal(sample.get(Sample.DELETED), true)); } } if (criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isFalse(sample.get(Sample.DELETED))); + filter = and(cb, filter, cb.isFalse(sample.get(Sample.DELETED))); } if (criteria.getCaseCodeIdLike() != null) { @@ -910,7 +905,7 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext CriteriaBuilderHelper.ilike(cb, sample.get(Sample.LAB_SAMPLE_ID), textFilter), CriteriaBuilderHelper.ilike(cb, sample.get(Sample.FIELD_SAMPLE_ID), textFilter), CriteriaBuilderHelper.unaccentedIlike(cb, joins.getLab().get(Facility.NAME), textFilter)); - filter = CriteriaBuilderHelper.and(cb, filter, likeFilters); + filter = and(cb, filter, likeFilters); } } @@ -941,7 +936,7 @@ private Predicate addCaseContactEventParticipantSamplePredicate( filterEvPartUuids = sample.get(Sample.ASSOCIATED_EVENT_PARTICIPANT).get(EventParticipant.UUID).in(criteria.getEventParticipantUuids()); } - filter = CriteriaBuilderHelper.and(cb, filter, CriteriaBuilderHelper.or(cb, filterCaseUuids, filterContactUuids, filterEvPartUuids)); + filter = and(cb, filter, or(cb, filterCaseUuids, filterContactUuids, filterEvPartUuids)); return filter; } @@ -949,22 +944,21 @@ private Predicate buildSampleListCriteriaFilter(SampleCriteria criteria, Criteri Predicate filter = null; final SampleAssociationType sampleAssociationType = criteria.getSampleAssociationType(); if (sampleAssociationType == SampleAssociationType.CASE) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(joins.getCaze())); + filter = and(cb, filter, cb.isNotNull(joins.getCaze())); } else if (sampleAssociationType == SampleAssociationType.CONTACT) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(joins.getContact())); + filter = and(cb, filter, cb.isNotNull(joins.getContact())); } else if (sampleAssociationType == SampleAssociationType.EVENT_PARTICIPANT) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(joins.getEventParticipant())); + filter = and(cb, filter, cb.isNotNull(joins.getEventParticipant())); } if (criteria.getCaze() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getCaze().get(Case.UUID), criteria.getCaze().getUuid())); + filter = and(cb, filter, cb.equal(joins.getCaze().get(Case.UUID), criteria.getCaze().getUuid())); } if (criteria.getContact() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getContact().get(Contact.UUID), criteria.getContact().getUuid())); + filter = and(cb, filter, cb.equal(joins.getContact().get(Contact.UUID), criteria.getContact().getUuid())); } if (criteria.getEventParticipant() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.equal(joins.getEventParticipant().get(EventParticipant.UUID), criteria.getEventParticipant().getUuid())); + filter = and(cb, filter, cb.equal(joins.getEventParticipant().get(EventParticipant.UUID), criteria.getEventParticipant().getUuid())); } filter = addCaseContactEventParticipantSamplePredicate(criteria, cb, sample, filter); @@ -1253,10 +1247,71 @@ public List getAssociatedDiseaseVariants(String sampleUuid) { Predicate filter = createDefaultFilter(cb, from); - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(AbstractDomainObject.UUID), sampleUuid)); - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(pathogenTestJoin.get(DeletableAdo.DELETED), false)); + filter = and(cb, filter, cb.equal(from.get(AbstractDomainObject.UUID), sampleUuid)); + filter = and(cb, filter, cb.equal(pathogenTestJoin.get(DeletableAdo.DELETED), false)); cq.where(filter); cq.select(pathogenTestJoin.get(PathogenTest.TESTED_DISEASE_VARIANT)); return em.createQuery(cq).getResultList(); } + + public Map getNewTestResultCountByResultType(List caseIds) { + + if (CollectionUtils.isEmpty(caseIds)) { + // Avoid empty IN clause + return new HashMap<>(); + } + + // Avoid parameter limit by joining caseIds to a String instead of n parameters + StringBuilder queryBuilder = new StringBuilder(); + //@formatter:off + queryBuilder.append("WITH sortedsamples AS (SELECT DISTINCT ON (").append(Sample.ASSOCIATED_CASE).append("_id) ") + .append(Sample.ASSOCIATED_CASE).append("_id, ").append(Sample.PATHOGEN_TEST_RESULT).append(", ").append(Sample.SAMPLE_DATE_TIME) + .append(" FROM ").append(Sample.TABLE_NAME).append(" WHERE (").append(Sample.SPECIMEN_CONDITION).append(" IS NULL OR ") + .append(Sample.SPECIMEN_CONDITION).append(" = '").append(SpecimenCondition.ADEQUATE.name()).append("') AND ").append(Sample.TABLE_NAME) + .append(".").append(Sample.DELETED).append(" = false ORDER BY ").append(Sample.ASSOCIATED_CASE).append("_id, ") + .append(Sample.SAMPLE_DATE_TIME).append(" desc) SELECT sortedsamples.").append(Sample.PATHOGEN_TEST_RESULT).append(", COUNT(") + .append(Sample.ASSOCIATED_CASE).append("_id) FROM sortedsamples JOIN ").append(Case.TABLE_NAME).append(" ON sortedsamples.") + .append(Sample.ASSOCIATED_CASE).append("_id = ").append(Case.TABLE_NAME).append(".id ") + .append(" WHERE sortedsamples.").append(Sample.ASSOCIATED_CASE).append("_id IN (").append(QueryHelper.concatLongs(caseIds)).append(") ") + .append(" GROUP BY sortedsamples." + Sample.PATHOGEN_TEST_RESULT); + //@formatter:on + + Query query = em.createNativeQuery(queryBuilder.toString()); + + @SuppressWarnings("unchecked") + List results = query.getResultList(); + + return results.stream() + .filter(e -> e[0] != null) + .collect(Collectors.toMap(e -> PathogenTestResultType.valueOf((String) e[0]), e -> ((BigInteger) e[1]).longValue())); + } + + public Predicate createUserFilterWithoutCase(CriteriaBuilder cb, SampleJoins joins) { + Predicate filter = null; + // user that reported it is not able to access it. Otherwise they would also need to access the case + //filter = cb.equal(samplePath.get(Sample.REPORTING_USER), user); + + User currentUser = getCurrentUser(); + final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); + // lab users can see samples assigned to their laboratory + if (jurisdictionLevel == JurisdictionLevel.LABORATORY || jurisdictionLevel == JurisdictionLevel.EXTERNAL_LABORATORY) { + if (currentUser.getLaboratory() != null) { + filter = or(cb, filter, cb.equal(joins.getRoot().get(Sample.LAB), currentUser.getLaboratory())); + } + } + + // only show samples of a specific disease if a limited disease is set + if (filter != null && currentUser.getLimitedDiseases() != null) { + filter = and( + cb, + filter, + cb.equal( + cb.selectCase() + .when(cb.isNotNull(joins.getCaze()), joins.getCaze().get(Case.DISEASE)) + .otherwise(joins.getContact().get(Contact.DISEASE)), + currentUser.getLimitedDiseases())); + } + + return filter; + } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/User.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/User.java index bd3ab43b94e..14e5f5e8555 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/User.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/User.java @@ -136,6 +136,7 @@ public class User extends AbstractDomainObject { private boolean hasConsentedToGdpr; + @Column(nullable = false, length = CHARACTER_LIMIT_DEFAULT) public String getUserName() { return userName; @@ -386,7 +387,9 @@ public static String buildCaptionForNotification(User user) { return caption; } - static class UserListener { + + + static class UserListener { @PostPersist @PostUpdate diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserRole.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserRole.java index 55a2c10305c..5d6c38a4faa 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserRole.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserRole.java @@ -54,7 +54,7 @@ @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class UserRole extends AbstractDomainObject { - private static final long serialVersionUID = 9053095630718041842L; + private static final long serialVersionUID = 9053095630718041842L; public static final String TABLE_NAME = "userroles"; public static final String TABLE_NAME_EMAIL_NOTIFICATIONS = "userroles_emailnotificationtypes"; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java index c7da83410b6..d9603ed725c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java @@ -31,6 +31,7 @@ public abstract class AbstractDashboardDataProvider testResultCountByResultType; + public void refreshData() { @@ -87,6 +95,19 @@ public void refreshData() { protected DashboardCriteria newCriteria() { return new DashboardCriteria(); } + public void refreshDiseaseData() { + System.out.println("Dashboard data provider on refreshDiseaseData=:" + disease); + + setDiseaseBurdenDetail( + FacadeProvider.getDiseaseFacade().getDiseaseForDashboard(region, district, disease, fromDate, toDate, previousFromDate, previousToDate)); + + setOutbreakDistrictCount( + FacadeProvider.getOutbreakFacade() + .getOutbreakDistrictCount( + new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate))); + + this.refreshDataForSelectedDisease(); + } private void refreshDataForQuarantinedContacts() { @@ -200,6 +221,27 @@ public void refreshDataForSelectedDisease() { } } + if (getDashboardType() == DashboardType.DISEASE || this.disease != null) { + // Cases + CaseCriteria caseCriteria = new CaseCriteria(); + caseCriteria.region(region).district(district).disease(disease).newCaseDateBetween(fromDate, toDate, NewCaseDateType.MOST_RELEVANT); + setCases(FacadeProvider.getCaseFacade().getCasesForDashboard(caseCriteria)); + setLastReportedDistrict(FacadeProvider.getCaseFacade().getLastReportedDistrictName(caseCriteria, true, true)); + + caseCriteria.newCaseDateBetween(previousFromDate, previousToDate, NewCaseDateType.MOST_RELEVANT); + setPreviousCases(FacadeProvider.getCaseFacade().getCasesForDashboard(caseCriteria)); + + if (getDashboardType() != DashboardType.CONTACTS) { + if (getCases().size() > 0) { + setTestResultCountByResultType( + FacadeProvider.getSampleFacade() + .getNewTestResultCountByResultType(getCases().stream().map(c -> c.getId()).collect(Collectors.toList()))); + } else { + setTestResultCountByResultType(new HashMap<>()); + } + } + } + if (this.disease == null || getDashboardType() == DashboardType.CONTACTS) { return; } @@ -222,7 +264,9 @@ public void refreshDataForSelectedDisease() { private DashboardCriteria buildDashboardCriteria(Date fromDate, Date toDate) { return buildDashboardCriteria().newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); } - + public void setTestResultCountByResultType(Map testResults) { + this.testResultCountByResultType = testResults; + } public List getCases() { return cases; } @@ -288,6 +332,8 @@ public void setPreviousContacts(List previousContacts) { } public List getDiseasesBurden() { + System.out.println("DashboardDataProvider am i getting from getDiseasesBurden(): " + diseasesBurden); + return diseasesBurden; } @@ -295,6 +341,15 @@ public void setDiseasesBurden(List diseasesBurden) { this.diseasesBurden = diseasesBurden; } + public DiseaseBurdenDto getDiseaseBurdenDetail() { + System.out.println("What am i getting from getDiseaseBurdenDetail(): " + diseaseBurdenDetail); + return diseaseBurdenDetail; + } + + public void setDiseaseBurdenDetail(DiseaseBurdenDto diseaseBurdenDetail) { + this.diseaseBurdenDetail = diseaseBurdenDetail; + } + public Long getOutbreakDistrictCount() { return outbreakDistrictCount; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardType.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardType.java index 245918b091d..78f6b41b77c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardType.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardType.java @@ -24,6 +24,8 @@ public enum DashboardType { SURVEILLANCE, CONTACTS, CAMPAIGNS, + + DISEASE, SAMPLES; @Override diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java index 0c80494e7c2..b02129431a3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java @@ -23,21 +23,22 @@ import java.util.Date; import java.util.HashSet; import java.util.Set; - +import java.util.function.Consumer; + +import com.vaadin.icons.VaadinIcons; +import com.vaadin.shared.ui.ContentMode; +import com.vaadin.ui.*; +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.action.ActionDto; +import de.symeda.sormas.ui.dashboard.DashboardDataProvider; +import de.symeda.sormas.ui.dashboard.DashboardType; import org.apache.commons.lang3.ArrayUtils; import org.vaadin.hene.popupbutton.PopupButton; import com.vaadin.event.ShortcutAction; import com.vaadin.server.Page; import com.vaadin.shared.ui.MarginInfo; -import com.vaadin.ui.Button; -import com.vaadin.ui.Component; -import com.vaadin.ui.CustomLayout; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Label; -import com.vaadin.ui.Notification; import com.vaadin.ui.Notification.Type; -import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; import com.vaadin.v7.ui.ComboBox; @@ -97,8 +98,36 @@ public abstract class DashboardFilterLayout

diseaseFilterChangeCallback; + private Label infoLabel; + + + public DashboardFilterLayout(AbstractDashboardView dashboardView, P dashboardDataProvider) { + this.dashboardView = dashboardView; + this.dashboardDataProvider = dashboardDataProvider; + this.regionFilter = new ComboBox(); + this.districtFilter = new ComboBox(); + this.diseaseFilter = new ComboBox(); + dateFilterButtons = new HashSet<>(); + dateComparisonButtons = new HashSet<>(); + + setSpacing(true); + setSizeUndefined(); + setMargin(new MarginInfo(true, true, false, true)); + + createDateFilters(); +// createRegionAndDistrictFilter(); + if (dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE) { + createRegionAndDistrictFilter(); + } + if (dashboardDataProvider.getDashboardType() == DashboardType.CONTACTS) { + createRegionAndDistrictFilter(); + createDiseaseFilter(); + } + } public DashboardFilterLayout(AbstractDashboardView dashboardView, P dashboardDataProvider, String[] templateContent) { this.dashboardView = dashboardView; @@ -129,6 +158,26 @@ public void populateLayout() { createResetAndApplyButtons(); }; + + private void createDiseaseFilter() { + diseaseFilter.setWidth(200, Unit.PIXELS); + diseaseFilter.setInputPrompt(I18nProperties.getString(Strings.promptDisease)); + if (dashboardDataProvider.getDashboardType() == DashboardType.CONTACTS) { + diseaseFilter.addItems(FacadeProvider.getDiseaseConfigurationFacade().getAllDiseasesWithFollowUp(true, true, true).toArray()); + diseaseFilter.setValue(dashboardDataProvider.getDisease()); + } else { + diseaseFilter.addItems(FacadeProvider.getDiseaseConfigurationFacade().getAllDiseases(true, true, true).toArray()); + } + diseaseFilter.addValueChangeListener(e -> { + if (diseaseFilterChangeCallback != null) { + diseaseFilterChangeCallback.accept(diseaseFilter.getValue() != null); + } + dashboardDataProvider.setDisease((Disease) diseaseFilter.getValue()); + dashboardView.refreshDashboard(); + }); + addComponent(diseaseFilter); + } + protected void createRegionAndDistrictFilter() { createRegionFilter(null); createDistrictFilter(null); @@ -208,6 +257,13 @@ public void createDateFilters() { dateFilterLayout.addComponents(btnCurrentPeriod, lblComparedTo, btnComparisonPeriod); + + infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); + infoLabel.setSizeUndefined(); + CssStyles.style(infoLabel, CssStyles.LABEL_XLARGE, CssStyles.LABEL_SECONDARY); + addComponent(infoLabel); + setComponentAlignment(infoLabel, Alignment.TOP_RIGHT); + // Set initial date filter CssStyles.style(btnThisWeek, CssStyles.BUTTON_FILTER_DARK); CssStyles.removeStyles(btnThisWeek, CssStyles.BUTTON_FILTER_LIGHT); @@ -535,6 +591,10 @@ private void updateComparisonDates() { } } + public void setInfoLabelText(String text) { + infoLabel.setDescription(text); + } + private enum DateFilterType { TODAY, YESTERDAY, diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java new file mode 100644 index 00000000000..1317f972cc9 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java @@ -0,0 +1,276 @@ +package de.symeda.sormas.ui.dashboard.diseasedetails; + +import com.vaadin.icons.VaadinIcons; +import com.vaadin.shared.ui.ContentMode; +import com.vaadin.ui.*; +import com.vaadin.ui.themes.ValoTheme; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.disease.DiseaseBurdenDto; +import de.symeda.sormas.api.i18n.Captions; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.ui.dashboard.DashboardDataProvider; +import de.symeda.sormas.ui.utils.CssStyles; + +import java.util.List; + +public class DiseaseDetailsComponent extends CssLayout { + + /** + * + */ + private static final long serialVersionUID = 1L; + + private DashboardDataProvider dashboardDataProvider; + private List diseaseBurden; + private String outbreakDivStyles; + + public DiseaseDetailsComponent(DashboardDataProvider dashboardDataProvider) { + this.dashboardDataProvider = dashboardDataProvider; + addStyleName("disease-detail-card-display-top"); + + outbreakDivStyles = + "text-align: center; font-size: smaller; font-weight: 700; width: 100px; " + + "background:#DE5555; -ms-transform: rotate(-135deg); -o-transform: rotate(-135deg); -webkit-transform:rotate(45deg); " + + "color: white; transform-origin: bottom; float: right; margin-right: -150px; margin-top: -10px;"; + } + + public void refresh(){ + addTopLayout( + dashboardDataProvider.getDiseaseBurdenDetail().getDisease(), + dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getPreviousCaseCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getOutbreakDistrictCount() > 0); + + addStatsLayout( + dashboardDataProvider.getDiseaseBurdenDetail().getCaseDeathCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getOutbreakDistrict(), + dashboardDataProvider.getDiseaseBurdenDetail().getLastReportedDistrictName(), + dashboardDataProvider.getDiseaseBurdenDetail().getDisease()); + } + + private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCount, boolean isOutbreak) { + VerticalLayout layout = new VerticalLayout(); + layout.setMargin(true); + layout.setSpacing(false); + CssStyles.style(layout, CssStyles.getDiseaseColor(disease)); + layout.setHeight(200, Unit.PIXELS); + layout.setWidth(250, Unit.PIXELS); + + HorizontalLayout nameAndOutbreakLayout = new HorizontalLayout(); + nameAndOutbreakLayout.setMargin(false); + nameAndOutbreakLayout.setSpacing(false); + nameAndOutbreakLayout.setHeight(90, Unit.PIXELS); + nameAndOutbreakLayout.setWidth(200, Unit.PIXELS); + + HorizontalLayout nameLayout = new HorizontalLayout(); + nameLayout.setMargin(false); + nameLayout.setSpacing(false); + nameLayout.setHeight(50, Unit.PIXELS); + nameLayout.setWidth(200, Unit.PIXELS); + Label nameLabel = new Label(disease.toShortString()); + nameLabel.setSizeUndefined(); + nameLabel.setHeight(20, Unit.PIXELS); + + CssStyles.style( + nameLabel, + CssStyles.LABEL_WHITE, + nameLabel.getValue().length() > 12 ? CssStyles.LABEL_SMALL : CssStyles.LABEL_WHITE, + CssStyles.LABEL_LARGE, + CssStyles.ALIGN_CENTER, + CssStyles.LABEL_UPPERCASE); + nameLayout.addComponent(nameLabel); + nameLayout.setComponentAlignment(nameLabel, Alignment.MIDDLE_CENTER); + nameAndOutbreakLayout.addComponent(nameLayout); + nameAndOutbreakLayout.setExpandRatio(nameLayout, 1); + + if (isOutbreak) { + HorizontalLayout outbreakLayout = new HorizontalLayout(); + outbreakLayout.setMargin(false); + outbreakLayout.setSpacing(false); + outbreakLayout.setHeight(15, Unit.PIXELS); + outbreakLayout.setWidth(100, Unit.PIXELS); +// Label outbreakLabel = new Label("",ContentMode.HTML); + Label outbreakLabel = new Label(I18nProperties.getCaption(Captions.dashboardOutbreak).toUpperCase(), ContentMode.HTML); + outbreakLabel.setStyleName("disease-detail-outbreak-display", true); +// outbreakLabel.setValue("

" + I18nProperties.getCaption(Captions.dashboardOutbreak).toUpperCase() + "
"); +// outbreakLabel.setStyleName("disease-detail-outbreak-display", true); +// CssStyles.style(outbreakLabel, CssStyles.LABEL_WHITE, CssStyles.ALIGN_CENTER, CssStyles.LABEL_UPPERCASE); + outbreakLayout.addComponent(outbreakLabel); +// outbreakLayout.setComponentAlignment(outbreakLabel, Alignment.BOTTOM_RIGHT); + nameAndOutbreakLayout.addComponent(outbreakLayout); + } + + layout.addComponent(nameAndOutbreakLayout); + layout.setExpandRatio(nameAndOutbreakLayout, 1); + + HorizontalLayout countLayout = new HorizontalLayout(); + countLayout.setMargin(false); + countLayout.setSpacing(false); + CssStyles.style(countLayout, CssStyles.getDiseaseColor(disease)); + countLayout.setHeight(40, Unit.PIXELS); + countLayout.setWidth(70, Unit.PIXELS); + + Label countLabel = new Label("", ContentMode.HTML); + String fontSize = casesCount.toString().length() < 5 ? "70px" : "50px"; + countLabel.setValue( + "
" + + casesCount.toString() + "
"); + + countLayout.addComponent(countLabel); + countLayout.setComponentAlignment(countLabel, Alignment.MIDDLE_CENTER); + +// HorizontalLayout comparisonLayout = new HorizontalLayout(); +// { +// comparisonLayout.setMargin(false); +// comparisonLayout.setSpacing(false); +// +// Label growthLabel = new Label("", ContentMode.HTML); +// String chevronType = ""; +// if (previousCasesCount < casesCount) { +// chevronType = VaadinIcons.CHEVRON_UP.getHtml(); +// } else if (previousCasesCount > casesCount) { +// chevronType = VaadinIcons.CHEVRON_DOWN.getHtml(); +// } else { +// chevronType = VaadinIcons.CHEVRON_RIGHT.getHtml(); +// } +// growthLabel.setValue( +// "
" +// + " " + chevronType + " " + "
"); +// +// comparisonLayout.addComponent(growthLabel); +// +// Label previousCountLabel = new Label(previousCasesCount.toString()); +// CssStyles.style(previousCountLabel, CssStyles.LABEL_WHITE, CssStyles.LABEL_BOLD, CssStyles.LABEL_XLARGE, CssStyles.HSPACE_LEFT_4); +// comparisonLayout.addComponent(previousCountLabel); +// comparisonLayout.setComponentAlignment(growthLabel, Alignment.MIDDLE_CENTER); +// comparisonLayout.setComponentAlignment(previousCountLabel, Alignment.MIDDLE_CENTER); +// } +// countLayout.addComponent(comparisonLayout); +// countLayout.setComponentAlignment(comparisonLayout, Alignment.MIDDLE_CENTER); + +// countLayout.setExpandRatio(countLabel, 0.4f); +// countLayout.setExpandRatio(comparisonLayout, 0.6f); + + layout.addComponent(countLayout); + layout.setComponentAlignment(countLayout, Alignment.BOTTOM_CENTER); + layout.setExpandRatio(countLayout, 0.65f); + + addComponent(layout); + } + + private void addStatsLayout(Long fatalities, Long totalCase, String outbreakDistrict, String district, Disease disease) { + VerticalLayout layout = new VerticalLayout(); + layout.setWidth(250, Unit.PIXELS); + layout.setHeight(120, Unit.PIXELS); + layout.setMargin(false); + layout.setSpacing(false); + + CssStyles.style(layout, CssStyles.getDiseaseColor(disease), CssStyles.BACKGROUND_DARKER); + float cfrPercent = calculateCfr(fatalities, totalCase); + + layout.addComponent(createDeathCfrItem(I18nProperties.getCaption(Captions.dashboardFatalities)+": ", + fatalities.toString()+"", fatalities > 0, + I18nProperties.getCaption(Captions.DiseaseBurden_caseFatalityRate)+": ", + String.valueOf(cfrPercent))); + + + HorizontalLayout statsItem = createStatsItem( + I18nProperties.getCaption(Captions.dashboardLastReportedDistrict) + ": ", + district.length() == 0 ? I18nProperties.getString(Strings.none) : district, + false, + district.length() > 10 + ); + + CssStyles.style(statsItem, CssStyles.VSPACE_TOP_4, CssStyles.LABEL_WHITE); + layout.addComponent(statsItem); + + statsItem = createStatsItem( + I18nProperties.getCaption(Captions.DiseaseBurden_outbreakDistrictCount)+": ", + outbreakDistrict.length() == 0 ? I18nProperties.getString(Strings.none) : outbreakDistrict, + false, + outbreakDistrict.length() > 10 + ); + + CssStyles.style(statsItem, CssStyles.VSPACE_4, CssStyles.LABEL_WHITE); + layout.addComponent(statsItem); + addComponent(layout); + } + + private HorizontalLayout createDeathCfrItem(String fatalityLabel, String fatalityValue, + boolean isCritical, String cfrLabel, String cfrValue ) { + HorizontalLayout layout = new HorizontalLayout(); + layout.setMargin(false); + layout.setSpacing(true); + + Label fatalityNameLabel = new Label("", ContentMode.HTML); + CssStyles.style(fatalityNameLabel, CssStyles.LABEL_WHITE, CssStyles.LABEL_PRIMARY, isCritical ? CssStyles.LABEL_CRITICAL : "", CssStyles.HSPACE_LEFT_3); + + fatalityNameLabel.setValue("
" + fatalityLabel + "
" + + "
" + fatalityValue+ "
"); + + layout.addComponent(fatalityNameLabel); + layout.setExpandRatio(fatalityNameLabel, 1); + + Label cfrNameLabel = new Label("", ContentMode.HTML); + CssStyles.style( + cfrNameLabel, + CssStyles.LABEL_WHITE, + CssStyles.LABEL_PRIMARY, + cfrValue.length() > 10 ? CssStyles.LABEL_SMALL : CssStyles.LABEL_WHITE, + isCritical ? CssStyles.LABEL_CRITICAL : ""); + + cfrNameLabel.setValue("
" + cfrLabel + "
" + + "
" + cfrValue + "
"); + + layout.addComponent(cfrNameLabel); + + return layout; + + } + + private HorizontalLayout createStatsItem(String label, String value, boolean isCritical, boolean singleColumn) { + HorizontalLayout layout = new HorizontalLayout(); + layout.setWidth(250, Unit.PIXELS); + layout.setMargin(false); + layout.setSpacing(false); + + Label nameLabel = new Label(label); + CssStyles.style( + nameLabel, + CssStyles.LABEL_WHITE, + CssStyles.LABEL_PRIMARY, isCritical ? CssStyles.LABEL_CRITICAL : "", + CssStyles.HSPACE_LEFT_3, + CssStyles.LABEL_IMPORTANT + ); + layout.addComponent(nameLabel); + + if (!singleColumn) { + layout.setExpandRatio(nameLabel, 1); + } + + Label valueLabel = new Label(value); + CssStyles.style( + valueLabel, + CssStyles.LABEL_WHITE, + CssStyles.LABEL_PRIMARY, + value.length() > 16 ? CssStyles.LABEL_SMALL : CssStyles.LABEL_WHITE, + isCritical ? CssStyles.LABEL_CRITICAL : "", + singleColumn ? CssStyles.HSPACE_LEFT_5 : CssStyles.ALIGN_CENTER); + + layout.addComponent(valueLabel); + + layout.setExpandRatio(valueLabel, singleColumn ? 1f : 0.65f); + layout.setComponentAlignment(valueLabel, Alignment.MIDDLE_CENTER); + return layout; + } + + private float calculateCfr(long fatalities, long totalCaseCount){ + if (fatalities == 0 ) + return 0; + return ((float) (fatalities/totalCaseCount) * 100); + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java new file mode 100644 index 00000000000..10c9c0e9b80 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java @@ -0,0 +1,62 @@ +package de.symeda.sormas.ui.dashboard.diseasedetails; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.ui.dashboard.AbstractDashboardView; +import de.symeda.sormas.ui.dashboard.DashboardType; +import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; +import de.symeda.sormas.ui.utils.ViewConfiguration; + +import static com.vaadin.navigator.ViewChangeListener.*; + +@SuppressWarnings("serial") +public class DiseaseDetailsView extends AbstractDashboardView { + + private static final long serialVersionUID = -1L; + public static final String VIEW_NAME = ROOT_VIEW_NAME + "/disease"; + + protected DiseaseDetailsViewLayout diseaseDetailsViewLayout; + private DiseaseDetailsComponent diseaseDetailsComponent; + //private RegionalDiseaseBurdenGrid regionalDiseaseBurdenGrid; + private ViewConfiguration viewConfiguration; + + public DiseaseDetailsView() { + super(VIEW_NAME); + filterLayout.setInfoLabelText(I18nProperties.getString(Strings.classificationForDisease)); + //filterLayout = new DashboardFilterLayout(this, dashboardDataProvider); + dashboardLayout.setSpacing(false); + + //Added Component + diseaseDetailsViewLayout = new DiseaseDetailsViewLayout(dashboardDataProvider); + dashboardLayout.addComponent(diseaseDetailsViewLayout); + dashboardLayout.setExpandRatio(diseaseDetailsViewLayout, 1); + + /*diseaseDetailsComponent = new DiseaseDetailsComponent(dashboardDataProvider); + dashboardLayout.addComponent(diseaseDetailsComponent); + dashboardLayout.setExpandRatio(diseaseDetailsComponent, 1); + + regionalDiseaseBurdenGrid = new RegionalDiseaseBurdenGrid(dashboardDataProvider); + dashboardLayout.addComponent(regionalDiseaseBurdenGrid); + dashboardLayout.setExpandRatio(regionalDiseaseBurdenGrid, 2);*/ + } + + @Override + public void refreshDiseaseData() { + super.refreshDiseaseData(); + /*if (diseaseDetailsComponent != null) + diseaseDetailsComponent.refresh();*/ + + if (diseaseDetailsViewLayout != null) + diseaseDetailsViewLayout.refresh(); + + } + + @Override + public void enter(ViewChangeEvent event) { + super.enter(event); + disease = Disease.valueOf(event.getParameters().toString()); + dashboardDataProvider.setDisease(Disease.valueOf(event.getParameters().toString())); + refreshDiseaseData(); + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java new file mode 100644 index 00000000000..0fbc18b35df --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java @@ -0,0 +1,128 @@ +package de.symeda.sormas.ui.dashboard.diseasedetails; + +import com.vaadin.ui.CustomLayout; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.disease.DiseaseBurdenDto; +import de.symeda.sormas.ui.dashboard.DashboardDataProvider; +import de.symeda.sormas.ui.dashboard.map.DashboardMapComponent; +import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.LayoutUtil; + +public class DiseaseDetailsViewLayout extends CustomLayout { + + private static final long serialVersionUID = 6582975657305031105L; + private static final String EXTEND_BUTTONS_LOC = "extendButtons"; + + private static final String CARD = "card"; + private static final String GRID_TABLE = "table"; + private static final String MAP = "map"; + + private final DashboardDataProvider dashboardDataProvider; + private DiseaseDetailsComponent diseaseDetailsComponent; + private RegionalDiseaseBurdenGrid regionalDiseaseBurdenGrid; + + public DiseaseDetailsViewLayout(DashboardDataProvider dashboardDataProvider) { + this.dashboardDataProvider = dashboardDataProvider; + setTemplateContents( + LayoutUtil.fluidRow( + LayoutUtil.fluidColumnLoc(3, 1, 0, 12, CARD), + LayoutUtil.fluidColumnLoc(8, 0, 0, 12, GRID_TABLE), + LayoutUtil.fluidColumnLoc(12, 0, 12, 6, MAP))); +// NOTE span is width size, offset is margin left + + diseaseDetailsComponent = new DiseaseDetailsComponent(dashboardDataProvider); + regionalDiseaseBurdenGrid = new RegionalDiseaseBurdenGrid(dashboardDataProvider); + reload(); + } + + public void refresh(){ + diseaseDetailsComponent.refresh(); + regionalDiseaseBurdenGrid.refresh(); + } + + public void reload() { +// Disease Card layout +// System.out.println("The disease clicked in is....:"+ diseasesBurden.getDisease()); +// DiseaseDetailsComponent diseaseCardLayout = new DiseaseDetailsComponent(dashboardDataProvider); +// DiseaseBurdenDto diseasesBurden = dashboardDataProvider.getDiseaseBurdenDetail(); +// DiseaseDetailsComponent diseaseCardLayout = new DiseaseDetailsComponent(diseasesBurden); +// addComponent(diseaseCardLayout, CARD); +// Label label = new Label("Outbreak.."); +// diseaseCardLayout.addComponent(label); +// addComponent(diseaseCardLayout, CARD); +// DiseaseDetailsComponent diseasesBurden = dashboardDataProvider.getDiseaseBurdenDetail(); +// DiseaseDetailsComponent diseasesBurden = DiseaseBurdenDto( +// Disease.AFP, +// Long.valueOf(120), +// Long.valueOf(350), +// Long.valueOf(100), +// Long.valueOf(30), +// Long.valueOf(50), +// "Some District here", +// 2145, +// null, +// null, +// 1154); + + HorizontalLayout diseaseCardLayout = new HorizontalLayout(); + diseaseCardLayout.addComponent(diseaseDetailsComponent); + addComponent(diseaseCardLayout, CARD); + +// Grid card layout + HorizontalLayout diseaseGridLayout = new HorizontalLayout(); + diseaseGridLayout.addComponent(regionalDiseaseBurdenGrid); + addComponent(diseaseGridLayout, GRID_TABLE); + +// Map layout +// HorizontalLayout mapLayout = new HorizontalLayout(); +// mapLayout.addComponent(mapVerticalLayout()); +// addComponent(mapLayout, MAP); + } + + private HorizontalLayout cardLayout(DiseaseBurdenDto diseaseBurdenDto) { + HorizontalLayout diseaseCaseCountLayout = new HorizontalLayout(); + Label title = new Label(diseaseBurdenDto.getDisease().getName()); + diseaseCaseCountLayout.addComponent(title); + + HorizontalLayout caseCountLayout = new HorizontalLayout(); + Label totalCaseCount = new Label(diseaseBurdenDto.getCaseCount().toString()); + CssStyles.style(totalCaseCount, CssStyles.H2, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + caseCountLayout.addComponent(totalCaseCount); + + HorizontalLayout layout = new HorizontalLayout(); + layout.addComponent(diseaseCaseCountLayout); + layout.addComponent(totalCaseCount); + + return layout; + } + + private HorizontalLayout gridTableLayout() { + HorizontalLayout tableLayout = new HorizontalLayout(); + tableLayout.setMargin(false); + tableLayout.setSpacing(false); + +// Label title = new Label(I18nProperties.getCaption(Strings.DiseaseNetworkDiagram_heading)); + Label labelGrid = new Label("Grid Table here"); + + tableLayout.addComponent(labelGrid); + addComponent(tableLayout); + return tableLayout; + } + + private HorizontalLayout mapVerticalLayout() { + HorizontalLayout mapLayout = new HorizontalLayout(); + mapLayout.setMargin(false); + mapLayout.setSpacing(false); + DashboardMapComponent dashboardMapComponent = new DashboardMapComponent(dashboardDataProvider); + dashboardMapComponent.addStyleName(CssStyles.SIDE_COMPONENT); + + mapLayout.addComponent(dashboardMapComponent); + + addComponent(mapLayout); + return mapLayout; + } + +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/sample/SampleDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/sample/SampleDashboardView.java index 87298e1949a..7b01cc9956a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/sample/SampleDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/sample/SampleDashboardView.java @@ -65,7 +65,7 @@ public class SampleDashboardView extends AbstractDashboardView { private final SampleDashboardMapComponent mapComponent; public SampleDashboardView() { - super(VIEW_NAME); + super(VIEW_NAME, DashboardType.SAMPLES); dashboardSwitcher.setValue(DashboardType.SAMPLES); dashboardSwitcher.addValueChangeListener(this::navigateToDashboardView); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java index f0be95f2988..90db0ad9283 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java @@ -36,7 +36,7 @@ public class SurveillanceDashboardView extends AbstractDashboardView { protected SurveillanceDiseaseCarouselLayout diseaseCarouselLayout; public SurveillanceDashboardView() { - super(VIEW_NAME); + super(VIEW_NAME, DashboardType.SURVEILLANCE); dashboardDataProvider = new DashboardDataProvider(); if (dashboardDataProvider.getDashboardType() == null) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java index 111d45b244f..ab53989f0f2 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java @@ -23,28 +23,139 @@ import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.*; +import com.vaadin.ui.themes.ValoTheme; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.ui.ControllerProvider; +import de.symeda.sormas.ui.dashboard.DashboardDataProvider; +import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.LayoutUtil; + +import java.util.List; public class DiseaseTileComponent extends VerticalLayout { +//import java.util.List; + +//public class DiseaseDetailsComponent extends VerticalLayout { +//public class DiseaseDetailsComponent extends CssLayout { private static final long serialVersionUID = 6582975657305031105L; - public DiseaseTileComponent(DiseaseBurdenDto diseaseBurden) { + + public static final String CARD_COUNT = "count"; + public static final String DISEASE_GRID = "grid"; + public static final String DISEASE_MAP = "diseasemap"; + private DashboardDataProvider dashboardDataProvider; + private List diseaseBurden; + + //public DiseaseDetailsComponent(DiseaseBurdenDto diseaseBurden) { +// public DiseaseDetailsComponent(DashboardDataProvider dashboardDataProvider) { +// setSizeFull(); +//// setMargin(false); +// this.dashboardDataProvider = dashboardDataProvider; +// } + +public DiseaseTileComponent(DiseaseBurdenDto diseaseBurden) { setMargin(false); setSpacing(false); addTopLayout( - diseaseBurden.getDisease(), - diseaseBurden.getCaseCount(), - diseaseBurden.getPreviousCaseCount(), - diseaseBurden.getOutbreakDistrictCount() > 0); + diseaseBurden.getDisease(), + diseaseBurden.getCaseCount(), + diseaseBurden.getPreviousCaseCount(), + diseaseBurden.getOutbreakDistrictCount() > 0); addStatsLayout(diseaseBurden.getCaseDeathCount(), diseaseBurden.getEventCount(), diseaseBurden.getLastReportedDistrictName()); + } + + public void refresh(){ + String htmlLayout = LayoutUtil.fluidRow( + LayoutUtil.fluidColumnLoc(8, 0, 12, 0, CARD_COUNT), + LayoutUtil.fluidColumnLoc(4, 0, 6, 0, DISEASE_GRID), + LayoutUtil.fluidColumnLoc(4, 0, 6, 0, DISEASE_MAP)); + + addTopLayout( + dashboardDataProvider.getDiseaseBurdenDetail().getDisease(), + dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getPreviousCaseCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getOutbreakDistrictCount() > 0); + + addStatsLayout( + dashboardDataProvider.getDiseaseBurdenDetail().getCaseDeathCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getEventCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getLastReportedDistrictName(), + dashboardDataProvider.getDiseaseBurdenDetail().getDisease() + ); + + } + + private void addStatsLayout(Long fatalities, Long events, String district, Disease disease) { + VerticalLayout layout = new VerticalLayout(); + layout.setWidth(100, Unit.PERCENTAGE); + layout.setMargin(false); + layout.setSpacing(false); + CssStyles.style(layout, CssStyles.BACKGROUND_HIGHLIGHT); + + HorizontalLayout statsItem = createStatsItem( + I18nProperties.getCaption(Captions.dashboardLastReport) + ": ", + district.length() == 0 ? I18nProperties.getString(Strings.none) : district, + false, + true); + CssStyles.style(statsItem, CssStyles.VSPACE_TOP_4); + layout.addComponent(statsItem); + layout.addComponent(createStatsItem(I18nProperties.getCaption(Captions.dashboardFatalities), fatalities.toString(), fatalities > 0, false)); + statsItem = createStatsItem(I18nProperties.getCaption(Captions.DiseaseBurden_eventCount), events.toString(), false, false); + CssStyles.style(statsItem, CssStyles.VSPACE_4); + layout.addComponent(statsItem); + + layout.addComponent(addDiseaseButton(disease)); + + addComponent(layout); + } + + private Button addDiseaseButton(Disease diseaseName) { + Button diseaseDetailButton = ButtonHelper + .createIconButton(null, VaadinIcons.ELLIPSIS_DOTS_H, null, ValoTheme.BUTTON_BORDERLESS, CssStyles.VSPACE_TOP_NONE, CssStyles.VSPACE_4); + diseaseDetailButton.setVisible(true); + diseaseDetailButton.addClickListener(click -> ControllerProvider.getDashboardController().navigateToDisease(diseaseName)); + +// Button diseaseDetailButton = ButtonHelper +// .createIconButton(null, VaadinIcons.ELLIPSIS_DOTS_H, null, ValoTheme.BUTTON_BORDERLESS, CssStyles.VSPACE_TOP_NONE, CssStyles.VSPACE_4); +// diseaseDetailButton.setVisible(true); +// layout.addComponent(diseaseDetailButton); +// diseaseDetailButton.addClickListener(click -> ControllerProvider.getDashboardController().navigateToDisease(disease.getName())); + + return diseaseDetailButton; + } + + private HorizontalLayout createStatsItem(String label, String value, boolean isCritical, boolean singleColumn) { + HorizontalLayout layout = new HorizontalLayout(); + layout.setWidth(100, Unit.PERCENTAGE); + layout.setMargin(false); + layout.setSpacing(false); + + Label nameLabel = new Label(label); + CssStyles.style(nameLabel, CssStyles.LABEL_PRIMARY, isCritical ? CssStyles.LABEL_CRITICAL : "", CssStyles.HSPACE_LEFT_3); + layout.addComponent(nameLabel); + if (!singleColumn) { + layout.setExpandRatio(nameLabel, 1); + } + + Label valueLabel = new Label(value); + CssStyles.style( + valueLabel, + CssStyles.LABEL_PRIMARY, + isCritical ? CssStyles.LABEL_CRITICAL : "", + singleColumn ? CssStyles.HSPACE_LEFT_5 : CssStyles.ALIGN_CENTER); + layout.addComponent(valueLabel); + layout.setExpandRatio(valueLabel, singleColumn ? 1f : 0.65f); + + return layout; } private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCount, boolean isOutbreak) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java new file mode 100644 index 00000000000..520d4fe4214 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -0,0 +1,151 @@ +package de.symeda.sormas.ui.dashboard.diseasedetails; + +import com.vaadin.data.provider.DataProvider; +import com.vaadin.icons.VaadinIcons; +import com.vaadin.v7.data.util.BeanItemContainer; +import com.vaadin.v7.data.util.GeneratedPropertyContainer; +import com.vaadin.v7.data.util.converter.StringToFloatConverter; +import com.vaadin.v7.ui.Grid; +import com.vaadin.v7.ui.renderers.HtmlRenderer; +import de.symeda.sormas.api.Language; +import de.symeda.sormas.api.disease.DiseaseBurdenDto; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.ui.dashboard.DashboardDataProvider; +import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.PercentageRenderer; + +import java.util.Locale; + +public class RegionalDiseaseBurdenGrid extends Grid { + private static final String VIEW_DETAILS_BTN_ID = "viewDetails"; + + DashboardDataProvider dashboardDataProvider; + + public RegionalDiseaseBurdenGrid(DashboardDataProvider dashboardDataProvider) { + this.dashboardDataProvider = dashboardDataProvider; +// setSizeFull(); + +// getColumn(DiseaseBurdenDto.CASES_DIFFERENCE_PERCENTAGE) +// .setHeaderCaption(I18nProperties.getPrefixCaption(DiseaseBurdenDto.I18N_PREFIX, DiseaseBurdenDto.CASES_DIFFERENCE)); + + // format columns +// getColumn(DiseaseBurdenDto.CASE_FATALITY_RATE).setRenderer(new PercentageRenderer()); + + // format casesGrowth column with chevrons + /*getColumn(DiseaseBurdenDto.CASES_DIFFERENCE_PERCENTAGE).setConverter(new StringToFloatConverter() { + + @Override + public String convertToPresentation(Float value, Class targetType, Locale locale) throws ConversionException { + + String stringRepresentation = super.convertToPresentation(value, targetType, locale); + String chevronType = ""; + String criticalLevel = ""; + + if (value > 0) { + chevronType = VaadinIcons.CHEVRON_UP.getHtml(); + criticalLevel = CssStyles.LABEL_CRITICAL; + } else if (value < 0) { + chevronType = VaadinIcons.CHEVRON_DOWN.getHtml(); + criticalLevel = CssStyles.LABEL_POSITIVE; + } else { + chevronType = VaadinIcons.CHEVRON_RIGHT.getHtml(); + criticalLevel = CssStyles.LABEL_IMPORTANT; + } + + String strValue = "" + Math.abs(value); + if (strValue.equals("100.0")) + strValue = "100"; +// or use below to remove insignificant decimals +// if (strValue.endsWith(".0")) +// strValue = strValue.substring(0, strValue.length() - 3); + + //@formatter:off + stringRepresentation = + "
" + + "
" + strValue + "%" + "
" + + "
" + + "" + chevronType + "" + + "
" + + "
"; + //@formatter:on + + return stringRepresentation; + } + }).setRenderer(new HtmlRenderer()); +*/ + + + } + + public void refresh(){ + BeanItemContainer container = new BeanItemContainer(DiseaseBurdenDto.class); + GeneratedPropertyContainer generatedContainer = new GeneratedPropertyContainer(container); + setContainerDataSource(generatedContainer); + + setColumns( + DiseaseBurdenDto.CASES_REGION, + DiseaseBurdenDto.CASE_COUNT, + DiseaseBurdenDto.CASES_ACTIVE_CASE, + DiseaseBurdenDto.CASES_RECOVERED_CASES, + DiseaseBurdenDto.CASE_DEATH_COUNT); + +// Language userLanguage = I18nProperties.getUserLanguage(); +// getColumn(DiseaseBurdenDto.CASES_RECOVERED_CASES); +// getColumn(DiseaseBurdenDto.CASES_ACTIVE_CASE); +// getColumn(DiseaseBurdenDto.CASE_DEATH_COUNT); +// getColumn(DiseaseBurdenDto.CASE_COUNT).setCaption(I18nProperties.getPrefixCaption(CaseIndexDto.I18N_PREFIX, CaseIndexDto.UUID)); +// getColumn(COLUMN_COMPLETENESS).setCaption(I18nProperties.getPrefixCaption(CaseIndexDto.I18N_PREFIX, CaseIndexDto.COMPLETENESS)); +// getColumn(COLUMN_COMPLETENESS).setSortable(false); + + for (Grid.Column column : getColumns()) { + if (column.getPropertyId().equals(VIEW_DETAILS_BTN_ID)) { + column.setHeaderCaption(""); + } else { + column.setHeaderCaption( + I18nProperties.getPrefixCaption(DiseaseBurdenDto.I18N_PREFIX, column.getPropertyId().toString(), column.getHeaderCaption())); + } + } + + setSelectionMode(Grid.SelectionMode.NONE); + } + +/* @SuppressWarnings("unchecked") + public void reload() { + + DataProvider dataProvider = (DataProvider) getDataProvider(); + TreeData data = dataProvider.getTreeData(); + data.clear(); + + if (hiddenUuidPairs == null) { + hiddenUuidPairs = new ArrayList<>(); + } + + List casePairs = FacadeProvider.getCaseFacade().getCasesForDuplicateMerging(criteria, ignoreRegion); + for (CaseIndexDto[] casePair : casePairs) { + boolean uuidPairExists = false; + for (String[] hiddenUuidPair : hiddenUuidPairs) { + if (hiddenUuidPair[0].equals(casePair[0].getUuid()) && hiddenUuidPair[1].equals(casePair[1].getUuid())) { + uuidPairExists = true; + } + } + + if (uuidPairExists) { + continue; + } + + data.addItem(null, casePair[0]); + data.addItem(casePair[0], casePair[1]); + } + dataCount = casePairs.size(); + + expandRecursively(data.getRootItems(), 0); + dataProvider.refreshAll(); + } + + public void reload(boolean ignoreRegion) { + this.ignoreRegion = ignoreRegion; + reload(); + }*/ +} From b79acd24a0e6adeaad7acab8bed5e9972162457b Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 11:20:10 +0000 Subject: [PATCH 02/71] Added the css for the card, grid table and map --- .../VAADIN/themes/sormas/views/disease.scss | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/views/disease.scss b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/views/disease.scss index bd44207e044..ce984e2a2e6 100644 --- a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/views/disease.scss +++ b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/views/disease.scss @@ -190,4 +190,59 @@ filled: #b0796b; } } + .disease-detail-card-display-top{ + display: inline-grid; + overflow: hidden; + } + + .disease-detail-card-display-down{ + display: block; + } + + .old-disease-detail-outbreak-display{ + text-align: center; + font-size: smaller; + font-weight: 700; + width: 100px; + background:#DE5555; + -ms-transform: rotate(-135deg); + -o-transform: rotate(-135deg); + -webkit-transform:rotate(45deg); + color: white; + transform-origin: bottom; + float: right; + margin-right: -57px; + margin-top: -7px; + } + + .map-border-layout .leaflet-container{ + border: 2px solid #CDD8EC; + } + + .container-death-cfr{ + width: 100%; + } + + .container-float-left{ + float: left; + display: inline-flex; + } + .container-float-right{ + float: right; + } + + .disease-detail-outbreak-display{ + text-align: center; + font-size: smaller; + font-weight: 700; + width: 100px; + background:#e33232; + -ms-transform: rotate(-135deg); + -o-transform: rotate(-135deg); + -webkit-transform:rotate(45deg); + color: white; + float: right; + margin-right: -57px; + margin-top: -7px; + } } \ No newline at end of file From 4a391198246c1819051a17ea3f4b80efcba69020 Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 11:21:22 +0000 Subject: [PATCH 03/71] Added and removed the required variables and constructors --- .../sormas/api/disease/DiseaseBurdenDto.java | 91 ++++++++----------- 1 file changed, 40 insertions(+), 51 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java index be03d1712f9..f86688f93ce 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java @@ -40,12 +40,14 @@ public class DiseaseBurdenDto implements Serializable { public static final String LAST_REPORTED_DISTRICT_NAME = "lastReportedDistrictName"; //Regional specific Disease Details + public static final String CASES_TOTAL = "total"; public static final String CASES_REGION = "region"; - public static final String CASES_ACTIVE_CASE = "caseActiveCases"; - public static final String CASES_RECOVERED_CASES = "caseRecoveredCase"; - public static final String CASES_DEATH_CASES = "caseDeathCase"; + public static final String ACTIVE_CASE = "activeCases"; + public static final String RECOVERED_CASES = "recovered"; + public static final String DEATH = "deaths"; private Disease disease; + private String total; private Long caseCount; private Long previousCaseCount; private Long eventCount; @@ -56,41 +58,28 @@ public class DiseaseBurdenDto implements Serializable { private Integer cfr; private String lastReportedDistrict; private String outbreakDistrict; - private Integer death; + private String deaths; private RegionDto region; - private Long caseRecoveredCase; - private Long caseActiveCases; + private String recovered; + private String activeCases; public DiseaseBurdenDto( - Disease disease, - Long caseCount, - Long previousCaseCount, - Long eventCount, - Long outbreakDistrictCount, - Long caseDeathCount, - String lastReportedDistrictName, - Integer cfr, - String lastReportedDistrict, - String outbreakDistrict, - Integer death) { - - this.disease = disease; - this.caseCount = caseCount; - this.previousCaseCount = previousCaseCount; - this.eventCount = eventCount; - this.outbreakDistrictCount = outbreakDistrictCount; - this.caseDeathCount = caseDeathCount; - this.lastReportedDistrictName = lastReportedDistrictName; + RegionDto regionDto, + String total, + String activeCases, + String recovered, + String deaths) { - this.cfr = cfr; - this.lastReportedDistrict = lastReportedDistrict; - this.outbreakDistrict = outbreakDistrict; - this.death = death; + this.region = regionDto; + this.total = total; + this.activeCases = activeCases; + this.recovered = recovered; + this.deaths = deaths; } + public DiseaseBurdenDto( - RegionDto regionDto, Disease disease, Long caseCount, Long previousCaseCount, @@ -98,12 +87,8 @@ public DiseaseBurdenDto( Long outbreakDistrictCount, Long caseDeathCount, String lastReportedDistrictName, - Integer cfr, - String lastReportedDistrict, - String outbreakDistrict, - Integer death) { + String outbreakDistrict) { - this.region = regionDto; this.disease = disease; this.caseCount = caseCount; this.previousCaseCount = previousCaseCount; @@ -111,11 +96,7 @@ public DiseaseBurdenDto( this.outbreakDistrictCount = outbreakDistrictCount; this.caseDeathCount = caseDeathCount; this.lastReportedDistrictName = lastReportedDistrictName; - - this.cfr = cfr; - this.lastReportedDistrict = lastReportedDistrict; this.outbreakDistrict = outbreakDistrict; - this.death = death; } public DiseaseBurdenDto( @@ -244,12 +225,12 @@ public void setOutbreakDistrict(String outbreakDistrict) { this.outbreakDistrict = outbreakDistrict; } - public Integer getDeath() { - return death; + public String getDeaths() { + return deaths; } - public void setDeath(Integer death) { - this.death = death; + public void setDeaths(String deaths) { + this.deaths = deaths; } public RegionDto getRegion() { @@ -260,19 +241,27 @@ public void setRegion(RegionDto region) { this.region = region; } - public Long getCaseRecoveredCase() { - return caseRecoveredCase; + public String getRecovered() { + return recovered; + } + + public void setRecovered(String recovered) { + this.recovered = recovered; + } + + public String getActiveCases() { + return activeCases; } - public void setCaseRecoveredCase(Long caseRecoveredCase) { - this.caseRecoveredCase = caseRecoveredCase; + public void setActiveCases(String activeCases) { + this.activeCases = activeCases; } - public Long getCaseActiveCases() { - return caseActiveCases; + public String getTotal() { + return total; } - public void setCaseActiveCases(Long caseActiveCases) { - this.caseActiveCases = caseActiveCases; + public void setTotal(String total) { + this.total = total; } } From 99fc961fff978a29983cf8e55d6108cbbe59143e Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 11:24:48 +0000 Subject: [PATCH 04/71] Added the facade for the implementation of the disease details and regional data grid From a578fbc9ffe0f5546b42c38ef56d391e0e17f74c Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 11:25:23 +0000 Subject: [PATCH 05/71] Added the Map component title#12880 --- sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index e54f53c6709..13cc88a499a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -443,6 +443,7 @@ public interface Strings { String headingCaseStatusMap = "headingCaseStatusMap"; String headingcasesWithReferenceDefinitionFulfilled = "headingcasesWithReferenceDefinitionFulfilled"; String headingCaution = "headingCaution"; + String headingDiseaseStatusMap = "headingDiseaseStatusMap"; String headingChangeCaseDisease = "headingChangeCaseDisease"; String headingChangePathogenTestResult = "headingChangePathogenTestResult"; String headingClinicalMeasurements = "headingClinicalMeasurements"; From b9d049efff979a8f1fde09fd2e8d89a517ea1bbc Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 11:35:35 +0000 Subject: [PATCH 06/71] Added and called the disease name from the caption properties file#12880 --- .../src/main/java/de/symeda/sormas/api/i18n/Captions.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java index 749f8e43d68..8c773c7dfb6 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java @@ -851,6 +851,8 @@ public interface Captions { String dashboardDead = "dashboardDead"; String dashboardDiscarded = "dashboardDiscarded"; String dashboardDiseaseBurdenInfo = "dashboardDiseaseBurdenInfo"; + String dashboardRegionalDiseaseBurden = "dashboardRegionalDiseaseBurden"; + String diseaseDetailMap = "diseaseDetailMap"; String dashboardDiseaseBurdenOutbreakDistricts = "dashboardDiseaseBurdenOutbreakDistricts"; String dashboardDiseaseCarouselSlideShow = "dashboardDiseaseCarouselSlideShow"; String dashboardDiseaseDifference = "dashboardDiseaseDifference"; @@ -2760,6 +2762,7 @@ public interface Captions { String View_dashboard_samples = "View.dashboard.samples"; String View_dashboard_surveillance = "View.dashboard.surveillance"; String View_environments = "View.environments"; + String View_dashboard_disease = "View.dashboard.disease"; String View_events = "View.events"; String View_events_archive = "View.events.archive"; String View_events_data = "View.events.data"; @@ -2801,6 +2804,7 @@ public interface Captions { String Visit_visitStatus = "Visit.visitStatus"; String Visit_visitUser = "Visit.visitUser"; String visitNewVisit = "visitNewVisit"; + String viewMore = "viewMore"; String WeeklyReport_epiWeek = "WeeklyReport.epiWeek"; String WeeklyReport_year = "WeeklyReport.year"; String WeeklyReportEntry_numberOfCases = "WeeklyReportEntry.numberOfCases"; From 588f9547fab0ab67e7b72542865c860f959f6159 Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 11:36:10 +0000 Subject: [PATCH 07/71] Added the disease details needed by the components#12880 --- sormas-api/src/main/resources/captions.properties | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index 1658b19e9b3..0301f49da70 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -897,6 +897,8 @@ dashboardData=Data dashboardDead=Dead dashboardDiscarded=Discarded dashboardDiseaseBurdenInfo=Disease Burden Information +dashboardRegionalDiseaseBurden=Regional Disease Burden +diseaseDetailMap=Disease Detail Map dashboardDiseaseBurdenOutbreakDistricts=Outbreak Districts dashboardDiseaseCarouselSlideShow=slide show dashboardDiseaseDifference=Difference in Number of Cases @@ -2694,6 +2696,8 @@ View.dashboard.contacts=Contacts Dashboard View.dashboard.surveillance=Surveillance Dashboard View.dashboard.campaigns=Campaigns Dashboard View.dashboard.samples=Samples Dashboard +View.dashboard.disease=Disease Dashboard + View.events=Event Directory View.events.archive=Event Archive View.events.data=Event Information @@ -2722,6 +2726,8 @@ View.shareRequests=Share directory View.environments=Environment directory # Visit visitNewVisit=New visit +viewMore=View More + Visit=Visit Visit.person=Visited person Visit.symptoms=Symptoms From 36a5a8d752e95061e4f16b28dbd554babd3d67fd Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 11:37:01 +0000 Subject: [PATCH 08/71] added a function to get all regions --- .../infrastructure/region/RegionFacade.java | 3 +++ .../region/RegionFacadeEjb.java | 26 +++++++++++++++++++ .../tile/RegionalDiseaseBurdenGrid.java | 4 +-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java index 4b44e5a9267..eac6fea7b97 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java @@ -47,4 +47,7 @@ public interface RegionFacade extends GeoLocationFacade getNamesByIds(List regionIds); boolean isUsedInOtherInfrastructureData(Collection regionUuids); + + List getAllRegion(); + } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java index 054e93df790..b6e824dec45 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java @@ -338,6 +338,32 @@ protected void resetDefaultInfrastructure() { defaultInfrastructureCache.resetDefaultRegion(); } + @Override + public List getAllRegion() { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(RegionDto.class); + Root region = cq.from(Region.class); + + selectDtoFields(cq, region); + + return em.createQuery(cq).getResultList(); + } + + // Need to be in the same order as in the constructor + private void selectDtoFields(CriteriaQuery cq, Root root) { + + cq.multiselect( + root.get(Region.CREATION_DATE), + root.get(Region.CHANGE_DATE), + root.get(Region.UUID), + root.get(Region.ARCHIVED), + root.get(Region.NAME), + root.get(Region.EPID_CODE), + root.get(Region.GROWTH_RATE), + root.get(Region.EXTERNAL_ID)); + } + @LocalBean @Stateless public static class RegionFacadeEjbLocal extends RegionFacadeEjb { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java index 520d4fe4214..950a4c1a1fc 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -87,8 +87,8 @@ public void refresh(){ setColumns( DiseaseBurdenDto.CASES_REGION, DiseaseBurdenDto.CASE_COUNT, - DiseaseBurdenDto.CASES_ACTIVE_CASE, - DiseaseBurdenDto.CASES_RECOVERED_CASES, + DiseaseBurdenDto.ACTIVE_CASE, + DiseaseBurdenDto.RECOVERED_CASES, DiseaseBurdenDto.CASE_DEATH_COUNT); // Language userLanguage = I18nProperties.getUserLanguage(); From 252873c59a3c6d10a129da384c1724d01f1f5b6c Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 11:40:53 +0000 Subject: [PATCH 09/71] Added the implementation to get outbreak district name#12880 --- .../backend/outbreak/OutbreakFacadeEjb.java | 9 +++++ .../backend/outbreak/OutbreakService.java | 34 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java index 93010b391b3..7b75de33bef 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java @@ -38,6 +38,9 @@ import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.backend.infrastructure.district.DistrictFacadeEjb; import de.symeda.sormas.backend.infrastructure.district.DistrictService; +import de.symeda.sormas.backend.region.District; +import de.symeda.sormas.backend.region.DistrictFacadeEjb; +import de.symeda.sormas.backend.region.DistrictService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb; import de.symeda.sormas.backend.user.UserService; @@ -196,6 +199,12 @@ public static OutbreakDto toDto(Outbreak source) { @RightsAllowed({ UserRight._DASHBOARD_SURVEILLANCE_VIEW, UserRight._DASHBOARD_CONTACT_VIEW }) + public Map getOutbreakDistrictNameByDisease(OutbreakCriteria criteria) { + User user = userService.getCurrentUser(); + + return outbreakService.getOutbreakDistrictNameByDisease(criteria, user); + } + public Map getOutbreakDistrictCountByDisease(OutbreakCriteria criteria) { User user = userService.getCurrentUser(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java index ba46f41b664..3a8abadeb2e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java @@ -18,6 +18,7 @@ package de.symeda.sormas.backend.outbreak; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -200,6 +201,39 @@ public Predicate buildCriteriaFilter(OutbreakCriteria criteria, CriteriaBuilder return filter; } + public Map getOutbreakDistrictNameByDisease(OutbreakCriteria criteria, User user) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Object[].class); + Root outbreak = cq.from(Outbreak.class); + Join districtJoin = outbreak.join(Case.DISTRICT, JoinType.LEFT); + + Predicate filter = this.buildCriteriaFilter(criteria, cb, outbreak); + filter = and(cb, filter, createUserFilter(cb, cq, outbreak)); + + if (filter != null) + cq.where(filter); + + + Expression maxReportDate = cb.max(outbreak.get(Outbreak.REPORT_DATE)); + cq.multiselect(outbreak.get(Outbreak.DISEASE), districtJoin, maxReportDate); + cq.groupBy(outbreak.get(Outbreak.DISEASE), districtJoin); + cq.orderBy(cb.desc(maxReportDate)); + + List results = em.createQuery(cq).getResultList(); + + Map outbreaksDistrict = new HashMap<>(); //results.stream().collect(Collectors.toMap(e -> (Disease) e[0], e -> (String) e[1])); + + for (Object[] e : results) { + Disease disease = (Disease) e[0]; + if (!outbreaksDistrict.containsKey(disease)) { + District district = (District) e[1]; + outbreaksDistrict.put(disease, district); + } + } + return outbreaksDistrict; + } + public Map getOutbreakDistrictCountByDisease(OutbreakCriteria criteria, User user) { CriteriaBuilder cb = em.getCriteriaBuilder(); From 35de9e640ff8b8b67835520af770dea38c035575 Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 11:52:33 +0000 Subject: [PATCH 10/71] Removed this class because it was not used From 6659db00b6a4e7b0683210a8ca63310634e74c87 Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 12:44:04 +0000 Subject: [PATCH 11/71] Added the implementation that will be used by the disease dashboard#12880 --- .../backend/outbreak/OutbreakFacadeEjb.java | 5 ++- .../backend/outbreak/OutbreakService.java | 29 +++++++++-------- .../ui/dashboard/AbstractDashboardView.java | 8 ++--- .../components/DashboardFilterLayout.java | 32 +++++++++++++++++++ 4 files changed, 53 insertions(+), 21 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java index 7b75de33bef..dc82cbbd8be 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java @@ -36,11 +36,10 @@ import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.SortProperty; +import de.symeda.sormas.backend.infrastructure.district.District; import de.symeda.sormas.backend.infrastructure.district.DistrictFacadeEjb; import de.symeda.sormas.backend.infrastructure.district.DistrictService; -import de.symeda.sormas.backend.region.District; -import de.symeda.sormas.backend.region.DistrictFacadeEjb; -import de.symeda.sormas.backend.region.DistrictService; + import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb; import de.symeda.sormas.backend.user.UserService; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java index 3a8abadeb2e..8cb65948b11 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java @@ -36,6 +36,7 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import de.symeda.sormas.backend.caze.Case; import org.apache.commons.collections.CollectionUtils; import de.symeda.sormas.api.Disease; @@ -49,6 +50,8 @@ import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.util.QueryHelper; +import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; + @Stateless @LocalBean public class OutbreakService extends AdoServiceWithUserFilterAndJurisdiction { @@ -72,7 +75,7 @@ public List queryByCriteria(OutbreakCriteria criteria, User user, Stri Predicate filter = createUserFilter(cb, cq, from); Predicate activeDiseasePredicate = cb.exists(diseaseConfigurationService.existActiveDisease(cq, cb, from, Outbreak.DISEASE)); - filter = CriteriaBuilderHelper.and(cb, filter, buildCriteriaFilter(criteria, cb, from), activeDiseasePredicate); + filter = and(cb, filter, buildCriteriaFilter(criteria, cb, from), activeDiseasePredicate); if (filter != null) { cq.where(filter); @@ -108,7 +111,7 @@ public List queryByCriteria(OutbreakCriteria criteria, Integer first, } Predicate filter = createUserFilter(cb, cq, outbreak); - filter = CriteriaBuilderHelper.and(cb, filter, buildCriteriaFilter(criteria, cb, outbreak)); + filter = and(cb, filter, buildCriteriaFilter(criteria, cb, outbreak)); if (filter != null) { cq.where(filter); } @@ -130,7 +133,7 @@ public List queryUuidByCriteria(OutbreakCriteria criteria, User user, St } Predicate filter = createUserFilter(cb, cq, from); - filter = CriteriaBuilderHelper.and(cb, filter, buildCriteriaFilter(criteria, cb, from)); + filter = and(cb, filter, buildCriteriaFilter(criteria, cb, from)); if (filter != null) { cq.where(filter); } @@ -146,7 +149,7 @@ public Long countByCriteria(OutbreakCriteria criteria, User user) { Root from = cq.from(getElementClass()); Predicate filter = createUserFilter(cb, cq, from); - filter = CriteriaBuilderHelper.and(cb, filter, buildCriteriaFilter(criteria, cb, from)); + filter = and(cb, filter, buildCriteriaFilter(criteria, cb, from)); if (filter != null) { cq.where(filter); } @@ -167,17 +170,16 @@ public Predicate buildCriteriaFilter(OutbreakCriteria criteria, CriteriaBuilder Predicate filter = null; if (criteria.getChangeDateAfter() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, createChangeDateFilter(cb, from, criteria.getChangeDateAfter())); + filter = and(cb, filter, createChangeDateFilter(cb, from, criteria.getChangeDateAfter())); } if (CollectionUtils.isNotEmpty(criteria.getDiseases())) { - filter = CriteriaBuilderHelper.and(cb, filter, from.get(Outbreak.DISEASE).in(criteria.getDiseases())); + filter = and(cb, filter, from.get(Outbreak.DISEASE).in(criteria.getDiseases())); } if (criteria.getDistrict() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.equal(from.join(Outbreak.DISTRICT, JoinType.LEFT).get(District.UUID), criteria.getDistrict().getUuid())); + filter = and(cb, filter, cb.equal(from.join(Outbreak.DISTRICT, JoinType.LEFT).get(District.UUID), criteria.getDistrict().getUuid())); } if (criteria.getRegion() != null) { - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, cb.equal( @@ -191,11 +193,10 @@ public Predicate buildCriteriaFilter(OutbreakCriteria criteria, CriteriaBuilder if (Boolean.FALSE.equals(criteria.getActive())) { activeFilter = cb.not(activeFilter); } - filter = CriteriaBuilderHelper.and(cb, filter, activeFilter); + filter = and(cb, filter, activeFilter); } if (criteria.getReportedDateFrom() != null || criteria.getReportedDateTo() != null) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.between(from.get(Outbreak.REPORT_DATE), criteria.getReportedDateFrom(), criteria.getReportedDateTo())); + filter = and(cb, filter, cb.between(from.get(Outbreak.REPORT_DATE), criteria.getReportedDateFrom(), criteria.getReportedDateTo())); } return filter; @@ -243,7 +244,7 @@ public Map getOutbreakDistrictCountByDisease(OutbreakCriteria cri cq.groupBy(outbreak.get(Outbreak.DISEASE)); Predicate filter = this.buildCriteriaFilter(criteria, cb, outbreak); - filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(cb, cq, outbreak)); + filter = and(cb, filter, createUserFilter(cb, cq, outbreak)); if (filter != null) cq.where(filter); @@ -263,7 +264,7 @@ public Long getOutbreakDistrictCount(OutbreakCriteria criteria, User user) { cq.groupBy(regionJoin); Predicate filter = this.buildCriteriaFilter(criteria, cb, outbreak); - filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(cb, cq, outbreak)); + filter = and(cb, filter, createUserFilter(cb, cq, outbreak)); if (filter != null) cq.where(filter); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java index 680c2dc1456..5f66306b683 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java @@ -68,9 +68,6 @@ protected AbstractDashboardView(String viewName, DashboardType dashboardType) { dashboardDataProvider.setDisease(FacadeProvider.getDiseaseConfigurationFacade().getDefaultDisease()); } if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) { -// dashboardDataProvider.setDisease(FacadeProvider.getDiseaseConfigurationFacade().getDefaultDisease()); - System.out.println("Getting getDiseases: " + getDiseases()); - dashboardDataProvider.setDisease(getDiseases()); } @@ -206,7 +203,10 @@ public void refreshDiseaseData() { @Override public void enter(ViewChangeEvent event) { - refreshDashboard(); + if (!DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) +// refreshDiseaseData(); +// else + refreshDashboard(); } //public abstract void refreshDashboard(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java index b02129431a3..187c86f1282 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java @@ -296,6 +296,10 @@ private HorizontalLayout createDateFilterButtonsLayout() { setDateFilter(from, to); btnCurrentPeriod.setCaption(btnToday.getCaption()); updateComparisonButtons(DateFilterType.TODAY, from, to, false); + if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) + dashboardView.refreshDiseaseData(); + else + dashboardView.refreshDashboard(); }); btnYesterday = createAndAddDateFilterButton( @@ -311,6 +315,10 @@ private HorizontalLayout createDateFilterButtonsLayout() { setDateFilter(from, to); btnCurrentPeriod.setCaption(btnYesterday.getCaption()); updateComparisonButtons(DateFilterType.YESTERDAY, from, to, false); + if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) + dashboardView.refreshDiseaseData(); + else + dashboardView.refreshDashboard(); }); btnThisWeek = createAndAddDateFilterButton( @@ -327,6 +335,10 @@ private HorizontalLayout createDateFilterButtonsLayout() { setDateFilter(from, to); btnCurrentPeriod.setCaption(btnThisWeek.getCaption()); updateComparisonButtons(DateFilterType.THIS_WEEK, from, to, false); + if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) + dashboardView.refreshDiseaseData(); + else + dashboardView.refreshDashboard(); }); btnLastWeek = createAndAddDateFilterButton( @@ -343,6 +355,10 @@ private HorizontalLayout createDateFilterButtonsLayout() { setDateFilter(from, to); btnCurrentPeriod.setCaption(btnLastWeek.getCaption()); updateComparisonButtons(DateFilterType.LAST_WEEK, from, to, false); + if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) + dashboardView.refreshDiseaseData(); + else + dashboardView.refreshDashboard(); }); btnThisYear = createAndAddDateFilterButton( @@ -359,6 +375,10 @@ private HorizontalLayout createDateFilterButtonsLayout() { setDateFilter(from, to); btnCurrentPeriod.setCaption(btnThisYear.getCaption()); updateComparisonButtons(DateFilterType.THIS_YEAR, from, to, false); + if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) + dashboardView.refreshDiseaseData(); + else + dashboardView.refreshDashboard(); }); layout.addComponents(btnShowCustomPeriod, btnToday, btnYesterday, btnThisWeek, btnLastWeek, btnThisYear); @@ -430,6 +450,10 @@ private HorizontalLayout createCustomDateFilterLayout() { + DateHelper.getEpiWeekYearBefore(toWeek).toShortString())); } updateComparisonButtons(DateFilterType.CUSTOM, null, null, true); + if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) + dashboardView.refreshDiseaseData(); + else + dashboardView.refreshDashboard(); } else { if (dateFilterOption == DateFilterOption.DATE) { new Notification( @@ -460,6 +484,10 @@ private Component createDateComparisonButtonsLayout() { activeComparisonButton = btnPeriodBefore; updateComparisonDates(); btnComparisonPeriod.setCaption(btnPeriodBefore.getCaption()); + if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) + dashboardView.refreshDiseaseData(); + else + dashboardView.refreshDashboard(); }); btnPeriodLastYear = createAndAddDateFilterButton(Captions.dashboardSameDayLastYear, null, dateComparisonButtons); @@ -467,6 +495,10 @@ private Component createDateComparisonButtonsLayout() { activeComparisonButton = btnPeriodLastYear; updateComparisonDates(); btnComparisonPeriod.setCaption(btnPeriodLastYear.getCaption()); + if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) + dashboardView.refreshDiseaseData(); + else + dashboardView.refreshDashboard(); }); layout.addComponents(btnPeriodBefore, btnPeriodLastYear); From f0fc2bd40d512ce2aef16f7564460f1ad1143e2c Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 12:45:22 +0000 Subject: [PATCH 12/71] Removed and added implementation that will be applicable for the disease dashboard#12880 --- .../DiseaseDetailsViewLayout.java | 5 +- .../dashboard/map/DashboardMapComponent.java | 119 +++++++++++++++--- 2 files changed, 102 insertions(+), 22 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java index 0fbc18b35df..c7774fab6e5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java @@ -4,7 +4,6 @@ import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; -import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.map.DashboardMapComponent; @@ -22,7 +21,7 @@ public class DiseaseDetailsViewLayout extends CustomLayout { private final DashboardDataProvider dashboardDataProvider; private DiseaseDetailsComponent diseaseDetailsComponent; - private RegionalDiseaseBurdenGrid regionalDiseaseBurdenGrid; + private de.symeda.sormas.ui.dashboard.diseasedetails.RegionalDiseaseBurdenGrid regionalDiseaseBurdenGrid; public DiseaseDetailsViewLayout(DashboardDataProvider dashboardDataProvider) { this.dashboardDataProvider = dashboardDataProvider; @@ -34,7 +33,7 @@ public DiseaseDetailsViewLayout(DashboardDataProvider dashboardDataProvider) { // NOTE span is width size, offset is margin left diseaseDetailsComponent = new DiseaseDetailsComponent(dashboardDataProvider); - regionalDiseaseBurdenGrid = new RegionalDiseaseBurdenGrid(dashboardDataProvider); + regionalDiseaseBurdenGrid = new de.symeda.sormas.ui.dashboard.diseasedetails.RegionalDiseaseBurdenGrid(dashboardDataProvider); reload(); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index 0ddd890c1ad..fa02300cc31 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -17,29 +17,18 @@ *******************************************************************************/ package de.symeda.sormas.ui.dashboard.map; +import static de.symeda.sormas.api.i18n.Captions.UserRole; import static java.util.Objects.nonNull; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.function.Consumer; import com.vaadin.icons.VaadinIcons; import com.vaadin.server.ExternalResource; import com.vaadin.shared.ui.ContentMode; -import com.vaadin.ui.AbstractOrderedLayout; -import com.vaadin.ui.Alignment; -import com.vaadin.ui.Component; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Image; -import com.vaadin.ui.Label; -import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.Window; +import com.vaadin.ui.*; import com.vaadin.v7.shared.ui.grid.HeightMode; import com.vaadin.v7.ui.CheckBox; import com.vaadin.v7.ui.OptionGroup; @@ -57,6 +46,7 @@ import de.symeda.sormas.api.dashboard.DashboardEventDto; import de.symeda.sormas.api.event.EventStatus; import de.symeda.sormas.api.geo.GeoLatLon; +import de.symeda.sormas.api.geo.GeoShapeProvider; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; @@ -66,16 +56,16 @@ import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.user.DefaultUserRole; +import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DataHelper.Pair; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.DashboardType; -import de.symeda.sormas.ui.map.LeafletMapUtil; -import de.symeda.sormas.ui.map.LeafletMarker; -import de.symeda.sormas.ui.map.LeafletPolygon; -import de.symeda.sormas.ui.map.MarkerIcon; +import de.symeda.sormas.ui.map.*; +import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.VaadinUiUtil; @@ -126,6 +116,46 @@ public DashboardMapComponent(DashboardDataProvider dashboardDataProvider) { dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE ? Strings.headingCaseStatusMap : Strings.headingContactMap, dashboardDataProvider, null); + + //this.dashboardDataProvider = dashboardDataProvider; + + setMargin(false); + setSpacing(false); + setSizeFull(); + + map = new LeafletMap(); + + map.setSizeFull(); + map.addMarkerClickListener(event -> onMarkerClicked(event.getGroupId(), event.getMarkerIndex())); + + { + + GeoShapeProvider geoShapeProvider = FacadeProvider.getGeoShapeProvider(); + + final GeoLatLon mapCenter; + //if (UserProvider.getCurrent().hasAnyUserRole(DefaultUserRole.NATIONAL_USER, DefaultUserRole.NATIONAL_CLINICIAN, DefaultUserRole.NATIONAL_OBSERVER)) { + mapCenter = geoShapeProvider.getCenterOfAllRegions(); + + //} else { + UserDto user = UserProvider.getCurrent().getUser(); + +// if (user.getRegion() != null) { +// mapCenter = geoShapeProvider.getCenterOfRegion(user.getRegion()); +// } else { +// mapCenter = geoShapeProvider.getCenterOfAllRegions(); +// } + // } + + GeoLatLon center = Optional.ofNullable(mapCenter).orElseGet(FacadeProvider.getConfigFacade()::getCountryCenter); + + if (center == null || (center.getLat() == 0.0 && center.getLon() == 0)) { + center = new GeoLatLon(8.134, 1.423); + } + map.setCenter(center); + } + + map.setZoom(FacadeProvider.getConfigFacade().getMapZoom()); + } @Override @@ -137,7 +167,8 @@ protected void addComponents() { showEvents = false; showConfirmedContacts = true; showUnconfirmedContacts = true; - } else if (dashboardDataProvider.getDashboardType() == DashboardType.CONTACTS) { + } + else if (dashboardDataProvider.getDashboardType() == DashboardType.CONTACTS) { showCases = false; caseClassificationOption = MapCaseClassificationOption.ALL_CASES; showContacts = true; @@ -146,6 +177,15 @@ protected void addComponents() { showUnconfirmedContacts = true; } + else if (dashboardDataProvider.getDashboardType() == DashboardType.DISEASE) { + map.setZoom(6); + showCases = true; + caseClassificationOption = MapCaseClassificationOption.ALL_CASES; + showContacts = false; + showEvents = false; + showConfirmedContacts = true; + showUnconfirmedContacts = true; + } hideOtherCountries = false; showCurrentEpiSituation = false; @@ -400,6 +440,47 @@ protected void addLayerOptions(VerticalLayout layersLayout) { layersLayout.addComponent(showCurrentEpiSituationCB); } + private HorizontalLayout createHeader() { + HorizontalLayout mapHeaderLayout = new HorizontalLayout(); + mapHeaderLayout.setWidth(100, Unit.PERCENTAGE); + mapHeaderLayout.setSpacing(true); + CssStyles.style(mapHeaderLayout, CssStyles.VSPACE_4); + + Label mapLabel = new Label(); + if (dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE) { + mapLabel.setValue(I18nProperties.getString(Strings.headingCaseStatusMap)); + CssStyles.style(mapLabel, CssStyles.H2, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + }else if (dashboardDataProvider.getDashboardType() == DashboardType.DISEASE) { + mapLabel.setValue(I18nProperties.getCaption(Captions.diseaseDetailMap)); + CssStyles.style(mapLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_NONE); + } + else { + mapLabel.setValue(I18nProperties.getString(Strings.headingContactMap)); + CssStyles.style(mapLabel, CssStyles.H2, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + } + mapLabel.setSizeUndefined(); + + mapHeaderLayout.addComponent(mapLabel); + mapHeaderLayout.setComponentAlignment(mapLabel, Alignment.BOTTOM_LEFT); + mapHeaderLayout.setExpandRatio(mapLabel, 1); + + // "Expand" and "Collapse" buttons + Button expandMapButton = + ButtonHelper.createIconButtonWithCaption("expandMap", "", VaadinIcons.EXPAND, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); + Button collapseMapButton = + ButtonHelper.createIconButtonWithCaption("collapseMap", "", VaadinIcons.COMPRESS, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); + + expandMapButton.addClickListener(e -> { + externalExpandListener.accept(true); + mapHeaderLayout.removeComponent(expandMapButton); + mapHeaderLayout.addComponent(collapseMapButton); + mapHeaderLayout.setComponentAlignment(collapseMapButton, Alignment.MIDDLE_RIGHT); + }); + + + return mapHeaderLayout; + } + @Override protected List getLegendComponents() { List legendComponents = new ArrayList<>(); From 4be4a4545dab3e7112de3024c0409db3fa423358 Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 13:15:57 +0000 Subject: [PATCH 13/71] Removed the redundant codes#12880 --- .../diseasedetails/DiseaseDetailsView.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java index 10c9c0e9b80..cd6d5281e4a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java @@ -31,31 +31,18 @@ public DiseaseDetailsView() { diseaseDetailsViewLayout = new DiseaseDetailsViewLayout(dashboardDataProvider); dashboardLayout.addComponent(diseaseDetailsViewLayout); dashboardLayout.setExpandRatio(diseaseDetailsViewLayout, 1); - - /*diseaseDetailsComponent = new DiseaseDetailsComponent(dashboardDataProvider); - dashboardLayout.addComponent(diseaseDetailsComponent); - dashboardLayout.setExpandRatio(diseaseDetailsComponent, 1); - - regionalDiseaseBurdenGrid = new RegionalDiseaseBurdenGrid(dashboardDataProvider); - dashboardLayout.addComponent(regionalDiseaseBurdenGrid); - dashboardLayout.setExpandRatio(regionalDiseaseBurdenGrid, 2);*/ } @Override public void refreshDiseaseData() { super.refreshDiseaseData(); - /*if (diseaseDetailsComponent != null) - diseaseDetailsComponent.refresh();*/ - if (diseaseDetailsViewLayout != null) diseaseDetailsViewLayout.refresh(); - } @Override public void enter(ViewChangeEvent event) { super.enter(event); - disease = Disease.valueOf(event.getParameters().toString()); dashboardDataProvider.setDisease(Disease.valueOf(event.getParameters().toString())); refreshDiseaseData(); } From 61d689ee5c4a0274ffe57becc47cc24662b721cb Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 13:17:24 +0000 Subject: [PATCH 14/71] Made modification to the regional graph table#12880 --- .../DiseaseDetailsViewLayout.java | 5 +- .../tile/RegionalDiseaseBurdenGrid.java | 217 ++++++++---------- 2 files changed, 103 insertions(+), 119 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java index c7774fab6e5..55c5bd1abf1 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java @@ -7,6 +7,7 @@ import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.map.DashboardMapComponent; +import de.symeda.sormas.ui.dashboard.surveillance.components.disease.tile.RegionalDiseaseBurdenGrid; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.LayoutUtil; @@ -21,7 +22,7 @@ public class DiseaseDetailsViewLayout extends CustomLayout { private final DashboardDataProvider dashboardDataProvider; private DiseaseDetailsComponent diseaseDetailsComponent; - private de.symeda.sormas.ui.dashboard.diseasedetails.RegionalDiseaseBurdenGrid regionalDiseaseBurdenGrid; + private RegionalDiseaseBurdenGrid regionalDiseaseBurdenGrid; public DiseaseDetailsViewLayout(DashboardDataProvider dashboardDataProvider) { this.dashboardDataProvider = dashboardDataProvider; @@ -33,7 +34,7 @@ public DiseaseDetailsViewLayout(DashboardDataProvider dashboardDataProvider) { // NOTE span is width size, offset is margin left diseaseDetailsComponent = new DiseaseDetailsComponent(dashboardDataProvider); - regionalDiseaseBurdenGrid = new de.symeda.sormas.ui.dashboard.diseasedetails.RegionalDiseaseBurdenGrid(dashboardDataProvider); + regionalDiseaseBurdenGrid = new RegionalDiseaseBurdenGrid(dashboardDataProvider); reload(); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java index 950a4c1a1fc..33ab9f59f14 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -1,151 +1,134 @@ -package de.symeda.sormas.ui.dashboard.diseasedetails; +package de.symeda.sormas.ui.dashboard.surveillance.components.disease.tile; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.icons.VaadinIcons; import com.vaadin.v7.data.util.BeanItemContainer; import com.vaadin.v7.data.util.GeneratedPropertyContainer; -import com.vaadin.v7.data.util.converter.StringToFloatConverter; +import com.vaadin.v7.shared.ui.grid.ColumnResizeMode; import com.vaadin.v7.ui.Grid; import com.vaadin.v7.ui.renderers.HtmlRenderer; -import de.symeda.sormas.api.Language; +import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.disease.DiseaseBurdenDto; +import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; -import de.symeda.sormas.ui.utils.CssStyles; -import de.symeda.sormas.ui.utils.PercentageRenderer; -import java.util.Locale; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; public class RegionalDiseaseBurdenGrid extends Grid { - private static final String VIEW_DETAILS_BTN_ID = "viewDetails"; - DashboardDataProvider dashboardDataProvider; + private final DashboardDataProvider dashboardDataProvider; + private final List regionDtoList; + Grid.Column regionColumn; + Grid.Column totalColumn; + Grid.Column activeCaseColumn; + Grid.Column recoveredCasesColumn; + Grid.Column deathColumn; + private final DecimalFormat decimalFormat; public RegionalDiseaseBurdenGrid(DashboardDataProvider dashboardDataProvider) { this.dashboardDataProvider = dashboardDataProvider; -// setSizeFull(); - -// getColumn(DiseaseBurdenDto.CASES_DIFFERENCE_PERCENTAGE) -// .setHeaderCaption(I18nProperties.getPrefixCaption(DiseaseBurdenDto.I18N_PREFIX, DiseaseBurdenDto.CASES_DIFFERENCE)); - - // format columns -// getColumn(DiseaseBurdenDto.CASE_FATALITY_RATE).setRenderer(new PercentageRenderer()); - - // format casesGrowth column with chevrons - /*getColumn(DiseaseBurdenDto.CASES_DIFFERENCE_PERCENTAGE).setConverter(new StringToFloatConverter() { - - @Override - public String convertToPresentation(Float value, Class targetType, Locale locale) throws ConversionException { - - String stringRepresentation = super.convertToPresentation(value, targetType, locale); - String chevronType = ""; - String criticalLevel = ""; - - if (value > 0) { - chevronType = VaadinIcons.CHEVRON_UP.getHtml(); - criticalLevel = CssStyles.LABEL_CRITICAL; - } else if (value < 0) { - chevronType = VaadinIcons.CHEVRON_DOWN.getHtml(); - criticalLevel = CssStyles.LABEL_POSITIVE; - } else { - chevronType = VaadinIcons.CHEVRON_RIGHT.getHtml(); - criticalLevel = CssStyles.LABEL_IMPORTANT; - } - - String strValue = "" + Math.abs(value); - if (strValue.equals("100.0")) - strValue = "100"; -// or use below to remove insignificant decimals -// if (strValue.endsWith(".0")) -// strValue = strValue.substring(0, strValue.length() - 3); - - //@formatter:off - stringRepresentation = - "
" - + "
" + strValue + "%" + "
" - + "
" - + "" + chevronType + "" - + "
" - + "
"; - //@formatter:on - - return stringRepresentation; - } - }).setRenderer(new HtmlRenderer()); -*/ + regionDtoList = FacadeProvider.getRegionFacade().getAllRegion(); + setCaption(I18nProperties.getCaption(Captions.dashboardRegionalDiseaseBurden)); - - } - - public void refresh(){ - BeanItemContainer container = new BeanItemContainer(DiseaseBurdenDto.class); - GeneratedPropertyContainer generatedContainer = new GeneratedPropertyContainer(container); - setContainerDataSource(generatedContainer); + decimalFormat = new DecimalFormat("0.00"); + setColumnReorderingAllowed(true); + setWidthFull(); + setWidth(800, Unit.PIXELS); setColumns( DiseaseBurdenDto.CASES_REGION, - DiseaseBurdenDto.CASE_COUNT, + DiseaseBurdenDto.CASES_TOTAL, DiseaseBurdenDto.ACTIVE_CASE, DiseaseBurdenDto.RECOVERED_CASES, - DiseaseBurdenDto.CASE_DEATH_COUNT); - -// Language userLanguage = I18nProperties.getUserLanguage(); -// getColumn(DiseaseBurdenDto.CASES_RECOVERED_CASES); -// getColumn(DiseaseBurdenDto.CASES_ACTIVE_CASE); -// getColumn(DiseaseBurdenDto.CASE_DEATH_COUNT); -// getColumn(DiseaseBurdenDto.CASE_COUNT).setCaption(I18nProperties.getPrefixCaption(CaseIndexDto.I18N_PREFIX, CaseIndexDto.UUID)); -// getColumn(COLUMN_COMPLETENESS).setCaption(I18nProperties.getPrefixCaption(CaseIndexDto.I18N_PREFIX, CaseIndexDto.COMPLETENESS)); -// getColumn(COLUMN_COMPLETENESS).setSortable(false); - - for (Grid.Column column : getColumns()) { - if (column.getPropertyId().equals(VIEW_DETAILS_BTN_ID)) { - column.setHeaderCaption(""); - } else { - column.setHeaderCaption( - I18nProperties.getPrefixCaption(DiseaseBurdenDto.I18N_PREFIX, column.getPropertyId().toString(), column.getHeaderCaption())); - } - } + DiseaseBurdenDto.DEATH + ); + + regionColumn = getColumn(DiseaseBurdenDto.CASES_REGION); + totalColumn = getColumn(DiseaseBurdenDto.CASES_TOTAL); + activeCaseColumn = getColumn(DiseaseBurdenDto.ACTIVE_CASE); + recoveredCasesColumn = getColumn(DiseaseBurdenDto.RECOVERED_CASES); + deathColumn = getColumn(DiseaseBurdenDto.DEATH); + } + public void refresh(){ + setColumnResizeMode(ColumnResizeMode.ANIMATED); setSelectionMode(Grid.SelectionMode.NONE); + + reload(); } -/* @SuppressWarnings("unchecked") public void reload() { + List diseaseBurdenDtoList = new ArrayList<>(); + Long casePercental = dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(); + + regionColumn.setWidth(100); + totalColumn.setRenderer(new HtmlRenderer()).setWidth(180); + activeCaseColumn.setRenderer(new HtmlRenderer()).setWidth(180); + recoveredCasesColumn.setRenderer(new HtmlRenderer()).setWidth(180); + deathColumn.setRenderer(new HtmlRenderer()).setWidth(180); + + for (RegionDto regionDto : regionDtoList){ + DiseaseBurdenDto diseaseBurdenDto = FacadeProvider.getDiseaseFacade().getDiseaseGridForDashboard( + regionDto.toReference(), + null, + dashboardDataProvider.getDisease(), + dashboardDataProvider.getFromDate(), + dashboardDataProvider.getToDate(), + dashboardDataProvider.getPreviousFromDate(), + dashboardDataProvider.getPreviousToDate()); + + diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(diseaseBurdenDto.getTotal()), casePercental, "#5a95f4bf","#2f7df9")); + diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(diseaseBurdenDto.getActiveCases()), casePercental, "#feba0199", "#dfa507")); + diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(diseaseBurdenDto.getRecovered()), casePercental, "#00e0a19c", "#038d66")); + diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(diseaseBurdenDto.getDeaths()), casePercental,"#bf8678ba", "#91675d")); + + diseaseBurdenDtoList.add(diseaseBurdenDto); + } + BeanItemContainer container = new BeanItemContainer(DiseaseBurdenDto.class, diseaseBurdenDtoList); + GeneratedPropertyContainer generatedContainer = new GeneratedPropertyContainer(container); + setContainerDataSource(generatedContainer); + } - DataProvider dataProvider = (DataProvider) getDataProvider(); - TreeData data = dataProvider.getTreeData(); - data.clear(); + public String makeDIvs(long number, long total, String lightColor, String deepColor) { - if (hiddenUuidPairs == null) { - hiddenUuidPairs = new ArrayList<>(); - } + if (number == 0 && total == 0) + return ("0.0%"); + + String mainStyle = "text-align: center; height:15px; width: 100%; background:"+lightColor; + String progressPercentStyle = "position: absolute; width: 20%; color: #ffffff; font-weight: 700; margin: -1px;"; + double regionalTotal = (double)number/total * 100; + +// String textColor = regionalTotal > 10 ? "#ffffff" : "#000000"; + String textColor = "#ffffff"; + + String style = "height:15px; width:"+ decimalFormat.format(regionalTotal)+"%; color:"+textColor+"; font-size: 10px;"+"background:"+deepColor; + String content = decimalFormat.format(regionalTotal) +"%"; + +// return "
" + "
"; + return "
" + + decimalFormat.format(regionalTotal)+"%
" + + element("div" , style, null) + "
"; - List casePairs = FacadeProvider.getCaseFacade().getCasesForDuplicateMerging(criteria, ignoreRegion); - for (CaseIndexDto[] casePair : casePairs) { - boolean uuidPairExists = false; - for (String[] hiddenUuidPair : hiddenUuidPairs) { - if (hiddenUuidPair[0].equals(casePair[0].getUuid()) && hiddenUuidPair[1].equals(casePair[1].getUuid())) { - uuidPairExists = true; - } - } - - if (uuidPairExists) { - continue; - } - - data.addItem(null, casePair[0]); - data.addItem(casePair[0], casePair[1]); +// return "
" + element("div" , style, content) + "
"; + } + + public String element(String type, String style, String content) { + StringBuilder sb = new StringBuilder(); + sb.append("<").append(type); + if (style != null) { + sb.append(" style='").append(style).append("'"); } - dataCount = casePairs.size(); + sb.append(">"); + + if (content != null) + sb.append(content); + + sb.append(""); + + return sb.toString(); - expandRecursively(data.getRootItems(), 0); - dataProvider.refreshAll(); } - public void reload(boolean ignoreRegion) { - this.ignoreRegion = ignoreRegion; - reload(); - }*/ } From 723b707a608bb701d45b9c36428dbc30dc5911b6 Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 13:17:24 +0000 Subject: [PATCH 15/71] Made modification to the regional graph table From 78094634cc3dcdaec3c438f94b72fc8f21afeae4 Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 13:18:45 +0000 Subject: [PATCH 16/71] Made modifications to the Disease detail layout, thus with their positions and size#12880 --- .../DiseaseDetailsViewLayout.java | 154 +++++++++--------- 1 file changed, 79 insertions(+), 75 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java index 55c5bd1abf1..acc6d15bcd7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java @@ -1,128 +1,132 @@ package de.symeda.sormas.ui.dashboard.diseasedetails; -import com.vaadin.ui.CustomLayout; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Label; +import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.ui.*; import de.symeda.sormas.api.disease.DiseaseBurdenDto; +import de.symeda.sormas.api.i18n.Captions; +import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.map.DashboardMapComponent; import de.symeda.sormas.ui.dashboard.surveillance.components.disease.tile.RegionalDiseaseBurdenGrid; +import de.symeda.sormas.ui.dashboard.map.MapCaseDisplayMode; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.LayoutUtil; +import java.util.function.Consumer; + public class DiseaseDetailsViewLayout extends CustomLayout { private static final long serialVersionUID = 6582975657305031105L; - private static final String EXTEND_BUTTONS_LOC = "extendButtons"; private static final String CARD = "card"; private static final String GRID_TABLE = "table"; + private static final String GRID_VIEW_MORE = "viewMore"; private static final String MAP = "map"; private final DashboardDataProvider dashboardDataProvider; - private DiseaseDetailsComponent diseaseDetailsComponent; - private RegionalDiseaseBurdenGrid regionalDiseaseBurdenGrid; + private final DiseaseDetailsComponent diseaseDetailsComponent; + private final RegionalDiseaseBurdenGrid regionalDiseaseBurdenGrid; + private final DashboardMapComponent dashboardMapComponent; + private boolean isShowMore; + private Button button; public DiseaseDetailsViewLayout(DashboardDataProvider dashboardDataProvider) { this.dashboardDataProvider = dashboardDataProvider; +// this.setWidthFull(); +// this.setSizeFull(); + setWidth(100, Unit.PERCENTAGE); setTemplateContents( LayoutUtil.fluidRow( - LayoutUtil.fluidColumnLoc(3, 1, 0, 12, CARD), - LayoutUtil.fluidColumnLoc(8, 0, 0, 12, GRID_TABLE), - LayoutUtil.fluidColumnLoc(12, 0, 12, 6, MAP))); -// NOTE span is width size, offset is margin left + LayoutUtil.fluidColumnLoc(2, 0, 0, 0, CARD), + LayoutUtil.fluidColumnLoc(7, 1, 0, 0, GRID_TABLE), + LayoutUtil.fluidColumnLoc(6, 4, 0, 0, GRID_VIEW_MORE), + LayoutUtil.fluidColumnLoc(12, 0, 5, 0, MAP) + + ) + ); //NOTE span is heigth size, offset is row down + + isShowMore = false; diseaseDetailsComponent = new DiseaseDetailsComponent(dashboardDataProvider); regionalDiseaseBurdenGrid = new RegionalDiseaseBurdenGrid(dashboardDataProvider); + dashboardMapComponent = new DashboardMapComponent(dashboardDataProvider); + reload(); } - public void refresh(){ + public void refresh() { + diseaseDetailsComponent.removeAllComponents(); diseaseDetailsComponent.refresh(); regionalDiseaseBurdenGrid.refresh(); + dashboardMapComponent.refreshMap(); } public void reload() { -// Disease Card layout -// System.out.println("The disease clicked in is....:"+ diseasesBurden.getDisease()); -// DiseaseDetailsComponent diseaseCardLayout = new DiseaseDetailsComponent(dashboardDataProvider); -// DiseaseBurdenDto diseasesBurden = dashboardDataProvider.getDiseaseBurdenDetail(); -// DiseaseDetailsComponent diseaseCardLayout = new DiseaseDetailsComponent(diseasesBurden); -// addComponent(diseaseCardLayout, CARD); -// Label label = new Label("Outbreak.."); -// diseaseCardLayout.addComponent(label); -// addComponent(diseaseCardLayout, CARD); -// DiseaseDetailsComponent diseasesBurden = dashboardDataProvider.getDiseaseBurdenDetail(); -// DiseaseDetailsComponent diseasesBurden = DiseaseBurdenDto( -// Disease.AFP, -// Long.valueOf(120), -// Long.valueOf(350), -// Long.valueOf(100), -// Long.valueOf(30), -// Long.valueOf(50), -// "Some District here", -// 2145, -// null, -// null, -// 1154); - +// Disease Card Layout HorizontalLayout diseaseCardLayout = new HorizontalLayout(); + diseaseCardLayout.setWidth(50, Unit.PERCENTAGE); + diseaseCardLayout.setMargin(true); + diseaseCardLayout.setSpacing(true); diseaseCardLayout.addComponent(diseaseDetailsComponent); addComponent(diseaseCardLayout, CARD); // Grid card layout HorizontalLayout diseaseGridLayout = new HorizontalLayout(); - diseaseGridLayout.addComponent(regionalDiseaseBurdenGrid); + diseaseGridLayout.setWidth(400, Unit.PIXELS); + regionalDiseaseBurdenGrid.setHeight(320, Unit.PIXELS); + diseaseGridLayout.setMargin(false); + diseaseGridLayout.setSpacing(false); + diseaseGridLayout.addComponents(regionalDiseaseBurdenGrid); addComponent(diseaseGridLayout, GRID_TABLE); -// Map layout -// HorizontalLayout mapLayout = new HorizontalLayout(); -// mapLayout.addComponent(mapVerticalLayout()); -// addComponent(mapLayout, MAP); - } - - private HorizontalLayout cardLayout(DiseaseBurdenDto diseaseBurdenDto) { - HorizontalLayout diseaseCaseCountLayout = new HorizontalLayout(); - Label title = new Label(diseaseBurdenDto.getDisease().getName()); - diseaseCaseCountLayout.addComponent(title); + viewMoreLayout(I18nProperties.getCaption(Captions.viewMore)); + button.addClickListener(event -> { + if(!isShowMore) { + regionalDiseaseBurdenGrid.setHeight(750, Unit.PIXELS); + isShowMore = true; + }else { + regionalDiseaseBurdenGrid.setHeight(320, Unit.PIXELS); + isShowMore = false; + } + }); - HorizontalLayout caseCountLayout = new HorizontalLayout(); - Label totalCaseCount = new Label(diseaseBurdenDto.getCaseCount().toString()); - CssStyles.style(totalCaseCount, CssStyles.H2, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); - caseCountLayout.addComponent(totalCaseCount); - - HorizontalLayout layout = new HorizontalLayout(); - layout.addComponent(diseaseCaseCountLayout); - layout.addComponent(totalCaseCount); +// Map layout + HorizontalLayout mapLayout = new HorizontalLayout(); + mapLayout.setWidth(100, Unit.PERCENTAGE); + final int BASE_HEIGHT = 600; + mapLayout.setHeight(BASE_HEIGHT, Unit.PIXELS); +// mapLayout.setMargin(true); + mapLayout.setSpacing(false); - return layout; + dashboardMapComponent.setMargin(false); + dashboardMapComponent.setSpacing(false); + mapLayout.setMargin(new MarginInfo(true, true, false, true)); + dashboardMapComponent.addStyleName("map-border-layout"); + mapLayout.addComponent(dashboardMapComponent); + addComponent(mapLayout, MAP); } - private HorizontalLayout gridTableLayout() { - HorizontalLayout tableLayout = new HorizontalLayout(); - tableLayout.setMargin(false); - tableLayout.setSpacing(false); - -// Label title = new Label(I18nProperties.getCaption(Strings.DiseaseNetworkDiagram_heading)); - Label labelGrid = new Label("Grid Table here"); - - tableLayout.addComponent(labelGrid); - addComponent(tableLayout); - return tableLayout; + public void removeTopComponents() { + removeAllComponents(); } - private HorizontalLayout mapVerticalLayout() { - HorizontalLayout mapLayout = new HorizontalLayout(); - mapLayout.setMargin(false); - mapLayout.setSpacing(false); - DashboardMapComponent dashboardMapComponent = new DashboardMapComponent(dashboardDataProvider); - dashboardMapComponent.addStyleName(CssStyles.SIDE_COMPONENT); + public void addMapComponent() { + addComponent(dashboardMapComponent, "1"); - mapLayout.addComponent(dashboardMapComponent); - - addComponent(mapLayout); - return mapLayout; } + public HorizontalLayout viewMoreLayout(String title){ + HorizontalLayout viewMoreLayout = new HorizontalLayout(); + viewMoreLayout.setMargin(false); + viewMoreLayout.setSpacing(false); + button = new Button(title); + viewMoreLayout.setHeight(5, Unit.PIXELS); + button.setHeight(30, Unit.PIXELS); + viewMoreLayout.addComponent(button); + viewMoreLayout.setComponentAlignment(button, Alignment.TOP_CENTER); + addComponent(viewMoreLayout, GRID_VIEW_MORE); + + return viewMoreLayout; + } } From 438a61e815abc827cbd1740c0d88a1f144c67f8a Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 13:24:59 +0000 Subject: [PATCH 17/71] Added the needed functions and variables --- .../ui/dashboard/DashboardDataProvider.java | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) 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 cee6d25abf5..788f0fd3358 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 @@ -27,6 +27,7 @@ import de.symeda.sormas.api.caze.CaseCriteria; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import org.apache.commons.lang3.time.DateUtils; @@ -42,6 +43,8 @@ import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.event.EventStatus; import de.symeda.sormas.api.outbreak.OutbreakCriteria; + +import de.symeda.sormas.api.sample.DashboardTestResultDto; import de.symeda.sormas.api.sample.PathogenTestResultType; // FIXME: 06/08/2020 this should be refactored into two specific data providers for case and contact dashboards @@ -79,6 +82,9 @@ public class DashboardDataProvider extends AbstractDashboardDataProvider testResultCountByResultType; + private List testResults = new ArrayList<>(); + private List previousTestResults = new ArrayList<>(); + private List regionDtoList; public void refreshData() { @@ -96,8 +102,6 @@ protected DashboardCriteria newCriteria() { return new DashboardCriteria(); } public void refreshDiseaseData() { - System.out.println("Dashboard data provider on refreshDiseaseData=:" + disease); - setDiseaseBurdenDetail( FacadeProvider.getDiseaseFacade().getDiseaseForDashboard(region, district, disease, fromDate, toDate, previousFromDate, previousToDate)); @@ -231,14 +235,12 @@ public void refreshDataForSelectedDisease() { caseCriteria.newCaseDateBetween(previousFromDate, previousToDate, NewCaseDateType.MOST_RELEVANT); setPreviousCases(FacadeProvider.getCaseFacade().getCasesForDashboard(caseCriteria)); - if (getDashboardType() != DashboardType.CONTACTS) { - if (getCases().size() > 0) { - setTestResultCountByResultType( - FacadeProvider.getSampleFacade() - .getNewTestResultCountByResultType(getCases().stream().map(c -> c.getId()).collect(Collectors.toList()))); - } else { - setTestResultCountByResultType(new HashMap<>()); - } + if (getCases().size() > 0) { + setTestResultCountByResultType( + FacadeProvider.getSampleFacade() + .getNewTestResultCountByResultType(getCases().stream().map(c -> c.getId()).collect(Collectors.toList()))); + } else { + setTestResultCountByResultType(new HashMap<>()); } } @@ -332,8 +334,6 @@ public void setPreviousContacts(List previousContacts) { } public List getDiseasesBurden() { - System.out.println("DashboardDataProvider am i getting from getDiseasesBurden(): " + diseasesBurden); - return diseasesBurden; } @@ -342,7 +342,6 @@ public void setDiseasesBurden(List diseasesBurden) { } public DiseaseBurdenDto getDiseaseBurdenDetail() { - System.out.println("What am i getting from getDiseaseBurdenDetail(): " + diseaseBurdenDetail); return diseaseBurdenDetail; } @@ -432,4 +431,11 @@ public Long getCaseWithReferenceDefinitionFulfilledCount() { public void setCaseWithReferenceDefinitionFulfilledCount(Long caseWithReferenceDefinitionFulfilledCount) { this.caseWithReferenceDefinitionFulfilledCount = caseWithReferenceDefinitionFulfilledCount; } + public List getRegionDtoList() { + return regionDtoList; + } + + public void setRegionDtoList(List regionDtoList) { + this.regionDtoList = regionDtoList; + } } From 4b3f6d8adf0c9f6f89afcb90f8d2352bc2aaa563 Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 13:25:44 +0000 Subject: [PATCH 18/71] Modified the disease card component#12880 --- .../DiseaseDetailsComponent.java | 154 ++++++++++++------ 1 file changed, 104 insertions(+), 50 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java index 1317f972cc9..84ec62e1713 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java @@ -23,10 +23,25 @@ public class DiseaseDetailsComponent extends CssLayout { private static final long serialVersionUID = 1L; private DashboardDataProvider dashboardDataProvider; - private List diseaseBurden; private String outbreakDivStyles; - public DiseaseDetailsComponent(DashboardDataProvider dashboardDataProvider) { + public DashboardDataProvider getDashboardDataProvider() { + return dashboardDataProvider; + } + + public void setDashboardDataProvider(DashboardDataProvider dashboardDataProvider) { + this.dashboardDataProvider = dashboardDataProvider; + } + + public String getOutbreakDivStyles() { + return outbreakDivStyles; + } + + public void setOutbreakDivStyles(String outbreakDivStyles) { + this.outbreakDivStyles = outbreakDivStyles; + } + + public DiseaseDetailsComponent(DashboardDataProvider dashboardDataProvider) { this.dashboardDataProvider = dashboardDataProvider; addStyleName("disease-detail-card-display-top"); @@ -36,55 +51,73 @@ public DiseaseDetailsComponent(DashboardDataProvider dashboardDataProvider) { "color: white; transform-origin: bottom; float: right; margin-right: -150px; margin-top: -10px;"; } - public void refresh(){ - addTopLayout( - dashboardDataProvider.getDiseaseBurdenDetail().getDisease(), - dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), - dashboardDataProvider.getDiseaseBurdenDetail().getPreviousCaseCount(), - dashboardDataProvider.getDiseaseBurdenDetail().getOutbreakDistrictCount() > 0); - - addStatsLayout( - dashboardDataProvider.getDiseaseBurdenDetail().getCaseDeathCount(), - dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), - dashboardDataProvider.getDiseaseBurdenDetail().getOutbreakDistrict(), - dashboardDataProvider.getDiseaseBurdenDetail().getLastReportedDistrictName(), - dashboardDataProvider.getDiseaseBurdenDetail().getDisease()); - } - - private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCount, boolean isOutbreak) { - VerticalLayout layout = new VerticalLayout(); - layout.setMargin(true); - layout.setSpacing(false); - CssStyles.style(layout, CssStyles.getDiseaseColor(disease)); - layout.setHeight(200, Unit.PIXELS); - layout.setWidth(250, Unit.PIXELS); - HorizontalLayout nameAndOutbreakLayout = new HorizontalLayout(); - nameAndOutbreakLayout.setMargin(false); - nameAndOutbreakLayout.setSpacing(false); - nameAndOutbreakLayout.setHeight(90, Unit.PIXELS); - nameAndOutbreakLayout.setWidth(200, Unit.PIXELS); - - HorizontalLayout nameLayout = new HorizontalLayout(); - nameLayout.setMargin(false); - nameLayout.setSpacing(false); - nameLayout.setHeight(50, Unit.PIXELS); - nameLayout.setWidth(200, Unit.PIXELS); - Label nameLabel = new Label(disease.toShortString()); - nameLabel.setSizeUndefined(); - nameLabel.setHeight(20, Unit.PIXELS); - - CssStyles.style( - nameLabel, - CssStyles.LABEL_WHITE, - nameLabel.getValue().length() > 12 ? CssStyles.LABEL_SMALL : CssStyles.LABEL_WHITE, - CssStyles.LABEL_LARGE, - CssStyles.ALIGN_CENTER, - CssStyles.LABEL_UPPERCASE); - nameLayout.addComponent(nameLabel); - nameLayout.setComponentAlignment(nameLabel, Alignment.MIDDLE_CENTER); - nameAndOutbreakLayout.addComponent(nameLayout); - nameAndOutbreakLayout.setExpandRatio(nameLayout, 1); + public void refresh(){ + addTopLayout( + dashboardDataProvider.getDiseaseBurdenDetail().getDisease(), + dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getPreviousCaseCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getOutbreakDistrictCount() > 0); + + addStatsLayout( + dashboardDataProvider.getDiseaseBurdenDetail().getCaseDeathCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getOutbreakDistrict(), + dashboardDataProvider.getDiseaseBurdenDetail().getLastReportedDistrictName(), + dashboardDataProvider.getDiseaseBurdenDetail().getDisease()); + } + + private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCount, boolean isOutbreak) { + VerticalLayout layout = new VerticalLayout(); + layout.setMargin(true); + layout.setSpacing(false); + CssStyles.style(layout, CssStyles.getDiseaseColor(disease)); + layout.setHeight(200, Unit.PIXELS); + layout.setWidth(250, Unit.PIXELS); + + HorizontalLayout nameAndOutbreakLayout = new HorizontalLayout(); + nameAndOutbreakLayout.setMargin(false); + nameAndOutbreakLayout.setSpacing(false); + nameAndOutbreakLayout.setHeight(90, Unit.PIXELS); + nameAndOutbreakLayout.setWidth(200, Unit.PIXELS); + + HorizontalLayout nameLayout = new HorizontalLayout(); + nameLayout.setMargin(false); + nameLayout.setSpacing(false); + nameLayout.setHeight(50, Unit.PIXELS); + nameLayout.setWidth(200, Unit.PIXELS); + Label nameLabel = new Label(disease.toShortString()); + nameLabel.setSizeUndefined(); + nameLabel.setHeight(20, Unit.PIXELS); + + CssStyles.style( + nameLabel, + CssStyles.LABEL_WHITE, + nameLabel.getValue().length() > 12 ? CssStyles.LABEL_SMALL : CssStyles.LABEL_WHITE, + CssStyles.LABEL_LARGE, + CssStyles.ALIGN_CENTER, + CssStyles.LABEL_UPPERCASE); + nameLayout.addComponent(nameLabel); + nameLayout.setComponentAlignment(nameLabel, Alignment.MIDDLE_CENTER); + nameAndOutbreakLayout.addComponent(nameLayout); + nameAndOutbreakLayout.setExpandRatio(nameLayout, 1); + + if (isOutbreak) { + HorizontalLayout outbreakLayout = new HorizontalLayout(); + outbreakLayout.setMargin(false); + outbreakLayout.setSpacing(false); + outbreakLayout.setHeight(15, Unit.PIXELS); + outbreakLayout.setWidth(100, Unit.PIXELS); +// Label outbreakLabel = new Label("",ContentMode.HTML); + Label outbreakLabel = new Label(I18nProperties.getCaption(Captions.dashboardOutbreak).toUpperCase(), ContentMode.HTML); + outbreakLabel.setStyleName("disease-detail-outbreak-display", true); +// outbreakLabel.setValue("
" + I18nProperties.getCaption(Captions.dashboardOutbreak).toUpperCase() + "
"); +// outbreakLabel.setStyleName("disease-detail-outbreak-display", true); +// CssStyles.style(outbreakLabel, CssStyles.LABEL_WHITE, CssStyles.ALIGN_CENTER, CssStyles.LABEL_UPPERCASE); + outbreakLayout.addComponent(outbreakLabel); +// outbreakLayout.setComponentAlignment(outbreakLabel, Alignment.BOTTOM_RIGHT); + nameAndOutbreakLayout.addComponent(outbreakLayout); + } if (isOutbreak) { HorizontalLayout outbreakLayout = new HorizontalLayout(); @@ -161,6 +194,27 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo addComponent(layout); } + // HorizontalLayout countLayout = new HorizontalLayout(); + // countLayout.setMargin(false); + // countLayout.setSpacing(false); + // CssStyles.style(countLayout, CssStyles.getDiseaseColor(disease)); + // countLayout.setHeight(40, Unit.PIXELS); + // countLayout.setWidth(70, Unit.PIXELS); + + // Label countLabel = new Label("", ContentMode.HTML); + // String fontSize = casesCount.toString().length() < 5 ? "70px" : "50px"; + // countLabel.setValue( + // "
" + // + casesCount.toString() + "
"); + + // countLayout.addComponent(countLabel); + // countLayout.setComponentAlignment(countLabel, Alignment.MIDDLE_CENTER); + + + + // layout.addComponent(countLayout); + // layout.setComponentAlignment(countLayout, Alignment.BOTTOM_CENTER); + // layout.setExpandRatio(countLayout, 0.65f); private void addStatsLayout(Long fatalities, Long totalCase, String outbreakDistrict, String district, Disease disease) { VerticalLayout layout = new VerticalLayout(); From cc440f279d4740d9555d09c1a28d6468ae4227a7 Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 13:27:47 +0000 Subject: [PATCH 19/71] Added the function to communicate with the appropriate classes#12880 --- .../backend/disease/DiseaseFacadeEjb.java | 103 ++++++++++++++---- 1 file changed, 82 insertions(+), 21 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java index 797a1ccb084..f35d1690174 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java @@ -27,18 +27,27 @@ import javax.ejb.Stateless; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.EntityRelevanceStatus; +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseCriteria; +import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.caze.CaseOutcome; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.disease.DiseaseFacade; import de.symeda.sormas.api.event.EventCriteria; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.outbreak.OutbreakCriteria; +import de.symeda.sormas.api.person.PresentCondition; + import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal; import de.symeda.sormas.backend.disease.DiseaseConfigurationFacadeEjb.DiseaseConfigurationFacadeEjbLocal; import de.symeda.sormas.backend.event.EventFacadeEjb.EventFacadeEjbLocal; import de.symeda.sormas.backend.infrastructure.district.District; +import de.symeda.sormas.backend.infrastructure.region.RegionFacadeEjb; import de.symeda.sormas.backend.outbreak.OutbreakFacadeEjb.OutbreakFacadeEjbLocal; import de.symeda.sormas.backend.person.PersonFacadeEjb.PersonFacadeEjbLocal; @@ -56,6 +65,9 @@ public class DiseaseFacadeEjb implements DiseaseFacade { private OutbreakFacadeEjbLocal outbreakFacade; @EJB private PersonFacadeEjbLocal personFacade; + + @EJB + private RegionFacadeEjb.RegionFacadeEjbLocal regionFacade; @EJB private DiseaseConfigurationFacadeEjbLocal diseaseConfigurationFacade; @@ -129,8 +141,6 @@ public DiseaseBurdenDto getDiseaseForDashboard( Date previousFrom, Date previousTo) { - System.out.println("Disease Facade EJB getDiseaseForDashboard parameters:---- Disease: " + disease + " From and To Date: " +from + " To---: " + to); - //new cases CaseCriteria caseCriteria = new CaseCriteria() .newCaseDateBetween(from, to, null).region(regionRef).district(districtRef).disease(disease); @@ -141,9 +151,14 @@ public DiseaseBurdenDto getDiseaseForDashboard( Map events = eventFacade.getEventCountByDisease(new EventCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); + //outbreaks Map outbreakDistrictsCount = outbreakFacade - .getOutbreakDistrictCountByDisease(new OutbreakCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); + .getOutbreakDistrictCountByDisease(new OutbreakCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); + + //outbreaks + Map outbreakDistricts = outbreakFacade + .getOutbreakDistrictNameByDisease(new OutbreakCriteria().disease(disease).region(regionRef).district(districtRef).reportedBetween(from, to)); //last report district Map lastReportedDistricts = caseFacade.getLastReportedDistrictByDisease(caseCriteria, true, true); @@ -162,35 +177,81 @@ public DiseaseBurdenDto getDiseaseForDashboard( Long outbreakDistrictCount = outbreakDistrictsCount.getOrDefault(disease, 0L); Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); District lastReportedDistrict = lastReportedDistricts.getOrDefault(disease, null); + District outbreakDistrict = outbreakDistricts.getOrDefault(disease, null); String lastReportedDistrictName = lastReportedDistrict == null ? "" : lastReportedDistrict.getName(); - - return new DiseaseBurdenDto( - disease, - caseCount, - previousCaseCount, - eventCount, - outbreakDistrictCount, - caseFatalityCount, - lastReportedDistrictName); + String outbreakDistrictName = outbreakDistrict == null ? "" : outbreakDistrict.getName(); // return new DiseaseBurdenDto( +// regionDto, // disease, -// caseCount, -// previousCaseCount, -// eventCount, -// outbreakDistrictCount, -// caseFatalityCount, -// lastReportedDistrictName); +// caseCount, +// previousCaseCount, +// eventCount, +// outbreakDistrictCount, +// caseFatalityCount, +// lastReportedDistrictName, +// "", +// null +// ); + return new DiseaseBurdenDto( + disease, + caseCount, + previousCaseCount, + eventCount, + outbreakDistrictCount, + caseFatalityCount, + lastReportedDistrictName, + outbreakDistrictName); // // }).collect(Collectors.toList()) // return null; } - @Override - public DiseaseBurdenDto getDiseaseGridForDashboard(RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, Date from, Date to, Date previousFromDate, Date previousToDate) { - return null; + + + public DiseaseBurdenDto getDiseaseGridForDashboard( + RegionReferenceDto regionRef, + DistrictReferenceDto districtRef, + Disease disease, + Date from, + Date to, + Date previousFrom, + Date previousTo) { + + //Get the region + RegionDto regionDto = regionFacade.getByUuid(regionRef.getUuid()); + + //new cases + CaseCriteria caseCriteria = new CaseCriteria().newCaseDateBetween(from, to, null).region(regionRef).disease(disease); + + //Load count all dead/ fatalities + Map allCasesFetched = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + + //case fatalities +// caseCriteria.setOutcome(CaseOutcome.DECEASED); + Map caseFatalities = personFacade.getDeathCountByDisease(caseCriteria, true, true); + + caseCriteria.setOutcome(CaseOutcome.RECOVERED); + Map recoveredCase = personFacade.getDeathCountByDisease(caseCriteria, true, true); + + caseCriteria.relevanceStatus(EntityRelevanceStatus.ACTIVE); + Map archievedCase = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + + //build diseasesBurden + Long totalCaseCount = allCasesFetched.getOrDefault(disease, 0L); + Long activeCaseCount = archievedCase.getOrDefault(disease, 0L); + Long recoveredCaseCount = recoveredCase.getOrDefault(disease, 0L); + Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); + + return new DiseaseBurdenDto( + regionDto, + totalCaseCount.toString(), + activeCaseCount.toString(), + recoveredCaseCount.toString(), + caseFatalityCount.toString() + ); } @LocalBean From 2f9514768e9d2d04adc5edbe8817882340eb8e78 Mon Sep 17 00:00:00 2001 From: NORTH Date: Fri, 10 Dec 2021 13:28:02 +0000 Subject: [PATCH 20/71] WiP From 2392162b925e348e1455d4a1bec13957a1cff11e Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Fri, 2 Feb 2024 12:51:53 +0000 Subject: [PATCH 21/71] fix regional grid bug of data mismatch --- .../symeda/sormas/api/caze/CaseCriteria.java | 20 + .../symeda/sormas/api/caze/CaseOutcome.java | 2 +- .../sormas/api/contact/ContactFacade.java | 9 + .../api/dashboard/DashboardCriteria.java | 69 ++ .../sormas/api/dashboard/DashboardFacade.java | 2 + .../api/dashboard/NewDateFilterType.java | 31 + .../SurveillanceDashboardCriteria.java | 6 +- .../sormas/api/disease/DiseaseBurdenDto.java | 227 ++++- .../sormas/api/disease/DiseaseFacade.java | 17 +- .../sormas/api/feature/FeatureType.java | 3 +- .../sormas/api/geo/GeoShapeProvider.java | 24 +- .../de/symeda/sormas/api/i18n/Captions.java | 1 + .../api/infrastructure/region/RegionDto.java | 4 + .../sormas/api/outbreak/OutbreakCriteria.java | 13 + .../sormas/api/sample/SampleFacade.java | 4 + .../de/symeda/sormas/api/user/UserRight.java | 4 + .../sormas/api/user/UserRightGroup.java | 2 +- sormas-api/src/main/resources/enum.properties | 6 + .../sormas/backend/caze/CaseFacadeEjb.java | 38 +- .../sormas/backend/caze/CaseService.java | 247 ++++- .../backend/contact/ContactFacadeEjb.java | 16 + .../backend/dashboard/DashboardFacadeEjb.java | 8 + .../backend/dashboard/DashboardService.java | 64 +- .../backend/disease/DiseaseFacadeEjb.java | 212 ++-- .../region/RegionFacadeEjb.java | 37 +- .../backend/sample/SampleFacadeEjb.java | 2 + .../src/main/resources/sql/sormas_schema.sql | 5 + .../AbstractDashboardDataProvider.java | 75 ++ .../ui/dashboard/AbstractDashboardView.java | 115 +-- .../ui/dashboard/DashboardController.java | 58 +- .../ui/dashboard/DashboardDataProvider.java | 252 +++-- .../components/DashboardFilterLayout.java | 206 +++- .../contacts/ContactsDashboardView.java | 2 +- .../DiseaseDetailsComponent.java | 159 ++- .../diseasedetails/DiseaseDetailsView.java | 203 +++- .../diseasedetails/DiseaseFilterLayout.java | 74 ++ .../map/BaseDashboardMapComponent.java | 29 +- .../dashboard/map/DashboardMapComponent.java | 910 ++++++++++++++++-- .../ui/dashboard/map/MapCasePeriodOption.java | 14 + .../ui/dashboard/map/MapPeriodType.java | 34 + .../SurveillanceDashboardView.java | 12 + .../SurveillanceOverviewLayout.java | 3 +- .../components/SurveillanceFilterLayout.java | 26 +- .../disease/DiseaseOverviewComponent.java | 13 +- .../burden/DiseaseBurdenComponent.java | 5 +- .../disease/tile/DiseaseTileComponent.java | 248 +++-- .../disease/tile/DiseaseTileViewLayout.java | 13 +- .../tile/RegionalDiseaseBurdenGrid.java | 291 +++++- .../builders/SurveillanceEpiCurveBuilder.java | 2 + .../de/symeda/sormas/ui/utils/CssStyles.java | 3 + 50 files changed, 3167 insertions(+), 653 deletions(-) create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/dashboard/NewDateFilterType.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java 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 001bc767852..2d4332dd9a5 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 @@ -160,6 +160,9 @@ public class CaseCriteria extends CriteriaWithDateType implements ExternalShareC private Boolean deleted = Boolean.FALSE; public Boolean excludeSharedCases; + private Boolean includeNotACaseClassification; + + public CaseCriteria() { super(NewCaseDateType.class); } @@ -825,4 +828,21 @@ public Boolean getExcludeSharedCases() { public void setExcludeSharedCases(Boolean excludeSharedCases) { this.excludeSharedCases = excludeSharedCases; } + + + public CaseCriteria caseClassification(CaseClassification caseClassification) { + setCaseClassification(caseClassification); + return this; + } + + + + public CaseCriteria includeNotACaseClassification(Boolean includeNotACaseClassification) { + this.includeNotACaseClassification = includeNotACaseClassification; + return this; + } + + public Boolean isIncludeNotACaseClassification() { + return includeNotACaseClassification; + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseOutcome.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseOutcome.java index e1f70e5bd34..8935eee94ba 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseOutcome.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseOutcome.java @@ -27,7 +27,7 @@ public enum CaseOutcome NO_OUTCOME, DECEASED, RECOVERED, - UNKNOWN; + UNKNOWN, OTHER; public String getName() { return this.name(); 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 e1271ae228c..192235602ae 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 @@ -31,6 +31,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.Language; import de.symeda.sormas.api.MergeFacade; +import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.caze.CoreAndPersonDto; import de.symeda.sormas.api.common.Page; @@ -103,6 +104,14 @@ List getContactsForDashboard( Date from, Date to); + List getContactsForDashboard( + RegionReferenceDto regionRef, + DistrictReferenceDto districtRef, + Disease disease, + Date from, + Date to, + CaseClassification caseClassification); + Map getNewContactCountPerStatus(ContactCriteria contactCriteria); Map getNewContactCountPerClassification(ContactCriteria contactCriteria); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java index 41aebd5b14a..e9f0fc0292c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java @@ -1,8 +1,13 @@ package de.symeda.sormas.api.dashboard; import de.symeda.sormas.api.CaseMeasure; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.CaseOutcome; +import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.utils.criteria.CriteriaDateType; +import java.util.Date; + public class DashboardCriteria extends BaseDashboardCriteria { private CriteriaDateType newCaseDateType; @@ -11,10 +16,26 @@ public class DashboardCriteria extends BaseDashboardCriteria private CaseMeasure caseMeasure; private boolean includeNotACaseClassification; + private CaseClassification caseClassification; + private NewDateFilterType dateFilterType; + + private Date dateFrom; + private Date dateTo; + + private CaseOutcome outcome; + public DashboardCriteria(NewCaseDateType dateTypeClass) { + super(DashboardCriteria.class); + } + public DashboardCriteria() { super(DashboardCriteria.class); } + public DashboardCriteria(Class dateTypeClass) { + super(DashboardCriteria.class); + } + + public CriteriaDateType getNewCaseDateType() { return newCaseDateType; } @@ -48,4 +69,52 @@ public boolean isShowMinimumEntries() { public CaseMeasure getCaseMeasure() { return caseMeasure; } + + + + public CaseClassification getCaseClassification() { + return caseClassification; + } + + public DashboardCriteria caseClassification(CaseClassification caseClassification) { + this.caseClassification = caseClassification; + return this; + } + + public NewDateFilterType getDateFilterType() { + return dateFilterType; + } + + public DashboardCriteria dateFilterType(NewDateFilterType dateFilterType) { + this.dateFilterType = dateFilterType; + return this; + } + + + public Date getDateFrom() { + return dateFrom; + } + + public Date getDateTo() { + return dateTo; + } + + public DashboardCriteria dateFrom(Date dateFrom) { + this.dateFrom = dateFrom; + return this; + } + + public DashboardCriteria dateTo(Date dateTo) { + this.dateTo = dateTo; + return this; + } + + public void setOutcome(CaseOutcome outcome) { + this.outcome = outcome; + } + + public CaseOutcome getOutcome() { + return outcome; + } + } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardFacade.java index 38e927e939b..b67ac432e86 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardFacade.java @@ -59,4 +59,6 @@ List getDiseaseBurden( Date previousFromDate, Date previousToDate, CriteriaDateType newCaseDateType); + + Map getTestResultCountByResultType(DashboardCriteria dashboardCriteria); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/NewDateFilterType.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/NewDateFilterType.java new file mode 100644 index 00000000000..f82ef02a669 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/NewDateFilterType.java @@ -0,0 +1,31 @@ + +/******************************************************************************* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *******************************************************************************/ + +package de.symeda.sormas.api.dashboard; + +public enum NewDateFilterType { + TODAY, + YESTERDAY, + THIS_WEEK, + LAST_WEEK, + THIS_YEAR, + CUSTOM; + + +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/SurveillanceDashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/SurveillanceDashboardCriteria.java index e9f7107ad47..b9a647589bb 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/SurveillanceDashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/SurveillanceDashboardCriteria.java @@ -6,7 +6,11 @@ public class SurveillanceDashboardCriteria extends DashboardCriteria { private NewCaseDateType newCaseDateType; - @Override + public SurveillanceDashboardCriteria() { + super(); + } + + @Override public NewCaseDateType getNewCaseDateType() { return newCaseDateType; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java index f86688f93ce..a9eb3330d11 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java @@ -18,9 +18,12 @@ package de.symeda.sormas.api.disease; import java.io.Serializable; +import java.util.Date; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.infrastructure.region.RegionDto; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; public class DiseaseBurdenDto implements Serializable { @@ -41,41 +44,73 @@ public class DiseaseBurdenDto implements Serializable { //Regional specific Disease Details public static final String CASES_TOTAL = "total"; + public static final String CASES_COUNT_TOTAL = "totalCount"; + public static final String CASES_REGION = "region"; + public static final String CASES_DISTRICT = "district"; + public static final String ACTIVE_CASE = "activeCases"; + public static final String ACTIVE_COUNT_CASE = "activeCount"; + public static final String RECOVERED_CASES = "recovered"; + public static final String RECOVERED_COUNT_CASES = "recoveredCount"; + public static final String DEATH = "deaths"; + public static final String DEATH_COUNT = "deathsCount"; + + + public static final String OTHER = "other"; + public static final String OTHER_COUNT = "otherCount"; + private Disease disease; private String total; + private String totalCount; + private Long caseCount; private Long previousCaseCount; private Long eventCount; private Long outbreakDistrictCount; private Long caseDeathCount; private String lastReportedDistrictName; + private CaseClassification caseClassification; private Integer cfr; private String lastReportedDistrict; private String outbreakDistrict; + private String deaths; + private String deathsCount; + private RegionDto region; + private String recovered; + private String recoveredCount; + private String activeCases; + private String activeCount; + + private String other; + private String otherCount; + + + private Date to; + private Date from; public DiseaseBurdenDto( RegionDto regionDto, String total, String activeCases, String recovered, - String deaths) { + String deaths,String other) { this.region = regionDto; this.total = total; this.activeCases = activeCases; this.recovered = recovered; this.deaths = deaths; + this.other=other; } @@ -100,13 +135,16 @@ public DiseaseBurdenDto( } public DiseaseBurdenDto( - Disease disease, - Long caseCount, - Long previousCaseCount, - Long eventCount, - Long outbreakDistrictCount, - Long caseDeathCount, - String lastReportedDistrictName) { + Disease disease, + Long caseCount, + Long previousCaseCount, + Long eventCount, + Long outbreakDistrictCount, + Long caseDeathCount, + String lastReportedDistrictName, + String outbreakDistrict, + Date from, + Date to) { this.disease = disease; this.caseCount = caseCount; @@ -115,8 +153,65 @@ public DiseaseBurdenDto( this.outbreakDistrictCount = outbreakDistrictCount; this.caseDeathCount = caseDeathCount; this.lastReportedDistrictName = lastReportedDistrictName; + this.outbreakDistrict = outbreakDistrict; + this.from= from; + this.to=to; } + public DiseaseBurdenDto( + Disease disease, + Long caseCount, + Long previousCaseCount, + Long eventCount, + Long outbreakDistrictCount, + Long caseDeathCount, + String lastReportedDistrictName, + CaseClassification caseClassification) { + + this.disease = disease; + this.caseCount = caseCount; + this.previousCaseCount = previousCaseCount; + this.eventCount = eventCount; + this.outbreakDistrictCount = outbreakDistrictCount; + this.caseDeathCount = caseDeathCount; + this.lastReportedDistrictName = lastReportedDistrictName; + this.caseClassification = caseClassification; + } + + public DiseaseBurdenDto( + Disease disease, + Long caseCount, + Long previousCaseCount, + Long eventCount, + Long outbreakDistrictCount, + Long caseDeathCount, + String lastReportedDistrictName) { + + this.disease = disease; + this.caseCount = caseCount; + this.previousCaseCount = previousCaseCount; + this.eventCount = eventCount; + this.outbreakDistrictCount = outbreakDistrictCount; + this.caseDeathCount = caseDeathCount; + this.lastReportedDistrictName = lastReportedDistrictName; + } + + public DiseaseBurdenDto( + RegionDto regionDto, + String total, + String activeCases, + String recovered, + String deaths) { + + this.region = regionDto; + this.total = total; + this.activeCases = activeCases; + this.recovered = recovered; + this.deaths = deaths; + } + + + public Disease getDisease() { return disease; } @@ -125,6 +220,14 @@ public void setDisease(Disease disease) { this.disease = disease; } + public CaseClassification getCaseClassification() { + return caseClassification; + } + + public void setCaseClassification(CaseClassification caseClassification) { + this.caseClassification = caseClassification; + } + public Long getCaseCount() { return caseCount; } @@ -264,4 +367,112 @@ public String getTotal() { public void setTotal(String total) { this.total = total; } + + + public Date getTo() { + return to; + } + + + public void setTo(Date to) { + this.to = to; + } + + + public Date getFrom() { + return from; + } + + + public void setFrom(Date from) { + this.from = from; + } + + + + public String getTotalCount() { + return totalCount; + } + + + public void setTotalCount(String totalCount) { + this.totalCount = totalCount; + } + + + public String getDeathsCount() { + return deathsCount; + } + + + public void setDeathsCount(String deathsCount) { + this.deathsCount = deathsCount; + } + + + public String getRecoveredCount() { + return recoveredCount; + } + + + public void setRecoveredCount(String recoveredCount) { + this.recoveredCount = recoveredCount; + } + + + + + + public String getActiveCount() { + return activeCount; + } + + + public void setActiveCount(String activeCount) { + this.activeCount = activeCount; + } + + + public String getOther() { + return other; + } + + + public void setOther(String other) { + this.other = other; + } + + + + + + public String getOtherCount() { + return otherCount; + } + + + public void setOtherCount(String otherCount) { + this.otherCount = otherCount; + } + + + @Override + public String toString() { + return "DiseaseBurdenDto [disease=" + disease + ", total=" + total + ", caseCount=" + caseCount + + ", previousCaseCount=" + previousCaseCount + ", eventCount=" + eventCount + ", outbreakDistrictCount=" + + outbreakDistrictCount + ", caseDeathCount=" + caseDeathCount + ", lastReportedDistrictName=" + + lastReportedDistrictName + ", caseClassification=" + caseClassification + ", cfr=" + cfr + + ", lastReportedDistrict=" + lastReportedDistrict + ", outbreakDistrict=" + outbreakDistrict + + ", deaths=" + deaths + ", region=" + region + ", recovered=" + recovered + ", activeCases=" + + activeCases + ", to=" + to + ", from=" + from + "]"; + } + + + + +// public DiseaseBurdenDto getDiseaseGridForDashboard(RegionReferenceDto reference, Object object, Disease disease2, +// Date fromDate, Date toDate, Date previousFromDate, Date previousToDate) { +// // TODO Auto-generated method stub +// return null; +// } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java index 8f423d6dffb..8f26c4aaa77 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java @@ -1,3 +1,5 @@ +package de.symeda.sormas.api.disease; + /******************************************************************************* * SORMAS® - Surveillance Outbreak Response Management & Analysis System * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) @@ -15,7 +17,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.api.disease; import java.util.Date; import java.util.List; @@ -23,8 +24,10 @@ import javax.ejb.Remote; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.utils.criteria.CriteriaDateType; @Remote @@ -54,7 +57,10 @@ DiseaseBurdenDto getDiseaseForDashboard( Date from, Date to, Date previousFromDate, - Date previousToDate); + Date previousToDate, + CriteriaDateType newCaseDateType, + CaseClassification caseClassification + ); // DiseaseBurdenDto getDiseaseGridForDashboard( RegionReferenceDto regionRef, @@ -63,6 +69,9 @@ DiseaseBurdenDto getDiseaseGridForDashboard( Date from, Date to, Date previousFromDate, - Date previousToDate); - + Date previousToDate, + CriteriaDateType newCaseDateType, + CaseClassification caseClassification + ); } + diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java index 177ed3dd2b1..5c702f57b63 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java @@ -328,7 +328,8 @@ public enum FeatureType { CASE_SURVEILANCE, CONTACT_TRACING }, null, - ImmutableMap.of(FeatureTypeProperty.S2S_SHARING, Boolean.FALSE)); + ImmutableMap.of(FeatureTypeProperty.S2S_SHARING, Boolean.FALSE)), + DISEASE_DETAILS(true, true, null, null, null); public static final FeatureType[] SURVEILLANCE_FEATURE_TYPES = { FeatureType.CASE_SURVEILANCE, diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/geo/GeoShapeProvider.java b/sormas-api/src/main/java/de/symeda/sormas/api/geo/GeoShapeProvider.java index b2f81a601da..41f76db0132 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/geo/GeoShapeProvider.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/geo/GeoShapeProvider.java @@ -25,24 +25,24 @@ @Remote public interface GeoShapeProvider { - /** - * @return array of polygons, which are arrays of geo-points - */ - GeoLatLon[][] getRegionShape(RegionReferenceDto region); + /** + * @return array of polygons, which are arrays of geo-points + */ + GeoLatLon[][] getRegionShape(RegionReferenceDto region); - RegionReferenceDto getRegionByCoord(GeoLatLon latLon); + RegionReferenceDto getRegionByCoord(GeoLatLon latLon); - GeoLatLon getCenterOfAllRegions(); + GeoLatLon getCenterOfAllRegions(); - GeoLatLon getCenterOfRegion(RegionReferenceDto region); + GeoLatLon getCenterOfRegion(RegionReferenceDto region); - GeoLatLon[][] getDistrictShape(DistrictReferenceDto district); + GeoLatLon[][] getDistrictShape(DistrictReferenceDto district); - DistrictReferenceDto getDistrictByCoord(GeoLatLon latLon); + DistrictReferenceDto getDistrictByCoord(GeoLatLon latLon); - GeoLatLon getCenterOfDistrict(DistrictReferenceDto district); + GeoLatLon getCenterOfDistrict(DistrictReferenceDto district); - GeoLatLon[][] getCountryShape(); + GeoLatLon[][] getCountryShape(); - String loadShapefileAttributions(); + String loadShapefileAttributions(); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java index 8c773c7dfb6..ab3a5775a37 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java @@ -2838,4 +2838,5 @@ public interface Captions { String years = "years"; String dashboardLastReportedDistrict = "dashboardLastReportedDistrict"; + String dashboardDistrictDiseaseBurden="dashboardDistrictDiseaseBurden"; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java index c497ab01903..928b1f87d90 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java @@ -156,4 +156,8 @@ public String buildCaption() { public String i18nPrefix() { return I18N_PREFIX; } + @Override + public String toString() { + return getName(); + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java index 7b28c46d9e7..79255a8f59a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java @@ -23,6 +23,7 @@ import java.util.Set; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.utils.criteria.BaseCriteria; @@ -40,6 +41,8 @@ public class OutbreakCriteria extends BaseCriteria implements Serializable { private Date reportedDateFrom; private Date reportedDateTo; + private CaseClassification caseClassification; + public RegionReferenceDto getRegion() { return region; } @@ -136,4 +139,14 @@ public OutbreakCriteria reportedDateTo(Date reportedDateTo) { public Date getReportedDateTo() { return reportedDateTo; } + + + public CaseClassification getCaseClassification() { + return caseClassification; + } + + public OutbreakCriteria caseClassification(CaseClassification caseClassification) { + this.caseClassification = caseClassification; + return this; + } } 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 6db5218c9ba..4ffba83d066 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 @@ -26,10 +26,13 @@ import javax.validation.Valid; import de.symeda.sormas.api.DeletableFacade; +import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseCriteria; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.disease.DiseaseVariant; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; @@ -93,4 +96,5 @@ public interface SampleFacade extends DeletableFacade { List getAssociatedDiseaseVariants(String sampleUuid); Map getNewTestResultCountByResultType(List collect); + } 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 cbab9a2e49a..0e3732764ca 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 @@ -66,6 +66,7 @@ public enum UserRight { PERSON_EXPORT(UserRightGroup.PERSON, UserRight._PERSON_VIEW), PERSON_CONTACT_DETAILS_DELETE(UserRightGroup.PERSON, UserRight._PERSON_EDIT), PERSON_MERGE(UserRightGroup.PERSON, UserRight._PERSON_VIEW), + DISEASE_DETAILS_ACCESS(UserRightGroup.DISEASE), SAMPLE_VIEW(UserRightGroup.SAMPLE), SAMPLE_CREATE(UserRightGroup.SAMPLE, UserRight._SAMPLE_VIEW), @@ -164,6 +165,8 @@ public enum UserRight { DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS(UserRightGroup.DASHBOARD, UserRight._DASHBOARD_CONTACT_VIEW), DASHBOARD_CAMPAIGNS_VIEW(UserRightGroup.DASHBOARD, UserRight._CAMPAIGN_VIEW), DASHBOARD_SAMPLES_VIEW(UserRightGroup.DASHBOARD, UserRight._SAMPLE_VIEW), + DASHBOARD_DISEASE_DETAILS_ACCESS(UserRightGroup.DASHBOARD,UserRight._DISEASE_DETAILS_ACCESS), + CASE_CLINICIAN_VIEW(UserRightGroup.CASE_MANAGEMENT, UserRight._CASE_VIEW), @@ -279,6 +282,7 @@ public enum UserRight { //@formatter:on + private static final String _DISEASE_DETAILS_ACCESS ="DISEASE_DETAILS_ACCESS" ; /* * Hint for SonarQube issues: * 1. java:S115: Violation of name convention for String constants of this class is accepted: Close as false positive. diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java index a679dcffab0..6df6da8aa63 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java @@ -46,7 +46,7 @@ public enum UserRightGroup { EXPORT, CONFIGURATION, - EXTERNAL; + EXTERNAL, DISEASE; @Override public String toString() { diff --git a/sormas-api/src/main/resources/enum.properties b/sormas-api/src/main/resources/enum.properties index 8efb5414ea3..30cad555900 100644 --- a/sormas-api/src/main/resources/enum.properties +++ b/sormas-api/src/main/resources/enum.properties @@ -1413,6 +1413,8 @@ UserRight.CONTACT_ARCHIVE = Archive contacts UserRight.DASHBOARD_CONTACT_VIEW = Access the contact supervisor dashboard UserRight.DASHBOARD_SURVEILLANCE_VIEW = Access the surveillance supervisor dashboard UserRight.DASHBOARD_SAMPLES_VIEW = Access the samples dashboard +UserRight.DASHBOARD_DISEASE_DETAILS_ACCESS = Access the disease dashboard + UserRight.DATABASE_EXPORT_ACCESS = Export the whole database UserRight.EVENT_ARCHIVE = Archive events UserRight.EVENT_CREATE = Create new events @@ -1436,6 +1438,7 @@ UserRight.SAMPLE_DELETE = Delete samples from the system UserRight.SAMPLE_SEE_ARCHIVED = View archived samples UserRight.SAMPLE_TRANSFER = Transfer samples to another lab UserRight.SAMPLE_VIEW = View existing samples +UserRight.DISEASE_DETAILS_ACCESS = Access disease details UserRight.SAMPLETEST_CREATE = Create new sample tests UserRight.SAMPLETEST_EDIT = Edit existing sample tests UserRight.STATISTICS_EXPORT = Export detailed statistics from SORMAS @@ -1642,6 +1645,7 @@ UserRight.Desc.SAMPLE_EXPORT = Able to export samples from SORMAS UserRight.Desc.SAMPLE_DELETE = Able to delete samples from the system UserRight.Desc.SAMPLE_TRANSFER = Able to transfer samples to another lab UserRight.Desc.SAMPLE_VIEW = Able to view existing samples +UserRight.Desc.DISEASE_DETAILS_ACCESS = Able to access disease details UserRight.Desc.SAMPLETEST_CREATE = Able to create new sample tests UserRight.Desc.SAMPLETEST_EDIT = Able to edit existing sample tests UserRight.Desc.STATISTICS_EXPORT = Able to export detailed statistics from SORMAS @@ -1819,6 +1823,8 @@ UserRightGroup.CONFIGURATION = Configuration UserRightGroup.DOCUMENT = Documents UserRightGroup.EXTERNAL_EMAILS=External emails UserRightGroup.ENVIRONMENT = Environments +UserRightGroup.DISEASE = Disease + # Vaccination VaccinationStatus.UNKNOWN = Unknown 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 3b552f714b4..9c09627820f 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 @@ -78,6 +78,9 @@ import de.symeda.sormas.api.dashboard.DashboardCaseDto; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory; +import org.hibernate.hql.spi.QueryTranslator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -4525,6 +4528,7 @@ public void updateSymptomsByVisit(Visit visit) { caseSave(cazeDto, true, visit.getCaze(), cazeDto, true, true); } + @Override public Map getCaseCountByDisease(CaseCriteria caseCriteria, boolean excludeSharedCases, boolean excludeCasesFromContacts) { @@ -4538,7 +4542,12 @@ public Map getCaseCountByDisease(CaseCriteria caseCriteria, boole caze, new CaseUserFilterCriteria().excludeSharedCases(excludeSharedCases).excludeCasesFromContacts(excludeCasesFromContacts)); - filter =and(cb, filter, caseService.createCriteriaFilter(caseCriteria, cb, cq, caze)); + //final CaseQueryContext caseQueryContext = new CaseQueryContext(cb, cq, caze); + + filter = and(cb, filter, caseService.createCriteriaFilter(caseCriteria, cb, cq, caze)); + + //filter = AbstractAdoService.and(cb, filter, createCaseCriteriaFilter(caseCriteria, caseQueryContext)); + //filter = CriteriaBuilderHelper.and(cb, filter, caseService.createCaseCriteriaFilterDiseaseDetails(caseCriteria, cq)); if (filter != null) { cq.where(filter); @@ -4552,6 +4561,33 @@ public Map getCaseCountByDisease(CaseCriteria caseCriteria, boole return resultMap; } +// @Override +// public Map getCaseCountByDisease(CaseCriteria caseCriteria, boolean excludeSharedCases, boolean excludeCasesFromContacts) { +// +// CriteriaBuilder cb = em.getCriteriaBuilder(); +// CriteriaQuery cq = cb.createQuery(Object[].class); +// Root caze = cq.from(Case.class); +// +// Predicate filter = caseService.createUserFilter( +// cb, +// cq, +// caze, +// new CaseUserFilterCriteria().excludeSharedCases(excludeSharedCases).excludeCasesFromContacts(excludeCasesFromContacts)); +// +// filter =and(cb, filter, caseService.createCriteriaFilter(caseCriteria, cb, cq, caze)); +// +// if (filter != null) { +// cq.where(filter); +// } +// +// cq.groupBy(caze.get(Case.DISEASE)); +// cq.multiselect(caze.get(Case.DISEASE), cb.count(caze)); +// List results = em.createQuery(cq).getResultList(); +// +// Map resultMap = results.stream().collect(Collectors.toMap(e -> (Disease) e[0], e -> (Long) e[1])); +// +// return resultMap; +// } public Map getLastReportedDistrictByDisease( CaseCriteria caseCriteria, 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 eb692689f8b..8d81685cebb 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 @@ -2467,13 +2467,16 @@ public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From cq, From from) { Join person = from.join(Case.PERSON, JoinType.LEFT); Join reportingUser = from.join(Case.REPORTING_USER, JoinType.LEFT); - Join region = from.join(Case.REGION, JoinType.LEFT); - Join district = from.join(Case.DISTRICT, JoinType.LEFT); + //Join region = from.join(Case.REGION, JoinType.LEFT); + Join responsibleRegion = from.join(Case.RESPONSIBLE_REGION, JoinType.LEFT); + + //Join district = from.join(Case.DISTRICT, JoinType.LEFT); + Join responsibleDistrict = from.join(Case.RESPONSIBLE_DISTRICT, JoinType.LEFT); + Join community = from.join(Case.COMMUNITY, JoinType.LEFT); Join facility = from.join(Case.HEALTH_FACILITY, JoinType.LEFT); Predicate filter = null; @@ -2488,16 +2491,24 @@ public Predicate createCriteriaFilter(CaseCriteria caseCriteria, CriteriaBuilder 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())); + + filter = and(cb, filter, cb.equal(responsibleRegion.get(Region.UUID), caseCriteria.getRegion().getUuid())); + +// filter = and(cb, filter, +// cb.or( +// cb.and(cb.equal(region.get(Region.UUID), caseCriteria.getRegion().getUuid()),cb.isNotNull(region.get(Region.UUID))), +// cb.and(cb.equal(responsibleRegion.get(Region.UUID), caseCriteria.getRegion().getUuid()),cb.isNull(region.get(Region.UUID))))); + } + + if (caseCriteria.getDistrict() != null) { - filter = and(cb, filter, cb.equal(district.get(District.UUID), caseCriteria.getDistrict().getUuid())); + filter = and(cb, filter, cb.equal(responsibleDistrict.get(District.UUID), caseCriteria.getDistrict().getUuid())); } if (caseCriteria.getCommunity() != null) { filter = and(cb, filter, cb.equal(community.get(Community.UUID), caseCriteria.getCommunity().getUuid())); } - if (Boolean.TRUE.equals(caseCriteria. - getExcludeSharedCases())) { + if (Boolean.TRUE.equals(caseCriteria.getExcludeSharedCases())) { User currentUser = getCurrentUser(); if (currentUser != null) { if (currentUser.getDistrict() != null) { @@ -2507,7 +2518,7 @@ public Predicate createCriteriaFilter(CaseCriteria caseCriteria, CriteriaBuilder cb.not( cb.and( cb.equal(from.get(Case.SHARED_TO_COUNTRY), true), - cb.notEqual(region.get(District.UUID), currentUser.getDistrict().getUuid())))); + cb.notEqual(responsibleRegion.get(District.UUID), currentUser.getDistrict().getUuid())))); } else if (currentUser.getRegion() != null) { filter = and( cb, @@ -2515,7 +2526,7 @@ public Predicate createCriteriaFilter(CaseCriteria caseCriteria, CriteriaBuilder cb.not( cb.and( cb.equal(from.get(Case.SHARED_TO_COUNTRY), true), - cb.notEqual(region.get(Region.UUID), currentUser.getRegion().getUuid())))); + cb.notEqual(responsibleRegion.get(Region.UUID), currentUser.getRegion().getUuid())))); } } } @@ -2540,15 +2551,31 @@ public Predicate createCriteriaFilter(CaseCriteria caseCriteria, CriteriaBuilder filter, cb.equal(from.join(Case.SURVEILLANCE_OFFICER, JoinType.LEFT).get(User.UUID), caseCriteria.getSurveillanceOfficer().getUuid())); } + + +// else { +// filter = and(cb, filter, cb.notEqual(from.get(Case.CASE_CLASSIFICATION), CaseClassification.NO_CASE)); +// +// } if (caseCriteria.getCaseClassification() != null) { + filter = and(cb, filter, cb.equal(from.get(Case.CASE_CLASSIFICATION), caseCriteria.getCaseClassification())); + } + + if (caseCriteria.isIncludeNotACaseClassification()==null||caseCriteria.isIncludeNotACaseClassification()==false) { + filter = and(cb, filter, cb.notEqual(from.get(Case.CASE_CLASSIFICATION), CaseClassification.NO_CASE)); + } + + if (caseCriteria.getInvestigationStatus() != null) { filter = and(cb, filter, cb.equal(from.get(Case.INVESTIGATION_STATUS), caseCriteria.getInvestigationStatus())); } + if (caseCriteria.getPresentCondition() != null) { filter = and(cb, filter, cb.equal(person.get(Person.PRESENT_CONDITION), caseCriteria.getPresentCondition())); } + if (caseCriteria.getNewCaseDateFrom() != null && caseCriteria.getNewCaseDateTo() != null) { filter = and( cb, @@ -2663,6 +2690,208 @@ public Predicate createCriteriaFilter(CaseCriteria caseCriteria, CriteriaBuilder } } } + + + return filter; } + + +// public Predicate createCriteriaFilter(CaseCriteria caseCriteria, CriteriaBuilder cb, CriteriaQuery cq, From from) { +// +// Join person = from.join(Case.PERSON, JoinType.LEFT); +// Join reportingUser = from.join(Case.REPORTING_USER, JoinType.LEFT); +// Join region = from.join(Case.REGION, JoinType.LEFT); +// Join district = from.join(Case.DISTRICT, JoinType.LEFT); +// Join community = from.join(Case.COMMUNITY, JoinType.LEFT); +// Join facility = from.join(Case.HEALTH_FACILITY, JoinType.LEFT); +// Predicate filter = null; +// if (caseCriteria.getReportingUserRole() != null) { +// filter = +// and(cb, filter, cb.isMember(caseCriteria.getReportingUserRole(), from.join(Case.REPORTING_USER, JoinType.LEFT).get(User.USER_ROLES))); +// } +// if (caseCriteria.getDisease() != null) { +// filter = and(cb, filter, cb.equal(from.get(Case.DISEASE), caseCriteria.getDisease())); +// } +// 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(district.get(District.UUID), caseCriteria.getDistrict().getUuid())); +// } +// if (caseCriteria.getCommunity() != null) { +// filter = and(cb, filter, cb.equal(community.get(Community.UUID), caseCriteria.getCommunity().getUuid())); +// } +// if (Boolean.TRUE.equals(caseCriteria. +// getExcludeSharedCases())) { +// User currentUser = getCurrentUser(); +// if (currentUser != null) { +// if (currentUser.getDistrict() != null) { +// filter = and( +// cb, +// filter, +// cb.not( +// cb.and( +// cb.equal(from.get(Case.SHARED_TO_COUNTRY), true), +// cb.notEqual(region.get(District.UUID), currentUser.getDistrict().getUuid())))); +// } else if (currentUser.getRegion() != null) { +// filter = and( +// cb, +// filter, +// cb.not( +// cb.and( +// cb.equal(from.get(Case.SHARED_TO_COUNTRY), true), +// cb.notEqual(region.get(Region.UUID), currentUser.getRegion().getUuid())))); +// } +// } +// } +// if (caseCriteria.getCaseOrigin() != null) { +// filter = and(cb, filter, cb.equal(from.get(Case.CASE_ORIGIN), caseCriteria.getCaseOrigin())); +// } +// if (caseCriteria.getHealthFacility() != null) { +// filter = and( +// cb, +// filter, +// cb.equal(from.join(Case.HEALTH_FACILITY, JoinType.LEFT).get(Facility.UUID), caseCriteria.getHealthFacility().getUuid())); +// } +// if (caseCriteria.getPointOfEntry() != null) { +// filter = and( +// cb, +// filter, +// cb.equal(from.join(Case.POINT_OF_ENTRY, JoinType.LEFT).get(PointOfEntry.UUID), caseCriteria.getPointOfEntry().getUuid())); +// } +// if (caseCriteria.getSurveillanceOfficer() != null) { +// filter = and( +// cb, +// filter, +// cb.equal(from.join(Case.SURVEILLANCE_OFFICER, JoinType.LEFT).get(User.UUID), caseCriteria.getSurveillanceOfficer().getUuid())); +// } +// if (caseCriteria.getCaseClassification() != null) { +// filter = and(cb, filter, cb.equal(from.get(Case.CASE_CLASSIFICATION), caseCriteria.getCaseClassification())); +// } +// if (caseCriteria.getInvestigationStatus() != null) { +// filter = and(cb, filter, cb.equal(from.get(Case.INVESTIGATION_STATUS), caseCriteria.getInvestigationStatus())); +// } +// if (caseCriteria.getPresentCondition() != null) { +// filter = and(cb, filter, cb.equal(person.get(Person.PRESENT_CONDITION), caseCriteria.getPresentCondition())); +// } +// if (caseCriteria.getNewCaseDateFrom() != null && caseCriteria.getNewCaseDateTo() != null) { +// filter = and( +// cb, +// filter, +// createNewCaseFilter( +// cb, +// from, +// DateHelper.getStartOfDay(caseCriteria.getNewCaseDateFrom()), +// DateHelper.getEndOfDay(caseCriteria.getNewCaseDateTo()), +// caseCriteria.getNewCaseDateType())); +// } +// if (caseCriteria.getCreationDateFrom() != null) { +// filter = and(cb, filter, cb.greaterThan(from.get(Case.CREATION_DATE), DateHelper.getStartOfDay(caseCriteria.getCreationDateFrom()))); +// } +// if (caseCriteria.getCreationDateTo() != null) { +// filter = and(cb, filter, cb.lessThan(from.get(Case.CREATION_DATE), DateHelper.getEndOfDay(caseCriteria.getCreationDateTo()))); +// } +// if (caseCriteria.getQuarantineTo() != null) { +// filter = and( +// cb, +// filter, +// cb.between( +// from.get(Case.QUARANTINE_TO), +// DateHelper.getStartOfDay(caseCriteria.getQuarantineTo()), +// DateHelper.getEndOfDay(caseCriteria.getQuarantineTo()))); +// } +// if (caseCriteria.getPerson() != null) { +// filter = and(cb, filter, cb.equal(from.join(Case.PERSON, JoinType.LEFT).get(Person.UUID), caseCriteria.getPerson().getUuid())); +// } +// if (caseCriteria.getMustHaveNoGeoCoordinates() != null && caseCriteria.getMustHaveNoGeoCoordinates() == true) { +// Join personAddress = person.join(Person.ADDRESS, JoinType.LEFT); +// filter = and( +// cb, +// filter, +// cb.and( +// cb.or(cb.isNull(from.get(Case.REPORT_LAT)), cb.isNull(from.get(Case.REPORT_LON))), +// cb.or(cb.isNull(personAddress.get(Location.LATITUDE)), cb.isNull(personAddress.get(Location.LONGITUDE))))); +// } +// if (caseCriteria.getMustBePortHealthCaseWithoutFacility() != null && caseCriteria.getMustBePortHealthCaseWithoutFacility() == true) { +// filter = and( +// cb, +// filter, +// cb.and(cb.equal(from.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY), cb.isNull(from.join(Case.HEALTH_FACILITY, JoinType.LEFT)))); +// } +// if (caseCriteria.getMustHaveCaseManagementData() != null && caseCriteria.getMustHaveCaseManagementData() == true) { +// Subquery prescriptionSubquery = cq.subquery(Prescription.class); +// Root prescriptionRoot = prescriptionSubquery.from(Prescription.class); +// prescriptionSubquery.select(prescriptionRoot).where(cb.equal(prescriptionRoot.get(Prescription.THERAPY), from.get(Case.THERAPY))); +// Subquery treatmentSubquery = cq.subquery(Treatment.class); +// Root treatmentRoot = treatmentSubquery.from(Treatment.class); +// treatmentSubquery.select(treatmentRoot).where(cb.equal(treatmentRoot.get(Treatment.THERAPY), from.get(Case.THERAPY))); +// Subquery clinicalVisitSubquery = cq.subquery(ClinicalVisit.class); +// Root clinicalVisitRoot = clinicalVisitSubquery.from(ClinicalVisit.class); +// clinicalVisitSubquery.select(clinicalVisitRoot) +// .where(cb.equal(clinicalVisitRoot.get(ClinicalVisit.CLINICAL_COURSE), from.get(Case.CLINICAL_COURSE))); +// filter = and(cb, filter, cb.or(cb.exists(prescriptionSubquery), cb.exists(treatmentSubquery), cb.exists(clinicalVisitSubquery))); +// } +// if (Boolean.TRUE.equals(caseCriteria.getWithoutResponsibleOfficer())) { +// filter = and(cb, filter, cb.isNull(from.get(Case.SURVEILLANCE_OFFICER))); +// } +// if (caseCriteria.getRelevanceStatus() != null) { +// if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.ACTIVE) { +// filter = and(cb, filter, cb.or(cb.equal(from.get(Case.ARCHIVED), false), cb.isNull(from.get(Case.ARCHIVED)))); +// } else if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.ARCHIVED) { +// filter = and(cb, filter, cb.equal(from.get(Case.ARCHIVED), true)); +// } +// } +// if (caseCriteria.getDeleted() != null) { +// filter = and(cb, filter, cb.equal(from.get(Case.DELETED), caseCriteria.getDeleted())); +// } +// if (caseCriteria.getNameUuidEpidNumberLike() != null) { +// String[] textFilters = caseCriteria.getNameUuidEpidNumberLike().split("\\s+"); +// for (int i = 0; i < textFilters.length; i++) { +// String textFilter = "%" + textFilters[i].toLowerCase() + "%"; +// if (!DataHelper.isNullOrEmpty(textFilter)) { +// Predicate likeFilters = cb.or( +// cb.like(cb.lower(person.get(Person.FIRST_NAME)), textFilter), +// cb.like(cb.lower(person.get(Person.LAST_NAME)), textFilter), +// cb.like(cb.lower(from.get(Case.UUID)), textFilter), +// cb.like(cb.lower(from.get(Case.EPID_NUMBER)), textFilter), +// cb.like(cb.lower(facility.get(Facility.NAME)), textFilter), +// cb.like(cb.lower(from.get(Case.HEALTH_FACILITY_DETAILS)), textFilter)); +// filter = and(cb, filter, likeFilters); +// } +// } +// } +// if (caseCriteria.getReportingUserLike() != null) { +// String[] textFilters = caseCriteria.getReportingUserLike().split("\\s+"); +// for (int i = 0; i < textFilters.length; i++) { +// String textFilter = "%" + textFilters[i].toLowerCase() + "%"; +// if (!DataHelper.isNullOrEmpty(textFilter)) { +// Predicate likeFilters = cb.or( +// cb.like(cb.lower(reportingUser.get(User.FIRST_NAME)), textFilter), +// cb.like(cb.lower(reportingUser.get(User.LAST_NAME)), textFilter), +// cb.like(cb.lower(reportingUser.get(User.USER_NAME)), textFilter)); +// filter = and(cb, filter, likeFilters); +// } +// } +// } +// if (caseCriteria.getSourceCaseInfoLike() != null) { +// String[] textFilters = caseCriteria.getSourceCaseInfoLike().split("\\s+"); +// for (int i = 0; i < textFilters.length; i++) { +// String textFilter = "%" + textFilters[i].toLowerCase() + "%"; +// if (!DataHelper.isNullOrEmpty(textFilter)) { +// Predicate likeFilters = cb.or( +// cb.like(cb.lower(person.get(Person.FIRST_NAME)), textFilter), +// cb.like(cb.lower(person.get(Person.LAST_NAME)), textFilter), +// cb.like(cb.lower(from.get(Case.UUID)), textFilter), +// cb.like(cb.lower(from.get(Case.EPID_NUMBER)), textFilter), +// cb.like(cb.lower(from.get(Case.EXTERNAL_ID)), textFilter)); +// filter = and(cb, filter, likeFilters); +// } +// } +// } +// return filter; +// } } 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 b307d7260c8..bd00cab4e8c 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 @@ -67,6 +67,7 @@ import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import de.symeda.sormas.api.caze.CaseClassification; import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -2388,6 +2389,21 @@ public User getRandomRegionContactResponsible(Region region) { return userService.getRandomRegionUser(region, UserRight.CONTACT_RESPONSIBLE); } + @Override + public List getContactsForDashboard( + RegionReferenceDto regionRef, + DistrictReferenceDto districtRef, + Disease disease, + Date from, + Date to, + CaseClassification caseClassification) { + + Region region = regionService.getByReferenceDto(regionRef); + District district = districtService.getByReferenceDto(districtRef); + + return service.getContactsForDashboard(region, district, disease, from, to); + } + @LocalBean @Stateless public static class ContactFacadeEjbLocal extends ContactFacadeEjb { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java index db54beb4ea3..f7bdeed07a2 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java @@ -795,6 +795,14 @@ public List getDiseaseBurden( return diseasesBurden; } + @Override + @RightsAllowed({ + UserRight._DASHBOARD_SURVEILLANCE_VIEW, + UserRight._DASHBOARD_CONTACT_VIEW }) + public Map getTestResultCountByResultType(DashboardCriteria dashboardCriteria) { + return dashboardService.getNewTestResultCountByResultType(dashboardCriteria); + } + @LocalBean @Stateless public static class DashboardFacadeEjbLocal extends DashboardFacadeEjb { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java index 744e0b6988c..b6891d9203a 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java @@ -13,6 +13,7 @@ import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; +import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; @@ -60,6 +61,11 @@ import de.symeda.sormas.backend.util.JurisdictionHelper; import de.symeda.sormas.backend.util.ModelConstants; import de.symeda.sormas.backend.util.QueryHelper; +import org.hibernate.engine.spi.SessionImplementor; +import org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory; +import org.hibernate.hql.spi.QueryTranslator; + +import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; @Stateless @LocalBean @@ -89,7 +95,7 @@ public List getCases(DashboardCriteria dashboardCriteria) { Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); Predicate criteriaFilter = createCaseCriteriaFilter(dashboardCriteria, caseQueryContext); - filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); + filter = and(cb, filter, criteriaFilter); List result; if (filter != null) { @@ -132,7 +138,7 @@ public Map getNewTestResultCountByResultType(Dashb final Predicate sampleFilter = cb.and( cb.isFalse(sample.get(Sample.DELETED)), cb.or(cb.isNull(sample.get(Sample.SPECIMEN_CONDITION)), cb.equal(sample.get(Sample.SPECIMEN_CONDITION), SpecimenCondition.ADEQUATE))); - cq.where(CriteriaBuilderHelper.and(cb, userFilter, criteriaFilter, sampleFilter)); + cq.where(and(cb, userFilter, criteriaFilter, sampleFilter)); final List queryResult = QueryHelper.getResultList(em, cq, null, null); @@ -168,7 +174,7 @@ public Map getCasesCountByClassification(DashboardC Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); Predicate criteriaFilter = createCaseCriteriaFilter(dashboardCriteria, caseQueryContext); - filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); + filter = and(cb, filter, criteriaFilter); Map result; if (filter != null) { @@ -219,7 +225,7 @@ public Map getCaseCountByDisease(DashboardCriteria dashboardCrite Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); - filter = CriteriaBuilderHelper.and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); + filter = and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); if (filter != null) { cq.where(filter); @@ -245,7 +251,7 @@ public String getLastReportedDistrictName(DashboardCriteria dashboardCriteria) { Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); - filter = CriteriaBuilderHelper.and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); + filter = and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); if (filter != null) { cq.where(filter); @@ -271,7 +277,7 @@ public Map getLastReportedDistrictByDisease(DashboardCriteria Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); - filter = CriteriaBuilderHelper.and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); + filter = and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); if (filter != null) { cq.where(filter); @@ -312,8 +318,8 @@ public Map getDeathCountByDisease(DashboardCriteria dashboardCrit Join person = joins.getPerson(); Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); - filter = CriteriaBuilderHelper.and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(person.get(Person.CAUSE_OF_DEATH_DISEASE), root.get(Case.DISEASE))); + filter = and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); + filter = and(cb, filter, cb.equal(person.get(Person.CAUSE_OF_DEATH_DISEASE), root.get(Case.DISEASE))); if (filter != null) { cq.where(filter); @@ -338,7 +344,7 @@ public long countCasesConvertedFromContacts(DashboardCriteria dashboardCriteria) Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); Predicate criteriaFilter = createCaseCriteriaFilter(dashboardCriteria, caseQueryContext); - filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); + filter = and(cb, filter, criteriaFilter); caze.join(Case.CONVERTED_FROM_CONTACT, JoinType.INNER); @@ -362,7 +368,7 @@ public Map getCasesCountPerPersonCondition(DashboardC Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); Predicate criteriaFilter = createCaseCriteriaFilter(dashboardCriteria, caseQueryContext); - filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); + filter = and(cb, filter, criteriaFilter); if (filter != null) { cq.where(filter); @@ -392,8 +398,8 @@ public List getNewEvents(DashboardCriteria dashboardCriteria) Join eventDistrict = eventJoins.getDistrict(); Predicate filter = eventService.createDefaultFilter(cb, event); - filter = CriteriaBuilderHelper.and(cb, filter, buildEventCriteriaFilter(dashboardCriteria, eventQueryContext)); - filter = CriteriaBuilderHelper.and(cb, filter, eventService.createUserFilter(eventQueryContext)); + filter = and(cb, filter, buildEventCriteriaFilter(dashboardCriteria, eventQueryContext)); + filter = and(cb, filter, eventService.createUserFilter(eventQueryContext)); List result; @@ -437,8 +443,8 @@ public Map getEventCountByStatus(DashboardCriteria dashboardC cq.groupBy(event.get(Event.EVENT_STATUS)); Predicate filter = eventService.createDefaultFilter(cb, event); - filter = CriteriaBuilderHelper.and(cb, filter, buildEventCriteriaFilter(dashboardCriteria, eventQueryContext)); - filter = CriteriaBuilderHelper.and(cb, filter, eventService.createUserFilter(eventQueryContext)); + filter = and(cb, filter, buildEventCriteriaFilter(dashboardCriteria, eventQueryContext)); + filter = and(cb, filter, eventService.createUserFilter(eventQueryContext)); if (filter != null) cq.where(filter); @@ -461,17 +467,17 @@ private Predicate createCaseCriteriaFilter( Predicate filter = null; if (dashboardCriteria.getDisease() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.DISEASE), dashboardCriteria.getDisease())); + filter = and(cb, filter, cb.equal(from.get(Case.DISEASE), dashboardCriteria.getDisease())); } if (dashboardCriteria.getRegion() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(responsibleRegion.get(Region.UUID), dashboardCriteria.getRegion().getUuid())); + filter = and(cb, filter, cb.equal(responsibleRegion.get(Region.UUID), dashboardCriteria.getRegion().getUuid())); } if (dashboardCriteria.getDistrict() != null) { filter = - CriteriaBuilderHelper.and(cb, filter, cb.equal(responsibleDistrict.get(District.UUID), dashboardCriteria.getDistrict().getUuid())); + and(cb, filter, cb.equal(responsibleDistrict.get(District.UUID), dashboardCriteria.getDistrict().getUuid())); } if (dashboardCriteria.getDateFrom() != null && dashboardCriteria.getDateTo() != null) { - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, caseService.createNewCaseFilter( @@ -481,12 +487,16 @@ private Predicate createCaseCriteriaFilter( dashboardCriteria.getNewCaseDateType())); } if (!dashboardCriteria.shouldIncludeNotACaseClassification()) { - filter = CriteriaBuilderHelper - .and(cb, filter, cb.notEqual(caseQueryContext.getRoot().get(Case.CASE_CLASSIFICATION), CaseClassification.NO_CASE)); + filter = and(cb, filter, cb.notEqual(caseQueryContext.getRoot().get(Case.CASE_CLASSIFICATION), CaseClassification.NO_CASE)); + } + + if (dashboardCriteria.getOutcome() != null) { + filter = and(cb, filter, cb.equal(from.get(Case.OUTCOME), dashboardCriteria.getOutcome())); } + // Exclude deleted cases. Archived cases should stay included - filter = CriteriaBuilderHelper.and(cb, filter, cb.isFalse(from.get(Case.DELETED))); + filter = and(cb, filter, cb.isFalse(from.get(Case.DELETED))); return filter; } @@ -498,10 +508,10 @@ private Predicate buildEventCriteriaFilter(DashboardCriteria dashboardCriteria, Predicate filter = null; if (dashboardCriteria.getDisease() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Event.DISEASE), dashboardCriteria.getDisease())); + filter = and(cb, filter, cb.equal(from.get(Event.DISEASE), dashboardCriteria.getDisease())); } if (dashboardCriteria.getRegion() != null) { - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, cb.equal( @@ -509,7 +519,7 @@ private Predicate buildEventCriteriaFilter(DashboardCriteria dashboardCriteria, dashboardCriteria.getRegion().getUuid())); } if (dashboardCriteria.getDistrict() != null) { - filter = CriteriaBuilderHelper.and( + filter = and( cb, filter, cb.equal( @@ -517,10 +527,10 @@ private Predicate buildEventCriteriaFilter(DashboardCriteria dashboardCriteria, dashboardCriteria.getDistrict().getUuid())); } - filter = CriteriaBuilderHelper.and(cb, filter, createEventDateFilter(eventQueryContext.getQuery(), cb, from, dashboardCriteria)); + filter = and(cb, filter, createEventDateFilter(eventQueryContext.getQuery(), cb, from, dashboardCriteria)); // Exclude deleted events. Archived events should stay included - filter = CriteriaBuilderHelper.and(cb, filter, cb.isFalse(from.get(Event.DELETED))); + filter = and(cb, filter, cb.isFalse(from.get(Event.DELETED))); return filter; } @@ -555,7 +565,7 @@ private Predicate createEventDateFilter(CriteriaQuery cq, CriteriaBuilder cb, cb.isNull(from.get(Event.START_DATE)), cb.isNull(from.get(Event.END_DATE)), cb.between(from.get(Event.REPORT_DATE_TIME), eventDateFrom, eventDateTo)); - filter = CriteriaBuilderHelper.and(cb, filter, cb.or(eventDateFilter, reportFilter)); + filter = and(cb, filter, cb.or(eventDateFilter, reportFilter)); } return filter; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java index f35d1690174..7a338a3b616 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java @@ -18,8 +18,10 @@ package de.symeda.sormas.backend.disease; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.stream.Collectors; import javax.ejb.EJB; @@ -28,26 +30,28 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EntityRelevanceStatus; -import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseCriteria; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseOutcome; +import de.symeda.sormas.api.dashboard.DashboardCriteria; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.disease.DiseaseFacade; import de.symeda.sormas.api.event.EventCriteria; +import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.outbreak.OutbreakCriteria; - import de.symeda.sormas.api.person.PresentCondition; - +import de.symeda.sormas.api.utils.criteria.CriteriaDateType; import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal; +import de.symeda.sormas.backend.dashboard.DashboardService; import de.symeda.sormas.backend.disease.DiseaseConfigurationFacadeEjb.DiseaseConfigurationFacadeEjbLocal; import de.symeda.sormas.backend.event.EventFacadeEjb.EventFacadeEjbLocal; +import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb; import de.symeda.sormas.backend.infrastructure.district.District; -import de.symeda.sormas.backend.infrastructure.region.RegionFacadeEjb; +import de.symeda.sormas.backend.infrastructure.region.RegionFacadeEjb.RegionFacadeEjbLocal; import de.symeda.sormas.backend.outbreak.OutbreakFacadeEjb.OutbreakFacadeEjbLocal; import de.symeda.sormas.backend.person.PersonFacadeEjb.PersonFacadeEjbLocal; @@ -59,26 +63,32 @@ public class DiseaseFacadeEjb implements DiseaseFacade { @EJB private CaseFacadeEjbLocal caseFacade; + // @EJB +// private DashboardService dashboardService; @EJB private EventFacadeEjbLocal eventFacade; @EJB private OutbreakFacadeEjbLocal outbreakFacade; @EJB private PersonFacadeEjbLocal personFacade; - - @EJB - private RegionFacadeEjb.RegionFacadeEjbLocal regionFacade; @EJB private DiseaseConfigurationFacadeEjbLocal diseaseConfigurationFacade; + @EJB + private RegionFacadeEjbLocal regionFacade; + @EJB + private DashboardService dashboardService; + + @EJB + private FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal featureConfigurationFacade; @Override public List getDiseaseBurdenForDashboard( - RegionReferenceDto regionRef, - DistrictReferenceDto districtRef, - Date from, - Date to, - Date previousFrom, - Date previousTo) { + RegionReferenceDto regionRef, + DistrictReferenceDto districtRef, + Date from, + Date to, + Date previousFrom, + Date previousTo) { //diseases List diseases = diseaseConfigurationFacade.getAllDiseases(true, true, true); @@ -90,11 +100,11 @@ public List getDiseaseBurdenForDashboard( //events Map events = - eventFacade.getEventCountByDisease(new EventCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); + eventFacade.getEventCountByDisease(new EventCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); //outbreaks Map outbreakDistrictsCount = outbreakFacade - .getOutbreakDistrictCountByDisease(new OutbreakCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); + .getOutbreakDistrictCountByDisease(new OutbreakCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); //last report district Map lastReportedDistricts = caseFacade.getLastReportedDistrictByDisease(caseCriteria, true, true); @@ -106,6 +116,7 @@ public List getDiseaseBurdenForDashboard( caseCriteria.newCaseDateBetween(previousFrom, previousTo, null); Map previousCases = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + //build diseasesBurden List diseasesBurden = diseases.stream().map(disease -> { Long caseCount = newCases.getOrDefault(disease, 0L); @@ -118,13 +129,13 @@ public List getDiseaseBurdenForDashboard( String lastReportedDistrictName = lastReportedDistrict == null ? "" : lastReportedDistrict.getName(); return new DiseaseBurdenDto( - disease, - caseCount, - previousCaseCount, - eventCount, - outbreakDistrictCount, - caseFatalityCount, - lastReportedDistrictName); + disease, + caseCount, + previousCaseCount, + eventCount, + outbreakDistrictCount, + caseFatalityCount, + lastReportedDistrictName); }).collect(Collectors.toList()); @@ -133,42 +144,48 @@ public List getDiseaseBurdenForDashboard( @Override public DiseaseBurdenDto getDiseaseForDashboard( - RegionReferenceDto regionRef, - DistrictReferenceDto districtRef, - Disease disease, - Date from, - Date to, - Date previousFrom, - Date previousTo) { + RegionReferenceDto region, + DistrictReferenceDto district, + Disease disease, + Date fromDate, + Date toDate, + Date previousFrom, + Date previousTo, + CriteriaDateType newCaseDateType, + CaseClassification caseClassification) { - //new cases - CaseCriteria caseCriteria = new CaseCriteria() - .newCaseDateBetween(from, to, null).region(regionRef).district(districtRef).disease(disease); - Map newCases = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + DashboardCriteria dashboardCriteria = + new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); - //events - Map events = - eventFacade.getEventCountByDisease(new EventCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); + Map newCases = dashboardService.getCaseCountByDisease(dashboardCriteria); + Map events = eventFacade + .getEventCountByDisease(new EventCriteria().region(region).district(district).eventDateType(null).eventDateBetween(fromDate, toDate)); - //outbreaks - Map outbreakDistrictsCount = outbreakFacade - .getOutbreakDistrictCountByDisease(new OutbreakCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); + //outbreaks + Map outbreakDistrictsCount; + if (featureConfigurationFacade.isFeatureEnabled(FeatureType.OUTBREAKS)) { + outbreakDistrictsCount = outbreakFacade + .getOutbreakDistrictCountByDisease(new OutbreakCriteria().region(region).district(district).reportedBetween(fromDate, toDate)); + } else { + outbreakDistrictsCount = new HashMap<>(); + } //outbreaks Map outbreakDistricts = outbreakFacade - .getOutbreakDistrictNameByDisease(new OutbreakCriteria().disease(disease).region(regionRef).district(districtRef).reportedBetween(from, to)); + .getOutbreakDistrictNameByDisease(new OutbreakCriteria().disease(disease).region(region).district(district).reportedBetween(fromDate, toDate)); + //last report district - Map lastReportedDistricts = caseFacade.getLastReportedDistrictByDisease(caseCriteria, true, true); + Map lastReportedDistricts = dashboardService.getLastReportedDistrictByDisease(dashboardCriteria); //case fatalities - Map caseFatalities = personFacade.getDeathCountByDisease(caseCriteria, true, true); + Map caseFatalities = dashboardService.getDeathCountByDisease(dashboardCriteria); //previous cases - caseCriteria.newCaseDateBetween(previousFrom, previousTo, null); - Map previousCases = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + dashboardCriteria.dateBetween(previousFrom, previousTo); + Map previousCases = dashboardService.getCaseCountByDisease(dashboardCriteria); //build diseasesBurden Long caseCount = newCases.getOrDefault(disease, 0L); @@ -182,76 +199,99 @@ public DiseaseBurdenDto getDiseaseForDashboard( String lastReportedDistrictName = lastReportedDistrict == null ? "" : lastReportedDistrict.getName(); String outbreakDistrictName = outbreakDistrict == null ? "" : outbreakDistrict.getName(); -// return new DiseaseBurdenDto( -// regionDto, -// disease, -// caseCount, -// previousCaseCount, -// eventCount, -// outbreakDistrictCount, -// caseFatalityCount, -// lastReportedDistrictName, -// "", -// null -// ); - return new DiseaseBurdenDto( - disease, - caseCount, - previousCaseCount, - eventCount, - outbreakDistrictCount, - caseFatalityCount, - lastReportedDistrictName, - outbreakDistrictName); -// -// }).collect(Collectors.toList()) -// return null; - } + return new DiseaseBurdenDto( + disease, + caseCount, + previousCaseCount, + eventCount, + outbreakDistrictCount, + caseFatalityCount, + lastReportedDistrictName, + outbreakDistrictName, + fromDate, + toDate + ); + } - + @Override public DiseaseBurdenDto getDiseaseGridForDashboard( - RegionReferenceDto regionRef, - DistrictReferenceDto districtRef, + RegionReferenceDto region, + DistrictReferenceDto district, Disease disease, - Date from, - Date to, + Date fromDate, + Date toDate, Date previousFrom, - Date previousTo) { + Date previousTo, + CriteriaDateType newCaseDateType, + CaseClassification caseClassification) { //Get the region - RegionDto regionDto = regionFacade.getByUuid(regionRef.getUuid()); + RegionDto regionDto = null; + if(Objects.nonNull(region)){ + regionDto = regionFacade.getByUuid(region.getUuid()); + } + //new cases - CaseCriteria caseCriteria = new CaseCriteria().newCaseDateBetween(from, to, null).region(regionRef).disease(disease); + //CaseCriteria caseCriteria = new CaseCriteria().newCaseDateBetween(from, to, newCaseDateType).region(regionRef).district(districtRef).disease(disease).caseClassification(caseClassification); + + DashboardCriteria dashboardCriteria = + new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); + + + //Map allCasesFetched = dashboardService.getCaseCountByDisease(caseCriteria); //Load count all dead/ fatalities - Map allCasesFetched = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + //Map allCasesFetched = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + Map allCasesFetched = dashboardService.getCaseCountByDisease(dashboardCriteria); - //case fatalities -// caseCriteria.setOutcome(CaseOutcome.DECEASED); - Map caseFatalities = personFacade.getDeathCountByDisease(caseCriteria, true, true); - caseCriteria.setOutcome(CaseOutcome.RECOVERED); - Map recoveredCase = personFacade.getDeathCountByDisease(caseCriteria, true, true); + //Map caseFatalities = personFacade.getDeathCountByDisease(d, true, true); + Map caseFatalities = dashboardService.getDeathCountByDisease(dashboardCriteria); + - caseCriteria.relevanceStatus(EntityRelevanceStatus.ACTIVE); - Map archievedCase = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + dashboardCriteria.setOutcome(CaseOutcome.NO_OUTCOME); + //caseCriteria.relevanceStatus(EntityRelevanceStatus.ACTIVE); +// Map archievedCase = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + Map archievedCase = dashboardService.getCaseCountByDisease(dashboardCriteria); + + //dashboardCriteria.relevanceStatus(null); + + + dashboardCriteria.setOutcome(CaseOutcome.RECOVERED); + //Map recoveredCase = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + Map recoveredCase = dashboardService.getCaseCountByDisease(dashboardCriteria); + + + dashboardCriteria.setOutcome(CaseOutcome.UNKNOWN); + + //Map unknown = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + Map unknown = dashboardService.getCaseCountByDisease(dashboardCriteria); + + dashboardCriteria.setOutcome(CaseOutcome.OTHER); + + //Map other = caseFacade.getCaseCountByDisease(caseCriteria, true, true); + Map other = dashboardService.getCaseCountByDisease(dashboardCriteria); //build diseasesBurden Long totalCaseCount = allCasesFetched.getOrDefault(disease, 0L); Long activeCaseCount = archievedCase.getOrDefault(disease, 0L); Long recoveredCaseCount = recoveredCase.getOrDefault(disease, 0L); Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); + Long otherCaseCount = other.getOrDefault(disease, 0L)+unknown.getOrDefault(disease, 0L); + return new DiseaseBurdenDto( regionDto, totalCaseCount.toString(), activeCaseCount.toString(), recoveredCaseCount.toString(), - caseFatalityCount.toString() + caseFatalityCount.toString(), + otherCaseCount.toString() ); + } @LocalBean diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java index b6e824dec45..dd7c5bdea8f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java @@ -35,6 +35,7 @@ import javax.persistence.criteria.Root; import javax.validation.constraints.NotNull; +import de.symeda.sormas.backend.infrastructure.InfrastructureAdo; import org.apache.commons.collections.CollectionUtils; import de.symeda.sormas.api.common.Page; @@ -351,17 +352,39 @@ public List getAllRegion() { } // Need to be in the same order as in the constructor - private void selectDtoFields(CriteriaQuery cq, Root root) { - +// private void selectDtoFields(CriteriaQuery cq, Root root) { +// +// cq.multiselect( +// root.get(Region.CREATION_DATE), +// root.get(Region.CHANGE_DATE), +// root.get(Region.UUID), +// root.get(Region.ARCHIVED), +// root.get(Region.NAME), +// root.get(Region.EPID_CODE), +// root.get(Region.GROWTH_RATE), +// root.get(Region.EXTERNAL_ID)); +// } + + + protected void selectDtoFields(CriteriaQuery cq, Root root) { + + Join country = root.join(Region.COUNTRY, JoinType.LEFT); + Join area = root.join(Region.AREA, JoinType.LEFT); + // Needs to be in the same order as in the constructor cq.multiselect( - root.get(Region.CREATION_DATE), - root.get(Region.CHANGE_DATE), - root.get(Region.UUID), - root.get(Region.ARCHIVED), + root.get(AbstractDomainObject.CREATION_DATE), + root.get(AbstractDomainObject.CHANGE_DATE), + root.get(AbstractDomainObject.UUID), + root.get(InfrastructureAdo.ARCHIVED), root.get(Region.NAME), root.get(Region.EPID_CODE), root.get(Region.GROWTH_RATE), - root.get(Region.EXTERNAL_ID)); + root.get(Region.EXTERNAL_ID), + //root.get(Region.ID), + country.get(AbstractDomainObject.UUID), + country.get(Country.DEFAULT_NAME), + country.get(Country.ISO_CODE), + area.get(AbstractDomainObject.UUID)); } @LocalBean 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 d125b8b987d..3801fe90228 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 @@ -1131,6 +1131,8 @@ public Boolean isEditAllowed(String uuid) { return sampleService.isEditAllowed(sample); } + + @RightsAllowed({ UserRight._SAMPLE_CREATE, UserRight._CASE_CREATE }) diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index ecd56a492f6..281d2c50874 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -12874,4 +12874,9 @@ UPDATE userroles set changedate = now() WHERE linkeddefaultuserrole in ('ADMIN', INSERT INTO schema_version (version_number, comment) VALUES (538, 'Introduce dedicated environment sample pathogen test rights #12836'); +-- 2024-01-29 Assigning DASHBOARD_DISEASE_DETAILS_ACCESS right to userroles that can view surveilance dashboard +INSERT INTO userroles_userrights (userrole_id, userright) SELECT userrole_id, 'DASHBOARD_DISEASE_DETAILS_ACCESS' FROM userroles_userrights WHERE userright = 'DASHBOARD_SURVEILLANCE_VIEW'; + +INSERT INTO schema_version (version_number, comment) VALUES (540, 'Assigning DASHBOARD_DISEASE_DETAILS_ACCESS right to userroles that can view surveilance dashboard'); + -- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. *** diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java index d9603ed725c..f07acca8073 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java @@ -18,9 +18,15 @@ import java.util.Date; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.dashboard.BaseDashboardCriteria; +import de.symeda.sormas.api.dashboard.DashboardCriteria; +import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.utils.criteria.CriteriaDateType; public abstract class AbstractDashboardDataProvider> { @@ -32,6 +38,11 @@ public abstract class AbstractDashboardDataProvider { + dashboardDataProvider.setDashboardType((DashboardType) e.getProperty().getValue()); + if (DashboardType.SURVEILLANCE.equals(e.getProperty().getValue())) { + SormasUI.get().getNavigator().navigateTo(SurveillanceDashboardView.VIEW_NAME); + } else if (DashboardType.DISEASE.equals(e.getProperty().getValue())) { + + SormasUI.get().getNavigator().navigateTo(DiseaseDetailsView.VIEW_NAME); + } + + else { + SormasUI.get().getNavigator().navigateTo(ContactsDashboardView.VIEW_NAME); + } + }); addHeaderComponent(dashboardSwitcher); // Hide the dashboard switcher if only one dashboard is accessible to the user @@ -151,46 +172,28 @@ protected AbstractDashboardView(String viewName) { dashboardLayout.setSizeFull(); dashboardLayout.setStyleName("crud-main-layout"); + // Filter bar +// filterLayout = new DashboardFilterLayout(this, dashboardDataProvider); +// dashboardLayout.addComponent(filterLayout); + addComponent(dashboardLayout); setExpandRatio(dashboardLayout, 1); } - protected void navigateToDashboardView(Property.ValueChangeEvent e) { if (DashboardType.SURVEILLANCE.equals(e.getProperty().getValue())) { SormasUI.get().getNavigator().navigateTo(SurveillanceDashboardView.VIEW_NAME); - } else if (DashboardType.CONTACTS.equals(e.getProperty().getValue())) { + } + else if (DashboardType.CONTACTS.equals(e.getProperty().getValue())) { SormasUI.get().getNavigator().navigateTo(ContactsDashboardView.VIEW_NAME); - } else if (DashboardType.SAMPLES.equals(e.getProperty().getValue())) { - SormasUI.get().getNavigator().navigateTo(SampleDashboardView.VIEW_NAME); - } else { - SormasUI.get().getNavigator().navigateTo(CampaignDashboardView.VIEW_NAME); } - } - protected AbstractDashboardView(String viewName, DashboardType dashboardType, Disease disease) { - super(viewName); - - if (disease == null) - this.disease = disease; - addStyleName(DashboardCssStyles.DASHBOARD_SCREEN); - System.out.println("Getting getDiseases: " + getDiseases()); - dashboardDataProvider.setDisease(disease); + else if (DashboardType.DISEASE.equals(e.getProperty().getValue())) { - SormasUI.get().getNavigator().navigateTo(DiseaseDetailsView.VIEW_NAME); - - // Dashboard layout - dashboardLayout = new VerticalLayout(); - dashboardLayout.setMargin(false); - dashboardLayout.setSpacing(false); - dashboardLayout.setSizeFull(); - dashboardLayout.setStyleName("crud-main-layout"); - - // Filter bar - //filterLayout = new DashboardFilterLayout(this, dashboardDataProvider); - - dashboardLayout.addComponent(filterLayout); - - addComponent(dashboardLayout); + SormasUI.get().getNavigator().navigateTo(DiseaseDetailsView.VIEW_NAME); + } + else if (DashboardType.CAMPAIGNS.equals(e.getProperty().getValue())) { + SormasUI.get().getNavigator().navigateTo(CampaignDashboardView.VIEW_NAME); + } } public void refreshDashboard() { @@ -203,10 +206,12 @@ public void refreshDiseaseData() { @Override public void enter(ViewChangeEvent event) { - if (!DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) + if (!DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) { + refreshDashboard(); + } // refreshDiseaseData(); // else - refreshDashboard(); + //refreshDashboard(); } //public abstract void refreshDashboard(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java index 8720185744b..2939ab935b1 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java @@ -22,15 +22,26 @@ import com.vaadin.navigator.Navigator; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.NewCaseDateType; +import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.api.feature.FeatureType; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.ui.SormasUI; +import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.dashboard.campaigns.CampaignDashboardView; import de.symeda.sormas.ui.dashboard.contacts.ContactsDashboardView; import de.symeda.sormas.ui.dashboard.diseasedetails.DiseaseDetailsView; import de.symeda.sormas.ui.dashboard.sample.SampleDashboardView; import de.symeda.sormas.ui.dashboard.surveillance.SurveillanceDashboardView; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Objects; +import java.util.TimeZone; + public class DashboardController { public DashboardController() { @@ -51,10 +62,55 @@ public void registerViews(Navigator navigator) { if (permitted(FeatureType.SAMPLES_LAB, UserRight.DASHBOARD_SAMPLES_VIEW)) { navigator.addView(SampleDashboardView.VIEW_NAME, SampleDashboardView.class); } + + //if (permitted(FeatureType.DISEASE_DETAILS,UserRight.DASHBOARD_DISEASE_DETAILS_ACCESS)) { + navigator.addView(DiseaseDetailsView.VIEW_NAME, DiseaseDetailsView.class); + //} } - public void navigateToDisease(Disease disease) { +// public void navigateToDisease(Disease disease) { +// String navigationState = DiseaseDetailsView.VIEW_NAME + "/" + disease.getName(); +// SormasUI.get().getNavigator().navigateTo(navigationState); +// } + + public void navigateToDisease(Disease disease,DashboardDataProvider dashboardDataProvider) { + Date dateFrom = dashboardDataProvider.getFromDate(); + + Date dateTo = dashboardDataProvider.getToDate(); + + NewDateFilterType type = dashboardDataProvider.getDateFilterType(); + + CaseClassification caseClassification= dashboardDataProvider.getCaseClassification(); +// + TimeZone tz = TimeZone.getTimeZone("UTC"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); // Quoted "Z" to indicate UTC, no timezone offset + df.setTimeZone(tz); + String dateFromAsISO = df.format(dateFrom); + String dateToAsISO = df.format(dateTo); + + NewCaseDateType newCaseDateType = dashboardDataProvider.getNewCaseDateType(); + + RegionReferenceDto region = dashboardDataProvider.getRegion(); + String regionId = null; + if(Objects.nonNull(region)&®ion.getUuid()!=null){ + regionId= region.getUuid(); + } + System.out.println(regionId); + + +// + String paramData = dateFromAsISO+"/"+dateToAsISO+"/"+type+"/"+caseClassification+"/"+newCaseDateType+"/"+regionId; +// + DiseaseDetailsView.setData(paramData); + //DiseaseDetailsView.setProvider(dashboardDataProvider); + String navigationState = DiseaseDetailsView.VIEW_NAME + "/" + disease.getName(); + //+"/"+dateFromAsISO+"/"+dateToAsISO+"/"+type.toString(); + //String navigationState = DiseaseDetailsView.VIEW_NAME + "/?disease=" + disease.getName(); SormasUI.get().getNavigator().navigateTo(navigationState); + + + + //SormasUI.get().getSession().setAttribute("paramdata", dateFromAsISO+"/"+dateToAsISO+"/"+type); } } 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 788f0fd3358..3738b12f6b4 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 @@ -26,20 +26,18 @@ import java.util.stream.Collectors; import de.symeda.sormas.api.caze.CaseCriteria; +import de.symeda.sormas.api.dashboard.*; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.utils.criteria.CriteriaDateType; import org.apache.commons.lang3.time.DateUtils; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseReferenceDefinition; import de.symeda.sormas.api.caze.NewCaseDateType; -import de.symeda.sormas.api.dashboard.DashboardCaseDto; -import de.symeda.sormas.api.dashboard.DashboardContactDto; -import de.symeda.sormas.api.dashboard.DashboardCriteria; -import de.symeda.sormas.api.dashboard.DashboardEventDto; -import de.symeda.sormas.api.dashboard.DashboardQuarantineDataDto; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.event.EventStatus; import de.symeda.sormas.api.outbreak.OutbreakCriteria; @@ -86,6 +84,21 @@ public class DashboardDataProvider extends AbstractDashboardDataProvider previousTestResults = new ArrayList<>(); private List regionDtoList; + private CaseClassification caseClassification; + + private NewDateFilterType dateFilterType; + private Date fromDate; + private Date toDate; + + private final Class dateTypeClass; + + public DashboardDataProvider(Class dateTypeClass) { + this.dateTypeClass = dateTypeClass; + } + + public DashboardDataProvider() { + this.dateTypeClass = CriteriaDateType.class; + } public void refreshData() { // Update the entities lists according to the filters @@ -97,18 +110,36 @@ public void refreshData() { this.refreshDataForSelectedDisease(); } + + @Override protected DashboardCriteria newCriteria() { - return new DashboardCriteria(); - } + return new DashboardCriteria(newCaseDateType); + } +// public void refreshDiseaseData() { +// setDiseaseBurdenDetail( +// FacadeProvider.getDiseaseFacade().getDiseaseForDashboard(region, district, disease, fromDate, toDate, previousFromDate, previousToDate)); +// +// setOutbreakDistrictCount( +// FacadeProvider.getOutbreakFacade() +// .getOutbreakDistrictCount( +// new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate))); +// +// this.refreshDataForSelectedDisease(); +// } + public void refreshDiseaseData() { - setDiseaseBurdenDetail( - FacadeProvider.getDiseaseFacade().getDiseaseForDashboard(region, district, disease, fromDate, toDate, previousFromDate, previousToDate)); + DiseaseBurdenDto dbd= FacadeProvider.getDiseaseFacade().getDiseaseForDashboard(region, district, disease, fromDate, toDate, previousFromDate, previousToDate + ,newCaseDateType + ,caseClassification); + + + setDiseaseBurdenDetail(dbd); setOutbreakDistrictCount( - FacadeProvider.getOutbreakFacade() - .getOutbreakDistrictCount( - new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate))); + FacadeProvider.getOutbreakFacade() + .getOutbreakDistrictCount( + new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate).caseClassification(caseClassification))); this.refreshDataForSelectedDisease(); } @@ -144,33 +175,37 @@ private void refreshDataForQuarantinedCases() { private Predicate quarantineData(Date fromDate, Date toDate) { return p -> { - Date quarantineFrom = p.getQuarantineFrom(); - Date quarantineTo = p.getQuarantineTo(); - - if (fromDate != null && toDate != null) { - if (quarantineFrom != null && quarantineTo != null) { - return quarantineTo.after(fromDate) && quarantineFrom.before(toDate); - } else if (quarantineFrom != null) { - return quarantineFrom.after(fromDate) && quarantineFrom.before(toDate); - } else if (quarantineTo != null) { - return quarantineTo.after(fromDate) && quarantineTo.before(toDate); + if (p != null) { + Date quarantineFrom = p.getQuarantineFrom(); + Date quarantineTo = p.getQuarantineTo(); + + if (fromDate != null && toDate != null) { + if (quarantineFrom != null && quarantineTo != null) { + return quarantineTo.after(fromDate) && quarantineFrom.before(toDate); + } else if (quarantineFrom != null) { + return quarantineFrom.after(fromDate) && quarantineFrom.before(toDate); + } else if (quarantineTo != null) { + return quarantineTo.after(fromDate) && quarantineTo.before(toDate); + } + } else if (fromDate != null) { + if (quarantineFrom != null) { + return quarantineFrom.after(fromDate); + } else if (quarantineTo != null) { + return quarantineTo.after(fromDate); + } + } else if (toDate != null) { + if (quarantineFrom != null) { + return quarantineFrom.before(toDate); + } else if (quarantineTo != null) { + return quarantineTo.before(toDate); + } } - } else if (fromDate != null) { - if (quarantineFrom != null) { - return quarantineFrom.after(fromDate); - } else if (quarantineTo != null) { - return quarantineTo.after(fromDate); - } - } else if (toDate != null) { - if (quarantineFrom != null) { - return quarantineFrom.before(toDate); - } else if (quarantineTo != null) { - return quarantineTo.before(toDate); - } - } + return false; + } return false; }; + } private Long getPlacedInQuarantine(List contactsInQuarantineDtos) { @@ -199,49 +234,74 @@ public void refreshDataForSelectedDisease() { if (getDashboardType() == DashboardType.CONTACTS) { // Contacts - setContacts(FacadeProvider.getContactFacade().getContactsForDashboard(region, district, disease, fromDate, toDate)); + setContacts(FacadeProvider.getContactFacade().getContactsForDashboard(region, district, disease, fromDate, toDate, caseClassification)); setPreviousContacts( - FacadeProvider.getContactFacade().getContactsForDashboard(region, district, disease, previousFromDate, previousToDate)); + FacadeProvider.getContactFacade() + .getContactsForDashboard(region, district, disease, previousFromDate, previousToDate, caseClassification)); this.refreshDataForQuarantinedContacts(); } - if (getDashboardType() == DashboardType.CONTACTS || this.disease != null) { - DashboardCriteria caseDashboardCriteria = buildDashboardCriteria(fromDate, toDate); +// if (getDashboardType() == DashboardType.SAMPLES) { +// //Samples counts +// setSampleCount(FacadeProvider.getSampleFacade().getSampleCounts(region, district, disease, fromDate, toDate)); +// setPreviousSampleCount(FacadeProvider.getSampleFacade().getSampleCounts(region, district, disease, previousFromDate, previousToDate)); +// } + if (getDashboardType() == DashboardType.CONTACTS || getDashboardType() == DashboardType.SAMPLES || this.disease != null) { // Cases - setCases(FacadeProvider.getDashboardFacade().getCases(caseDashboardCriteria)); - setLastReportedDistrict(FacadeProvider.getDashboardFacade().getLastReportedDistrictName(caseDashboardCriteria)); - setCasesCountByClassification( - FacadeProvider.getDashboardFacade() - .getCasesCountByClassification(buildDashboardCriteria(fromDate, toDate).includeNotACaseClassification(true))); + DashboardCriteria dashboardCriteria = new DashboardCriteria(dateTypeClass).region(region) + .district(district) + .disease(disease) + .newCaseDateType(newCaseDateType) + .dateBetween(fromDate, toDate) + .caseClassification(caseClassification); + setCases(FacadeProvider.getDashboardFacade().getCases(dashboardCriteria)); + setLastReportedDistrict(FacadeProvider.getDashboardFacade().getLastReportedDistrictName(dashboardCriteria)); + + dashboardCriteria.dateBetween(previousFromDate, previousToDate); + setPreviousCases(FacadeProvider.getDashboardFacade().getCases(dashboardCriteria)); - setPreviousCases(FacadeProvider.getDashboardFacade().getCases(buildDashboardCriteria(previousFromDate, previousToDate))); - - // test results if (getDashboardType() != DashboardType.CONTACTS) { - setNewCasesFinalLabResultCountByResultType( - FacadeProvider.getDashboardFacade().getNewCasesFinalLabResultCountByResultType(caseDashboardCriteria)); + dashboardCriteria.dateBetween(fromDate, toDate); + setTestResultCountByResultType(FacadeProvider.getDashboardFacade().getTestResultCountByResultType(dashboardCriteria)); } + + dashboardCriteria.dateBetween(fromDate, toDate).includeNotACaseClassification(true); + + setCasesCountByClassification(FacadeProvider.getDashboardFacade().getCasesCountByClassification(dashboardCriteria)); + + System.out.println("===dashboardCriteria==="); + + System.out.println(dashboardCriteria); + } + + if (getDashboardType() == DashboardType.DISEASE || this.disease != null) { // Cases CaseCriteria caseCriteria = new CaseCriteria(); - caseCriteria.region(region).district(district).disease(disease).newCaseDateBetween(fromDate, toDate, NewCaseDateType.MOST_RELEVANT); - setCases(FacadeProvider.getCaseFacade().getCasesForDashboard(caseCriteria)); + caseCriteria.region(region).district(district).disease(disease).newCaseDateBetween(fromDate, toDate, newCaseDateType); + //setCases(FacadeProvider.getCaseFacade().getCasesForDashboard(caseCriteria)); setLastReportedDistrict(FacadeProvider.getCaseFacade().getLastReportedDistrictName(caseCriteria, true, true)); - caseCriteria.newCaseDateBetween(previousFromDate, previousToDate, NewCaseDateType.MOST_RELEVANT); + caseCriteria.newCaseDateBetween(previousFromDate, previousToDate, newCaseDateType); + caseCriteria.setCaseClassification(caseClassification); + caseCriteria.setNewCaseDateType(newCaseDateType); + + //setCases(FacadeProvider.getCaseFacade().getCasesForDashboard(caseCriteria)); + setPreviousCases(FacadeProvider.getCaseFacade().getCasesForDashboard(caseCriteria)); if (getCases().size() > 0) { setTestResultCountByResultType( - FacadeProvider.getSampleFacade() - .getNewTestResultCountByResultType(getCases().stream().map(c -> c.getId()).collect(Collectors.toList()))); + FacadeProvider.getSampleFacade() + .getNewTestResultCountByResultType(getCases().stream().map(c -> c.getId()).collect(Collectors.toList()))); } else { setTestResultCountByResultType(new HashMap<>()); } + } if (this.disease == null || getDashboardType() == DashboardType.CONTACTS) { @@ -249,18 +309,30 @@ public void refreshDataForSelectedDisease() { } // Events - DashboardCriteria eventDashboardCriteria = buildDashboardCriteriaWithDates(); - setEvents(FacadeProvider.getDashboardFacade().getNewEvents(eventDashboardCriteria)); - setEventCountByStatus(FacadeProvider.getDashboardFacade().getEventCountByStatus(eventDashboardCriteria)); + DashboardCriteria dashboardCriteria = new DashboardCriteria(dateTypeClass).region(region) + .district(district) + .disease(disease) + .dateBetween(fromDate, toDate) + .caseClassification(caseClassification); + + setEvents(FacadeProvider.getDashboardFacade().getNewEvents(dashboardCriteria)); + + setEventCountByStatus(FacadeProvider.getDashboardFacade().getEventCountByStatus(dashboardCriteria)); setOutbreakDistrictCount( - FacadeProvider.getOutbreakFacade() - .getOutbreakDistrictCount( - new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate))); + FacadeProvider.getOutbreakFacade() + .getOutbreakDistrictCount( + new OutbreakCriteria().region(region) + .district(district) + .disease(disease) + .reportedBetween(fromDate, toDate) + .caseClassification(caseClassification))); refreshDataForQuarantinedCases(); refreshDataForConvertedContactsToCase(); refreshDataForCasesWithReferenceDefinitionFulfilled(); + + } private DashboardCriteria buildDashboardCriteria(Date fromDate, Date toDate) { @@ -438,4 +510,64 @@ public List getRegionDtoList() { public void setRegionDtoList(List regionDtoList) { this.regionDtoList = regionDtoList; } + + public CaseClassification getCaseClassification() { + return caseClassification; + } + + public void setCaseClassification(CaseClassification caseClassification) { + this.caseClassification = caseClassification; + } + + public NewDateFilterType getDateFilterType() { + if (dateFilterType == NewDateFilterType.TODAY) { + setFromDate(DateHelper.getStartOfDay(new Date())); + setToDate(new Date()); + } + if (dateFilterType == NewDateFilterType.YESTERDAY) { + setFromDate(DateHelper.getStartOfDay(DateHelper.subtractDays(new Date(), 1))); + setToDate(DateHelper.getEndOfDay(DateHelper.subtractDays(new Date(), 1))); + } + if (dateFilterType == NewDateFilterType.THIS_WEEK) { + setFromDate(DateHelper.getStartOfWeek(new Date())); + setToDate(new Date()); + } + if (dateFilterType == NewDateFilterType.LAST_WEEK) { + setFromDate(DateHelper.getStartOfWeek(DateHelper.subtractWeeks(new Date(), 1))); + setToDate(DateHelper.getEndOfWeek(DateHelper.subtractWeeks(new Date(), 1))); + } + if (dateFilterType == NewDateFilterType.THIS_YEAR) { + setFromDate(DateHelper.getStartOfWeek(DateHelper.getStartOfYear(new Date()))); + setToDate(new Date()); + } + return dateFilterType; + } + + public void setDateFilterType(NewDateFilterType dateFilterType) { + this.dateFilterType = dateFilterType; + } + + public Date getFromDate() { + return fromDate; + } + + public void setFromDate(Date fromDate) { + this.fromDate = fromDate; + } + + public Date getToDate() { + return toDate; + } + + public void setToDate(Date toDate) { + this.toDate = toDate; + } + + public Date getPreviousFromDate() { + return previousFromDate; + } + + public void setPreviousFromDate(Date previousFromDate) { + this.previousFromDate = previousFromDate; + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java index 187c86f1282..7370bb8cc24 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java @@ -26,10 +26,16 @@ import java.util.function.Consumer; import com.vaadin.icons.VaadinIcons; +import com.vaadin.navigator.ViewChangeListener; import com.vaadin.shared.ui.ContentMode; import com.vaadin.ui.*; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.action.ActionDto; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.CaseIndexDto; +import de.symeda.sormas.api.contact.ContactIndexDto; +import de.symeda.sormas.api.dashboard.DashboardCriteria; +import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.DashboardType; import org.apache.commons.lang3.ArrayUtils; @@ -63,12 +69,13 @@ import de.symeda.sormas.ui.utils.EpiWeekAndDateFilterComponent; @SuppressWarnings("serial") -public abstract class DashboardFilterLayout

extends HorizontalLayout { +public class DashboardFilterLayout

extends HorizontalLayout { public static final String DATE_FILTER = "dateFilter"; public static final String REGION_FILTER = "regionFilter"; public static final String DISTRICT_FILTER = "districtFilter"; private static final String RESET_AND_APPLY_BUTTONS = "resetAndApplyButtons"; + public static final String CASE_CLASSIFICATION_FILTER = "caseClassificationFilter"; protected AbstractDashboardView dashboardView; protected P dashboardDataProvider; @@ -95,7 +102,7 @@ public abstract class DashboardFilterLayout

diseaseFilterChangeCallback; private Label infoLabel; + private ComboBox caseClassificationFilter; public DashboardFilterLayout(AbstractDashboardView dashboardView, P dashboardDataProvider) { this.dashboardView = dashboardView; @@ -113,12 +121,15 @@ public DashboardFilterLayout(AbstractDashboardView dashboardView, P dashboardDat this.diseaseFilter = new ComboBox(); dateFilterButtons = new HashSet<>(); dateComparisonButtons = new HashSet<>(); + this.caseClassificationFilter = ComboBoxHelper.createComboBoxV7(); setSpacing(true); setSizeUndefined(); setMargin(new MarginInfo(true, true, false, true)); - createDateFilters(); + //createDateFilters(); + createDateFiltersNew(dashboardDataProvider); + // createRegionAndDistrictFilter(); if (dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE) { createRegionAndDistrictFilter(); @@ -136,6 +147,7 @@ public DashboardFilterLayout(AbstractDashboardView dashboardView, P dashboardDat this.districtFilter = ComboBoxHelper.createComboBoxV7(); dateFilterButtons = new HashSet<>(); dateComparisonButtons = new HashSet<>(); + this.caseClassificationFilter = ComboBoxHelper.createComboBoxV7(); setSpacing(true); setSizeUndefined(); @@ -149,8 +161,22 @@ public DashboardFilterLayout(AbstractDashboardView dashboardView, P dashboardDat customLayout = new CustomLayout(); customLayout.setTemplateContents(filterLocs(templateLocs)); + //createDateFiltersNew(dashboardDataProvider); + addComponent(customLayout); populateLayout(); + if(currentDateFilterType!=null) { + String dateFilterType = currentDateFilterType.name(); + dashboardDataProvider.setDateFilterType(NewDateFilterType.valueOf(dateFilterType)); + } + + if (dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE) { + createRegionAndDistrictFilter(); + } + if (dashboardDataProvider.getDashboardType() == DashboardType.CONTACTS) { + createRegionAndDistrictFilter(); + createDiseaseFilter(); + } } public void populateLayout() { @@ -183,6 +209,18 @@ protected void createRegionAndDistrictFilter() { createDistrictFilter(null); } + //Case Classification filter + public void createCaseClassificationFilter() { + caseClassificationFilter.setWidth(200, Unit.PIXELS); + caseClassificationFilter.setInputPrompt(I18nProperties.getPrefixCaption(CaseIndexDto.I18N_PREFIX, ContactIndexDto.CASE_CLASSIFICATION)); + caseClassificationFilter.addItems((Object[]) CaseClassification.values()); + caseClassificationFilter.addValueChangeListener(e -> { + dashboardDataProvider.setCaseClassification((CaseClassification) caseClassificationFilter.getValue()); + }); + addCustomComponent(caseClassificationFilter, CASE_CLASSIFICATION_FILTER); + dashboardDataProvider.setCaseClassification((CaseClassification) caseClassificationFilter.getValue()); + } + protected void createRegionFilter(String description) { if (UserProvider.getCurrent().getUser().getRegion() == null) { regionFilter.setWidth(200, Unit.PIXELS); @@ -258,11 +296,11 @@ public void createDateFilters() { dateFilterLayout.addComponents(btnCurrentPeriod, lblComparedTo, btnComparisonPeriod); - infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); - infoLabel.setSizeUndefined(); - CssStyles.style(infoLabel, CssStyles.LABEL_XLARGE, CssStyles.LABEL_SECONDARY); - addComponent(infoLabel); - setComponentAlignment(infoLabel, Alignment.TOP_RIGHT); +// infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); +// infoLabel.setSizeUndefined(); +// CssStyles.style(infoLabel, CssStyles.LABEL_XLARGE, CssStyles.LABEL_SECONDARY); +// addComponent(infoLabel); +// setComponentAlignment(infoLabel, Alignment.TOP_RIGHT); // Set initial date filter CssStyles.style(btnThisWeek, CssStyles.BUTTON_FILTER_DARK); @@ -272,10 +310,63 @@ public void createDateFilters() { activeComparisonButton = btnPeriodBefore; currentDateFilterType = DateFilterType.THIS_WEEK; setDateFilter(DateHelper.getStartOfWeek(new Date()), new Date()); - updateComparisonButtons(DateFilterType.THIS_WEEK, DateHelper.getStartOfWeek(new Date()), new Date(), false); + updateComparisonButtons(NewDateFilterType.THIS_WEEK, DateHelper.getStartOfWeek(new Date()), new Date(), false); btnCurrentPeriod.setCaption(btnThisWeek.getCaption()); + } + + private void createDateFiltersNew(P dashboardDataProvider) { + HorizontalLayout dateFilterLayout = new HorizontalLayout(); + dateFilterLayout.setSpacing(true); + CssStyles.style(dateFilterLayout, CssStyles.VSPACE_3); + addComponent(dateFilterLayout); + + btnCurrentPeriod = ButtonHelper.createIconPopupButton( + "currentPeriod", + null, + new VerticalLayout(createDateFilterButtonsLayout(), createCustomDateFilterLayout()), + CssStyles.BUTTON_FILTER, + CssStyles.BUTTON_FILTER_LIGHT); + + Label lblComparedTo = new Label(I18nProperties.getCaption(Captions.dashboardComparedTo)); + CssStyles.style(lblComparedTo, CssStyles.VSPACE_TOP_4, CssStyles.LABEL_BOLD); + + btnComparisonPeriod = ButtonHelper.createIconPopupButton( + "comparisonPeriod", + null, + createDateComparisonButtonsLayout(), + ValoTheme.BUTTON_BORDERLESS, + CssStyles.BUTTON_FILTER, + CssStyles.BUTTON_FILTER_LIGHT); + + dateFilterLayout.addComponents(btnCurrentPeriod, lblComparedTo, btnComparisonPeriod); + +// infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); +// infoLabel.setSizeUndefined(); +// CssStyles.style(infoLabel, CssStyles.LABEL_XLARGE, CssStyles.LABEL_SECONDARY); +// addComponent(infoLabel); +// setComponentAlignment(infoLabel, Alignment.TOP_RIGHT); + + // Set initial date filter + CssStyles.style(btnThisWeek, CssStyles.BUTTON_FILTER_DARK); + CssStyles.removeStyles(btnThisWeek, CssStyles.BUTTON_FILTER_LIGHT); + CssStyles.style(btnPeriodBefore, CssStyles.BUTTON_FILTER_DARK); + CssStyles.removeStyles(btnPeriodBefore, CssStyles.BUTTON_FILTER_LIGHT); + activeComparisonButton = btnPeriodBefore; + + + + setDateFilter(dashboardDataProvider.getFromDate(), dashboardDataProvider.getToDate()); + + + //setDateFilter(DateHelper.getStartOfWeek(new Date()), new Date()); + + //updateComparisonButtons(dashboardDataProvider.getDateFilterType(), dashboardDataProvider.getFromDate(), dashboardDataProvider.getToDate(), false); + + updateComparisonButtons(NewDateFilterType.THIS_WEEK, DateHelper.getStartOfWeek(new Date()), new Date(), false); + btnCurrentPeriod.setCaption(btnThisWeek.getCaption()); + } private HorizontalLayout createDateFilterButtonsLayout() { HorizontalLayout layout = new HorizontalLayout(); layout.setSpacing(true); @@ -295,7 +386,7 @@ private HorizontalLayout createDateFilterButtonsLayout() { Date to = now; setDateFilter(from, to); btnCurrentPeriod.setCaption(btnToday.getCaption()); - updateComparisonButtons(DateFilterType.TODAY, from, to, false); + updateComparisonButtons(NewDateFilterType.TODAY, from, to, false); if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) dashboardView.refreshDiseaseData(); else @@ -314,7 +405,7 @@ private HorizontalLayout createDateFilterButtonsLayout() { Date to = DateHelper.getEndOfDay(DateHelper.subtractDays(now, 1)); setDateFilter(from, to); btnCurrentPeriod.setCaption(btnYesterday.getCaption()); - updateComparisonButtons(DateFilterType.YESTERDAY, from, to, false); + updateComparisonButtons(NewDateFilterType.YESTERDAY, from, to, false); if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) dashboardView.refreshDiseaseData(); else @@ -334,7 +425,7 @@ private HorizontalLayout createDateFilterButtonsLayout() { Date to = now; setDateFilter(from, to); btnCurrentPeriod.setCaption(btnThisWeek.getCaption()); - updateComparisonButtons(DateFilterType.THIS_WEEK, from, to, false); + updateComparisonButtons(NewDateFilterType.THIS_WEEK, from, to, false); if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) dashboardView.refreshDiseaseData(); else @@ -354,7 +445,7 @@ private HorizontalLayout createDateFilterButtonsLayout() { Date to = DateHelper.getEndOfWeek(DateHelper.subtractWeeks(now, 1)); setDateFilter(from, to); btnCurrentPeriod.setCaption(btnLastWeek.getCaption()); - updateComparisonButtons(DateFilterType.LAST_WEEK, from, to, false); + updateComparisonButtons(NewDateFilterType.LAST_WEEK, from, to, false); if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) dashboardView.refreshDiseaseData(); else @@ -374,7 +465,7 @@ private HorizontalLayout createDateFilterButtonsLayout() { Date to = now; setDateFilter(from, to); btnCurrentPeriod.setCaption(btnThisYear.getCaption()); - updateComparisonButtons(DateFilterType.THIS_YEAR, from, to, false); + updateComparisonButtons(NewDateFilterType.THIS_YEAR, from, to, false); if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) dashboardView.refreshDiseaseData(); else @@ -449,7 +540,7 @@ private HorizontalLayout createCustomDateFilterLayout() { DateHelper.getEpiWeekYearBefore(fromWeek).toShortString() + " - " + DateHelper.getEpiWeekYearBefore(toWeek).toShortString())); } - updateComparisonButtons(DateFilterType.CUSTOM, null, null, true); + updateComparisonButtons(NewDateFilterType.CUSTOM, null, null, true); if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) dashboardView.refreshDiseaseData(); else @@ -535,7 +626,7 @@ private void changeCustomDateFilterPanelStyle(Button activeFilterButton, Set diseaseBurden; private String outbreakDivStyles; - public DashboardDataProvider getDashboardDataProvider() { - return dashboardDataProvider; - } - - public void setDashboardDataProvider(DashboardDataProvider dashboardDataProvider) { - this.dashboardDataProvider = dashboardDataProvider; - } - - public String getOutbreakDivStyles() { - return outbreakDivStyles; - } - - public void setOutbreakDivStyles(String outbreakDivStyles) { - this.outbreakDivStyles = outbreakDivStyles; - } - - public DiseaseDetailsComponent(DashboardDataProvider dashboardDataProvider) { + public DiseaseDetailsComponent(DashboardDataProvider dashboardDataProvider) { this.dashboardDataProvider = dashboardDataProvider; addStyleName("disease-detail-card-display-top"); @@ -51,73 +36,55 @@ public DiseaseDetailsComponent(DashboardDataProvider dashboardDataProvider) { "color: white; transform-origin: bottom; float: right; margin-right: -150px; margin-top: -10px;"; } + public void refresh(){ + addTopLayout( + dashboardDataProvider.getDiseaseBurdenDetail().getDisease(), + dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getPreviousCaseCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getOutbreakDistrictCount() > 0); + + addStatsLayout( + dashboardDataProvider.getDiseaseBurdenDetail().getCaseDeathCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), + dashboardDataProvider.getDiseaseBurdenDetail().getOutbreakDistrict(), + dashboardDataProvider.getDiseaseBurdenDetail().getLastReportedDistrictName(), + dashboardDataProvider.getDiseaseBurdenDetail().getDisease()); + } - public void refresh(){ - addTopLayout( - dashboardDataProvider.getDiseaseBurdenDetail().getDisease(), - dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), - dashboardDataProvider.getDiseaseBurdenDetail().getPreviousCaseCount(), - dashboardDataProvider.getDiseaseBurdenDetail().getOutbreakDistrictCount() > 0); - - addStatsLayout( - dashboardDataProvider.getDiseaseBurdenDetail().getCaseDeathCount(), - dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), - dashboardDataProvider.getDiseaseBurdenDetail().getOutbreakDistrict(), - dashboardDataProvider.getDiseaseBurdenDetail().getLastReportedDistrictName(), - dashboardDataProvider.getDiseaseBurdenDetail().getDisease()); - } - - private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCount, boolean isOutbreak) { - VerticalLayout layout = new VerticalLayout(); - layout.setMargin(true); - layout.setSpacing(false); - CssStyles.style(layout, CssStyles.getDiseaseColor(disease)); - layout.setHeight(200, Unit.PIXELS); - layout.setWidth(250, Unit.PIXELS); - - HorizontalLayout nameAndOutbreakLayout = new HorizontalLayout(); - nameAndOutbreakLayout.setMargin(false); - nameAndOutbreakLayout.setSpacing(false); - nameAndOutbreakLayout.setHeight(90, Unit.PIXELS); - nameAndOutbreakLayout.setWidth(200, Unit.PIXELS); - - HorizontalLayout nameLayout = new HorizontalLayout(); - nameLayout.setMargin(false); - nameLayout.setSpacing(false); - nameLayout.setHeight(50, Unit.PIXELS); - nameLayout.setWidth(200, Unit.PIXELS); - Label nameLabel = new Label(disease.toShortString()); - nameLabel.setSizeUndefined(); - nameLabel.setHeight(20, Unit.PIXELS); - - CssStyles.style( - nameLabel, - CssStyles.LABEL_WHITE, - nameLabel.getValue().length() > 12 ? CssStyles.LABEL_SMALL : CssStyles.LABEL_WHITE, - CssStyles.LABEL_LARGE, - CssStyles.ALIGN_CENTER, - CssStyles.LABEL_UPPERCASE); - nameLayout.addComponent(nameLabel); - nameLayout.setComponentAlignment(nameLabel, Alignment.MIDDLE_CENTER); - nameAndOutbreakLayout.addComponent(nameLayout); - nameAndOutbreakLayout.setExpandRatio(nameLayout, 1); - - if (isOutbreak) { - HorizontalLayout outbreakLayout = new HorizontalLayout(); - outbreakLayout.setMargin(false); - outbreakLayout.setSpacing(false); - outbreakLayout.setHeight(15, Unit.PIXELS); - outbreakLayout.setWidth(100, Unit.PIXELS); -// Label outbreakLabel = new Label("",ContentMode.HTML); - Label outbreakLabel = new Label(I18nProperties.getCaption(Captions.dashboardOutbreak).toUpperCase(), ContentMode.HTML); - outbreakLabel.setStyleName("disease-detail-outbreak-display", true); -// outbreakLabel.setValue("

" + I18nProperties.getCaption(Captions.dashboardOutbreak).toUpperCase() + "
"); -// outbreakLabel.setStyleName("disease-detail-outbreak-display", true); -// CssStyles.style(outbreakLabel, CssStyles.LABEL_WHITE, CssStyles.ALIGN_CENTER, CssStyles.LABEL_UPPERCASE); - outbreakLayout.addComponent(outbreakLabel); -// outbreakLayout.setComponentAlignment(outbreakLabel, Alignment.BOTTOM_RIGHT); - nameAndOutbreakLayout.addComponent(outbreakLayout); - } + private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCount, boolean isOutbreak) { + VerticalLayout layout = new VerticalLayout(); + layout.setMargin(true); + layout.setSpacing(false); + CssStyles.style(layout, CssStyles.getDiseaseColor(disease)); + layout.setHeight(200, Unit.PIXELS); + layout.setWidth(250, Unit.PIXELS); + + HorizontalLayout nameAndOutbreakLayout = new HorizontalLayout(); + nameAndOutbreakLayout.setMargin(false); + nameAndOutbreakLayout.setSpacing(false); + nameAndOutbreakLayout.setHeight(90, Unit.PIXELS); + nameAndOutbreakLayout.setWidth(200, Unit.PIXELS); + + HorizontalLayout nameLayout = new HorizontalLayout(); + nameLayout.setMargin(false); + nameLayout.setSpacing(false); + nameLayout.setHeight(50, Unit.PIXELS); + nameLayout.setWidth(200, Unit.PIXELS); + Label nameLabel = new Label(disease.toShortString()); + nameLabel.setSizeUndefined(); + nameLabel.setHeight(20, Unit.PIXELS); + + CssStyles.style( + nameLabel, + CssStyles.LABEL_WHITE, + nameLabel.getValue().length() > 12 ? CssStyles.LABEL_SMALL : CssStyles.LABEL_WHITE, + CssStyles.LABEL_LARGE, + CssStyles.ALIGN_CENTER, + CssStyles.LABEL_UPPERCASE); + nameLayout.addComponent(nameLabel); + nameLayout.setComponentAlignment(nameLabel, Alignment.MIDDLE_CENTER); + nameAndOutbreakLayout.addComponent(nameLayout); + nameAndOutbreakLayout.setExpandRatio(nameLayout, 1); if (isOutbreak) { HorizontalLayout outbreakLayout = new HorizontalLayout(); @@ -155,6 +122,7 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo countLayout.addComponent(countLabel); countLayout.setComponentAlignment(countLabel, Alignment.MIDDLE_CENTER); + // HorizontalLayout comparisonLayout = new HorizontalLayout(); // { // comparisonLayout.setMargin(false); @@ -194,27 +162,6 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo addComponent(layout); } - // HorizontalLayout countLayout = new HorizontalLayout(); - // countLayout.setMargin(false); - // countLayout.setSpacing(false); - // CssStyles.style(countLayout, CssStyles.getDiseaseColor(disease)); - // countLayout.setHeight(40, Unit.PIXELS); - // countLayout.setWidth(70, Unit.PIXELS); - - // Label countLabel = new Label("", ContentMode.HTML); - // String fontSize = casesCount.toString().length() < 5 ? "70px" : "50px"; - // countLabel.setValue( - // "
" - // + casesCount.toString() + "
"); - - // countLayout.addComponent(countLabel); - // countLayout.setComponentAlignment(countLabel, Alignment.MIDDLE_CENTER); - - - - // layout.addComponent(countLayout); - // layout.setComponentAlignment(countLayout, Alignment.BOTTOM_CENTER); - // layout.setExpandRatio(countLayout, 0.65f); private void addStatsLayout(Long fatalities, Long totalCase, String outbreakDistrict, String district, Disease disease) { VerticalLayout layout = new VerticalLayout(); @@ -226,6 +173,7 @@ private void addStatsLayout(Long fatalities, Long totalCase, String outbreakDist CssStyles.style(layout, CssStyles.getDiseaseColor(disease), CssStyles.BACKGROUND_DARKER); float cfrPercent = calculateCfr(fatalities, totalCase); + layout.addComponent(createDeathCfrItem(I18nProperties.getCaption(Captions.dashboardFatalities)+": ", fatalities.toString()+"", fatalities > 0, I18nProperties.getCaption(Captions.DiseaseBurden_caseFatalityRate)+": ", @@ -263,9 +211,10 @@ private HorizontalLayout createDeathCfrItem(String fatalityLabel, String fatalit Label fatalityNameLabel = new Label("", ContentMode.HTML); CssStyles.style(fatalityNameLabel, CssStyles.LABEL_WHITE, CssStyles.LABEL_PRIMARY, isCritical ? CssStyles.LABEL_CRITICAL : "", CssStyles.HSPACE_LEFT_3); - fatalityNameLabel.setValue("
" + fatalityLabel + "
" + + fatalityNameLabel.setValue("
" + fatalityLabel + "
" + "
" + fatalityValue+ "
"); + layout.addComponent(fatalityNameLabel); layout.setExpandRatio(fatalityNameLabel, 1); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java index cd6d5281e4a..3e167511fd8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java @@ -1,15 +1,29 @@ package de.symeda.sormas.ui.dashboard.diseasedetails; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.NewCaseDateType; +import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.api.infrastructure.region.RegionDto; +import de.symeda.sormas.ui.SormasUI; import de.symeda.sormas.ui.dashboard.AbstractDashboardView; +import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.DashboardType; import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; +import de.symeda.sormas.ui.dashboard.contacts.components.ContactsFilterLayout; import de.symeda.sormas.ui.utils.ViewConfiguration; import static com.vaadin.navigator.ViewChangeListener.*; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.EnumSet; + @SuppressWarnings("serial") public class DiseaseDetailsView extends AbstractDashboardView { @@ -17,17 +31,183 @@ public class DiseaseDetailsView extends AbstractDashboardView { public static final String VIEW_NAME = ROOT_VIEW_NAME + "/disease"; protected DiseaseDetailsViewLayout diseaseDetailsViewLayout; - private DiseaseDetailsComponent diseaseDetailsComponent; - //private RegionalDiseaseBurdenGrid regionalDiseaseBurdenGrid; - private ViewConfiguration viewConfiguration; + + public static String data; + public static void setData(String newData) { + data=newData; + } + public DiseaseDetailsView() { - super(VIEW_NAME); - filterLayout.setInfoLabelText(I18nProperties.getString(Strings.classificationForDisease)); - //filterLayout = new DashboardFilterLayout(this, dashboardDataProvider); + super(VIEW_NAME, DashboardType.DISEASE); + dashboardLayout.setSpacing(false); - //Added Component + String paramData = (String) SormasUI.get().getSession().getAttribute("paramdata"); + + + if (data != null) { + + String dateFrom = data.split("/")[0]; + + String dateTo = data.split("/")[1]; + + String type = data.split("/")[2]; + + String caseClassification = data.split("/")[3]; + + String newCaseDateType = data.split("/")[4]; + + String regionId = data.split("/")[5]; + + if (dateFrom != null) { + + + DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd"); + String string1 = dateFrom; + try { + Date result1 = df1.parse(string1); + dashboardDataProvider.setFromDate(result1); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + // dashboardDataProvider.setFromDate(new Date(params[1])); + } + + if (dateTo != null) { + + DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd"); + String string1 = dateTo; + try { + Date result1 = df1.parse(string1); + dashboardDataProvider.setToDate(result1); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + // dashboardDataProvider.setFromDate(new Date(params[2])); + } + + if (type != null) { + + + // NewDateFilterType.values(); + dashboardDataProvider.setDateFilterType(EnumSet.allOf(NewDateFilterType.class).stream() + .filter(e -> e.name().equals(type)).findFirst() + .orElseThrow(() -> new IllegalStateException(String.format("Unsupported type %s.", type)))); + + // dashboardDataProvider.setFromDate(new Date(params[2])); + } + + // dashboardDataProvider.setRegion(region); + + if (caseClassification != null) { + + String caseClass = caseClassification.replace("case", "").toUpperCase().trim(); + + if (!caseClass.equals("NULL")) { + + + if(caseClass.equals("NOT YET CLASSIFIED")) { + + dashboardDataProvider.setCaseClassification(CaseClassification.NOT_CLASSIFIED); + + }else if (caseClass.equals("CONFIRMED WITH UNKNOWN SYMPTOMS")){ + + dashboardDataProvider.setCaseClassification(CaseClassification.CONFIRMED_UNKNOWN_SYMPTOMS); + + } + else if (caseClass.equals("NOT A")){ + + dashboardDataProvider.setCaseClassification(CaseClassification.NO_CASE); + + }else if(caseClass.equals("CONFIRMED WITH NO SYMPTOMS")) { + + dashboardDataProvider.setCaseClassification(CaseClassification.CONFIRMED_NO_SYMPTOMS); + + } + else { + + dashboardDataProvider.setCaseClassification(EnumSet.allOf(CaseClassification.class).stream() + .filter(e -> e.name().equals(caseClass)).findFirst().orElseThrow( + () -> new IllegalStateException(String.format("Unsupported type %s.", caseClass)))); + } + // dashboardDataProvider.setFromDate(new Date(params[2])); + //dashboardDataProvider.setCaseClassification(CaseClassification.CONFIRMED); + + } + } else { + dashboardDataProvider.setCaseClassification(CaseClassification.NOT_CLASSIFIED); + } + + + + if (newCaseDateType != null) { + + NewCaseDateType enumNewCaseDateType; + switch (newCaseDateType) { + case "Creation date": + enumNewCaseDateType = NewCaseDateType.CREATION; + break; + case "Investigation date": + enumNewCaseDateType = NewCaseDateType.INVESTIGATION; + break; + case "Most relevant date": + enumNewCaseDateType = NewCaseDateType.MOST_RELEVANT; + break; + case "Symptom onset date": + enumNewCaseDateType = NewCaseDateType.ONSET; + break; + case "Case report date": + enumNewCaseDateType = NewCaseDateType.REPORT; + break; + case "Classification date": + enumNewCaseDateType = NewCaseDateType.CLASSIFICATION; + break; + default: + enumNewCaseDateType = NewCaseDateType.MOST_RELEVANT; + } + + dashboardDataProvider.setNewCaseDateType(enumNewCaseDateType); + } + + if(!regionId.equals("null")) { + + RegionDto region = FacadeProvider.getRegionFacade().getByUuid(regionId); + dashboardDataProvider.setRegion(region.toReference()); + + } + + } + + + if (dashboardDataProvider.getDashboardType() == null) { + dashboardDataProvider.setDashboardType(DashboardType.DISEASE); + } + + if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) { + dashboardDataProvider.setDisease(FacadeProvider.getDiseaseConfigurationFacade().getDefaultDisease()); + } + + // dashboardDataProvider.setNewCaseDateType(NewCaseDateType.MOST_RELEVANT); + + // filterLayout = new DashboardFilterLayout(this, dashboardDataProvider); + // filterLayout.setInfoLabelText(I18nProperties.getString(Strings.classificationForDisease)); +// + + + filterLayout = new DiseaseFilterLayout(this, dashboardDataProvider); + dashboardLayout.addComponent(filterLayout); + + dashboardSwitcher.setValue(DashboardType.DISEASE); + dashboardSwitcher.addValueChangeListener(e -> { + dashboardDataProvider.setDashboardType((DashboardType) e.getProperty().getValue()); + navigateToDashboardView(e); + }); + + // Added Component diseaseDetailsViewLayout = new DiseaseDetailsViewLayout(dashboardDataProvider); dashboardLayout.addComponent(diseaseDetailsViewLayout); dashboardLayout.setExpandRatio(diseaseDetailsViewLayout, 1); @@ -35,7 +215,9 @@ public DiseaseDetailsView() { @Override public void refreshDiseaseData() { + super.refreshDiseaseData(); + if (diseaseDetailsViewLayout != null) diseaseDetailsViewLayout.refresh(); } @@ -43,7 +225,12 @@ public void refreshDiseaseData() { @Override public void enter(ViewChangeEvent event) { super.enter(event); - dashboardDataProvider.setDisease(Disease.valueOf(event.getParameters().toString())); + dashboardDataProvider.setDisease(Disease.valueOf(event.getParameters())); refreshDiseaseData(); } + + + + + } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java new file mode 100644 index 00000000000..e749fc02cb9 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java @@ -0,0 +1,74 @@ +package de.symeda.sormas.ui.dashboard.diseasedetails; + + + + +import com.vaadin.icons.VaadinIcons; +import com.vaadin.shared.ui.ContentMode; +import com.vaadin.ui.Label; +import com.vaadin.v7.data.Property; +import com.vaadin.v7.ui.ComboBox; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.caze.NewCaseDateType; +import de.symeda.sormas.api.dashboard.DashboardCriteria; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.ui.dashboard.DashboardDataProvider; +import de.symeda.sormas.ui.dashboard.DashboardType; +import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; +import de.symeda.sormas.ui.dashboard.contacts.ContactsDashboardView; +import de.symeda.sormas.ui.utils.ComboBoxHelper; +import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.components.datetypeselector.DateTypeSelectorComponent; + +public class DiseaseFilterLayout extends DashboardFilterLayout { + public static final String DATE_TYPE_SELECTOR_FILTER = "dateTypeSelectorFilter"; + + public static final String INFO_LABEL = "infoLabel"; + public static final String DISEASE_FILTER = "diseaseFilter"; + private DateTypeSelectorComponent dateTypeSelectorComponent; + + private static final String CASE_CLASSIFICATION_FILTER ="caseClassificationFilter" ; + private final static String[] DISEASE_FILTERS = new String[]{ + DATE_TYPE_SELECTOR_FILTER, + REGION_FILTER, + DISTRICT_FILTER, + CASE_CLASSIFICATION_FILTER + }; + private ComboBox diseaseFilter; + + public DiseaseFilterLayout(DiseaseDetailsView dashboardView, DashboardDataProvider dashboardDataProvider) { + super(dashboardView, dashboardDataProvider,DISEASE_FILTERS); + } + + @Override + public void populateLayout() { + //createDateTypeSelectorFilter(); + //super.createDateFilters(); +// super.populateLayout(); +// createRegionAndDistrictFilter(); +// createDateTypeSelectorFilter(); +// createCaseClassificationFilter(); + + } + + public void addDateTypeValueChangeListener(Property.ValueChangeListener listener) { + dateTypeSelectorComponent.addValueChangeListener(listener); + } + + private void createDateTypeSelectorFilter() { + dateTypeSelectorComponent = + new DateTypeSelectorComponent.Builder<>(NewCaseDateType.class).dateTypePrompt(I18nProperties.getString(Strings.promptNewCaseDateType)) + .build(); + dateTypeSelectorComponent.setValue(dashboardDataProvider.getNewCaseDateType()); + addCustomComponent(dateTypeSelectorComponent, DATE_TYPE_SELECTOR_FILTER); + } + + public void setCriteria(DashboardCriteria criteria) { + super.setCriteria(criteria); + dateTypeSelectorComponent.setValue(criteria.getNewCaseDateType()); + } + +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java index aca18453ac9..af0e80429e6 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java @@ -20,6 +20,7 @@ import java.util.Optional; import java.util.function.Consumer; +import de.symeda.sormas.ui.dashboard.DashboardType; import org.vaadin.hene.popupbutton.PopupButton; import com.vaadin.icons.VaadinIcons; @@ -57,12 +58,12 @@ public abstract class BaseDashboardMapComponent= 0 && count > maxDisplayCount) { showMapOverlay(maxDisplayCount); } else { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index fa02300cc31..f6415a733b8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -22,13 +22,16 @@ import java.math.BigDecimal; import java.math.RoundingMode; +import java.text.SimpleDateFormat; import java.util.*; import java.util.function.Consumer; +import java.util.stream.Collectors; import com.vaadin.icons.VaadinIcons; import com.vaadin.server.ExternalResource; import com.vaadin.shared.ui.ContentMode; import com.vaadin.ui.*; +import com.vaadin.ui.themes.ValoTheme; import com.vaadin.v7.shared.ui.grid.HeightMode; import com.vaadin.v7.ui.CheckBox; import com.vaadin.v7.ui.OptionGroup; @@ -60,14 +63,17 @@ import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DataHelper.Pair; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.dashboard.DashboardCssStyles; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.DashboardType; import de.symeda.sormas.ui.map.*; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.VaadinUiUtil; +import org.vaadin.hene.popupbutton.PopupButton; @SuppressWarnings("serial") public class DashboardMapComponent extends BaseDashboardMapComponent { @@ -89,6 +95,8 @@ public class DashboardMapComponent extends BaseDashboardMapComponent> casesByFacility = new HashMap<>(); private List mapCaseDtos = new ArrayList<>(); @@ -105,57 +113,199 @@ public class DashboardMapComponent extends BaseDashboardMapComponent externalExpandListener; private boolean emptyPopulationDistrictPresent; + //private LeafletMap map; + + private MapCasePeriodOption mapCasePeriodOption; + private Label overlayMessageLabel; + + ComboBox cmbPeriodFilter; + //private PopupButton legendDropdown; + ComboBox cmbPeriodType; + + private Date dateFrom = null; + private Date dateTo = null; + private enum PeriodFilterReloadFlag { + RELOAD_AND_KEEP_VALUE, + RELOAD_AND_CLEAR_VALUE, + DONT_RELOAD + } + + + +// public DashboardMapComponent(DashboardDataProvider dashboardDataProvider) { +// super( +// dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE ? Strings.headingCaseStatusMap : Strings.headingContactMap, +// dashboardDataProvider, +// null); +// +// //this.dashboardDataProvider = dashboardDataProvider; +// +// setMargin(false); +// setSpacing(false); +// setSizeFull(); +// +// map = new LeafletMap(); +// +// map.setSizeFull(); +// map.addMarkerClickListener(event -> onMarkerClicked(event.getGroupId(), event.getMarkerIndex())); +// +// { +// +// GeoShapeProvider geoShapeProvider = FacadeProvider.getGeoShapeProvider(); +// +// final GeoLatLon mapCenter; +// //if (UserProvider.getCurrent().hasAnyUserRole(DefaultUserRole.NATIONAL_USER, DefaultUserRole.NATIONAL_CLINICIAN, DefaultUserRole.NATIONAL_OBSERVER)) { +// mapCenter = geoShapeProvider.getCenterOfAllRegions(); +// +// //} else { +// UserDto user = UserProvider.getCurrent().getUser(); +// +//// if (user.getRegion() != null) { +//// mapCenter = geoShapeProvider.getCenterOfRegion(user.getRegion()); +//// } else { +//// mapCenter = geoShapeProvider.getCenterOfAllRegions(); +//// } +// // } +// +// GeoLatLon center = Optional.ofNullable(mapCenter).orElseGet(FacadeProvider.getConfigFacade()::getCountryCenter); +// +// if (center == null || (center.getLat() == 0.0 && center.getLon() == 0)) { +// center = new GeoLatLon(8.134, 1.423); +// } +// map.setCenter(center); +// } +// +// int zoomVal=FacadeProvider.getConfigFacade().getMapZoom(); +// if(zoomVal!=0) { +// map.setZoom(zoomVal); +// } +// +// } public DashboardMapComponent(DashboardDataProvider dashboardDataProvider) { + //super(dashboardDataProvider); super( dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE ? Strings.headingCaseStatusMap : Strings.headingContactMap, dashboardDataProvider, null); - +// //this.dashboardDataProvider = dashboardDataProvider; + if(dashboardDataProvider.getDashboardType().equals(DashboardType.DISEASE)) { - setMargin(false); - setSpacing(false); - setSizeFull(); + setMargin(false); + setSpacing(false); + setSizeFull(); - map = new LeafletMap(); + map = new LeafletMap(); - map.setSizeFull(); - map.addMarkerClickListener(event -> onMarkerClicked(event.getGroupId(), event.getMarkerIndex())); + map.setSizeFull(); + map.addMarkerClickListener(event -> onMarkerClicked(event.getGroupId(), event.getMarkerIndex())); - { + { - GeoShapeProvider geoShapeProvider = FacadeProvider.getGeoShapeProvider(); + GeoShapeProvider geoShapeProvider = FacadeProvider.getGeoShapeProvider(); - final GeoLatLon mapCenter; - //if (UserProvider.getCurrent().hasAnyUserRole(DefaultUserRole.NATIONAL_USER, DefaultUserRole.NATIONAL_CLINICIAN, DefaultUserRole.NATIONAL_OBSERVER)) { - mapCenter = geoShapeProvider.getCenterOfAllRegions(); + final GeoLatLon mapCenter; + // If map.usecountrycenter=true, use config coordinates. Else try to calculate the center of the user region/country + if (FacadeProvider.getConfigFacade().isMapUseCountryCenter()) { + mapCenter = FacadeProvider.getConfigFacade().getCountryCenter(); + map.setCenter(mapCenter); + } else { + UserDto user = UserProvider.getCurrent().getUser(); + if (user.getRegion() != null) { + mapCenter = geoShapeProvider.getCenterOfRegion(user.getRegion()); + } else { + mapCenter = geoShapeProvider.getCenterOfAllRegions(); + } - //} else { - UserDto user = UserProvider.getCurrent().getUser(); + GeoLatLon center = Optional.ofNullable(mapCenter).orElseGet(FacadeProvider.getConfigFacade()::getCountryCenter); + map.setCenter(center); + } -// if (user.getRegion() != null) { -// mapCenter = geoShapeProvider.getCenterOfRegion(user.getRegion()); -// } else { -// mapCenter = geoShapeProvider.getCenterOfAllRegions(); -// } - // } + GeoLatLon center = Optional.ofNullable(mapCenter).orElseGet(FacadeProvider.getConfigFacade()::getCountryCenter); - GeoLatLon center = Optional.ofNullable(mapCenter).orElseGet(FacadeProvider.getConfigFacade()::getCountryCenter); + if (center == null || (center.getLat() == 0.0 && center.getLon() == 0)) { + center = new GeoLatLon(8.134, 1.423); + } + map.setCenter(center); + } - if (center == null || (center.getLat() == 0.0 && center.getLon() == 0)) { - center = new GeoLatLon(8.134, 1.423); + map.setZoom(FacadeProvider.getConfigFacade().getMapZoom()); + + if (dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE) { + showCases = true; + caseClassificationOption = MapCaseClassificationOption.ALL_CASES; + mapCasePeriodOption = MapCasePeriodOption.CASES_INCIDENCE; + showContacts = false; + showEvents = false; + showConfirmedContacts = true; + showUnconfirmedContacts = true; + } else if (dashboardDataProvider.getDashboardType() == DashboardType.CONTACTS) { + showCases = false; + caseClassificationOption = MapCaseClassificationOption.ALL_CASES; + mapCasePeriodOption = MapCasePeriodOption.CASES_INCIDENCE; + showContacts = true; + showEvents = false; + showConfirmedContacts = true; + showUnconfirmedContacts = true; + } else if (dashboardDataProvider.getDashboardType() == DashboardType.DISEASE) { + map.setZoom(6); + showCases = true; + caseClassificationOption = MapCaseClassificationOption.ALL_CASES; + showContacts = false; + showEvents = false; + showConfirmedContacts = true; + showUnconfirmedContacts = true; } - map.setCenter(center); - } + hideOtherCountries = false; + showCurrentEpiSituation = false; + + this.setMargin(true); + + // Add components + addComponent(createHeader()); + + CssLayout mapLayout = new CssLayout(); + mapLayout.setSizeFull(); + mapLayout.setStyleName(DashboardCssStyles.MAP_CONTAINER); + + map.addStyleName(DashboardCssStyles.MAP_COMPONENT); + mapLayout.addComponent(map); + + overlayBackground = new CssLayout(); + overlayBackground.setStyleName(DashboardCssStyles.MAP_OVERLAY_BACKGROUND); + overlayBackground.setVisible(false); + mapLayout.addComponent(overlayBackground); + + overlayMessageLabel = new Label(); + overlayMessageLabel.addStyleNames(CssStyles.ALIGN_CENTER, CssStyles.LABEL_WHITE, CssStyles.LABEL_WHITE_SPACE_NORMAL); + + Button button = ButtonHelper.createButton(Captions.showPlacesOnMap, (e) -> { + refreshMapDashboard(true); + }); - map.setZoom(FacadeProvider.getConfigFacade().getMapZoom()); + overlayLayout = new VerticalLayout(overlayMessageLabel, button); + overlayLayout.setStyleName(DashboardCssStyles.MAP_OVERLAY); + overlayLayout.setHeightFull(); + overlayLayout.setComponentAlignment(overlayMessageLabel, Alignment.MIDDLE_CENTER); + overlayLayout.setExpandRatio(overlayMessageLabel, 0); + overlayLayout.setComponentAlignment(button, Alignment.MIDDLE_CENTER); + overlayLayout.setExpandRatio(button, 0); + overlayLayout.setVisible(false); + mapLayout.addComponent(overlayLayout); + addComponent(mapLayout); + setExpandRatio(mapLayout, 1); + + addComponent(createFooter()); + } } @Override @@ -167,8 +317,7 @@ protected void addComponents() { showEvents = false; showConfirmedContacts = true; showUnconfirmedContacts = true; - } - else if (dashboardDataProvider.getDashboardType() == DashboardType.CONTACTS) { + } else if (dashboardDataProvider.getDashboardType() == DashboardType.CONTACTS) { showCases = false; caseClassificationOption = MapCaseClassificationOption.ALL_CASES; showContacts = true; @@ -177,41 +326,624 @@ else if (dashboardDataProvider.getDashboardType() == DashboardType.CONTACTS) { showUnconfirmedContacts = true; } - else if (dashboardDataProvider.getDashboardType() == DashboardType.DISEASE) { - map.setZoom(6); - showCases = true; - caseClassificationOption = MapCaseClassificationOption.ALL_CASES; - showContacts = false; - showEvents = false; - showConfirmedContacts = true; - showUnconfirmedContacts = true; - } hideOtherCountries = false; showCurrentEpiSituation = false; super.addComponents(); } - protected void refreshMap(boolean forced) { - clearRegionShapes(); - clearCaseMarkers(); - clearContactMarkers(); - clearEventMarkers(); - LeafletMapUtil.clearOtherCountriesOverlay(map); - if (hideOtherCountries) { - LeafletMapUtil.addOtherCountriesOverlay(map); + private HorizontalLayout createFooter() { + HorizontalLayout mapFooterLayout = new HorizontalLayout(); + mapFooterLayout.setWidth(100, Unit.PERCENTAGE); + mapFooterLayout.setSpacing(true); + CssStyles.style(mapFooterLayout, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); + + // Map key dropdown button + legendDropdown = ButtonHelper.createPopupButton(Captions.dashboardMapKey, null, CssStyles.BUTTON_SUBTLE); + legendDropdown.setContent(createLegend()); + + mapFooterLayout.addComponent(legendDropdown); + mapFooterLayout.setComponentAlignment(legendDropdown, Alignment.MIDDLE_RIGHT); + mapFooterLayout.setExpandRatio(legendDropdown, 1); + + // Layers dropdown button + VerticalLayout layersLayout = new VerticalLayout(); + { + layersLayout.setMargin(true); + layersLayout.setSpacing(false); + layersLayout.setSizeUndefined(); + + // Add check boxes and apply button + { + //case classifications + OptionGroup caseClassificationOptions = new OptionGroup(); + caseClassificationOptions.addItems((Object[]) MapCaseClassificationOption.values()); + caseClassificationOptions.setValue(caseClassificationOption); + caseClassificationOptions.addValueChangeListener(event -> { + caseClassificationOption = (MapCaseClassificationOption) event.getProperty().getValue(); + refreshMapDashboard(true); + }); + + // Optiongroup to select what property the coordinates should be based on + OptionGroup mapCaseDisplayModeSelect = new OptionGroup(); + mapCaseDisplayModeSelect.setWidth(100, Unit.PERCENTAGE); + mapCaseDisplayModeSelect.addItems((Object[]) MapCaseDisplayMode.values()); + mapCaseDisplayModeSelect.setValue(mapCaseDisplayMode); + mapCaseDisplayModeSelect.addValueChangeListener(event -> { + mapCaseDisplayMode = (MapCaseDisplayMode) event.getProperty().getValue(); + refreshMapDashboard(true); + }); + + HorizontalLayout showCasesLayout = new HorizontalLayout(); + { + showCasesLayout.setMargin(false); + showCasesLayout.setSpacing(false); + CheckBox showCasesCheckBox = new CheckBox(); + showCasesCheckBox.setId(Captions.dashboardShowCases); + showCasesCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowCases)); + showCasesCheckBox.setValue(showCases); + showCasesCheckBox.addValueChangeListener(e -> { + showCases = (boolean) e.getProperty().getValue(); + mapCaseDisplayModeSelect.setEnabled(showCases); + caseClassificationOptions.setEnabled(showCases); + mapCaseDisplayModeSelect.setValue(mapCaseDisplayMode); + caseClassificationOptions.setEnabled(showCases); + refreshMapDashboard(true); + }); + showCasesLayout.addComponent(showCasesCheckBox); + + Label infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); + infoLabel.setDescription(I18nProperties.getString(Strings.infoCaseMap)); + CssStyles.style(infoLabel, CssStyles.LABEL_MEDIUM, CssStyles.LABEL_SECONDARY, CssStyles.HSPACE_LEFT_3); + infoLabel.setHeightUndefined(); + showCasesLayout.addComponent(infoLabel); + showCasesLayout.setComponentAlignment(infoLabel, Alignment.TOP_CENTER); + } + layersLayout.addComponent(showCasesLayout); + + layersLayout.addComponent(caseClassificationOptions); + caseClassificationOptions.setEnabled(showCases); + + layersLayout.addComponent(mapCaseDisplayModeSelect); + mapCaseDisplayModeSelect.setEnabled(showCases); + + layersLayout.addComponent(caseClassificationOptions); + caseClassificationOptions.setEnabled(showCases); + + CheckBox showConfirmedContactsCheckBox = new CheckBox(); + showConfirmedContactsCheckBox.setId(Captions.dashboardShowConfirmedContacts); + CheckBox showUnconfirmedContactsCheckBox = new CheckBox(); + showUnconfirmedContactsCheckBox.setId(Captions.dashboardShowUnconfirmedContacts); + + CheckBox showContactsCheckBox = new CheckBox(); + showContactsCheckBox.setId(Captions.dashboardShowContacts); + showContactsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowContacts)); + showContactsCheckBox.setValue(showContacts); + showContactsCheckBox.addValueChangeListener(e -> { + showContacts = (boolean) e.getProperty().getValue(); + showConfirmedContactsCheckBox.setEnabled(showContacts); + showConfirmedContactsCheckBox.setValue(true); + showUnconfirmedContactsCheckBox.setEnabled(showContacts); + showUnconfirmedContactsCheckBox.setValue(true); + refreshMapDashboard(true); + }); + layersLayout.addComponent(showContactsCheckBox); + + showConfirmedContactsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowConfirmedContacts)); + showConfirmedContactsCheckBox.setValue(showConfirmedContacts); + showConfirmedContactsCheckBox.addValueChangeListener(e -> { + showConfirmedContacts = (boolean) e.getProperty().getValue(); + refreshMapDashboard(true); + }); + layersLayout.addComponent(showConfirmedContactsCheckBox); + + CssStyles.style(showUnconfirmedContactsCheckBox, CssStyles.VSPACE_3); + showUnconfirmedContactsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowUnconfirmedContacts)); + showUnconfirmedContactsCheckBox.setValue(showUnconfirmedContacts); + showUnconfirmedContactsCheckBox.addValueChangeListener(e -> { + showUnconfirmedContacts = (boolean) e.getProperty().getValue(); + refreshMapDashboard(true); + }); + layersLayout.addComponent(showUnconfirmedContactsCheckBox); + + showConfirmedContactsCheckBox.setEnabled(showContacts); + showUnconfirmedContactsCheckBox.setEnabled(showContacts); + + CheckBox showEventsCheckBox = new CheckBox(); + showEventsCheckBox.setId(Captions.dashboardShowEvents); + CssStyles.style(showEventsCheckBox, CssStyles.VSPACE_3); + showEventsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowEvents)); + showEventsCheckBox.setValue(showEvents); + showEventsCheckBox.addValueChangeListener(e -> { + showEvents = (boolean) e.getProperty().getValue(); + refreshMapDashboard(true); + }); + layersLayout.addComponent(showEventsCheckBox); + if (nonNull(UserProvider.getCurrent()) && UserProvider.getCurrent().hasNationJurisdictionLevel()) { + OptionGroup regionMapVisualizationSelect = new OptionGroup(); + regionMapVisualizationSelect.setWidth(100, Unit.PERCENTAGE); + regionMapVisualizationSelect.addItems((Object[]) CaseMeasure.values()); + regionMapVisualizationSelect.setValue(caseMeasure); + regionMapVisualizationSelect.addValueChangeListener(event -> { + caseMeasure = (CaseMeasure) event.getProperty().getValue(); + refreshMapDashboard(true); + }); + + HorizontalLayout showRegionsLayout = new HorizontalLayout(); + { + showRegionsLayout.setMargin(false); + showRegionsLayout.setSpacing(false); + CheckBox showRegionsCheckBox = new CheckBox(); + showRegionsCheckBox.setId(Captions.dashboardShowRegions); + showRegionsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowRegions)); + showRegionsCheckBox.setValue(showRegions); + showRegionsCheckBox.addValueChangeListener(e -> { + showRegions = (boolean) e.getProperty().getValue(); + regionMapVisualizationSelect.setEnabled(showRegions); + regionMapVisualizationSelect.setValue(caseMeasure); + refreshMapDashboard(true); + }); + showRegionsLayout.addComponent(showRegionsCheckBox); + + Label infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); + infoLabel.setDescription(I18nProperties.getString(Strings.infoCaseIncidence)); + CssStyles.style(infoLabel, CssStyles.LABEL_MEDIUM, CssStyles.LABEL_SECONDARY, CssStyles.HSPACE_LEFT_3); + infoLabel.setHeightUndefined(); + showRegionsLayout.addComponent(infoLabel); + showRegionsLayout.setComponentAlignment(infoLabel, Alignment.TOP_CENTER); + } + layersLayout.addComponent(showRegionsLayout); + layersLayout.addComponent(regionMapVisualizationSelect); + regionMapVisualizationSelect.setEnabled(showRegions); + } + + CheckBox hideOtherCountriesCheckBox = new CheckBox(); + hideOtherCountriesCheckBox.setId(Captions.dashboardHideOtherCountries); + hideOtherCountriesCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardHideOtherCountries)); + hideOtherCountriesCheckBox.setValue(hideOtherCountries); + hideOtherCountriesCheckBox.addValueChangeListener(e -> { + hideOtherCountries = (boolean) e.getProperty().getValue(); + refreshMapDashboard(true); + }); + CssStyles.style(hideOtherCountriesCheckBox, CssStyles.VSPACE_3); + layersLayout.addComponent(hideOtherCountriesCheckBox); + + CheckBox showCurrentEpiSituationCB = new CheckBox(); + showCurrentEpiSituationCB.setId(Captions.dashboardMapShowEpiSituation); + showCurrentEpiSituationCB.setCaption(I18nProperties.getCaption(Captions.dashboardMapShowEpiSituation)); + showCurrentEpiSituationCB.setValue(false); + showCurrentEpiSituationCB.addValueChangeListener(e -> { + showCurrentEpiSituation = (boolean) e.getProperty().getValue(); + refreshMapDashboard(true); + }); + layersLayout.addComponent(showCurrentEpiSituationCB); + + createPeriodFilters(layersLayout); + } } - Date fromDate = dashboardDataProvider.getFromDate(); - Date toDate = dashboardDataProvider.getToDate(); + PopupButton layersDropdown = ButtonHelper.createPopupButton(Captions.dashboardMapLayers, layersLayout, CssStyles.BUTTON_SUBTLE); - if (showRegions) { - showRegionsShapes(caseMeasure, fromDate, toDate, dashboardDataProvider.getDisease()); + mapFooterLayout.addComponent(layersDropdown); + mapFooterLayout.setComponentAlignment(layersDropdown, Alignment.MIDDLE_RIGHT); + + return mapFooterLayout; + } + + private VerticalLayout createLegend() { + VerticalLayout legendLayout = new VerticalLayout(); + legendLayout.setSpacing(false); + legendLayout.setMargin(true); + legendLayout.setSizeUndefined(); + + // Disable map key dropdown if no layers have been selected + if (showCases || showContacts || showEvents || showRegions) { + legendDropdown.setEnabled(true); + } else { + legendDropdown.setEnabled(false); + return legendLayout; + } + + // Health facilities + + // Cases + if (showCases) { + if (mapCaseDisplayMode == MapCaseDisplayMode.FACILITY || mapCaseDisplayMode == MapCaseDisplayMode.FACILITY_OR_CASE_ADDRESS) { + Label facilitiesKeyLabel = new Label(I18nProperties.getCaption(Captions.dashboardFacilities)); + CssStyles.style(facilitiesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + legendLayout.addComponent(facilitiesKeyLabel); + + HorizontalLayout facilitiesKeyLayout = new HorizontalLayout(); + { + facilitiesKeyLayout.setSpacing(false); + facilitiesKeyLayout.setMargin(false); + HorizontalLayout legendEntry = + buildMarkerLegendEntry(MarkerIcon.FACILITY_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassifiedOnly)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + facilitiesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_SUSPECT, I18nProperties.getCaption(Captions.dashboardGt1SuspectCases)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + facilitiesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_PROBABLE, I18nProperties.getCaption(Captions.dashboardGt1ProbableCases)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + facilitiesKeyLayout.addComponent(legendEntry); + legendEntry = + buildMarkerLegendEntry(MarkerIcon.FACILITY_CONFIRMED, I18nProperties.getCaption(Captions.dashboardGt1ConfirmedCases)); + facilitiesKeyLayout.addComponent(legendEntry); + } + legendLayout.addComponent(facilitiesKeyLayout); + } + + Label casesKeyLabel = new Label(I18nProperties.getString(Strings.entityCases)); + if (mapCaseDisplayMode == MapCaseDisplayMode.FACILITY || mapCaseDisplayMode == MapCaseDisplayMode.FACILITY_OR_CASE_ADDRESS) { + CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); + } else { + CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + } + legendLayout.addComponent(casesKeyLabel); + + HorizontalLayout casesKeyLayout = new HorizontalLayout(); + { + casesKeyLayout.setSpacing(false); + casesKeyLayout.setMargin(false); + HorizontalLayout legendEntry = + buildMarkerLegendEntry(MarkerIcon.CASE_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassified)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + casesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_SUSPECT, I18nProperties.getCaption(Captions.dashboardSuspect)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + casesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_PROBABLE, I18nProperties.getCaption(Captions.dashboardProbable)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + casesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_CONFIRMED, I18nProperties.getCaption(Captions.dashboardConfirmed)); + casesKeyLayout.addComponent(legendEntry); + } + legendLayout.addComponent(casesKeyLayout); + } + + // Contacts + if (showContacts) { + Label contactsKeyLabel = new Label(I18nProperties.getString(Strings.entityContacts)); + if (showCases) { + CssStyles.style(contactsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); + } else { + CssStyles.style(contactsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + } + legendLayout.addComponent(contactsKeyLabel); + + HorizontalLayout contactsKeyLayout = new HorizontalLayout(); + { + contactsKeyLayout.setSpacing(false); + contactsKeyLayout.setMargin(false); + HorizontalLayout legendEntry = + buildMarkerLegendEntry(MarkerIcon.CONTACT_OK, I18nProperties.getCaption(Captions.dashboardNotAContact)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + contactsKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_OVERDUE, I18nProperties.getCaption(Captions.dashboardUnconfirmedContact)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + contactsKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_LONG_OVERDUE, I18nProperties.getCaption(Captions.dashboardConfirmedContact)); + contactsKeyLayout.addComponent(legendEntry); + } + legendLayout.addComponent(contactsKeyLayout); + } + + // Events + if (showEvents) { + Label eventsKeyLabel = new Label(I18nProperties.getString(Strings.entityEvents)); + if (showCases || showContacts) { + CssStyles.style(eventsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); + } else { + CssStyles.style(eventsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + } + legendLayout.addComponent(eventsKeyLabel); + + HorizontalLayout eventsKeyLayout = new HorizontalLayout(); + { + eventsKeyLayout.setSpacing(false); + eventsKeyLayout.setMargin(false); + HorizontalLayout legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_RUMOR, EventStatus.SIGNAL.toString()); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + eventsKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_OUTBREAK, EventStatus.EVENT.toString()); + eventsKeyLayout.addComponent(legendEntry); + } + legendLayout.addComponent(eventsKeyLayout); + } + + // Districts + if (showRegions && districtValuesLowerQuartile != null && districtValuesMedian != null && districtValuesUpperQuartile != null) { + Label districtsKeyLabel = new Label(I18nProperties.getString(Strings.entityDistricts)); + if (showCases || showContacts || showEvents) { + CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); + } else { + CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + } + legendLayout.addComponent(districtsKeyLabel); + legendLayout.addComponent( + buildRegionLegend( + false, + caseMeasure, + emptyPopulationDistrictPresent, + districtValuesLowerQuartile, + districtValuesMedian, + districtValuesUpperQuartile, + InfrastructureHelper.CASE_INCIDENCE_DIVISOR)); + + Label descLabel = new Label(I18nProperties.getString(Strings.infoDashboardIncidence)); + CssStyles.style(descLabel, CssStyles.LABEL_SMALL); + legendLayout.addComponent(descLabel); } - super.refreshMap(forced); + return legendLayout; } +// @Override +// protected void addComponents() { +// if (dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE) { +// showCases = true; +// caseClassificationOption = MapCaseClassificationOption.ALL_CASES; +// showContacts = false; +// showEvents = false; +// showConfirmedContacts = true; +// showUnconfirmedContacts = true; +// } +// else if (dashboardDataProvider.getDashboardType() == DashboardType.CONTACTS) { +// showCases = false; +// caseClassificationOption = MapCaseClassificationOption.ALL_CASES; +// showContacts = true; +// showEvents = false; +// showConfirmedContacts = true; +// showUnconfirmedContacts = true; +// } +// +// else if (dashboardDataProvider.getDashboardType() == DashboardType.DISEASE) { +// map.setZoom(6); +// showCases = true; +// caseClassificationOption = MapCaseClassificationOption.ALL_CASES; +// showContacts = false; +// showEvents = false; +// showConfirmedContacts = true; +// showUnconfirmedContacts = true; +// } +// hideOtherCountries = false; +// showCurrentEpiSituation = false; +// +// super.addComponents(); +// } + + private void createPeriodFilters(VerticalLayout layersLayout) { + cmbPeriodType = new ComboBox(); + cmbPeriodFilter = new ComboBox(); + + Button btnBack = new Button(VaadinIcons.CHEVRON_LEFT); + Button btnForward = new Button(VaadinIcons.CHEVRON_RIGHT); + + cmbPeriodType.setItems(MapPeriodType.values()); + cmbPeriodType.setPlaceholder(I18nProperties.getString(Strings.promptFilterByPeriod)); + cmbPeriodType.setWidth(132, Unit.PIXELS); + cmbPeriodType.addValueChangeListener(e -> { + reloadPeriodFiltersFlag = PeriodFilterReloadFlag.RELOAD_AND_CLEAR_VALUE; + + updatePeriodFilters(); + }); + + //case period display + OptionGroup casePeriodDisplayOptions = new OptionGroup(); + casePeriodDisplayOptions.addItems((Object[]) MapCasePeriodOption.values()); + casePeriodDisplayOptions.setValue(mapCasePeriodOption); + casePeriodDisplayOptions.setEnabled(false); + casePeriodDisplayOptions.addValueChangeListener(event -> { + mapCasePeriodOption = (MapCasePeriodOption) event.getProperty().getValue(); + Date date = (Date) cmbPeriodFilter.getValue(); + if (date != null) { + if (mapCasePeriodOption.equals(MapCasePeriodOption.CASES_INCIDENCE)) { + dateFrom = DateHelper.getStartOfYear(date); + + } else { + dateFrom = DateHelper.getStartOfMonth(date); + + } + dateTo = DateHelper.getEndOfMonth(date); + reloadPeriodFiltersFlag = PeriodFilterReloadFlag.DONT_RELOAD; + dashboardDataProvider.setFromDate(dateFrom); + dashboardDataProvider.setToDate(dateTo); + refreshMapDashboard(); + } else { + refreshMapDashboard(false); + } + }); + + cmbPeriodFilter.setPlaceholder(I18nProperties.getString(Strings.promptSelectPeriod)); + cmbPeriodFilter.setWidth(120, Unit.PIXELS); + cmbPeriodFilter.setEmptySelectionAllowed(false); + cmbPeriodFilter.setEnabled(false); + cmbPeriodFilter.addValueChangeListener(e -> { + Date date = (Date) e.getValue(); + + if (date != null) { + MapPeriodType periodType = (MapPeriodType) cmbPeriodType.getValue(); + + switch (periodType) { + case DAILY: + dateFrom = DateHelper.getStartOfDay(date); + dateTo = DateHelper.getEndOfDay(date); + break; + case WEEKLY: + dateFrom = DateHelper.getStartOfWeek(date); + dateTo = DateHelper.getEndOfWeek(date); + break; + case MONTHLY: + dateFrom = DateHelper.getStartOfMonth(date); + dateTo = DateHelper.getEndOfMonth(date); + casePeriodDisplayOptions.setEnabled(true); + break; + case YEARLY: + dateFrom = DateHelper.getStartOfYear(date); + dateTo = DateHelper.getEndOfYear(date); + break; + default: + dateFrom = null; + dateTo = null; + } + } else { + dateFrom = null; + dateTo = null; + } + + //disable arrow buttons if date is first or last item in the dropdown + int curDateIndex = ((List) cmbPeriodFilter.getValue()).indexOf(date); + Boolean hasNextDate = ((List) cmbPeriodFilter.getValue()).size() > 0 && curDateIndex < ((List)cmbPeriodFilter.getValue()).size() - 1; + Boolean hasPrevDate = ((List)cmbPeriodFilter.getValue()).size() > 0 && curDateIndex > 0; + btnBack.setEnabled(hasPrevDate); + btnForward.setEnabled(hasNextDate); + + reloadPeriodFiltersFlag = PeriodFilterReloadFlag.DONT_RELOAD; + + refreshMapDashboard(); + }); + cmbPeriodFilter.addValueChangeListener(e -> { + cmbPeriodFilter.setEnabled(((List)cmbPeriodFilter.getValue()).size() > 0); + btnForward.setEnabled(((List)cmbPeriodFilter.getValue()).size() > 0); + }); + + CssStyles.style(btnBack, ValoTheme.BUTTON_BORDERLESS); + btnBack.setEnabled(false); + btnBack.addClickListener(e -> { + Date curDate = (Date) cmbPeriodFilter.getValue(); + int curDateIndex = ((List) cmbPeriodFilter.getValue()).indexOf(curDate); + + if (curDateIndex <= 0) + return; + + int prevDateIndex = curDateIndex - 1; + Date prevDate = (Date) ((List) cmbPeriodFilter.getValue()).get(prevDateIndex); + + cmbPeriodFilter.setValue(prevDate); + }); + + CssStyles.style(btnForward, ValoTheme.BUTTON_BORDERLESS); + btnForward.setEnabled(false); + btnForward.addClickListener(e -> { + Date curDate = (Date) cmbPeriodFilter.getValue(); + int curDateIndex = ((List) cmbPeriodFilter.getValue()).indexOf(curDate); + + if (curDateIndex >= ((List) cmbPeriodFilter.getValue()).size() - 1) + return; + + int nextDateIndex = curDateIndex + 1; + Date nextDate = (Date) ((List) cmbPeriodFilter.getValue()).get(nextDateIndex); + + cmbPeriodFilter.setValue(nextDate); + }); + + HorizontalLayout periodSelectionLayout = new HorizontalLayout(); + periodSelectionLayout.setSpacing(false); + + periodSelectionLayout.addComponent(btnBack); + periodSelectionLayout.addComponent(cmbPeriodFilter); + periodSelectionLayout.addComponent(btnForward); + + HorizontalLayout periodFilterLayout = new HorizontalLayout(); + periodFilterLayout.setStyleName(CssStyles.VSPACE_TOP_2); + periodFilterLayout.addComponent(cmbPeriodType); + periodFilterLayout.addComponent(periodSelectionLayout); + layersLayout.addComponent(periodFilterLayout); + layersLayout.addComponent(casePeriodDisplayOptions); + } + + private void updatePeriodFilters() { + MapPeriodType periodType = (MapPeriodType) cmbPeriodType.getValue(); + + //store current flag and reset it + PeriodFilterReloadFlag reloadFlag = reloadPeriodFiltersFlag; + reloadPeriodFiltersFlag = PeriodFilterReloadFlag.RELOAD_AND_KEEP_VALUE; + + String cachedDateValue = cmbPeriodFilter.getCaption(); + + if (reloadFlag != PeriodFilterReloadFlag.DONT_RELOAD) + cmbPeriodFilter.setItems(); + + //cmbPeriodFilter.removeAllItems(); + + if (periodType == null) { + cmbPeriodFilter.setEnabled(false); + dateFrom = null; + dateTo = null; + + if (reloadFlag != PeriodFilterReloadFlag.RELOAD_AND_KEEP_VALUE) + refreshMapDashboard(); + + return; + } + + cmbPeriodFilter.setEnabled(true); +// checks if map has a case before rendering period dropdown + if (mapAndFacilityCases.size() == 0) + return; + + List reportedDates = mapAndFacilityCases.stream().map(c -> c.getReportDate()).collect(Collectors.toList()); + Date minDate = reportedDates.stream().min(Date::compareTo).get(); + Date maxDate = reportedDates.stream().max(Date::compareTo).get(); + + List dates; + String strDateFormat = ""; + switch (periodType) { + case DAILY: + dates = DateHelper.listDaysBetween(minDate, maxDate); + strDateFormat = "MMM dd, yyyy"; + break; + case WEEKLY: + dates = DateHelper.listWeeksBetween(minDate, maxDate); + strDateFormat = "'" + I18nProperties.getString(Strings.weekShort) + "' w, yyyy"; + break; + case MONTHLY: + dates = DateHelper.listMonthsBetween(minDate, maxDate); + strDateFormat = "MMM yyyy"; + break; + case YEARLY: + dates = DateHelper.listYearsBetween(minDate, maxDate); + strDateFormat = "yyyy"; + break; + default: + dates = Collections.emptyList(); + } + + SimpleDateFormat dateFormat = new SimpleDateFormat(strDateFormat); + + cmbPeriodFilter.setItems(dates); + for (Date date : dates) { + String caption = DateHelper.formatLocalDate(date, dateFormat); + cmbPeriodFilter.setCaption(caption); + if (reloadFlag != PeriodFilterReloadFlag.RELOAD_AND_CLEAR_VALUE && caption.equals(cachedDateValue)) + cmbPeriodFilter.setValue(date); + } + + if (reloadFlag == PeriodFilterReloadFlag.RELOAD_AND_CLEAR_VALUE) + cmbPeriodFilter.setValue(cmbPeriodFilter.getData()); + } + +// protected void refreshMapDashboard(boolean forced) { +// clearRegionShapes(); +// clearCaseMarkers(); +// clearContactMarkers(); +// clearEventMarkers(); +// LeafletMapUtil.clearOtherCountriesOverlay(map); +// +// if (hideOtherCountries) { +// LeafletMapUtil.addOtherCountriesOverlay(map); +// } +// +// Date fromDate = dashboardDataProvider.getFromDate(); +// Date toDate = dashboardDataProvider.getToDate(); +// +// if (showRegions) { +// showRegionsShapes(caseMeasure, fromDate, toDate, dashboardDataProvider.getDisease()); +// } +// +// super.refreshMapDashboard(forced); +// } @Override protected Long getMarkerCount(Date fromDate, Date toDate, int maxCount) { @@ -286,7 +1018,7 @@ protected void addLayerOptions(VerticalLayout layersLayout) { caseClassificationOptions.setValue(caseClassificationOption); caseClassificationOptions.addValueChangeListener(event -> { caseClassificationOption = (MapCaseClassificationOption) event.getProperty().getValue(); - refreshMap(true); + refreshMapDashboard(true); }); // Optiongroup to select what property the coordinates should be based on @@ -296,7 +1028,7 @@ protected void addLayerOptions(VerticalLayout layersLayout) { mapCaseDisplayModeSelect.setValue(mapCaseDisplayMode); mapCaseDisplayModeSelect.addValueChangeListener(event -> { mapCaseDisplayMode = (MapCaseDisplayMode) event.getProperty().getValue(); - refreshMap(true); + refreshMapDashboard(true); }); HorizontalLayout showCasesLayout = new HorizontalLayout(); @@ -312,7 +1044,7 @@ protected void addLayerOptions(VerticalLayout layersLayout) { mapCaseDisplayModeSelect.setEnabled(showCases); mapCaseDisplayModeSelect.setValue(mapCaseDisplayMode); caseClassificationOptions.setEnabled(showCases); - refreshMap(true); + refreshMapDashboard(true); }); showCasesLayout.addComponent(showCasesCheckBox); @@ -346,7 +1078,7 @@ protected void addLayerOptions(VerticalLayout layersLayout) { showConfirmedContactsCheckBox.setValue(true); showUnconfirmedContactsCheckBox.setEnabled(showContacts); showUnconfirmedContactsCheckBox.setValue(true); - refreshMap(true); + refreshMapDashboard(true); }); layersLayout.addComponent(showContactsCheckBox); @@ -354,7 +1086,7 @@ protected void addLayerOptions(VerticalLayout layersLayout) { showConfirmedContactsCheckBox.setValue(showConfirmedContacts); showConfirmedContactsCheckBox.addValueChangeListener(e -> { showConfirmedContacts = (boolean) e.getProperty().getValue(); - refreshMap(true); + refreshMapDashboard(true); }); layersLayout.addComponent(showConfirmedContactsCheckBox); @@ -363,7 +1095,7 @@ protected void addLayerOptions(VerticalLayout layersLayout) { showUnconfirmedContactsCheckBox.setValue(showUnconfirmedContacts); showUnconfirmedContactsCheckBox.addValueChangeListener(e -> { showUnconfirmedContacts = (boolean) e.getProperty().getValue(); - refreshMap(true); + refreshMapDashboard(true); }); layersLayout.addComponent(showUnconfirmedContactsCheckBox); @@ -377,7 +1109,7 @@ protected void addLayerOptions(VerticalLayout layersLayout) { showEventsCheckBox.setValue(showEvents); showEventsCheckBox.addValueChangeListener(e -> { showEvents = (boolean) e.getProperty().getValue(); - refreshMap(true); + refreshMapDashboard(true); }); layersLayout.addComponent(showEventsCheckBox); if (nonNull(UserProvider.getCurrent()) && UserProvider.getCurrent().hasNationJurisdictionLevel()) { @@ -387,7 +1119,7 @@ protected void addLayerOptions(VerticalLayout layersLayout) { regionMapVisualizationSelect.setValue(caseMeasure); regionMapVisualizationSelect.addValueChangeListener(event -> { caseMeasure = (CaseMeasure) event.getProperty().getValue(); - refreshMap(true); + refreshMapDashboard(true); }); HorizontalLayout showRegionsLayout = new HorizontalLayout(); @@ -402,7 +1134,7 @@ protected void addLayerOptions(VerticalLayout layersLayout) { showRegions = (boolean) e.getProperty().getValue(); regionMapVisualizationSelect.setEnabled(showRegions); regionMapVisualizationSelect.setValue(caseMeasure); - refreshMap(true); + refreshMapDashboard(true); }); showRegionsLayout.addComponent(showRegionsCheckBox); @@ -424,7 +1156,7 @@ protected void addLayerOptions(VerticalLayout layersLayout) { hideOtherCountriesCheckBox.setValue(hideOtherCountries); hideOtherCountriesCheckBox.addValueChangeListener(e -> { hideOtherCountries = (boolean) e.getProperty().getValue(); - refreshMap(true); + refreshMapDashboard(true); }); CssStyles.style(hideOtherCountriesCheckBox, CssStyles.VSPACE_3); layersLayout.addComponent(hideOtherCountriesCheckBox); @@ -435,7 +1167,7 @@ protected void addLayerOptions(VerticalLayout layersLayout) { showCurrentEpiSituationCB.setValue(false); showCurrentEpiSituationCB.addValueChangeListener(e -> { showCurrentEpiSituation = (boolean) e.getProperty().getValue(); - refreshMap(true); + refreshMapDashboard(true); }); layersLayout.addComponent(showCurrentEpiSituationCB); } @@ -450,7 +1182,8 @@ private HorizontalLayout createHeader() { if (dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE) { mapLabel.setValue(I18nProperties.getString(Strings.headingCaseStatusMap)); CssStyles.style(mapLabel, CssStyles.H2, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); - }else if (dashboardDataProvider.getDashboardType() == DashboardType.DISEASE) { + } + else if (dashboardDataProvider.getDashboardType() == DashboardType.DISEASE) { mapLabel.setValue(I18nProperties.getCaption(Captions.diseaseDetailMap)); CssStyles.style(mapLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_NONE); } @@ -843,12 +1576,12 @@ private void showRegionsShapes(CaseMeasure caseMeasure, Date fromDate, Date toDa } private void clearCaseMarkers() { - map.removeGroup(CASES_GROUP_ID); markerCaseFacilities.clear(); casesByFacility.clear(); mapCaseDtos.clear(); mapAndFacilityCases.clear(); + } private void showCaseMarkers(List cases) { @@ -1115,4 +1848,55 @@ protected void onMarkerClicked(String groupId, int markerIndex) { break; } } + + + private void refreshMapDashboard(boolean forced) { + clearRegionShapes(); + clearCaseMarkers(); + clearContactMarkers(); + clearEventMarkers(); + LeafletMapUtil.clearOtherCountriesOverlay(map); + + if (hideOtherCountries) { + LeafletMapUtil.addOtherCountriesOverlay(map); + } + + Date fromDate = dashboardDataProvider.getFromDate(); + Date toDate = dashboardDataProvider.getToDate(); + + if (showRegions) { + showRegionsShapes(caseMeasure, fromDate, toDate, dashboardDataProvider.getDisease()); + } + + int maxDisplayCount = FacadeProvider.getConfigFacade().getDashboardMapMarkerLimit(); + + Long count = 0L; + if (!forced && maxDisplayCount >= 0) { + count = getMarkerCount(fromDate, toDate, maxDisplayCount); + } +if(dashboardDataProvider.getDashboardType().equals(DashboardType.DISEASE)) { + if (!forced && maxDisplayCount >= 0 && count > maxDisplayCount) { + showMapOverlay(maxDisplayCount); + } else { + hideMapOverlay(); + + loadMapData(fromDate, toDate); + } +} + } + + public void refreshMapDashboard() { + refreshMapDashboard(false); + } + + private void showMapOverlay(int maxCount) { + overlayBackground.setVisible(true); + overlayLayout.setVisible(true); + overlayMessageLabel.setValue(String.format(I18nProperties.getString(Strings.warningDashboardMapTooManyMarkers), maxCount)); + } + + private void hideMapOverlay() { + overlayBackground.setVisible(false); + overlayLayout.setVisible(false); + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java new file mode 100644 index 00000000000..72b0ec567ba --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java @@ -0,0 +1,14 @@ +package de.symeda.sormas.ui.dashboard.map; + + +import de.symeda.sormas.api.i18n.I18nProperties; + +public enum MapCasePeriodOption { + + NEW_CASES, + CASES_INCIDENCE; + + public String toString() { + return I18nProperties.getEnumCaption(this); + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java new file mode 100644 index 00000000000..442e496ac16 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java @@ -0,0 +1,34 @@ + +/******************************************************************************* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *******************************************************************************/ +package de.symeda.sormas.ui.dashboard.map; + +import de.symeda.sormas.api.i18n.I18nProperties; + +public enum MapPeriodType { + + DAILY, + WEEKLY, + MONTHLY, + YEARLY; + + public String toString() { + return I18nProperties.getEnumCaption(this); + }; + +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java index 90db0ad9283..ace21a00fe8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java @@ -17,11 +17,14 @@ *******************************************************************************/ package de.symeda.sormas.ui.dashboard.surveillance; +import com.vaadin.navigator.ViewChangeListener; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.NewCaseDateType; +import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.ui.dashboard.AbstractDashboardView; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.DashboardType; +import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; import de.symeda.sormas.ui.dashboard.surveillance.components.SurveillanceFilterLayout; @SuppressWarnings("serial") @@ -49,6 +52,8 @@ public SurveillanceDashboardView() { filterLayout.addDateTypeValueChangeListener(e -> { dashboardDataProvider.setNewCaseDateType((NewCaseDateType) e.getProperty().getValue()); }); + + dashboardLayout.addComponent(filterLayout); dashboardSwitcher.setValue(DashboardType.SURVEILLANCE); @@ -80,6 +85,13 @@ public SurveillanceDashboardView() { }); } + +// @Override +// public void enter(ViewChangeListener.ViewChangeEvent event) { +// filterLayout.reload(event); +// refreshDiseaseData(); +// } + public void refreshDashboard() { dashboardDataProvider.refreshData(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceOverviewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceOverviewLayout.java index bc41468514f..b973fe278ac 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceOverviewLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceOverviewLayout.java @@ -69,7 +69,8 @@ public SurveillanceOverviewLayout(DashboardDataProvider dashboardDataProvider) { } private void addDiseaseBurdenView() { - diseaseOverviewComponent = new DiseaseOverviewComponent(); + diseaseOverviewComponent = new DiseaseOverviewComponent(dashboardDataProvider); + addComponent(diseaseOverviewComponent, BURDEN_LOC); if (UserProvider.getCurrent().hasRegionJurisdictionLevel()) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java index 3c97e2c32dc..f7b8b6afc14 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java @@ -3,6 +3,7 @@ import com.vaadin.v7.data.Property; import de.symeda.sormas.api.caze.NewCaseDateType; +import de.symeda.sormas.api.dashboard.DashboardCriteria; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; @@ -10,13 +11,15 @@ import de.symeda.sormas.ui.dashboard.surveillance.SurveillanceDashboardView; import de.symeda.sormas.ui.utils.components.datetypeselector.DateTypeSelectorComponent; + public class SurveillanceFilterLayout extends DashboardFilterLayout { public static final String DATE_TYPE_SELECTOR_FILTER = "dateTypeSelectorFilter"; private final static String[] SURVEILLANCE_FILTERS = new String[] { DATE_TYPE_SELECTOR_FILTER, REGION_FILTER, - DISTRICT_FILTER }; + DISTRICT_FILTER ,CASE_CLASSIFICATION_FILTER + }; private DateTypeSelectorComponent dateTypeSelectorComponent; public SurveillanceFilterLayout(SurveillanceDashboardView dashboardView, DashboardDataProvider dashboardDataProvider) { @@ -28,17 +31,32 @@ public void populateLayout() { super.populateLayout(); createDateTypeSelectorFilter(); createRegionAndDistrictFilter(); + createCaseClassificationFilter(); + } public void addDateTypeValueChangeListener(Property.ValueChangeListener listener) { dateTypeSelectorComponent.addValueChangeListener(listener); } +// private void createDateTypeSelectorFilter() { +// dateTypeSelectorComponent = +// new DateTypeSelectorComponent.Builder<>(NewCaseDateType.class).dateTypePrompt(I18nProperties.getString(Strings.promptNewCaseDateType)) +// .build(); +// dateTypeSelectorComponent.setValue(NewCaseDateType.MOST_RELEVANT); +// addCustomComponent(dateTypeSelectorComponent, DATE_TYPE_SELECTOR_FILTER); +// } + private void createDateTypeSelectorFilter() { dateTypeSelectorComponent = - new DateTypeSelectorComponent.Builder<>(NewCaseDateType.class).dateTypePrompt(I18nProperties.getString(Strings.promptNewCaseDateType)) - .build(); - dateTypeSelectorComponent.setValue(NewCaseDateType.MOST_RELEVANT); + new DateTypeSelectorComponent.Builder<>(NewCaseDateType.class).dateTypePrompt(I18nProperties.getString(Strings.promptNewCaseDateType)) + .build(); + dateTypeSelectorComponent.setValue(dashboardDataProvider.getNewCaseDateType()); addCustomComponent(dateTypeSelectorComponent, DATE_TYPE_SELECTOR_FILTER); } + + public void setCriteria(DashboardCriteria criteria) { + super.setCriteria(criteria); + dateTypeSelectorComponent.setValue(criteria.getNewCaseDateType()); + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/DiseaseOverviewComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/DiseaseOverviewComponent.java index ee9d4ee5cb7..0639bc02744 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/DiseaseOverviewComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/DiseaseOverviewComponent.java @@ -11,6 +11,7 @@ import com.vaadin.ui.HorizontalLayout; import de.symeda.sormas.api.disease.DiseaseBurdenDto; +import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.surveillance.components.disease.burden.DiseaseBurdenComponent; import de.symeda.sormas.ui.dashboard.surveillance.components.disease.tile.DiseaseTileViewLayout; import de.symeda.sormas.ui.utils.ButtonHelper; @@ -22,24 +23,22 @@ public class DiseaseOverviewComponent extends HorizontalLayout { private final DiseaseBurdenComponent diseaseBurdenComponent; private final DiseaseTileViewLayout diseaseTileViewLayout; - private final Button showTableViewButton; - public DiseaseOverviewComponent() { + public DiseaseOverviewComponent(DashboardDataProvider dashboardDataProvider) { setWidth(100, Sizeable.Unit.PERCENTAGE); setMargin(false); - diseaseBurdenComponent = new DiseaseBurdenComponent(); - diseaseTileViewLayout = new DiseaseTileViewLayout(); + diseaseTileViewLayout = new DiseaseTileViewLayout(dashboardDataProvider); addComponent(diseaseTileViewLayout); setExpandRatio(diseaseTileViewLayout, 1); // "Expand" and "Collapse" buttons showTableViewButton = - ButtonHelper.createIconButtonWithCaption("showTableView", "", VaadinIcons.TABLE, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); + ButtonHelper.createIconButtonWithCaption("showTableView", "", VaadinIcons.TABLE, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); Button showTileViewButton = ButtonHelper - .createIconButtonWithCaption("showTileView", "", VaadinIcons.SQUARE_SHADOW, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); + .createIconButtonWithCaption("showTileView", "", VaadinIcons.SQUARE_SHADOW, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); showTableViewButton.addClickListener(e -> { removeComponent(diseaseTileViewLayout); @@ -67,7 +66,7 @@ public DiseaseOverviewComponent() { public void refresh(List diseasesBurden, boolean isShowingAllDiseases) { // sort, limit and filter Stream diseasesBurdenStream = - diseasesBurden.stream().sorted((dto1, dto2) -> (int) (dto2.getCaseCount() - dto1.getCaseCount())); + diseasesBurden.stream().sorted((dto1, dto2) -> (int) (dto2.getCaseCount() - dto1.getCaseCount())); if (!isShowingAllDiseases) { diseasesBurdenStream = diseasesBurdenStream.limit(NUMBER_OF_DISEASES_COLLAPSED); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/burden/DiseaseBurdenComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/burden/DiseaseBurdenComponent.java index 101b39149e6..6a230f6b73d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/burden/DiseaseBurdenComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/burden/DiseaseBurdenComponent.java @@ -44,7 +44,6 @@ public DiseaseBurdenComponent() { grid = new DiseaseBurdenGrid(); grid.setHeightMode(HeightMode.ROW); grid.setWidth(100, Unit.PERCENTAGE); - // layout setWidth(100, Unit.PERCENTAGE); @@ -57,8 +56,6 @@ public DiseaseBurdenComponent() { public void refresh(List diseasesBurden) { grid.reload(diseasesBurden); - if (diseasesBurden != null && diseasesBurden.size() > 0) { - grid.setHeightByRows(diseasesBurden.size()); - } + grid.setHeightByRows(diseasesBurden.size()); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java index ab53989f0f2..8121ac00eeb 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java @@ -17,16 +17,19 @@ *******************************************************************************/ package de.symeda.sormas.ui.dashboard.surveillance.components.disease.tile; +import java.util.Date; + import com.vaadin.icons.VaadinIcons; import com.vaadin.shared.ui.ContentMode; import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.Label; import com.vaadin.ui.VerticalLayout; -import com.vaadin.ui.*; import com.vaadin.ui.themes.ValoTheme; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -35,127 +38,26 @@ import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; -import de.symeda.sormas.ui.utils.LayoutUtil; - -import java.util.List; public class DiseaseTileComponent extends VerticalLayout { -//import java.util.List; - -//public class DiseaseDetailsComponent extends VerticalLayout { -//public class DiseaseDetailsComponent extends CssLayout { private static final long serialVersionUID = 6582975657305031105L; - - public static final String CARD_COUNT = "count"; - public static final String DISEASE_GRID = "grid"; - public static final String DISEASE_MAP = "diseasemap"; - private DashboardDataProvider dashboardDataProvider; - private List diseaseBurden; - - //public DiseaseDetailsComponent(DiseaseBurdenDto diseaseBurden) { -// public DiseaseDetailsComponent(DashboardDataProvider dashboardDataProvider) { -// setSizeFull(); -//// setMargin(false); -// this.dashboardDataProvider = dashboardDataProvider; -// } - -public DiseaseTileComponent(DiseaseBurdenDto diseaseBurden) { + public DiseaseTileComponent(DiseaseBurdenDto diseaseBurden,DashboardDataProvider dashboardDataProvider) { setMargin(false); setSpacing(false); - addTopLayout( - diseaseBurden.getDisease(), - diseaseBurden.getCaseCount(), - diseaseBurden.getPreviousCaseCount(), - diseaseBurden.getOutbreakDistrictCount() > 0); - addStatsLayout(diseaseBurden.getCaseDeathCount(), diseaseBurden.getEventCount(), diseaseBurden.getLastReportedDistrictName()); - } - - public void refresh(){ - String htmlLayout = LayoutUtil.fluidRow( - LayoutUtil.fluidColumnLoc(8, 0, 12, 0, CARD_COUNT), - LayoutUtil.fluidColumnLoc(4, 0, 6, 0, DISEASE_GRID), - LayoutUtil.fluidColumnLoc(4, 0, 6, 0, DISEASE_MAP)); - - addTopLayout( - dashboardDataProvider.getDiseaseBurdenDetail().getDisease(), - dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), - dashboardDataProvider.getDiseaseBurdenDetail().getPreviousCaseCount(), - dashboardDataProvider.getDiseaseBurdenDetail().getOutbreakDistrictCount() > 0); - - addStatsLayout( - dashboardDataProvider.getDiseaseBurdenDetail().getCaseDeathCount(), - dashboardDataProvider.getDiseaseBurdenDetail().getEventCount(), - dashboardDataProvider.getDiseaseBurdenDetail().getLastReportedDistrictName(), - dashboardDataProvider.getDiseaseBurdenDetail().getDisease() - ); - - } - - private void addStatsLayout(Long fatalities, Long events, String district, Disease disease) { - VerticalLayout layout = new VerticalLayout(); - layout.setWidth(100, Unit.PERCENTAGE); - layout.setMargin(false); - layout.setSpacing(false); - CssStyles.style(layout, CssStyles.BACKGROUND_HIGHLIGHT); - - HorizontalLayout statsItem = createStatsItem( - I18nProperties.getCaption(Captions.dashboardLastReport) + ": ", - district.length() == 0 ? I18nProperties.getString(Strings.none) : district, - false, - true); - CssStyles.style(statsItem, CssStyles.VSPACE_TOP_4); - layout.addComponent(statsItem); - layout.addComponent(createStatsItem(I18nProperties.getCaption(Captions.dashboardFatalities), fatalities.toString(), fatalities > 0, false)); - statsItem = createStatsItem(I18nProperties.getCaption(Captions.DiseaseBurden_eventCount), events.toString(), false, false); - CssStyles.style(statsItem, CssStyles.VSPACE_4); - layout.addComponent(statsItem); - - layout.addComponent(addDiseaseButton(disease)); - - addComponent(layout); - } - - private Button addDiseaseButton(Disease diseaseName) { - Button diseaseDetailButton = ButtonHelper - .createIconButton(null, VaadinIcons.ELLIPSIS_DOTS_H, null, ValoTheme.BUTTON_BORDERLESS, CssStyles.VSPACE_TOP_NONE, CssStyles.VSPACE_4); - diseaseDetailButton.setVisible(true); - diseaseDetailButton.addClickListener(click -> ControllerProvider.getDashboardController().navigateToDisease(diseaseName)); - -// Button diseaseDetailButton = ButtonHelper -// .createIconButton(null, VaadinIcons.ELLIPSIS_DOTS_H, null, ValoTheme.BUTTON_BORDERLESS, CssStyles.VSPACE_TOP_NONE, CssStyles.VSPACE_4); -// diseaseDetailButton.setVisible(true); -// layout.addComponent(diseaseDetailButton); -// diseaseDetailButton.addClickListener(click -> ControllerProvider.getDashboardController().navigateToDisease(disease.getName())); - - return diseaseDetailButton; - } - - private HorizontalLayout createStatsItem(String label, String value, boolean isCritical, boolean singleColumn) { - HorizontalLayout layout = new HorizontalLayout(); - layout.setWidth(100, Unit.PERCENTAGE); - layout.setMargin(false); - layout.setSpacing(false); + addTopLayout(diseaseBurden.getDisease(), diseaseBurden.getCaseCount(), diseaseBurden.getPreviousCaseCount(), + diseaseBurden.getOutbreakDistrictCount() > 0); +// addStatsLayout( +// diseaseBurden.getCaseDeathCount(), +// diseaseBurden.getEventCount(), +// diseaseBurden.getLastReportedDistrictName(), +// diseaseBurden.getDisease()); - Label nameLabel = new Label(label); - CssStyles.style(nameLabel, CssStyles.LABEL_PRIMARY, isCritical ? CssStyles.LABEL_CRITICAL : "", CssStyles.HSPACE_LEFT_3); - layout.addComponent(nameLabel); - if (!singleColumn) { - layout.setExpandRatio(nameLabel, 1); - } - Label valueLabel = new Label(value); - CssStyles.style( - valueLabel, - CssStyles.LABEL_PRIMARY, - isCritical ? CssStyles.LABEL_CRITICAL : "", - singleColumn ? CssStyles.HSPACE_LEFT_5 : CssStyles.ALIGN_CENTER); - layout.addComponent(valueLabel); - layout.setExpandRatio(valueLabel, singleColumn ? 1f : 0.65f); + addStatsLayout(diseaseBurden, dashboardDataProvider); - return layout; } private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCount, boolean isOutbreak) { @@ -178,12 +80,9 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo nameLayout.setWidth(100, Unit.PERCENTAGE); nameLayout.setHeight(100, Unit.PERCENTAGE); Label nameLabel = new Label(disease.toShortString()); - nameLabel.addStyleNames( - CssStyles.LABEL_WHITE, - nameLabel.getValue().length() > 12 ? CssStyles.LABEL_LARGE : CssStyles.LABEL_XLARGE, - CssStyles.LABEL_BOLD, - CssStyles.ALIGN_CENTER, - CssStyles.LABEL_UPPERCASE); + nameLabel.addStyleNames(CssStyles.LABEL_WHITE, + nameLabel.getValue().length() > 12 ? CssStyles.LABEL_LARGE : CssStyles.LABEL_XLARGE, + CssStyles.LABEL_BOLD, CssStyles.ALIGN_CENTER, CssStyles.LABEL_UPPERCASE); nameLayout.addComponent(nameLabel); nameLayout.setComponentAlignment(nameLabel, Alignment.MIDDLE_CENTER); nameAndOutbreakLayout.addComponent(nameLayout); @@ -214,8 +113,8 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo countLayout.setWidth(100, Unit.PERCENTAGE); Label countLabel = new Label(casesCount.toString()); - countLabel - .addStyleNames(CssStyles.LABEL_WHITE, CssStyles.LABEL_BOLD, CssStyles.LABEL_XXXLARGE, CssStyles.ALIGN_CENTER, CssStyles.VSPACE_TOP_4); + countLabel.addStyleNames(CssStyles.LABEL_WHITE, CssStyles.LABEL_BOLD, CssStyles.LABEL_XXXLARGE, + CssStyles.ALIGN_CENTER, CssStyles.VSPACE_TOP_4); countLayout.addComponent(countLabel); countLayout.setComponentAlignment(countLabel, Alignment.BOTTOM_CENTER); @@ -233,15 +132,17 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo } else { chevronType = VaadinIcons.CHEVRON_RIGHT.getHtml(); } - growthLabel.setValue( - "
" - + " " + chevronType + " " + "
"); + growthLabel.setValue("
" + + " " + chevronType + " " + + "
"); comparisonLayout.addComponent(growthLabel); Label previousCountLabel = new Label(previousCasesCount.toString()); - previousCountLabel.addStyleNames(CssStyles.LABEL_WHITE, CssStyles.LABEL_BOLD, CssStyles.LABEL_XLARGE, CssStyles.HSPACE_LEFT_4); + previousCountLabel.addStyleNames(CssStyles.LABEL_WHITE, CssStyles.LABEL_BOLD, CssStyles.LABEL_XLARGE, + CssStyles.HSPACE_LEFT_4); comparisonLayout.addComponent(previousCountLabel); comparisonLayout.setComponentAlignment(growthLabel, Alignment.MIDDLE_CENTER); comparisonLayout.setComponentAlignment(previousCountLabel, Alignment.MIDDLE_CENTER); @@ -258,24 +159,111 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo addComponent(layout); } - private void addStatsLayout(Long fatalities, Long events, String district) { +// private void addStatsLayout(Long fatalities, Long events, String district, Disease disease) { +// VerticalLayout layout = new VerticalLayout(); +// layout.setWidth(100, Unit.PERCENTAGE); +// layout.setMargin(false); +// layout.setSpacing(false); +// layout.addStyleName(CssStyles.BACKGROUND_HIGHLIGHT); +// +// StatsItem lastReportItem = +// new StatsItem.Builder(Captions.dashboardLastReport, district.length() == 0 ? I18nProperties.getString(Strings.none) : district) +// .singleColumn(true) +// .build(); +// lastReportItem.addStyleName(CssStyles.VSPACE_TOP_4); +// layout.addComponent(lastReportItem); +// layout.addComponent(new StatsItem.Builder(Captions.dashboardFatalities, fatalities).critical(fatalities > 0).build()); +// StatsItem noOfEventsItem = new StatsItem.Builder(Captions.DiseaseBurden_eventCount, events).build(); +// noOfEventsItem.addStyleName(CssStyles.VSPACE_4); +// layout.addComponent(noOfEventsItem); +// +// layout.addComponent(addDiseaseButton(disease)); +// +// addComponent(layout); +// } + + private void addStatsLayout(DiseaseBurdenDto diseaseBurden,DashboardDataProvider dashboardDataProvider) { + + Long fatalities = diseaseBurden.getCaseDeathCount(); + Long events = diseaseBurden.getEventCount(); + String district = diseaseBurden.getLastReportedDistrictName(); + Disease disease = diseaseBurden.getDisease(); + Date dateFrom = diseaseBurden.getFrom(); + Date dateTo = diseaseBurden.getTo(); + VerticalLayout layout = new VerticalLayout(); layout.setWidth(100, Unit.PERCENTAGE); layout.setMargin(false); layout.setSpacing(false); layout.addStyleName(CssStyles.BACKGROUND_HIGHLIGHT); - StatsItem lastReportItem = - new StatsItem.Builder(Captions.dashboardLastReport, district.length() == 0 ? I18nProperties.getString(Strings.none) : district) - .singleColumn(true) - .build(); + StatsItem lastReportItem = new StatsItem.Builder(Captions.dashboardLastReport, + district.length() == 0 ? I18nProperties.getString(Strings.none) : district).singleColumn(true).build(); lastReportItem.addStyleName(CssStyles.VSPACE_TOP_4); layout.addComponent(lastReportItem); - layout.addComponent(new StatsItem.Builder(Captions.dashboardFatalities, fatalities).critical(fatalities > 0).build()); + + + StatsItem fatality = new StatsItem.Builder(Captions.dashboardFatalities, fatalities).critical(fatalities > 0).build(); + fatality.addStyleName(CssStyles.HSPACE_LEFT_5); + layout.addComponent(fatality); + StatsItem noOfEventsItem = new StatsItem.Builder(Captions.DiseaseBurden_eventCount, events).build(); noOfEventsItem.addStyleName(CssStyles.VSPACE_4); layout.addComponent(noOfEventsItem); + Button component = addDiseaseButton(disease, dashboardDataProvider); + + layout.addComponent(component); + addComponent(layout); } + + private HorizontalLayout createStatsItem(String label, String value, boolean isCritical, boolean singleColumn) { + HorizontalLayout layout = new HorizontalLayout(); + layout.setWidth(100, Unit.PERCENTAGE); + layout.setMargin(false); + layout.setSpacing(false); + + Label nameLabel = new Label(label); + CssStyles.style(nameLabel, CssStyles.LABEL_PRIMARY, isCritical ? CssStyles.LABEL_CRITICAL : "", + CssStyles.HSPACE_LEFT_3); + layout.addComponent(nameLabel); + if (!singleColumn) { + layout.setExpandRatio(nameLabel, 1); + } + + Label valueLabel = new Label(value); + CssStyles.style(valueLabel, CssStyles.LABEL_PRIMARY, isCritical ? CssStyles.LABEL_CRITICAL : "", + singleColumn ? CssStyles.HSPACE_LEFT_5 : CssStyles.ALIGN_CENTER); + layout.addComponent(valueLabel); + layout.setExpandRatio(valueLabel, singleColumn ? 1f : 0.65f); + + return layout; + } + + private Button addDiseaseButton(Disease diseaseName, DashboardDataProvider dashboardDataProvider) { + + Date from =dashboardDataProvider.getFromDate(); + Date to = dashboardDataProvider.getToDate(); + NewDateFilterType type = dashboardDataProvider.getDateFilterType(); + + Button diseaseDetailButton = ButtonHelper.createIconButton(null, VaadinIcons.ELLIPSIS_DOTS_H, null, + ValoTheme.BUTTON_BORDERLESS, CssStyles.VSPACE_TOP_NONE, CssStyles.VSPACE_4); + diseaseDetailButton.setVisible(true); +// diseaseDetailButton.addClickListener( +// click -> ControllerProvider.getDashboardController().navigateToDisease(diseaseName, from,to,type)); + + diseaseDetailButton.addClickListener( + click -> ControllerProvider.getDashboardController().navigateToDisease(diseaseName, dashboardDataProvider)); + + + +// Button diseaseDetailButton = ButtonHelper +// .createIconButton(null, VaadinIcons.ELLIPSIS_DOTS_H, null, ValoTheme.BUTTON_BORDERLESS, CssStyles.VSPACE_TOP_NONE, CssStyles.VSPACE_4); +// diseaseDetailButton.setVisible(true); +// layout.addComponent(diseaseDetailButton); +// diseaseDetailButton.addClickListener(click -> ControllerProvider.getDashboardController().navigateToDisease(disease.getName())); + + return diseaseDetailButton; + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java index edd2c665f18..6e9de67ad12 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java @@ -23,11 +23,19 @@ import com.vaadin.ui.CssLayout; import de.symeda.sormas.api.disease.DiseaseBurdenDto; +import de.symeda.sormas.ui.dashboard.DashboardDataProvider; + public class DiseaseTileViewLayout extends CssLayout { + private DashboardDataProvider dashboardDataProvider; + private static final long serialVersionUID = 6582975657305031105L; + public DiseaseTileViewLayout(DashboardDataProvider dashboardDataProvider) { + this.dashboardDataProvider = dashboardDataProvider; + } + @Override protected String getCss(Component c) { return "margin-left: 18px; margin-bottom: 18px;"; @@ -37,9 +45,10 @@ public void refresh(List diseasesBurden) { this.removeAllComponents(); for (DiseaseBurdenDto diseaseBurden : diseasesBurden) { - DiseaseTileComponent tile = new DiseaseTileComponent(diseaseBurden); + + DiseaseTileComponent tile = new DiseaseTileComponent(diseaseBurden,this.dashboardDataProvider); tile.setWidth(230, Unit.PIXELS); addComponent(tile); } } -} +} \ No newline at end of file diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java index 33ab9f59f14..47cf1f15934 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -9,6 +9,8 @@ import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.infrastructure.district.DistrictDto; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; @@ -20,36 +22,77 @@ public class RegionalDiseaseBurdenGrid extends Grid { private final DashboardDataProvider dashboardDataProvider; private final List regionDtoList; - Grid.Column regionColumn; + private List districtDtoList; + + + Grid.Column regionDistrictColumn; Grid.Column totalColumn; + + Grid.Column totalCountColumn; + Grid.Column activeCaseColumn; + + Grid.Column activeCaseCountColumn; + Grid.Column recoveredCasesColumn; + Grid.Column recoveredCasesCountColumn; + Grid.Column deathColumn; + Grid.Column deathCountColumn; + + Grid.Column otherColumn; + Grid.Column otherCountColumn; + private final DecimalFormat decimalFormat; public RegionalDiseaseBurdenGrid(DashboardDataProvider dashboardDataProvider) { this.dashboardDataProvider = dashboardDataProvider; regionDtoList = FacadeProvider.getRegionFacade().getAllRegion(); + + setCaption(I18nProperties.getCaption(Captions.dashboardRegionalDiseaseBurden)); decimalFormat = new DecimalFormat("0.00"); setColumnReorderingAllowed(true); setWidthFull(); - setWidth(800, Unit.PIXELS); + setWidth(1000, Unit.PIXELS); setColumns( DiseaseBurdenDto.CASES_REGION, + DiseaseBurdenDto.CASES_COUNT_TOTAL, DiseaseBurdenDto.CASES_TOTAL, + DiseaseBurdenDto.ACTIVE_COUNT_CASE, DiseaseBurdenDto.ACTIVE_CASE, + DiseaseBurdenDto.RECOVERED_COUNT_CASES, DiseaseBurdenDto.RECOVERED_CASES, - DiseaseBurdenDto.DEATH + DiseaseBurdenDto.DEATH_COUNT, + DiseaseBurdenDto.DEATH, + DiseaseBurdenDto.OTHER_COUNT, + DiseaseBurdenDto.OTHER ); - regionColumn = getColumn(DiseaseBurdenDto.CASES_REGION); + regionDistrictColumn = getColumn(DiseaseBurdenDto.CASES_REGION); + + totalCountColumn = getColumn(DiseaseBurdenDto.CASES_COUNT_TOTAL); + totalColumn = getColumn(DiseaseBurdenDto.CASES_TOTAL); + + activeCaseCountColumn = getColumn(DiseaseBurdenDto.ACTIVE_COUNT_CASE); + activeCaseColumn = getColumn(DiseaseBurdenDto.ACTIVE_CASE); + + recoveredCasesCountColumn = getColumn(DiseaseBurdenDto.RECOVERED_COUNT_CASES); + recoveredCasesColumn = getColumn(DiseaseBurdenDto.RECOVERED_CASES); + + deathCountColumn = getColumn(DiseaseBurdenDto.DEATH_COUNT); + deathColumn = getColumn(DiseaseBurdenDto.DEATH); + + otherCountColumn = getColumn(DiseaseBurdenDto.OTHER_COUNT); + + otherColumn = getColumn(DiseaseBurdenDto.OTHER); + } public void refresh(){ @@ -60,32 +103,178 @@ public void refresh(){ } public void reload() { + List diseaseBurdenDtoList = new ArrayList<>(); + Long casePercental = dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(); - regionColumn.setWidth(100); - totalColumn.setRenderer(new HtmlRenderer()).setWidth(180); - activeCaseColumn.setRenderer(new HtmlRenderer()).setWidth(180); - recoveredCasesColumn.setRenderer(new HtmlRenderer()).setWidth(180); - deathColumn.setRenderer(new HtmlRenderer()).setWidth(180); - - for (RegionDto regionDto : regionDtoList){ - DiseaseBurdenDto diseaseBurdenDto = FacadeProvider.getDiseaseFacade().getDiseaseGridForDashboard( - regionDto.toReference(), - null, - dashboardDataProvider.getDisease(), - dashboardDataProvider.getFromDate(), - dashboardDataProvider.getToDate(), - dashboardDataProvider.getPreviousFromDate(), - dashboardDataProvider.getPreviousToDate()); - - diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(diseaseBurdenDto.getTotal()), casePercental, "#5a95f4bf","#2f7df9")); - diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(diseaseBurdenDto.getActiveCases()), casePercental, "#feba0199", "#dfa507")); - diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(diseaseBurdenDto.getRecovered()), casePercental, "#00e0a19c", "#038d66")); - diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(diseaseBurdenDto.getDeaths()), casePercental,"#bf8678ba", "#91675d")); - - diseaseBurdenDtoList.add(diseaseBurdenDto); + + regionDistrictColumn.setWidth(100); + regionDistrictColumn.setHeaderCaption("REGION NAME"); + + + totalCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); + + + totalColumn.setRenderer(new HtmlRenderer()).setWidth(100); + + + + totalColumn.setHeaderCaption("TOTAL %"); + + activeCaseCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); + + activeCaseColumn.setRenderer(new HtmlRenderer()).setWidth(100); + + activeCaseColumn.setHeaderCaption("ACTIVE CASES %"); + + recoveredCasesCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); + + recoveredCasesCountColumn.setHeaderCaption("RECOVER COUNT"); + //recoveredCasesCountColumn.setHeaderCaption(makeDIvsNone( "RECOVER COUNT", "#bf8678ba", "#91675d")); + + recoveredCasesColumn.setRenderer(new HtmlRenderer()).setWidth(100); + + recoveredCasesColumn.setHeaderCaption("RECOVER CASES %"); + + + deathCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); + + deathColumn.setRenderer(new HtmlRenderer()).setWidth(100); + + deathColumn.setHeaderCaption("DEATH CASES %"); + + + + otherCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); + + otherColumn.setRenderer(new HtmlRenderer()).setWidth(100); + + otherColumn.setHeaderCaption("OTHER CASES %"); + + + if(dashboardDataProvider.getRegion()!=null) { + + regionDistrictColumn.setHeaderCaption("DISTRICT NAME"); + + setCaption(I18nProperties.getCaption(Captions.dashboardDistrictDiseaseBurden)); + + String regionUuid=dashboardDataProvider.getRegion().getUuid(); + + + districtDtoList = FacadeProvider.getDistrictFacade().getAllActiveByRegion(regionUuid); + + for (DistrictReferenceDto districtDto : districtDtoList){ + + + DiseaseBurdenDto diseaseBurdenDto = FacadeProvider.getDiseaseFacade().getDiseaseGridForDashboard( + null, + districtDto, + dashboardDataProvider.getDisease(), + dashboardDataProvider.getFromDate(), + dashboardDataProvider.getToDate(), + dashboardDataProvider.getPreviousFromDate(), + dashboardDataProvider.getPreviousToDate(), + dashboardDataProvider.getNewCaseDateType(), + dashboardDataProvider.getCaseClassification() + ); + + + String total = diseaseBurdenDto.getTotal(); + + String activeCases = diseaseBurdenDto.getActiveCases(); + + String recovered = diseaseBurdenDto.getRecovered(); + + String deaths = diseaseBurdenDto.getDeaths(); + + String other = diseaseBurdenDto.getOther(); + + RegionDto regionDto = new RegionDto(); + + regionDto.setName(districtDto.getCaption()); + + diseaseBurdenDto.setRegion(regionDto); + + diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(total), casePercental, "#5a95f4bf","#2f7df9")); + + diseaseBurdenDto.setTotalCount(makeDIvsCount(total, "#5a95f4bf","#2f7df9")); + + diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(activeCases), casePercental, "#feba0199", "#dfa507")); + + diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases, "#feba0199", "#dfa507")); + + diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(recovered), casePercental, "#00e0a19c", "#038d66")); + + diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered, "#00e0a19c", "#038d66")); + + + diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(deaths), casePercental,"#FFAEAE", "#FF4040")); + + diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths,"#FFAEAE", "#FF4040")); + + + + diseaseBurdenDto.setOther(makeDIvs(Long.parseLong(other), casePercental,"#bf8678ba", "#91675d")); + + diseaseBurdenDto.setOtherCount(makeDIvsCount(other,"#bf8678ba", "#91675d")); + + diseaseBurdenDtoList.add(diseaseBurdenDto); + } + }else { + + + for (RegionDto regionDto : regionDtoList){ + DiseaseBurdenDto diseaseBurdenDto = FacadeProvider.getDiseaseFacade().getDiseaseGridForDashboard( + regionDto.toReference(), + null, + dashboardDataProvider.getDisease(), + dashboardDataProvider.getFromDate(), + dashboardDataProvider.getToDate(), + dashboardDataProvider.getPreviousFromDate(), + dashboardDataProvider.getPreviousToDate(), + dashboardDataProvider.getNewCaseDateType(), + dashboardDataProvider.getCaseClassification() + ); + + + String total = diseaseBurdenDto.getTotal(); + + String activeCases = diseaseBurdenDto.getActiveCases(); + + String recovered = diseaseBurdenDto.getRecovered(); + + String deaths = diseaseBurdenDto.getDeaths(); + + String other = diseaseBurdenDto.getOther(); + + + diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(total), casePercental, "#5a95f4bf","#2f7df9")); + + diseaseBurdenDto.setTotalCount(makeDIvsCount(total, "#5a95f4bf","#2f7df9")); + + diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(activeCases), casePercental, "#feba0199", "#dfa507")); + + diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases, "#feba0199", "#dfa507")); + + diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(recovered), casePercental, "#00e0a19c", "#038d66")); + + diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered, "#00e0a19c", "#038d66")); + + + diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(deaths), casePercental,"#FFAEAE", "#FF4040")); + + diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths,"#FFAEAE", "#FF4040")); + + + diseaseBurdenDto.setOther(makeDIvs(Long.parseLong(other), casePercental,"#bf8678ba", "#91675d")); + + diseaseBurdenDto.setOtherCount(makeDIvsCount(other,"#bf8678ba", "#91675d")); + + diseaseBurdenDtoList.add(diseaseBurdenDto); + } } + BeanItemContainer container = new BeanItemContainer(DiseaseBurdenDto.class, diseaseBurdenDtoList); GeneratedPropertyContainer generatedContainer = new GeneratedPropertyContainer(container); setContainerDataSource(generatedContainer); @@ -93,11 +282,11 @@ public void reload() { public String makeDIvs(long number, long total, String lightColor, String deepColor) { - if (number == 0 && total == 0) - return ("0.0%"); + + String mainStyle = "text-align: center; height:15px; width: 100%; background:"+lightColor; - String progressPercentStyle = "position: absolute; width: 20%; color: #ffffff; font-weight: 700; margin: -1px;"; + String progressPercentStyle = "position: absolute; width: 8%; color: #ffffff; font-weight: 700; margin: -1px;"; double regionalTotal = (double)number/total * 100; // String textColor = regionalTotal > 10 ? "#ffffff" : "#000000"; @@ -105,7 +294,12 @@ public String makeDIvs(long number, long total, String lightColor, String deepCo String style = "height:15px; width:"+ decimalFormat.format(regionalTotal)+"%; color:"+textColor+"; font-size: 10px;"+"background:"+deepColor; String content = decimalFormat.format(regionalTotal) +"%"; - + if (number == 0 && total == 0) { + regionalTotal=0.0; + return "
" + + decimalFormat.format(regionalTotal)+"%
" + + element("div" , style, null) + ""; + } // return "
" + "
"; return "
" + decimalFormat.format(regionalTotal)+"%
" @@ -114,6 +308,43 @@ public String makeDIvs(long number, long total, String lightColor, String deepCo // return "
" + element("div" , style, content) + "
"; } + public String makeDIvsCount(String num, String lightColor, String deepColor) { + + + +// if (num.equals("0") ) +// return ("0"); + + String mainStyle = "text-align: center; height:15px; width: 100%; "; + //+ " background:"+lightColor; + //String progressPercentStyle = "position: absolute; width: 20%; color: #ffffff; font-weight: 700; margin: -1px;"; + String regionalTotal = num; + +// String textColor = regionalTotal > 10 ? "#ffffff" : "#000000"; + //String textColor = "#ffffff"; + + //String style = "height:15px; width:"+ regionalTotal+"; color:"+textColor+"; font-size: 10px;"+"background:"+deepColor; + //String content = regionalTotal ; + +// return "
" + "
"; + return "
" + //+ "
" + + regionalTotal+"
"; + //+ element("div" , style, null) + "
"; + +// return "
" + element("div" , style, content) + "
"; + } + + public String makeDIvsNone(String value, String lightColor, String deepColor) { + + String mainStyle = "text-align: center; height:15px; width: 100%; "; + + String regionalTotal = value; + + return "
"+ regionalTotal+"
"; + + } + public String element(String type, String style, String content) { StringBuilder sb = new StringBuilder(); sb.append("<").append(type); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/SurveillanceEpiCurveBuilder.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/SurveillanceEpiCurveBuilder.java index c85b49fef41..eff70caaa6d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/SurveillanceEpiCurveBuilder.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/SurveillanceEpiCurveBuilder.java @@ -3,6 +3,7 @@ import java.util.Date; import java.util.List; +import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.dashboard.DashboardCriteria; import de.symeda.sormas.api.dashboard.EpiCurveGrouping; import de.symeda.sormas.api.i18n.Captions; @@ -13,6 +14,7 @@ public abstract class SurveillanceEpiCurveBuilder extends AbstractEpiCurveBuilder { + public SurveillanceEpiCurveBuilder(EpiCurveGrouping epiCurveGrouping) { super(Captions.dashboardNumberOfContacts, epiCurveGrouping); } 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 de55e280646..dc13303664a 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 @@ -65,6 +65,9 @@ private CssStyles() { public static final String HSPACE_LEFT_3 = "hspace-left-3"; public static final String HSPACE_LEFT_4 = "hspace-left-4"; public static final String HSPACE_LEFT_5 = "hspace-left-5"; + public static final String HSPACE_LEFT_6 = "hspace-left-6"; + public static final String HSPACE_LEFT_7 = "hspace-left-7"; + public static final String HSPACE_LEFT_NONE = "hspace-left-none"; public static final String HSPACE_RIGHT_0 = "hspace-right-0"; From ae72990ceef3f6d664d21929cb99ccf8b034a6c5 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Fri, 9 Feb 2024 13:54:47 +0000 Subject: [PATCH 22/71] Update to Captions,Strings and refatoring done to pass test cases#12880 --- .../symeda/sormas/api/disease/DiseaseBurdenDto.java | 5 ++++- .../de/symeda/sormas/api/disease/DiseaseFacade.java | 8 -------- .../java/de/symeda/sormas/api/i18n/Captions.java | 13 ++++++------- .../java/de/symeda/sormas/api/i18n/Strings.java | 1 - .../java/de/symeda/sormas/api/user/UserRight.java | 3 +-- sormas-api/src/main/resources/captions.properties | 4 +--- .../sormas/backend/common/BaseAdoService.java | 1 + .../sormas/backend/disease/DiseaseFacadeEjb.java | 9 --------- .../src/main/resources/sql/sormas_schema.sql | 4 ---- .../sormas/ui/dashboard/AbstractDashboardView.java | 5 ----- .../sormas/ui/dashboard/DashboardController.java | 9 ++------- .../sormas/ui/dashboard/DashboardDataProvider.java | 12 +----------- 12 files changed, 16 insertions(+), 58 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java index a9eb3330d11..63acd519dd6 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java @@ -21,10 +21,12 @@ import java.util.Date; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +@AuditedClass public class DiseaseBurdenDto implements Serializable { private static final long serialVersionUID = 2430932452606853497L; @@ -38,7 +40,8 @@ public class DiseaseBurdenDto implements Serializable { public static final String CASES_DIFFERENCE_PERCENTAGE = "casesDifferencePercentage"; public static final String EVENT_COUNT = "eventCount"; public static final String OUTBREAK_DISTRICT_COUNT = "outbreakDistrictCount"; - public static final String CASE_DEATH_COUNT = "caseDeathCount"; + public static final String + CASE_DEATH_COUNT = "caseDeathCount"; public static final String CASE_FATALITY_RATE = "caseFatalityRate"; public static final String LAST_REPORTED_DISTRICT_NAME = "lastReportedDistrictName"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java index 8f26c4aaa77..c273f07e747 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java @@ -41,14 +41,6 @@ List getDiseaseBurdenForDashboard( Date previousFromDate, Date previousToDate); -// DiseaseBurdenDto diseaseForDashboard( -// RegionReferenceDto regionRef, -// DistrictReferenceDto districtRef, -// Disease disease, -// Date from, -// Date to, -// Date previousFromDate, -// Date previousToDate); DiseaseBurdenDto getDiseaseForDashboard( RegionReferenceDto regionRef, diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java index ab3a5775a37..60fec7b14cb 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Captions.java @@ -851,12 +851,11 @@ public interface Captions { String dashboardDead = "dashboardDead"; String dashboardDiscarded = "dashboardDiscarded"; String dashboardDiseaseBurdenInfo = "dashboardDiseaseBurdenInfo"; - String dashboardRegionalDiseaseBurden = "dashboardRegionalDiseaseBurden"; - String diseaseDetailMap = "diseaseDetailMap"; String dashboardDiseaseBurdenOutbreakDistricts = "dashboardDiseaseBurdenOutbreakDistricts"; String dashboardDiseaseCarouselSlideShow = "dashboardDiseaseCarouselSlideShow"; String dashboardDiseaseDifference = "dashboardDiseaseDifference"; String dashboardDiseaseDifferenceYAxisLabel = "dashboardDiseaseDifferenceYAxisLabel"; + String dashboardDistrictDiseaseBurden = "dashboardDistrictDiseaseBurden"; String dashboardDone = "dashboardDone"; String dashboardFacilities = "dashboardFacilities"; String dashboardFatalities = "dashboardFatalities"; @@ -875,6 +874,7 @@ public interface Captions { String dashboardIndeterminate = "dashboardIndeterminate"; String dashboardInvestigated = "dashboardInvestigated"; String dashboardLastReport = "dashboardLastReport"; + String dashboardLastReportedDistrict = "dashboardLastReportedDistrict"; String dashboardLastVisitGt48 = "dashboardLastVisitGt48"; String dashboardLastVisitLt24 = "dashboardLastVisitLt24"; String dashboardLastVisitLt48 = "dashboardLastVisitLt48"; @@ -915,6 +915,7 @@ public interface Captions { String dashboardProbable = "dashboardProbable"; String dashboardProportion = "dashboardProportion"; String dashboardReceived = "dashboardReceived"; + String dashboardRegionalDiseaseBurden = "dashboardRegionalDiseaseBurden"; String dashboardRemoved = "dashboardRemoved"; String dashboardRumor = "dashboardRumor"; String dashboardSameDayLastYear = "dashboardSameDayLastYear"; @@ -1022,6 +1023,7 @@ public interface Captions { String DiseaseBurden_eventCount = "DiseaseBurden.eventCount"; String DiseaseBurden_outbreakDistrictCount = "DiseaseBurden.outbreakDistrictCount"; String DiseaseBurden_previousCaseCount = "DiseaseBurden.previousCaseCount"; + String diseaseDetailMap = "diseaseDetailMap"; String diseaseVariantDetails = "diseaseVariantDetails"; String District = "District"; String District_archived = "District.archived"; @@ -2759,10 +2761,10 @@ public interface Captions { String View_contacts_visits = "View.contacts.visits"; String View_dashboard_campaigns = "View.dashboard.campaigns"; String View_dashboard_contacts = "View.dashboard.contacts"; + String View_dashboard_disease = "View.dashboard.disease"; String View_dashboard_samples = "View.dashboard.samples"; String View_dashboard_surveillance = "View.dashboard.surveillance"; String View_environments = "View.environments"; - String View_dashboard_disease = "View.dashboard.disease"; String View_events = "View.events"; String View_events_archive = "View.events.archive"; String View_events_data = "View.events.data"; @@ -2792,6 +2794,7 @@ public interface Captions { String View_user_users = "View.user.users"; String View_users_sub = "View.users.sub"; String viewMessage = "viewMessage"; + String viewMore = "viewMore"; String Visit = "Visit"; String Visit_disease = "Visit.disease"; String Visit_origin = "Visit.origin"; @@ -2804,7 +2807,6 @@ public interface Captions { String Visit_visitStatus = "Visit.visitStatus"; String Visit_visitUser = "Visit.visitUser"; String visitNewVisit = "visitNewVisit"; - String viewMore = "viewMore"; String WeeklyReport_epiWeek = "WeeklyReport.epiWeek"; String WeeklyReport_year = "WeeklyReport.year"; String WeeklyReportEntry_numberOfCases = "WeeklyReportEntry.numberOfCases"; @@ -2836,7 +2838,4 @@ public interface Captions { String WeeklyReportRegionSummary_region = "WeeklyReportRegionSummary.region"; String weeklyReportsInDistrict = "weeklyReportsInDistrict"; String years = "years"; - String dashboardLastReportedDistrict = "dashboardLastReportedDistrict"; - - String dashboardDistrictDiseaseBurden="dashboardDistrictDiseaseBurden"; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index 13cc88a499a..e54f53c6709 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -443,7 +443,6 @@ public interface Strings { String headingCaseStatusMap = "headingCaseStatusMap"; String headingcasesWithReferenceDefinitionFulfilled = "headingcasesWithReferenceDefinitionFulfilled"; String headingCaution = "headingCaution"; - String headingDiseaseStatusMap = "headingDiseaseStatusMap"; String headingChangeCaseDisease = "headingChangeCaseDisease"; String headingChangePathogenTestResult = "headingChangePathogenTestResult"; String headingClinicalMeasurements = "headingClinicalMeasurements"; 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 0e3732764ca..826d7cc27d8 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 @@ -66,7 +66,6 @@ public enum UserRight { PERSON_EXPORT(UserRightGroup.PERSON, UserRight._PERSON_VIEW), PERSON_CONTACT_DETAILS_DELETE(UserRightGroup.PERSON, UserRight._PERSON_EDIT), PERSON_MERGE(UserRightGroup.PERSON, UserRight._PERSON_VIEW), - DISEASE_DETAILS_ACCESS(UserRightGroup.DISEASE), SAMPLE_VIEW(UserRightGroup.SAMPLE), SAMPLE_CREATE(UserRightGroup.SAMPLE, UserRight._SAMPLE_VIEW), @@ -165,7 +164,7 @@ public enum UserRight { DASHBOARD_CONTACT_VIEW_TRANSMISSION_CHAINS(UserRightGroup.DASHBOARD, UserRight._DASHBOARD_CONTACT_VIEW), DASHBOARD_CAMPAIGNS_VIEW(UserRightGroup.DASHBOARD, UserRight._CAMPAIGN_VIEW), DASHBOARD_SAMPLES_VIEW(UserRightGroup.DASHBOARD, UserRight._SAMPLE_VIEW), - DASHBOARD_DISEASE_DETAILS_ACCESS(UserRightGroup.DASHBOARD,UserRight._DISEASE_DETAILS_ACCESS), + CASE_CLINICIAN_VIEW(UserRightGroup.CASE_MANAGEMENT, UserRight._CASE_VIEW), diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index 0301f49da70..a38dc24c8b0 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -25,6 +25,7 @@ date=Date description=Description disease=Disease districtName=District +dashboardDistrictDiseaseBurden=Dashboard District Diseas eBurden edit=Edit view=View epiWeekFrom=From Epi Week @@ -408,9 +409,6 @@ caseCreateNew=Create new case caseDataEnterHomeAddressNow=Enter home address of the case person now caseCancelDeletion=Cancel case deletion caseJurisdictionType=Jurisdiction type -caseDeathCase=Deaths -caseRecoveredCase=Recovered Cases - CaseData=Case CaseData.ageAndBirthDate=Age and birth date CaseData.additionalDetails=General comment diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java index 1c8d252c7ae..50f23959eef 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java @@ -604,4 +604,5 @@ protected TypedQuery createQuery(CriteriaQuery cq, Integer first, Inte return query; } + } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java index 7a338a3b616..abcf1a22e4c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java @@ -235,44 +235,35 @@ public DiseaseBurdenDto getDiseaseGridForDashboard( //new cases - //CaseCriteria caseCriteria = new CaseCriteria().newCaseDateBetween(from, to, newCaseDateType).region(regionRef).district(districtRef).disease(disease).caseClassification(caseClassification); - DashboardCriteria dashboardCriteria = new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); - //Map allCasesFetched = dashboardService.getCaseCountByDisease(caseCriteria); //Load count all dead/ fatalities - //Map allCasesFetched = caseFacade.getCaseCountByDisease(caseCriteria, true, true); Map allCasesFetched = dashboardService.getCaseCountByDisease(dashboardCriteria); - //Map caseFatalities = personFacade.getDeathCountByDisease(d, true, true); Map caseFatalities = dashboardService.getDeathCountByDisease(dashboardCriteria); dashboardCriteria.setOutcome(CaseOutcome.NO_OUTCOME); //caseCriteria.relevanceStatus(EntityRelevanceStatus.ACTIVE); -// Map archievedCase = caseFacade.getCaseCountByDisease(caseCriteria, true, true); Map archievedCase = dashboardService.getCaseCountByDisease(dashboardCriteria); //dashboardCriteria.relevanceStatus(null); dashboardCriteria.setOutcome(CaseOutcome.RECOVERED); - //Map recoveredCase = caseFacade.getCaseCountByDisease(caseCriteria, true, true); Map recoveredCase = dashboardService.getCaseCountByDisease(dashboardCriteria); dashboardCriteria.setOutcome(CaseOutcome.UNKNOWN); - //Map unknown = caseFacade.getCaseCountByDisease(caseCriteria, true, true); Map unknown = dashboardService.getCaseCountByDisease(dashboardCriteria); dashboardCriteria.setOutcome(CaseOutcome.OTHER); - //Map other = caseFacade.getCaseCountByDisease(caseCriteria, true, true); Map other = dashboardService.getCaseCountByDisease(dashboardCriteria); //build diseasesBurden diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index 281d2c50874..6953e4b1991 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -12874,9 +12874,5 @@ UPDATE userroles set changedate = now() WHERE linkeddefaultuserrole in ('ADMIN', INSERT INTO schema_version (version_number, comment) VALUES (538, 'Introduce dedicated environment sample pathogen test rights #12836'); --- 2024-01-29 Assigning DASHBOARD_DISEASE_DETAILS_ACCESS right to userroles that can view surveilance dashboard -INSERT INTO userroles_userrights (userrole_id, userright) SELECT userrole_id, 'DASHBOARD_DISEASE_DETAILS_ACCESS' FROM userroles_userrights WHERE userright = 'DASHBOARD_SURVEILLANCE_VIEW'; - -INSERT INTO schema_version (version_number, comment) VALUES (540, 'Assigning DASHBOARD_DISEASE_DETAILS_ACCESS right to userroles that can view surveilance dashboard'); -- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. *** diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java index 0df19cdb7e5..497227b7033 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java @@ -206,12 +206,7 @@ public void refreshDiseaseData() { @Override public void enter(ViewChangeEvent event) { - if (!DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) { refreshDashboard(); - } -// refreshDiseaseData(); -// else - //refreshDashboard(); } //public abstract void refreshDashboard(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java index 2939ab935b1..8ea3307727d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java @@ -68,10 +68,7 @@ public void registerViews(Navigator navigator) { //} } -// public void navigateToDisease(Disease disease) { -// String navigationState = DiseaseDetailsView.VIEW_NAME + "/" + disease.getName(); -// SormasUI.get().getNavigator().navigateTo(navigationState); -// } + public void navigateToDisease(Disease disease,DashboardDataProvider dashboardDataProvider) { Date dateFrom = dashboardDataProvider.getFromDate(); @@ -105,12 +102,10 @@ public void navigateToDisease(Disease disease,DashboardDataProvider dashboardDat //DiseaseDetailsView.setProvider(dashboardDataProvider); String navigationState = DiseaseDetailsView.VIEW_NAME + "/" + disease.getName(); - //+"/"+dateFromAsISO+"/"+dateToAsISO+"/"+type.toString(); - //String navigationState = DiseaseDetailsView.VIEW_NAME + "/?disease=" + disease.getName(); + SormasUI.get().getNavigator().navigateTo(navigationState); - //SormasUI.get().getSession().setAttribute("paramdata", dateFromAsISO+"/"+dateToAsISO+"/"+type); } } 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 3738b12f6b4..6b163ac6131 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 @@ -116,17 +116,7 @@ public void refreshData() { protected DashboardCriteria newCriteria() { return new DashboardCriteria(newCaseDateType); } -// public void refreshDiseaseData() { -// setDiseaseBurdenDetail( -// FacadeProvider.getDiseaseFacade().getDiseaseForDashboard(region, district, disease, fromDate, toDate, previousFromDate, previousToDate)); -// -// setOutbreakDistrictCount( -// FacadeProvider.getOutbreakFacade() -// .getOutbreakDistrictCount( -// new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate))); -// -// this.refreshDataForSelectedDisease(); -// } + public void refreshDiseaseData() { DiseaseBurdenDto dbd= FacadeProvider.getDiseaseFacade().getDiseaseForDashboard(region, district, disease, fromDate, toDate, previousFromDate, previousToDate From b9b50a03bc008f3856441c90c89678e3b641f927 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Mon, 12 Feb 2024 11:45:32 +0000 Subject: [PATCH 23/71] Added @Audited annotation to parameter classes of getDiseaseForDashboard and getDiseaseGridForDashboard#12880 --- sormas-api/src/main/java/de/symeda/sormas/api/Disease.java | 3 ++- .../java/de/symeda/sormas/api/caze/CaseClassification.java | 2 ++ .../api/infrastructure/district/DistrictReferenceDto.java | 2 ++ .../sormas/api/infrastructure/region/RegionReferenceDto.java | 2 ++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/Disease.java b/sormas-api/src/main/java/de/symeda/sormas/api/Disease.java index e1c5c9f7349..854134e8b09 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/Disease.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/Disease.java @@ -18,9 +18,10 @@ import java.util.Arrays; import java.util.List; +import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.statistics.StatisticsGroupingKey; - +@AuditedClass public enum Disease implements StatisticsGroupingKey { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseClassification.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseClassification.java index 4e07522ead7..44627019ff4 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseClassification.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseClassification.java @@ -21,9 +21,11 @@ import java.util.EnumSet; import java.util.Set; +import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.statistics.StatisticsGroupingKey; +@AuditedClass public enum CaseClassification implements StatisticsGroupingKey { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictReferenceDto.java index 5c28f779fcf..a54c6afba78 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictReferenceDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictReferenceDto.java @@ -18,10 +18,12 @@ package de.symeda.sormas.api.infrastructure.district; import de.symeda.sormas.api.InfrastructureDataReferenceDto; +import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.statistics.StatisticsGroupingKey; import de.symeda.sormas.api.utils.FeatureIndependent; @FeatureIndependent +@AuditedClass public class DistrictReferenceDto extends InfrastructureDataReferenceDto implements StatisticsGroupingKey { private static final long serialVersionUID = 8990957700033431836L; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionReferenceDto.java index 90ef246d815..16a78674b42 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionReferenceDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionReferenceDto.java @@ -18,10 +18,12 @@ package de.symeda.sormas.api.infrastructure.region; import de.symeda.sormas.api.InfrastructureDataReferenceDto; +import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.statistics.StatisticsGroupingKey; import de.symeda.sormas.api.utils.FeatureIndependent; @FeatureIndependent +@AuditedClass public class RegionReferenceDto extends InfrastructureDataReferenceDto implements StatisticsGroupingKey { private static final long serialVersionUID = -1610675328037466348L; From 348fd6838a7ff56e12c44e269aa2146506728c4d Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Mon, 12 Feb 2024 17:50:39 +0000 Subject: [PATCH 24/71] @AuditedClass annotation to classes that need them#12880 --- .../src/main/java/de/symeda/sormas/api/caze/CaseCriteria.java | 3 ++- .../java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java | 2 ++ .../java/de/symeda/sormas/api/dashboard/DashboardCriteria.java | 3 ++- .../de/symeda/sormas/api/infrastructure/region/RegionDto.java | 3 ++- .../de/symeda/sormas/api/sample/PathogenTestResultType.java | 3 ++- 5 files changed, 10 insertions(+), 4 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 2d4332dd9a5..28b226b602d 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 @@ -22,6 +22,7 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EntityRelevanceStatus; +import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.contact.FollowUpStatus; import de.symeda.sormas.api.contact.QuarantineType; import de.symeda.sormas.api.disease.DiseaseVariant; @@ -42,7 +43,7 @@ import de.symeda.sormas.api.utils.IgnoreForUrl; import de.symeda.sormas.api.utils.criteria.CriteriaDateType; import de.symeda.sormas.api.utils.criteria.CriteriaWithDateType; - +@AuditedClass public class CaseCriteria extends CriteriaWithDateType implements ExternalShareCriteria, Cloneable { private static final long serialVersionUID = 5114202107622217837L; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java index cb0c259e646..76d96766972 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java @@ -17,12 +17,14 @@ import java.util.Date; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseReferenceDefinition; import de.symeda.sormas.api.caze.InvestigationStatus; import de.symeda.sormas.api.person.PresentCondition; import de.symeda.sormas.api.uuid.AbstractUuidDto; +@AuditedClass public class DashboardCaseDto extends AbstractUuidDto { private static final long serialVersionUID = -5705128377788207648L; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java index e9f0fc0292c..815766b904e 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java @@ -1,13 +1,14 @@ package de.symeda.sormas.api.dashboard; import de.symeda.sormas.api.CaseMeasure; +import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseOutcome; import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.utils.criteria.CriteriaDateType; import java.util.Date; - +@AuditedClass public class DashboardCriteria extends BaseDashboardCriteria { private CriteriaDateType newCaseDateType; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java index 928b1f87d90..6f3c8f24cf4 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; +import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Validations; @@ -30,7 +31,7 @@ import de.symeda.sormas.api.utils.DependingOnFeatureType; import de.symeda.sormas.api.utils.FeatureIndependent; import de.symeda.sormas.api.utils.FieldConstraints; - +@AuditedClass @FeatureIndependent public class RegionDto extends InfrastructureDtoWithDefault { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestResultType.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestResultType.java index a08856db8ea..c9fc20d6d7b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestResultType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestResultType.java @@ -17,8 +17,9 @@ *******************************************************************************/ package de.symeda.sormas.api.sample; +import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.i18n.I18nProperties; - +@AuditedClass public enum PathogenTestResultType { INDETERMINATE, From 7146dded83f8a65cd5129e589eefb1b011b3b4d3 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Sat, 17 Feb 2024 22:16:28 +0000 Subject: [PATCH 25/71] fixed methods which were not passing test cases#12880 --- .../api/dashboard/DashboardCriteria.java | 33 ++++-- .../sormas/api/disease/DiseaseFacade.java | 4 +- .../sormas/api/user/NotificationType.java | 1 + .../sormas/backend/common/BaseAdoService.java | 1 - .../backend/dashboard/DashboardFacadeEjb.java | 1 - .../backend/dashboard/DashboardService.java | 24 ++++ .../backend/disease/DiseaseFacadeEjb.java | 9 +- .../dashboard/DashboardFacadeEjbTest.java | 1 - .../ui/dashboard/DashboardDataProvider.java | 81 +++++++++----- .../components/DashboardFilterLayout.java | 103 ++++++++---------- 10 files changed, 155 insertions(+), 103 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java index 815766b904e..5791dea5cb0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java @@ -92,22 +92,31 @@ public DashboardCriteria dateFilterType(NewDateFilterType dateFilterType) { } - public Date getDateFrom() { - return dateFrom; - } - - public Date getDateTo() { - return dateTo; - } - - public DashboardCriteria dateFrom(Date dateFrom) { +// public Date getDateFrom() { +// return dateFrom; +// } +// +// public Date getDateTo() { +// return dateTo; +// } +// +// public DashboardCriteria dateFrom(Date dateFrom) { +// this.dateFrom = dateFrom; +// return this; +// } +// +// public DashboardCriteria dateTo(Date dateTo) { +// this.dateTo = dateTo; +// return this; +// } + + + public void setDateFrom(Date dateFrom) { this.dateFrom = dateFrom; - return this; } - public DashboardCriteria dateTo(Date dateTo) { + public void setDateTo(Date dateTo) { this.dateTo = dateTo; - return this; } public void setOutcome(CaseOutcome outcome) { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java index c273f07e747..4bfa510d11c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java @@ -46,8 +46,8 @@ DiseaseBurdenDto getDiseaseForDashboard( RegionReferenceDto regionRef, DistrictReferenceDto districtRef, Disease disease, - Date from, - Date to, + Date fromDate, + Date toDate, Date previousFromDate, Date previousToDate, CriteriaDateType newCaseDateType, diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/NotificationType.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/NotificationType.java index b2d579bf20b..9e93fffb2d6 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/NotificationType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/NotificationType.java @@ -20,6 +20,7 @@ public enum NotificationType { + CASE_CLASSIFICATION_CHANGED(NotificationTypeGroup.CASES), CASE_INVESTIGATION_DONE(NotificationTypeGroup.CASES), CASE_LAB_RESULT_ARRIVED(NotificationTypeGroup.CASES), diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java index b25b722d021..badc6d4f9ee 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java @@ -576,7 +576,6 @@ public void incrementChangeDate(ADO ado) { } public interface PredicateBuilder { - Predicate buildPredicate(CriteriaBuilder cb, Root root, CriteriaQuery cq); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java index f7bdeed07a2..971925a4a98 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java @@ -778,7 +778,6 @@ public List getDiseaseBurden( Long outbreakDistrictCount = outbreakDistrictsCount.getOrDefault(disease, 0L); Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); District lastReportedDistrict = lastReportedDistricts.getOrDefault(disease, null); - String lastReportedDistrictName = lastReportedDistrict == null ? "" : lastReportedDistrict.getName(); return new DiseaseBurdenDto( diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java index b6891d9203a..cef5fc829f3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java @@ -225,6 +225,30 @@ public Map getCaseCountByDisease(DashboardCriteria dashboardCrite Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); + filter = CriteriaBuilderHelper.and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); + + if (filter != null) { + cq.where(filter); + } + + cq.groupBy(caze.get(Case.DISEASE)); + cq.multiselect(caze.get(Case.DISEASE), cb.count(caze)); + List results = em.createQuery(cq).getResultList(); + + Map resultMap = results.stream().collect(Collectors.toMap(e -> (Disease) e[0], e -> (Long) e[1])); + + return resultMap; + } + + public Map getCaseCountByDisease2(DashboardCriteria dashboardCriteria) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Object[].class); + Root caze = cq.from(Case.class); + final CaseQueryContext caseQueryContext = new CaseQueryContext(cb, cq, caze); + + Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); + filter = and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); if (filter != null) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java index abcf1a22e4c..831918181e1 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java @@ -156,7 +156,9 @@ public DiseaseBurdenDto getDiseaseForDashboard( DashboardCriteria dashboardCriteria = - new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); + new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType); + dashboardCriteria.setDateTo(toDate); + dashboardCriteria.setDateFrom(fromDate); Map newCases = dashboardService.getCaseCountByDisease(dashboardCriteria); @@ -236,8 +238,9 @@ public DiseaseBurdenDto getDiseaseGridForDashboard( //new cases DashboardCriteria dashboardCriteria = - new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); - + new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType); + dashboardCriteria.setDateTo(toDate); + dashboardCriteria.setDateFrom(fromDate); //Load count all dead/ fatalities diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java index 123065a489f..c0ae7813227 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java @@ -173,7 +173,6 @@ public void testDashboardEventListCreation() { // List should have one entry assertEquals(1, dashboardEventDtos.size()); } - @Test public void testDiseaseBurdenForDashboard() { 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 6b163ac6131..b0796859563 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 @@ -110,8 +110,6 @@ public void refreshData() { this.refreshDataForSelectedDisease(); } - - @Override protected DashboardCriteria newCriteria() { return new DashboardCriteria(newCaseDateType); @@ -123,7 +121,6 @@ public void refreshDiseaseData() { ,newCaseDateType ,caseClassification); - setDiseaseBurdenDetail(dbd); setOutbreakDistrictCount( @@ -222,6 +219,57 @@ public void refreshDataForSelectedDisease() { // Update the entities lists according to the filters + if (getDashboardType() == DashboardType.CONTACTS) { + // Contacts + setContacts(FacadeProvider.getContactFacade().getContactsForDashboard(region, district, disease, fromDate, toDate)); + setPreviousContacts( + FacadeProvider.getContactFacade().getContactsForDashboard(region, district, disease, previousFromDate, previousToDate)); + + this.refreshDataForQuarantinedContacts(); + } + + if (getDashboardType() == DashboardType.CONTACTS || this.disease != null) { + DashboardCriteria caseDashboardCriteria = buildDashboardCriteria(fromDate, toDate); + + // Cases + setCases(FacadeProvider.getDashboardFacade().getCases(caseDashboardCriteria)); + setLastReportedDistrict(FacadeProvider.getDashboardFacade().getLastReportedDistrictName(caseDashboardCriteria)); + setCasesCountByClassification( + FacadeProvider.getDashboardFacade() + .getCasesCountByClassification(buildDashboardCriteria(fromDate, toDate).includeNotACaseClassification(true))); + + setPreviousCases(FacadeProvider.getDashboardFacade().getCases(buildDashboardCriteria(previousFromDate, previousToDate))); + + // test results + if (getDashboardType() != DashboardType.CONTACTS) { + setNewCasesFinalLabResultCountByResultType( + FacadeProvider.getDashboardFacade().getNewCasesFinalLabResultCountByResultType(caseDashboardCriteria)); + } + } + + if (this.disease == null || getDashboardType() == DashboardType.CONTACTS) { + return; + } + + // Events + DashboardCriteria eventDashboardCriteria = buildDashboardCriteriaWithDates(); + setEvents(FacadeProvider.getDashboardFacade().getNewEvents(eventDashboardCriteria)); + setEventCountByStatus(FacadeProvider.getDashboardFacade().getEventCountByStatus(eventDashboardCriteria)); + + setOutbreakDistrictCount( + FacadeProvider.getOutbreakFacade() + .getOutbreakDistrictCount( + new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate))); + + refreshDataForQuarantinedCases(); + refreshDataForConvertedContactsToCase(); + refreshDataForCasesWithReferenceDefinitionFulfilled(); + } + + public void refreshDataForSelectedDisease2() { + + // Update the entities lists according to the filters + if (getDashboardType() == DashboardType.CONTACTS) { // Contacts setContacts(FacadeProvider.getContactFacade().getContactsForDashboard(region, district, disease, fromDate, toDate, caseClassification)); @@ -232,13 +280,9 @@ public void refreshDataForSelectedDisease() { this.refreshDataForQuarantinedContacts(); } -// if (getDashboardType() == DashboardType.SAMPLES) { -// //Samples counts -// setSampleCount(FacadeProvider.getSampleFacade().getSampleCounts(region, district, disease, fromDate, toDate)); -// setPreviousSampleCount(FacadeProvider.getSampleFacade().getSampleCounts(region, district, disease, previousFromDate, previousToDate)); -// } - if (getDashboardType() == DashboardType.CONTACTS || getDashboardType() == DashboardType.SAMPLES || this.disease != null) { + + if (getDashboardType() == DashboardType.CONTACTS || getDashboardType() == DashboardType.SAMPLES ||getDashboardType() == DashboardType.DISEASE|| this.disease != null) { // Cases DashboardCriteria dashboardCriteria = new DashboardCriteria(dateTypeClass).region(region) .district(district) @@ -261,28 +305,9 @@ public void refreshDataForSelectedDisease() { setCasesCountByClassification(FacadeProvider.getDashboardFacade().getCasesCountByClassification(dashboardCriteria)); - System.out.println("===dashboardCriteria==="); - - System.out.println(dashboardCriteria); - } - - if (getDashboardType() == DashboardType.DISEASE || this.disease != null) { - // Cases - CaseCriteria caseCriteria = new CaseCriteria(); - caseCriteria.region(region).district(district).disease(disease).newCaseDateBetween(fromDate, toDate, newCaseDateType); - //setCases(FacadeProvider.getCaseFacade().getCasesForDashboard(caseCriteria)); - setLastReportedDistrict(FacadeProvider.getCaseFacade().getLastReportedDistrictName(caseCriteria, true, true)); - - caseCriteria.newCaseDateBetween(previousFromDate, previousToDate, newCaseDateType); - caseCriteria.setCaseClassification(caseClassification); - caseCriteria.setNewCaseDateType(newCaseDateType); - - //setCases(FacadeProvider.getCaseFacade().getCasesForDashboard(caseCriteria)); - - setPreviousCases(FacadeProvider.getCaseFacade().getCasesForDashboard(caseCriteria)); if (getCases().size() > 0) { setTestResultCountByResultType( diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java index 49e464c0753..629ca140bce 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java @@ -280,22 +280,59 @@ public void createDateFilters() { addCustomComponent(dateFilterLayout, DATE_FILTER); btnCurrentPeriod = ButtonHelper.createIconPopupButton( - "currentPeriod", - null, - new VerticalLayout(createDateFilterButtonsLayout(), createCustomDateFilterLayout()), - CssStyles.BUTTON_FILTER, - CssStyles.BUTTON_FILTER_LIGHT); + "currentPeriod", + null, + new VerticalLayout(createDateFilterButtonsLayout(), createCustomDateFilterLayout()), + CssStyles.BUTTON_FILTER, + CssStyles.BUTTON_FILTER_LIGHT); + + Label lblComparedTo = new Label(I18nProperties.getCaption(Captions.dashboardComparedTo)); + CssStyles.style(lblComparedTo, CssStyles.VSPACE_TOP_4, CssStyles.LABEL_BOLD); + + btnComparisonPeriod = ButtonHelper.createIconPopupButton( + "comparisonPeriod", + null, + createDateComparisonButtonsLayout(), + ValoTheme.BUTTON_BORDERLESS, + CssStyles.BUTTON_FILTER, + CssStyles.BUTTON_FILTER_LIGHT); + + dateFilterLayout.addComponents(btnCurrentPeriod, lblComparedTo, btnComparisonPeriod); + + // Set initial date filter + CssStyles.style(btnThisWeek, CssStyles.BUTTON_FILTER_DARK); + CssStyles.removeStyles(btnThisWeek, CssStyles.BUTTON_FILTER_LIGHT); + CssStyles.style(btnPeriodBefore, CssStyles.BUTTON_FILTER_DARK); + CssStyles.removeStyles(btnPeriodBefore, CssStyles.BUTTON_FILTER_LIGHT); + activeComparisonButton = btnPeriodBefore; + currentDateFilterType = DateFilterType.THIS_WEEK; + setDateFilter(DateHelper.getStartOfWeek(new Date()), new Date()); + updateComparisonButtons(NewDateFilterType.THIS_WEEK, DateHelper.getStartOfWeek(new Date()), new Date(), false); + btnCurrentPeriod.setCaption(btnThisWeek.getCaption()); + } + public void createDateFilters2() { + HorizontalLayout dateFilterLayout = new HorizontalLayout(); + dateFilterLayout.setSpacing(true); + CssStyles.style(dateFilterLayout, CssStyles.VSPACE_3); + addCustomComponent(dateFilterLayout, DATE_FILTER); + + btnCurrentPeriod = ButtonHelper.createIconPopupButton( + "currentPeriod", + null, + new VerticalLayout(createDateFilterButtonsLayout(), createCustomDateFilterLayout()), + CssStyles.BUTTON_FILTER, + CssStyles.BUTTON_FILTER_LIGHT); Label lblComparedTo = new Label(I18nProperties.getCaption(Captions.dashboardComparedTo)); CssStyles.style(lblComparedTo, CssStyles.VSPACE_TOP_4, CssStyles.LABEL_BOLD); btnComparisonPeriod = ButtonHelper.createIconPopupButton( - "comparisonPeriod", - null, - createDateComparisonButtonsLayout(), - ValoTheme.BUTTON_BORDERLESS, - CssStyles.BUTTON_FILTER, - CssStyles.BUTTON_FILTER_LIGHT); + "comparisonPeriod", + null, + createDateComparisonButtonsLayout(), + ValoTheme.BUTTON_BORDERLESS, + CssStyles.BUTTON_FILTER, + CssStyles.BUTTON_FILTER_LIGHT); dateFilterLayout.addComponents(btnCurrentPeriod, lblComparedTo, btnComparisonPeriod); @@ -780,48 +817,4 @@ protected void addCustomComponent(Component component, String locator) { component.addStyleName(FILTER_ITEM_STYLE); } - - public void reload(ViewChangeListener.ViewChangeEvent event) { - DashboardCriteria criteria = dashboardDataProvider.getCriteria(); - String params = event.getParameters().trim(); - if (params.startsWith("?")) { - params = params.substring(1); - - criteria.fromUrlParams(params); - updateFilterDates(criteria); - } - setCriteria(criteria); - - } - - public void updateFilterDates(DashboardCriteria criteria) { - NewDateFilterType dateFilterType = criteria.getDateFilterType(); - if (dateFilterType == NewDateFilterType.TODAY) { - criteria.dateFrom(DateHelper.getStartOfDay(new Date())); - criteria.dateTo(new Date()); - } - if (dateFilterType == NewDateFilterType.YESTERDAY) { - criteria.dateFrom(DateHelper.getStartOfDay(DateHelper.subtractDays(new Date(), 1))); - criteria.dateTo(DateHelper.getEndOfDay(DateHelper.subtractDays(new Date(), 1))); - } - if (dateFilterType == NewDateFilterType.THIS_WEEK) { - criteria.dateFrom(DateHelper.getStartOfWeek(new Date())); - criteria.dateTo(new Date()); - } - if (dateFilterType == NewDateFilterType.LAST_WEEK) { - criteria.dateFrom(DateHelper.getStartOfWeek(DateHelper.subtractWeeks(new Date(), 1))); - criteria.dateTo(DateHelper.getEndOfWeek(DateHelper.subtractWeeks(new Date(), 1))); - } - if (dateFilterType == NewDateFilterType.THIS_YEAR) { - criteria.dateFrom(DateHelper.getStartOfWeek(DateHelper.getStartOfYear(new Date()))); - criteria.dateTo(new Date()); - } - if (dateFilterType == NewDateFilterType.CUSTOM) { - criteria.dateFrom(criteria.getDateFrom()); - criteria.dateTo(criteria.getDateTo()); - } - - - - } } From dd0887b0d97542f6d4e41f74a4317e3cc59e2cee Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Sun, 18 Feb 2024 01:30:37 +0000 Subject: [PATCH 26/71] fix dashboard bug after merge#12880 --- .../api/dashboard/DashboardCriteria.java | 13 +------- .../backend/disease/DiseaseFacadeEjb.java | 4 +-- .../ui/dashboard/DashboardDataProvider.java | 19 +++++------- .../components/DashboardFilterLayout.java | 31 ------------------- 4 files changed, 11 insertions(+), 56 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java index 1c3fb5afe61..2470edfec04 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java @@ -91,24 +91,13 @@ public DashboardCriteria dateFilterType(NewDateFilterType dateFilterType) { return this; } - - public void setDateFrom(Date dateFrom) { this.dateFrom = dateFrom; } public void setDateTo(Date dateTo) { this.dateTo = dateTo; - } - - public Date getDateFrom() { - return dateFrom; - } - - public Date getDateTo() { - return dateTo; - } - + } public void setOutcome(CaseOutcome outcome) { this.outcome = outcome; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java index d4ec6f62ea1..68ff09ded99 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java @@ -157,8 +157,8 @@ public DiseaseBurdenDto getDiseaseForDashboard( DashboardCriteria dashboardCriteria = new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType); - dashboardCriteria.setDateTo(toDate); - dashboardCriteria.setDateFrom(fromDate); + dashboardCriteria.setDateTo(toDate); + dashboardCriteria.setDateFrom(fromDate); Map newCases = dashboardService.getCaseCountByDisease(dashboardCriteria); 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 cc9c85a73c1..9f5b64071e7 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 @@ -217,8 +217,7 @@ private void refreshDataForCasesWithReferenceDefinitionFulfilled() { setCaseWithReferenceDefinitionFulfilledCount(Long.valueOf(casesWithReferenceDefinitionFulfilled.size())); } - - public void refreshDataForSelectedDisease() { + public void refreshDataForSelectedDisease() { // Update the entities lists according to the filters @@ -226,7 +225,7 @@ public void refreshDataForSelectedDisease() { // Contacts setContacts(FacadeProvider.getContactFacade().getContactsForDashboard(region, district, disease, fromDate, toDate)); setPreviousContacts( - FacadeProvider.getContactFacade().getContactsForDashboard(region, district, disease, previousFromDate, previousToDate)); + FacadeProvider.getContactFacade().getContactsForDashboard(region, district, disease, previousFromDate, previousToDate)); this.refreshDataForQuarantinedContacts(); } @@ -238,15 +237,15 @@ public void refreshDataForSelectedDisease() { setCases(FacadeProvider.getDashboardFacade().getCases(caseDashboardCriteria)); setLastReportedDistrict(FacadeProvider.getDashboardFacade().getLastReportedDistrictName(caseDashboardCriteria)); setCasesCountByClassification( - FacadeProvider.getDashboardFacade() - .getCasesCountByClassification(buildDashboardCriteria(fromDate, toDate).includeNotACaseClassification(true))); + FacadeProvider.getDashboardFacade() + .getCasesCountByClassification(buildDashboardCriteria(fromDate, toDate).includeNotACaseClassification(true))); setPreviousCases(FacadeProvider.getDashboardFacade().getCases(buildDashboardCriteria(previousFromDate, previousToDate))); // test results if (getDashboardType() != DashboardType.CONTACTS) { setNewCasesFinalLabResultCountByResultType( - FacadeProvider.getDashboardFacade().getNewCasesFinalLabResultCountByResultType(caseDashboardCriteria)); + FacadeProvider.getDashboardFacade().getNewCasesFinalLabResultCountByResultType(caseDashboardCriteria)); } } @@ -260,17 +259,15 @@ public void refreshDataForSelectedDisease() { setEventCountByStatus(FacadeProvider.getDashboardFacade().getEventCountByStatus(eventDashboardCriteria)); setOutbreakDistrictCount( - FacadeProvider.getOutbreakFacade() - .getOutbreakDistrictCount( - new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate))); + FacadeProvider.getOutbreakFacade() + .getOutbreakDistrictCount( + new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate))); refreshDataForQuarantinedCases(); refreshDataForConvertedContactsToCase(); refreshDataForCasesWithReferenceDefinitionFulfilled(); } - - private DashboardCriteria buildDashboardCriteria(Date fromDate, Date toDate) { return buildDashboardCriteria().newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java index 1b210844de3..9f6f3892d3b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java @@ -825,40 +825,9 @@ public void reload(ViewChangeListener.ViewChangeEvent event) { params = params.substring(1); criteria.fromUrlParams(params); - updateFilterDates(criteria); } setCriteria(criteria); } - public void updateFilterDates(DashboardCriteria criteria) { - NewDateFilterType dateFilterType = criteria.getDateFilterType(); - if (dateFilterType == NewDateFilterType.TODAY) { - criteria.dateFrom(DateHelper.getStartOfDay(new Date())); - criteria.dateTo(new Date()); - } - if (dateFilterType == NewDateFilterType.YESTERDAY) { - criteria.dateFrom(DateHelper.getStartOfDay(DateHelper.subtractDays(new Date(), 1))); - criteria.dateTo(DateHelper.getEndOfDay(DateHelper.subtractDays(new Date(), 1))); - } - if (dateFilterType == NewDateFilterType.THIS_WEEK) { - criteria.dateFrom(DateHelper.getStartOfWeek(new Date())); - criteria.dateTo(new Date()); - } - if (dateFilterType == NewDateFilterType.LAST_WEEK) { - criteria.dateFrom(DateHelper.getStartOfWeek(DateHelper.subtractWeeks(new Date(), 1))); - criteria.dateTo(DateHelper.getEndOfWeek(DateHelper.subtractWeeks(new Date(), 1))); - } - if (dateFilterType == NewDateFilterType.THIS_YEAR) { - criteria.dateFrom(DateHelper.getStartOfWeek(DateHelper.getStartOfYear(new Date()))); - criteria.dateTo(new Date()); - } - if (dateFilterType == NewDateFilterType.CUSTOM) { - criteria.dateFrom(criteria.getDateFrom()); - criteria.dateTo(criteria.getDateTo()); - } - - - - } } From c09422751237d0f61e9f89153d9533af0923c207 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Sun, 18 Feb 2024 10:24:48 +0000 Subject: [PATCH 27/71] fix bug to pass test cases#12880 --- .../sormas/api/dashboard/DashboardCriteria.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java index 1c3fb5afe61..c26641e2adf 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java @@ -90,9 +90,7 @@ public DashboardCriteria dateFilterType(NewDateFilterType dateFilterType) { this.dateFilterType = dateFilterType; return this; } - - - + public void setDateFrom(Date dateFrom) { this.dateFrom = dateFrom; } @@ -100,15 +98,6 @@ public void setDateFrom(Date dateFrom) { public void setDateTo(Date dateTo) { this.dateTo = dateTo; } - - public Date getDateFrom() { - return dateFrom; - } - - public Date getDateTo() { - return dateTo; - } - public void setOutcome(CaseOutcome outcome) { this.outcome = outcome; From 65a4c1bbaa00ad7133c3822ea7537e93f1771e28 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:09:52 +0000 Subject: [PATCH 28/71] fixed outbreak date one day delay bug --- .../AbstractDashboardDataProvider.java | 3 - .../ui/dashboard/DashboardController.java | 12 +- .../ui/dashboard/DashboardDataProvider.java | 25 +- .../diseasedetails/DiseaseDetailsView.java | 247 +++++++----------- .../diseasedetails/DiseaseFilterLayout.java | 2 +- .../disease/tile/DiseaseTileViewLayout.java | 2 +- 6 files changed, 105 insertions(+), 186 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java index f07acca8073..11ad75263c6 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java @@ -148,9 +148,6 @@ public void setCaseClassification(CaseClassification caseClassification) { this.caseClassification = caseClassification; } - - - public void setNewCaseDateType(NewCaseDateType newCaseDateType) { this.newCaseDateType = newCaseDateType; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java index 8ea3307727d..6d76c5ee73c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java @@ -29,7 +29,6 @@ import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.ui.SormasUI; -import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.dashboard.campaigns.CampaignDashboardView; import de.symeda.sormas.ui.dashboard.contacts.ContactsDashboardView; import de.symeda.sormas.ui.dashboard.diseasedetails.DiseaseDetailsView; @@ -69,7 +68,6 @@ public void registerViews(Navigator navigator) { } - public void navigateToDisease(Disease disease,DashboardDataProvider dashboardDataProvider) { Date dateFrom = dashboardDataProvider.getFromDate(); @@ -86,26 +84,18 @@ public void navigateToDisease(Disease disease,DashboardDataProvider dashboardDat String dateToAsISO = df.format(dateTo); NewCaseDateType newCaseDateType = dashboardDataProvider.getNewCaseDateType(); - RegionReferenceDto region = dashboardDataProvider.getRegion(); String regionId = null; if(Objects.nonNull(region)&®ion.getUuid()!=null){ regionId= region.getUuid(); } System.out.println(regionId); - - -// String paramData = dateFromAsISO+"/"+dateToAsISO+"/"+type+"/"+caseClassification+"/"+newCaseDateType+"/"+regionId; -// - DiseaseDetailsView.setData(paramData); + DiseaseDetailsView.setDiseaseDetailsData(paramData); //DiseaseDetailsView.setProvider(dashboardDataProvider); String navigationState = DiseaseDetailsView.VIEW_NAME + "/" + disease.getName(); - SormasUI.get().getNavigator().navigateTo(navigationState); - - } } 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 9f5b64071e7..d7f2fe47b56 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 @@ -103,9 +103,9 @@ public void refreshData() { // Update the entities lists according to the filters // Disease burden - setDiseasesBurden( - FacadeProvider.getDashboardFacade() - .getDiseaseBurden(region, district, fromDate, toDate, previousFromDate, previousToDate, newCaseDateType)); + List diseaseBurden = FacadeProvider.getDashboardFacade() + .getDiseaseBurden(region, district, fromDate, toDate, previousFromDate, previousToDate, newCaseDateType); + setDiseasesBurden(diseaseBurden); this.refreshDataForSelectedDisease(); } @@ -124,11 +124,10 @@ public void refreshDiseaseData() { ,caseClassification); setDiseaseBurdenDetail(dbd); - - setOutbreakDistrictCount( - FacadeProvider.getOutbreakFacade() - .getOutbreakDistrictCount( - new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate).caseClassification(caseClassification))); + Long outbreakDistrictCount = FacadeProvider.getOutbreakFacade() + .getOutbreakDistrictCount( + new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate).caseClassification(caseClassification)); + setOutbreakDistrictCount(outbreakDistrictCount); this.refreshDataForSelectedDisease(); } @@ -258,10 +257,12 @@ public void refreshDataForSelectedDisease() { setEvents(FacadeProvider.getDashboardFacade().getNewEvents(eventDashboardCriteria)); setEventCountByStatus(FacadeProvider.getDashboardFacade().getEventCountByStatus(eventDashboardCriteria)); - setOutbreakDistrictCount( - FacadeProvider.getOutbreakFacade() - .getOutbreakDistrictCount( - new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate))); + Long outbreakDistrictCount = FacadeProvider.getOutbreakFacade() + .getOutbreakDistrictCount( + new OutbreakCriteria().region(region).district(district).disease(disease) + .reportedBetween(fromDate, toDate)); + + setOutbreakDistrictCount(outbreakDistrictCount); refreshDataForQuarantinedCases(); refreshDataForConvertedContactsToCase(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java index 3e167511fd8..8a38bd8e244 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java @@ -5,16 +5,10 @@ import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.dashboard.NewDateFilterType; -import de.symeda.sormas.api.i18n.I18nProperties; -import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.infrastructure.region.RegionDto; -import de.symeda.sormas.ui.SormasUI; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.ui.dashboard.AbstractDashboardView; -import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.DashboardType; -import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; -import de.symeda.sormas.ui.dashboard.contacts.components.ContactsFilterLayout; -import de.symeda.sormas.ui.utils.ViewConfiguration; import static com.vaadin.navigator.ViewChangeListener.*; @@ -23,6 +17,8 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.EnumSet; +import java.util.logging.Level; +import java.util.logging.Logger; @SuppressWarnings("serial") public class DiseaseDetailsView extends AbstractDashboardView { @@ -30,11 +26,13 @@ public class DiseaseDetailsView extends AbstractDashboardView { private static final long serialVersionUID = -1L; public static final String VIEW_NAME = ROOT_VIEW_NAME + "/disease"; + private static final Logger LOGGER = Logger.getLogger(DiseaseDetailsView.class.getName()); + protected DiseaseDetailsViewLayout diseaseDetailsViewLayout; - public static String data; - public static void setData(String newData) { - data=newData; + public static String diseaseDetailsData; + public static void setDiseaseDetailsData(String newData) { + diseaseDetailsData =newData; } @@ -43,146 +41,24 @@ public DiseaseDetailsView() { dashboardLayout.setSpacing(false); - String paramData = (String) SormasUI.get().getSession().getAttribute("paramdata"); - - - if (data != null) { - - String dateFrom = data.split("/")[0]; - - String dateTo = data.split("/")[1]; - - String type = data.split("/")[2]; - - String caseClassification = data.split("/")[3]; - - String newCaseDateType = data.split("/")[4]; - - String regionId = data.split("/")[5]; - - if (dateFrom != null) { - - - DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd"); - String string1 = dateFrom; - try { - Date result1 = df1.parse(string1); - dashboardDataProvider.setFromDate(result1); - } catch (ParseException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - // dashboardDataProvider.setFromDate(new Date(params[1])); - } - - if (dateTo != null) { - - DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd"); - String string1 = dateTo; - try { - Date result1 = df1.parse(string1); - dashboardDataProvider.setToDate(result1); - } catch (ParseException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - // dashboardDataProvider.setFromDate(new Date(params[2])); - } - - if (type != null) { - - - // NewDateFilterType.values(); - dashboardDataProvider.setDateFilterType(EnumSet.allOf(NewDateFilterType.class).stream() - .filter(e -> e.name().equals(type)).findFirst() - .orElseThrow(() -> new IllegalStateException(String.format("Unsupported type %s.", type)))); - - // dashboardDataProvider.setFromDate(new Date(params[2])); + if (diseaseDetailsData != null) { + String[] dataParts = diseaseDetailsData.split("/"); + if (dataParts.length == 6) { + String dateFrom = dataParts[0]; + String dateTo = dataParts[1]; + String newDateFilterType = dataParts[2]; + String caseClassification = dataParts[3]; + String newCaseDateType = dataParts[4]; + String regionId = dataParts[5]; + + setDateFilters(dateFrom, dateTo); + setDateFilterType(newDateFilterType); + setCaseClassification(caseClassification); + setNewCaseDateType(newCaseDateType); + setRegion(regionId); } - - // dashboardDataProvider.setRegion(region); - - if (caseClassification != null) { - - String caseClass = caseClassification.replace("case", "").toUpperCase().trim(); - - if (!caseClass.equals("NULL")) { - - - if(caseClass.equals("NOT YET CLASSIFIED")) { - - dashboardDataProvider.setCaseClassification(CaseClassification.NOT_CLASSIFIED); - - }else if (caseClass.equals("CONFIRMED WITH UNKNOWN SYMPTOMS")){ - - dashboardDataProvider.setCaseClassification(CaseClassification.CONFIRMED_UNKNOWN_SYMPTOMS); - - } - else if (caseClass.equals("NOT A")){ - - dashboardDataProvider.setCaseClassification(CaseClassification.NO_CASE); - - }else if(caseClass.equals("CONFIRMED WITH NO SYMPTOMS")) { - - dashboardDataProvider.setCaseClassification(CaseClassification.CONFIRMED_NO_SYMPTOMS); - - } - else { - - dashboardDataProvider.setCaseClassification(EnumSet.allOf(CaseClassification.class).stream() - .filter(e -> e.name().equals(caseClass)).findFirst().orElseThrow( - () -> new IllegalStateException(String.format("Unsupported type %s.", caseClass)))); - } - // dashboardDataProvider.setFromDate(new Date(params[2])); - //dashboardDataProvider.setCaseClassification(CaseClassification.CONFIRMED); - - } - } else { - dashboardDataProvider.setCaseClassification(CaseClassification.NOT_CLASSIFIED); - } - - - - if (newCaseDateType != null) { - - NewCaseDateType enumNewCaseDateType; - switch (newCaseDateType) { - case "Creation date": - enumNewCaseDateType = NewCaseDateType.CREATION; - break; - case "Investigation date": - enumNewCaseDateType = NewCaseDateType.INVESTIGATION; - break; - case "Most relevant date": - enumNewCaseDateType = NewCaseDateType.MOST_RELEVANT; - break; - case "Symptom onset date": - enumNewCaseDateType = NewCaseDateType.ONSET; - break; - case "Case report date": - enumNewCaseDateType = NewCaseDateType.REPORT; - break; - case "Classification date": - enumNewCaseDateType = NewCaseDateType.CLASSIFICATION; - break; - default: - enumNewCaseDateType = NewCaseDateType.MOST_RELEVANT; - } - - dashboardDataProvider.setNewCaseDateType(enumNewCaseDateType); - } - - if(!regionId.equals("null")) { - - RegionDto region = FacadeProvider.getRegionFacade().getByUuid(regionId); - dashboardDataProvider.setRegion(region.toReference()); - - } - } - if (dashboardDataProvider.getDashboardType() == null) { dashboardDataProvider.setDashboardType(DashboardType.DISEASE); } @@ -191,13 +67,6 @@ else if (caseClass.equals("NOT A")){ dashboardDataProvider.setDisease(FacadeProvider.getDiseaseConfigurationFacade().getDefaultDisease()); } - // dashboardDataProvider.setNewCaseDateType(NewCaseDateType.MOST_RELEVANT); - - // filterLayout = new DashboardFilterLayout(this, dashboardDataProvider); - // filterLayout.setInfoLabelText(I18nProperties.getString(Strings.classificationForDisease)); -// - - filterLayout = new DiseaseFilterLayout(this, dashboardDataProvider); dashboardLayout.addComponent(filterLayout); @@ -213,6 +82,72 @@ else if (caseClass.equals("NOT A")){ dashboardLayout.setExpandRatio(diseaseDetailsViewLayout, 1); } + private void setDateFilters(String dateFrom, String dateTo) { + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + try { + if (dateFrom != null) { + Date startDate = dateFormat.parse(dateFrom); + dashboardDataProvider.setFromDate(DateHelper.getStartOfDay(startDate)); + } + if (dateTo != null) { + Date endDate = dateFormat.parse(dateTo); + dashboardDataProvider.setToDate(DateHelper.getEndOfDay(endDate)); + } + } catch (ParseException e) { + LOGGER.log(Level.SEVERE, "Date parsing error", e); + } + } + + private void setDateFilterType(String newDateFilterType) { + try { + NewDateFilterType filterType = NewDateFilterType.valueOf(newDateFilterType); + dashboardDataProvider.setDateFilterType(filterType); + } catch (IllegalArgumentException e) { + LOGGER.log(Level.WARNING, "Unsupported date filter type: " + newDateFilterType, e); + } + } + + private void setCaseClassification(String caseClassification) { + try { + CaseClassification classification = CaseClassification.valueOf(caseClassification.replace(" ", "_").toUpperCase().trim()); + dashboardDataProvider.setCaseClassification(classification); + } catch (IllegalArgumentException e) { + LOGGER.log(Level.WARNING, "Unsupported case classification: " + caseClassification, e); + dashboardDataProvider.setCaseClassification(CaseClassification.NOT_CLASSIFIED); + } + } + + private void setNewCaseDateType(String newCaseDateType) { + NewCaseDateType caseDateType; + switch (newCaseDateType) { + case "Creation date": + caseDateType = NewCaseDateType.CREATION; + break; + case "Investigation date": + caseDateType = NewCaseDateType.INVESTIGATION; + break; + case "Symptom onset date": + caseDateType = NewCaseDateType.ONSET; + break; + case "Case report date": + caseDateType = NewCaseDateType.REPORT; + break; + case "Classification date": + caseDateType = NewCaseDateType.CLASSIFICATION; + break; + default: + caseDateType = NewCaseDateType.MOST_RELEVANT; + } + dashboardDataProvider.setNewCaseDateType(caseDateType); + } + + private void setRegion(String regionId) { + if (!"null".equals(regionId)) { + RegionDto region = FacadeProvider.getRegionFacade().getByUuid(regionId); + dashboardDataProvider.setRegion(region.toReference()); + } + } + @Override public void refreshDiseaseData() { @@ -229,8 +164,4 @@ public void enter(ViewChangeEvent event) { refreshDiseaseData(); } - - - - } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java index e749fc02cb9..6fcabe1c18e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java @@ -23,7 +23,7 @@ import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.components.datetypeselector.DateTypeSelectorComponent; -public class DiseaseFilterLayout extends DashboardFilterLayout { +public class DiseaseFilterLayout extends DashboardFilterLayout { public static final String DATE_TYPE_SELECTOR_FILTER = "dateTypeSelectorFilter"; public static final String INFO_LABEL = "infoLabel"; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java index 6e9de67ad12..a684a5e534d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java @@ -28,7 +28,7 @@ public class DiseaseTileViewLayout extends CssLayout { - private DashboardDataProvider dashboardDataProvider; + private final DashboardDataProvider dashboardDataProvider; private static final long serialVersionUID = 6582975657305031105L; From 9a632665d176c9148d85f64349b1ebdcab5c6cd7 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 25 Jun 2024 07:52:10 +0000 Subject: [PATCH 29/71] compilation error fixed after branch update --- .../symeda/sormas/api/caze/CaseCriteria.java | 2 +- .../de/symeda/sormas/api/caze/CaseFacade.java | 6 +- .../sormas/api/contact/ContactFacade.java | 8 -- .../sormas/api/disease/DiseaseFacade.java | 14 +- .../sormas/backend/caze/CaseFacadeEjb.java | 4 +- .../sormas/backend/caze/CaseService.java | 46 +++---- .../backend/contact/ContactFacadeEjb.java | 3 + .../backend/contact/ContactService.java | 1 + .../backend/disease/DiseaseFacadeEjb.java | 120 +++++++++--------- .../region/RegionFacadeEjb.java | 1 + .../backend/outbreak/OutbreakService.java | 1 + .../backend/person/PersonFacadeEjb.java | 1 + .../sormas/backend/sample/SampleService.java | 10 +- .../diseasedetails/DiseaseDetailsView.java | 6 +- .../dashboard/map/DashboardMapComponent.java | 4 + 15 files changed, 113 insertions(+), 114 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 fe7777f3c23..a86a91280b4 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 @@ -1,4 +1,4 @@ -s/******************************************************************************* +/******************************************************************************* * SORMAS® - Surveillance Outbreak Response Management & Analysis System * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) * 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 a77b2fb4a99..75afcac0718 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 @@ -200,7 +200,9 @@ List saveBulkEditWithFacilities( List getDuplicates(@Valid CasePersonDto casePerson); - List getDuplicatesWithPathogenTest(@Valid PersonReferenceDto personReferenceDto, PathogenTestDto pathogenTestDto); + List getCasesForDashboard(CaseCriteria caseCriteria); + + List getDuplicatesWithPathogenTest(@Valid PersonReferenceDto personReferenceDto, PathogenTestDto pathogenTestDto); List getByPersonUuids(List personUuids); @@ -208,6 +210,8 @@ List saveBulkEditWithFacilities( List getRelevantCasesForVaccination(VaccinationDto vaccination); + String getLastReportedDistrictName(CaseCriteria caseCriteria, boolean excludeSharedCases, boolean excludeCasesFromContacts); + void updateExternalData(@Valid List externalData) throws ExternalDataUpdateException; int updateCompleteness(); 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 55af8618b12..1761283f69a 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 @@ -106,14 +106,6 @@ List getContactsForDashboard( Date from, Date to); - List getContactsForDashboard( - RegionReferenceDto regionRef, - DistrictReferenceDto districtRef, - Disease disease, - Date from, - Date to, - CaseClassification caseClassification); - Map getNewContactCountPerStatus(ContactCriteria contactCriteria); Map getNewContactCountPerClassification(ContactCriteria contactCriteria); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java index 4bfa510d11c..7113afe9257 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java @@ -33,13 +33,13 @@ @Remote public interface DiseaseFacade { - List getDiseaseBurdenForDashboard( - RegionReferenceDto regionRef, - DistrictReferenceDto districtRef, - Date from, - Date to, - Date previousFromDate, - Date previousToDate); +// List getDiseaseBurdenForDashboard( +// RegionReferenceDto regionRef, +// DistrictReferenceDto districtRef, +// Date from, +// Date to, +// Date previousFromDate, +// Date previousToDate); DiseaseBurdenDto getDiseaseForDashboard( 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 f2ff6f5301e..79792a948ce 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 @@ -75,11 +75,9 @@ import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import de.symeda.sormas.api.dashboard.DashboardCaseDto; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.hibernate.engine.spi.SessionImplementor; -import org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory; -import org.hibernate.hql.spi.QueryTranslator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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 ff5dcd0aa34..be3ae904675 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 @@ -2519,7 +2519,7 @@ public Predicate createCriteriaFilter(CaseCriteria caseCriteria, CriteriaBuilder if (caseCriteria.getCommunity() != null) { filter = and(cb, filter, cb.equal(community.get(Community.UUID), caseCriteria.getCommunity().getUuid())); } - if (Boolean.TRUE.equals(caseCriteria.getExcludeSharedCases())) { + if (Boolean.TRUE.equals(caseCriteria.excludeSharedCases)) { User currentUser = getCurrentUser(); if (currentUser != null) { if (currentUser.getDistrict() != null) { @@ -2574,9 +2574,9 @@ public Predicate createCriteriaFilter(CaseCriteria caseCriteria, CriteriaBuilder } - if (caseCriteria.isIncludeNotACaseClassification()==null||caseCriteria.isIncludeNotACaseClassification()==false) { - filter = and(cb, filter, cb.notEqual(from.get(Case.CASE_CLASSIFICATION), CaseClassification.NO_CASE)); - } +// if (caseCriteria.isIncludeNotACaseClassification()==null||caseCriteria.isIncludeNotACaseClassification()==false) { +// filter = and(cb, filter, cb.notEqual(from.get(Case.CASE_CLASSIFICATION), CaseClassification.NO_CASE)); +// } if (caseCriteria.getInvestigationStatus() != null) { @@ -2654,25 +2654,25 @@ public Predicate createCriteriaFilter(CaseCriteria caseCriteria, CriteriaBuilder filter = and(cb, filter, cb.equal(from.get(Case.ARCHIVED), true)); } } - if (caseCriteria.getDeleted() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.DELETED), caseCriteria.getDeleted())); - } - if (caseCriteria.getNameUuidEpidNumberLike() != null) { - String[] textFilters = caseCriteria.getNameUuidEpidNumberLike().split("\\s+"); - for (int i = 0; i < textFilters.length; i++) { - String textFilter = "%" + textFilters[i].toLowerCase() + "%"; - if (!DataHelper.isNullOrEmpty(textFilter)) { - Predicate likeFilters = cb.or( - cb.like(cb.lower(person.get(Person.FIRST_NAME)), textFilter), - cb.like(cb.lower(person.get(Person.LAST_NAME)), textFilter), - cb.like(cb.lower(from.get(Case.UUID)), textFilter), - cb.like(cb.lower(from.get(Case.EPID_NUMBER)), textFilter), - cb.like(cb.lower(facility.get(Facility.NAME)), textFilter), - cb.like(cb.lower(from.get(Case.HEALTH_FACILITY_DETAILS)), textFilter)); - filter = and(cb, filter, likeFilters); - } - } - } +// if (caseCriteria.getDeleted() != null) { +// filter = and(cb, filter, cb.equal(from.get(Case.DELETED), caseCriteria.getDeleted())); +// } +// if (caseCriteria.getNameUuidEpidNumberLike() != null) { +// String[] textFilters = caseCriteria.getNameUuidEpidNumberLike().split("\\s+"); +// for (int i = 0; i < textFilters.length; i++) { +// String textFilter = "%" + textFilters[i].toLowerCase() + "%"; +// if (!DataHelper.isNullOrEmpty(textFilter)) { +// Predicate likeFilters = cb.or( +// cb.like(cb.lower(person.get(Person.FIRST_NAME)), textFilter), +// cb.like(cb.lower(person.get(Person.LAST_NAME)), textFilter), +// cb.like(cb.lower(from.get(Case.UUID)), textFilter), +// cb.like(cb.lower(from.get(Case.EPID_NUMBER)), textFilter), +// cb.like(cb.lower(facility.get(Facility.NAME)), textFilter), +// cb.like(cb.lower(from.get(Case.HEALTH_FACILITY_DETAILS)), textFilter)); +// filter = and(cb, filter, likeFilters); +// } +// } +// } if (caseCriteria.getReportingUserLike() != null) { String[] textFilters = caseCriteria.getReportingUserLike().split("\\s+"); for (int i = 0; i < textFilters.length; i++) { 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 e09a585e276..c9f982b7c0d 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 @@ -67,6 +67,7 @@ import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import de.symeda.sormas.api.caze.CaseClassification; import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -1677,6 +1678,8 @@ public List getContactsForDashboard( return service.getContactsForDashboard(region, district, disease, from, to); } + + @Override public List getByPersonUuids(List personUuids) { return toDtos(service.getByPersonUuids(personUuids).stream()); 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 d8eaccb9e6a..cf0a79d1e42 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 @@ -53,6 +53,7 @@ import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import de.symeda.sormas.backend.event.EventParticipantService; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java index 68ff09ded99..eadcba04d7f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java @@ -81,66 +81,66 @@ public class DiseaseFacadeEjb implements DiseaseFacade { @EJB private FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal featureConfigurationFacade; - @Override - public List getDiseaseBurdenForDashboard( - RegionReferenceDto regionRef, - DistrictReferenceDto districtRef, - Date from, - Date to, - Date previousFrom, - Date previousTo) { - - //diseases - List diseases = diseaseConfigurationFacade.getAllDiseases(true, true, true); - - //new cases - CaseCriteria caseCriteria = new CaseCriteria().newCaseDateBetween(from, to, null).region(regionRef).district(districtRef); - - Map newCases = caseFacade.getCaseCountByDisease(caseCriteria, true, true); - - //events - Map events = - eventFacade.getEventCountByDisease(new EventCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); - - //outbreaks - Map outbreakDistrictsCount = outbreakFacade - .getOutbreakDistrictCountByDisease(new OutbreakCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); - - //last report district - Map lastReportedDistricts = caseFacade.getLastReportedDistrictByDisease(caseCriteria, true, true); - - //case fatalities - Map caseFatalities = personFacade.getDeathCountByDisease(caseCriteria, true, true); - - //previous cases - caseCriteria.newCaseDateBetween(previousFrom, previousTo, null); - Map previousCases = caseFacade.getCaseCountByDisease(caseCriteria, true, true); - - - //build diseasesBurden - List diseasesBurden = diseases.stream().map(disease -> { - Long caseCount = newCases.getOrDefault(disease, 0L); - Long previousCaseCount = previousCases.getOrDefault(disease, 0L); - Long eventCount = events.getOrDefault(disease, 0L); - Long outbreakDistrictCount = outbreakDistrictsCount.getOrDefault(disease, 0L); - Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); - District lastReportedDistrict = lastReportedDistricts.getOrDefault(disease, null); - - String lastReportedDistrictName = lastReportedDistrict == null ? "" : lastReportedDistrict.getName(); - - return new DiseaseBurdenDto( - disease, - caseCount, - previousCaseCount, - eventCount, - outbreakDistrictCount, - caseFatalityCount, - lastReportedDistrictName); - - }).collect(Collectors.toList()); - - return diseasesBurden; - } +// @Override +// public List getDiseaseBurdenForDashboard( +// RegionReferenceDto regionRef, +// DistrictReferenceDto districtRef, +// Date from, +// Date to, +// Date previousFrom, +// Date previousTo) { +// +// //diseases +// List diseases = diseaseConfigurationFacade.getAllDiseases(true, true, true); +// +// //new cases +// CaseCriteria caseCriteria = new CaseCriteria().newCaseDateBetween(from, to, null).region(regionRef).district(districtRef); +// +// Map newCases = caseFacade.getCaseCountByDisease(caseCriteria, true, true); +// +// //events +// Map events = +// eventFacade.getEventCountByDisease(new EventCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); +// +// //outbreaks +// Map outbreakDistrictsCount = outbreakFacade +// .getOutbreakDistrictCountByDisease(new OutbreakCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); +// +// //last report district +// Map lastReportedDistricts = caseFacade.getLastReportedDistrictByDisease(caseCriteria, true, true); +// +// //case fatalities +// Map caseFatalities = personFacade.getDeathCountByDisease(caseCriteria, true, true); +// +// //previous cases +// caseCriteria.newCaseDateBetween(previousFrom, previousTo, null); +// Map previousCases = caseFacade.getCaseCountByDisease(caseCriteria, true, true); +// +// +// //build diseasesBurden +// List diseasesBurden = diseases.stream().map(disease -> { +// Long caseCount = newCases.getOrDefault(disease, 0L); +// Long previousCaseCount = previousCases.getOrDefault(disease, 0L); +// Long eventCount = events.getOrDefault(disease, 0L); +// Long outbreakDistrictCount = outbreakDistrictsCount.getOrDefault(disease, 0L); +// Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); +// District lastReportedDistrict = lastReportedDistricts.getOrDefault(disease, null); +// +// String lastReportedDistrictName = lastReportedDistrict == null ? "" : lastReportedDistrict.getName(); +// +// return new DiseaseBurdenDto( +// disease, +// caseCount, +// previousCaseCount, +// eventCount, +// outbreakDistrictCount, +// caseFatalityCount, +// lastReportedDistrictName); +// +// }).collect(Collectors.toList()); +// +// return diseasesBurden; +// } @Override public DiseaseBurdenDto getDiseaseForDashboard( diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java index 3d7a1719f6c..b32cec81d92 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java @@ -35,6 +35,7 @@ import javax.persistence.criteria.Root; import javax.validation.constraints.NotNull; +import de.symeda.sormas.backend.infrastructure.InfrastructureAdo; import org.apache.commons.collections4.CollectionUtils; import de.symeda.sormas.api.common.Page; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java index c12d39bf3bb..37271c4c45e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java @@ -36,6 +36,7 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import de.symeda.sormas.backend.caze.Case; import org.apache.commons.collections4.CollectionUtils; import de.symeda.sormas.api.Disease; 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 fdfe8920e4c..b7a5ca5895c 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 @@ -59,6 +59,7 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; +import de.symeda.sormas.backend.caze.*; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.SerializationUtils; import org.apache.commons.lang3.StringUtils; 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 c140c577cf0..8045ff5ac5e 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 @@ -56,6 +56,7 @@ import javax.persistence.criteria.Selection; import javax.persistence.criteria.Subquery; +import de.symeda.sormas.api.sample.*; import org.apache.commons.collections4.CollectionUtils; import de.symeda.sormas.api.EntityRelevanceStatus; @@ -71,15 +72,6 @@ import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; -import de.symeda.sormas.api.sample.IsSample; -import de.symeda.sormas.api.sample.PathogenTestResultType; -import de.symeda.sormas.api.sample.PathogenTestType; -import de.symeda.sormas.api.sample.SampleAssociationType; -import de.symeda.sormas.api.sample.SampleCriteria; -import de.symeda.sormas.api.sample.SampleIndexDto; -import de.symeda.sormas.api.sample.SampleJurisdictionFlagsDto; -import de.symeda.sormas.api.sample.SampleListEntryDto; -import de.symeda.sormas.api.sample.SampleReferenceDto; import de.symeda.sormas.api.user.JurisdictionLevel; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java index 8a38bd8e244..99a44ab895e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java @@ -109,8 +109,10 @@ private void setDateFilterType(String newDateFilterType) { private void setCaseClassification(String caseClassification) { try { - CaseClassification classification = CaseClassification.valueOf(caseClassification.replace(" ", "_").toUpperCase().trim()); - dashboardDataProvider.setCaseClassification(classification); + if(caseClassification!=null) { + CaseClassification classification = CaseClassification.valueOf(caseClassification.replace(" ", "_").toUpperCase().trim()); + dashboardDataProvider.setCaseClassification(classification); + } } catch (IllegalArgumentException e) { LOGGER.log(Level.WARNING, "Unsupported case classification: " + caseClassification, e); dashboardDataProvider.setCaseClassification(CaseClassification.NOT_CLASSIFIED); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index 826caa08432..d3708339063 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -64,6 +64,8 @@ import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UiUtil; +import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.dashboard.DashboardCssStyles; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.DashboardType; import de.symeda.sormas.ui.map.*; @@ -72,6 +74,8 @@ import de.symeda.sormas.ui.utils.VaadinUiUtil; import org.vaadin.hene.popupbutton.PopupButton; +import static java.util.Objects.nonNull; + @SuppressWarnings("serial") public class DashboardMapComponent extends BaseDashboardMapComponent { From 1fa0a899649802760024c6d6192d5f55e9309525 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 25 Jun 2024 18:52:57 +0000 Subject: [PATCH 30/71] fixing date bug for outbreak and disease drilldown count --- .../api/dashboard/DashboardCriteria.java | 11 --- .../sormas/api/disease/DiseaseFacade.java | 9 +-- .../backend/disease/DiseaseFacadeEjb.java | 70 ++----------------- .../ui/dashboard/DashboardController.java | 2 +- .../diseasedetails/DiseaseDetailsView.java | 8 ++- 5 files changed, 11 insertions(+), 89 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java index f3f96197801..f5ea6f56106 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java @@ -20,9 +20,6 @@ public class DashboardCriteria extends BaseDashboardCriteria private CaseClassification caseClassification; private NewDateFilterType dateFilterType; - private Date dateFrom; - private Date dateTo; - private CaseOutcome outcome; public DashboardCriteria(NewCaseDateType dateTypeClass) { super(DashboardCriteria.class); @@ -91,14 +88,6 @@ public DashboardCriteria dateFilterType(NewDateFilterType dateFilterType) { return this; } - public void setDateFrom(Date dateFrom) { - this.dateFrom = dateFrom; - } - - public void setDateTo(Date dateTo) { - this.dateTo = dateTo; - } - public void setOutcome(CaseOutcome outcome) { this.outcome = outcome; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java index 7113afe9257..28724f73538 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java @@ -33,14 +33,6 @@ @Remote public interface DiseaseFacade { -// List getDiseaseBurdenForDashboard( -// RegionReferenceDto regionRef, -// DistrictReferenceDto districtRef, -// Date from, -// Date to, -// Date previousFromDate, -// Date previousToDate); - DiseaseBurdenDto getDiseaseForDashboard( RegionReferenceDto regionRef, @@ -53,6 +45,7 @@ DiseaseBurdenDto getDiseaseForDashboard( CriteriaDateType newCaseDateType, CaseClassification caseClassification ); + // DiseaseBurdenDto getDiseaseGridForDashboard( RegionReferenceDto regionRef, diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java index eadcba04d7f..df35ea5b8ea 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java @@ -81,66 +81,7 @@ public class DiseaseFacadeEjb implements DiseaseFacade { @EJB private FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal featureConfigurationFacade; -// @Override -// public List getDiseaseBurdenForDashboard( -// RegionReferenceDto regionRef, -// DistrictReferenceDto districtRef, -// Date from, -// Date to, -// Date previousFrom, -// Date previousTo) { -// -// //diseases -// List diseases = diseaseConfigurationFacade.getAllDiseases(true, true, true); -// -// //new cases -// CaseCriteria caseCriteria = new CaseCriteria().newCaseDateBetween(from, to, null).region(regionRef).district(districtRef); -// -// Map newCases = caseFacade.getCaseCountByDisease(caseCriteria, true, true); -// -// //events -// Map events = -// eventFacade.getEventCountByDisease(new EventCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); -// -// //outbreaks -// Map outbreakDistrictsCount = outbreakFacade -// .getOutbreakDistrictCountByDisease(new OutbreakCriteria().region(regionRef).district(districtRef).reportedBetween(from, to)); -// -// //last report district -// Map lastReportedDistricts = caseFacade.getLastReportedDistrictByDisease(caseCriteria, true, true); -// -// //case fatalities -// Map caseFatalities = personFacade.getDeathCountByDisease(caseCriteria, true, true); -// -// //previous cases -// caseCriteria.newCaseDateBetween(previousFrom, previousTo, null); -// Map previousCases = caseFacade.getCaseCountByDisease(caseCriteria, true, true); -// -// -// //build diseasesBurden -// List diseasesBurden = diseases.stream().map(disease -> { -// Long caseCount = newCases.getOrDefault(disease, 0L); -// Long previousCaseCount = previousCases.getOrDefault(disease, 0L); -// Long eventCount = events.getOrDefault(disease, 0L); -// Long outbreakDistrictCount = outbreakDistrictsCount.getOrDefault(disease, 0L); -// Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); -// District lastReportedDistrict = lastReportedDistricts.getOrDefault(disease, null); -// -// String lastReportedDistrictName = lastReportedDistrict == null ? "" : lastReportedDistrict.getName(); -// -// return new DiseaseBurdenDto( -// disease, -// caseCount, -// previousCaseCount, -// eventCount, -// outbreakDistrictCount, -// caseFatalityCount, -// lastReportedDistrictName); -// -// }).collect(Collectors.toList()); -// -// return diseasesBurden; -// } + @Override public DiseaseBurdenDto getDiseaseForDashboard( @@ -156,9 +97,8 @@ public DiseaseBurdenDto getDiseaseForDashboard( DashboardCriteria dashboardCriteria = - new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType); - dashboardCriteria.setDateTo(toDate); - dashboardCriteria.setDateFrom(fromDate); + new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); + Map newCases = dashboardService.getCaseCountByDisease(dashboardCriteria); @@ -238,9 +178,7 @@ public DiseaseBurdenDto getDiseaseGridForDashboard( //new cases DashboardCriteria dashboardCriteria = - new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType); - dashboardCriteria.setDateTo(toDate); - dashboardCriteria.setDateFrom(fromDate); + new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate);; //Load count all dead/ fatalities Map allCasesFetched = dashboardService.getCaseCountByDisease(dashboardCriteria); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java index 6d76c5ee73c..9fbb994374c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java @@ -78,7 +78,7 @@ public void navigateToDisease(Disease disease,DashboardDataProvider dashboardDat CaseClassification caseClassification= dashboardDataProvider.getCaseClassification(); // TimeZone tz = TimeZone.getTimeZone("UTC"); - DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); // Quoted "Z" to indicate UTC, no timezone offset + DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); // Quoted "Z" to indicate UTC, no timezone offset df.setTimeZone(tz); String dateFromAsISO = df.format(dateFrom); String dateToAsISO = df.format(dateTo); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java index 99a44ab895e..0736a87a87b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java @@ -83,15 +83,17 @@ public DiseaseDetailsView() { } private void setDateFilters(String dateFrom, String dateTo) { - DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); try { if (dateFrom != null) { Date startDate = dateFormat.parse(dateFrom); - dashboardDataProvider.setFromDate(DateHelper.getStartOfDay(startDate)); + //dashboardDataProvider.setFromDate(DateHelper.getStartOfDay(startDate)); + dashboardDataProvider.setFromDate(startDate); } if (dateTo != null) { Date endDate = dateFormat.parse(dateTo); - dashboardDataProvider.setToDate(DateHelper.getEndOfDay(endDate)); + //dashboardDataProvider.setToDate(DateHelper.getEndOfDay(endDate)); + dashboardDataProvider.setToDate(endDate); } } catch (ParseException e) { LOGGER.log(Level.SEVERE, "Date parsing error", e); From 6b758c875830c6695f11bdce3dfcbeb0baae51ac Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 25 Jun 2024 18:56:13 +0000 Subject: [PATCH 31/71] clean up unnessary comment --- .../sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java index 0736a87a87b..1f7966cdea7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java @@ -87,12 +87,10 @@ private void setDateFilters(String dateFrom, String dateTo) { try { if (dateFrom != null) { Date startDate = dateFormat.parse(dateFrom); - //dashboardDataProvider.setFromDate(DateHelper.getStartOfDay(startDate)); dashboardDataProvider.setFromDate(startDate); } if (dateTo != null) { Date endDate = dateFormat.parse(dateTo); - //dashboardDataProvider.setToDate(DateHelper.getEndOfDay(endDate)); dashboardDataProvider.setToDate(endDate); } } catch (ParseException e) { From b571d00bb4bff23580e97a9dd44ee599332b6d75 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:37:32 +0000 Subject: [PATCH 32/71] 104 of 284 issues on sonarcloud fixed --- .../symeda/sormas/api/caze/CaseCriteria.java | 5 - .../de/symeda/sormas/api/caze/CaseFacade.java | 4 - .../sormas/api/contact/ContactFacade.java | 1 - .../api/dashboard/BaseDashboardCriteria.java | 5 + .../api/dashboard/DashboardCaseDto.java | 25 +- .../api/dashboard/DashboardCriteria.java | 5 +- .../sormas/api/disease/DiseaseBurdenDto.java | 9 - .../sormas/api/disease/DiseaseFacade.java | 2 - .../sormas/api/person/PersonFacade.java | 3 - .../sormas/api/sample/SampleFacade.java | 3 - .../de/symeda/sormas/api/user/UserRight.java | 2 +- .../sormas/backend/caze/CaseFacadeEjb.java | 67 --- .../sormas/backend/caze/CaseService.java | 432 ------------------ .../backend/contact/ContactFacadeEjb.java | 3 - .../backend/contact/ContactService.java | 19 +- .../backend/dashboard/DashboardService.java | 32 +- .../backend/disease/DiseaseFacadeEjb.java | 14 +- .../region/RegionFacadeEjb.java | 15 - .../backend/outbreak/OutbreakFacadeEjb.java | 8 +- .../backend/outbreak/OutbreakService.java | 7 +- .../backend/person/PersonFacadeEjb.java | 38 -- .../sormas/backend/sample/SampleService.java | 14 +- .../ui/dashboard/AbstractDashboardView.java | 11 +- .../ui/dashboard/DashboardController.java | 5 +- .../ui/dashboard/DashboardDataProvider.java | 55 +-- .../diseasedetails/DiseaseDetailsView.java | 6 +- 26 files changed, 26 insertions(+), 764 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 a86a91280b4..5598464235d 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 @@ -156,13 +156,8 @@ public class CaseCriteria extends CriteriaWithDateType implements ExternalShareC * Used for filtering merge-able cases to filter both lead and similar cases. */ private Set caseUuidsForMerge; - private String nameUuidEpidNumberLike; - - private Boolean deleted = Boolean.FALSE; public Boolean excludeSharedCases; - private Boolean includeNotACaseClassification; - private String caseReferenceNumber; 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 75afcac0718..4c64a276b70 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 @@ -200,8 +200,6 @@ List saveBulkEditWithFacilities( List getDuplicates(@Valid CasePersonDto casePerson); - List getCasesForDashboard(CaseCriteria caseCriteria); - List getDuplicatesWithPathogenTest(@Valid PersonReferenceDto personReferenceDto, PathogenTestDto pathogenTestDto); List getByPersonUuids(List personUuids); @@ -210,8 +208,6 @@ List saveBulkEditWithFacilities( List getRelevantCasesForVaccination(VaccinationDto vaccination); - String getLastReportedDistrictName(CaseCriteria caseCriteria, boolean excludeSharedCases, boolean excludeCasesFromContacts); - void updateExternalData(@Valid List externalData) throws ExternalDataUpdateException; int updateCompleteness(); 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 1761283f69a..bc59d000b27 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 @@ -31,7 +31,6 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.Language; import de.symeda.sormas.api.MergeFacade; -import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.caze.CoreAndPersonDto; import de.symeda.sormas.api.common.Page; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/BaseDashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/BaseDashboardCriteria.java index 3fe408d7928..034b81d0542 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/BaseDashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/BaseDashboardCriteria.java @@ -19,9 +19,11 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.audit.AuditExcludeProperty; +import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.utils.criteria.BaseCriteria; +import de.symeda.sormas.api.utils.criteria.CriteriaDateType; public class BaseDashboardCriteria> extends BaseCriteria { @@ -35,6 +37,9 @@ public class BaseDashboardCriteria> extend private Date previousDateFrom; private Date previousDateTo; + protected Class criteriaDateType; + protected NewCaseDateType dateTypeClass; + protected BaseDashboardCriteria(final Class selfClass) { self = selfClass.cast(this); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java index 76d96766972..178c259a028 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java @@ -20,7 +20,6 @@ import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseReferenceDefinition; -import de.symeda.sormas.api.caze.InvestigationStatus; import de.symeda.sormas.api.person.PresentCondition; import de.symeda.sormas.api.uuid.AbstractUuidDto; @@ -30,8 +29,6 @@ public class DashboardCaseDto extends AbstractUuidDto { private static final long serialVersionUID = -5705128377788207648L; public static final String I18N_PREFIX = "CaseData"; - private Date onsetDate; - private InvestigationStatus investigationStatus; private long id; private Date reportDate; @@ -41,7 +38,7 @@ public class DashboardCaseDto extends AbstractUuidDto { private Disease causeOfDeathDisease; private CaseReferenceDefinition caseReferenceDefinition; - private DashboardQuarantineDataDto dashboardQuarantineDataDto; + private final DashboardQuarantineDataDto dashboardQuarantineDataDto; public DashboardCaseDto( long id, @@ -65,27 +62,7 @@ public DashboardCaseDto( this.caseReferenceDefinition = caseReferenceDefinition; } - public DashboardCaseDto( - long id, - String uuid, - Date reportDate, - Date onsetDate, - CaseClassification caseClassification, - Disease disease, - InvestigationStatus investigationStatus, - PresentCondition casePersonCondition, - Disease causeOfDeathDisease) { - super(uuid); - this.id = id; - this.reportDate = reportDate; - this.onsetDate = onsetDate; - this.caseClassification = caseClassification; - this.disease = disease; - this.investigationStatus = investigationStatus; - this.casePersonCondition = casePersonCondition; - this.causeOfDeathDisease = causeOfDeathDisease; - } public long getId() { return id; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java index f5ea6f56106..094c8c77a72 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java @@ -7,10 +7,10 @@ import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.utils.criteria.CriteriaDateType; -import java.util.Date; @AuditedClass public class DashboardCriteria extends BaseDashboardCriteria { + private CriteriaDateType newCaseDateType; private EpiCurveGrouping epiCurveGrouping; private boolean showMinimumEntries; @@ -23,6 +23,7 @@ public class DashboardCriteria extends BaseDashboardCriteria private CaseOutcome outcome; public DashboardCriteria(NewCaseDateType dateTypeClass) { super(DashboardCriteria.class); + this.dateTypeClass=dateTypeClass; } public DashboardCriteria() { @@ -31,6 +32,8 @@ public DashboardCriteria() { public DashboardCriteria(Class dateTypeClass) { super(DashboardCriteria.class); + this.criteriaDateType=dateTypeClass; + } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java index 63acd519dd6..44dfd25b1ec 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java @@ -24,7 +24,6 @@ import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.infrastructure.region.RegionDto; -import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; @AuditedClass public class DiseaseBurdenDto implements Serializable { @@ -470,12 +469,4 @@ public String toString() { + activeCases + ", to=" + to + ", from=" + from + "]"; } - - - -// public DiseaseBurdenDto getDiseaseGridForDashboard(RegionReferenceDto reference, Object object, Disease disease2, -// Date fromDate, Date toDate, Date previousFromDate, Date previousToDate) { -// // TODO Auto-generated method stub -// return null; -// } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java index 28724f73538..8c02c17c6fc 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java @@ -19,8 +19,6 @@ *******************************************************************************/ import java.util.Date; -import java.util.List; - import javax.ejb.Remote; import de.symeda.sormas.api.Disease; 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 f8f236bd853..e14b6619820 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 @@ -41,8 +41,6 @@ public interface PersonFacade extends BaseFacade getPermittedAssociations(); - List getDeathsBetween(Date fromDate, Date toDate, DistrictReferenceDto districtRef, Disease disease); - JournalPersonDto getPersonForJournal(String uuid); PersonDto save(@Valid @NotNull PersonDto source, boolean skipValidation); @@ -100,5 +98,4 @@ void mergePerson( void copyHomeAddress(PersonReferenceDto source, PersonReferenceDto target); - Map getDeathCountByDisease(CaseCriteria caseCriteria, boolean excludeSharedCases, boolean excludeCasesFromContacts); } 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 4ffba83d066..38245a9c605 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 @@ -26,13 +26,10 @@ import javax.validation.Valid; import de.symeda.sormas.api.DeletableFacade; -import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseCriteria; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.disease.DiseaseVariant; -import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; -import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; 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 80adc774ac7..48e9210012d 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 @@ -298,7 +298,7 @@ public enum UserRight { //@formatter:on - private static final String _DISEASE_DETAILS_ACCESS ="DISEASE_DETAILS_ACCESS" ; + //private static final String _DISEASE_DETAILS_ACCESS ="DISEASE_DETAILS_ACCESS" ; /* * Hint for SonarQube issues: * 1. java:S115: Violation of name convention for String constants of this class is accepted: Close as false positive. 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 79792a948ce..e2662979d8b 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 @@ -4426,45 +4426,7 @@ public List getDuplicates(@Valid CasePersonDto casePerson, int re personFacade.getByUuid((String) casePersonUuids[1]))) .collect(Collectors.toList()); } - @Override - public List getCasesForDashboard(CaseCriteria caseCriteria) { - - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(DashboardCaseDto.class); - Root caze = cq.from(Case.class); - Join symptoms = caze.join(Case.SYMPTOMS, JoinType.LEFT); - Join person = caze.join(Case.PERSON, JoinType.LEFT); - - Predicate filter = - caseService.createUserFilter(cb, cq, caze, new CaseUserFilterCriteria().excludeSharedCases(true).excludeCasesFromContacts(true)); - Predicate criteriaFilter = caseService.createCriteriaFilter(caseCriteria, cb, cq, caze); - filter = and(cb, filter, criteriaFilter); - - if (filter != null) { - cq.where(filter); - } - - List result; - if (filter != null) { - cq.where(filter); - cq.multiselect( - caze.get(Case.ID), - caze.get(Case.UUID), - caze.get(Case.REPORT_DATE), - symptoms.get(Symptoms.ONSET_DATE), - caze.get(Case.CASE_CLASSIFICATION), - caze.get(Case.DISEASE), - caze.get(Case.INVESTIGATION_STATUS), - person.get(Person.PRESENT_CONDITION), - person.get(Person.CAUSE_OF_DEATH_DISEASE)); - - result = em.createQuery(cq).getResultList(); - } else { - result = Collections.emptyList(); - } - return result; - } @Override public List getDuplicatesWithPathogenTest(@Valid PersonReferenceDto personReferenceDto, PathogenTestDto pathogenTestDto) { CriteriaBuilder cb = em.getCriteriaBuilder(); @@ -4504,36 +4466,7 @@ public List getByExternalId(String externalId) { return toPseudonymizedDtos(service.getByExternalId(externalId)); } - @Override - public String getLastReportedDistrictName(CaseCriteria caseCriteria, boolean excludeSharedCases, boolean excludeCasesFromContacts) { - - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(String.class); - Root caze = cq.from(Case.class); - Join district = caze.join(Case.DISTRICT, JoinType.LEFT); - - Predicate filter = caseService.createUserFilter( - cb, - cq, - caze, - new CaseUserFilterCriteria().excludeSharedCases(excludeSharedCases).excludeCasesFromContacts(excludeCasesFromContacts)); - - filter = and(cb, filter, caseService.createCriteriaFilter(caseCriteria, cb, cq, caze)); - if (filter != null) { - cq.where(filter); - } - - cq.select(district.get(District.NAME)); - cq.orderBy(cb.desc(caze.get(Case.REPORT_DATE))); - - TypedQuery query = em.createQuery(cq).setMaxResults(1); - try { - return query.getSingleResult(); - } catch (NoResultException e) { - return ""; - } - } @Override @RightsAllowed(UserRight._CASE_EDIT) 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 be3ae904675..74cf68ff8e5 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 @@ -1589,8 +1589,6 @@ private Predicate createNewCaseFilter(CriteriaBuilder cb, From caze, Da newCaseFilter = cb.between(caze.get(Case.CREATION_DATE), fromDate, toDate); } else if (newCaseDateType == NewCaseDateType.INVESTIGATION) { newCaseFilter = cb.between(caze.get(Case.INVESTIGATED_DATE), fromDate, toDate); - //} else if (newCaseDateType == NewCaseDateType.LAST_TEST_RESULT) { - // newCaseFilter = cb.between(caze.get(Case.REPORT_DATE), fromDate, toDate); } else { newCaseFilter = reportDateFilter; } @@ -2452,10 +2450,6 @@ public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From tasksJoin = from.join(Case.TASKS, JoinType.LEFT); - //filter = cb.or(filter, cb.equal(tasksJoin.get(Task.ASSIGNEE_USER), user)); - // all users (without specific restrictions) get access to cases that have been made available to the whole country if ((userFilterCriteria == null || !userFilterCriteria.isExcludeSharedCases()) && !featureConfigurationFacade.isFeatureDisabled(FeatureType.NATIONAL_CASE_SHARING)) { @@ -2478,431 +2472,5 @@ public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From cq, From from) { - - Join person = from.join(Case.PERSON, JoinType.LEFT); - Join reportingUser = from.join(Case.REPORTING_USER, JoinType.LEFT); - //Join region = from.join(Case.REGION, JoinType.LEFT); - Join responsibleRegion = from.join(Case.RESPONSIBLE_REGION, JoinType.LEFT); - - //Join district = from.join(Case.DISTRICT, JoinType.LEFT); - Join responsibleDistrict = from.join(Case.RESPONSIBLE_DISTRICT, JoinType.LEFT); - - Join community = from.join(Case.COMMUNITY, JoinType.LEFT); - Join facility = from.join(Case.HEALTH_FACILITY, JoinType.LEFT); - Predicate filter = null; - if (caseCriteria.getReportingUserRole() != null) { - filter = - and(cb, filter, cb.isMember(caseCriteria.getReportingUserRole(), from.join(Case.REPORTING_USER, JoinType.LEFT).get(User.USER_ROLES))); - } - if (caseCriteria.getDisease() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.DISEASE), caseCriteria.getDisease())); - } - 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(responsibleRegion.get(Region.UUID), caseCriteria.getRegion().getUuid())); - -// filter = and(cb, filter, -// cb.or( -// cb.and(cb.equal(region.get(Region.UUID), caseCriteria.getRegion().getUuid()),cb.isNotNull(region.get(Region.UUID))), -// cb.and(cb.equal(responsibleRegion.get(Region.UUID), caseCriteria.getRegion().getUuid()),cb.isNull(region.get(Region.UUID))))); - - } - - - if (caseCriteria.getDistrict() != null) { - filter = and(cb, filter, cb.equal(responsibleDistrict.get(District.UUID), caseCriteria.getDistrict().getUuid())); - } - if (caseCriteria.getCommunity() != null) { - filter = and(cb, filter, cb.equal(community.get(Community.UUID), caseCriteria.getCommunity().getUuid())); - } - if (Boolean.TRUE.equals(caseCriteria.excludeSharedCases)) { - User currentUser = getCurrentUser(); - if (currentUser != null) { - if (currentUser.getDistrict() != null) { - filter = and( - cb, - filter, - cb.not( - cb.and( - cb.equal(from.get(Case.SHARED_TO_COUNTRY), true), - cb.notEqual(responsibleRegion.get(District.UUID), currentUser.getDistrict().getUuid())))); - } else if (currentUser.getRegion() != null) { - filter = and( - cb, - filter, - cb.not( - cb.and( - cb.equal(from.get(Case.SHARED_TO_COUNTRY), true), - cb.notEqual(responsibleRegion.get(Region.UUID), currentUser.getRegion().getUuid())))); - } - } - } - if (caseCriteria.getCaseOrigin() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.CASE_ORIGIN), caseCriteria.getCaseOrigin())); - } - if (caseCriteria.getHealthFacility() != null) { - filter = and( - cb, - filter, - cb.equal(from.join(Case.HEALTH_FACILITY, JoinType.LEFT).get(Facility.UUID), caseCriteria.getHealthFacility().getUuid())); - } - if (caseCriteria.getPointOfEntry() != null) { - filter = and( - cb, - filter, - cb.equal(from.join(Case.POINT_OF_ENTRY, JoinType.LEFT).get(PointOfEntry.UUID), caseCriteria.getPointOfEntry().getUuid())); - } - if (caseCriteria.getSurveillanceOfficer() != null) { - filter = and( - cb, - filter, - cb.equal(from.join(Case.SURVEILLANCE_OFFICER, JoinType.LEFT).get(User.UUID), caseCriteria.getSurveillanceOfficer().getUuid())); - } - - -// else { -// filter = and(cb, filter, cb.notEqual(from.get(Case.CASE_CLASSIFICATION), CaseClassification.NO_CASE)); -// -// } - if (caseCriteria.getCaseClassification() != null) { - - filter = and(cb, filter, cb.equal(from.get(Case.CASE_CLASSIFICATION), caseCriteria.getCaseClassification())); - - } - -// if (caseCriteria.isIncludeNotACaseClassification()==null||caseCriteria.isIncludeNotACaseClassification()==false) { -// filter = and(cb, filter, cb.notEqual(from.get(Case.CASE_CLASSIFICATION), CaseClassification.NO_CASE)); -// } - - - if (caseCriteria.getInvestigationStatus() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.INVESTIGATION_STATUS), caseCriteria.getInvestigationStatus())); - } - - if (caseCriteria.getPresentCondition() != null) { - filter = and(cb, filter, cb.equal(person.get(Person.PRESENT_CONDITION), caseCriteria.getPresentCondition())); - } - - if (caseCriteria.getNewCaseDateFrom() != null && caseCriteria.getNewCaseDateTo() != null) { - filter = and( - cb, - filter, - createNewCaseFilter( - cb, - from, - DateHelper.getStartOfDay(caseCriteria.getNewCaseDateFrom()), - DateHelper.getEndOfDay(caseCriteria.getNewCaseDateTo()), - caseCriteria.getNewCaseDateType())); - } - if (caseCriteria.getCreationDateFrom() != null) { - filter = and(cb, filter, cb.greaterThan(from.get(Case.CREATION_DATE), DateHelper.getStartOfDay(caseCriteria.getCreationDateFrom()))); - } - if (caseCriteria.getCreationDateTo() != null) { - filter = and(cb, filter, cb.lessThan(from.get(Case.CREATION_DATE), DateHelper.getEndOfDay(caseCriteria.getCreationDateTo()))); - } - if (caseCriteria.getQuarantineTo() != null) { - filter = and( - cb, - filter, - cb.between( - from.get(Case.QUARANTINE_TO), - DateHelper.getStartOfDay(caseCriteria.getQuarantineTo()), - DateHelper.getEndOfDay(caseCriteria.getQuarantineTo()))); - } - if (caseCriteria.getPerson() != null) { - filter = and(cb, filter, cb.equal(from.join(Case.PERSON, JoinType.LEFT).get(Person.UUID), caseCriteria.getPerson().getUuid())); - } - if (caseCriteria.getMustHaveNoGeoCoordinates() != null && caseCriteria.getMustHaveNoGeoCoordinates() == true) { - Join personAddress = person.join(Person.ADDRESS, JoinType.LEFT); - filter = and( - cb, - filter, - cb.and( - cb.or(cb.isNull(from.get(Case.REPORT_LAT)), cb.isNull(from.get(Case.REPORT_LON))), - cb.or(cb.isNull(personAddress.get(Location.LATITUDE)), cb.isNull(personAddress.get(Location.LONGITUDE))))); - } - if (caseCriteria.getMustBePortHealthCaseWithoutFacility() != null && caseCriteria.getMustBePortHealthCaseWithoutFacility() == true) { - filter = and( - cb, - filter, - cb.and(cb.equal(from.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY), cb.isNull(from.join(Case.HEALTH_FACILITY, JoinType.LEFT)))); - } - if (caseCriteria.getMustHaveCaseManagementData() != null && caseCriteria.getMustHaveCaseManagementData() == true) { - Subquery prescriptionSubquery = cq.subquery(Prescription.class); - Root prescriptionRoot = prescriptionSubquery.from(Prescription.class); - prescriptionSubquery.select(prescriptionRoot).where(cb.equal(prescriptionRoot.get(Prescription.THERAPY), from.get(Case.THERAPY))); - Subquery treatmentSubquery = cq.subquery(Treatment.class); - Root treatmentRoot = treatmentSubquery.from(Treatment.class); - treatmentSubquery.select(treatmentRoot).where(cb.equal(treatmentRoot.get(Treatment.THERAPY), from.get(Case.THERAPY))); - Subquery clinicalVisitSubquery = cq.subquery(ClinicalVisit.class); - Root clinicalVisitRoot = clinicalVisitSubquery.from(ClinicalVisit.class); - clinicalVisitSubquery.select(clinicalVisitRoot) - .where(cb.equal(clinicalVisitRoot.get(ClinicalVisit.CLINICAL_COURSE), from.get(Case.CLINICAL_COURSE))); - filter = and(cb, filter, cb.or(cb.exists(prescriptionSubquery), cb.exists(treatmentSubquery), cb.exists(clinicalVisitSubquery))); - } - if (Boolean.TRUE.equals(caseCriteria.getWithoutResponsibleOfficer())) { - filter = and(cb, filter, cb.isNull(from.get(Case.SURVEILLANCE_OFFICER))); - } - if (caseCriteria.getRelevanceStatus() != null) { - if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.ACTIVE) { - filter = and(cb, filter, cb.or(cb.equal(from.get(Case.ARCHIVED), false), cb.isNull(from.get(Case.ARCHIVED)))); - } else if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.ARCHIVED) { - filter = and(cb, filter, cb.equal(from.get(Case.ARCHIVED), true)); - } - } -// if (caseCriteria.getDeleted() != null) { -// filter = and(cb, filter, cb.equal(from.get(Case.DELETED), caseCriteria.getDeleted())); -// } -// if (caseCriteria.getNameUuidEpidNumberLike() != null) { -// String[] textFilters = caseCriteria.getNameUuidEpidNumberLike().split("\\s+"); -// for (int i = 0; i < textFilters.length; i++) { -// String textFilter = "%" + textFilters[i].toLowerCase() + "%"; -// if (!DataHelper.isNullOrEmpty(textFilter)) { -// Predicate likeFilters = cb.or( -// cb.like(cb.lower(person.get(Person.FIRST_NAME)), textFilter), -// cb.like(cb.lower(person.get(Person.LAST_NAME)), textFilter), -// cb.like(cb.lower(from.get(Case.UUID)), textFilter), -// cb.like(cb.lower(from.get(Case.EPID_NUMBER)), textFilter), -// cb.like(cb.lower(facility.get(Facility.NAME)), textFilter), -// cb.like(cb.lower(from.get(Case.HEALTH_FACILITY_DETAILS)), textFilter)); -// filter = and(cb, filter, likeFilters); -// } -// } -// } - if (caseCriteria.getReportingUserLike() != null) { - String[] textFilters = caseCriteria.getReportingUserLike().split("\\s+"); - for (int i = 0; i < textFilters.length; i++) { - String textFilter = "%" + textFilters[i].toLowerCase() + "%"; - if (!DataHelper.isNullOrEmpty(textFilter)) { - Predicate likeFilters = cb.or( - cb.like(cb.lower(reportingUser.get(User.FIRST_NAME)), textFilter), - cb.like(cb.lower(reportingUser.get(User.LAST_NAME)), textFilter), - cb.like(cb.lower(reportingUser.get(User.USER_NAME)), textFilter)); - filter = and(cb, filter, likeFilters); - } - } - } - if (caseCriteria.getSourceCaseInfoLike() != null) { - String[] textFilters = caseCriteria.getSourceCaseInfoLike().split("\\s+"); - for (int i = 0; i < textFilters.length; i++) { - String textFilter = "%" + textFilters[i].toLowerCase() + "%"; - if (!DataHelper.isNullOrEmpty(textFilter)) { - Predicate likeFilters = cb.or( - cb.like(cb.lower(person.get(Person.FIRST_NAME)), textFilter), - cb.like(cb.lower(person.get(Person.LAST_NAME)), textFilter), - cb.like(cb.lower(from.get(Case.UUID)), textFilter), - cb.like(cb.lower(from.get(Case.EPID_NUMBER)), textFilter), - cb.like(cb.lower(from.get(Case.EXTERNAL_ID)), textFilter)); - filter = and(cb, filter, likeFilters); - } - } - } - - - - return filter; - } - -// public Predicate createCriteriaFilter(CaseCriteria caseCriteria, CriteriaBuilder cb, CriteriaQuery cq, From from) { -// -// Join person = from.join(Case.PERSON, JoinType.LEFT); -// Join reportingUser = from.join(Case.REPORTING_USER, JoinType.LEFT); -// Join region = from.join(Case.REGION, JoinType.LEFT); -// Join district = from.join(Case.DISTRICT, JoinType.LEFT); -// Join community = from.join(Case.COMMUNITY, JoinType.LEFT); -// Join facility = from.join(Case.HEALTH_FACILITY, JoinType.LEFT); -// Predicate filter = null; -// if (caseCriteria.getReportingUserRole() != null) { -// filter = -// and(cb, filter, cb.isMember(caseCriteria.getReportingUserRole(), from.join(Case.REPORTING_USER, JoinType.LEFT).get(User.USER_ROLES))); -// } -// if (caseCriteria.getDisease() != null) { -// filter = and(cb, filter, cb.equal(from.get(Case.DISEASE), caseCriteria.getDisease())); -// } -// 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(district.get(District.UUID), caseCriteria.getDistrict().getUuid())); -// } -// if (caseCriteria.getCommunity() != null) { -// filter = and(cb, filter, cb.equal(community.get(Community.UUID), caseCriteria.getCommunity().getUuid())); -// } -// if (Boolean.TRUE.equals(caseCriteria. -// getExcludeSharedCases())) { -// User currentUser = getCurrentUser(); -// if (currentUser != null) { -// if (currentUser.getDistrict() != null) { -// filter = and( -// cb, -// filter, -// cb.not( -// cb.and( -// cb.equal(from.get(Case.SHARED_TO_COUNTRY), true), -// cb.notEqual(region.get(District.UUID), currentUser.getDistrict().getUuid())))); -// } else if (currentUser.getRegion() != null) { -// filter = and( -// cb, -// filter, -// cb.not( -// cb.and( -// cb.equal(from.get(Case.SHARED_TO_COUNTRY), true), -// cb.notEqual(region.get(Region.UUID), currentUser.getRegion().getUuid())))); -// } -// } -// } -// if (caseCriteria.getCaseOrigin() != null) { -// filter = and(cb, filter, cb.equal(from.get(Case.CASE_ORIGIN), caseCriteria.getCaseOrigin())); -// } -// if (caseCriteria.getHealthFacility() != null) { -// filter = and( -// cb, -// filter, -// cb.equal(from.join(Case.HEALTH_FACILITY, JoinType.LEFT).get(Facility.UUID), caseCriteria.getHealthFacility().getUuid())); -// } -// if (caseCriteria.getPointOfEntry() != null) { -// filter = and( -// cb, -// filter, -// cb.equal(from.join(Case.POINT_OF_ENTRY, JoinType.LEFT).get(PointOfEntry.UUID), caseCriteria.getPointOfEntry().getUuid())); -// } -// if (caseCriteria.getSurveillanceOfficer() != null) { -// filter = and( -// cb, -// filter, -// cb.equal(from.join(Case.SURVEILLANCE_OFFICER, JoinType.LEFT).get(User.UUID), caseCriteria.getSurveillanceOfficer().getUuid())); -// } -// if (caseCriteria.getCaseClassification() != null) { -// filter = and(cb, filter, cb.equal(from.get(Case.CASE_CLASSIFICATION), caseCriteria.getCaseClassification())); -// } -// if (caseCriteria.getInvestigationStatus() != null) { -// filter = and(cb, filter, cb.equal(from.get(Case.INVESTIGATION_STATUS), caseCriteria.getInvestigationStatus())); -// } -// if (caseCriteria.getPresentCondition() != null) { -// filter = and(cb, filter, cb.equal(person.get(Person.PRESENT_CONDITION), caseCriteria.getPresentCondition())); -// } -// if (caseCriteria.getNewCaseDateFrom() != null && caseCriteria.getNewCaseDateTo() != null) { -// filter = and( -// cb, -// filter, -// createNewCaseFilter( -// cb, -// from, -// DateHelper.getStartOfDay(caseCriteria.getNewCaseDateFrom()), -// DateHelper.getEndOfDay(caseCriteria.getNewCaseDateTo()), -// caseCriteria.getNewCaseDateType())); -// } -// if (caseCriteria.getCreationDateFrom() != null) { -// filter = and(cb, filter, cb.greaterThan(from.get(Case.CREATION_DATE), DateHelper.getStartOfDay(caseCriteria.getCreationDateFrom()))); -// } -// if (caseCriteria.getCreationDateTo() != null) { -// filter = and(cb, filter, cb.lessThan(from.get(Case.CREATION_DATE), DateHelper.getEndOfDay(caseCriteria.getCreationDateTo()))); -// } -// if (caseCriteria.getQuarantineTo() != null) { -// filter = and( -// cb, -// filter, -// cb.between( -// from.get(Case.QUARANTINE_TO), -// DateHelper.getStartOfDay(caseCriteria.getQuarantineTo()), -// DateHelper.getEndOfDay(caseCriteria.getQuarantineTo()))); -// } -// if (caseCriteria.getPerson() != null) { -// filter = and(cb, filter, cb.equal(from.join(Case.PERSON, JoinType.LEFT).get(Person.UUID), caseCriteria.getPerson().getUuid())); -// } -// if (caseCriteria.getMustHaveNoGeoCoordinates() != null && caseCriteria.getMustHaveNoGeoCoordinates() == true) { -// Join personAddress = person.join(Person.ADDRESS, JoinType.LEFT); -// filter = and( -// cb, -// filter, -// cb.and( -// cb.or(cb.isNull(from.get(Case.REPORT_LAT)), cb.isNull(from.get(Case.REPORT_LON))), -// cb.or(cb.isNull(personAddress.get(Location.LATITUDE)), cb.isNull(personAddress.get(Location.LONGITUDE))))); -// } -// if (caseCriteria.getMustBePortHealthCaseWithoutFacility() != null && caseCriteria.getMustBePortHealthCaseWithoutFacility() == true) { -// filter = and( -// cb, -// filter, -// cb.and(cb.equal(from.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY), cb.isNull(from.join(Case.HEALTH_FACILITY, JoinType.LEFT)))); -// } -// if (caseCriteria.getMustHaveCaseManagementData() != null && caseCriteria.getMustHaveCaseManagementData() == true) { -// Subquery prescriptionSubquery = cq.subquery(Prescription.class); -// Root prescriptionRoot = prescriptionSubquery.from(Prescription.class); -// prescriptionSubquery.select(prescriptionRoot).where(cb.equal(prescriptionRoot.get(Prescription.THERAPY), from.get(Case.THERAPY))); -// Subquery treatmentSubquery = cq.subquery(Treatment.class); -// Root treatmentRoot = treatmentSubquery.from(Treatment.class); -// treatmentSubquery.select(treatmentRoot).where(cb.equal(treatmentRoot.get(Treatment.THERAPY), from.get(Case.THERAPY))); -// Subquery clinicalVisitSubquery = cq.subquery(ClinicalVisit.class); -// Root clinicalVisitRoot = clinicalVisitSubquery.from(ClinicalVisit.class); -// clinicalVisitSubquery.select(clinicalVisitRoot) -// .where(cb.equal(clinicalVisitRoot.get(ClinicalVisit.CLINICAL_COURSE), from.get(Case.CLINICAL_COURSE))); -// filter = and(cb, filter, cb.or(cb.exists(prescriptionSubquery), cb.exists(treatmentSubquery), cb.exists(clinicalVisitSubquery))); -// } -// if (Boolean.TRUE.equals(caseCriteria.getWithoutResponsibleOfficer())) { -// filter = and(cb, filter, cb.isNull(from.get(Case.SURVEILLANCE_OFFICER))); -// } -// if (caseCriteria.getRelevanceStatus() != null) { -// if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.ACTIVE) { -// filter = and(cb, filter, cb.or(cb.equal(from.get(Case.ARCHIVED), false), cb.isNull(from.get(Case.ARCHIVED)))); -// } else if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.ARCHIVED) { -// filter = and(cb, filter, cb.equal(from.get(Case.ARCHIVED), true)); -// } -// } -// if (caseCriteria.getDeleted() != null) { -// filter = and(cb, filter, cb.equal(from.get(Case.DELETED), caseCriteria.getDeleted())); -// } -// if (caseCriteria.getNameUuidEpidNumberLike() != null) { -// String[] textFilters = caseCriteria.getNameUuidEpidNumberLike().split("\\s+"); -// for (int i = 0; i < textFilters.length; i++) { -// String textFilter = "%" + textFilters[i].toLowerCase() + "%"; -// if (!DataHelper.isNullOrEmpty(textFilter)) { -// Predicate likeFilters = cb.or( -// cb.like(cb.lower(person.get(Person.FIRST_NAME)), textFilter), -// cb.like(cb.lower(person.get(Person.LAST_NAME)), textFilter), -// cb.like(cb.lower(from.get(Case.UUID)), textFilter), -// cb.like(cb.lower(from.get(Case.EPID_NUMBER)), textFilter), -// cb.like(cb.lower(facility.get(Facility.NAME)), textFilter), -// cb.like(cb.lower(from.get(Case.HEALTH_FACILITY_DETAILS)), textFilter)); -// filter = and(cb, filter, likeFilters); -// } -// } -// } -// if (caseCriteria.getReportingUserLike() != null) { -// String[] textFilters = caseCriteria.getReportingUserLike().split("\\s+"); -// for (int i = 0; i < textFilters.length; i++) { -// String textFilter = "%" + textFilters[i].toLowerCase() + "%"; -// if (!DataHelper.isNullOrEmpty(textFilter)) { -// Predicate likeFilters = cb.or( -// cb.like(cb.lower(reportingUser.get(User.FIRST_NAME)), textFilter), -// cb.like(cb.lower(reportingUser.get(User.LAST_NAME)), textFilter), -// cb.like(cb.lower(reportingUser.get(User.USER_NAME)), textFilter)); -// filter = and(cb, filter, likeFilters); -// } -// } -// } -// if (caseCriteria.getSourceCaseInfoLike() != null) { -// String[] textFilters = caseCriteria.getSourceCaseInfoLike().split("\\s+"); -// for (int i = 0; i < textFilters.length; i++) { -// String textFilter = "%" + textFilters[i].toLowerCase() + "%"; -// if (!DataHelper.isNullOrEmpty(textFilter)) { -// Predicate likeFilters = cb.or( -// cb.like(cb.lower(person.get(Person.FIRST_NAME)), textFilter), -// cb.like(cb.lower(person.get(Person.LAST_NAME)), textFilter), -// cb.like(cb.lower(from.get(Case.UUID)), textFilter), -// cb.like(cb.lower(from.get(Case.EPID_NUMBER)), textFilter), -// cb.like(cb.lower(from.get(Case.EXTERNAL_ID)), textFilter)); -// filter = and(cb, filter, likeFilters); -// } -// } -// } -// return filter; -// } } 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 c9f982b7c0d..e6f34adb3ed 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 @@ -66,12 +66,9 @@ import javax.validation.Valid; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; - -import de.symeda.sormas.api.caze.CaseClassification; import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.Language; 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 cf0a79d1e42..956e32e21d3 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 @@ -188,8 +188,7 @@ public class ContactService extends AbstractCoreAdoService samplePath) { -// Predicate filter = createUserFilterWithoutCase(cb, new SampleJoins(samplePath)); -// -// // whoever created the case the sample is associated with or is assigned to it -// // is allowed to access it -// Join casePath = samplePath.join(Sample.ASSOCIATED_CASE, JoinType.LEFT); -// -// Predicate caseFilter = caseService.createUserFilter(cb, cq, casePath); -// filter = or(cb, filter, caseFilter); -// -// return filter; -// } - @SuppressWarnings("rawtypes") diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java index 17a90ec8ab4..d3077155d8f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java @@ -13,7 +13,6 @@ import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; -import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; @@ -45,7 +44,6 @@ import de.symeda.sormas.backend.caze.CaseUserFilterCriteria; import de.symeda.sormas.backend.common.AbstractDomainObject; import de.symeda.sormas.backend.common.ConfigFacadeEjb; -import de.symeda.sormas.backend.common.CriteriaBuilderHelper; import de.symeda.sormas.backend.event.Event; import de.symeda.sormas.backend.event.EventJoins; import de.symeda.sormas.backend.event.EventQueryContext; @@ -61,9 +59,6 @@ import de.symeda.sormas.backend.util.JurisdictionHelper; import de.symeda.sormas.backend.util.ModelConstants; import de.symeda.sormas.backend.util.QueryHelper; -import org.hibernate.engine.spi.SessionImplementor; -import org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory; -import org.hibernate.hql.spi.QueryTranslator; import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; @@ -78,8 +73,7 @@ public class DashboardService { private CaseService caseService; @EJB private EventService eventService; - @EJB - private SampleService sampleService; + @EJB private ConfigFacadeEjb.ConfigFacadeEjbLocal configFacade; @@ -240,30 +234,6 @@ public Map getCaseCountByDisease(DashboardCriteria dashboardCrite return resultMap; } - public Map getCaseCountByDisease2(DashboardCriteria dashboardCriteria) { - - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(Object[].class); - Root caze = cq.from(Case.class); - final CaseQueryContext caseQueryContext = new CaseQueryContext(cb, cq, caze); - - Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); - - filter = and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); - - if (filter != null) { - cq.where(filter); - } - - cq.groupBy(caze.get(Case.DISEASE)); - cq.multiselect(caze.get(Case.DISEASE), cb.count(caze)); - List results = em.createQuery(cq).getResultList(); - - Map resultMap = results.stream().collect(Collectors.toMap(e -> (Disease) e[0], e -> (Long) e[1])); - - return resultMap; - } - public String getLastReportedDistrictName(DashboardCriteria dashboardCriteria) { CriteriaBuilder cb = em.getCriteriaBuilder(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java index df35ea5b8ea..b24cbe7bbae 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java @@ -19,20 +19,14 @@ import java.util.Date; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; - import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.caze.CaseClassification; -import de.symeda.sormas.api.caze.CaseCriteria; -import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseOutcome; import de.symeda.sormas.api.dashboard.DashboardCriteria; import de.symeda.sormas.api.disease.DiseaseBurdenDto; @@ -43,7 +37,6 @@ import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.outbreak.OutbreakCriteria; -import de.symeda.sormas.api.person.PresentCondition; import de.symeda.sormas.api.utils.criteria.CriteriaDateType; import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal; import de.symeda.sormas.backend.dashboard.DashboardService; @@ -63,8 +56,7 @@ public class DiseaseFacadeEjb implements DiseaseFacade { @EJB private CaseFacadeEjbLocal caseFacade; - // @EJB -// private DashboardService dashboardService; + @EJB private EventFacadeEjbLocal eventFacade; @EJB @@ -188,12 +180,8 @@ public DiseaseBurdenDto getDiseaseGridForDashboard( dashboardCriteria.setOutcome(CaseOutcome.NO_OUTCOME); - //caseCriteria.relevanceStatus(EntityRelevanceStatus.ACTIVE); Map archievedCase = dashboardService.getCaseCountByDisease(dashboardCriteria); - //dashboardCriteria.relevanceStatus(null); - - dashboardCriteria.setOutcome(CaseOutcome.RECOVERED); Map recoveredCase = dashboardService.getCaseCountByDisease(dashboardCriteria); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java index b32cec81d92..c6bf9506f8e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java @@ -351,21 +351,6 @@ public List getAllRegion() { return em.createQuery(cq).getResultList(); } - // Need to be in the same order as in the constructor -// private void selectDtoFields(CriteriaQuery cq, Root root) { -// -// cq.multiselect( -// root.get(Region.CREATION_DATE), -// root.get(Region.CHANGE_DATE), -// root.get(Region.UUID), -// root.get(Region.ARCHIVED), -// root.get(Region.NAME), -// root.get(Region.EPID_CODE), -// root.get(Region.GROWTH_RATE), -// root.get(Region.EXTERNAL_ID)); -// } - - protected void selectDtoFields(CriteriaQuery cq, Root root) { Join country = root.join(Region.COUNTRY, JoinType.LEFT); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java index dc82cbbd8be..b692005f6d7 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java @@ -205,9 +205,9 @@ public Map getOutbreakDistrictNameByDisease(OutbreakCriteria } public Map getOutbreakDistrictCountByDisease(OutbreakCriteria criteria) { - User user = userService.getCurrentUser(); + //User user = userService.getCurrentUser(); - return outbreakService.getOutbreakDistrictCountByDisease(criteria, user); + return outbreakService.getOutbreakDistrictCountByDisease(criteria); } @Override @@ -215,9 +215,7 @@ public Map getOutbreakDistrictCountByDisease(OutbreakCriteria cri UserRight._DASHBOARD_SURVEILLANCE_VIEW, UserRight._DASHBOARD_CONTACT_VIEW }) public Long getOutbreakDistrictCount(OutbreakCriteria criteria) { - User user = userService.getCurrentUser(); - - return outbreakService.getOutbreakDistrictCount(criteria, user); + return outbreakService.getOutbreakDistrictCount(criteria); } @LocalBean diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java index 37271c4c45e..90dc4c44a50 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java @@ -43,7 +43,6 @@ import de.symeda.sormas.api.outbreak.OutbreakCriteria; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.backend.common.AdoServiceWithUserFilterAndJurisdiction; -import de.symeda.sormas.backend.common.CriteriaBuilderHelper; import de.symeda.sormas.backend.disease.DiseaseConfigurationService; import de.symeda.sormas.backend.infrastructure.district.District; import de.symeda.sormas.backend.infrastructure.region.Region; @@ -223,7 +222,7 @@ public Map getOutbreakDistrictNameByDisease(OutbreakCriteria List results = em.createQuery(cq).getResultList(); - Map outbreaksDistrict = new HashMap<>(); //results.stream().collect(Collectors.toMap(e -> (Disease) e[0], e -> (String) e[1])); + Map outbreaksDistrict = new HashMap<>(); for (Object[] e : results) { Disease disease = (Disease) e[0]; @@ -235,7 +234,7 @@ public Map getOutbreakDistrictNameByDisease(OutbreakCriteria return outbreaksDistrict; } - public Map getOutbreakDistrictCountByDisease(OutbreakCriteria criteria, User user) { + public Map getOutbreakDistrictCountByDisease(OutbreakCriteria criteria) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Object[].class); @@ -254,7 +253,7 @@ public Map getOutbreakDistrictCountByDisease(OutbreakCriteria cri return results.stream().collect(Collectors.toMap(e -> (Disease) e[0], e -> (Long) e[1])); } - public Long getOutbreakDistrictCount(OutbreakCriteria criteria, User user) { + public Long getOutbreakDistrictCount(OutbreakCriteria criteria) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); 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 b7a5ca5895c..4b9d0a6ab11 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 @@ -304,16 +304,6 @@ public void updateExternalData(@Valid List externalData) throws service.updateExternalData(externalData); } - @Override - public List getDeathsBetween(Date fromDate, Date toDate, DistrictReferenceDto districtRef, Disease disease) { - final User user = userService.getCurrentUser(); - if (user == null) { - return Collections.emptyList(); - } - final District district = districtService.getByReferenceDto(districtRef); - return toPseudonymizedDtos(service.getDeathsBetween(fromDate, toDate, district, disease, user)); - } - public Long getPersonIdByUuid(String uuid) { return Optional.of(uuid).map(u -> service.getIdByUuid(u)).orElse(null); } @@ -2067,35 +2057,7 @@ public List getByNationalHealthId(String nationalHealthId) { .collect(Collectors.toList()); } - @Override - public Map getDeathCountByDisease(CaseCriteria caseCriteria, boolean excludeSharedCases, boolean excludeCasesFromContacts) { - - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(Object[].class); - Root root = cq.from(Case.class); - Join person = root.join(Case.PERSON, JoinType.LEFT); - - Predicate filter = caseService.createUserFilter( - cb, - cq, - root, - new CaseUserFilterCriteria().excludeSharedCases(excludeSharedCases).excludeCasesFromContacts(excludeCasesFromContacts)); - filter = and(cb, filter, caseService.createCriteriaFilter(caseCriteria, cb, cq, root)); - filter = and(cb, filter, cb.equal(person.get(Person.CAUSE_OF_DEATH_DISEASE), root.get(Case.DISEASE))); - - if (filter != null) { - cq.where(filter); - } - - cq.multiselect(person.get(Person.CAUSE_OF_DEATH_DISEASE), cb.count(person)); - cq.groupBy(person.get(Person.CAUSE_OF_DEATH_DISEASE)); - - List results = em.createQuery(cq).getResultList(); - Map outbreaks = results.stream().collect(Collectors.toMap(e -> (Disease) e[0], e -> (Long) e[1])); - - return outbreaks; - } @LocalBean @Stateless 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 8045ff5ac5e..3f72dc0d16b 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 @@ -34,7 +34,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.stream.Collectors; - import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; @@ -55,10 +54,8 @@ import javax.persistence.criteria.Root; import javax.persistence.criteria.Selection; import javax.persistence.criteria.Subquery; - import de.symeda.sormas.api.sample.*; import org.apache.commons.collections4.CollectionUtils; - import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.RequestContextHolder; import de.symeda.sormas.api.caze.IsCase; @@ -70,8 +67,6 @@ import de.symeda.sormas.api.disease.DiseaseVariant; import de.symeda.sormas.api.event.EventParticipantReferenceDto; import de.symeda.sormas.api.feature.FeatureType; -import de.symeda.sormas.api.i18n.Captions; -import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.user.JurisdictionLevel; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; @@ -111,7 +106,6 @@ import de.symeda.sormas.backend.util.ModelConstants; import de.symeda.sormas.backend.util.Pseudonymizer; import de.symeda.sormas.backend.util.QueryHelper; - import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.or; @@ -697,10 +691,8 @@ public Predicate createUserFilterWithoutAssociations(CriteriaBuilder cb, SampleJ User currentUser = getCurrentUser(); final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); // Lab users can see samples assigned to their laboratory - if (jurisdictionLevel == JurisdictionLevel.LABORATORY || jurisdictionLevel == JurisdictionLevel.EXTERNAL_LABORATORY) { - if (currentUser.getLaboratory() != null) { - filter = or(cb, filter, cb.equal(joins.getLab(), currentUser.getLaboratory())); - } + if ((jurisdictionLevel == JurisdictionLevel.LABORATORY || jurisdictionLevel == JurisdictionLevel.EXTERNAL_LABORATORY) && currentUser.getLaboratory() != null) { + filter = or(cb, filter, cb.equal(joins.getLab(), currentUser.getLaboratory())); } // Only show samples of a specific disease if a limited disease is set @@ -1307,8 +1299,6 @@ public Map getNewTestResultCountByResultType(List< public Predicate createUserFilterWithoutCase(CriteriaBuilder cb, SampleJoins joins) { Predicate filter = null; // user that reported it is not able to access it. Otherwise they would also need to access the case - //filter = cb.equal(samplePath.get(Sample.REPORTING_USER), user); - User currentUser = getCurrentUser(); final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); // lab users can see samples assigned to their laboratory diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java index 497227b7033..35f5c16103f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java @@ -18,14 +18,11 @@ package de.symeda.sormas.ui.dashboard; import static de.symeda.sormas.ui.UiUtil.permitted; - import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; -import com.vaadin.navigator.ViewProvider; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; import com.vaadin.v7.data.Property; import com.vaadin.v7.ui.OptionGroup; - import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.feature.FeatureType; @@ -36,7 +33,6 @@ import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; import de.symeda.sormas.ui.dashboard.contacts.ContactsDashboardView; import de.symeda.sormas.ui.dashboard.diseasedetails.DiseaseDetailsView; -import de.symeda.sormas.ui.dashboard.sample.SampleDashboardView; import de.symeda.sormas.ui.dashboard.surveillance.SurveillanceDashboardView; import de.symeda.sormas.ui.utils.AbstractView; import de.symeda.sormas.ui.utils.CssStyles; @@ -141,7 +137,7 @@ protected AbstractDashboardView(String viewName, DashboardType dashboardType) { dashboardSwitcher.setItemCaption(DashboardType.DISEASE, I18nProperties.getEnumCaption(DashboardType.DISEASE)); } //} -; + dashboardSwitcher.setValue(dashboardType); @@ -172,9 +168,6 @@ protected AbstractDashboardView(String viewName, DashboardType dashboardType) { dashboardLayout.setSizeFull(); dashboardLayout.setStyleName("crud-main-layout"); - // Filter bar -// filterLayout = new DashboardFilterLayout(this, dashboardDataProvider); -// dashboardLayout.addComponent(filterLayout); addComponent(dashboardLayout); setExpandRatio(dashboardLayout, 1); @@ -209,8 +202,6 @@ public void enter(ViewChangeEvent event) { refreshDashboard(); } - //public abstract void refreshDashboard(); - public void setDiseases(Disease disease) { this.disease = disease; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java index 9fbb994374c..06d8b83708e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java @@ -44,7 +44,6 @@ public class DashboardController { public DashboardController() { - } public void registerViews(Navigator navigator) { @@ -76,7 +75,7 @@ public void navigateToDisease(Disease disease,DashboardDataProvider dashboardDat NewDateFilterType type = dashboardDataProvider.getDateFilterType(); CaseClassification caseClassification= dashboardDataProvider.getCaseClassification(); -// + TimeZone tz = TimeZone.getTimeZone("UTC"); DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); // Quoted "Z" to indicate UTC, no timezone offset df.setTimeZone(tz); @@ -89,10 +88,8 @@ public void navigateToDisease(Disease disease,DashboardDataProvider dashboardDat if(Objects.nonNull(region)&®ion.getUuid()!=null){ regionId= region.getUuid(); } - System.out.println(regionId); String paramData = dateFromAsISO+"/"+dateToAsISO+"/"+type+"/"+caseClassification+"/"+newCaseDateType+"/"+regionId; DiseaseDetailsView.setDiseaseDetailsData(paramData); - //DiseaseDetailsView.setProvider(dashboardDataProvider); String navigationState = DiseaseDetailsView.VIEW_NAME + "/" + disease.getName(); SormasUI.get().getNavigator().navigateTo(navigationState); 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 d7f2fe47b56..95f92903da0 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 @@ -25,7 +25,6 @@ import java.util.function.Predicate; import java.util.stream.Collectors; -import de.symeda.sormas.api.caze.CaseCriteria; import de.symeda.sormas.api.dashboard.*; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionDto; @@ -68,37 +67,16 @@ public class DashboardDataProvider extends AbstractDashboardDataProvider events = new ArrayList<>(); private Map newCasesFinalLabResultCountByResultType; private Map eventCountByStatus; - private Long contactsInQuarantineCount = 0L; private Long contactsPlacedInQuarantineCount = 0L; private Long casesInQuarantineCount = 0L; private Long casesPlacedInQuarantineCount = 0L; private Long contactsConvertedToCaseCount = 0L; private Long caseWithReferenceDefinitionFulfilledCount = 0L; - private RegionReferenceDto region; - private DistrictReferenceDto district; private DiseaseBurdenDto diseaseBurdenDetail; - private Map testResultCountByResultType; - - private List testResults = new ArrayList<>(); - private List previousTestResults = new ArrayList<>(); - private List regionDtoList; - private CaseClassification caseClassification; - private NewDateFilterType dateFilterType; - private Date fromDate; - private Date toDate; - - private final Class dateTypeClass; - - public DashboardDataProvider(Class dateTypeClass) { - this.dateTypeClass = dateTypeClass; - } - public DashboardDataProvider() { - this.dateTypeClass = CriteriaDateType.class; - } public void refreshData() { // Update the entities lists according to the filters @@ -272,9 +250,7 @@ public void refreshDataForSelectedDisease() { private DashboardCriteria buildDashboardCriteria(Date fromDate, Date toDate) { return buildDashboardCriteria().newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); } - public void setTestResultCountByResultType(Map testResults) { - this.testResultCountByResultType = testResults; - } + public List getCases() { return cases; } @@ -437,13 +413,6 @@ public Long getCaseWithReferenceDefinitionFulfilledCount() { public void setCaseWithReferenceDefinitionFulfilledCount(Long caseWithReferenceDefinitionFulfilledCount) { this.caseWithReferenceDefinitionFulfilledCount = caseWithReferenceDefinitionFulfilledCount; } - public List getRegionDtoList() { - return regionDtoList; - } - - public void setRegionDtoList(List regionDtoList) { - this.regionDtoList = regionDtoList; - } public CaseClassification getCaseClassification() { return caseClassification; @@ -481,27 +450,5 @@ public void setDateFilterType(NewDateFilterType dateFilterType) { this.dateFilterType = dateFilterType; } - public Date getFromDate() { - return fromDate; - } - - public void setFromDate(Date fromDate) { - this.fromDate = fromDate; - } - - public Date getToDate() { - return toDate; - } - public void setToDate(Date toDate) { - this.toDate = toDate; - } - - public Date getPreviousFromDate() { - return previousFromDate; - } - - public void setPreviousFromDate(Date previousFromDate) { - this.previousFromDate = previousFromDate; - } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java index 1f7966cdea7..7fbb2eb7cfe 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java @@ -6,17 +6,13 @@ import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.api.infrastructure.region.RegionDto; -import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.ui.dashboard.AbstractDashboardView; import de.symeda.sormas.ui.dashboard.DashboardType; - import static com.vaadin.navigator.ViewChangeListener.*; - import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; -import java.util.EnumSet; import java.util.logging.Level; import java.util.logging.Logger; @@ -109,7 +105,7 @@ private void setDateFilterType(String newDateFilterType) { private void setCaseClassification(String caseClassification) { try { - if(caseClassification!=null) { + if(caseClassification!=null && !caseClassification.equals("null")) { CaseClassification classification = CaseClassification.valueOf(caseClassification.replace(" ", "_").toUpperCase().trim()); dashboardDataProvider.setCaseClassification(classification); } From 3d7e2e4182c3f014234c9a6f89658f04402e8f0f Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Thu, 27 Jun 2024 05:03:26 +0000 Subject: [PATCH 33/71] 119 of 217 sonar cloud issues fixed --- .../symeda/sormas/api/caze/CaseCriteria.java | 2 - .../de/symeda/sormas/api/caze/CaseFacade.java | 1 - .../sormas/api/person/PersonFacade.java | 4 - .../sormas/backend/caze/CaseFacadeEjb.java | 2 - .../sormas/backend/caze/CaseService.java | 116 ----------- .../backend/contact/ContactService.java | 53 ------ .../backend/disease/DiseaseFacadeEjb.java | 6 +- .../event/EventParticipantService.java | 6 - .../backend/outbreak/OutbreakFacadeEjb.java | 6 +- .../backend/outbreak/OutbreakService.java | 9 +- .../backend/person/PersonFacadeEjb.java | 138 ++++---------- .../ui/dashboard/AbstractDashboardView.java | 7 +- .../ui/dashboard/DashboardDataProvider.java | 19 +- .../components/DashboardFilterLayout.java | 180 ++---------------- .../contacts/ContactsDashboardView.java | 11 +- .../DiseaseDetailsComponent.java | 71 +------ .../diseasedetails/DiseaseDetailsView.java | 3 +- .../DiseaseDetailsViewLayout.java | 27 +-- .../diseasedetails/DiseaseFilterLayout.java | 41 +--- .../dashboard/map/DashboardMapComponent.java | 125 +----------- .../tile/RegionalDiseaseBurdenGrid.java | 3 - 21 files changed, 101 insertions(+), 729 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 5598464235d..63d994c0bac 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 @@ -156,8 +156,6 @@ public class CaseCriteria extends CriteriaWithDateType implements ExternalShareC * Used for filtering merge-able cases to filter both lead and similar cases. */ private Set caseUuidsForMerge; - public Boolean excludeSharedCases; - private String caseReferenceNumber; 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 4c64a276b70..1f63f927fc3 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 @@ -37,7 +37,6 @@ import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.common.progress.ProcessedEntity; import de.symeda.sormas.api.contact.ContactReferenceDto; -import de.symeda.sormas.api.dashboard.DashboardCaseDto; import de.symeda.sormas.api.event.EventParticipantReferenceDto; import de.symeda.sormas.api.externaldata.ExternalDataDto; import de.symeda.sormas.api.externaldata.ExternalDataUpdateException; 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 e14b6619820..de2c1e944a4 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 @@ -16,7 +16,6 @@ import java.util.Date; import java.util.List; -import java.util.Map; import java.util.Set; import javax.ejb.Remote; @@ -24,14 +23,11 @@ import javax.validation.constraints.NotNull; import de.symeda.sormas.api.BaseFacade; -import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EditPermissionFacade; import de.symeda.sormas.api.caze.CaseClassification; -import de.symeda.sormas.api.caze.CaseCriteria; import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.externaldata.ExternalDataDto; import de.symeda.sormas.api.externaldata.ExternalDataUpdateException; -import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.SortProperty; 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 e2662979d8b..1d6c56c6f64 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 @@ -56,7 +56,6 @@ import javax.ejb.TransactionAttributeType; import javax.enterprise.concurrent.ManagedScheduledExecutorService; import javax.inject.Inject; -import javax.persistence.NoResultException; import javax.persistence.Tuple; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; @@ -75,7 +74,6 @@ import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; -import de.symeda.sormas.api.dashboard.DashboardCaseDto; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; 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 74cf68ff8e5..5117006a23d 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 @@ -1569,32 +1569,6 @@ public Predicate createNewCaseFilter(CaseQueryContext caseQueryContext, Date fro } - private Predicate createNewCaseFilter(CriteriaBuilder cb, From caze, Date fromDate, Date toDate, CriteriaDateType newCaseDateType) { - - Join symptoms = caze.join(Case.SYMPTOMS, JoinType.LEFT); - - toDate = DateHelper.getEndOfDay(toDate); - - Predicate onsetDateFilter = cb.between(symptoms.get(Symptoms.ONSET_DATE), fromDate, toDate); - Predicate reportDateFilter = cb.between(caze.get(Case.REPORT_DATE), fromDate, toDate); - - Predicate newCaseFilter = null; - if (newCaseDateType == null || newCaseDateType == NewCaseDateType.MOST_RELEVANT) { - newCaseFilter = cb.or(onsetDateFilter, cb.and(cb.isNull(symptoms.get(Symptoms.ONSET_DATE)), reportDateFilter)); - } else if (newCaseDateType == NewCaseDateType.ONSET) { - newCaseFilter = onsetDateFilter; - } else if (newCaseDateType == NewCaseDateType.CLASSIFICATION) { - newCaseFilter = cb.between(caze.get(Case.CLASSIFICATION_DATE), fromDate, toDate); - } else if (newCaseDateType == NewCaseDateType.CREATION) { - newCaseFilter = cb.between(caze.get(Case.CREATION_DATE), fromDate, toDate); - } else if (newCaseDateType == NewCaseDateType.INVESTIGATION) { - newCaseFilter = cb.between(caze.get(Case.INVESTIGATED_DATE), fromDate, toDate); - } else { - newCaseFilter = reportDateFilter; - } - - return newCaseFilter; - } public Case getRelevantCaseForFollowUp(Person person, Disease disease, Date referenceDate) { CriteriaBuilder cb = em.getCriteriaBuilder(); @@ -2381,96 +2355,6 @@ public String getCaseUuidForAutomaticSampleAssignment(Set uuids, Disease return caseUuids.size() == 1 ? caseUuids.get(0) : null; } - @SuppressWarnings("rawtypes") - public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From casePath, CaseUserFilterCriteria userFilterCriteria) { - - User currentUser = getCurrentUser(); - if (currentUser == null) { - return null; - } - - Predicate filterResponsible = null; - Predicate filter = null; - - final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); - if (jurisdictionLevel != JurisdictionLevel.NATION){ - //&& !currentUser.hasAnyUserRole(DefaultUserRole)) { - // whoever created the case or is assigned to it is allowed to access it - filterResponsible = cb.equal(casePath.join(Case.REPORTING_USER, JoinType.LEFT), currentUser); - filterResponsible = cb.or(filterResponsible, cb.equal(casePath.join(Case.SURVEILLANCE_OFFICER, JoinType.LEFT), currentUser)); - filterResponsible = cb.or(filterResponsible, cb.equal(casePath.join(Case.CASE_OFFICER, JoinType.LEFT), currentUser)); - - switch (jurisdictionLevel) { - case REGION: - final Region region = currentUser.getRegion(); - if (region != null) { - filter = or(cb, filter, cb.equal(casePath.get(Case.REGION), region)); - } - break; - case DISTRICT: - final District district = currentUser.getDistrict(); - if (district != null) { - filter = or(cb, filter, cb.equal(casePath.get(Case.DISTRICT), district)); - } - break; - case HEALTH_FACILITY: - final Facility healthFacility = currentUser.getHealthFacility(); - if (healthFacility != null) { - filter = or(cb, filter, cb.equal(casePath.get(Case.HEALTH_FACILITY), healthFacility)); - } - break; - case COMMUNITY: - final Community community = currentUser.getCommunity(); - if (community != null) { - filter = or(cb, filter, cb.equal(casePath.get(Case.COMMUNITY), community)); - } - break; - case POINT_OF_ENTRY: - final PointOfEntry pointOfEntry = currentUser.getPointOfEntry(); - if (pointOfEntry != null) { - filter = or(cb, filter, cb.equal(casePath.get(Case.POINT_OF_ENTRY), pointOfEntry)); - } - break; - case LABORATORY: - Subquery sampleCaseSubquery = cq.subquery(Long.class); - Root sampleRoot = sampleCaseSubquery.from(Sample.class); - sampleCaseSubquery.where(sampleService.createUserFilterWithoutCase(cb, new SampleJoins(sampleRoot))); - sampleCaseSubquery.select(sampleRoot.get(Sample.ASSOCIATED_CASE).get(Case.ID)); - filter = or(cb, filter, cb.in(casePath.get(Case.ID)).value(sampleCaseSubquery)); - break; - default: - } - - // get all cases based on the user's contact association - if (userFilterCriteria == null || !userFilterCriteria.isExcludeCasesFromContacts()) { - Subquery contactCaseSubquery = cq.subquery(Long.class); - Root contactRoot = contactCaseSubquery.from(Contact.class); - contactCaseSubquery.where(contactService.createUserFilterWithoutCase(cb, cq, contactRoot)); - contactCaseSubquery.select(contactRoot.get(Contact.CAZE).get(Case.ID)); - filter = or(cb, filter, cb.in(casePath.get(Case.ID)).value(contactCaseSubquery)); - } - - // all users (without specific restrictions) get access to cases that have been made available to the whole country - if ((userFilterCriteria == null || !userFilterCriteria.isExcludeSharedCases()) - && !featureConfigurationFacade.isFeatureDisabled(FeatureType.NATIONAL_CASE_SHARING)) { - filter = or(cb, filter, cb.isTrue(casePath.get(Case.SHARED_TO_COUNTRY))); - } - } - - // only show cases of a specific disease if a limited disease is set - if (currentUser.getLimitedDiseases() != null) { - filter = and(cb, filter, cb.equal(casePath.get(Case.DISEASE), currentUser.getLimitedDiseases())); - } - - // port health users can only see port health cases - if (UserRole.isPortHealthUser(currentUser.getUserRoles())) { - filter = and(cb, filter, cb.equal(casePath.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY)); - } - - filter = or(cb, filter, filterResponsible); - - return filter; - } } 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 956e32e21d3..ec26546b717 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 @@ -1076,59 +1076,6 @@ public Predicate createUserFilterWithoutCase(ContactQueryContext qc) { } - @SuppressWarnings("rawtypes") - public Predicate createUserFilterForJoin(CriteriaBuilder cb, CriteriaQuery cq, From contactPath) { - - Predicate userFilter = caseService.createUserFilter(cb, cq, contactPath.join(Contact.CAZE, JoinType.LEFT)); - Predicate filter; - if (userFilter != null) { - filter = cb.or(createUserFilterWithoutCase(cb, cq, contactPath), userFilter); - } else { - filter = createUserFilterWithoutCase(cb, cq, contactPath); - } - return filter; - } - - //@SuppressWarnings("rawtypes") - public Predicate createUserFilterWithoutCase(CriteriaBuilder cb, CriteriaQuery cq, From contactPath) { - - // National users can access all contacts in the system - User currentUser = getCurrentUser(); - final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); - if ((jurisdictionLevel == JurisdictionLevel.NATION && !UserRole.isPortHealthUser(currentUser.getUserRoles())) - //|| currentUser.hasAnyUserRole(UserRole.REST_USER - ) { - if (currentUser.getLimitedDiseases() != null) { - return cb.equal(contactPath.get(Contact.DISEASE), currentUser.getLimitedDiseases()); - } else { - return null; - } - } - - // whoever created it or is assigned to it is allowed to access it - Predicate filter = cb.equal(contactPath.join(Contact.REPORTING_USER, JoinType.LEFT), currentUser); - filter = cb.or(filter, cb.equal(contactPath.join(Contact.CONTACT_OFFICER, JoinType.LEFT), currentUser)); - - switch (jurisdictionLevel) { - case REGION: - final Region region = currentUser.getRegion(); - if (region != null) { - filter = cb.or(filter, cb.equal(contactPath.get(Contact.REGION), currentUser.getRegion())); - } - break; - case DISTRICT: - final District district = currentUser.getDistrict(); - if (district != null) { - filter = cb.or(filter, cb.equal(contactPath.get(Contact.DISTRICT), currentUser.getDistrict())); - } - break; - default: - } - - return filter; - } - - public Predicate createUserFilterWithoutCase(ContactQueryContext qc, ContactCriteria contactCriteria) { User currentUser = getCurrentUser(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java index b24cbe7bbae..388d25ae770 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java @@ -167,10 +167,9 @@ public DiseaseBurdenDto getDiseaseGridForDashboard( regionDto = regionFacade.getByUuid(region.getUuid()); } - //new cases DashboardCriteria dashboardCriteria = - new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate);; + new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); //Load count all dead/ fatalities Map allCasesFetched = dashboardService.getCaseCountByDisease(dashboardCriteria); @@ -178,14 +177,12 @@ public DiseaseBurdenDto getDiseaseGridForDashboard( Map caseFatalities = dashboardService.getDeathCountByDisease(dashboardCriteria); - dashboardCriteria.setOutcome(CaseOutcome.NO_OUTCOME); Map archievedCase = dashboardService.getCaseCountByDisease(dashboardCriteria); dashboardCriteria.setOutcome(CaseOutcome.RECOVERED); Map recoveredCase = dashboardService.getCaseCountByDisease(dashboardCriteria); - dashboardCriteria.setOutcome(CaseOutcome.UNKNOWN); Map unknown = dashboardService.getCaseCountByDisease(dashboardCriteria); @@ -201,7 +198,6 @@ public DiseaseBurdenDto getDiseaseGridForDashboard( Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); Long otherCaseCount = other.getOrDefault(disease, 0L)+unknown.getOrDefault(disease, 0L); - return new DiseaseBurdenDto( regionDto, totalCaseCount.toString(), diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java index 6326ed79bc5..124ef94eec3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java @@ -669,10 +669,4 @@ public Predicate createOwnershipPredicate(boolean withOwnership, From from } } - public Predicate createUserFilterForJoin(CriteriaBuilder cb, CriteriaQuery cq, From eventParticipantPath) { - // can see the participants of all accessible events - Predicate filter = eventService.createUserFilter(cb, cq, eventParticipantPath.join(EventParticipant.EVENT, JoinType.LEFT)); - - return filter; - } } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java index b692005f6d7..ad64a2e4581 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java @@ -199,14 +199,10 @@ public static OutbreakDto toDto(Outbreak source) { UserRight._DASHBOARD_SURVEILLANCE_VIEW, UserRight._DASHBOARD_CONTACT_VIEW }) public Map getOutbreakDistrictNameByDisease(OutbreakCriteria criteria) { - User user = userService.getCurrentUser(); - - return outbreakService.getOutbreakDistrictNameByDisease(criteria, user); + return outbreakService.getOutbreakDistrictNameByDisease(criteria); } public Map getOutbreakDistrictCountByDisease(OutbreakCriteria criteria) { - //User user = userService.getCurrentUser(); - return outbreakService.getOutbreakDistrictCountByDisease(criteria); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java index 90dc4c44a50..43cf99137c9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java @@ -201,7 +201,7 @@ public Predicate buildCriteriaFilter(OutbreakCriteria criteria, CriteriaBuilder return filter; } - public Map getOutbreakDistrictNameByDisease(OutbreakCriteria criteria, User user) { + public Map getOutbreakDistrictNameByDisease(OutbreakCriteria criteria) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Object[].class); @@ -223,14 +223,11 @@ public Map getOutbreakDistrictNameByDisease(OutbreakCriteria List results = em.createQuery(cq).getResultList(); Map outbreaksDistrict = new HashMap<>(); - for (Object[] e : results) { Disease disease = (Disease) e[0]; - if (!outbreaksDistrict.containsKey(disease)) { - District district = (District) e[1]; - outbreaksDistrict.put(disease, district); - } + outbreaksDistrict.computeIfAbsent(disease, k -> (District) e[1]); } + return outbreaksDistrict; } 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 4b9d0a6ab11..af050d6828e 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 @@ -14,70 +14,12 @@ */ package de.symeda.sormas.backend.person; -import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; -import static java.util.Comparator.comparing; -import static java.util.Objects.isNull; -import static java.util.stream.Collectors.groupingBy; -import static java.util.stream.Collectors.maxBy; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.EnumSet; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.annotation.security.PermitAll; -import javax.ejb.EJB; -import javax.ejb.LocalBean; -import javax.ejb.Stateless; -import javax.ejb.TransactionAttribute; -import javax.ejb.TransactionAttributeType; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Tuple; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Expression; -import javax.persistence.criteria.Join; -import javax.persistence.criteria.JoinType; -import javax.persistence.criteria.Order; -import javax.persistence.criteria.Path; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; -import javax.persistence.criteria.Selection; -import javax.validation.Valid; -import javax.validation.constraints.NotNull; - -import de.symeda.sormas.backend.caze.*; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.SerializationUtils; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.google.i18n.phonenumbers.NumberParseException; import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.i18n.phonenumbers.Phonenumber; - -import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.RequestContextHolder; -import de.symeda.sormas.api.caze.CaseClassification; -import de.symeda.sormas.api.caze.CaseCriteria; -import de.symeda.sormas.api.caze.CaseDataDto; -import de.symeda.sormas.api.caze.CaseLogic; -import de.symeda.sormas.api.caze.CaseOutcome; +import de.symeda.sormas.api.caze.*; import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.contact.ContactCriteria; import de.symeda.sormas.api.contact.FollowUpStatus; @@ -90,60 +32,25 @@ import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.immunization.ImmunizationDto; -import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.location.LocationDto; -import de.symeda.sormas.api.person.ApproximateAgeType; +import de.symeda.sormas.api.person.*; import de.symeda.sormas.api.person.ApproximateAgeType.ApproximateAgeHelper; -import de.symeda.sormas.api.person.CauseOfDeath; -import de.symeda.sormas.api.person.IsPerson; -import de.symeda.sormas.api.person.JournalPersonDto; -import de.symeda.sormas.api.person.PersonAddressType; -import de.symeda.sormas.api.person.PersonAssociation; -import de.symeda.sormas.api.person.PersonContactDetailDto; -import de.symeda.sormas.api.person.PersonContactDetailType; -import de.symeda.sormas.api.person.PersonContext; -import de.symeda.sormas.api.person.PersonCriteria; -import de.symeda.sormas.api.person.PersonDto; -import de.symeda.sormas.api.person.PersonExportDto; -import de.symeda.sormas.api.person.PersonFacade; -import de.symeda.sormas.api.person.PersonFollowUpEndDto; -import de.symeda.sormas.api.person.PersonHelper; -import de.symeda.sormas.api.person.PersonIndexDto; -import de.symeda.sormas.api.person.PersonReferenceDto; -import de.symeda.sormas.api.person.PersonSimilarityCriteria; -import de.symeda.sormas.api.person.PresentCondition; -import de.symeda.sormas.api.person.SimilarPersonDto; -import de.symeda.sormas.api.person.SymptomJournalStatus; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.user.UserRight; -import de.symeda.sormas.api.utils.AccessDeniedException; -import de.symeda.sormas.api.utils.DataHelper; +import de.symeda.sormas.api.utils.*; import de.symeda.sormas.api.utils.DataHelper.Pair; -import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.api.utils.DtoCopyHelper; -import de.symeda.sormas.api.utils.LocationHelper; -import de.symeda.sormas.api.utils.SortProperty; -import de.symeda.sormas.api.utils.ValidationRuntimeException; import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; import de.symeda.sormas.api.vaccination.VaccinationDto; import de.symeda.sormas.backend.FacadeHelper; +import de.symeda.sormas.backend.caze.*; import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal; import de.symeda.sormas.backend.common.AbstractBaseEjb; import de.symeda.sormas.backend.common.AbstractDomainObject; -import de.symeda.sormas.backend.contact.Contact; -import de.symeda.sormas.backend.contact.ContactFacadeEjb; +import de.symeda.sormas.backend.contact.*; import de.symeda.sormas.backend.contact.ContactFacadeEjb.ContactFacadeEjbLocal; -import de.symeda.sormas.backend.contact.ContactJoins; -import de.symeda.sormas.backend.contact.ContactQueryContext; -import de.symeda.sormas.backend.contact.ContactService; -import de.symeda.sormas.backend.event.Event; -import de.symeda.sormas.backend.event.EventFacadeEjb; -import de.symeda.sormas.backend.event.EventParticipant; -import de.symeda.sormas.backend.event.EventParticipantFacadeEjb; +import de.symeda.sormas.backend.event.*; import de.symeda.sormas.backend.event.EventParticipantFacadeEjb.EventParticipantFacadeEjbLocal; -import de.symeda.sormas.backend.event.EventParticipantService; -import de.symeda.sormas.backend.event.EventService; import de.symeda.sormas.backend.externaljournal.ExternalJournalService; import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal; import de.symeda.sormas.backend.immunization.ImmunizationFacadeEjb; @@ -178,15 +85,34 @@ import de.symeda.sormas.backend.travelentry.services.TravelEntryService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb.UserFacadeEjbLocal; -import de.symeda.sormas.backend.util.DtoHelper; -import de.symeda.sormas.backend.util.IterableHelper; -import de.symeda.sormas.backend.util.JurisdictionHelper; -import de.symeda.sormas.backend.util.ModelConstants; -import de.symeda.sormas.backend.util.Pseudonymizer; -import de.symeda.sormas.backend.util.QueryHelper; -import de.symeda.sormas.backend.util.RightsAllowed; +import de.symeda.sormas.backend.util.*; import de.symeda.sormas.backend.visit.Visit; import de.symeda.sormas.backend.visit.VisitService; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.SerializationUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.annotation.security.PermitAll; +import javax.ejb.*; +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Tuple; +import javax.persistence.criteria.Order; +import javax.persistence.criteria.*; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; +import static java.util.Comparator.comparing; +import static java.util.Objects.isNull; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.maxBy; @Stateless(name = "PersonFacade") @RightsAllowed(UserRight._PERSON_VIEW) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java index 35f5c16103f..7cc075e4dd5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java @@ -17,7 +17,6 @@ *******************************************************************************/ package de.symeda.sormas.ui.dashboard; -import static de.symeda.sormas.ui.UiUtil.permitted; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; @@ -37,6 +36,8 @@ import de.symeda.sormas.ui.utils.AbstractView; import de.symeda.sormas.ui.utils.CssStyles; +import static de.symeda.sormas.ui.UiUtil.permitted; + @SuppressWarnings("serial") public abstract class AbstractDashboardView extends AbstractView { @@ -99,9 +100,7 @@ protected AbstractDashboardView(String viewName) { protected AbstractDashboardView(String viewName, DashboardType dashboardType) { super(viewName); - -// addStyleName(DashboardCssStyles.DASHBOARD_SCREEN); - + dashboardDataProvider = new DashboardDataProvider(); if (dashboardDataProvider.getDashboardType() == null) { 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 95f92903da0..4a41fa2829d 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 @@ -102,10 +102,10 @@ public void refreshDiseaseData() { ,caseClassification); setDiseaseBurdenDetail(dbd); - Long outbreakDistrictCount = FacadeProvider.getOutbreakFacade() + Long countOfOutbreakDistricts = FacadeProvider.getOutbreakFacade() .getOutbreakDistrictCount( new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate).caseClassification(caseClassification)); - setOutbreakDistrictCount(outbreakDistrictCount); + setOutbreakDistrictCount(countOfOutbreakDistricts); this.refreshDataForSelectedDisease(); } @@ -346,22 +346,23 @@ public String getLastReportedDistrict() { public void setLastReportedDistrict(String district) { this.lastReportedDistrict = district; } - + @Override public NewCaseDateType getNewCaseDateType() { if (newCaseDateType == null) { return NewCaseDateType.MOST_RELEVANT; } return newCaseDateType; } - + @Override public void setNewCaseDateType(NewCaseDateType newCaseDateType) { this.newCaseDateType = newCaseDateType; } + @Override public DashboardType getDashboardType() { return dashboardType; } - + @Override public void setDashboardType(DashboardType dashboardType) { this.dashboardType = dashboardType; } @@ -413,15 +414,15 @@ public Long getCaseWithReferenceDefinitionFulfilledCount() { public void setCaseWithReferenceDefinitionFulfilledCount(Long caseWithReferenceDefinitionFulfilledCount) { this.caseWithReferenceDefinitionFulfilledCount = caseWithReferenceDefinitionFulfilledCount; } - + @Override public CaseClassification getCaseClassification() { return caseClassification; } - + @Override public void setCaseClassification(CaseClassification caseClassification) { this.caseClassification = caseClassification; } - + @Override public NewDateFilterType getDateFilterType() { if (dateFilterType == NewDateFilterType.TODAY) { setFromDate(DateHelper.getStartOfDay(new Date())); @@ -445,7 +446,7 @@ public NewDateFilterType getDateFilterType() { } return dateFilterType; } - + @Override public void setDateFilterType(NewDateFilterType dateFilterType) { this.dateFilterType = dateFilterType; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java index 3c60e1cf79f..7fc0ac67bc8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java @@ -17,40 +17,23 @@ *******************************************************************************/ package de.symeda.sormas.ui.dashboard.components; -import static de.symeda.sormas.ui.utils.AbstractFilterForm.FILTER_ITEM_STYLE; -import static de.symeda.sormas.ui.utils.LayoutUtil.filterLocs; - -import java.util.Date; -import java.util.HashSet; -import java.util.Set; -import java.util.function.Consumer; - -import com.vaadin.icons.VaadinIcons; -import com.vaadin.navigator.ViewChangeListener; -import com.vaadin.shared.ui.ContentMode; -import com.vaadin.ui.*; -import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.action.ActionDto; -import de.symeda.sormas.api.caze.CaseClassification; -import de.symeda.sormas.api.caze.CaseIndexDto; -import de.symeda.sormas.api.contact.ContactIndexDto; -import de.symeda.sormas.api.dashboard.DashboardCriteria; -import de.symeda.sormas.api.dashboard.NewDateFilterType; -import de.symeda.sormas.ui.dashboard.DashboardDataProvider; -import de.symeda.sormas.ui.dashboard.DashboardType; -import org.apache.commons.lang3.ArrayUtils; -import org.vaadin.hene.popupbutton.PopupButton; - import com.vaadin.event.ShortcutAction; +import com.vaadin.navigator.ViewChangeListener; import com.vaadin.server.Page; import com.vaadin.shared.ui.MarginInfo; +import com.vaadin.ui.*; import com.vaadin.ui.Notification.Type; import com.vaadin.ui.themes.ValoTheme; import com.vaadin.v7.ui.ComboBox; - +import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.Language; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.CaseIndexDto; import de.symeda.sormas.api.caze.NewCaseDateType; +import de.symeda.sormas.api.contact.ContactIndexDto; +import de.symeda.sormas.api.dashboard.DashboardCriteria; +import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -64,11 +47,18 @@ import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.dashboard.AbstractDashboardDataProvider; import de.symeda.sormas.ui.dashboard.AbstractDashboardView; -import de.symeda.sormas.ui.utils.ButtonHelper; -import de.symeda.sormas.ui.utils.ComboBoxHelper; -import de.symeda.sormas.ui.utils.CssStyles; -import de.symeda.sormas.ui.utils.DateFormatHelper; -import de.symeda.sormas.ui.utils.EpiWeekAndDateFilterComponent; +import de.symeda.sormas.ui.dashboard.DashboardType; +import de.symeda.sormas.ui.utils.*; +import org.apache.commons.lang3.ArrayUtils; +import org.vaadin.hene.popupbutton.PopupButton; + +import java.util.Date; +import java.util.HashSet; +import java.util.Set; +import java.util.function.Consumer; + +import static de.symeda.sormas.ui.utils.AbstractFilterForm.FILTER_ITEM_STYLE; +import static de.symeda.sormas.ui.utils.LayoutUtil.filterLocs; @SuppressWarnings("serial") public class DashboardFilterLayout

extends HorizontalLayout { @@ -115,33 +105,6 @@ public class DashboardFilterLayout

exte private ComboBox caseClassificationFilter; - public DashboardFilterLayout(AbstractDashboardView dashboardView, P dashboardDataProvider) { - this.dashboardView = dashboardView; - this.dashboardDataProvider = dashboardDataProvider; - this.regionFilter = new ComboBox(); - this.districtFilter = new ComboBox(); - this.diseaseFilter = new ComboBox(); - dateFilterButtons = new HashSet<>(); - dateComparisonButtons = new HashSet<>(); - this.caseClassificationFilter = ComboBoxHelper.createComboBoxV7(); - - setSpacing(true); - setSizeUndefined(); - setMargin(new MarginInfo(true, true, false, true)); - - //createDateFilters(); - createDateFiltersNew(dashboardDataProvider); - -// createRegionAndDistrictFilter(); - if (dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE) { - createRegionAndDistrictFilter(); - } - if (dashboardDataProvider.getDashboardType() == DashboardType.CONTACTS) { - createRegionAndDistrictFilter(); - createDiseaseFilter(); - } - } - public DashboardFilterLayout(AbstractDashboardView dashboardView, P dashboardDataProvider, String[] templateContent) { this.dashboardView = dashboardView; this.dashboardDataProvider = dashboardDataProvider; @@ -163,8 +126,6 @@ public DashboardFilterLayout(AbstractDashboardView dashboardView, P dashboardDat customLayout = new CustomLayout(); customLayout.setTemplateContents(filterLocs(templateLocs)); - //createDateFiltersNew(dashboardDataProvider); - addComponent(customLayout); populateLayout(); if(currentDateFilterType!=null) { @@ -216,9 +177,7 @@ public void createCaseClassificationFilter() { caseClassificationFilter.setWidth(200, Unit.PIXELS); caseClassificationFilter.setInputPrompt(I18nProperties.getPrefixCaption(CaseIndexDto.I18N_PREFIX, ContactIndexDto.CASE_CLASSIFICATION)); caseClassificationFilter.addItems((Object[]) CaseClassification.values()); - caseClassificationFilter.addValueChangeListener(e -> { - dashboardDataProvider.setCaseClassification((CaseClassification) caseClassificationFilter.getValue()); - }); + caseClassificationFilter.addValueChangeListener(e -> dashboardDataProvider.setCaseClassification((CaseClassification) caseClassificationFilter.getValue())); addCustomComponent(caseClassificationFilter, CASE_CLASSIFICATION_FILTER); dashboardDataProvider.setCaseClassification((CaseClassification) caseClassificationFilter.getValue()); } @@ -308,104 +267,7 @@ public void createDateFilters() { updateComparisonButtons(NewDateFilterType.THIS_WEEK, DateHelper.getStartOfWeek(new Date()), new Date(), false); btnCurrentPeriod.setCaption(btnThisWeek.getCaption()); } - public void createDateFilters2() { - HorizontalLayout dateFilterLayout = new HorizontalLayout(); - dateFilterLayout.setSpacing(true); - CssStyles.style(dateFilterLayout, CssStyles.VSPACE_3); - addCustomComponent(dateFilterLayout, DATE_FILTER); - btnCurrentPeriod = ButtonHelper.createIconPopupButton( - "currentPeriod", - null, - new VerticalLayout(createDateFilterButtonsLayout(), createCustomDateFilterLayout()), - CssStyles.BUTTON_FILTER, - CssStyles.BUTTON_FILTER_LIGHT); - - Label lblComparedTo = new Label(I18nProperties.getCaption(Captions.dashboardComparedTo)); - CssStyles.style(lblComparedTo, CssStyles.VSPACE_TOP_4, CssStyles.LABEL_BOLD); - - btnComparisonPeriod = ButtonHelper.createIconPopupButton( - "comparisonPeriod", - null, - createDateComparisonButtonsLayout(), - ValoTheme.BUTTON_BORDERLESS, - CssStyles.BUTTON_FILTER, - CssStyles.BUTTON_FILTER_LIGHT); - - dateFilterLayout.addComponents(btnCurrentPeriod, lblComparedTo, btnComparisonPeriod); - - -// infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); -// infoLabel.setSizeUndefined(); -// CssStyles.style(infoLabel, CssStyles.LABEL_XLARGE, CssStyles.LABEL_SECONDARY); -// addComponent(infoLabel); -// setComponentAlignment(infoLabel, Alignment.TOP_RIGHT); - - // Set initial date filter - CssStyles.style(btnThisWeek, CssStyles.BUTTON_FILTER_DARK); - CssStyles.removeStyles(btnThisWeek, CssStyles.BUTTON_FILTER_LIGHT); - CssStyles.style(btnPeriodBefore, CssStyles.BUTTON_FILTER_DARK); - CssStyles.removeStyles(btnPeriodBefore, CssStyles.BUTTON_FILTER_LIGHT); - activeComparisonButton = btnPeriodBefore; - currentDateFilterType = DateFilterType.THIS_WEEK; - setDateFilter(DateHelper.getStartOfWeek(new Date()), new Date()); - updateComparisonButtons(NewDateFilterType.THIS_WEEK, DateHelper.getStartOfWeek(new Date()), new Date(), false); - btnCurrentPeriod.setCaption(btnThisWeek.getCaption()); - - } - - - private void createDateFiltersNew(P dashboardDataProvider) { - HorizontalLayout dateFilterLayout = new HorizontalLayout(); - dateFilterLayout.setSpacing(true); - CssStyles.style(dateFilterLayout, CssStyles.VSPACE_3); - addComponent(dateFilterLayout); - - btnCurrentPeriod = ButtonHelper.createIconPopupButton( - "currentPeriod", - null, - new VerticalLayout(createDateFilterButtonsLayout(), createCustomDateFilterLayout()), - CssStyles.BUTTON_FILTER, - CssStyles.BUTTON_FILTER_LIGHT); - - Label lblComparedTo = new Label(I18nProperties.getCaption(Captions.dashboardComparedTo)); - CssStyles.style(lblComparedTo, CssStyles.VSPACE_TOP_4, CssStyles.LABEL_BOLD); - - btnComparisonPeriod = ButtonHelper.createIconPopupButton( - "comparisonPeriod", - null, - createDateComparisonButtonsLayout(), - ValoTheme.BUTTON_BORDERLESS, - CssStyles.BUTTON_FILTER, - CssStyles.BUTTON_FILTER_LIGHT); - - dateFilterLayout.addComponents(btnCurrentPeriod, lblComparedTo, btnComparisonPeriod); - -// infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); -// infoLabel.setSizeUndefined(); -// CssStyles.style(infoLabel, CssStyles.LABEL_XLARGE, CssStyles.LABEL_SECONDARY); -// addComponent(infoLabel); -// setComponentAlignment(infoLabel, Alignment.TOP_RIGHT); - - // Set initial date filter - CssStyles.style(btnThisWeek, CssStyles.BUTTON_FILTER_DARK); - CssStyles.removeStyles(btnThisWeek, CssStyles.BUTTON_FILTER_LIGHT); - CssStyles.style(btnPeriodBefore, CssStyles.BUTTON_FILTER_DARK); - CssStyles.removeStyles(btnPeriodBefore, CssStyles.BUTTON_FILTER_LIGHT); - activeComparisonButton = btnPeriodBefore; - - - - setDateFilter(dashboardDataProvider.getFromDate(), dashboardDataProvider.getToDate()); - - - //setDateFilter(DateHelper.getStartOfWeek(new Date()), new Date()); - - //updateComparisonButtons(dashboardDataProvider.getDateFilterType(), dashboardDataProvider.getFromDate(), dashboardDataProvider.getToDate(), false); - - updateComparisonButtons(NewDateFilterType.THIS_WEEK, DateHelper.getStartOfWeek(new Date()), new Date(), false); - btnCurrentPeriod.setCaption(btnThisWeek.getCaption()); - } private HorizontalLayout createDateFilterButtonsLayout() { HorizontalLayout layout = new HorizontalLayout(); layout.setSpacing(true); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java index 86ee1b3fb63..4b7d53de5e1 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java @@ -52,8 +52,7 @@ public class ContactsDashboardView extends AbstractDashboardView { private static final int ROW_HEIGHT = 555; - protected DashboardDataProvider dashboardDataProvider; - protected ContactsFilterLayout filterLayout; + protected ContactsFilterLayout contactsFilterLayout; protected AbstractDashboardStatisticsComponent statisticsComponent; protected ContactsEpiCurveComponent epiCurveComponent; @@ -91,8 +90,8 @@ public ContactsDashboardView() { dashboardDataProvider.setDisease(FacadeProvider.getDiseaseConfigurationFacade().getDefaultDisease()); } - filterLayout = new ContactsFilterLayout(this, dashboardDataProvider); - dashboardLayout.addComponent(filterLayout); + contactsFilterLayout = new ContactsFilterLayout(this, dashboardDataProvider); + dashboardLayout.addComponent(contactsFilterLayout); dashboardSwitcher.setValue(DashboardType.CONTACTS); dashboardSwitcher.addValueChangeListener(e -> { @@ -328,8 +327,8 @@ protected HorizontalLayout createNetworkDiagramRowLayout() { noNetworkDiagramLayout.setVisible(false); networkDiagramLayout.ifPresent(l -> { - l.setVisible(filterLayout.hasDiseaseSelected()); - noNetworkDiagramLayout.setVisible(!filterLayout.hasDiseaseSelected()); + l.setVisible(contactsFilterLayout.hasDiseaseSelected()); + noNetworkDiagramLayout.setVisible(!contactsFilterLayout.hasDiseaseSelected()); }); return layout; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java index 290ce47c65f..00af92955ea 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java @@ -1,20 +1,14 @@ package de.symeda.sormas.ui.dashboard.diseasedetails; -import com.vaadin.icons.VaadinIcons; import com.vaadin.shared.ui.ContentMode; import com.vaadin.ui.*; -import com.vaadin.ui.themes.ValoTheme; - import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.utils.CssStyles; -import java.util.List; - public class DiseaseDetailsComponent extends CssLayout { /** @@ -23,24 +17,18 @@ public class DiseaseDetailsComponent extends CssLayout { private static final long serialVersionUID = 1L; private DashboardDataProvider dashboardDataProvider; - private List diseaseBurden; - private String outbreakDivStyles; + private static final String HTML_DIV_END = "

"; + public DiseaseDetailsComponent(DashboardDataProvider dashboardDataProvider) { this.dashboardDataProvider = dashboardDataProvider; addStyleName("disease-detail-card-display-top"); - - outbreakDivStyles = - "text-align: center; font-size: smaller; font-weight: 700; width: 100px; " + - "background:#DE5555; -ms-transform: rotate(-135deg); -o-transform: rotate(-135deg); -webkit-transform:rotate(45deg); " + - "color: white; transform-origin: bottom; float: right; margin-right: -150px; margin-top: -10px;"; } public void refresh(){ addTopLayout( dashboardDataProvider.getDiseaseBurdenDetail().getDisease(), dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), - dashboardDataProvider.getDiseaseBurdenDetail().getPreviousCaseCount(), dashboardDataProvider.getDiseaseBurdenDetail().getOutbreakDistrictCount() > 0); addStatsLayout( @@ -51,7 +39,7 @@ public void refresh(){ dashboardDataProvider.getDiseaseBurdenDetail().getDisease()); } - private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCount, boolean isOutbreak) { + private void addTopLayout(Disease disease, Long casesCount, boolean isOutbreak) { VerticalLayout layout = new VerticalLayout(); layout.setMargin(true); layout.setSpacing(false); @@ -92,14 +80,10 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo outbreakLayout.setSpacing(false); outbreakLayout.setHeight(15, Unit.PIXELS); outbreakLayout.setWidth(100, Unit.PIXELS); -// Label outbreakLabel = new Label("",ContentMode.HTML); Label outbreakLabel = new Label(I18nProperties.getCaption(Captions.dashboardOutbreak).toUpperCase(), ContentMode.HTML); outbreakLabel.setStyleName("disease-detail-outbreak-display", true); -// outbreakLabel.setValue("
" + I18nProperties.getCaption(Captions.dashboardOutbreak).toUpperCase() + "
"); -// outbreakLabel.setStyleName("disease-detail-outbreak-display", true); -// CssStyles.style(outbreakLabel, CssStyles.LABEL_WHITE, CssStyles.ALIGN_CENTER, CssStyles.LABEL_UPPERCASE); + outbreakLayout.addComponent(outbreakLabel); -// outbreakLayout.setComponentAlignment(outbreakLabel, Alignment.BOTTOM_RIGHT); nameAndOutbreakLayout.addComponent(outbreakLayout); } @@ -114,48 +98,13 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo countLayout.setWidth(70, Unit.PIXELS); Label countLabel = new Label("", ContentMode.HTML); - String fontSize = casesCount.toString().length() < 5 ? "70px" : "50px"; countLabel.setValue( "
" - + casesCount.toString() + "
"); + + casesCount.toString() + HTML_DIV_END); countLayout.addComponent(countLabel); countLayout.setComponentAlignment(countLabel, Alignment.MIDDLE_CENTER); - -// HorizontalLayout comparisonLayout = new HorizontalLayout(); -// { -// comparisonLayout.setMargin(false); -// comparisonLayout.setSpacing(false); -// -// Label growthLabel = new Label("", ContentMode.HTML); -// String chevronType = ""; -// if (previousCasesCount < casesCount) { -// chevronType = VaadinIcons.CHEVRON_UP.getHtml(); -// } else if (previousCasesCount > casesCount) { -// chevronType = VaadinIcons.CHEVRON_DOWN.getHtml(); -// } else { -// chevronType = VaadinIcons.CHEVRON_RIGHT.getHtml(); -// } -// growthLabel.setValue( -// "
" -// + " " + chevronType + " " + "
"); -// -// comparisonLayout.addComponent(growthLabel); -// -// Label previousCountLabel = new Label(previousCasesCount.toString()); -// CssStyles.style(previousCountLabel, CssStyles.LABEL_WHITE, CssStyles.LABEL_BOLD, CssStyles.LABEL_XLARGE, CssStyles.HSPACE_LEFT_4); -// comparisonLayout.addComponent(previousCountLabel); -// comparisonLayout.setComponentAlignment(growthLabel, Alignment.MIDDLE_CENTER); -// comparisonLayout.setComponentAlignment(previousCountLabel, Alignment.MIDDLE_CENTER); -// } -// countLayout.addComponent(comparisonLayout); -// countLayout.setComponentAlignment(comparisonLayout, Alignment.MIDDLE_CENTER); - -// countLayout.setExpandRatio(countLabel, 0.4f); -// countLayout.setExpandRatio(comparisonLayout, 0.6f); - layout.addComponent(countLayout); layout.setComponentAlignment(countLayout, Alignment.BOTTOM_CENTER); layout.setExpandRatio(countLayout, 0.65f); @@ -211,8 +160,8 @@ private HorizontalLayout createDeathCfrItem(String fatalityLabel, String fatalit Label fatalityNameLabel = new Label("", ContentMode.HTML); CssStyles.style(fatalityNameLabel, CssStyles.LABEL_WHITE, CssStyles.LABEL_PRIMARY, isCritical ? CssStyles.LABEL_CRITICAL : "", CssStyles.HSPACE_LEFT_3); - fatalityNameLabel.setValue("
" + fatalityLabel + "
" + - "
" + fatalityValue+ "
"); + fatalityNameLabel.setValue("
" + fatalityLabel + HTML_DIV_END + + "
" + fatalityValue+ HTML_DIV_END); layout.addComponent(fatalityNameLabel); @@ -226,8 +175,8 @@ private HorizontalLayout createDeathCfrItem(String fatalityLabel, String fatalit cfrValue.length() > 10 ? CssStyles.LABEL_SMALL : CssStyles.LABEL_WHITE, isCritical ? CssStyles.LABEL_CRITICAL : ""); - cfrNameLabel.setValue("
" + cfrLabel + "
" + - "
" + cfrValue + "
"); + cfrNameLabel.setValue("
" + cfrLabel + HTML_DIV_END + + "
" + cfrValue + HTML_DIV_END); layout.addComponent(cfrNameLabel); @@ -274,6 +223,6 @@ private HorizontalLayout createStatsItem(String label, String value, boolean isC private float calculateCfr(long fatalities, long totalCaseCount){ if (fatalities == 0 ) return 0; - return ((float) (fatalities/totalCaseCount) * 100); + return ((float) fatalities / totalCaseCount) * 100; } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java index 7fbb2eb7cfe..73f3e5f3373 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java @@ -26,12 +26,11 @@ public class DiseaseDetailsView extends AbstractDashboardView { protected DiseaseDetailsViewLayout diseaseDetailsViewLayout; - public static String diseaseDetailsData; + private static String diseaseDetailsData; public static void setDiseaseDetailsData(String newData) { diseaseDetailsData =newData; } - public DiseaseDetailsView() { super(VIEW_NAME, DashboardType.DISEASE); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java index acc6d15bcd7..41e820f33a5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java @@ -1,20 +1,17 @@ package de.symeda.sormas.ui.dashboard.diseasedetails; import com.vaadin.shared.ui.MarginInfo; -import com.vaadin.ui.*; - -import de.symeda.sormas.api.disease.DiseaseBurdenDto; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; +import com.vaadin.ui.CustomLayout; +import com.vaadin.ui.HorizontalLayout; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.map.DashboardMapComponent; import de.symeda.sormas.ui.dashboard.surveillance.components.disease.tile.RegionalDiseaseBurdenGrid; -import de.symeda.sormas.ui.dashboard.map.MapCaseDisplayMode; -import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.LayoutUtil; -import java.util.function.Consumer; - public class DiseaseDetailsViewLayout extends CustomLayout { private static final long serialVersionUID = 6582975657305031105L; @@ -23,8 +20,6 @@ public class DiseaseDetailsViewLayout extends CustomLayout { private static final String GRID_TABLE = "table"; private static final String GRID_VIEW_MORE = "viewMore"; private static final String MAP = "map"; - - private final DashboardDataProvider dashboardDataProvider; private final DiseaseDetailsComponent diseaseDetailsComponent; private final RegionalDiseaseBurdenGrid regionalDiseaseBurdenGrid; private final DashboardMapComponent dashboardMapComponent; @@ -32,9 +27,7 @@ public class DiseaseDetailsViewLayout extends CustomLayout { private boolean isShowMore; private Button button; public DiseaseDetailsViewLayout(DashboardDataProvider dashboardDataProvider) { - this.dashboardDataProvider = dashboardDataProvider; -// this.setWidthFull(); -// this.setSizeFull(); + setWidth(100, Unit.PERCENTAGE); setTemplateContents( LayoutUtil.fluidRow( @@ -96,7 +89,6 @@ public void reload() { mapLayout.setWidth(100, Unit.PERCENTAGE); final int BASE_HEIGHT = 600; mapLayout.setHeight(BASE_HEIGHT, Unit.PIXELS); -// mapLayout.setMargin(true); mapLayout.setSpacing(false); dashboardMapComponent.setMargin(false); @@ -107,15 +99,6 @@ public void reload() { addComponent(mapLayout, MAP); } - public void removeTopComponents() { - removeAllComponents(); - } - - public void addMapComponent() { - addComponent(dashboardMapComponent, "1"); - - } - public HorizontalLayout viewMoreLayout(String title){ HorizontalLayout viewMoreLayout = new HorizontalLayout(); viewMoreLayout.setMargin(false); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java index 6fcabe1c18e..d39d1f320e0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java @@ -1,43 +1,23 @@ package de.symeda.sormas.ui.dashboard.diseasedetails; - - -import com.vaadin.icons.VaadinIcons; -import com.vaadin.shared.ui.ContentMode; -import com.vaadin.ui.Label; -import com.vaadin.v7.data.Property; -import com.vaadin.v7.ui.ComboBox; - -import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.FacadeProvider; -import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.dashboard.DashboardCriteria; -import de.symeda.sormas.api.i18n.I18nProperties; -import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; -import de.symeda.sormas.ui.dashboard.DashboardType; import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; -import de.symeda.sormas.ui.dashboard.contacts.ContactsDashboardView; -import de.symeda.sormas.ui.utils.ComboBoxHelper; -import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.components.datetypeselector.DateTypeSelectorComponent; public class DiseaseFilterLayout extends DashboardFilterLayout { public static final String DATE_TYPE_SELECTOR_FILTER = "dateTypeSelectorFilter"; - public static final String INFO_LABEL = "infoLabel"; - public static final String DISEASE_FILTER = "diseaseFilter"; private DateTypeSelectorComponent dateTypeSelectorComponent; private static final String CASE_CLASSIFICATION_FILTER ="caseClassificationFilter" ; - private final static String[] DISEASE_FILTERS = new String[]{ + private static final String[] DISEASE_FILTERS = new String[]{ DATE_TYPE_SELECTOR_FILTER, REGION_FILTER, DISTRICT_FILTER, CASE_CLASSIFICATION_FILTER }; - private ComboBox diseaseFilter; public DiseaseFilterLayout(DiseaseDetailsView dashboardView, DashboardDataProvider dashboardDataProvider) { super(dashboardView, dashboardDataProvider,DISEASE_FILTERS); @@ -45,27 +25,10 @@ public DiseaseFilterLayout(DiseaseDetailsView dashboardView, DashboardDataProvid @Override public void populateLayout() { - //createDateTypeSelectorFilter(); - //super.createDateFilters(); -// super.populateLayout(); -// createRegionAndDistrictFilter(); -// createDateTypeSelectorFilter(); -// createCaseClassificationFilter(); - - } - - public void addDateTypeValueChangeListener(Property.ValueChangeListener listener) { - dateTypeSelectorComponent.addValueChangeListener(listener); - } - private void createDateTypeSelectorFilter() { - dateTypeSelectorComponent = - new DateTypeSelectorComponent.Builder<>(NewCaseDateType.class).dateTypePrompt(I18nProperties.getString(Strings.promptNewCaseDateType)) - .build(); - dateTypeSelectorComponent.setValue(dashboardDataProvider.getNewCaseDateType()); - addCustomComponent(dateTypeSelectorComponent, DATE_TYPE_SELECTOR_FILTER); } + @Override public void setCriteria(DashboardCriteria criteria) { super.setCriteria(criteria); dateTypeSelectorComponent.setValue(criteria.getNewCaseDateType()); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index d3708339063..e677ad21c33 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -17,13 +17,6 @@ *******************************************************************************/ package de.symeda.sormas.ui.dashboard.map; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.function.Consumer; -import java.util.stream.Collectors; - import com.vaadin.icons.VaadinIcons; import com.vaadin.server.ExternalResource; import com.vaadin.shared.ui.ContentMode; @@ -32,7 +25,6 @@ import com.vaadin.v7.shared.ui.grid.HeightMode; import com.vaadin.v7.ui.CheckBox; import com.vaadin.v7.ui.OptionGroup; - import de.symeda.sormas.api.CaseMeasure; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.FacadeProvider; @@ -56,7 +48,6 @@ import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; -import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DataHelper; @@ -74,6 +65,13 @@ import de.symeda.sormas.ui.utils.VaadinUiUtil; import org.vaadin.hene.popupbutton.PopupButton; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Collectors; + import static java.util.Objects.nonNull; @SuppressWarnings("serial") @@ -127,7 +125,6 @@ public class DashboardMapComponent extends BaseDashboardMapComponent onMarkerClicked(event.getGroupId(), event.getMarkerIndex())); -// -// { -// -// GeoShapeProvider geoShapeProvider = FacadeProvider.getGeoShapeProvider(); -// -// final GeoLatLon mapCenter; -// //if (UserProvider.getCurrent().hasAnyUserRole(DefaultUserRole.NATIONAL_USER, DefaultUserRole.NATIONAL_CLINICIAN, DefaultUserRole.NATIONAL_OBSERVER)) { -// mapCenter = geoShapeProvider.getCenterOfAllRegions(); -// -// //} else { -// UserDto user = UserProvider.getCurrent().getUser(); -// -//// if (user.getRegion() != null) { -//// mapCenter = geoShapeProvider.getCenterOfRegion(user.getRegion()); -//// } else { -//// mapCenter = geoShapeProvider.getCenterOfAllRegions(); -//// } -// // } -// -// GeoLatLon center = Optional.ofNullable(mapCenter).orElseGet(FacadeProvider.getConfigFacade()::getCountryCenter); -// -// if (center == null || (center.getLat() == 0.0 && center.getLon() == 0)) { -// center = new GeoLatLon(8.134, 1.423); -// } -// map.setCenter(center); -// } -// -// int zoomVal=FacadeProvider.getConfigFacade().getMapZoom(); -// if(zoomVal!=0) { -// map.setZoom(zoomVal); -// } -// -// } - public DashboardMapComponent(DashboardDataProvider dashboardDataProvider) { //super(dashboardDataProvider); super( @@ -680,39 +625,6 @@ private VerticalLayout createLegend() { return legendLayout; } -// @Override -// protected void addComponents() { -// if (dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE) { -// showCases = true; -// caseClassificationOption = MapCaseClassificationOption.ALL_CASES; -// showContacts = false; -// showEvents = false; -// showConfirmedContacts = true; -// showUnconfirmedContacts = true; -// } -// else if (dashboardDataProvider.getDashboardType() == DashboardType.CONTACTS) { -// showCases = false; -// caseClassificationOption = MapCaseClassificationOption.ALL_CASES; -// showContacts = true; -// showEvents = false; -// showConfirmedContacts = true; -// showUnconfirmedContacts = true; -// } -// -// else if (dashboardDataProvider.getDashboardType() == DashboardType.DISEASE) { -// map.setZoom(6); -// showCases = true; -// caseClassificationOption = MapCaseClassificationOption.ALL_CASES; -// showContacts = false; -// showEvents = false; -// showConfirmedContacts = true; -// showUnconfirmedContacts = true; -// } -// hideOtherCountries = false; -// showCurrentEpiSituation = false; -// -// super.addComponents(); -// } private void createPeriodFilters(VerticalLayout layersLayout) { cmbPeriodType = new ComboBox(); @@ -866,8 +778,6 @@ private void updatePeriodFilters() { if (reloadFlag != PeriodFilterReloadFlag.DONT_RELOAD) cmbPeriodFilter.setItems(); - //cmbPeriodFilter.removeAllItems(); - if (periodType == null) { cmbPeriodFilter.setEnabled(false); dateFrom = null; @@ -925,27 +835,6 @@ private void updatePeriodFilters() { cmbPeriodFilter.setValue(cmbPeriodFilter.getData()); } -// protected void refreshMapDashboard(boolean forced) { -// clearRegionShapes(); -// clearCaseMarkers(); -// clearContactMarkers(); -// clearEventMarkers(); -// LeafletMapUtil.clearOtherCountriesOverlay(map); -// -// if (hideOtherCountries) { -// LeafletMapUtil.addOtherCountriesOverlay(map); -// } -// -// Date fromDate = dashboardDataProvider.getFromDate(); -// Date toDate = dashboardDataProvider.getToDate(); -// -// if (showRegions) { -// showRegionsShapes(caseMeasure, fromDate, toDate, dashboardDataProvider.getDisease()); -// } -// -// super.refreshMapDashboard(forced); -// } - @Override protected Long getMarkerCount(Date fromDate, Date toDate, int maxCount) { RegionReferenceDto region = dashboardDataProvider.getRegion(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java index 47cf1f15934..9e3cecd229b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -9,7 +9,6 @@ import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; -import de.symeda.sormas.api.infrastructure.district.DistrictDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; @@ -131,8 +130,6 @@ public void reload() { recoveredCasesCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); recoveredCasesCountColumn.setHeaderCaption("RECOVER COUNT"); - //recoveredCasesCountColumn.setHeaderCaption(makeDIvsNone( "RECOVER COUNT", "#bf8678ba", "#91675d")); - recoveredCasesColumn.setRenderer(new HtmlRenderer()).setWidth(100); recoveredCasesColumn.setHeaderCaption("RECOVER CASES %"); From 0b59f86510aab9a54e7e91051df7c4964b2e28ba Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Thu, 27 Jun 2024 14:18:50 +0000 Subject: [PATCH 34/71] 124 of 124 sonar cloud issues fixed --- .../dashboard/map/DashboardMapComponent.java | 28 ++++--- .../disease/tile/DiseaseTileComponent.java | 80 +------------------ .../tile/RegionalDiseaseBurdenGrid.java | 77 +++--------------- .../builders/SurveillanceEpiCurveBuilder.java | 2 - 4 files changed, 29 insertions(+), 158 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index e677ad21c33..1559d9c69f0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -136,13 +136,10 @@ private enum PeriodFilterReloadFlag { } public DashboardMapComponent(DashboardDataProvider dashboardDataProvider) { - //super(dashboardDataProvider); super( dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE ? Strings.headingCaseStatusMap : Strings.headingContactMap, dashboardDataProvider, null); -// - //this.dashboardDataProvider = dashboardDataProvider; if(dashboardDataProvider.getDashboardType().equals(DashboardType.DISEASE)) { setMargin(false); @@ -233,9 +230,7 @@ public DashboardMapComponent(DashboardDataProvider dashboardDataProvider) { overlayMessageLabel = new Label(); overlayMessageLabel.addStyleNames(CssStyles.ALIGN_CENTER, CssStyles.LABEL_WHITE, CssStyles.LABEL_WHITE_SPACE_NORMAL); - Button button = ButtonHelper.createButton(Captions.showPlacesOnMap, (e) -> { - refreshMapDashboard(true); - }); + Button button = ButtonHelper.createButton(Captions.showPlacesOnMap, (e) -> refreshMapDashboard(true)); overlayLayout = new VerticalLayout(overlayMessageLabel, button); overlayLayout.setStyleName(DashboardCssStyles.MAP_OVERLAY); @@ -250,7 +245,7 @@ public DashboardMapComponent(DashboardDataProvider dashboardDataProvider) { addComponent(mapLayout); setExpandRatio(mapLayout, 1); - addComponent(createFooter()); + addComponent(createMapFooter()); } } @@ -279,7 +274,7 @@ protected void addComponents() { } - private HorizontalLayout createFooter() { + private HorizontalLayout createMapFooter() { HorizontalLayout mapFooterLayout = new HorizontalLayout(); mapFooterLayout.setWidth(100, Unit.PERCENTAGE); mapFooterLayout.setSpacing(true); @@ -790,13 +785,21 @@ private void updatePeriodFilters() { } cmbPeriodFilter.setEnabled(true); -// checks if map has a case before rendering period dropdown - if (mapAndFacilityCases.size() == 0) + + if (mapAndFacilityCases.isEmpty()) return; + List reportedDates = mapAndFacilityCases.stream().map(c -> c.getReportDate()).collect(Collectors.toList()); - Date minDate = reportedDates.stream().min(Date::compareTo).get(); - Date maxDate = reportedDates.stream().max(Date::compareTo).get(); + Optional minDateOptional = reportedDates.stream().min(Date::compareTo); + Optional maxDateOptional = reportedDates.stream().max(Date::compareTo); + + if (!minDateOptional.isPresent() || !maxDateOptional.isPresent()) { + return; + } + + Date minDate = minDateOptional.get(); + Date maxDate = maxDateOptional.get(); List dates; String strDateFormat = ""; @@ -1796,4 +1799,5 @@ private void hideMapOverlay() { overlayBackground.setVisible(false); overlayLayout.setVisible(false); } + } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java index 8121ac00eeb..1643a80848c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java @@ -17,19 +17,11 @@ *******************************************************************************/ package de.symeda.sormas.ui.dashboard.surveillance.components.disease.tile; -import java.util.Date; - import com.vaadin.icons.VaadinIcons; import com.vaadin.shared.ui.ContentMode; -import com.vaadin.ui.Alignment; -import com.vaadin.ui.Button; -import com.vaadin.ui.HorizontalLayout; -import com.vaadin.ui.Label; -import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.*; import com.vaadin.ui.themes.ValoTheme; - import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -49,13 +41,6 @@ public DiseaseTileComponent(DiseaseBurdenDto diseaseBurden,DashboardDataProvider addTopLayout(diseaseBurden.getDisease(), diseaseBurden.getCaseCount(), diseaseBurden.getPreviousCaseCount(), diseaseBurden.getOutbreakDistrictCount() > 0); -// addStatsLayout( -// diseaseBurden.getCaseDeathCount(), -// diseaseBurden.getEventCount(), -// diseaseBurden.getLastReportedDistrictName(), -// diseaseBurden.getDisease()); - - addStatsLayout(diseaseBurden, dashboardDataProvider); } @@ -159,37 +144,12 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo addComponent(layout); } -// private void addStatsLayout(Long fatalities, Long events, String district, Disease disease) { -// VerticalLayout layout = new VerticalLayout(); -// layout.setWidth(100, Unit.PERCENTAGE); -// layout.setMargin(false); -// layout.setSpacing(false); -// layout.addStyleName(CssStyles.BACKGROUND_HIGHLIGHT); -// -// StatsItem lastReportItem = -// new StatsItem.Builder(Captions.dashboardLastReport, district.length() == 0 ? I18nProperties.getString(Strings.none) : district) -// .singleColumn(true) -// .build(); -// lastReportItem.addStyleName(CssStyles.VSPACE_TOP_4); -// layout.addComponent(lastReportItem); -// layout.addComponent(new StatsItem.Builder(Captions.dashboardFatalities, fatalities).critical(fatalities > 0).build()); -// StatsItem noOfEventsItem = new StatsItem.Builder(Captions.DiseaseBurden_eventCount, events).build(); -// noOfEventsItem.addStyleName(CssStyles.VSPACE_4); -// layout.addComponent(noOfEventsItem); -// -// layout.addComponent(addDiseaseButton(disease)); -// -// addComponent(layout); -// } - private void addStatsLayout(DiseaseBurdenDto diseaseBurden,DashboardDataProvider dashboardDataProvider) { Long fatalities = diseaseBurden.getCaseDeathCount(); Long events = diseaseBurden.getEventCount(); String district = diseaseBurden.getLastReportedDistrictName(); Disease disease = diseaseBurden.getDisease(); - Date dateFrom = diseaseBurden.getFrom(); - Date dateTo = diseaseBurden.getTo(); VerticalLayout layout = new VerticalLayout(); layout.setWidth(100, Unit.PERCENTAGE); @@ -202,7 +162,6 @@ private void addStatsLayout(DiseaseBurdenDto diseaseBurden,DashboardDataProvider lastReportItem.addStyleName(CssStyles.VSPACE_TOP_4); layout.addComponent(lastReportItem); - StatsItem fatality = new StatsItem.Builder(Captions.dashboardFatalities, fatalities).critical(fatalities > 0).build(); fatality.addStyleName(CssStyles.HSPACE_LEFT_5); layout.addComponent(fatality); @@ -218,52 +177,15 @@ private void addStatsLayout(DiseaseBurdenDto diseaseBurden,DashboardDataProvider addComponent(layout); } - private HorizontalLayout createStatsItem(String label, String value, boolean isCritical, boolean singleColumn) { - HorizontalLayout layout = new HorizontalLayout(); - layout.setWidth(100, Unit.PERCENTAGE); - layout.setMargin(false); - layout.setSpacing(false); - - Label nameLabel = new Label(label); - CssStyles.style(nameLabel, CssStyles.LABEL_PRIMARY, isCritical ? CssStyles.LABEL_CRITICAL : "", - CssStyles.HSPACE_LEFT_3); - layout.addComponent(nameLabel); - if (!singleColumn) { - layout.setExpandRatio(nameLabel, 1); - } - - Label valueLabel = new Label(value); - CssStyles.style(valueLabel, CssStyles.LABEL_PRIMARY, isCritical ? CssStyles.LABEL_CRITICAL : "", - singleColumn ? CssStyles.HSPACE_LEFT_5 : CssStyles.ALIGN_CENTER); - layout.addComponent(valueLabel); - layout.setExpandRatio(valueLabel, singleColumn ? 1f : 0.65f); - - return layout; - } - private Button addDiseaseButton(Disease diseaseName, DashboardDataProvider dashboardDataProvider) { - Date from =dashboardDataProvider.getFromDate(); - Date to = dashboardDataProvider.getToDate(); - NewDateFilterType type = dashboardDataProvider.getDateFilterType(); - Button diseaseDetailButton = ButtonHelper.createIconButton(null, VaadinIcons.ELLIPSIS_DOTS_H, null, ValoTheme.BUTTON_BORDERLESS, CssStyles.VSPACE_TOP_NONE, CssStyles.VSPACE_4); diseaseDetailButton.setVisible(true); -// diseaseDetailButton.addClickListener( -// click -> ControllerProvider.getDashboardController().navigateToDisease(diseaseName, from,to,type)); diseaseDetailButton.addClickListener( click -> ControllerProvider.getDashboardController().navigateToDisease(diseaseName, dashboardDataProvider)); - - -// Button diseaseDetailButton = ButtonHelper -// .createIconButton(null, VaadinIcons.ELLIPSIS_DOTS_H, null, ValoTheme.BUTTON_BORDERLESS, CssStyles.VSPACE_TOP_NONE, CssStyles.VSPACE_4); -// diseaseDetailButton.setVisible(true); -// layout.addComponent(diseaseDetailButton); -// diseaseDetailButton.addClickListener(click -> ControllerProvider.getDashboardController().navigateToDisease(disease.getName())); - return diseaseDetailButton; } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java index 9e3cecd229b..2c5f46c5cb7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -107,18 +107,13 @@ public void reload() { Long casePercental = dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(); - regionDistrictColumn.setWidth(100); regionDistrictColumn.setHeaderCaption("REGION NAME"); - totalCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); - totalColumn.setRenderer(new HtmlRenderer()).setWidth(100); - - totalColumn.setHeaderCaption("TOTAL %"); activeCaseCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); @@ -141,15 +136,12 @@ public void reload() { deathColumn.setHeaderCaption("DEATH CASES %"); - - otherCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); otherColumn.setRenderer(new HtmlRenderer()).setWidth(100); otherColumn.setHeaderCaption("OTHER CASES %"); - if(dashboardDataProvider.getRegion()!=null) { regionDistrictColumn.setHeaderCaption("DISTRICT NAME"); @@ -158,12 +150,10 @@ public void reload() { String regionUuid=dashboardDataProvider.getRegion().getUuid(); - districtDtoList = FacadeProvider.getDistrictFacade().getAllActiveByRegion(regionUuid); for (DistrictReferenceDto districtDto : districtDtoList){ - DiseaseBurdenDto diseaseBurdenDto = FacadeProvider.getDiseaseFacade().getDiseaseGridForDashboard( null, districtDto, @@ -195,32 +185,28 @@ public void reload() { diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(total), casePercental, "#5a95f4bf","#2f7df9")); - diseaseBurdenDto.setTotalCount(makeDIvsCount(total, "#5a95f4bf","#2f7df9")); + diseaseBurdenDto.setTotalCount(makeDIvsCount(total)); diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(activeCases), casePercental, "#feba0199", "#dfa507")); - diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases, "#feba0199", "#dfa507")); + diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases)); diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(recovered), casePercental, "#00e0a19c", "#038d66")); - diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered, "#00e0a19c", "#038d66")); - + diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered)); diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(deaths), casePercental,"#FFAEAE", "#FF4040")); - diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths,"#FFAEAE", "#FF4040")); - - + diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths)); diseaseBurdenDto.setOther(makeDIvs(Long.parseLong(other), casePercental,"#bf8678ba", "#91675d")); - diseaseBurdenDto.setOtherCount(makeDIvsCount(other,"#bf8678ba", "#91675d")); + diseaseBurdenDto.setOtherCount(makeDIvsCount(other)); diseaseBurdenDtoList.add(diseaseBurdenDto); } }else { - for (RegionDto regionDto : regionDtoList){ DiseaseBurdenDto diseaseBurdenDto = FacadeProvider.getDiseaseFacade().getDiseaseGridForDashboard( regionDto.toReference(), @@ -234,7 +220,6 @@ public void reload() { dashboardDataProvider.getCaseClassification() ); - String total = diseaseBurdenDto.getTotal(); String activeCases = diseaseBurdenDto.getActiveCases(); @@ -245,101 +230,63 @@ public void reload() { String other = diseaseBurdenDto.getOther(); - diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(total), casePercental, "#5a95f4bf","#2f7df9")); - diseaseBurdenDto.setTotalCount(makeDIvsCount(total, "#5a95f4bf","#2f7df9")); + diseaseBurdenDto.setTotalCount(makeDIvsCount(total)); diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(activeCases), casePercental, "#feba0199", "#dfa507")); - diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases, "#feba0199", "#dfa507")); + diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases)); diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(recovered), casePercental, "#00e0a19c", "#038d66")); - diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered, "#00e0a19c", "#038d66")); - + diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered)); diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(deaths), casePercental,"#FFAEAE", "#FF4040")); - diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths,"#FFAEAE", "#FF4040")); - + diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths)); diseaseBurdenDto.setOther(makeDIvs(Long.parseLong(other), casePercental,"#bf8678ba", "#91675d")); - diseaseBurdenDto.setOtherCount(makeDIvsCount(other,"#bf8678ba", "#91675d")); + diseaseBurdenDto.setOtherCount(makeDIvsCount(other)); diseaseBurdenDtoList.add(diseaseBurdenDto); } } - BeanItemContainer container = new BeanItemContainer(DiseaseBurdenDto.class, diseaseBurdenDtoList); + BeanItemContainer container = new BeanItemContainer<>(DiseaseBurdenDto.class, diseaseBurdenDtoList); GeneratedPropertyContainer generatedContainer = new GeneratedPropertyContainer(container); setContainerDataSource(generatedContainer); } public String makeDIvs(long number, long total, String lightColor, String deepColor) { - - - String mainStyle = "text-align: center; height:15px; width: 100%; background:"+lightColor; String progressPercentStyle = "position: absolute; width: 8%; color: #ffffff; font-weight: 700; margin: -1px;"; double regionalTotal = (double)number/total * 100; -// String textColor = regionalTotal > 10 ? "#ffffff" : "#000000"; String textColor = "#ffffff"; String style = "height:15px; width:"+ decimalFormat.format(regionalTotal)+"%; color:"+textColor+"; font-size: 10px;"+"background:"+deepColor; - String content = decimalFormat.format(regionalTotal) +"%"; if (number == 0 && total == 0) { regionalTotal=0.0; return "
" + decimalFormat.format(regionalTotal)+"%
" + element("div" , style, null) + "
"; } -// return "
" + "
"; return "
" + decimalFormat.format(regionalTotal)+"%
" + element("div" , style, null) + "
"; -// return "
" + element("div" , style, content) + "
"; } - public String makeDIvsCount(String num, String lightColor, String deepColor) { - - - -// if (num.equals("0") ) -// return ("0"); + public String makeDIvsCount(String num) { String mainStyle = "text-align: center; height:15px; width: 100%; "; - //+ " background:"+lightColor; - //String progressPercentStyle = "position: absolute; width: 20%; color: #ffffff; font-weight: 700; margin: -1px;"; String regionalTotal = num; -// String textColor = regionalTotal > 10 ? "#ffffff" : "#000000"; - //String textColor = "#ffffff"; - - //String style = "height:15px; width:"+ regionalTotal+"; color:"+textColor+"; font-size: 10px;"+"background:"+deepColor; - //String content = regionalTotal ; - -// return "
" + "
"; return "
" - //+ "
" + regionalTotal+"
"; - //+ element("div" , style, null) + "
"; - -// return "
" + element("div" , style, content) + "
"; - } - - public String makeDIvsNone(String value, String lightColor, String deepColor) { - - String mainStyle = "text-align: center; height:15px; width: 100%; "; - - String regionalTotal = value; - - return "
"+ regionalTotal+"
"; - } public String element(String type, String style, String content) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/SurveillanceEpiCurveBuilder.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/SurveillanceEpiCurveBuilder.java index f56443ff0c6..12e427d46a8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/SurveillanceEpiCurveBuilder.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/SurveillanceEpiCurveBuilder.java @@ -2,8 +2,6 @@ import java.util.Date; import java.util.List; - -import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.dashboard.DashboardCriteria; import de.symeda.sormas.api.dashboard.EpiCurveGrouping; import de.symeda.sormas.api.i18n.Captions; From b419ffe32a743bdf7bd510e1149feaa40fc8efc9 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Thu, 27 Jun 2024 17:25:27 +0000 Subject: [PATCH 35/71] 76 of 76 sonar cloud issues fixed --- .../ui/dashboard/DashboardDataProvider.java | 29 ++++++------------- .../components/DashboardFilterLayout.java | 4 --- .../diseasedetails/DiseaseFilterLayout.java | 4 --- .../map/BaseDashboardMapComponent.java | 13 --------- .../dashboard/map/DashboardMapComponent.java | 26 ++++++++--------- .../ui/dashboard/map/MapCasePeriodOption.java | 1 + .../ui/dashboard/map/MapPeriodType.java | 2 +- .../SurveillanceDashboardView.java | 10 ------- .../components/SurveillanceFilterLayout.java | 8 ----- .../tile/RegionalDiseaseBurdenGrid.java | 3 +- 10 files changed, 24 insertions(+), 76 deletions(-) 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 4a41fa2829d..692896ede14 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 @@ -17,32 +17,21 @@ *******************************************************************************/ package de.symeda.sormas.ui.dashboard; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import de.symeda.sormas.api.dashboard.*; -import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; -import de.symeda.sormas.api.infrastructure.region.RegionDto; -import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; -import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.api.utils.criteria.CriteriaDateType; -import org.apache.commons.lang3.time.DateUtils; - import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseReferenceDefinition; import de.symeda.sormas.api.caze.NewCaseDateType; +import de.symeda.sormas.api.dashboard.*; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.event.EventStatus; import de.symeda.sormas.api.outbreak.OutbreakCriteria; - -import de.symeda.sormas.api.sample.DashboardTestResultDto; import de.symeda.sormas.api.sample.PathogenTestResultType; +import de.symeda.sormas.api.utils.DateHelper; +import org.apache.commons.lang3.time.DateUtils; + +import java.util.*; +import java.util.function.Predicate; +import java.util.stream.Collectors; // FIXME: 06/08/2020 this should be refactored into two specific data providers for case and contact dashboards public class DashboardDataProvider extends AbstractDashboardDataProvider { @@ -235,12 +224,12 @@ public void refreshDataForSelectedDisease() { setEvents(FacadeProvider.getDashboardFacade().getNewEvents(eventDashboardCriteria)); setEventCountByStatus(FacadeProvider.getDashboardFacade().getEventCountByStatus(eventDashboardCriteria)); - Long outbreakDistrictCount = FacadeProvider.getOutbreakFacade() + Long districtOutbreakCount = FacadeProvider.getOutbreakFacade() .getOutbreakDistrictCount( new OutbreakCriteria().region(region).district(district).disease(disease) .reportedBetween(fromDate, toDate)); - setOutbreakDistrictCount(outbreakDistrictCount); + setOutbreakDistrictCount(districtOutbreakCount); refreshDataForQuarantinedCases(); refreshDataForConvertedContactsToCase(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java index 7fc0ac67bc8..633470c8fb5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java @@ -615,10 +615,6 @@ private void updateComparisonDates() { } } - public void setInfoLabelText(String text) { - infoLabel.setDescription(text); - } - public void setCriteria(DashboardCriteria criteria) { regionFilter.setValue(criteria.getRegion()); caseClassificationFilter.setValue(criteria.getCaseClassification()); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java index d39d1f320e0..7e69137efd1 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java @@ -23,10 +23,6 @@ public DiseaseFilterLayout(DiseaseDetailsView dashboardView, DashboardDataProvid super(dashboardView, dashboardDataProvider,DISEASE_FILTERS); } - @Override - public void populateLayout() { - - } @Override public void setCriteria(DashboardCriteria criteria) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java index 252d45ded15..e5f195d8c1d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java @@ -84,18 +84,6 @@ public BaseDashboardMapComponent(String headingStringTag, P dashboardDataProvide } } -// public BaseDashboardMapComponent(P dashboardDataProvider) { -// -// setMargin(false); -// setSpacing(false); -// setSizeFull(); -// -// this.setMargin(true); -// this.dashboardDataProvider = dashboardDataProvider; -// -// } - - protected static HorizontalLayout buildMarkerLegendEntry(MarkerIcon icon, String labelCaption) { return buildLegendEntry(new Label(icon.getHtmlElement("16px"), ContentMode.HTML), labelCaption); } @@ -110,7 +98,6 @@ protected void refreshMap(boolean forced) { count = getMarkerCount(fromDate, toDate, maxDisplayCount); } - if (!forced && maxDisplayCount >= 0 && count > maxDisplayCount) { showMapOverlay(maxDisplayCount); } else { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index 1559d9c69f0..4f4eeb47ed3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -119,8 +119,6 @@ public class DashboardMapComponent extends BaseDashboardMapComponent externalExpandListener; private boolean emptyPopulationDistrictPresent; - //private LeafletMap map; - private MapCasePeriodOption mapCasePeriodOption; private Label overlayMessageLabel; @@ -213,7 +211,7 @@ public DashboardMapComponent(DashboardDataProvider dashboardDataProvider) { this.setMargin(true); // Add components - addComponent(createHeader()); + addComponent(createMapHeader()); CssLayout mapLayout = new CssLayout(); mapLayout.setSizeFull(); @@ -282,7 +280,7 @@ private HorizontalLayout createMapFooter() { // Map key dropdown button legendDropdown = ButtonHelper.createPopupButton(Captions.dashboardMapKey, null, CssStyles.BUTTON_SUBTLE); - legendDropdown.setContent(createLegend()); + legendDropdown.setContent(createMapLegend()); mapFooterLayout.addComponent(legendDropdown); mapFooterLayout.setComponentAlignment(legendDropdown, Alignment.MIDDLE_RIGHT); @@ -472,7 +470,7 @@ private HorizontalLayout createMapFooter() { return mapFooterLayout; } - private VerticalLayout createLegend() { + private VerticalLayout createMapLegend() { VerticalLayout legendLayout = new VerticalLayout(); legendLayout.setSpacing(false); legendLayout.setMargin(true); @@ -702,8 +700,8 @@ private void createPeriodFilters(VerticalLayout layersLayout) { //disable arrow buttons if date is first or last item in the dropdown int curDateIndex = ((List) cmbPeriodFilter.getValue()).indexOf(date); - Boolean hasNextDate = ((List) cmbPeriodFilter.getValue()).size() > 0 && curDateIndex < ((List)cmbPeriodFilter.getValue()).size() - 1; - Boolean hasPrevDate = ((List)cmbPeriodFilter.getValue()).size() > 0 && curDateIndex > 0; + Boolean hasNextDate = !((List) cmbPeriodFilter.getValue()).isEmpty() && curDateIndex < ((List)cmbPeriodFilter.getValue()).size() - 1; + Boolean hasPrevDate = !((List)cmbPeriodFilter.getValue()).isEmpty() && curDateIndex > 0; btnBack.setEnabled(hasPrevDate); btnForward.setEnabled(hasNextDate); @@ -712,8 +710,8 @@ private void createPeriodFilters(VerticalLayout layersLayout) { refreshMapDashboard(); }); cmbPeriodFilter.addValueChangeListener(e -> { - cmbPeriodFilter.setEnabled(((List)cmbPeriodFilter.getValue()).size() > 0); - btnForward.setEnabled(((List)cmbPeriodFilter.getValue()).size() > 0); + cmbPeriodFilter.setEnabled(!((List)cmbPeriodFilter.getValue()).isEmpty()); + btnForward.setEnabled(!((List)cmbPeriodFilter.getValue()).isEmpty()); }); CssStyles.style(btnBack, ValoTheme.BUTTON_BORDERLESS); @@ -1072,7 +1070,7 @@ protected void addLayerOptions(VerticalLayout layersLayout) { layersLayout.addComponent(showCurrentEpiSituationCB); } - private HorizontalLayout createHeader() { + private HorizontalLayout createMapHeader() { HorizontalLayout mapHeaderLayout = new HorizontalLayout(); mapHeaderLayout.setWidth(100, Unit.PERCENTAGE); mapHeaderLayout.setSpacing(true); @@ -1776,9 +1774,9 @@ private void refreshMapDashboard(boolean forced) { } if(dashboardDataProvider.getDashboardType().equals(DashboardType.DISEASE)) { if (!forced && maxDisplayCount >= 0 && count > maxDisplayCount) { - showMapOverlay(maxDisplayCount); + makeMapOverlayVisible(maxDisplayCount); } else { - hideMapOverlay(); + makeMapOverlayInvisible(); loadMapData(fromDate, toDate); } @@ -1789,13 +1787,13 @@ public void refreshMapDashboard() { refreshMapDashboard(false); } - private void showMapOverlay(int maxCount) { + private void makeMapOverlayVisible(int maxCount) { overlayBackground.setVisible(true); overlayLayout.setVisible(true); overlayMessageLabel.setValue(String.format(I18nProperties.getString(Strings.warningDashboardMapTooManyMarkers), maxCount)); } - private void hideMapOverlay() { + private void makeMapOverlayInvisible() { overlayBackground.setVisible(false); overlayLayout.setVisible(false); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java index 72b0ec567ba..5324ed8d4a4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java @@ -8,6 +8,7 @@ public enum MapCasePeriodOption { NEW_CASES, CASES_INCIDENCE; + @Override public String toString() { return I18nProperties.getEnumCaption(this); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java index 442e496ac16..610f827a379 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java @@ -29,6 +29,6 @@ public enum MapPeriodType { public String toString() { return I18nProperties.getEnumCaption(this); - }; + } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java index ace21a00fe8..333233b701b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java @@ -17,14 +17,11 @@ *******************************************************************************/ package de.symeda.sormas.ui.dashboard.surveillance; -import com.vaadin.navigator.ViewChangeListener; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.NewCaseDateType; -import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.ui.dashboard.AbstractDashboardView; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.DashboardType; -import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; import de.symeda.sormas.ui.dashboard.surveillance.components.SurveillanceFilterLayout; @SuppressWarnings("serial") @@ -85,13 +82,6 @@ public SurveillanceDashboardView() { }); } - -// @Override -// public void enter(ViewChangeListener.ViewChangeEvent event) { -// filterLayout.reload(event); -// refreshDiseaseData(); -// } - public void refreshDashboard() { dashboardDataProvider.refreshData(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java index f7b8b6afc14..4fe0ac79973 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java @@ -39,14 +39,6 @@ public void addDateTypeValueChangeListener(Property.ValueChangeListener listener dateTypeSelectorComponent.addValueChangeListener(listener); } -// private void createDateTypeSelectorFilter() { -// dateTypeSelectorComponent = -// new DateTypeSelectorComponent.Builder<>(NewCaseDateType.class).dateTypePrompt(I18nProperties.getString(Strings.promptNewCaseDateType)) -// .build(); -// dateTypeSelectorComponent.setValue(NewCaseDateType.MOST_RELEVANT); -// addCustomComponent(dateTypeSelectorComponent, DATE_TYPE_SELECTOR_FILTER); -// } - private void createDateTypeSelectorFilter() { dateTypeSelectorComponent = new DateTypeSelectorComponent.Builder<>(NewCaseDateType.class).dateTypePrompt(I18nProperties.getString(Strings.promptNewCaseDateType)) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java index 2c5f46c5cb7..0c6630c7efa 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -21,7 +21,6 @@ public class RegionalDiseaseBurdenGrid extends Grid { private final DashboardDataProvider dashboardDataProvider; private final List regionDtoList; - private List districtDtoList; Grid.Column regionDistrictColumn; @@ -150,7 +149,7 @@ public void reload() { String regionUuid=dashboardDataProvider.getRegion().getUuid(); - districtDtoList = FacadeProvider.getDistrictFacade().getAllActiveByRegion(regionUuid); + List districtDtoList = FacadeProvider.getDistrictFacade().getAllActiveByRegion(regionUuid); for (DistrictReferenceDto districtDto : districtDtoList){ From 0af7215d08091cc7a1f93c470582b3c799b24df7 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Thu, 27 Jun 2024 20:53:29 +0000 Subject: [PATCH 36/71] writing test cases and fixing duplicates --- .../ui/dashboard/DashboardDataProvider.java | 25 +-- .../tile/RegionalDiseaseBurdenGrid.java | 13 +- .../disease/DiseaseDashboardServiceTest.java | 156 ++++++++++++++++++ 3 files changed, 164 insertions(+), 30 deletions(-) create mode 100644 sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java 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 692896ede14..3d19235cd89 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 @@ -411,30 +411,7 @@ public CaseClassification getCaseClassification() { public void setCaseClassification(CaseClassification caseClassification) { this.caseClassification = caseClassification; } - @Override - public NewDateFilterType getDateFilterType() { - if (dateFilterType == NewDateFilterType.TODAY) { - setFromDate(DateHelper.getStartOfDay(new Date())); - setToDate(new Date()); - } - if (dateFilterType == NewDateFilterType.YESTERDAY) { - setFromDate(DateHelper.getStartOfDay(DateHelper.subtractDays(new Date(), 1))); - setToDate(DateHelper.getEndOfDay(DateHelper.subtractDays(new Date(), 1))); - } - if (dateFilterType == NewDateFilterType.THIS_WEEK) { - setFromDate(DateHelper.getStartOfWeek(new Date())); - setToDate(new Date()); - } - if (dateFilterType == NewDateFilterType.LAST_WEEK) { - setFromDate(DateHelper.getStartOfWeek(DateHelper.subtractWeeks(new Date(), 1))); - setToDate(DateHelper.getEndOfWeek(DateHelper.subtractWeeks(new Date(), 1))); - } - if (dateFilterType == NewDateFilterType.THIS_YEAR) { - setFromDate(DateHelper.getStartOfWeek(DateHelper.getStartOfYear(new Date()))); - setToDate(new Date()); - } - return dateFilterType; - } + @Override public void setDateFilterType(NewDateFilterType dateFilterType) { this.dateFilterType = dateFilterType; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java index 0c6630c7efa..faccf98b67c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -259,7 +259,7 @@ public void reload() { } public String makeDIvs(long number, long total, String lightColor, String deepColor) { - + String endDiv = "
"; String mainStyle = "text-align: center; height:15px; width: 100%; background:"+lightColor; String progressPercentStyle = "position: absolute; width: 8%; color: #ffffff; font-weight: 700; margin: -1px;"; double regionalTotal = (double)number/total * 100; @@ -270,22 +270,23 @@ public String makeDIvs(long number, long total, String lightColor, String deepCo if (number == 0 && total == 0) { regionalTotal=0.0; return "
" - + decimalFormat.format(regionalTotal)+"%
" - + element("div" , style, null) + "
"; + + decimalFormat.format(regionalTotal)+"% "+endDiv + + element("div" , style, null) + endDiv; } return "
" - + decimalFormat.format(regionalTotal)+"%
" - + element("div" , style, null) + "
"; + + decimalFormat.format(regionalTotal)+"% "+endDiv + + element("div" , style, null) + endDiv; } public String makeDIvsCount(String num) { + String endDiv = "
"; String mainStyle = "text-align: center; height:15px; width: 100%; "; String regionalTotal = num; return "
" - + regionalTotal+"
"; + + regionalTotal+endDiv; } public String element(String type, String style, String content) { diff --git a/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java b/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java new file mode 100644 index 00000000000..c51c0a8ad55 --- /dev/null +++ b/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java @@ -0,0 +1,156 @@ +package de.symeda.sormas.ui.dashboard.disease; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import de.symeda.sormas.api.caze.CaseOutcome; +import de.symeda.sormas.api.caze.NewCaseDateType; +import de.symeda.sormas.backend.disease.DiseaseConfigurationFacadeEjb; +import de.symeda.sormas.backend.disease.DiseaseFacadeEjb; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.dashboard.DashboardCriteria; +import de.symeda.sormas.api.disease.DiseaseBurdenDto; +import de.symeda.sormas.api.event.EventCriteria; +import de.symeda.sormas.api.feature.FeatureType; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionDto; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.outbreak.OutbreakCriteria; +import de.symeda.sormas.api.utils.criteria.CriteriaDateType; +import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal; +import de.symeda.sormas.backend.dashboard.DashboardService; +import de.symeda.sormas.backend.event.EventFacadeEjb.EventFacadeEjbLocal; +import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb; +import de.symeda.sormas.backend.infrastructure.district.District; +import de.symeda.sormas.backend.infrastructure.region.RegionFacadeEjb.RegionFacadeEjbLocal; +import de.symeda.sormas.backend.outbreak.OutbreakFacadeEjb.OutbreakFacadeEjbLocal; +import de.symeda.sormas.backend.person.PersonFacadeEjb.PersonFacadeEjbLocal; + +public class DiseaseDashboardServiceTest { + + @Mock + private CaseFacadeEjbLocal caseFacade; + + @Mock + private EventFacadeEjbLocal eventFacade; + + @Mock + private OutbreakFacadeEjbLocal outbreakFacade; + + @Mock + private PersonFacadeEjbLocal personFacade; + + @Mock + private DiseaseConfigurationFacadeEjb.DiseaseConfigurationFacadeEjbLocal diseaseConfigurationFacade; + + @Mock + private RegionFacadeEjbLocal regionFacade; + + @Mock + private DashboardService dashboardService; + + @Mock + private FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal featureConfigurationFacade; + + @InjectMocks + private DiseaseFacadeEjb diseaseFacade; + + @BeforeEach + public void setUp() { + MockitoAnnotations.openMocks(this); + } + + @Test + public void testGetDiseaseForDashboard() { + RegionReferenceDto region = new RegionReferenceDto(); + DistrictReferenceDto district = new DistrictReferenceDto(); + Disease disease = Disease.CORONAVIRUS; + Date fromDate = new Date(); + Date toDate = new Date(); + Date previousFrom = new Date(); + Date previousTo = new Date(); + CriteriaDateType newCaseDateType = NewCaseDateType.MOST_RELEVANT; + CaseClassification caseClassification = null; + + // Mocking responses for dashboardService, eventFacade, outbreakFacade, etc. + Map newCases = new HashMap<>(); + newCases.put(disease, 8L); + when(dashboardService.getCaseCountByDisease(any(DashboardCriteria.class))).thenReturn(newCases); + + Map events = new HashMap<>(); + events.put(disease, 5L); + when(eventFacade.getEventCountByDisease(any(EventCriteria.class))).thenReturn(events); + + Map outbreakDistricts = new HashMap<>(); + outbreakDistricts.put(disease, new District()); + when(outbreakFacade.getOutbreakDistrictNameByDisease(any(OutbreakCriteria.class))).thenReturn(outbreakDistricts); + + Map lastReportedDistricts = new HashMap<>(); + lastReportedDistricts.put(disease, new District()); + when(dashboardService.getLastReportedDistrictByDisease(any(DashboardCriteria.class))).thenReturn(lastReportedDistricts); + + Map caseFatalities = new HashMap<>(); + caseFatalities.put(disease, 1L); + when(dashboardService.getDeathCountByDisease(any(DashboardCriteria.class))).thenReturn(caseFatalities); + + Map previousCases = new HashMap<>(); + previousCases.put(disease, 8L); + when(dashboardService.getCaseCountByDisease(any(DashboardCriteria.class))).thenReturn(previousCases); + + // Invoke the method under test + DiseaseBurdenDto result = diseaseFacade.getDiseaseForDashboard( + region, district, disease, fromDate, toDate, previousFrom, previousTo, newCaseDateType, caseClassification); + + // Assert expected results + assertEquals(8L, result.getCaseCount()); + assertEquals(8L, result.getPreviousCaseCount()); + assertEquals(5L, result.getEventCount()); + assertNull(result.getOutbreakDistrict()); + assertEquals(1L, result.getCaseDeathCount()); + assertEquals(Disease.CORONAVIRUS, result.getDisease()); + + } + @Test + public void testGetDiseaseGridForDashboard() { + RegionReferenceDto region = new RegionReferenceDto(); + DistrictReferenceDto district = new DistrictReferenceDto(); + Disease disease = Disease.CORONAVIRUS; + Date fromDate = new Date(); + Date toDate = new Date(); + Date previousFrom = new Date(); + Date previousTo = new Date(); + CriteriaDateType newCaseDateType = NewCaseDateType.MOST_RELEVANT; + CaseClassification caseClassification = null; + + RegionDto regionDto = new RegionDto(); + Map allCasesFetched = new HashMap<>(); + allCasesFetched.put(disease, 15L); + Map caseFatalities = new HashMap<>(); + caseFatalities.put(disease, 2L); + + when(regionFacade.getByUuid(region.getUuid())).thenReturn(regionDto); + when(dashboardService.getCaseCountByDisease(any(DashboardCriteria.class))) + .thenReturn(allCasesFetched); + when(dashboardService.getDeathCountByDisease(any(DashboardCriteria.class))) + .thenReturn(caseFatalities); + + DiseaseBurdenDto result = diseaseFacade.getDiseaseGridForDashboard( + region, district, disease, fromDate, toDate, previousFrom, previousTo, newCaseDateType, caseClassification); + + assertEquals("15", result.getTotal()); + assertEquals("2", result.getDeaths()); + } +} From 4e769d369fce44fa8bcf0fc91f596fa04be8be19 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Fri, 28 Jun 2024 05:22:25 +0000 Subject: [PATCH 37/71] fix for duplicates and uncovered methods - sonar cloud --- .../api/outbreak/OutbreakCriteriaTest.java | 101 ++++++++++++++++++ .../backend/dashboard/DashboardService.java | 42 ++------ .../sormas/backend/AbstractBeanTest.java | 4 + .../outbreak/OutbreakFacadeEjbTest.java | 72 ++++++++++++- .../tile/RegionalDiseaseBurdenGrid.java | 18 ++-- 5 files changed, 199 insertions(+), 38 deletions(-) create mode 100644 sormas-api/src/test/java/de/symeda/sormas/api/outbreak/OutbreakCriteriaTest.java diff --git a/sormas-api/src/test/java/de/symeda/sormas/api/outbreak/OutbreakCriteriaTest.java b/sormas-api/src/test/java/de/symeda/sormas/api/outbreak/OutbreakCriteriaTest.java new file mode 100644 index 00000000000..f5886d43d1f --- /dev/null +++ b/sormas-api/src/test/java/de/symeda/sormas/api/outbreak/OutbreakCriteriaTest.java @@ -0,0 +1,101 @@ +package de.symeda.sormas.api.outbreak; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import org.junit.jupiter.api.Test; + +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.*; + +public class OutbreakCriteriaTest { + + @Test + public void testSetAndGetRegion() { + RegionReferenceDto region = new RegionReferenceDto(); + OutbreakCriteria criteria = new OutbreakCriteria().region(region); + assertEquals(region, criteria.getRegion()); + } + + @Test + public void testSetAndGetDistrict() { + DistrictReferenceDto district = new DistrictReferenceDto(); + OutbreakCriteria criteria = new OutbreakCriteria().district(district); + assertEquals(district, criteria.getDistrict()); + } + + @Test + public void testSetAndGetDiseases() { + Set diseases = new HashSet<>(); + diseases.add(Disease.CORONAVIRUS); + OutbreakCriteria criteria = new OutbreakCriteria().diseases(diseases); + assertEquals(diseases, criteria.getDiseases()); + } + + @Test + public void testSetAndGetDisease() { + Disease disease = Disease.CORONAVIRUS; + OutbreakCriteria criteria = new OutbreakCriteria().disease(disease); + assertEquals(Collections.singleton(disease), criteria.getDiseases()); + } + + @Test + public void testSetAndGetActive() { + OutbreakCriteria criteria = new OutbreakCriteria().active(true); + assertTrue(criteria.getActive()); + criteria.active(false); + assertFalse(criteria.getActive()); + } + + @Test + public void testSetAndGetActiveWithDates() { + Date lower = new Date(); + Date upper = new Date(); + OutbreakCriteria criteria = new OutbreakCriteria().active(true, lower, upper); + assertTrue(criteria.getActive()); + assertEquals(lower, criteria.getActiveLower()); + assertEquals(upper, criteria.getActiveUpper()); + } + + @Test + public void testSetAndGetChangeDateAfter() { + Date changeDate = new Date(); + OutbreakCriteria criteria = new OutbreakCriteria().changeDateAfter(changeDate); + assertEquals(changeDate, criteria.getChangeDateAfter()); + } + + @Test + public void testSetAndGetReportedBetween() { + Date reportedFrom = new Date(); + Date reportedTo = new Date(); + OutbreakCriteria criteria = new OutbreakCriteria().reportedBetween(reportedFrom, reportedTo); + assertEquals(reportedFrom, criteria.getReportedDateFrom()); + assertEquals(reportedTo, criteria.getReportedDateTo()); + } + + @Test + public void testSetAndGetReportedDateFrom() { + Date reportedFrom = new Date(); + OutbreakCriteria criteria = new OutbreakCriteria().reportedDateFrom(reportedFrom); + assertEquals(reportedFrom, criteria.getReportedDateFrom()); + } + + @Test + public void testSetAndGetReportedDateTo() { + Date reportedTo = new Date(); + OutbreakCriteria criteria = new OutbreakCriteria().reportedDateTo(reportedTo); + assertEquals(reportedTo, criteria.getReportedDateTo()); + } + + @Test + public void testSetAndGetCaseClassification() { + CaseClassification caseClassification = CaseClassification.CONFIRMED; + OutbreakCriteria criteria = new OutbreakCriteria().caseClassification(caseClassification); + assertEquals(caseClassification, criteria.getCaseClassification()); + } +} \ No newline at end of file diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java index d3077155d8f..a29b0c25fb9 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java @@ -1,30 +1,5 @@ package de.symeda.sormas.backend.dashboard; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import javax.ejb.EJB; -import javax.ejb.LocalBean; -import javax.ejb.Stateless; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Expression; -import javax.persistence.criteria.From; -import javax.persistence.criteria.Join; -import javax.persistence.criteria.JoinType; -import javax.persistence.criteria.Order; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; - -import org.apache.commons.lang3.StringUtils; - import de.symeda.sormas.api.CountryHelper; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; @@ -37,11 +12,7 @@ import de.symeda.sormas.api.sample.PathogenTestResultType; import de.symeda.sormas.api.sample.SpecimenCondition; import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.backend.caze.Case; -import de.symeda.sormas.backend.caze.CaseJoins; -import de.symeda.sormas.backend.caze.CaseQueryContext; -import de.symeda.sormas.backend.caze.CaseService; -import de.symeda.sormas.backend.caze.CaseUserFilterCriteria; +import de.symeda.sormas.backend.caze.*; import de.symeda.sormas.backend.common.AbstractDomainObject; import de.symeda.sormas.backend.common.ConfigFacadeEjb; import de.symeda.sormas.backend.event.Event; @@ -54,11 +25,20 @@ import de.symeda.sormas.backend.location.Location; import de.symeda.sormas.backend.person.Person; import de.symeda.sormas.backend.sample.Sample; -import de.symeda.sormas.backend.sample.SampleService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.util.JurisdictionHelper; import de.symeda.sormas.backend.util.ModelConstants; import de.symeda.sormas.backend.util.QueryHelper; +import org.apache.commons.lang3.StringUtils; + +import javax.ejb.EJB; +import javax.ejb.LocalBean; +import javax.ejb.Stateless; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.criteria.*; +import java.util.*; +import java.util.stream.Collectors; import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java index a8dcfb20fbf..5dbe7797b2d 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java @@ -34,6 +34,7 @@ import javax.persistence.EntityManager; import javax.persistence.Query; +import de.symeda.sormas.backend.outbreak.OutbreakService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -656,6 +657,9 @@ public OutbreakFacade getOutbreakFacade() { return getBean(OutbreakFacadeEjbLocal.class); } + public OutbreakService getOutbreakService() { + return getBean(OutbreakService.class); + } public ImportFacade getImportFacade() { return getBean(ImportFacadeEjbLocal.class); } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java index 1d7f3ec9664..3c81f11f8a9 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java @@ -22,10 +22,15 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; +import de.symeda.sormas.backend.infrastructure.district.District; +import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import de.symeda.sormas.api.Disease; @@ -34,11 +39,22 @@ import de.symeda.sormas.api.outbreak.OutbreakDto; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator.RDCF; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import javax.persistence.EntityManager; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; public class OutbreakFacadeEjbTest extends AbstractBeanTest { private RDCF rdcf; + @InjectMocks + private OutbreakFacadeEjb outbreakFacade; + @Override public void init() { super.init(); @@ -103,4 +119,58 @@ public void testGetActiveOutbreaksWhenOneHasCaseSurveillanceEnabledFalse() { assertFalse(outbreakDiseases.contains(Disease.AFP)); assertTrue(outbreakDiseases.contains(Disease.CHOLERA)); } + + @Test + public void testGetOutbreakDistrictNameByDisease() { + + Map mockMap = new HashMap<>(); + Disease disease1 = Disease.EVD; + District district1 = new District(); + Disease disease2 = Disease.CHOLERA; + District district2 = new District(); + + mockMap.put(disease1, district1); + mockMap.put(disease2, district2); + + when(getOutbreakService().getOutbreakDistrictNameByDisease(any(OutbreakCriteria.class))) + .thenReturn(mockMap); + + Map result = outbreakFacade.getOutbreakDistrictNameByDisease(new OutbreakCriteria()); + + assertEquals(mockMap, result); + } + + @Test + public void testGetOutbreakDistrictCountByDisease() { + + Map mockMap = new HashMap<>(); + Disease disease1 = Disease.EVD; + Long count1 = 10L; + Disease disease2 = Disease.CHOLERA; + Long count2 = 5L; + + mockMap.put(disease1, count1); + mockMap.put(disease2, count2); + + when(getOutbreakService().getOutbreakDistrictCountByDisease(any(OutbreakCriteria.class))) + .thenReturn(mockMap); + + Map result = getOutbreakFacade().getOutbreakDistrictCountByDisease(new OutbreakCriteria()); + + assertEquals(mockMap, result); + } + + @Test + public void testGetOutbreakDistrictCount() { + + Long expectedCount = 15L; + + when(getOutbreakService().getOutbreakDistrictCount(any(OutbreakCriteria.class))) + .thenReturn(expectedCount); + + Long result = getOutbreakFacade().getOutbreakDistrictCount(new OutbreakCriteria()); + + assertEquals(expectedCount, result); + } + } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java index faccf98b67c..f80611a2504 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -259,33 +259,39 @@ public void reload() { } public String makeDIvs(long number, long total, String lightColor, String deepColor) { + String endDiv = " "; + String divWithStyleAttr="
" + return divWithStyleAttr+mainStyle+"; font-size: 11px; font-weight: 700; color:"+textColor+" '>" + decimalFormat.format(regionalTotal)+"% "+endDiv - + element("div" , style, null) + endDiv; + + element( div, style, null) + endDiv; } - return "
" + + return divWithStyleAttr+mainStyle+"'>
" + decimalFormat.format(regionalTotal)+"% "+endDiv - + element("div" , style, null) + endDiv; + + element(div , style, null) + endDiv; } public String makeDIvsCount(String num) { String endDiv = "
"; + String divWithStyleAttr="
" + return divWithStyleAttr+mainStyle+"'>" + regionalTotal+endDiv; } From 06675c603e18599843bb952a2d76840d7b5dfd3b Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Fri, 28 Jun 2024 13:30:29 +0000 Subject: [PATCH 38/71] test case fix on outbreakFacadeEjbTest --- .../outbreak/OutbreakFacadeEjbTest.java | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java index 3c81f11f8a9..96f6a50b20a 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java @@ -123,54 +123,54 @@ public void testGetActiveOutbreaksWhenOneHasCaseSurveillanceEnabledFalse() { @Test public void testGetOutbreakDistrictNameByDisease() { - Map mockMap = new HashMap<>(); Disease disease1 = Disease.EVD; - District district1 = new District(); - Disease disease2 = Disease.CHOLERA; - District district2 = new District(); + Disease disease2 = Disease.ADENOVIRUS; + Disease disease3 = Disease.C_PNEUMONIAE; - mockMap.put(disease1, district1); - mockMap.put(disease2, district2); + DistrictReferenceDto district = new DistrictReferenceDto(rdcf.district.getUuid(), null, null); + getOutbreakFacade().startOutbreak(district, disease1); + getOutbreakFacade().startOutbreak(district, disease2); + getOutbreakFacade().startOutbreak(district, disease3); - when(getOutbreakService().getOutbreakDistrictNameByDisease(any(OutbreakCriteria.class))) - .thenReturn(mockMap); + OutbreakCriteria outbreakCriteria = new OutbreakCriteria().district(district); - Map result = outbreakFacade.getOutbreakDistrictNameByDisease(new OutbreakCriteria()); + Map result =getOutbreakService().getOutbreakDistrictNameByDisease(outbreakCriteria); - assertEquals(mockMap, result); + assertEquals(3, result.size()); + Set resultDiseases = result.keySet(); + assertTrue(resultDiseases.contains(disease1)); + assertTrue(resultDiseases.contains(disease2)); } @Test public void testGetOutbreakDistrictCountByDisease() { - Map mockMap = new HashMap<>(); - Disease disease1 = Disease.EVD; - Long count1 = 10L; - Disease disease2 = Disease.CHOLERA; - Long count2 = 5L; + Disease disease1 = Disease.ADENOVIRUS; + Disease disease2 = Disease.ANTHRAX; - mockMap.put(disease1, count1); - mockMap.put(disease2, count2); + DistrictReferenceDto district = new DistrictReferenceDto(rdcf.district.getUuid(), null, null); + getOutbreakFacade().startOutbreak(district, disease1); + getOutbreakFacade().startOutbreak(district, disease2); - when(getOutbreakService().getOutbreakDistrictCountByDisease(any(OutbreakCriteria.class))) - .thenReturn(mockMap); + Set diseases = new HashSet<>(); + OutbreakCriteria outbreakCriteria = new OutbreakCriteria().diseases(diseases); - Map result = getOutbreakFacade().getOutbreakDistrictCountByDisease(new OutbreakCriteria()); + Map result = getOutbreakFacade().getOutbreakDistrictCountByDisease(outbreakCriteria); - assertEquals(mockMap, result); + assertEquals(2, result.size()); } @Test public void testGetOutbreakDistrictCount() { - Long expectedCount = 15L; + Disease disease1 = Disease.ADENOVIRUS; - when(getOutbreakService().getOutbreakDistrictCount(any(OutbreakCriteria.class))) - .thenReturn(expectedCount); - - Long result = getOutbreakFacade().getOutbreakDistrictCount(new OutbreakCriteria()); + DistrictReferenceDto district = new DistrictReferenceDto(rdcf.district.getUuid(), null, null); + getOutbreakFacade().startOutbreak(district, disease1); + OutbreakCriteria outbreakCriteria= new OutbreakCriteria().district(district); + Long result = getOutbreakFacade().getOutbreakDistrictCount(outbreakCriteria); - assertEquals(expectedCount, result); + assertEquals(1, result); } } From e501d76145f61c9fc32b41824ec485892ffe7f26 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Fri, 28 Jun 2024 20:04:53 +0000 Subject: [PATCH 39/71] additional test cases for disease facade --- .../sormas/backend/AbstractBeanTest.java | 7 + .../backend/disease/DiseaseFacadeEjbTest.java | 127 ++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java index 5dbe7797b2d..bb84f5a24f5 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java @@ -34,6 +34,8 @@ import javax.persistence.EntityManager; import javax.persistence.Query; +import de.symeda.sormas.api.disease.DiseaseFacade; +import de.symeda.sormas.backend.disease.DiseaseFacadeEjb; import de.symeda.sormas.backend.outbreak.OutbreakService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; @@ -1091,4 +1093,9 @@ public SelfReportFacadeEjbLocal getSelfReportFacade() { public SelfReportService getSelfReportService() { return getBean(SelfReportService.class); } + + public DiseaseFacade getDiseaseFacade() { + return getBean(DiseaseFacadeEjb.DiseaseFacadeEjbLocal.class); + } + } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java new file mode 100644 index 00000000000..bf872110ecf --- /dev/null +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java @@ -0,0 +1,127 @@ +package de.symeda.sormas.backend.disease; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.NewCaseDateType; +import de.symeda.sormas.api.dashboard.DashboardCriteria; +import de.symeda.sormas.api.disease.DiseaseBurdenDto; +import de.symeda.sormas.api.event.EventCriteria; +import de.symeda.sormas.api.event.EventFacade; +import de.symeda.sormas.api.feature.FeatureConfigurationFacade; +import de.symeda.sormas.api.feature.FeatureType; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionFacade; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.outbreak.OutbreakCriteria; +import de.symeda.sormas.api.outbreak.OutbreakFacade; +import de.symeda.sormas.api.user.DefaultUserRole; +import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.api.user.UserReferenceDto; +import de.symeda.sormas.api.utils.criteria.CriteriaDateType; +import de.symeda.sormas.backend.AbstractBeanTest; +import de.symeda.sormas.backend.TestDataCreator; +import de.symeda.sormas.backend.dashboard.DashboardService; +import de.symeda.sormas.backend.infrastructure.district.District; +import org.junit.Before; +import org.junit.jupiter.api.Test; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.when; + +public class DiseaseFacadeEjbTest extends AbstractBeanTest { + + private TestDataCreator.RDCF rdcf; + + @Override + public void init() { + super.init(); + + rdcf = creator.createRDCF(); + loginWith(creator.createSurveillanceSupervisor(rdcf)); + } + + @Test + public void testGetDiseaseForDashboard() { + TestDataCreator.RDCF rdcf2 = creator.createRDCF("Region2", "District2", "Community2", "Facility2"); + + RegionReferenceDto region = new RegionReferenceDto(rdcf2.region.getUuid()); + + DistrictReferenceDto district = new DistrictReferenceDto(rdcf.district.getUuid(), null, null); + Disease disease = Disease.EVD; + Date fromDate = new Date(); + Date toDate = new Date(); + Date previousFrom = new Date(fromDate.getTime() - 1000L * 60 * 60 * 24 * 7); // 1 week before fromDate + Date previousTo = new Date(toDate.getTime() - 1000L * 60 * 60 * 24 * 7); // 1 week before toDate + CriteriaDateType newCaseDateType = NewCaseDateType.MOST_RELEVANT; + CaseClassification caseClassification = CaseClassification.CONFIRMED; + + DiseaseBurdenDto result = getDiseaseFacade().getDiseaseForDashboard( + region, + district, + disease, + fromDate, + toDate, + previousFrom, + previousTo, + newCaseDateType, + caseClassification + ); + + assertNotNull(result); + assertEquals(disease, result.getDisease()); + assertEquals(0L, result.getCaseCount().longValue()); + assertEquals(0L, result.getPreviousCaseCount().longValue()); + assertEquals(0L, result.getEventCount().longValue()); + assertEquals(0L, result.getOutbreakDistrictCount().longValue()); + assertEquals(0L, result.getCaseDeathCount()); + assertEquals("", result.getLastReportedDistrictName()); + assertEquals("", result.getOutbreakDistrict()); + assertEquals(fromDate, result.getFrom()); + assertEquals(toDate, result.getTo()); + } + + @Test + public void testGetDiseaseGridForDashboard() { + + TestDataCreator.RDCF rdcf2 = creator.createRDCF("Region2", "District2", "Community2", "Facility2"); + + RegionReferenceDto region = new RegionReferenceDto(rdcf2.region.getUuid()); + + DistrictReferenceDto district = new DistrictReferenceDto(rdcf.district.getUuid(), null, null); + Disease disease = Disease.EVD; + Date fromDate = new Date(); + Date toDate = new Date(); + Date previousFrom = new Date(fromDate.getTime() - 1000L * 60 * 60 * 24 * 7); // 1 week before fromDate + Date previousTo = new Date(toDate.getTime() - 1000L * 60 * 60 * 24 * 7); // 1 week before toDate + CriteriaDateType newCaseDateType = NewCaseDateType.MOST_RELEVANT; + CaseClassification caseClassification = CaseClassification.CONFIRMED; + + DiseaseBurdenDto result = getDiseaseFacade().getDiseaseGridForDashboard( + region, + district, + disease, + fromDate, + toDate, + previousFrom, + previousTo, + newCaseDateType, + caseClassification + ); + + assertNotNull(result); + assertEquals(region, result.getRegion()); + assertEquals("0", result.getTotal()); + assertEquals("0", result.getActiveCases()); + assertEquals("0", result.getRecovered()); + assertEquals("0", result.getDeaths()); + assertEquals("0", result.getOther()); + } + + +} From 3506221b161e521ec527a4e0ef8ec1942533ce84 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 16 Jul 2024 12:50:43 +0000 Subject: [PATCH 40/71] additional test for regionfacadeejb --- .../backend/geo/RegionFacadeEjbTest.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java index f4c5714a77c..ee70acc95eb 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java @@ -42,4 +42,44 @@ public void testGetAllActiveAsReference() { assertEquals(1, getRegionFacade().getAllActiveAsReference().size()); } + + + @Test + public void testGetAllRegion() { + // Arrange + creator.createRegion("region1"); + creator.createRegion("region2"); + getRegionService().doFlush(); + + // Act + List results = getRegionFacade().getAllRegion(); + + // Assert + assertEquals(2, results.size()); + + RegionDto result1 = results.stream().filter(r -> r.getName().equals("region1")).findFirst().orElse(null); + RegionDto result2 = results.stream().filter(r -> r.getName().equals("region2")).findFirst().orElse(null); + + assertEquals("region1", result1.getName()); + assertEquals("region2", result2.getName()); + } + + @Test + public void testGetByName() { + // Arrange + creator.createRegion("region1"); + getRegionService().doFlush(); + + // Act + List results = getRegionFacade().getByName("region1", true); + + // Assert + assertEquals(1, results.size()); + + RegionDto result1 = results.stream().filter(r -> r.getName().equals("region1")).findFirst().orElse(null); + + assertEquals("region1", result1.getName()); + } + + } From 8740021c379d5b0cbdb46e683a8d79eb50105002 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:32:01 +0000 Subject: [PATCH 41/71] additional test case for regionfacadeejb --- .../backend/geo/RegionFacadeEjbTest.java | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java index ee70acc95eb..a068fd7d723 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java @@ -1,15 +1,27 @@ package de.symeda.sormas.backend.geo; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import java.util.ArrayList; import java.util.Date; import java.util.List; +import de.symeda.sormas.api.infrastructure.region.RegionCriteria; +import de.symeda.sormas.api.infrastructure.region.RegionIndexDto; +import de.symeda.sormas.api.utils.SortProperty; +import de.symeda.sormas.backend.util.QueryHelper; import org.junit.jupiter.api.Test; import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.infrastructure.region.Region; +import org.mockito.Mockito; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; public class RegionFacadeEjbTest extends AbstractBeanTest { @@ -82,4 +94,59 @@ public void testGetByName() { } + @Test + public void testGetIndexList_noCriteria() { + // Arrange + creator.createRegion("region1"); + creator.createRegion("region2"); + getRegionService().doFlush(); + + // Act + List results = getRegionFacade().getIndexList(null, 0, 10, null); + + // Assert + assertEquals(2, results.size()); + } + + + @Test + public void testGetIndexList_withCriteriaAndSortProperties() { + // Arrange + creator.createRegion("region1"); + creator.createRegion("region2"); + creator.createRegion("region3"); + getRegionService().doFlush(); + + RegionCriteria criteria = new RegionCriteria(); + List sortProperties = new ArrayList<>(); + sortProperties.add(new SortProperty("name", true)); + + // Act + List results = getRegionFacade().getIndexList(criteria, 0, 10, sortProperties); + + // Assert + assertEquals(3, results.size()); + + RegionIndexDto result1 = results.stream().filter(r -> r.getName().equals("region1")).findFirst().orElse(null); + RegionIndexDto result2 = results.stream().filter(r -> r.getName().equals("region2")).findFirst().orElse(null); + RegionIndexDto result3 = results.stream().filter(r -> r.getName().equals("region3")).findFirst().orElse(null); + + assertEquals("region1", result1.getName()); + assertEquals("region2", result2.getName()); + assertEquals("region3", result3.getName()); + } + + + @Test + public void testGetIndexList_withInvalidSortProperty() { + // Arrange + List sortProperties = new ArrayList<>(); + sortProperties.add(new SortProperty("invalidProperty", true)); + + // Act & Assert + assertThrows(IllegalArgumentException.class, () -> { + getRegionFacade().getIndexList(null, 0, 10, sortProperties); + }); + } + } From 0ece29119d6e8d18aa0960e7c68d4a325d12734a Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 16 Jul 2024 19:11:22 +0000 Subject: [PATCH 42/71] additional test cases to dashboardfacadeejb --- .../api/dashboard/DashboardCriteria.java | 5 + .../dashboard/DashboardFacadeEjbTest.java | 228 +++++++++++++++++- 2 files changed, 226 insertions(+), 7 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java index 094c8c77a72..1459995097b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java @@ -59,6 +59,11 @@ public EpiCurveGrouping getEpiCurveGrouping() { return epiCurveGrouping; } + public DashboardCriteria setEpiCurveGrouping(EpiCurveGrouping epigrouping) { + this.epiCurveGrouping = epigrouping; + return self; + } + public boolean isIncludeNotACaseClassification() { return includeNotACaseClassification; } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java index c0ae7813227..ef37815c43c 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java @@ -1,13 +1,12 @@ package de.symeda.sormas.backend.dashboard; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; - import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import de.symeda.sormas.api.contact.ContactClassification; +import de.symeda.sormas.api.dashboard.*; import org.junit.jupiter.api.Test; import de.symeda.sormas.api.Disease; @@ -15,10 +14,6 @@ import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.InvestigationStatus; import de.symeda.sormas.api.caze.NewCaseDateType; -import de.symeda.sormas.api.dashboard.DashboardCaseDto; -import de.symeda.sormas.api.dashboard.DashboardCriteria; -import de.symeda.sormas.api.dashboard.DashboardEventDto; -import de.symeda.sormas.api.dashboard.DashboardFacade; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventInvestigationStatus; @@ -37,6 +32,9 @@ import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator.RDCF; +import org.testcontainers.shaded.org.apache.commons.lang3.time.DateUtils; + +import static org.junit.jupiter.api.Assertions.*; public class DashboardFacadeEjbTest extends AbstractBeanTest { @@ -308,4 +306,220 @@ private void createCasesForPersonWithCondition(PresentCondition presentCondition rdcf); } } + + + @Test + public void testGetCasesCountByClassification() { + + // Create necessary data for testing + RDCF rdcf = creator.createRDCF(); + UserDto user = creator.createSurveillanceSupervisor(rdcf); + Date currentDate = new Date(); + + // Create cases with different classifications + creator.createCase( + user.toReference(), + creator.createPerson("Case", "Person1").toReference(), + Disease.EVD, + CaseClassification.CONFIRMED, + InvestigationStatus.PENDING, + currentDate, + rdcf); + + creator.createCase( + user.toReference(), + creator.createPerson("Case", "Person2").toReference(), + Disease.EVD, + CaseClassification.PROBABLE, + InvestigationStatus.PENDING, + currentDate, + rdcf); + + creator.createCase( + user.toReference(), + creator.createPerson("Case", "Person3").toReference(), + Disease.EVD, + CaseClassification.SUSPECT, + InvestigationStatus.PENDING, + currentDate, + rdcf); + + // Define dashboard criteria + DashboardCriteria dashboardCriteria = new DashboardCriteria() + .region(rdcf.region) + .district(rdcf.district) + .disease(Disease.EVD) + .newCaseDateType(NewCaseDateType.MOST_RELEVANT) + .dateBetween(DateHelper.subtractDays(currentDate, 1), DateHelper.addDays(currentDate, 1)); + + // Get counts by classification + Map casesCountByClassification = getDashboardFacade().getCasesCountByClassification(dashboardCriteria); + + // Verify the results + assertEquals(1, casesCountByClassification.get(CaseClassification.CONFIRMED)); + assertEquals(1, casesCountByClassification.get(CaseClassification.PROBABLE)); + assertEquals(1, casesCountByClassification.get(CaseClassification.SUSPECT)); + } + + + @Test + public void testGetEpiCurveSeriesElementsPerCaseClassification() { + // Create necessary data for testing + RDCF rdcf = creator.createRDCF(); + UserDto user = creator.createSurveillanceSupervisor(rdcf); + Date currentDate = new Date(); + + // Create cases with different classifications + creator.createCase( + user.toReference(), + creator.createPerson("Case", "Person1").toReference(), + Disease.EVD, + CaseClassification.CONFIRMED, + InvestigationStatus.PENDING, + currentDate, + rdcf); + + creator.createCase( + user.toReference(), + creator.createPerson("Case", "Person2").toReference(), + Disease.EVD, + CaseClassification.PROBABLE, + InvestigationStatus.PENDING, + currentDate, + rdcf); + + // Define dashboard criteria + DashboardCriteria dashboardCriteria = new DashboardCriteria() + .region(rdcf.region) + .district(rdcf.district) + .disease(Disease.EVD) + .newCaseDateType(NewCaseDateType.MOST_RELEVANT) + .setEpiCurveGrouping(EpiCurveGrouping.DAY) + .dateBetween(DateHelper.subtractDays(currentDate, 1), DateHelper.addDays(currentDate, 1)); + + // Call the method under test + Map> result = getDashboardFacade().getEpiCurveSeriesElementsPerCaseClassification(dashboardCriteria); + + // Assertions + assertEquals(3, result.size()); // Ensure three date entries within dateBetween range + + // Validate the inner maps for each date + for (Map.Entry> entry : result.entrySet()) { + Date date = entry.getKey(); + Map classifications = entry.getValue(); + + // Ensure the inner map is not null + assertNotNull(classifications); + + // Validate the expected counts for each classification + if (DateHelper.isSameDay(date, currentDate)) { + assertEquals(2, classifications.size()); // Expecting two classifications for the current date + assertEquals(1, classifications.get(CaseClassification.CONFIRMED).intValue()); // Assuming 1 CONFIRMED case + assertEquals(1, classifications.get(CaseClassification.PROBABLE).intValue()); // Assuming 1 PROBABLE case + } else { + assertEquals(0, classifications.size()); // No cases expected for other dates + } + } + } + + + + @Test + public void testGetEpiCurveSeriesElementsPerPresentCondition() { + // Create necessary data for testing + RDCF rdcf = creator.createRDCF(); + UserDto user = creator.createSurveillanceSupervisor(rdcf); + Date currentDate = new Date(); + + // Create cases with different present conditions + createCasesForPersonWithCondition(PresentCondition.ALIVE, user.toReference(), rdcf, 2); + createCasesForPersonWithCondition(PresentCondition.DEAD, user.toReference(), rdcf, 3); + + // Define dashboard criteria + DashboardCriteria dashboardCriteria = new DashboardCriteria() + .region(rdcf.region) + .district(rdcf.district) + .disease(Disease.CORONAVIRUS) + .newCaseDateType(NewCaseDateType.MOST_RELEVANT) + .setEpiCurveGrouping(EpiCurveGrouping.DAY) + .dateBetween(DateHelper.subtractDays(currentDate, 1), DateHelper.addDays(currentDate, 1)); + + // Call the method under test + Map> result = getDashboardFacade().getEpiCurveSeriesElementsPerPresentCondition(dashboardCriteria); + + // Ensure the result map contains the expected currentDate without time comparison + boolean currentDateFound = false; + for (Date date : result.keySet()) { + if (DateUtils.isSameDay(date, currentDate)) { + currentDateFound = true; + Map conditionMap = result.get(date); + + assertNotNull(conditionMap, "Condition map for currentDate is null in the result"); + + // Perform assertions on PresentCondition.ALIVE + Integer aliveCount = conditionMap.get(PresentCondition.ALIVE); + assertNotNull(aliveCount, "Alive count is null in the condition map"); + assertEquals(2, aliveCount.intValue(), "Expected count for ALIVE"); + + // Perform assertions on PresentCondition.DEAD + Integer deadCount = conditionMap.get(PresentCondition.DEAD); + assertNotNull(deadCount, "Dead count is null in the condition map"); + assertEquals(3, deadCount.intValue(), "Expected count for DEAD"); + + break; + } + } + + assertTrue(currentDateFound, "CurrentDate not found in the result map"); + } + + + + + @Test + public void testGetCaseMeasurePerDistrict() { + // Create necessary data for testing + RDCF rdcf = creator.createRDCF(); + UserDto user = creator.createSurveillanceSupervisor(rdcf); + Date currentDate = new Date(); + + // Define dashboard criteria + DashboardCriteria dashboardCriteria = new DashboardCriteria() + .region(rdcf.region) + .district(rdcf.district) + .disease(Disease.EVD) + .newCaseDateType(NewCaseDateType.MOST_RELEVANT) + .dateBetween(DateHelper.subtractDays(currentDate, 1), DateHelper.addDays(currentDate, 1)); + + // Call the method under test + DashboardCaseMeasureDto result = getDashboardFacade().getCaseMeasurePerDistrict(dashboardCriteria); + + // Assertions + assertNotNull(result); // Ensure the result is not null + } + + @Test + public void testCountCasesConvertedFromContacts() { + // Create necessary data for testing + RDCF rdcf = creator.createRDCF(); + UserDto user = creator.createSurveillanceSupervisor(rdcf); + Date currentDate = new Date(); + + // Define dashboard criteria + DashboardCriteria dashboardCriteria = new DashboardCriteria() + .region(rdcf.region) + .district(rdcf.district) + .disease(Disease.EVD) + .newCaseDateType(NewCaseDateType.MOST_RELEVANT) + .dateBetween(DateHelper.subtractDays(currentDate, 1), DateHelper.addDays(currentDate, 1)); + + // Call the method under test + long result = getDashboardFacade().countCasesConvertedFromContacts(dashboardCriteria); + + // Assertions + assertEquals(0, result); // Assuming no cases converted from contacts + } + + + } From 17bdbfc64eff3e24316ece9c99d616dbf2b4cb13 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Wed, 17 Jul 2024 17:36:35 +0000 Subject: [PATCH 43/71] additional test cases get greater or equal 65% coverage on sonarcloud --- .../symeda/sormas/api/utils/DateHelper.java | 10 + .../sormas/api/caze/CaseCriteriaTest.java | 2 + .../sormas/backend/TestDataCreator.java | 8 + .../caze/CaseUserFilterCriteriaTest.java | 41 ++++ .../dashboard/DashboardFacadeEjbTest.java | 201 +++++++++++++++++- .../backend/sample/SampleFacadeEjbTest.java | 49 +++++ 6 files changed, 308 insertions(+), 3 deletions(-) create mode 100644 sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java 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 669d9655797..7c63d874d9b 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 @@ -1181,4 +1181,14 @@ public void setSeparator(String separator) { this.separator = separator; } } + + public static Date resetTime(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } } diff --git a/sormas-api/src/test/java/de/symeda/sormas/api/caze/CaseCriteriaTest.java b/sormas-api/src/test/java/de/symeda/sormas/api/caze/CaseCriteriaTest.java index 200c4a6e1c6..e5d144f36b4 100644 --- a/sormas-api/src/test/java/de/symeda/sormas/api/caze/CaseCriteriaTest.java +++ b/sormas-api/src/test/java/de/symeda/sormas/api/caze/CaseCriteriaTest.java @@ -26,4 +26,6 @@ public void testFromToUrlParams() { assertEquals(criteria.getDisease(), generatedCriteria.getDisease()); assertEquals(criteria.getEventLike(), generatedCriteria.getEventLike()); } + + } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java index a45518e4ce8..12ccd90c3f3 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java @@ -30,6 +30,7 @@ import javax.annotation.Nullable; +import de.symeda.sormas.api.contact.ContactClassification; import org.jetbrains.annotations.NotNull; import com.fasterxml.jackson.databind.ObjectMapper; @@ -966,6 +967,13 @@ public ContactDto createContact( return contact; } + public ContactDto createContact(UserReferenceDto reportingUser, PersonReferenceDto contactPerson, CaseDataDto caze, RDCF rdcf, ContactClassification classification,Date contactDate) { + ContactDto contact = createContact(reportingUser, null, contactPerson, caze, contactDate, null, null, rdcf); + contact.setContactClassification(classification); + contact = beanTest.getContactFacade().save(contact); + return contact; + } + public TaskDto createTask(UserReferenceDto assigneeUser) { return createTask(TaskContext.GENERAL, TaskType.OTHER, TaskStatus.PENDING, null, null, null, null, new Date(), assigneeUser); } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java new file mode 100644 index 00000000000..316cb752e4f --- /dev/null +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java @@ -0,0 +1,41 @@ +package de.symeda.sormas.backend.caze; + +import de.symeda.sormas.backend.AbstractBeanTest; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class CaseUserFilterCriteriaTest extends AbstractBeanTest { + @Test + public void testRestrictAccessToAssignedEntities() { + CaseUserFilterCriteria criteria = new CaseUserFilterCriteria(); + + // Test default value + assertFalse(criteria.isRestrictAccessToAssignedEntities()); + + // Set and test new value + criteria.setRestrictAccessToAssignedEntities(true); + assertTrue(criteria.isRestrictAccessToAssignedEntities()); + + // Set and test another value + criteria.setRestrictAccessToAssignedEntities(false); + assertFalse(criteria.isRestrictAccessToAssignedEntities()); + } + + @Test + public void testExcludeSharedCases() { + CaseUserFilterCriteria criteria = new CaseUserFilterCriteria(); + + // Test default value + assertFalse(criteria.isExcludeSharedCases()); + + // Set and test new value using the setter method + criteria.excludeSharedCases(true); + assertTrue(criteria.isExcludeSharedCases()); + + // Set and test another value using the setter method + criteria.excludeSharedCases(false); + assertFalse(criteria.isExcludeSharedCases()); + } +} diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java index ef37815c43c..86fd5b7c820 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java @@ -1,5 +1,6 @@ package de.symeda.sormas.backend.dashboard; +import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Map; @@ -34,6 +35,7 @@ import de.symeda.sormas.backend.TestDataCreator.RDCF; import org.testcontainers.shaded.org.apache.commons.lang3.time.DateUtils; +import static de.symeda.sormas.api.event.eventimport.EventImportEntities.createEvent; import static org.junit.jupiter.api.Assertions.*; public class DashboardFacadeEjbTest extends AbstractBeanTest { @@ -473,9 +475,6 @@ public void testGetEpiCurveSeriesElementsPerPresentCondition() { assertTrue(currentDateFound, "CurrentDate not found in the result map"); } - - - @Test public void testGetCaseMeasurePerDistrict() { // Create necessary data for testing @@ -520,6 +519,202 @@ public void testCountCasesConvertedFromContacts() { assertEquals(0, result); // Assuming no cases converted from contacts } + @Test + public void testGetEpiCurveSeriesElementsPerContactClassification() { + // Create necessary data for testing + RDCF rdcf = creator.createRDCF(); + UserDto user = creator.createSurveillanceSupervisor(rdcf); + Date currentDate = new Date(); + + // Create cases + CaseDataDto case1 = creator.createCase( + user.toReference(), + creator.createPerson("Case", "Person1").toReference(), + Disease.EVD, + CaseClassification.CONFIRMED, + InvestigationStatus.PENDING, + currentDate, + rdcf); + + CaseDataDto case2 = creator.createCase( + user.toReference(), + creator.createPerson("Case", "Person2").toReference(), + Disease.EVD, + CaseClassification.PROBABLE, + InvestigationStatus.PENDING, + currentDate, + rdcf); + + // Create contacts with classifications + creator.createContact( + user.toReference(), + creator.createPerson("Contact", "Person1").toReference(), + case1, + rdcf, + ContactClassification.CONFIRMED,new Date()); + + creator.createContact( + user.toReference(), + creator.createPerson("Contact", "Person2").toReference(), + case2, + rdcf, + ContactClassification.UNCONFIRMED,new Date()); + + // Define dashboard criteria + DashboardCriteria dashboardCriteria = new DashboardCriteria() + .region(rdcf.region) + .district(rdcf.district) + .disease(Disease.EVD) + .newCaseDateType(NewCaseDateType.MOST_RELEVANT) + .setEpiCurveGrouping(EpiCurveGrouping.DAY) + .dateBetween(DateHelper.subtractDays(currentDate, 1), DateHelper.addDays(currentDate, 1)); + + // Call the method under test + Map> result = getDashboardFacade().getEpiCurveSeriesElementsPerContactClassification(dashboardCriteria); + + // Assertions + assertEquals(3, result.size()); // Ensure only one date entry for current date + assertTrue(result.containsKey(DateHelper.resetTime(currentDate))); // Ensure currentDate is in the map + + // Get the map for currentDate + Map classificationMap = result.get(DateHelper.resetTime(currentDate)); + assertNotNull(classificationMap); // Ensure the classificationMap for currentDate is not null + + // Perform assertions on ContactClassification.HIGH_RISK + Long confirmedContactCount = classificationMap.get(ContactClassification.CONFIRMED); + assertNotNull(confirmedContactCount); // Ensure the count for HIGH_RISK is not null + assertEquals(1L, confirmedContactCount.longValue()); // Check the count for HIGH_RISK + + // Perform assertions on ContactClassification.LOW_RISK + Long unconfirmedCount = classificationMap.get(ContactClassification.UNCONFIRMED); + assertNotNull(unconfirmedCount); // Ensure the count for LOW_RISK is not null + assertEquals(1L, unconfirmedCount.longValue()); // Check the count for LOW_RISK + } + + @Test + public void testGetEpiCurveSeriesElementsPerContactFollowUpUntil() { + // Create necessary data for testing + RDCF rdcf = creator.createRDCF(); + UserDto user = creator.createSurveillanceSupervisor(rdcf); + Date currentDate = new Date(); + + // Create cases + CaseDataDto case1 = creator.createCase( + user.toReference(), + creator.createPerson("Case", "Person1").toReference(), + Disease.EVD, + CaseClassification.CONFIRMED, + InvestigationStatus.DONE, + currentDate, + rdcf); + + // Create contacts with follow-up dates + creator.createContact( + user.toReference(), + creator.createPerson("Contact", "Person1").toReference(), + case1, + rdcf, + ContactClassification.CONFIRMED, + DateHelper.subtractDays(currentDate, 5)); // Example follow-up date 5 days before currentDate + + // Define dashboard criteria + DashboardCriteria dashboardCriteria = new DashboardCriteria() + .region(rdcf.region) + .district(rdcf.district) + .disease(Disease.EVD) + .newCaseDateType(NewCaseDateType.MOST_RELEVANT) + .setEpiCurveGrouping(EpiCurveGrouping.DAY) + .dateBetween(DateHelper.subtractDays(currentDate, 1), DateHelper.addDays(currentDate, 1)); + + // Call the method under test + Map result = getDashboardFacade().getEpiCurveSeriesElementsPerContactFollowUpUntil(dashboardCriteria); + + // Assertions + assertEquals(3, result.size()); // Ensure only one date entry for current date + assertTrue(result.containsKey(DateHelper.resetTime(currentDate))); // Ensure currentDate is in the map + } + + @Test + public void testGetEventCountByStatus() { + // Create necessary data for testing + RDCF rdcf = creator.createRDCF(); + UserDto user = creator.createSurveillanceSupervisor(rdcf); + Date currentDate = new Date(); + + // Create mock events with different statuses + creator.createEvent(user.toReference(), Disease.EVD, rdcf); + creator.createEvent(user.toReference(), Disease.MALARIA, rdcf); + creator.createEvent(user.toReference(), Disease.NEW_INFLUENZA, rdcf); + + // Define dashboard criteria + DashboardCriteria dashboardCriteria = new DashboardCriteria() + .region(rdcf.region) + .district(rdcf.district) + .disease(Disease.EVD) // Adjust disease as needed for your test case + .newCaseDateType(NewCaseDateType.MOST_RELEVANT) + .dateBetween(DateHelper.subtractDays(currentDate, 1), DateHelper.addDays(currentDate, 1)); + + // Call the method under test + Map result = getDashboardFacade().getEventCountByStatus(dashboardCriteria); + + // Assertions + assertNotNull(result); // Ensure result is not null + + // Verify specific status counts (adjust these based on your mock events and expected logic) + assertTrue(result.containsKey(EventStatus.SIGNAL)); + assertEquals(1L, result.getOrDefault(EventStatus.SIGNAL, 0L).longValue()); // Example assertion + } + + @Test + public void testGetIntervalEndDate() { + DashboardFacadeEjb dashboardFacadeEjb = new DashboardFacadeEjb(); + + // Test case 1: DAY grouping + Date startDate1 = new Date(); // Replace with actual date values + Date expectedEndDate1 = DateHelper.getEndOfDay(startDate1); + assertEquals(expectedEndDate1, dashboardFacadeEjb.getIntervalEndDate(startDate1, EpiCurveGrouping.DAY)); + + // Test case 2: WEEK grouping + Date startDate2 = new Date(); // Replace with actual date values + Date expectedEndDate2 = DateHelper.getEndOfWeek(startDate2); + assertEquals(expectedEndDate2, dashboardFacadeEjb.getIntervalEndDate(startDate2, EpiCurveGrouping.WEEK)); + + // Test case 3: MONTH grouping + Date startDate3 = new Date(); // Replace with actual date values + Date expectedEndDate3 = DateHelper.getEndOfMonth(startDate3); + assertEquals(expectedEndDate3, dashboardFacadeEjb.getIntervalEndDate(startDate3, EpiCurveGrouping.MONTH)); + } + + // Method to test + + @Test + public void testSetNewCaseDatesInCaseCriteria() { + DashboardFacadeEjb dashboardFacadeEjb = new DashboardFacadeEjb(); + + // Test case 1: DAY grouping + Date date1 = new Date(); // Replace with actual date values + DashboardCriteria dashboardCriteria1 = new DashboardCriteria() + .setEpiCurveGrouping(EpiCurveGrouping.DAY); + DashboardCriteria result1 = dashboardFacadeEjb.setNewCaseDatesInCaseCriteria(date1, dashboardCriteria1); + assertEquals(DateHelper.getStartOfDay(date1), result1.getDateFrom()); + assertEquals(DateHelper.getEndOfDay(date1), result1.getDateTo()); + + // Test case 2: WEEK grouping + Date date2 = new Date(); // Replace with actual date values + DashboardCriteria dashboardCriteria2 = new DashboardCriteria() + .setEpiCurveGrouping(EpiCurveGrouping.WEEK); + DashboardCriteria result2 = dashboardFacadeEjb.setNewCaseDatesInCaseCriteria(date2, dashboardCriteria2); + assertEquals(DateHelper.getStartOfWeek(date2), result2.getDateFrom()); + assertEquals(DateHelper.getEndOfWeek(date2), result2.getDateTo()); + + // Test case 3: MONTH grouping + Date date3 = new Date(); // Replace with actual date values + DashboardCriteria dashboardCriteria3 = new DashboardCriteria() + .setEpiCurveGrouping(EpiCurveGrouping.MONTH); + DashboardCriteria result3 = dashboardFacadeEjb.setNewCaseDatesInCaseCriteria(date3, dashboardCriteria3); + assertEquals(DateHelper.getStartOfMonth(date3), result3.getDateFrom()); + assertEquals(DateHelper.getEndOfMonth(date3), result3.getDateTo()); + } } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java index b9331faceb9..53e4996e9e4 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java @@ -39,6 +39,7 @@ import java.util.List; import java.util.stream.Collectors; +import de.symeda.sormas.backend.contact.Contact; import org.hamcrest.MatcherAssert; import org.junit.jupiter.api.Test; @@ -1222,4 +1223,52 @@ public void testCountAndGetSamplesForMap() { assertEquals(6, count); assertEquals(6, samples.size()); } + + + + @Test + public void testGetEarliestPositiveSampleDate() { + RDCF rdcf = creator.createRDCF(); + UserDto user = creator.createSurveillanceSupervisor(rdcf); + PersonDto person = creator.createPerson("New", "Person"); + CaseDataDto caze = creator.createCase(user.toReference(), person.toReference(), rdcf); + + // Create contact with positive samples + ContactDto contact = creator.createContact( + user.toReference(), + user.toReference(), // Assuming user is also contact officer for simplicity + person.toReference(), + caze, + new Date(), // Report DateTime + new Date(), // Last Contact Date + Disease.EVD, + creator.createRDCF() + ); + + // Sample 1 - Positive + SampleDto sample1 = creator.createSample(caze.toReference(), user.toReference(), creator.createRDCF().facility); + sample1.setPathogenTestResult(PathogenTestResultType.POSITIVE); + sample1.setSampleDateTime(new Date(2023 - 1900, 5, 15)); // June 15, 2023 + getSampleFacade().saveSample(sample1); + + // Sample 2 - Positive + SampleDto sample2 = creator.createSample(caze.toReference(), user.toReference(), creator.createRDCF().facility); + sample2.setPathogenTestResult(PathogenTestResultType.POSITIVE); + sample2.setSampleDateTime(new Date(2023 - 1900, 5, 20)); // June 20, 2023 + getSampleFacade().saveSample(sample2); + + // Sample 3 - Negative + SampleDto sample3 = creator.createSample(caze.toReference(), user.toReference(), creator.createRDCF().facility); + sample3.setPathogenTestResult(PathogenTestResultType.NEGATIVE); + sample3.setSampleDateTime(new Date(2023 - 1900, 5, 10)); // June 10, 2023 + getSampleFacade().saveSample(sample3); + + // Test - earliest positive sample date + Date earliestPositiveSampleDate = getSampleFacade().getEarliestPositiveSampleDate(contact.getUuid()); + assertEquals(new Date(2023 - 1900, 5, 15), earliestPositiveSampleDate); + + } + + + } From c3a85278067863a77c6f8f6e56445f0b02c6a9cf Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Thu, 18 Jul 2024 11:00:22 +0000 Subject: [PATCH 44/71] fix for duplicate line on dashboardmapcomponent --- .../dashboard/map/DashboardMapComponent.java | 619 +++++++++--------- 1 file changed, 298 insertions(+), 321 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index 4f4eeb47ed3..1a73ab8f52c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -63,6 +63,7 @@ import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.VaadinUiUtil; +import org.jetbrains.annotations.NotNull; import org.vaadin.hene.popupbutton.PopupButton; import java.math.BigDecimal; @@ -135,9 +136,9 @@ private enum PeriodFilterReloadFlag { public DashboardMapComponent(DashboardDataProvider dashboardDataProvider) { super( - dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE ? Strings.headingCaseStatusMap : Strings.headingContactMap, - dashboardDataProvider, - null); + dashboardDataProvider.getDashboardType() == DashboardType.SURVEILLANCE ? Strings.headingCaseStatusMap : Strings.headingContactMap, + dashboardDataProvider, + null); if(dashboardDataProvider.getDashboardType().equals(DashboardType.DISEASE)) { setMargin(false); @@ -493,52 +494,14 @@ private VerticalLayout createMapLegend() { CssStyles.style(facilitiesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); legendLayout.addComponent(facilitiesKeyLabel); - HorizontalLayout facilitiesKeyLayout = new HorizontalLayout(); - { - facilitiesKeyLayout.setSpacing(false); - facilitiesKeyLayout.setMargin(false); - HorizontalLayout legendEntry = - buildMarkerLegendEntry(MarkerIcon.FACILITY_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassifiedOnly)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - facilitiesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_SUSPECT, I18nProperties.getCaption(Captions.dashboardGt1SuspectCases)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - facilitiesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_PROBABLE, I18nProperties.getCaption(Captions.dashboardGt1ProbableCases)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - facilitiesKeyLayout.addComponent(legendEntry); - legendEntry = - buildMarkerLegendEntry(MarkerIcon.FACILITY_CONFIRMED, I18nProperties.getCaption(Captions.dashboardGt1ConfirmedCases)); - facilitiesKeyLayout.addComponent(legendEntry); - } + HorizontalLayout facilitiesKeyLayout = createFacilitiesKeyLayout(); legendLayout.addComponent(facilitiesKeyLayout); } - Label casesKeyLabel = new Label(I18nProperties.getString(Strings.entityCases)); - if (mapCaseDisplayMode == MapCaseDisplayMode.FACILITY || mapCaseDisplayMode == MapCaseDisplayMode.FACILITY_OR_CASE_ADDRESS) { - CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); - } else { - CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); - } + Label casesKeyLabel = createCasesKeyLabel(); legendLayout.addComponent(casesKeyLabel); - HorizontalLayout casesKeyLayout = new HorizontalLayout(); - { - casesKeyLayout.setSpacing(false); - casesKeyLayout.setMargin(false); - HorizontalLayout legendEntry = - buildMarkerLegendEntry(MarkerIcon.CASE_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassified)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - casesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_SUSPECT, I18nProperties.getCaption(Captions.dashboardSuspect)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - casesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_PROBABLE, I18nProperties.getCaption(Captions.dashboardProbable)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - casesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_CONFIRMED, I18nProperties.getCaption(Captions.dashboardConfirmed)); - casesKeyLayout.addComponent(legendEntry); - } + HorizontalLayout casesKeyLayout = createCasesKeyLayout(); legendLayout.addComponent(casesKeyLayout); } @@ -552,20 +515,7 @@ private VerticalLayout createMapLegend() { } legendLayout.addComponent(contactsKeyLabel); - HorizontalLayout contactsKeyLayout = new HorizontalLayout(); - { - contactsKeyLayout.setSpacing(false); - contactsKeyLayout.setMargin(false); - HorizontalLayout legendEntry = - buildMarkerLegendEntry(MarkerIcon.CONTACT_OK, I18nProperties.getCaption(Captions.dashboardNotAContact)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - contactsKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_OVERDUE, I18nProperties.getCaption(Captions.dashboardUnconfirmedContact)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - contactsKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_LONG_OVERDUE, I18nProperties.getCaption(Captions.dashboardConfirmedContact)); - contactsKeyLayout.addComponent(legendEntry); - } + HorizontalLayout contactsKeyLayout = contactsKeyLayout(); legendLayout.addComponent(contactsKeyLayout); } @@ -579,27 +529,13 @@ private VerticalLayout createMapLegend() { } legendLayout.addComponent(eventsKeyLabel); - HorizontalLayout eventsKeyLayout = new HorizontalLayout(); - { - eventsKeyLayout.setSpacing(false); - eventsKeyLayout.setMargin(false); - HorizontalLayout legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_RUMOR, EventStatus.SIGNAL.toString()); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - eventsKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_OUTBREAK, EventStatus.EVENT.toString()); - eventsKeyLayout.addComponent(legendEntry); - } + HorizontalLayout eventsKeyLayout = createEventsKeyLayout(); legendLayout.addComponent(eventsKeyLayout); } // Districts if (showRegions && districtValuesLowerQuartile != null && districtValuesMedian != null && districtValuesUpperQuartile != null) { - Label districtsKeyLabel = new Label(I18nProperties.getString(Strings.entityDistricts)); - if (showCases || showContacts || showEvents) { - CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); - } else { - CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); - } + Label districtsKeyLabel = createStyledLabel(); legendLayout.addComponent(districtsKeyLabel); legendLayout.addComponent( buildRegionLegend( @@ -619,6 +555,82 @@ private VerticalLayout createMapLegend() { return legendLayout; } + private HorizontalLayout contactsKeyLayout() { + HorizontalLayout contactsKeyLayout = new HorizontalLayout(); + { + contactsKeyLayout.setSpacing(false); + contactsKeyLayout.setMargin(false); + HorizontalLayout legendEntry = + buildMarkerLegendEntry(MarkerIcon.CONTACT_OK, I18nProperties.getCaption(Captions.dashboardNotAContact)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + contactsKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_OVERDUE, I18nProperties.getCaption(Captions.dashboardUnconfirmedContact)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + contactsKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_LONG_OVERDUE, I18nProperties.getCaption(Captions.dashboardConfirmedContact)); + contactsKeyLayout.addComponent(legendEntry); + } + return contactsKeyLayout; + } + + private HorizontalLayout createCasesKeyLayout() { + HorizontalLayout casesKeyLayout = new HorizontalLayout(); + { + casesKeyLayout.setSpacing(false); + casesKeyLayout.setMargin(false); + HorizontalLayout legendEntry = + buildMarkerLegendEntry(MarkerIcon.CASE_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassified)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + casesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_SUSPECT, I18nProperties.getCaption(Captions.dashboardSuspect)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + casesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_PROBABLE, I18nProperties.getCaption(Captions.dashboardProbable)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + casesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_CONFIRMED, I18nProperties.getCaption(Captions.dashboardConfirmed)); + casesKeyLayout.addComponent(legendEntry); + } + return casesKeyLayout; + } + + private HorizontalLayout createEventsKeyLayout() { + HorizontalLayout eventsKeyLayout = new HorizontalLayout(); + { + eventsKeyLayout.setSpacing(false); + eventsKeyLayout.setMargin(false); + HorizontalLayout legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_RUMOR, EventStatus.SIGNAL.toString()); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + eventsKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_OUTBREAK, EventStatus.EVENT.toString()); + eventsKeyLayout.addComponent(legendEntry); + } + return eventsKeyLayout; + } + + private HorizontalLayout createFacilitiesKeyLayout() { + HorizontalLayout facilitiesKeyLayout = new HorizontalLayout(); + { + facilitiesKeyLayout.setSpacing(false); + facilitiesKeyLayout.setMargin(false); + HorizontalLayout legendEntry = + buildMarkerLegendEntry(MarkerIcon.FACILITY_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassifiedOnly)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + facilitiesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_SUSPECT, I18nProperties.getCaption(Captions.dashboardGt1SuspectCases)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + facilitiesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_PROBABLE, I18nProperties.getCaption(Captions.dashboardGt1ProbableCases)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + facilitiesKeyLayout.addComponent(legendEntry); + legendEntry = + buildMarkerLegendEntry(MarkerIcon.FACILITY_CONFIRMED, I18nProperties.getCaption(Captions.dashboardGt1ConfirmedCases)); + facilitiesKeyLayout.addComponent(legendEntry); + } + return facilitiesKeyLayout; + + } + private void createPeriodFilters(VerticalLayout layersLayout) { cmbPeriodType = new ComboBox(); cmbPeriodFilter = new ComboBox(); @@ -846,13 +858,13 @@ protected Long getMarkerCount(Date fromDate, Date toDate, int maxCount) { if (showCases) { count += FacadeProvider.getCaseFacade() - .countCasesForMap( - region, - district, - disease, - fromDate, - toDate, - showCurrentEpiSituation ? null : dashboardDataProvider.getNewCaseDateType()); + .countCasesForMap( + region, + district, + disease, + fromDate, + toDate, + showCurrentEpiSituation ? null : dashboardDataProvider.getNewCaseDateType()); } if (count < maxCount && showContacts) { @@ -874,14 +886,14 @@ protected void loadMapData(Date fromDate, Date toDate) { if (showCases) { showCaseMarkers( - FacadeProvider.getCaseFacade() - .getCasesForMap( - region, - district, - disease, - fromDate, - toDate, - showCurrentEpiSituation ? null : dashboardDataProvider.getNewCaseDateType())); + FacadeProvider.getCaseFacade() + .getCasesForMap( + region, + district, + disease, + fromDate, + toDate, + showCurrentEpiSituation ? null : dashboardDataProvider.getNewCaseDateType())); } if (showContacts) { showContactMarkers(FacadeProvider.getContactFacade().getContactsForMap(region, district, disease, fromDate, toDate)); @@ -1097,9 +1109,9 @@ else if (dashboardDataProvider.getDashboardType() == DashboardType.DISEASE) { // "Expand" and "Collapse" buttons Button expandMapButton = - ButtonHelper.createIconButtonWithCaption("expandMap", "", VaadinIcons.EXPAND, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); + ButtonHelper.createIconButtonWithCaption("expandMap", "", VaadinIcons.EXPAND, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); Button collapseMapButton = - ButtonHelper.createIconButtonWithCaption("collapseMap", "", VaadinIcons.COMPRESS, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); + ButtonHelper.createIconButtonWithCaption("collapseMap", "", VaadinIcons.COMPRESS, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); expandMapButton.addClickListener(e -> { externalExpandListener.accept(true); @@ -1109,8 +1121,8 @@ else if (dashboardDataProvider.getDashboardType() == DashboardType.DISEASE) { }); - return mapHeaderLayout; - } + return mapHeaderLayout; + } @Override protected List getLegendComponents() { @@ -1122,52 +1134,14 @@ protected List getLegendComponents() { CssStyles.style(facilitiesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); legendComponents.add(facilitiesKeyLabel); - HorizontalLayout facilitiesKeyLayout = new HorizontalLayout(); - { - facilitiesKeyLayout.setSpacing(false); - facilitiesKeyLayout.setMargin(false); - HorizontalLayout legendEntry = - buildMarkerLegendEntry(MarkerIcon.FACILITY_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassifiedOnly)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - facilitiesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_SUSPECT, I18nProperties.getCaption(Captions.dashboardGt1SuspectCases)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - facilitiesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_PROBABLE, I18nProperties.getCaption(Captions.dashboardGt1ProbableCases)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - facilitiesKeyLayout.addComponent(legendEntry); - legendEntry = - buildMarkerLegendEntry(MarkerIcon.FACILITY_CONFIRMED, I18nProperties.getCaption(Captions.dashboardGt1ConfirmedCases)); - facilitiesKeyLayout.addComponent(legendEntry); - } + HorizontalLayout facilitiesKeyLayout = createFacilitiesKeyLayout(); legendComponents.add(facilitiesKeyLayout); } - Label casesKeyLabel = new Label(I18nProperties.getString(Strings.entityCases)); - if (mapCaseDisplayMode == MapCaseDisplayMode.FACILITY || mapCaseDisplayMode == MapCaseDisplayMode.FACILITY_OR_CASE_ADDRESS) { - CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); - } else { - CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); - } + Label casesKeyLabel = createCasesKeyLabel(); legendComponents.add(casesKeyLabel); - HorizontalLayout casesKeyLayout = new HorizontalLayout(); - { - casesKeyLayout.setSpacing(false); - casesKeyLayout.setMargin(false); - HorizontalLayout legendEntry = - buildMarkerLegendEntry(MarkerIcon.CASE_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassified)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - casesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_SUSPECT, I18nProperties.getCaption(Captions.dashboardSuspect)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - casesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_PROBABLE, I18nProperties.getCaption(Captions.dashboardProbable)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - casesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_CONFIRMED, I18nProperties.getCaption(Captions.dashboardConfirmed)); - casesKeyLayout.addComponent(legendEntry); - } + HorizontalLayout casesKeyLayout = createCasesKeyLayout(); legendComponents.add(casesKeyLayout); } @@ -1181,20 +1155,7 @@ protected List getLegendComponents() { } legendComponents.add(contactsKeyLabel); - HorizontalLayout contactsKeyLayout = new HorizontalLayout(); - { - contactsKeyLayout.setSpacing(false); - contactsKeyLayout.setMargin(false); - HorizontalLayout legendEntry = - buildMarkerLegendEntry(MarkerIcon.CONTACT_OK, I18nProperties.getCaption(Captions.dashboardNotAContact)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - contactsKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_OVERDUE, I18nProperties.getCaption(Captions.dashboardUnconfirmedContact)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - contactsKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_LONG_OVERDUE, I18nProperties.getCaption(Captions.dashboardConfirmedContact)); - contactsKeyLayout.addComponent(legendEntry); - } + HorizontalLayout contactsKeyLayout = contactsKeyLayout(); legendComponents.add(contactsKeyLayout); } @@ -1208,37 +1169,23 @@ protected List getLegendComponents() { } legendComponents.add(eventsKeyLabel); - HorizontalLayout eventsKeyLayout = new HorizontalLayout(); - { - eventsKeyLayout.setSpacing(false); - eventsKeyLayout.setMargin(false); - HorizontalLayout legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_RUMOR, EventStatus.SIGNAL.toString()); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - eventsKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_OUTBREAK, EventStatus.EVENT.toString()); - eventsKeyLayout.addComponent(legendEntry); - } + HorizontalLayout eventsKeyLayout =createEventsKeyLayout(); legendComponents.add(eventsKeyLayout); } // Districts if (showRegions && districtValuesLowerQuartile != null && districtValuesMedian != null && districtValuesUpperQuartile != null) { - Label districtsKeyLabel = new Label(I18nProperties.getString(Strings.entityDistricts)); - if (showCases || showContacts || showEvents) { - CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); - } else { - CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); - } + Label districtsKeyLabel= createStyledLabel(); legendComponents.add(districtsKeyLabel); legendComponents.add( - buildRegionLegend( - false, - caseMeasure, - emptyPopulationDistrictPresent, - districtValuesLowerQuartile, - districtValuesMedian, - districtValuesUpperQuartile, - InfrastructureHelper.CASE_INCIDENCE_DIVISOR)); + buildRegionLegend( + false, + caseMeasure, + emptyPopulationDistrictPresent, + districtValuesLowerQuartile, + districtValuesMedian, + districtValuesUpperQuartile, + InfrastructureHelper.CASE_INCIDENCE_DIVISOR)); Label descLabel = new Label(I18nProperties.getString(Strings.infoDashboardIncidence)); CssStyles.style(descLabel, CssStyles.LABEL_SMALL); @@ -1248,6 +1195,26 @@ protected List getLegendComponents() { return legendComponents; } + private Label createCasesKeyLabel() { + Label casesKeyLabel = new Label(I18nProperties.getString(Strings.entityCases)); + if (mapCaseDisplayMode == MapCaseDisplayMode.FACILITY || mapCaseDisplayMode == MapCaseDisplayMode.FACILITY_OR_CASE_ADDRESS) { + CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); + } else { + CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + } + return casesKeyLabel; + } + + private Label createStyledLabel() { + Label districtsKeyLabel = new Label(I18nProperties.getString(Strings.entityDistricts)); + if (showCases || showContacts || showEvents) { + CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); + } else { + CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + } + return districtsKeyLabel; + } + public static HorizontalLayout buildMapIconLegendEntry(String iconName, String labelCaption) { Image icon = new Image(null, new ExternalResource("VAADIN/map/marker/" + iconName + ".png")); icon.setWidth(12.375f, Unit.PIXELS); @@ -1256,13 +1223,13 @@ public static HorizontalLayout buildMapIconLegendEntry(String iconName, String l } public static AbstractOrderedLayout buildRegionLegend( - boolean vertical, - CaseMeasure caseMeasure, - boolean emptyPopulationDistrictPresent, - BigDecimal districtShapesLowerQuartile, - BigDecimal districtShapesMedian, - BigDecimal districtShapesUpperQuartile, - int caseIncidenceDivisor) { + boolean vertical, + CaseMeasure caseMeasure, + boolean emptyPopulationDistrictPresent, + BigDecimal districtShapesLowerQuartile, + BigDecimal districtShapesMedian, + BigDecimal districtShapesUpperQuartile, + int caseIncidenceDivisor) { AbstractOrderedLayout regionLegendLayout = vertical ? new VerticalLayout() : new HorizontalLayout(); regionLegendLayout.setSpacing(true); CssStyles.style(regionLegendLayout, CssStyles.LAYOUT_MINIMAL); @@ -1270,43 +1237,43 @@ public static AbstractOrderedLayout buildRegionLegend( HorizontalLayout legendEntry; switch (caseMeasure) { - case CASE_COUNT: - legendEntry = buildMapIconLegendEntry( - "lowest-region-small", - districtShapesLowerQuartile.compareTo(BigDecimal.ONE) > 0 - ? "1 - " + districtShapesLowerQuartile + " " + I18nProperties.getString(Strings.entityCases) - : "1 " + I18nProperties.getString(Strings.entityCase)); - break; - case CASE_INCIDENCE: - legendEntry = buildMapIconLegendEntry( - "lowest-region-small", - "<= " + DataHelper.getTruncatedBigDecimal(districtShapesLowerQuartile) + " " + I18nProperties.getString(Strings.entityCases) + " / " - + caseIncidenceDivisor); - break; - default: - throw new IllegalArgumentException(caseMeasure.toString()); - } - regionLegendLayout.addComponent(legendEntry); - - if (districtShapesLowerQuartile.compareTo(districtShapesMedian) < 0) { - switch (caseMeasure) { case CASE_COUNT: legendEntry = buildMapIconLegendEntry( - "low-region-small", - districtShapesMedian.compareTo(districtShapesLowerQuartile.add(BigDecimal.ONE)) > 0 - ? districtShapesLowerQuartile.add(BigDecimal.ONE) + " - " + districtShapesMedian + " " - + I18nProperties.getString(Strings.entityCases) - : districtShapesMedian + " " + I18nProperties.getString(Strings.entityCases)); + "lowest-region-small", + districtShapesLowerQuartile.compareTo(BigDecimal.ONE) > 0 + ? "1 - " + districtShapesLowerQuartile + " " + I18nProperties.getString(Strings.entityCases) + : "1 " + I18nProperties.getString(Strings.entityCase)); break; case CASE_INCIDENCE: legendEntry = buildMapIconLegendEntry( - "low-region-small", - DataHelper.getTruncatedBigDecimal(districtShapesLowerQuartile.add(new BigDecimal(0.1)).setScale(1, RoundingMode.HALF_UP)) + " - " - + DataHelper.getTruncatedBigDecimal(districtShapesMedian) + " " + I18nProperties.getString(Strings.entityCases) + " / " - + caseIncidenceDivisor); + "lowest-region-small", + "<= " + DataHelper.getTruncatedBigDecimal(districtShapesLowerQuartile) + " " + I18nProperties.getString(Strings.entityCases) + " / " + + caseIncidenceDivisor); break; default: throw new IllegalArgumentException(caseMeasure.toString()); + } + regionLegendLayout.addComponent(legendEntry); + + if (districtShapesLowerQuartile.compareTo(districtShapesMedian) < 0) { + switch (caseMeasure) { + case CASE_COUNT: + legendEntry = buildMapIconLegendEntry( + "low-region-small", + districtShapesMedian.compareTo(districtShapesLowerQuartile.add(BigDecimal.ONE)) > 0 + ? districtShapesLowerQuartile.add(BigDecimal.ONE) + " - " + districtShapesMedian + " " + + I18nProperties.getString(Strings.entityCases) + : districtShapesMedian + " " + I18nProperties.getString(Strings.entityCases)); + break; + case CASE_INCIDENCE: + legendEntry = buildMapIconLegendEntry( + "low-region-small", + DataHelper.getTruncatedBigDecimal(districtShapesLowerQuartile.add(new BigDecimal(0.1)).setScale(1, RoundingMode.HALF_UP)) + " - " + + DataHelper.getTruncatedBigDecimal(districtShapesMedian) + " " + I18nProperties.getString(Strings.entityCases) + " / " + + caseIncidenceDivisor); + break; + default: + throw new IllegalArgumentException(caseMeasure.toString()); } regionLegendLayout.addComponent(legendEntry); @@ -1314,42 +1281,42 @@ public static AbstractOrderedLayout buildRegionLegend( if (districtShapesMedian.compareTo(districtShapesUpperQuartile) < 0) { switch (caseMeasure) { + case CASE_COUNT: + legendEntry = buildMapIconLegendEntry( + "high-region-small", + districtShapesUpperQuartile.compareTo(districtShapesMedian.add(BigDecimal.ONE)) > 0 + ? districtShapesMedian.add(BigDecimal.ONE) + " - " + districtShapesUpperQuartile + " " + + I18nProperties.getString(Strings.entityCases) + : districtShapesUpperQuartile + " " + I18nProperties.getString(Strings.entityCases)); + break; + case CASE_INCIDENCE: + legendEntry = buildMapIconLegendEntry( + "high-region-small", + DataHelper.getTruncatedBigDecimal(districtShapesMedian.add(new BigDecimal(0.1)).setScale(1, RoundingMode.HALF_UP)) + " - " + + DataHelper.getTruncatedBigDecimal(districtShapesUpperQuartile) + " " + I18nProperties.getString(Strings.entityCases) + " / " + + caseIncidenceDivisor); + break; + default: + throw new IllegalArgumentException(caseMeasure.toString()); + } + + regionLegendLayout.addComponent(legendEntry); + } + + switch (caseMeasure) { case CASE_COUNT: legendEntry = buildMapIconLegendEntry( - "high-region-small", - districtShapesUpperQuartile.compareTo(districtShapesMedian.add(BigDecimal.ONE)) > 0 - ? districtShapesMedian.add(BigDecimal.ONE) + " - " + districtShapesUpperQuartile + " " - + I18nProperties.getString(Strings.entityCases) - : districtShapesUpperQuartile + " " + I18nProperties.getString(Strings.entityCases)); + "highest-region-small", + "> " + districtShapesUpperQuartile + " " + I18nProperties.getString(Strings.entityCases)); break; case CASE_INCIDENCE: legendEntry = buildMapIconLegendEntry( - "high-region-small", - DataHelper.getTruncatedBigDecimal(districtShapesMedian.add(new BigDecimal(0.1)).setScale(1, RoundingMode.HALF_UP)) + " - " - + DataHelper.getTruncatedBigDecimal(districtShapesUpperQuartile) + " " + I18nProperties.getString(Strings.entityCases) + " / " - + caseIncidenceDivisor); + "highest-region-small", + "> " + DataHelper.getTruncatedBigDecimal(districtShapesUpperQuartile) + " " + I18nProperties.getString(Strings.entityCases) + " / " + + caseIncidenceDivisor); break; default: throw new IllegalArgumentException(caseMeasure.toString()); - } - - regionLegendLayout.addComponent(legendEntry); - } - - switch (caseMeasure) { - case CASE_COUNT: - legendEntry = buildMapIconLegendEntry( - "highest-region-small", - "> " + districtShapesUpperQuartile + " " + I18nProperties.getString(Strings.entityCases)); - break; - case CASE_INCIDENCE: - legendEntry = buildMapIconLegendEntry( - "highest-region-small", - "> " + DataHelper.getTruncatedBigDecimal(districtShapesUpperQuartile) + " " + I18nProperties.getString(Strings.entityCases) + " / " - + caseIncidenceDivisor); - break; - default: - throw new IllegalArgumentException(caseMeasure.toString()); } regionLegendLayout.addComponent(legendEntry); @@ -1400,14 +1367,14 @@ private void showRegionsShapes(CaseMeasure caseMeasure, Date fromDate, Date toDa map.addPolygonGroup(REGIONS_GROUP_ID, regionPolygons); List> measurePerDistrict = - FacadeProvider.getCaseFacade().getCaseMeasurePerDistrict(fromDate, toDate, disease, caseMeasure); + FacadeProvider.getCaseFacade().getCaseMeasurePerDistrict(fromDate, toDate, disease, caseMeasure); if (caseMeasure == CaseMeasure.CASE_COUNT) { districtValuesLowerQuartile = - measurePerDistrict.size() > 0 ? measurePerDistrict.get((int) (measurePerDistrict.size() * 0.25)).getElement1() : null; + measurePerDistrict.size() > 0 ? measurePerDistrict.get((int) (measurePerDistrict.size() * 0.25)).getElement1() : null; districtValuesMedian = - measurePerDistrict.size() > 0 ? measurePerDistrict.get((int) (measurePerDistrict.size() * 0.5)).getElement1() : null; + measurePerDistrict.size() > 0 ? measurePerDistrict.get((int) (measurePerDistrict.size() * 0.5)).getElement1() : null; districtValuesUpperQuartile = - measurePerDistrict.size() > 0 ? measurePerDistrict.get((int) (measurePerDistrict.size() * 0.75)).getElement1() : null; + measurePerDistrict.size() > 0 ? measurePerDistrict.get((int) (measurePerDistrict.size() * 0.75)).getElement1() : null; } else { // For case incidence, districts without or with a population <= 0 should not be // used for the calculation of the quartiles because they will falsify the @@ -1416,14 +1383,14 @@ private void showRegionsShapes(CaseMeasure caseMeasure, Date fromDate, Date toDa measurePerDistrictWithoutMissingPopulations.addAll(measurePerDistrict); measurePerDistrictWithoutMissingPopulations.removeIf(d -> d.getElement1() == null || d.getElement1().intValue() <= 0); districtValuesLowerQuartile = measurePerDistrictWithoutMissingPopulations.size() > 0 - ? measurePerDistrictWithoutMissingPopulations.get((int) (measurePerDistrictWithoutMissingPopulations.size() * 0.25)).getElement1() - : null; + ? measurePerDistrictWithoutMissingPopulations.get((int) (measurePerDistrictWithoutMissingPopulations.size() * 0.25)).getElement1() + : null; districtValuesMedian = measurePerDistrictWithoutMissingPopulations.size() > 0 - ? measurePerDistrictWithoutMissingPopulations.get((int) (measurePerDistrictWithoutMissingPopulations.size() * 0.5)).getElement1() - : null; + ? measurePerDistrictWithoutMissingPopulations.get((int) (measurePerDistrictWithoutMissingPopulations.size() * 0.5)).getElement1() + : null; districtValuesUpperQuartile = measurePerDistrictWithoutMissingPopulations.size() > 0 - ? measurePerDistrictWithoutMissingPopulations.get((int) (measurePerDistrictWithoutMissingPopulations.size() * 0.75)).getElement1() - : null; + ? measurePerDistrictWithoutMissingPopulations.get((int) (measurePerDistrictWithoutMissingPopulations.size() * 0.75)).getElement1() + : null; } List districtPolygons = new ArrayList(); @@ -1525,25 +1492,7 @@ private void showCaseMarkers(List cases) { } for (MapCaseDto caze : mapCaseDtos) { - LeafletMarker marker = new LeafletMarker(); - CaseClassification caseClassification = caze.getCaseClassification(); - if (caseClassification == CaseClassification.CONFIRMED - || caseClassification == CaseClassification.CONFIRMED_NO_SYMPTOMS - || caseClassification == CaseClassification.CONFIRMED_UNKNOWN_SYMPTOMS) { - marker.setIcon(MarkerIcon.CASE_CONFIRMED); - } else if (caseClassification == CaseClassification.PROBABLE) { - marker.setIcon(MarkerIcon.CASE_PROBABLE); - } else if (caseClassification == CaseClassification.SUSPECT) { - marker.setIcon(MarkerIcon.CASE_SUSPECT); - } else { - marker.setIcon(MarkerIcon.CASE_UNCLASSIFIED); - } - - if (caze.getAddressLat() != null && caze.getAddressLon() != null) { - marker.setLatLon(caze.getAddressLat(), caze.getAddressLon()); - } else { - marker.setLatLon(caze.getReportLat(), caze.getReportLon()); - } + LeafletMarker marker = getLeafletMarker(caze); caseMarkers.add(marker); } @@ -1551,6 +1500,30 @@ private void showCaseMarkers(List cases) { map.addMarkerGroup("cases", caseMarkers); } + @NotNull + private static LeafletMarker getLeafletMarker(MapCaseDto caze) { + LeafletMarker marker = new LeafletMarker(); + CaseClassification caseClassification = caze.getCaseClassification(); + if (caseClassification == CaseClassification.CONFIRMED + || caseClassification == CaseClassification.CONFIRMED_NO_SYMPTOMS + || caseClassification == CaseClassification.CONFIRMED_UNKNOWN_SYMPTOMS) { + marker.setIcon(MarkerIcon.CASE_CONFIRMED); + } else if (caseClassification == CaseClassification.PROBABLE) { + marker.setIcon(MarkerIcon.CASE_PROBABLE); + } else if (caseClassification == CaseClassification.SUSPECT) { + marker.setIcon(MarkerIcon.CASE_SUSPECT); + } else { + marker.setIcon(MarkerIcon.CASE_UNCLASSIFIED); + } + + if (caze.getAddressLat() != null && caze.getAddressLon() != null) { + marker.setLatLon(caze.getAddressLat(), caze.getAddressLon()); + } else { + marker.setLatLon(caze.getReportLat(), caze.getReportLon()); + } + return marker; + } + private void fillCaseLists(List cases) { for (MapCaseDto caze : cases) { // these filters need to be used for the count too @@ -1558,7 +1531,7 @@ private void fillCaseLists(List cases) { if (caseClassificationOption == MapCaseClassificationOption.CONFIRMED_CASES_ONLY && classification != CaseClassification.CONFIRMED) continue; boolean hasCaseGps = - (caze.getAddressLat() != null && caze.getAddressLon() != null) || (caze.getReportLat() != null && caze.getReportLon() != null); + (caze.getAddressLat() != null && caze.getAddressLon() != null) || (caze.getReportLat() != null && caze.getReportLon() != null); boolean hasFacilityGps = caze.getHealthFacilityLat() != null && caze.getHealthFacilityLon() != null; if (mapCaseDisplayMode == MapCaseDisplayMode.CASE_ADDRESS) { @@ -1568,8 +1541,8 @@ private void fillCaseLists(List cases) { mapCaseDtos.add(caze); } else { if (FacilityDto.NONE_FACILITY_UUID.equals(caze.getHealthFacilityUuid()) - || FacilityDto.OTHER_FACILITY_UUID.equals(caze.getHealthFacilityUuid()) - || !hasFacilityGps) { + || FacilityDto.OTHER_FACILITY_UUID.equals(caze.getHealthFacilityUuid()) + || !hasFacilityGps) { if (mapCaseDisplayMode == MapCaseDisplayMode.FACILITY_OR_CASE_ADDRESS) { if (!hasCaseGps) { continue; @@ -1638,18 +1611,18 @@ private void showContactMarkers(List contacts) { // icon = MarkerIcon.CONTACT_LONG_OVERDUE; // } switch (contact.getContactClassification()) { - case CONFIRMED: - icon = MarkerIcon.CONTACT_LONG_OVERDUE; - break; - case UNCONFIRMED: - icon = MarkerIcon.CONTACT_OVERDUE; - break; - case NO_CONTACT: - icon = MarkerIcon.CONTACT_OK; - break; - default: - icon = MarkerIcon.CONTACT_OK; - break; + case CONFIRMED: + icon = MarkerIcon.CONTACT_LONG_OVERDUE; + break; + case UNCONFIRMED: + icon = MarkerIcon.CONTACT_OVERDUE; + break; + case NO_CONTACT: + icon = MarkerIcon.CONTACT_OK; + break; + default: + icon = MarkerIcon.CONTACT_OK; + break; } LeafletMarker marker = new LeafletMarker(); @@ -1678,14 +1651,14 @@ private void showEventMarkers(List events) { for (DashboardEventDto event : events) { MarkerIcon icon; switch (event.getEventStatus()) { - case EVENT: - icon = MarkerIcon.EVENT_OUTBREAK; - break; - case SIGNAL: - icon = MarkerIcon.EVENT_RUMOR; - break; - default: - continue; + case EVENT: + icon = MarkerIcon.EVENT_OUTBREAK; + break; + case SIGNAL: + icon = MarkerIcon.EVENT_RUMOR; + break; + default: + continue; } // Because events are pulled from the dashboardDataProvider, we do not need to add additional filters for event dates here @@ -1719,31 +1692,31 @@ private void showEventMarkers(List events) { protected void onMarkerClicked(String groupId, int markerIndex) { switch (groupId) { - case CASES_GROUP_ID: - if (markerIndex < markerCaseFacilities.size()) { - FacilityReferenceDto facility = markerCaseFacilities.get(markerIndex); - VerticalLayout layout = new VerticalLayout(); - Window window = VaadinUiUtil.showPopupWindow(layout); - CasePopupGrid caseGrid = new CasePopupGrid(window, facility, DashboardMapComponent.this); - caseGrid.setHeightMode(HeightMode.ROW); - layout.addComponent(caseGrid); - layout.setMargin(true); - FacilityDto facilityDto = FacadeProvider.getFacilityFacade().getByUuid(facility.getUuid()); - window.setCaption(I18nProperties.getCaption(Captions.dashboardCasesIn) + " " + facilityDto.buildCaption()); - } else { - markerIndex -= markerCaseFacilities.size(); - MapCaseDto caze = mapCaseDtos.get(markerIndex); - ControllerProvider.getCaseController().navigateToCase(caze.getUuid(), true); - } - break; - case CONTACTS_GROUP_ID: - MapContactDto contact = markerContacts.get(markerIndex); - ControllerProvider.getContactController().navigateToData(contact.getUuid(), true); - break; - case EVENTS_GROUP_ID: - DashboardEventDto event = markerEvents.get(markerIndex); - ControllerProvider.getEventController().navigateToData(event.getUuid(), true); - break; + case CASES_GROUP_ID: + if (markerIndex < markerCaseFacilities.size()) { + FacilityReferenceDto facility = markerCaseFacilities.get(markerIndex); + VerticalLayout layout = new VerticalLayout(); + Window window = VaadinUiUtil.showPopupWindow(layout); + CasePopupGrid caseGrid = new CasePopupGrid(window, facility, DashboardMapComponent.this); + caseGrid.setHeightMode(HeightMode.ROW); + layout.addComponent(caseGrid); + layout.setMargin(true); + FacilityDto facilityDto = FacadeProvider.getFacilityFacade().getByUuid(facility.getUuid()); + window.setCaption(I18nProperties.getCaption(Captions.dashboardCasesIn) + " " + facilityDto.buildCaption()); + } else { + markerIndex -= markerCaseFacilities.size(); + MapCaseDto caze = mapCaseDtos.get(markerIndex); + ControllerProvider.getCaseController().navigateToCase(caze.getUuid(), true); + } + break; + case CONTACTS_GROUP_ID: + MapContactDto contact = markerContacts.get(markerIndex); + ControllerProvider.getContactController().navigateToData(contact.getUuid(), true); + break; + case EVENTS_GROUP_ID: + DashboardEventDto event = markerEvents.get(markerIndex); + ControllerProvider.getEventController().navigateToData(event.getUuid(), true); + break; } } @@ -1772,15 +1745,15 @@ private void refreshMapDashboard(boolean forced) { if (!forced && maxDisplayCount >= 0) { count = getMarkerCount(fromDate, toDate, maxDisplayCount); } -if(dashboardDataProvider.getDashboardType().equals(DashboardType.DISEASE)) { - if (!forced && maxDisplayCount >= 0 && count > maxDisplayCount) { - makeMapOverlayVisible(maxDisplayCount); - } else { - makeMapOverlayInvisible(); + if(dashboardDataProvider.getDashboardType().equals(DashboardType.DISEASE)) { + if (!forced && maxDisplayCount >= 0 && count > maxDisplayCount) { + makeMapOverlayVisible(maxDisplayCount); + } else { + makeMapOverlayInvisible(); - loadMapData(fromDate, toDate); - } -} + loadMapData(fromDate, toDate); + } + } } public void refreshMapDashboard() { @@ -1799,3 +1772,7 @@ private void makeMapOverlayInvisible() { } } + + + + From 85eedbc6d63dec9339ea6a234cf77915d621e0fd Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Thu, 18 Jul 2024 12:30:51 +0000 Subject: [PATCH 45/71] fix to pass duplicate threshold on sonarcloud --- .../dashboard/DashboardFacadeEjbTest.java | 21 +++---- .../backend/disease/DiseaseFacadeEjbTest.java | 20 +----- .../backend/geo/RegionFacadeEjbTest.java | 24 +++---- .../outbreak/OutbreakFacadeEjbTest.java | 31 +++------ .../backend/sample/SampleFacadeEjbTest.java | 63 ++++--------------- .../ui/dashboard/DashboardDataProvider.java | 1 - .../disease/tile/DiseaseTileComponent.java | 38 ++++++----- .../tile/RegionalDiseaseBurdenGrid.java | 58 +++++++---------- .../disease/DiseaseDashboardServiceTest.java | 43 +++++-------- 9 files changed, 100 insertions(+), 199 deletions(-) diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java index 86fd5b7c820..5857901f0fa 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java @@ -1,20 +1,12 @@ package de.symeda.sormas.backend.dashboard; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import de.symeda.sormas.api.contact.ContactClassification; -import de.symeda.sormas.api.dashboard.*; -import org.junit.jupiter.api.Test; - import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.InvestigationStatus; import de.symeda.sormas.api.caze.NewCaseDateType; +import de.symeda.sormas.api.contact.ContactClassification; +import de.symeda.sormas.api.dashboard.*; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventInvestigationStatus; @@ -33,9 +25,14 @@ import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator.RDCF; +import org.junit.jupiter.api.Test; import org.testcontainers.shaded.org.apache.commons.lang3.time.DateUtils; -import static de.symeda.sormas.api.event.eventimport.EventImportEntities.createEvent; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + import static org.junit.jupiter.api.Assertions.*; public class DashboardFacadeEjbTest extends AbstractBeanTest { @@ -479,7 +476,6 @@ public void testGetEpiCurveSeriesElementsPerPresentCondition() { public void testGetCaseMeasurePerDistrict() { // Create necessary data for testing RDCF rdcf = creator.createRDCF(); - UserDto user = creator.createSurveillanceSupervisor(rdcf); Date currentDate = new Date(); // Define dashboard criteria @@ -501,7 +497,6 @@ public void testGetCaseMeasurePerDistrict() { public void testCountCasesConvertedFromContacts() { // Create necessary data for testing RDCF rdcf = creator.createRDCF(); - UserDto user = creator.createSurveillanceSupervisor(rdcf); Date currentDate = new Date(); // Define dashboard criteria diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java index bf872110ecf..95aedf6f857 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java @@ -3,36 +3,18 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.NewCaseDateType; -import de.symeda.sormas.api.dashboard.DashboardCriteria; import de.symeda.sormas.api.disease.DiseaseBurdenDto; -import de.symeda.sormas.api.event.EventCriteria; -import de.symeda.sormas.api.event.EventFacade; -import de.symeda.sormas.api.feature.FeatureConfigurationFacade; -import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; -import de.symeda.sormas.api.infrastructure.region.RegionFacade; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; -import de.symeda.sormas.api.outbreak.OutbreakCriteria; -import de.symeda.sormas.api.outbreak.OutbreakFacade; -import de.symeda.sormas.api.user.DefaultUserRole; -import de.symeda.sormas.api.user.UserDto; -import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.utils.criteria.CriteriaDateType; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; -import de.symeda.sormas.backend.dashboard.DashboardService; -import de.symeda.sormas.backend.infrastructure.district.District; -import org.junit.Before; import org.junit.jupiter.api.Test; import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.Mockito.when; public class DiseaseFacadeEjbTest extends AbstractBeanTest { @@ -115,7 +97,7 @@ public void testGetDiseaseGridForDashboard() { ); assertNotNull(result); - assertEquals(region, result.getRegion()); + assertEquals(region.getUuid(), result.getRegion().getUuid()); assertEquals("0", result.getTotal()); assertEquals("0", result.getActiveCases()); assertEquals("0", result.getRecovered()); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java index a068fd7d723..926699b7a09 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java @@ -1,27 +1,19 @@ package de.symeda.sormas.backend.geo; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - import de.symeda.sormas.api.infrastructure.region.RegionCriteria; +import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.api.infrastructure.region.RegionIndexDto; import de.symeda.sormas.api.utils.SortProperty; -import de.symeda.sormas.backend.util.QueryHelper; -import org.junit.jupiter.api.Test; - -import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.infrastructure.region.Region; -import org.mockito.Mockito; +import org.junit.jupiter.api.Test; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class RegionFacadeEjbTest extends AbstractBeanTest { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java index 96f6a50b20a..36db57988e6 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java @@ -17,36 +17,23 @@ *******************************************************************************/ package de.symeda.sormas.backend.outbreak; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -import java.util.*; -import java.util.stream.Collectors; - -import de.symeda.sormas.backend.infrastructure.district.District; -import org.junit.Before; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.outbreak.OutbreakCriteria; import de.symeda.sormas.api.outbreak.OutbreakDto; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator.RDCF; +import de.symeda.sormas.backend.infrastructure.district.District; +import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import javax.persistence.EntityManager; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Root; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.*; public class OutbreakFacadeEjbTest extends AbstractBeanTest { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java index 53e4996e9e4..10e92d91c24 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java @@ -17,39 +17,9 @@ *******************************************************************************/ package de.symeda.sormas.backend.sample; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; - -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.HashSet; -import java.util.List; -import java.util.stream.Collectors; - -import de.symeda.sormas.backend.contact.Contact; -import org.hamcrest.MatcherAssert; -import org.junit.jupiter.api.Test; - import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EntityRelevanceStatus; -import de.symeda.sormas.api.caze.CaseClassification; -import de.symeda.sormas.api.caze.CaseCriteria; -import de.symeda.sormas.api.caze.CaseDataDto; -import de.symeda.sormas.api.caze.CaseIndexDto; -import de.symeda.sormas.api.caze.InvestigationStatus; +import de.symeda.sormas.api.caze.*; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.contact.ContactCriteria; @@ -58,13 +28,7 @@ import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.dashboard.SampleDashboardCriteria; import de.symeda.sormas.api.dashboard.sample.MapSampleDto; -import de.symeda.sormas.api.event.EventDto; -import de.symeda.sormas.api.event.EventInvestigationStatus; -import de.symeda.sormas.api.event.EventParticipantCriteria; -import de.symeda.sormas.api.event.EventParticipantDto; -import de.symeda.sormas.api.event.EventParticipantIndexDto; -import de.symeda.sormas.api.event.EventStatus; -import de.symeda.sormas.api.event.TypeOfPlace; +import de.symeda.sormas.api.event.*; import de.symeda.sormas.api.feature.FeatureConfigurationIndexDto; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.I18nProperties; @@ -76,18 +40,7 @@ import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.person.Sex; -import de.symeda.sormas.api.sample.AdditionalTestDto; -import de.symeda.sormas.api.sample.AdditionalTestingStatus; -import de.symeda.sormas.api.sample.PathogenTestDto; -import de.symeda.sormas.api.sample.PathogenTestResultType; -import de.symeda.sormas.api.sample.PathogenTestType; -import de.symeda.sormas.api.sample.SampleAssociationType; -import de.symeda.sormas.api.sample.SampleCriteria; -import de.symeda.sormas.api.sample.SampleDto; -import de.symeda.sormas.api.sample.SampleIndexDto; -import de.symeda.sormas.api.sample.SampleMaterial; -import de.symeda.sormas.api.sample.SamplePurpose; -import de.symeda.sormas.api.sample.SampleSimilarityCriteria; +import de.symeda.sormas.api.sample.*; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; @@ -96,6 +49,16 @@ import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; import de.symeda.sormas.backend.TestDataCreator.RDCF; +import org.hamcrest.MatcherAssert; +import org.junit.jupiter.api.Test; + +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.api.Assertions.*; public class SampleFacadeEjbTest extends AbstractBeanTest { 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 3d19235cd89..5e1c2c2da71 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 @@ -26,7 +26,6 @@ import de.symeda.sormas.api.event.EventStatus; import de.symeda.sormas.api.outbreak.OutbreakCriteria; import de.symeda.sormas.api.sample.PathogenTestResultType; -import de.symeda.sormas.api.utils.DateHelper; import org.apache.commons.lang3.time.DateUtils; import java.util.*; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java index 1643a80848c..6e31e97edd1 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java @@ -30,6 +30,7 @@ import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; +import org.jetbrains.annotations.NotNull; public class DiseaseTileComponent extends VerticalLayout { @@ -108,20 +109,8 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo comparisonLayout.setMargin(false); comparisonLayout.setSpacing(false); - Label growthLabel = new Label("", ContentMode.HTML); - String chevronType; - if (previousCasesCount < casesCount) { - chevronType = VaadinIcons.CHEVRON_UP.getHtml(); - } else if (previousCasesCount > casesCount) { - chevronType = VaadinIcons.CHEVRON_DOWN.getHtml(); - } else { - chevronType = VaadinIcons.CHEVRON_RIGHT.getHtml(); - } - growthLabel.setValue("
" - + " " + chevronType + " " - + "
"); + + Label growthLabel = getLabel(casesCount, previousCasesCount); comparisonLayout.addComponent(growthLabel); @@ -144,6 +133,25 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo addComponent(layout); } + @NotNull + private static Label getLabel(Long casesCount, Long previousCasesCount) { + Label growthLabel = new Label("", ContentMode.HTML); + String chevronType; + if (previousCasesCount < casesCount) { + chevronType = VaadinIcons.CHEVRON_UP.getHtml(); + } else if (previousCasesCount > casesCount) { + chevronType = VaadinIcons.CHEVRON_DOWN.getHtml(); + } else { + chevronType = VaadinIcons.CHEVRON_RIGHT.getHtml(); + } + growthLabel.setValue("
" + + " " + chevronType + " " + + "
"); + return growthLabel; + } + private void addStatsLayout(DiseaseBurdenDto diseaseBurden,DashboardDataProvider dashboardDataProvider) { Long fatalities = diseaseBurden.getCaseDeathCount(); @@ -158,7 +166,7 @@ private void addStatsLayout(DiseaseBurdenDto diseaseBurden,DashboardDataProvider layout.addStyleName(CssStyles.BACKGROUND_HIGHLIGHT); StatsItem lastReportItem = new StatsItem.Builder(Captions.dashboardLastReport, - district.length() == 0 ? I18nProperties.getString(Strings.none) : district).singleColumn(true).build(); + district.isEmpty() ? I18nProperties.getString(Strings.none) : district).singleColumn(true).build(); lastReportItem.addStyleName(CssStyles.VSPACE_TOP_4); layout.addComponent(lastReportItem); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java index f80611a2504..2526bdfe125 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -182,27 +182,7 @@ public void reload() { diseaseBurdenDto.setRegion(regionDto); - diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(total), casePercental, "#5a95f4bf","#2f7df9")); - - diseaseBurdenDto.setTotalCount(makeDIvsCount(total)); - - diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(activeCases), casePercental, "#feba0199", "#dfa507")); - - diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases)); - - diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(recovered), casePercental, "#00e0a19c", "#038d66")); - - diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered)); - - diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(deaths), casePercental,"#FFAEAE", "#FF4040")); - - diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths)); - - diseaseBurdenDto.setOther(makeDIvs(Long.parseLong(other), casePercental,"#bf8678ba", "#91675d")); - - diseaseBurdenDto.setOtherCount(makeDIvsCount(other)); - - diseaseBurdenDtoList.add(diseaseBurdenDto); + diseaseBurdenDtoConfig(diseaseBurdenDtoList, casePercental, diseaseBurdenDto, total, activeCases, recovered, deaths, other); } }else { @@ -229,33 +209,37 @@ public void reload() { String other = diseaseBurdenDto.getOther(); - diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(total), casePercental, "#5a95f4bf","#2f7df9")); + diseaseBurdenDtoConfig(diseaseBurdenDtoList, casePercental, diseaseBurdenDto, total, activeCases, recovered, deaths, other); + } + } + + BeanItemContainer container = new BeanItemContainer<>(DiseaseBurdenDto.class, diseaseBurdenDtoList); + GeneratedPropertyContainer generatedContainer = new GeneratedPropertyContainer(container); + setContainerDataSource(generatedContainer); + } - diseaseBurdenDto.setTotalCount(makeDIvsCount(total)); + private void diseaseBurdenDtoConfig(List diseaseBurdenDtoList, Long casePercental, DiseaseBurdenDto diseaseBurdenDto, String total, String activeCases, String recovered, String deaths, String other) { + diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(total), casePercental, "#5a95f4bf","#2f7df9")); - diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(activeCases), casePercental, "#feba0199", "#dfa507")); + diseaseBurdenDto.setTotalCount(makeDIvsCount(total)); - diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases)); + diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(activeCases), casePercental, "#feba0199", "#dfa507")); - diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(recovered), casePercental, "#00e0a19c", "#038d66")); + diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases)); - diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered)); + diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(recovered), casePercental, "#00e0a19c", "#038d66")); - diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(deaths), casePercental,"#FFAEAE", "#FF4040")); + diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered)); - diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths)); + diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(deaths), casePercental,"#FFAEAE", "#FF4040")); - diseaseBurdenDto.setOther(makeDIvs(Long.parseLong(other), casePercental,"#bf8678ba", "#91675d")); + diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths)); - diseaseBurdenDto.setOtherCount(makeDIvsCount(other)); + diseaseBurdenDto.setOther(makeDIvs(Long.parseLong(other), casePercental,"#bf8678ba", "#91675d")); - diseaseBurdenDtoList.add(diseaseBurdenDto); - } - } + diseaseBurdenDto.setOtherCount(makeDIvsCount(other)); - BeanItemContainer container = new BeanItemContainer<>(DiseaseBurdenDto.class, diseaseBurdenDtoList); - GeneratedPropertyContainer generatedContainer = new GeneratedPropertyContainer(container); - setContainerDataSource(generatedContainer); + diseaseBurdenDtoList.add(diseaseBurdenDto); } public String makeDIvs(long number, long total, String lightColor, String deepColor) { diff --git a/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java b/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java index c51c0a8ad55..3a2fa5d411a 100644 --- a/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java +++ b/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java @@ -1,30 +1,11 @@ package de.symeda.sormas.ui.dashboard.disease; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import de.symeda.sormas.api.caze.CaseOutcome; -import de.symeda.sormas.api.caze.NewCaseDateType; -import de.symeda.sormas.backend.disease.DiseaseConfigurationFacadeEjb; -import de.symeda.sormas.backend.disease.DiseaseFacadeEjb; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.dashboard.DashboardCriteria; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.event.EventCriteria; -import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; @@ -32,17 +13,30 @@ import de.symeda.sormas.api.utils.criteria.CriteriaDateType; import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal; import de.symeda.sormas.backend.dashboard.DashboardService; +import de.symeda.sormas.backend.disease.DiseaseConfigurationFacadeEjb; +import de.symeda.sormas.backend.disease.DiseaseFacadeEjb; import de.symeda.sormas.backend.event.EventFacadeEjb.EventFacadeEjbLocal; import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb; import de.symeda.sormas.backend.infrastructure.district.District; import de.symeda.sormas.backend.infrastructure.region.RegionFacadeEjb.RegionFacadeEjbLocal; import de.symeda.sormas.backend.outbreak.OutbreakFacadeEjb.OutbreakFacadeEjbLocal; import de.symeda.sormas.backend.person.PersonFacadeEjb.PersonFacadeEjbLocal; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; -public class DiseaseDashboardServiceTest { +import java.util.Date; +import java.util.HashMap; +import java.util.Map; - @Mock - private CaseFacadeEjbLocal caseFacade; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +public class DiseaseDashboardServiceTest { @Mock private EventFacadeEjbLocal eventFacade; @@ -50,9 +44,6 @@ public class DiseaseDashboardServiceTest { @Mock private OutbreakFacadeEjbLocal outbreakFacade; - @Mock - private PersonFacadeEjbLocal personFacade; - @Mock private DiseaseConfigurationFacadeEjb.DiseaseConfigurationFacadeEjbLocal diseaseConfigurationFacade; From 2db1e9480d1cc4a22e3b1bc6639e233edcc8de3c Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Thu, 18 Jul 2024 14:18:38 +0000 Subject: [PATCH 46/71] Duplicate line fix on dashboardMapComponent --- .../dashboard/map/DashboardMapComponent.java | 136 ++++++------------ 1 file changed, 46 insertions(+), 90 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index 1a73ab8f52c..2271328c0df 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -19,6 +19,7 @@ import com.vaadin.icons.VaadinIcons; import com.vaadin.server.ExternalResource; +import com.vaadin.server.Sizeable; import com.vaadin.shared.ui.ContentMode; import com.vaadin.ui.*; import com.vaadin.ui.themes.ValoTheme; @@ -401,63 +402,10 @@ private HorizontalLayout createMapFooter() { }); layersLayout.addComponent(showEventsCheckBox); if (nonNull(UserProvider.getCurrent()) && UserProvider.getCurrent().hasNationJurisdictionLevel()) { - OptionGroup regionMapVisualizationSelect = new OptionGroup(); - regionMapVisualizationSelect.setWidth(100, Unit.PERCENTAGE); - regionMapVisualizationSelect.addItems((Object[]) CaseMeasure.values()); - regionMapVisualizationSelect.setValue(caseMeasure); - regionMapVisualizationSelect.addValueChangeListener(event -> { - caseMeasure = (CaseMeasure) event.getProperty().getValue(); - refreshMapDashboard(true); - }); - - HorizontalLayout showRegionsLayout = new HorizontalLayout(); - { - showRegionsLayout.setMargin(false); - showRegionsLayout.setSpacing(false); - CheckBox showRegionsCheckBox = new CheckBox(); - showRegionsCheckBox.setId(Captions.dashboardShowRegions); - showRegionsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowRegions)); - showRegionsCheckBox.setValue(showRegions); - showRegionsCheckBox.addValueChangeListener(e -> { - showRegions = (boolean) e.getProperty().getValue(); - regionMapVisualizationSelect.setEnabled(showRegions); - regionMapVisualizationSelect.setValue(caseMeasure); - refreshMapDashboard(true); - }); - showRegionsLayout.addComponent(showRegionsCheckBox); - - Label infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); - infoLabel.setDescription(I18nProperties.getString(Strings.infoCaseIncidence)); - CssStyles.style(infoLabel, CssStyles.LABEL_MEDIUM, CssStyles.LABEL_SECONDARY, CssStyles.HSPACE_LEFT_3); - infoLabel.setHeightUndefined(); - showRegionsLayout.addComponent(infoLabel); - showRegionsLayout.setComponentAlignment(infoLabel, Alignment.TOP_CENTER); - } - layersLayout.addComponent(showRegionsLayout); - layersLayout.addComponent(regionMapVisualizationSelect); - regionMapVisualizationSelect.setEnabled(showRegions); + regionalOptionGroupHorizontalLayoutConfigMap(layersLayout); } - CheckBox hideOtherCountriesCheckBox = new CheckBox(); - hideOtherCountriesCheckBox.setId(Captions.dashboardHideOtherCountries); - hideOtherCountriesCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardHideOtherCountries)); - hideOtherCountriesCheckBox.setValue(hideOtherCountries); - hideOtherCountriesCheckBox.addValueChangeListener(e -> { - hideOtherCountries = (boolean) e.getProperty().getValue(); - refreshMapDashboard(true); - }); - CssStyles.style(hideOtherCountriesCheckBox, CssStyles.VSPACE_3); - layersLayout.addComponent(hideOtherCountriesCheckBox); - - CheckBox showCurrentEpiSituationCB = new CheckBox(); - showCurrentEpiSituationCB.setId(Captions.dashboardMapShowEpiSituation); - showCurrentEpiSituationCB.setCaption(I18nProperties.getCaption(Captions.dashboardMapShowEpiSituation)); - showCurrentEpiSituationCB.setValue(false); - showCurrentEpiSituationCB.addValueChangeListener(e -> { - showCurrentEpiSituation = (boolean) e.getProperty().getValue(); - refreshMapDashboard(true); - }); - layersLayout.addComponent(showCurrentEpiSituationCB); + checkBoxesHideOtherCountriesAndShowCurrentEpiSituationCBConfig(layersLayout); createPeriodFilters(layersLayout); } @@ -471,6 +419,44 @@ private HorizontalLayout createMapFooter() { return mapFooterLayout; } + private void regionalOptionGroupHorizontalLayoutConfigMap(VerticalLayout layersLayout) { + OptionGroup regionMapVisualizationSelect = new OptionGroup(); + regionMapVisualizationSelect.setWidth(100, Unit.PERCENTAGE); + regionMapVisualizationSelect.addItems((Object[]) CaseMeasure.values()); + regionMapVisualizationSelect.setValue(caseMeasure); + regionMapVisualizationSelect.addValueChangeListener(event -> { + caseMeasure = (CaseMeasure) event.getProperty().getValue(); + refreshMapDashboard(true); + }); + + HorizontalLayout showRegionsLayout = new HorizontalLayout(); + { + showRegionsLayout.setMargin(false); + showRegionsLayout.setSpacing(false); + CheckBox showRegionsCheckBox = new CheckBox(); + showRegionsCheckBox.setId(Captions.dashboardShowRegions); + showRegionsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowRegions)); + showRegionsCheckBox.setValue(showRegions); + showRegionsCheckBox.addValueChangeListener(e -> { + showRegions = (boolean) e.getProperty().getValue(); + regionMapVisualizationSelect.setEnabled(showRegions); + regionMapVisualizationSelect.setValue(caseMeasure); + refreshMapDashboard(true); + }); + showRegionsLayout.addComponent(showRegionsCheckBox); + + Label infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); + infoLabel.setDescription(I18nProperties.getString(Strings.infoCaseIncidence)); + CssStyles.style(infoLabel, CssStyles.LABEL_MEDIUM, CssStyles.LABEL_SECONDARY, CssStyles.HSPACE_LEFT_3); + infoLabel.setHeightUndefined(); + showRegionsLayout.addComponent(infoLabel); + showRegionsLayout.setComponentAlignment(infoLabel, Alignment.TOP_CENTER); + } + layersLayout.addComponent(showRegionsLayout); + layersLayout.addComponent(regionMapVisualizationSelect); + regionMapVisualizationSelect.setEnabled(showRegions); + } + private VerticalLayout createMapLegend() { VerticalLayout legendLayout = new VerticalLayout(); legendLayout.setSpacing(false); @@ -1023,43 +1009,13 @@ protected void addLayerOptions(VerticalLayout layersLayout) { } if (UiUtil.hasNationJurisdictionLevel() && UiUtil.permitted(UserRight.CASE_VIEW)) { - OptionGroup regionMapVisualizationSelect = new OptionGroup(); - regionMapVisualizationSelect.setWidth(100, Unit.PERCENTAGE); - regionMapVisualizationSelect.addItems((Object[]) CaseMeasure.values()); - regionMapVisualizationSelect.setValue(caseMeasure); - regionMapVisualizationSelect.addValueChangeListener(event -> { - caseMeasure = (CaseMeasure) event.getProperty().getValue(); - refreshMapDashboard(true); - }); - - HorizontalLayout showRegionsLayout = new HorizontalLayout(); - { - showRegionsLayout.setMargin(false); - showRegionsLayout.setSpacing(false); - CheckBox showRegionsCheckBox = new CheckBox(); - showRegionsCheckBox.setId(Captions.dashboardShowRegions); - showRegionsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowRegions)); - showRegionsCheckBox.setValue(showRegions); - showRegionsCheckBox.addValueChangeListener(e -> { - showRegions = (boolean) e.getProperty().getValue(); - regionMapVisualizationSelect.setEnabled(showRegions); - regionMapVisualizationSelect.setValue(caseMeasure); - refreshMapDashboard(true); - }); - showRegionsLayout.addComponent(showRegionsCheckBox); - - Label infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); - infoLabel.setDescription(I18nProperties.getString(Strings.infoCaseIncidence)); - CssStyles.style(infoLabel, CssStyles.LABEL_MEDIUM, CssStyles.LABEL_SECONDARY, CssStyles.HSPACE_LEFT_3); - infoLabel.setHeightUndefined(); - showRegionsLayout.addComponent(infoLabel); - showRegionsLayout.setComponentAlignment(infoLabel, Alignment.TOP_CENTER); - } - layersLayout.addComponent(showRegionsLayout); - layersLayout.addComponent(regionMapVisualizationSelect); - regionMapVisualizationSelect.setEnabled(showRegions); + regionalOptionGroupHorizontalLayoutConfigMap(layersLayout); } + checkBoxesHideOtherCountriesAndShowCurrentEpiSituationCBConfig(layersLayout); + } + + private void checkBoxesHideOtherCountriesAndShowCurrentEpiSituationCBConfig(VerticalLayout layersLayout) { CheckBox hideOtherCountriesCheckBox = new CheckBox(); hideOtherCountriesCheckBox.setId(Captions.dashboardHideOtherCountries); hideOtherCountriesCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardHideOtherCountries)); From db3c8c540c67ccd917b3f2f80d4fc595ef69bdeb Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Thu, 18 Jul 2024 18:11:30 +0000 Subject: [PATCH 47/71] sampleservicetest updated --- .../sormas/backend/sample/SampleService.java | 2 +- .../backend/sample/SampleServiceTest.java | 159 +++++++++++++++++- 2 files changed, 151 insertions(+), 10 deletions(-) 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 3f72dc0d16b..4c68df1c564 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 @@ -976,7 +976,7 @@ private Predicate buildSampleListCriteriaFilter(SampleCriteria criteria, Criteri return filter; } - private boolean sampleAssignedToActiveEntity(String sampleUuid) { + protected boolean sampleAssignedToActiveEntity(String sampleUuid) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Boolean.class); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleServiceTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleServiceTest.java index 27cba075c46..b1be40eb791 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleServiceTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleServiceTest.java @@ -1,29 +1,40 @@ package de.symeda.sormas.backend.sample; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.util.List; - -import org.junit.jupiter.api.Test; - +import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; +import de.symeda.sormas.api.contact.ContactDto; +import de.symeda.sormas.api.event.*; import de.symeda.sormas.api.externalmessage.ExternalMessageDto; +import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.api.sample.SampleAssociationType; +import de.symeda.sormas.api.sample.SampleCriteria; import de.symeda.sormas.api.sample.SampleDto; import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; +import org.junit.jupiter.api.Test; + +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.criteria.*; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Date; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; /** * @see SampleService */ public class SampleServiceTest extends AbstractBeanTest { + @Inject + private EntityManager em; @Test public void testSamplePermanentDeletion() { @@ -64,4 +75,134 @@ public void testSamplePermanentDeletion() { assertNull(getSampleService().getByUuid(referralSample.getUuid()).getReferredTo()); assertNull(getSampleReportService().getByUuid(labMessage.getSampleReports().get(0).getUuid()).getSample()); } + @Test + public void testBuildSampleListCriteriaFilterForCase() throws Exception { + // Prepare data + SampleCriteria criteria = new SampleCriteria(); + criteria.sampleAssociationType(SampleAssociationType.CASE); + TestDataCreator.RDCF rdcf = creator.createRDCF(); + UserDto user = creator + .createUser(rdcf, creator.getUserRoleReference(DefaultUserRole.ADMIN), creator.getUserRoleReference(DefaultUserRole.NATIONAL_USER)); + PersonDto person = creator.createPerson(); + CaseDataDto caze = creator.createCase(user.toReference(), person.toReference(), rdcf); + criteria.caze(caze.toReference()); + + // Create a CriteriaBuilder, CriteriaQuery, Root, and SampleJoins + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Sample.class); + Root root = cq.from(Sample.class); + SampleJoins joins = new SampleJoins(root); + // Access private method using reflection + Method method = SampleService.class.getDeclaredMethod("buildSampleListCriteriaFilter", SampleCriteria.class, CriteriaBuilder.class, SampleJoins.class, From.class); + method.setAccessible(true); + + Predicate predicate = (Predicate) method.invoke(getSampleService(), criteria, cb, joins, root); + + assertNotNull(predicate); + } + + + @Test + public void testBuildSampleListCriteriaFilterForContact() throws Exception { + // Prepare data + SampleCriteria criteria = new SampleCriteria(); + criteria.sampleAssociationType(SampleAssociationType.CONTACT); + + TestDataCreator.RDCF rdcf = creator.createRDCF(); + UserDto user = creator + .createUser(rdcf, creator.getUserRoleReference(DefaultUserRole.ADMIN), creator.getUserRoleReference(DefaultUserRole.NATIONAL_USER)); + PersonDto person = creator.createPerson(); + CaseDataDto caze = creator.createCase(user.toReference(), person.toReference(), rdcf); + + ContactDto contactDto = creator.createContact(user.toReference(), creator.createPerson("Contact", "Person").toReference(), caze, rdcf); + criteria.contact(contactDto.toReference()); + + // Create a CriteriaBuilder, CriteriaQuery, Root, and SampleJoins + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Sample.class); + Root root = cq.from(Sample.class); + SampleJoins joins = new SampleJoins(root); + + // Access private method using reflection + Method method = SampleService.class.getDeclaredMethod("buildSampleListCriteriaFilter", SampleCriteria.class, CriteriaBuilder.class, SampleJoins.class, From.class); + method.setAccessible(true); + + Predicate predicate = (Predicate) method.invoke(getSampleService(), criteria, cb, joins, root); + + assertNotNull(predicate); + } + + @Test + public void testBuildSampleListCriteriaFilterForEventParticipant() throws Exception { + // Prepare data + SampleCriteria criteria = new SampleCriteria(); + criteria.sampleAssociationType(SampleAssociationType.EVENT_PARTICIPANT); + + TestDataCreator.RDCF rdcf = creator.createRDCF(); + UserDto user = creator + .createUser(rdcf, creator.getUserRoleReference(DefaultUserRole.ADMIN), creator.getUserRoleReference(DefaultUserRole.NATIONAL_USER)); + EventDto eventDto = creator.createEvent( + EventStatus.SIGNAL, + EventInvestigationStatus.PENDING, + "Title", + "Description", + "First", + "Name", + "12345", + TypeOfPlace.PUBLIC_PLACE, + DateHelper.subtractDays(new Date(), 1), + new Date(), + user.toReference(), + user.toReference(), + Disease.EVD, + rdcf); + PersonDto eventPerson = creator.createPerson("Event", "Person"); + EventParticipantDto eventParticipantDto = creator.createEventParticipant(eventDto.toReference(), eventPerson, "Description", user.toReference()); + + criteria.eventParticipant(eventParticipantDto.toReference()); + + // Create a CriteriaBuilder, CriteriaQuery, Root, and SampleJoins + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Sample.class); + Root root = cq.from(Sample.class); + SampleJoins joins = new SampleJoins(root); + + // Access private method using reflection + Method method = SampleService.class.getDeclaredMethod("buildSampleListCriteriaFilter", SampleCriteria.class, CriteriaBuilder.class, SampleJoins.class, From.class); + method.setAccessible(true); + + Predicate predicate = (Predicate) method.invoke(getSampleService(), criteria, cb, joins, root); + + assertNotNull(predicate); + } + + + @Test + public void testIsEditAllowed() throws InvocationTargetException, IllegalAccessException { + TestDataCreator.RDCF rdcf = creator.createRDCF(); + + UserDto user = creator + .createUser(rdcf, creator.getUserRoleReference(DefaultUserRole.ADMIN), creator.getUserRoleReference(DefaultUserRole.NATIONAL_USER)); + PersonDto person = creator.createPerson(); + CaseDataDto caze = creator.createCase(user.toReference(), person.toReference(), rdcf); + + SampleDto sample = creator.createSample(caze.toReference(), user.toReference(), rdcf.facility); + + Sample sampleEntity = getSampleService().getByUuid(sample.getUuid()); + + getFeatureConfigurationFacade().isFeatureDisabled(FeatureType.EDIT_ARCHIVED_ENTITIES); + + boolean sormasToSormasOriginInfoAndNotOwnershipHandoverStatus = (sample.getSormasToSormasOriginInfo() != null && !sample.getSormasToSormasOriginInfo().isOwnershipHandedOver()); + assertFalse(sormasToSormasOriginInfoAndNotOwnershipHandoverStatus); + + boolean isEditAllowed = getSampleService().isEditAllowed(sampleEntity) && !getSampleService().sampleAssignedToActiveEntity(sample.getUuid()); + assertFalse(isEditAllowed); + + boolean notOwnerShipAndJurisdictionFlagStatus = getSampleService().getJurisdictionFlags(sampleEntity).getInJurisdiction() && !getSormasToSormasShareInfoService().isSamlpeOwnershipHandedOver(sampleEntity); + assertTrue(notOwnerShipAndJurisdictionFlagStatus); + + } + + + } From 83e3b2814e682b4d05551d11b7cdc9b74ff7b32e Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Fri, 13 Sep 2024 19:41:17 +0000 Subject: [PATCH 48/71] clean up after review --- .../java/de/symeda/sormas/api/Disease.java | 3 +- .../de/symeda/sormas/api/FacadeProvider.java | 6 - .../sormas/api/caze/CaseClassification.java | 2 - .../symeda/sormas/api/caze/CaseCriteria.java | 3 +- .../de/symeda/sormas/api/caze/CaseFacade.java | 5 +- .../symeda/sormas/api/caze/CaseOutcome.java | 2 +- .../sormas/api/caze/NewCaseDateType.java | 2 +- .../api/dashboard/BaseDashboardCriteria.java | 4 +- .../api/dashboard/DashboardCaseDto.java | 5 +- .../api/dashboard/DashboardCriteria.java | 29 +- .../sormas/api/dashboard/DashboardFacade.java | 25 +- .../api/dashboard/NewDateFilterType.java | 6 +- .../SurveillanceDashboardCriteria.java | 4 - .../sormas/api/disease/DiseaseBurdenDto.java | 4 +- .../sormas/api/disease/DiseaseFacade.java | 60 ---- .../sormas/api/event/EventCriteria.java | 18 +- .../district/DistrictReferenceDto.java | 2 - .../api/infrastructure/region/RegionDto.java | 4 +- .../infrastructure/region/RegionFacade.java | 21 +- .../region/RegionReferenceDto.java | 2 - .../sormas/api/outbreak/OutbreakCriteria.java | 4 +- .../sormas/api/person/PersonFacade.java | 5 +- .../api/sample/PathogenTestResultType.java | 3 +- .../sormas/api/sample/SampleFacade.java | 4 - .../sormas/api/user/NotificationType.java | 1 - .../de/symeda/sormas/api/user/UserRight.java | 4 +- .../sormas/api/user/UserRightGroup.java | 3 +- .../symeda/sormas/api/utils/DateHelper.java | 10 - sormas-api/src/main/resources/enum.properties | 7 + .../src/main/resources/strings.properties | 1 - .../sormas/api/caze/CaseCriteriaTest.java | 2 - .../sormas/backend/caze/CaseFacadeEjb.java | 2 - .../sormas/backend/caze/CaseService.java | 4 - .../sormas/backend/common/BaseAdoService.java | 2 +- .../backend/contact/ContactFacadeEjb.java | 4 +- .../backend/contact/ContactService.java | 7 +- .../backend/dashboard/DashboardFacadeEjb.java | 135 +++++++- .../backend/dashboard/DashboardService.java | 44 ++- .../backend/disease/DiseaseFacadeEjb.java | 217 ------------- .../event/EventParticipantService.java | 1 - .../region/RegionFacadeEjb.java | 37 +-- .../backend/outbreak/OutbreakFacadeEjb.java | 3 +- .../backend/outbreak/OutbreakService.java | 6 +- .../backend/person/PersonFacadeEjb.java | 151 +++++++-- .../backend/sample/SampleFacadeEjb.java | 7 - .../sormas/backend/sample/SampleService.java | 18 +- .../de/symeda/sormas/backend/user/User.java | 3 - .../sormas/backend/AbstractBeanTest.java | 8 +- .../sormas/backend/TestDataCreator.java | 2 +- .../dashboard/DashboardFacadeEjbTest.java | 289 ++---------------- .../backend/disease/DiseaseFacadeEjbTest.java | 6 +- .../backend/geo/RegionFacadeEjbTest.java | 21 +- .../outbreak/OutbreakFacadeEjbTest.java | 19 +- .../backend/sample/SampleFacadeEjbTest.java | 67 ++-- .../backend/sample/SampleServiceTest.java | 50 +-- .../AbstractDashboardDataProvider.java | 10 +- .../ui/dashboard/AbstractDashboardView.java | 92 +----- .../ui/dashboard/DashboardController.java | 20 +- .../ui/dashboard/DashboardDataProvider.java | 106 +++---- .../sormas/ui/dashboard/DashboardType.java | 5 +- .../components/DashboardFilterLayout.java | 82 ++--- .../contacts/ContactsDashboardView.java | 2 +- .../DiseaseDetailsComponent.java | 24 +- .../diseasedetails/DiseaseDetailsView.java | 51 ++-- .../DiseaseDetailsViewLayout.java | 16 +- .../diseasedetails/DiseaseFilterLayout.java | 33 -- .../map/BaseDashboardMapComponent.java | 2 +- .../dashboard/map/DashboardMapComponent.java | 84 ++--- .../ui/dashboard/map/MapCasePeriodOption.java | 20 +- .../ui/dashboard/map/MapPeriodType.java | 2 - .../dashboard/sample/SampleDashboardView.java | 2 +- .../SurveillanceDashboardView.java | 4 +- .../SurveillanceOverviewLayout.java | 1 - .../components/SurveillanceFilterLayout.java | 12 +- .../disease/DiseaseOverviewComponent.java | 9 +- .../burden/DiseaseBurdenComponent.java | 1 + .../disease/tile/DiseaseTileComponent.java | 30 +- .../disease/tile/DiseaseTileViewLayout.java | 2 - .../tile/RegionalDiseaseBurdenGrid.java | 64 ++-- .../builders/SurveillanceEpiCurveBuilder.java | 2 +- .../de/symeda/sormas/ui/utils/CssStyles.java | 1 - .../disease/DiseaseDashboardServiceTest.java | 14 +- 82 files changed, 836 insertions(+), 1209 deletions(-) delete mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java delete mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java delete mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/Disease.java b/sormas-api/src/main/java/de/symeda/sormas/api/Disease.java index 854134e8b09..e1c5c9f7349 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/Disease.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/Disease.java @@ -18,10 +18,9 @@ import java.util.Arrays; import java.util.List; -import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.statistics.StatisticsGroupingKey; -@AuditedClass + public enum Disease implements StatisticsGroupingKey { 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 466165a1cb1..e731a9dd8e0 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 @@ -41,7 +41,6 @@ import de.symeda.sormas.api.dashboard.sample.SampleDashboardFacade; import de.symeda.sormas.api.deletionconfiguration.DeletionConfigurationFacade; import de.symeda.sormas.api.disease.DiseaseConfigurationFacade; -import de.symeda.sormas.api.disease.DiseaseFacade; import de.symeda.sormas.api.docgeneneration.DocumentTemplateFacade; import de.symeda.sormas.api.docgeneneration.EventDocumentFacade; import de.symeda.sormas.api.docgeneneration.QuarantineOrderFacade; @@ -528,11 +527,6 @@ public static ManualMessageLogFacade getManualMessageLogFacade() { return get().lookupEjbRemote(ManualMessageLogFacade.class); } - public static DiseaseFacade getDiseaseFacade() { - return get().lookupEjbRemote(DiseaseFacade.class); - } - - @SuppressWarnings("unchecked") public static SpecialCaseAccessFacade getSpecialCaseAccessFacade() { return get().lookupEjbRemote(SpecialCaseAccessFacade.class); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseClassification.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseClassification.java index 44627019ff4..4e07522ead7 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseClassification.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseClassification.java @@ -21,11 +21,9 @@ import java.util.EnumSet; import java.util.Set; -import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.statistics.StatisticsGroupingKey; -@AuditedClass public enum CaseClassification implements StatisticsGroupingKey { 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 63d994c0bac..7e6e398c3d9 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 @@ -22,7 +22,6 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EntityRelevanceStatus; -import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.contact.FollowUpStatus; import de.symeda.sormas.api.contact.QuarantineType; import de.symeda.sormas.api.disease.DiseaseVariant; @@ -43,7 +42,7 @@ import de.symeda.sormas.api.utils.IgnoreForUrl; import de.symeda.sormas.api.utils.criteria.CriteriaDateType; import de.symeda.sormas.api.utils.criteria.CriteriaWithDateType; -@AuditedClass + public class CaseCriteria extends CriteriaWithDateType implements ExternalShareCriteria, Cloneable { private static final long serialVersionUID = 5114202107622217837L; 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 1f63f927fc3..ef6805b3afc 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 @@ -18,7 +18,10 @@ package de.symeda.sormas.api.caze; import java.math.BigDecimal; -import java.util.*; +import java.util.Collection; +import java.util.Date; +import java.util.List; +import java.util.Random; import javax.ejb.Remote; import javax.validation.Valid; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseOutcome.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseOutcome.java index 8935eee94ba..e1f70e5bd34 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseOutcome.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseOutcome.java @@ -27,7 +27,7 @@ public enum CaseOutcome NO_OUTCOME, DECEASED, RECOVERED, - UNKNOWN, OTHER; + UNKNOWN; public String getName() { return this.name(); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/NewCaseDateType.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/NewCaseDateType.java index 3c316eda2b2..477ff198be2 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/NewCaseDateType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/NewCaseDateType.java @@ -30,7 +30,7 @@ public enum NewCaseDateType MOST_RELEVANT, ONSET, - REPORT, CLASSIFICATION, CREATION, INVESTIGATION; + REPORT; @Override public String toString() { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/BaseDashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/BaseDashboardCriteria.java index 034b81d0542..2c750cad526 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/BaseDashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/BaseDashboardCriteria.java @@ -19,11 +19,11 @@ import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.audit.AuditExcludeProperty; -import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.utils.criteria.BaseCriteria; import de.symeda.sormas.api.utils.criteria.CriteriaDateType; +import de.symeda.sormas.api.caze.NewCaseDateType; public class BaseDashboardCriteria> extends BaseCriteria { @@ -36,8 +36,6 @@ public class BaseDashboardCriteria> extend private Date dateTo; private Date previousDateFrom; private Date previousDateTo; - - protected Class criteriaDateType; protected NewCaseDateType dateTypeClass; protected BaseDashboardCriteria(final Class selfClass) { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java index 178c259a028..24012d904ab 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCaseDto.java @@ -17,13 +17,11 @@ import java.util.Date; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseReferenceDefinition; import de.symeda.sormas.api.person.PresentCondition; import de.symeda.sormas.api.uuid.AbstractUuidDto; -@AuditedClass public class DashboardCaseDto extends AbstractUuidDto { private static final long serialVersionUID = -5705128377788207648L; @@ -38,7 +36,7 @@ public class DashboardCaseDto extends AbstractUuidDto { private Disease causeOfDeathDisease; private CaseReferenceDefinition caseReferenceDefinition; - private final DashboardQuarantineDataDto dashboardQuarantineDataDto; + private DashboardQuarantineDataDto dashboardQuarantineDataDto; public DashboardCaseDto( long id, @@ -62,7 +60,6 @@ public DashboardCaseDto( this.caseReferenceDefinition = caseReferenceDefinition; } - public long getId() { return id; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java index 1459995097b..b7d1ec03004 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java @@ -1,42 +1,26 @@ package de.symeda.sormas.api.dashboard; import de.symeda.sormas.api.CaseMeasure; -import de.symeda.sormas.api.audit.AuditedClass; +import de.symeda.sormas.api.utils.criteria.CriteriaDateType; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseOutcome; import de.symeda.sormas.api.caze.NewCaseDateType; -import de.symeda.sormas.api.utils.criteria.CriteriaDateType; -@AuditedClass public class DashboardCriteria extends BaseDashboardCriteria { - private CriteriaDateType newCaseDateType; private EpiCurveGrouping epiCurveGrouping; private boolean showMinimumEntries; private CaseMeasure caseMeasure; private boolean includeNotACaseClassification; - private CaseClassification caseClassification; private NewDateFilterType dateFilterType; - private CaseOutcome outcome; - public DashboardCriteria(NewCaseDateType dateTypeClass) { - super(DashboardCriteria.class); - this.dateTypeClass=dateTypeClass; - } public DashboardCriteria() { super(DashboardCriteria.class); } - public DashboardCriteria(Class dateTypeClass) { - super(DashboardCriteria.class); - this.criteriaDateType=dateTypeClass; - - } - - public CriteriaDateType getNewCaseDateType() { return newCaseDateType; } @@ -59,11 +43,6 @@ public EpiCurveGrouping getEpiCurveGrouping() { return epiCurveGrouping; } - public DashboardCriteria setEpiCurveGrouping(EpiCurveGrouping epigrouping) { - this.epiCurveGrouping = epigrouping; - return self; - } - public boolean isIncludeNotACaseClassification() { return includeNotACaseClassification; } @@ -76,8 +55,6 @@ public CaseMeasure getCaseMeasure() { return caseMeasure; } - - public CaseClassification getCaseClassification() { return caseClassification; } @@ -104,4 +81,8 @@ public CaseOutcome getOutcome() { return outcome; } + public DashboardCriteria setDateTypeClass(NewCaseDateType dateTypeClass) { + this.dateTypeClass = dateTypeClass; + return this; + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardFacade.java index b67ac432e86..1a5a30a92f3 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardFacade.java @@ -15,6 +15,7 @@ import de.symeda.sormas.api.person.PresentCondition; import de.symeda.sormas.api.sample.PathogenTestResultType; import de.symeda.sormas.api.utils.criteria.CriteriaDateType; +import de.symeda.sormas.api.Disease; @Remote public interface DashboardFacade { @@ -60,5 +61,27 @@ List getDiseaseBurden( Date previousToDate, CriteriaDateType newCaseDateType); - Map getTestResultCountByResultType(DashboardCriteria dashboardCriteria); + DiseaseBurdenDto getDiseaseForDashboard( + RegionReferenceDto regionRef, + DistrictReferenceDto districtRef, + Disease disease, + Date fromDate, + Date toDate, + Date previousFromDate, + Date previousToDate, + CriteriaDateType newCaseDateType, + CaseClassification caseClassification + ); + + DiseaseBurdenDto getDiseaseGridForDashboard( + RegionReferenceDto regionRef, + DistrictReferenceDto districtRef, + Disease disease, + Date from, + Date to, + Date previousFromDate, + Date previousToDate, + CriteriaDateType newCaseDateType, + CaseClassification caseClassification + ); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/NewDateFilterType.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/NewDateFilterType.java index f82ef02a669..9b15d4d269d 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/NewDateFilterType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/NewDateFilterType.java @@ -1,4 +1,3 @@ - /******************************************************************************* * SORMAS® - Surveillance Outbreak Response Management & Analysis System * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) @@ -16,7 +15,6 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ - package de.symeda.sormas.api.dashboard; public enum NewDateFilterType { @@ -26,6 +24,4 @@ public enum NewDateFilterType { LAST_WEEK, THIS_YEAR, CUSTOM; - - -} +} \ No newline at end of file diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/SurveillanceDashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/SurveillanceDashboardCriteria.java index b9a647589bb..59e412f5162 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/SurveillanceDashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/SurveillanceDashboardCriteria.java @@ -6,10 +6,6 @@ public class SurveillanceDashboardCriteria extends DashboardCriteria { private NewCaseDateType newCaseDateType; - public SurveillanceDashboardCriteria() { - super(); - } - @Override public NewCaseDateType getNewCaseDateType() { return newCaseDateType; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java index 44dfd25b1ec..542a89dce53 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java @@ -18,14 +18,12 @@ package de.symeda.sormas.api.disease; import java.io.Serializable; -import java.util.Date; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.infrastructure.region.RegionDto; +import java.util.Date; -@AuditedClass public class DiseaseBurdenDto implements Serializable { private static final long serialVersionUID = 2430932452606853497L; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java deleted file mode 100644 index 8c02c17c6fc..00000000000 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseFacade.java +++ /dev/null @@ -1,60 +0,0 @@ -package de.symeda.sormas.api.disease; - -/******************************************************************************* - * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - *******************************************************************************/ - -import java.util.Date; -import javax.ejb.Remote; - -import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.caze.CaseClassification; -import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; -import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; -import de.symeda.sormas.api.utils.criteria.CriteriaDateType; - - -@Remote -public interface DiseaseFacade { - - - DiseaseBurdenDto getDiseaseForDashboard( - RegionReferenceDto regionRef, - DistrictReferenceDto districtRef, - Disease disease, - Date fromDate, - Date toDate, - Date previousFromDate, - Date previousToDate, - CriteriaDateType newCaseDateType, - CaseClassification caseClassification - ); - - // - DiseaseBurdenDto getDiseaseGridForDashboard( - RegionReferenceDto regionRef, - DistrictReferenceDto districtRef, - Disease disease, - Date from, - Date to, - Date previousFromDate, - Date previousToDate, - CriteriaDateType newCaseDateType, - CaseClassification caseClassification - ); -} - diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventCriteria.java index 2f1d13d890a..6fac7327f45 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventCriteria.java @@ -110,8 +110,7 @@ public class EventCriteria extends CriteriaWithDateType implements ExternalShare private Boolean onlyEntitiesNotSharedWithExternalSurvTool; private Boolean onlyEntitiesSharedWithExternalSurvTool; private Boolean onlyEntitiesChangedSinceLastSharedWithExternalSurvTool; - private Date reportedDateFrom; - private Date reportedDateTo; + public EventCriteria() { super(EventCriteriaDateType.class); } @@ -568,13 +567,6 @@ public DateFilterOption getActionDateFilterOption() { return actionDateFilterOption; } - public EventCriteria reportedBetween(Date reportedDateFrom, Date reportedDateTo) { - - this.reportedDateFrom = reportedDateFrom; - this.reportedDateTo = reportedDateTo; - return this; - } - public enum DateType { EVENT, EVENT_SIGNAL_EVOLUTION, @@ -715,12 +707,4 @@ public Boolean getOnlyEntitiesChangedSinceLastSharedWithExternalSurvTool() { public void setOnlyEntitiesChangedSinceLastSharedWithExternalSurvTool(Boolean onlyEntitiesChangedSinceLastSharedWithExternalSurvTool) { this.onlyEntitiesChangedSinceLastSharedWithExternalSurvTool = onlyEntitiesChangedSinceLastSharedWithExternalSurvTool; } - - public Date getReportedDateFrom() { - return reportedDateFrom; - } - - public Date getReportedDateTo() { - return reportedDateTo; - } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictReferenceDto.java index a54c6afba78..5c28f779fcf 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictReferenceDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/district/DistrictReferenceDto.java @@ -18,12 +18,10 @@ package de.symeda.sormas.api.infrastructure.district; import de.symeda.sormas.api.InfrastructureDataReferenceDto; -import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.statistics.StatisticsGroupingKey; import de.symeda.sormas.api.utils.FeatureIndependent; @FeatureIndependent -@AuditedClass public class DistrictReferenceDto extends InfrastructureDataReferenceDto implements StatisticsGroupingKey { private static final long serialVersionUID = 8990957700033431836L; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java index 6f3c8f24cf4..de2b2d74676 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java @@ -20,7 +20,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; -import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Validations; @@ -31,7 +30,7 @@ import de.symeda.sormas.api.utils.DependingOnFeatureType; import de.symeda.sormas.api.utils.FeatureIndependent; import de.symeda.sormas.api.utils.FieldConstraints; -@AuditedClass + @FeatureIndependent public class RegionDto extends InfrastructureDtoWithDefault { @@ -157,6 +156,7 @@ public String buildCaption() { public String i18nPrefix() { return I18N_PREFIX; } + @Override public String toString() { return getName(); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java index eac6fea7b97..32fbaacbb7d 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java @@ -29,25 +29,24 @@ @Remote public interface RegionFacade extends GeoLocationFacade { - List getAllActiveByServerCountry(); + List getAllActiveByServerCountry(); - List getAllActiveByCountry(String countryUuid); + List getAllActiveByCountry(String countryUuid); - List getAllActiveByArea(String areaUuid); + List getAllActiveByArea(String areaUuid); - List getAllActiveAsReference(); + List getAllActiveAsReference(); - Page getIndexPage(RegionCriteria regionCriteria, Integer offset, Integer size, List sortProperties); + Page getIndexPage(RegionCriteria regionCriteria, Integer offset, Integer size, List sortProperties); - RegionReferenceDto getRegionReferenceById(int id); + RegionReferenceDto getRegionReferenceById(int id); - List getByName(String name, boolean includeArchivedEntities); + List getByName(String name, boolean includeArchivedEntities); - List getNamesByIds(List regionIds); + List getNamesByIds(List regionIds); - boolean isUsedInOtherInfrastructureData(Collection regionUuids); - - List getAllRegion(); + boolean isUsedInOtherInfrastructureData(Collection regionUuids); + List getAllActiveRegions(); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionReferenceDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionReferenceDto.java index 16a78674b42..90ef246d815 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionReferenceDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionReferenceDto.java @@ -18,12 +18,10 @@ package de.symeda.sormas.api.infrastructure.region; import de.symeda.sormas.api.InfrastructureDataReferenceDto; -import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.statistics.StatisticsGroupingKey; import de.symeda.sormas.api.utils.FeatureIndependent; @FeatureIndependent -@AuditedClass public class RegionReferenceDto extends InfrastructureDataReferenceDto implements StatisticsGroupingKey { private static final long serialVersionUID = -1610675328037466348L; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java index 79255a8f59a..4ba9e4cb745 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java @@ -23,10 +23,10 @@ import java.util.Set; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.utils.criteria.BaseCriteria; +import de.symeda.sormas.api.caze.CaseClassification; public class OutbreakCriteria extends BaseCriteria implements Serializable { @@ -40,7 +40,6 @@ public class OutbreakCriteria extends BaseCriteria implements Serializable { private Date changeDateAfter; private Date reportedDateFrom; private Date reportedDateTo; - private CaseClassification caseClassification; public RegionReferenceDto getRegion() { @@ -140,7 +139,6 @@ public Date getReportedDateTo() { return reportedDateTo; } - public CaseClassification getCaseClassification() { return caseClassification; } 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 de2c1e944a4..cabe7120b12 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 @@ -23,11 +23,13 @@ import javax.validation.constraints.NotNull; import de.symeda.sormas.api.BaseFacade; +import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EditPermissionFacade; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.externaldata.ExternalDataDto; import de.symeda.sormas.api.externaldata.ExternalDataUpdateException; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.SortProperty; @@ -37,6 +39,8 @@ public interface PersonFacade extends BaseFacade getPermittedAssociations(); + List getDeathsBetween(Date fromDate, Date toDate, DistrictReferenceDto districtRef, Disease disease); + JournalPersonDto getPersonForJournal(String uuid); PersonDto save(@Valid @NotNull PersonDto source, boolean skipValidation); @@ -93,5 +97,4 @@ void mergePerson( boolean isEnrolledInExternalJournal(String uuid); void copyHomeAddress(PersonReferenceDto source, PersonReferenceDto target); - } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestResultType.java b/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestResultType.java index c9fc20d6d7b..a08856db8ea 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestResultType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sample/PathogenTestResultType.java @@ -17,9 +17,8 @@ *******************************************************************************/ package de.symeda.sormas.api.sample; -import de.symeda.sormas.api.audit.AuditedClass; import de.symeda.sormas.api.i18n.I18nProperties; -@AuditedClass + public enum PathogenTestResultType { INDETERMINATE, 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 38245a9c605..59c3efd5fd1 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 @@ -20,7 +20,6 @@ import java.util.Collection; import java.util.Date; import java.util.List; -import java.util.Map; import javax.ejb.Remote; import javax.validation.Valid; @@ -91,7 +90,4 @@ public interface SampleFacade extends DeletableFacade { Date getEarliestPositiveSampleDate(String contactUuid); List getAssociatedDiseaseVariants(String sampleUuid); - - Map getNewTestResultCountByResultType(List collect); - } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/NotificationType.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/NotificationType.java index 9e93fffb2d6..b2d579bf20b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/NotificationType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/NotificationType.java @@ -20,7 +20,6 @@ public enum NotificationType { - CASE_CLASSIFICATION_CHANGED(NotificationTypeGroup.CASES), CASE_INVESTIGATION_DONE(NotificationTypeGroup.CASES), CASE_LAB_RESULT_ARRIVED(NotificationTypeGroup.CASES), 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 48e9210012d..71c518d262d 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 @@ -170,8 +170,6 @@ public enum UserRight { DASHBOARD_CAMPAIGNS_VIEW(UserRightGroup.DASHBOARD, UserRight._CAMPAIGN_VIEW), DASHBOARD_SAMPLES_VIEW(UserRightGroup.DASHBOARD, UserRight._SAMPLE_VIEW), - - CASE_CLINICIAN_VIEW(UserRightGroup.CASE_MANAGEMENT, UserRight._CASE_VIEW), THERAPY_VIEW(UserRightGroup.CASE_MANAGEMENT, UserRight._CASE_VIEW), @@ -298,7 +296,6 @@ public enum UserRight { //@formatter:on - //private static final String _DISEASE_DETAILS_ACCESS ="DISEASE_DETAILS_ACCESS" ; /* * Hint for SonarQube issues: * 1. java:S115: Violation of name convention for String constants of this class is accepted: Close as false positive. @@ -519,6 +516,7 @@ public enum UserRight { public static final String _EXTERNAL_EMAIL_SEND = "EXTERNAL_EMAIL_SEND"; public static final String _EXTERNAL_EMAIL_ATTACH_DOCUMENTS = "EXTERNAL_EMAIL_ATTACH_DOCUMENTS"; public static final String _CUSTOMIZABLE_ENUM_MANAGEMENT = "CUSTOMIZABLE_ENUM_MANAGEMENT"; + //private static final String _DISEASE_DETAILS_ACCESS ="DISEASE_DETAILS_ACCESS" ; private static final Map> userRightDependencies = buildUserRightDependencies(); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java index adb0e1f213e..aaa9b7e61ae 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java @@ -47,7 +47,8 @@ public enum UserRightGroup { EXPORT, CONFIGURATION, - EXTERNAL, DISEASE; + EXTERNAL, + DISEASE; @Override public String toString() { 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 7c63d874d9b..669d9655797 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 @@ -1181,14 +1181,4 @@ public void setSeparator(String separator) { this.separator = separator; } } - - public static Date resetTime(Date date) { - Calendar calendar = Calendar.getInstance(); - calendar.setTime(date); - calendar.set(Calendar.HOUR_OF_DAY, 0); - calendar.set(Calendar.MINUTE, 0); - calendar.set(Calendar.SECOND, 0); - calendar.set(Calendar.MILLISECOND, 0); - return calendar.getTime(); - } } diff --git a/sormas-api/src/main/resources/enum.properties b/sormas-api/src/main/resources/enum.properties index 40973a13ca5..e6fba920e78 100644 --- a/sormas-api/src/main/resources/enum.properties +++ b/sormas-api/src/main/resources/enum.properties @@ -949,6 +949,13 @@ NewCaseDateType.MOST_RELEVANT = Most relevant date NewCaseDateType.ONSET = Symptom onset date NewCaseDateType.REPORT = Case report date +NewDateFilterType.TODAY = Today's date +NewDateFilterType.YESTERDAY = Yesterday's date +NewDateFilterType.THIS_WEEK = Current week's date range +NewDateFilterType.LAST_WEEK = Previous week's date range +NewDateFilterType.THIS_YEAR = Current year's date range +NewDateFilterType.CUSTOM = Custom date range + # OccupationType # Temporarily necessary for data migration of older systems; can be removed at a later point in time OccupationType.BUSINESSMAN_WOMAN = Businessman / woman diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 8102f00c26c..1f57b546507 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -99,7 +99,6 @@ classificationCriteriaForTestType = for test type classificationCriteriaForExposureType = for exposure type classificationDaysBeforeCaseStart = days before symptom onset/case report date classificationEventCluster = Case linked to a cluster event -#classificationForDisease = for classificationForDisease = Disease details classificationGeneratedFor = Generated for SORMAS classificationInfoText = ... when the case meets the following requirements:
diff --git a/sormas-api/src/test/java/de/symeda/sormas/api/caze/CaseCriteriaTest.java b/sormas-api/src/test/java/de/symeda/sormas/api/caze/CaseCriteriaTest.java index e5d144f36b4..200c4a6e1c6 100644 --- a/sormas-api/src/test/java/de/symeda/sormas/api/caze/CaseCriteriaTest.java +++ b/sormas-api/src/test/java/de/symeda/sormas/api/caze/CaseCriteriaTest.java @@ -26,6 +26,4 @@ public void testFromToUrlParams() { assertEquals(criteria.getDisease(), generatedCriteria.getDisease()); assertEquals(criteria.getEventLike(), generatedCriteria.getEventLike()); } - - } 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 1d6c56c6f64..d72209821be 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 @@ -4464,8 +4464,6 @@ public List getByExternalId(String externalId) { return toPseudonymizedDtos(service.getByExternalId(externalId)); } - - @Override @RightsAllowed(UserRight._CASE_EDIT) public void updateExternalData(@Valid List externalData) throws ExternalDataUpdateException { 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 5117006a23d..90853d4e5af 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 @@ -186,7 +186,6 @@ import de.symeda.sormas.backend.vaccination.VaccinationService; import de.symeda.sormas.backend.visit.Visit; import de.symeda.sormas.backend.visit.VisitFacadeEjb; - import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.or; @@ -2354,7 +2353,4 @@ public String getCaseUuidForAutomaticSampleAssignment(Set uuids, Disease List caseUuids = em.createQuery(cq).getResultList(); return caseUuids.size() == 1 ? caseUuids.get(0) : null; } - - - } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java index 740c6cad318..f1fb15356d4 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/BaseAdoService.java @@ -577,6 +577,7 @@ public void incrementChangeDate(ADO ado) { } public interface PredicateBuilder { + Predicate buildPredicate(CriteriaBuilder cb, Root root, CriteriaQuery cq); } @@ -604,5 +605,4 @@ protected TypedQuery createQuery(CriteriaQuery cq, Integer first, Inte return query; } - } 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 e6f34adb3ed..e09a585e276 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 @@ -66,9 +66,11 @@ import javax.validation.Valid; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; + import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.Language; @@ -1675,8 +1677,6 @@ public List getContactsForDashboard( return service.getContactsForDashboard(region, district, disease, from, to); } - - @Override public List getByPersonUuids(List personUuids) { return toDtos(service.getByPersonUuids(personUuids).stream()); 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 ec26546b717..65b5e609787 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 @@ -53,7 +53,6 @@ import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; -import de.symeda.sormas.backend.event.EventParticipantService; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -146,8 +145,8 @@ import de.symeda.sormas.backend.visit.Visit; import de.symeda.sormas.backend.visit.VisitFacadeEjb; import de.symeda.sormas.backend.visit.VisitService; - import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.or; +import de.symeda.sormas.backend.event.EventParticipantService; @Stateless @LocalBean @@ -189,9 +188,6 @@ public class ContactService extends AbstractCoreAdoService getDiseaseBurden( } @Override - @RightsAllowed({ - UserRight._DASHBOARD_SURVEILLANCE_VIEW, - UserRight._DASHBOARD_CONTACT_VIEW }) - public Map getTestResultCountByResultType(DashboardCriteria dashboardCriteria) { - return dashboardService.getNewTestResultCountByResultType(dashboardCriteria); + public DiseaseBurdenDto getDiseaseForDashboard( + RegionReferenceDto region, + DistrictReferenceDto district, + Disease disease, + Date fromDate, + Date toDate, + Date previousFrom, + Date previousTo, + CriteriaDateType newCaseDateType, + CaseClassification caseClassification) { + + DashboardCriteria dashboardCriteria = + new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); + + Map newCases = dashboardService.getCaseCountByDisease(dashboardCriteria); + + Map events = eventFacade + .getEventCountByDisease(new EventCriteria().region(region).district(district).eventDateType(null).eventDateBetween(fromDate, toDate)); + + //outbreaks + Map outbreakDistrictsCount; + if (featureConfigurationFacade.isFeatureEnabled(FeatureType.OUTBREAKS)) { + outbreakDistrictsCount = outbreakFacade + .getOutbreakDistrictCountByDisease(new OutbreakCriteria().region(region).district(district).reportedBetween(fromDate, toDate)); + } else { + outbreakDistrictsCount = new HashMap<>(); + } + //outbreaks + Map outbreakDistricts = outbreakFacade + .getOutbreakDistrictNameByDisease(new OutbreakCriteria().disease(disease).region(region).district(district).reportedBetween(fromDate, toDate)); + + //last report district + Map lastReportedDistricts = dashboardService.getLastReportedDistrictByDisease(dashboardCriteria); + + //case fatalities + Map caseFatalities = dashboardService.getDeathCountByDisease(dashboardCriteria); + + //previous cases + dashboardCriteria.dateBetween(previousFrom, previousTo); + Map previousCases = dashboardService.getCaseCountByDisease(dashboardCriteria); + + //build diseasesBurden + Long caseCount = newCases.getOrDefault(disease, 0L); + Long previousCaseCount = previousCases.getOrDefault(disease, 0L); + Long eventCount = events.getOrDefault(disease, 0L); + Long outbreakDistrictCount = outbreakDistrictsCount.getOrDefault(disease, 0L); + Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); + District lastReportedDistrict = lastReportedDistricts.getOrDefault(disease, null); + District outbreakDistrict = outbreakDistricts.getOrDefault(disease, null); + + String lastReportedDistrictName = lastReportedDistrict == null ? "" : lastReportedDistrict.getName(); + String outbreakDistrictName = outbreakDistrict == null ? "" : outbreakDistrict.getName(); + + return new DiseaseBurdenDto( + disease, + caseCount, + previousCaseCount, + eventCount, + outbreakDistrictCount, + caseFatalityCount, + lastReportedDistrictName, + outbreakDistrictName, + fromDate, + toDate + ); + } + + @Override + public DiseaseBurdenDto getDiseaseGridForDashboard( + RegionReferenceDto region, + DistrictReferenceDto district, + Disease disease, + Date fromDate, + Date toDate, + Date previousFrom, + Date previousTo, + CriteriaDateType newCaseDateType, + CaseClassification caseClassification) { + + //Get the region + RegionDto regionDto = null; + if(Objects.nonNull(region)){ + regionDto = regionFacade.getByUuid(region.getUuid()); + } + + //new cases + DashboardCriteria dashboardCriteria = + new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); + + //Load count all dead/ fatalities + Map allCasesFetched = dashboardService.getCaseCountByDisease(dashboardCriteria); + + + Map caseFatalities = dashboardService.getDeathCountByDisease(dashboardCriteria); + + dashboardCriteria.setOutcome(CaseOutcome.NO_OUTCOME); + Map archievedCase = dashboardService.getCaseCountByDisease(dashboardCriteria); + + dashboardCriteria.setOutcome(CaseOutcome.RECOVERED); + Map recoveredCase = dashboardService.getCaseCountByDisease(dashboardCriteria); + + dashboardCriteria.setOutcome(CaseOutcome.UNKNOWN); + Map unknown = dashboardService.getCaseCountByDisease(dashboardCriteria); + + //build diseasesBurden + Long totalCaseCount = allCasesFetched.getOrDefault(disease, 0L); + Long activeCaseCount = archievedCase.getOrDefault(disease, 0L); + Long recoveredCaseCount = recoveredCase.getOrDefault(disease, 0L); + Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); + Long unknownCaseCount = unknown.getOrDefault(disease, 0L); + + return new DiseaseBurdenDto( + regionDto, + totalCaseCount.toString(), + activeCaseCount.toString(), + recoveredCaseCount.toString(), + caseFatalityCount.toString(), + unknownCaseCount.toString() + ); } @LocalBean diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java index a29b0c25fb9..63161f7887e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java @@ -1,5 +1,30 @@ package de.symeda.sormas.backend.dashboard; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import javax.ejb.EJB; +import javax.ejb.LocalBean; +import javax.ejb.Stateless; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.From; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.JoinType; +import javax.persistence.criteria.Order; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; + +import org.apache.commons.lang3.StringUtils; + import de.symeda.sormas.api.CountryHelper; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; @@ -12,9 +37,14 @@ import de.symeda.sormas.api.sample.PathogenTestResultType; import de.symeda.sormas.api.sample.SpecimenCondition; import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.backend.caze.*; +import de.symeda.sormas.backend.caze.Case; +import de.symeda.sormas.backend.caze.CaseJoins; +import de.symeda.sormas.backend.caze.CaseQueryContext; +import de.symeda.sormas.backend.caze.CaseService; +import de.symeda.sormas.backend.caze.CaseUserFilterCriteria; import de.symeda.sormas.backend.common.AbstractDomainObject; import de.symeda.sormas.backend.common.ConfigFacadeEjb; +import de.symeda.sormas.backend.common.CriteriaBuilderHelper; import de.symeda.sormas.backend.event.Event; import de.symeda.sormas.backend.event.EventJoins; import de.symeda.sormas.backend.event.EventQueryContext; @@ -25,21 +55,11 @@ import de.symeda.sormas.backend.location.Location; import de.symeda.sormas.backend.person.Person; import de.symeda.sormas.backend.sample.Sample; +import de.symeda.sormas.backend.sample.SampleService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.util.JurisdictionHelper; import de.symeda.sormas.backend.util.ModelConstants; import de.symeda.sormas.backend.util.QueryHelper; -import org.apache.commons.lang3.StringUtils; - -import javax.ejb.EJB; -import javax.ejb.LocalBean; -import javax.ejb.Stateless; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.criteria.*; -import java.util.*; -import java.util.stream.Collectors; - import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; @Stateless diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java deleted file mode 100644 index 388d25ae770..00000000000 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjb.java +++ /dev/null @@ -1,217 +0,0 @@ -/******************************************************************************* - * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - *******************************************************************************/ -package de.symeda.sormas.backend.disease; - -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -import javax.ejb.EJB; -import javax.ejb.LocalBean; -import javax.ejb.Stateless; -import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.caze.CaseClassification; -import de.symeda.sormas.api.caze.CaseOutcome; -import de.symeda.sormas.api.dashboard.DashboardCriteria; -import de.symeda.sormas.api.disease.DiseaseBurdenDto; -import de.symeda.sormas.api.disease.DiseaseFacade; -import de.symeda.sormas.api.event.EventCriteria; -import de.symeda.sormas.api.feature.FeatureType; -import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; -import de.symeda.sormas.api.infrastructure.region.RegionDto; -import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; -import de.symeda.sormas.api.outbreak.OutbreakCriteria; -import de.symeda.sormas.api.utils.criteria.CriteriaDateType; -import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal; -import de.symeda.sormas.backend.dashboard.DashboardService; -import de.symeda.sormas.backend.disease.DiseaseConfigurationFacadeEjb.DiseaseConfigurationFacadeEjbLocal; -import de.symeda.sormas.backend.event.EventFacadeEjb.EventFacadeEjbLocal; -import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb; -import de.symeda.sormas.backend.infrastructure.district.District; -import de.symeda.sormas.backend.infrastructure.region.RegionFacadeEjb.RegionFacadeEjbLocal; -import de.symeda.sormas.backend.outbreak.OutbreakFacadeEjb.OutbreakFacadeEjbLocal; -import de.symeda.sormas.backend.person.PersonFacadeEjb.PersonFacadeEjbLocal; - -/** - * Provides the application configuration settings - */ -@Stateless(name = "DiseaseFacade") -public class DiseaseFacadeEjb implements DiseaseFacade { - - @EJB - private CaseFacadeEjbLocal caseFacade; - - @EJB - private EventFacadeEjbLocal eventFacade; - @EJB - private OutbreakFacadeEjbLocal outbreakFacade; - @EJB - private PersonFacadeEjbLocal personFacade; - @EJB - private DiseaseConfigurationFacadeEjbLocal diseaseConfigurationFacade; - @EJB - private RegionFacadeEjbLocal regionFacade; - - @EJB - private DashboardService dashboardService; - - @EJB - private FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal featureConfigurationFacade; - - - @Override - public DiseaseBurdenDto getDiseaseForDashboard( - RegionReferenceDto region, - DistrictReferenceDto district, - Disease disease, - Date fromDate, - Date toDate, - Date previousFrom, - Date previousTo, - CriteriaDateType newCaseDateType, - CaseClassification caseClassification) { - - - DashboardCriteria dashboardCriteria = - new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); - - - Map newCases = dashboardService.getCaseCountByDisease(dashboardCriteria); - - Map events = eventFacade - .getEventCountByDisease(new EventCriteria().region(region).district(district).eventDateType(null).eventDateBetween(fromDate, toDate)); - - - //outbreaks - Map outbreakDistrictsCount; - if (featureConfigurationFacade.isFeatureEnabled(FeatureType.OUTBREAKS)) { - outbreakDistrictsCount = outbreakFacade - .getOutbreakDistrictCountByDisease(new OutbreakCriteria().region(region).district(district).reportedBetween(fromDate, toDate)); - } else { - outbreakDistrictsCount = new HashMap<>(); - } - //outbreaks - Map outbreakDistricts = outbreakFacade - .getOutbreakDistrictNameByDisease(new OutbreakCriteria().disease(disease).region(region).district(district).reportedBetween(fromDate, toDate)); - - - //last report district - Map lastReportedDistricts = dashboardService.getLastReportedDistrictByDisease(dashboardCriteria); - - //case fatalities - Map caseFatalities = dashboardService.getDeathCountByDisease(dashboardCriteria); - - //previous cases - dashboardCriteria.dateBetween(previousFrom, previousTo); - Map previousCases = dashboardService.getCaseCountByDisease(dashboardCriteria); - - //build diseasesBurden - Long caseCount = newCases.getOrDefault(disease, 0L); - Long previousCaseCount = previousCases.getOrDefault(disease, 0L); - Long eventCount = events.getOrDefault(disease, 0L); - Long outbreakDistrictCount = outbreakDistrictsCount.getOrDefault(disease, 0L); - Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); - District lastReportedDistrict = lastReportedDistricts.getOrDefault(disease, null); - District outbreakDistrict = outbreakDistricts.getOrDefault(disease, null); - - String lastReportedDistrictName = lastReportedDistrict == null ? "" : lastReportedDistrict.getName(); - String outbreakDistrictName = outbreakDistrict == null ? "" : outbreakDistrict.getName(); - - - return new DiseaseBurdenDto( - disease, - caseCount, - previousCaseCount, - eventCount, - outbreakDistrictCount, - caseFatalityCount, - lastReportedDistrictName, - outbreakDistrictName, - fromDate, - toDate - ); - - } - - @Override - public DiseaseBurdenDto getDiseaseGridForDashboard( - RegionReferenceDto region, - DistrictReferenceDto district, - Disease disease, - Date fromDate, - Date toDate, - Date previousFrom, - Date previousTo, - CriteriaDateType newCaseDateType, - CaseClassification caseClassification) { - - //Get the region - RegionDto regionDto = null; - if(Objects.nonNull(region)){ - regionDto = regionFacade.getByUuid(region.getUuid()); - } - - //new cases - DashboardCriteria dashboardCriteria = - new DashboardCriteria().region(region).district(district).newCaseDateType(newCaseDateType).dateBetween(fromDate, toDate); - - //Load count all dead/ fatalities - Map allCasesFetched = dashboardService.getCaseCountByDisease(dashboardCriteria); - - - Map caseFatalities = dashboardService.getDeathCountByDisease(dashboardCriteria); - - dashboardCriteria.setOutcome(CaseOutcome.NO_OUTCOME); - Map archievedCase = dashboardService.getCaseCountByDisease(dashboardCriteria); - - dashboardCriteria.setOutcome(CaseOutcome.RECOVERED); - Map recoveredCase = dashboardService.getCaseCountByDisease(dashboardCriteria); - - dashboardCriteria.setOutcome(CaseOutcome.UNKNOWN); - - Map unknown = dashboardService.getCaseCountByDisease(dashboardCriteria); - - dashboardCriteria.setOutcome(CaseOutcome.OTHER); - - Map other = dashboardService.getCaseCountByDisease(dashboardCriteria); - - //build diseasesBurden - Long totalCaseCount = allCasesFetched.getOrDefault(disease, 0L); - Long activeCaseCount = archievedCase.getOrDefault(disease, 0L); - Long recoveredCaseCount = recoveredCase.getOrDefault(disease, 0L); - Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); - Long otherCaseCount = other.getOrDefault(disease, 0L)+unknown.getOrDefault(disease, 0L); - - return new DiseaseBurdenDto( - regionDto, - totalCaseCount.toString(), - activeCaseCount.toString(), - recoveredCaseCount.toString(), - caseFatalityCount.toString(), - otherCaseCount.toString() - ); - - } - - @LocalBean - @Stateless - public static class DiseaseFacadeEjbLocal extends DiseaseFacadeEjb { - - } -} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java index 124ef94eec3..a9941a14f7e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantService.java @@ -668,5 +668,4 @@ public Predicate createOwnershipPredicate(boolean withOwnership, From from cb.exists(sharesQuery)); } } - } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java index c6bf9506f8e..e23562958ac 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/region/RegionFacadeEjb.java @@ -35,7 +35,6 @@ import javax.persistence.criteria.Root; import javax.validation.constraints.NotNull; -import de.symeda.sormas.backend.infrastructure.InfrastructureAdo; import org.apache.commons.collections4.CollectionUtils; import de.symeda.sormas.api.common.Page; @@ -69,6 +68,7 @@ import de.symeda.sormas.backend.util.DtoHelper; import de.symeda.sormas.backend.util.QueryHelper; import de.symeda.sormas.backend.util.RightsAllowed; +import de.symeda.sormas.backend.infrastructure.InfrastructureAdo; @Stateless(name = "RegionFacade") @RightsAllowed(UserRight._INFRASTRUCTURE_VIEW) @@ -340,36 +340,31 @@ protected void resetDefaultInfrastructure() { } @Override - public List getAllRegion() { + public List getAllActiveRegions() { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(RegionDto.class); Root region = cq.from(Region.class); - selectDtoFields(cq, region); - - return em.createQuery(cq).getResultList(); - } - - protected void selectDtoFields(CriteriaQuery cq, Root root) { + Join country = region.join(Region.COUNTRY, JoinType.LEFT); + Join area = region.join(Region.AREA, JoinType.LEFT); - Join country = root.join(Region.COUNTRY, JoinType.LEFT); - Join area = root.join(Region.AREA, JoinType.LEFT); - // Needs to be in the same order as in the constructor cq.multiselect( - root.get(AbstractDomainObject.CREATION_DATE), - root.get(AbstractDomainObject.CHANGE_DATE), - root.get(AbstractDomainObject.UUID), - root.get(InfrastructureAdo.ARCHIVED), - root.get(Region.NAME), - root.get(Region.EPID_CODE), - root.get(Region.GROWTH_RATE), - root.get(Region.EXTERNAL_ID), - //root.get(Region.ID), + region.get(AbstractDomainObject.CREATION_DATE), + region.get(AbstractDomainObject.CHANGE_DATE), + region.get(AbstractDomainObject.UUID), + region.get(InfrastructureAdo.ARCHIVED), + region.get(Region.NAME), + region.get(Region.EPID_CODE), + region.get(Region.GROWTH_RATE), + region.get(Region.EXTERNAL_ID), country.get(AbstractDomainObject.UUID), country.get(Country.DEFAULT_NAME), country.get(Country.ISO_CODE), - area.get(AbstractDomainObject.UUID)); + area.get(AbstractDomainObject.UUID) + ); + + return em.createQuery(cq).getResultList(); } @LocalBean diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java index ad64a2e4581..2c192de00be 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java @@ -36,15 +36,14 @@ import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.SortProperty; -import de.symeda.sormas.backend.infrastructure.district.District; import de.symeda.sormas.backend.infrastructure.district.DistrictFacadeEjb; import de.symeda.sormas.backend.infrastructure.district.DistrictService; - import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb; import de.symeda.sormas.backend.user.UserService; import de.symeda.sormas.backend.util.DtoHelper; import de.symeda.sormas.backend.util.RightsAllowed; +import de.symeda.sormas.backend.infrastructure.district.District; @Stateless(name = "OutbreakFacade") @RightsAllowed(UserRight._OUTBREAK_VIEW) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java index 43cf99137c9..d2dd001ee14 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java @@ -18,7 +18,6 @@ package de.symeda.sormas.backend.outbreak; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -36,20 +35,21 @@ import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; -import de.symeda.sormas.backend.caze.Case; import org.apache.commons.collections4.CollectionUtils; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.outbreak.OutbreakCriteria; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.backend.common.AdoServiceWithUserFilterAndJurisdiction; +import de.symeda.sormas.backend.common.CriteriaBuilderHelper; import de.symeda.sormas.backend.disease.DiseaseConfigurationService; import de.symeda.sormas.backend.infrastructure.district.District; import de.symeda.sormas.backend.infrastructure.region.Region; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.util.QueryHelper; - import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; +import java.util.HashMap; +import de.symeda.sormas.backend.caze.Case; @Stateless @LocalBean 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 af050d6828e..b153400e933 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 @@ -14,12 +14,68 @@ */ package de.symeda.sormas.backend.person; +import static java.util.Comparator.comparing; +import static java.util.Objects.isNull; +import static java.util.stream.Collectors.groupingBy; +import static java.util.stream.Collectors.maxBy; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.EnumSet; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.annotation.security.PermitAll; +import javax.ejb.EJB; +import javax.ejb.LocalBean; +import javax.ejb.Stateless; +import javax.ejb.TransactionAttribute; +import javax.ejb.TransactionAttributeType; +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Tuple; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Join; +import javax.persistence.criteria.JoinType; +import javax.persistence.criteria.Order; +import javax.persistence.criteria.Path; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import javax.persistence.criteria.Selection; +import javax.validation.Valid; +import javax.validation.constraints.NotNull; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.SerializationUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.google.i18n.phonenumbers.NumberParseException; import com.google.i18n.phonenumbers.PhoneNumberUtil; import com.google.i18n.phonenumbers.Phonenumber; + +import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EditPermissionType; import de.symeda.sormas.api.RequestContextHolder; -import de.symeda.sormas.api.caze.*; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.CaseCriteria; +import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.caze.CaseLogic; +import de.symeda.sormas.api.caze.CaseOutcome; import de.symeda.sormas.api.common.Page; import de.symeda.sormas.api.contact.ContactCriteria; import de.symeda.sormas.api.contact.FollowUpStatus; @@ -32,25 +88,66 @@ import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.immunization.ImmunizationDto; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.location.LocationDto; -import de.symeda.sormas.api.person.*; +import de.symeda.sormas.api.person.ApproximateAgeType; import de.symeda.sormas.api.person.ApproximateAgeType.ApproximateAgeHelper; +import de.symeda.sormas.api.person.CauseOfDeath; +import de.symeda.sormas.api.person.IsPerson; +import de.symeda.sormas.api.person.JournalPersonDto; +import de.symeda.sormas.api.person.PersonAddressType; +import de.symeda.sormas.api.person.PersonAssociation; +import de.symeda.sormas.api.person.PersonContactDetailDto; +import de.symeda.sormas.api.person.PersonContactDetailType; +import de.symeda.sormas.api.person.PersonContext; +import de.symeda.sormas.api.person.PersonCriteria; +import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.api.person.PersonExportDto; +import de.symeda.sormas.api.person.PersonFacade; +import de.symeda.sormas.api.person.PersonFollowUpEndDto; +import de.symeda.sormas.api.person.PersonHelper; +import de.symeda.sormas.api.person.PersonIndexDto; +import de.symeda.sormas.api.person.PersonReferenceDto; +import de.symeda.sormas.api.person.PersonSimilarityCriteria; +import de.symeda.sormas.api.person.PresentCondition; +import de.symeda.sormas.api.person.SimilarPersonDto; +import de.symeda.sormas.api.person.SymptomJournalStatus; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.user.UserRight; -import de.symeda.sormas.api.utils.*; +import de.symeda.sormas.api.utils.AccessDeniedException; +import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DataHelper.Pair; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.api.utils.DtoCopyHelper; +import de.symeda.sormas.api.utils.LocationHelper; +import de.symeda.sormas.api.utils.SortProperty; +import de.symeda.sormas.api.utils.ValidationRuntimeException; import de.symeda.sormas.api.utils.fieldaccess.checkers.AnnotationBasedFieldAccessChecker.SpecialAccessCheck; import de.symeda.sormas.api.vaccination.VaccinationDto; import de.symeda.sormas.backend.FacadeHelper; -import de.symeda.sormas.backend.caze.*; +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.CaseJoins; +import de.symeda.sormas.backend.caze.CaseQueryContext; +import de.symeda.sormas.backend.caze.CaseService; import de.symeda.sormas.backend.common.AbstractBaseEjb; import de.symeda.sormas.backend.common.AbstractDomainObject; -import de.symeda.sormas.backend.contact.*; +import de.symeda.sormas.backend.common.CriteriaBuilderHelper; +import de.symeda.sormas.backend.contact.Contact; +import de.symeda.sormas.backend.contact.ContactFacadeEjb; import de.symeda.sormas.backend.contact.ContactFacadeEjb.ContactFacadeEjbLocal; -import de.symeda.sormas.backend.event.*; +import de.symeda.sormas.backend.contact.ContactJoins; +import de.symeda.sormas.backend.contact.ContactQueryContext; +import de.symeda.sormas.backend.contact.ContactService; +import de.symeda.sormas.backend.event.Event; +import de.symeda.sormas.backend.event.EventFacadeEjb; +import de.symeda.sormas.backend.event.EventParticipant; +import de.symeda.sormas.backend.event.EventParticipantFacadeEjb; import de.symeda.sormas.backend.event.EventParticipantFacadeEjb.EventParticipantFacadeEjbLocal; +import de.symeda.sormas.backend.event.EventParticipantService; +import de.symeda.sormas.backend.event.EventService; import de.symeda.sormas.backend.externaljournal.ExternalJournalService; import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal; import de.symeda.sormas.backend.immunization.ImmunizationFacadeEjb; @@ -85,34 +182,16 @@ import de.symeda.sormas.backend.travelentry.services.TravelEntryService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserFacadeEjb.UserFacadeEjbLocal; -import de.symeda.sormas.backend.util.*; +import de.symeda.sormas.backend.util.DtoHelper; +import de.symeda.sormas.backend.util.IterableHelper; +import de.symeda.sormas.backend.util.JurisdictionHelper; +import de.symeda.sormas.backend.util.ModelConstants; +import de.symeda.sormas.backend.util.Pseudonymizer; +import de.symeda.sormas.backend.util.QueryHelper; +import de.symeda.sormas.backend.util.RightsAllowed; import de.symeda.sormas.backend.visit.Visit; import de.symeda.sormas.backend.visit.VisitService; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.SerializationUtils; -import org.apache.commons.lang3.StringUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.annotation.security.PermitAll; -import javax.ejb.*; -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Tuple; -import javax.persistence.criteria.Order; -import javax.persistence.criteria.*; -import javax.validation.Valid; -import javax.validation.constraints.NotNull; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; -import static java.util.Comparator.comparing; -import static java.util.Objects.isNull; -import static java.util.stream.Collectors.groupingBy; -import static java.util.stream.Collectors.maxBy; @Stateless(name = "PersonFacade") @RightsAllowed(UserRight._PERSON_VIEW) @@ -1983,7 +2062,15 @@ public List getByNationalHealthId(String nationalHealthId) { .collect(Collectors.toList()); } - + @Override + public List getDeathsBetween(Date fromDate, Date toDate, DistrictReferenceDto districtRef, Disease disease) { + final User user = userService.getCurrentUser(); + if (user == null) { + return Collections.emptyList(); + } + final District district = districtService.getByReferenceDto(districtRef); + return toPseudonymizedDtos(service.getDeathsBetween(fromDate, toDate, district, disease, user)); + } @LocalBean @Stateless 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 b12ee0a63b2..cc3eedf9577 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 @@ -216,11 +216,6 @@ public List getByContactUuids(List contactUuids) { return toPseudonymizedDtos(sampleService.getByContactUuids(contactUuids)); } - @Override - public Map getNewTestResultCountByResultType(List caseIds) { - return sampleService.getNewTestResultCountByResultType(caseIds); - } - @Override public List getSimilarSamples(SampleSimilarityCriteria criteria) { final CriteriaBuilder cb = em.getCriteriaBuilder(); @@ -1136,8 +1131,6 @@ public Boolean isEditAllowed(String uuid) { return sampleService.isEditAllowed(sample); } - - @RightsAllowed({ UserRight._SAMPLE_CREATE, UserRight._CASE_CREATE }) 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 4c68df1c564..15017bf0609 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 @@ -17,7 +17,6 @@ *******************************************************************************/ package de.symeda.sormas.backend.sample; -import java.math.BigInteger; import java.sql.Timestamp; import java.time.Instant; import java.util.ArrayList; @@ -34,12 +33,12 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.stream.Collectors; + import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; -import javax.persistence.Query; import javax.persistence.Tuple; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; @@ -54,8 +53,9 @@ import javax.persistence.criteria.Root; import javax.persistence.criteria.Selection; import javax.persistence.criteria.Subquery; -import de.symeda.sormas.api.sample.*; + import org.apache.commons.collections4.CollectionUtils; + import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.RequestContextHolder; import de.symeda.sormas.api.caze.IsCase; @@ -67,6 +67,15 @@ import de.symeda.sormas.api.disease.DiseaseVariant; import de.symeda.sormas.api.event.EventParticipantReferenceDto; import de.symeda.sormas.api.feature.FeatureType; +import de.symeda.sormas.api.sample.IsSample; +import de.symeda.sormas.api.sample.PathogenTestResultType; +import de.symeda.sormas.api.sample.PathogenTestType; +import de.symeda.sormas.api.sample.SampleAssociationType; +import de.symeda.sormas.api.sample.SampleCriteria; +import de.symeda.sormas.api.sample.SampleIndexDto; +import de.symeda.sormas.api.sample.SampleJurisdictionFlagsDto; +import de.symeda.sormas.api.sample.SampleListEntryDto; +import de.symeda.sormas.api.sample.SampleReferenceDto; import de.symeda.sormas.api.user.JurisdictionLevel; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; @@ -108,6 +117,9 @@ import de.symeda.sormas.backend.util.QueryHelper; import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.or; +import java.math.BigInteger; +import javax.persistence.Query; +import de.symeda.sormas.api.sample.SpecimenCondition; @Stateless @LocalBean diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/User.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/User.java index 14e5f5e8555..b5d9cf11793 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/User.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/User.java @@ -136,7 +136,6 @@ public class User extends AbstractDomainObject { private boolean hasConsentedToGdpr; - @Column(nullable = false, length = CHARACTER_LIMIT_DEFAULT) public String getUserName() { return userName; @@ -387,8 +386,6 @@ public static String buildCaptionForNotification(User user) { return caption; } - - static class UserListener { @PostPersist diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java index bb84f5a24f5..ef26b723ae4 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java @@ -34,9 +34,6 @@ import javax.persistence.EntityManager; import javax.persistence.Query; -import de.symeda.sormas.api.disease.DiseaseFacade; -import de.symeda.sormas.backend.disease.DiseaseFacadeEjb; -import de.symeda.sormas.backend.outbreak.OutbreakService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -277,6 +274,7 @@ import de.symeda.sormas.backend.vaccination.VaccinationService; import de.symeda.sormas.backend.visit.VisitFacadeEjb.VisitFacadeEjbLocal; import de.symeda.sormas.backend.visit.VisitService; +import de.symeda.sormas.backend.outbreak.OutbreakService; @ExtendWith(CdiTestJunitExtension.class) @ExtendWith(MockitoExtension.class) @@ -1094,8 +1092,4 @@ public SelfReportService getSelfReportService() { return getBean(SelfReportService.class); } - public DiseaseFacade getDiseaseFacade() { - return getBean(DiseaseFacadeEjb.DiseaseFacadeEjbLocal.class); - } - } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java index 12ccd90c3f3..8fb682df815 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java @@ -30,7 +30,6 @@ import javax.annotation.Nullable; -import de.symeda.sormas.api.contact.ContactClassification; import org.jetbrains.annotations.NotNull; import com.fasterxml.jackson.databind.ObjectMapper; @@ -163,6 +162,7 @@ import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfo; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserRole; +import de.symeda.sormas.api.contact.ContactClassification; public class TestDataCreator { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java index 5857901f0fa..a0f275c1f44 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java @@ -1,12 +1,24 @@ package de.symeda.sormas.backend.dashboard; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; + import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.InvestigationStatus; import de.symeda.sormas.api.caze.NewCaseDateType; -import de.symeda.sormas.api.contact.ContactClassification; -import de.symeda.sormas.api.dashboard.*; +import de.symeda.sormas.api.dashboard.DashboardCaseDto; +import de.symeda.sormas.api.dashboard.DashboardCriteria; +import de.symeda.sormas.api.dashboard.DashboardEventDto; +import de.symeda.sormas.api.dashboard.DashboardFacade; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.event.EventDto; import de.symeda.sormas.api.event.EventInvestigationStatus; @@ -25,15 +37,10 @@ import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator.RDCF; -import org.junit.jupiter.api.Test; -import org.testcontainers.shaded.org.apache.commons.lang3.time.DateUtils; - -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import static org.junit.jupiter.api.Assertions.*; +import de.symeda.sormas.api.dashboard.DashboardCaseMeasureDto; +import de.symeda.sormas.api.dashboard.EpiCurveGrouping; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertNotNull; public class DashboardFacadeEjbTest extends AbstractBeanTest { @@ -360,118 +367,6 @@ public void testGetCasesCountByClassification() { assertEquals(1, casesCountByClassification.get(CaseClassification.SUSPECT)); } - - @Test - public void testGetEpiCurveSeriesElementsPerCaseClassification() { - // Create necessary data for testing - RDCF rdcf = creator.createRDCF(); - UserDto user = creator.createSurveillanceSupervisor(rdcf); - Date currentDate = new Date(); - - // Create cases with different classifications - creator.createCase( - user.toReference(), - creator.createPerson("Case", "Person1").toReference(), - Disease.EVD, - CaseClassification.CONFIRMED, - InvestigationStatus.PENDING, - currentDate, - rdcf); - - creator.createCase( - user.toReference(), - creator.createPerson("Case", "Person2").toReference(), - Disease.EVD, - CaseClassification.PROBABLE, - InvestigationStatus.PENDING, - currentDate, - rdcf); - - // Define dashboard criteria - DashboardCriteria dashboardCriteria = new DashboardCriteria() - .region(rdcf.region) - .district(rdcf.district) - .disease(Disease.EVD) - .newCaseDateType(NewCaseDateType.MOST_RELEVANT) - .setEpiCurveGrouping(EpiCurveGrouping.DAY) - .dateBetween(DateHelper.subtractDays(currentDate, 1), DateHelper.addDays(currentDate, 1)); - - // Call the method under test - Map> result = getDashboardFacade().getEpiCurveSeriesElementsPerCaseClassification(dashboardCriteria); - - // Assertions - assertEquals(3, result.size()); // Ensure three date entries within dateBetween range - - // Validate the inner maps for each date - for (Map.Entry> entry : result.entrySet()) { - Date date = entry.getKey(); - Map classifications = entry.getValue(); - - // Ensure the inner map is not null - assertNotNull(classifications); - - // Validate the expected counts for each classification - if (DateHelper.isSameDay(date, currentDate)) { - assertEquals(2, classifications.size()); // Expecting two classifications for the current date - assertEquals(1, classifications.get(CaseClassification.CONFIRMED).intValue()); // Assuming 1 CONFIRMED case - assertEquals(1, classifications.get(CaseClassification.PROBABLE).intValue()); // Assuming 1 PROBABLE case - } else { - assertEquals(0, classifications.size()); // No cases expected for other dates - } - } - } - - - - @Test - public void testGetEpiCurveSeriesElementsPerPresentCondition() { - // Create necessary data for testing - RDCF rdcf = creator.createRDCF(); - UserDto user = creator.createSurveillanceSupervisor(rdcf); - Date currentDate = new Date(); - - // Create cases with different present conditions - createCasesForPersonWithCondition(PresentCondition.ALIVE, user.toReference(), rdcf, 2); - createCasesForPersonWithCondition(PresentCondition.DEAD, user.toReference(), rdcf, 3); - - // Define dashboard criteria - DashboardCriteria dashboardCriteria = new DashboardCriteria() - .region(rdcf.region) - .district(rdcf.district) - .disease(Disease.CORONAVIRUS) - .newCaseDateType(NewCaseDateType.MOST_RELEVANT) - .setEpiCurveGrouping(EpiCurveGrouping.DAY) - .dateBetween(DateHelper.subtractDays(currentDate, 1), DateHelper.addDays(currentDate, 1)); - - // Call the method under test - Map> result = getDashboardFacade().getEpiCurveSeriesElementsPerPresentCondition(dashboardCriteria); - - // Ensure the result map contains the expected currentDate without time comparison - boolean currentDateFound = false; - for (Date date : result.keySet()) { - if (DateUtils.isSameDay(date, currentDate)) { - currentDateFound = true; - Map conditionMap = result.get(date); - - assertNotNull(conditionMap, "Condition map for currentDate is null in the result"); - - // Perform assertions on PresentCondition.ALIVE - Integer aliveCount = conditionMap.get(PresentCondition.ALIVE); - assertNotNull(aliveCount, "Alive count is null in the condition map"); - assertEquals(2, aliveCount.intValue(), "Expected count for ALIVE"); - - // Perform assertions on PresentCondition.DEAD - Integer deadCount = conditionMap.get(PresentCondition.DEAD); - assertNotNull(deadCount, "Dead count is null in the condition map"); - assertEquals(3, deadCount.intValue(), "Expected count for DEAD"); - - break; - } - } - - assertTrue(currentDateFound, "CurrentDate not found in the result map"); - } - @Test public void testGetCaseMeasurePerDistrict() { // Create necessary data for testing @@ -514,122 +409,6 @@ public void testCountCasesConvertedFromContacts() { assertEquals(0, result); // Assuming no cases converted from contacts } - @Test - public void testGetEpiCurveSeriesElementsPerContactClassification() { - // Create necessary data for testing - RDCF rdcf = creator.createRDCF(); - UserDto user = creator.createSurveillanceSupervisor(rdcf); - Date currentDate = new Date(); - - // Create cases - CaseDataDto case1 = creator.createCase( - user.toReference(), - creator.createPerson("Case", "Person1").toReference(), - Disease.EVD, - CaseClassification.CONFIRMED, - InvestigationStatus.PENDING, - currentDate, - rdcf); - - CaseDataDto case2 = creator.createCase( - user.toReference(), - creator.createPerson("Case", "Person2").toReference(), - Disease.EVD, - CaseClassification.PROBABLE, - InvestigationStatus.PENDING, - currentDate, - rdcf); - - // Create contacts with classifications - creator.createContact( - user.toReference(), - creator.createPerson("Contact", "Person1").toReference(), - case1, - rdcf, - ContactClassification.CONFIRMED,new Date()); - - creator.createContact( - user.toReference(), - creator.createPerson("Contact", "Person2").toReference(), - case2, - rdcf, - ContactClassification.UNCONFIRMED,new Date()); - - // Define dashboard criteria - DashboardCriteria dashboardCriteria = new DashboardCriteria() - .region(rdcf.region) - .district(rdcf.district) - .disease(Disease.EVD) - .newCaseDateType(NewCaseDateType.MOST_RELEVANT) - .setEpiCurveGrouping(EpiCurveGrouping.DAY) - .dateBetween(DateHelper.subtractDays(currentDate, 1), DateHelper.addDays(currentDate, 1)); - - // Call the method under test - Map> result = getDashboardFacade().getEpiCurveSeriesElementsPerContactClassification(dashboardCriteria); - - // Assertions - assertEquals(3, result.size()); // Ensure only one date entry for current date - assertTrue(result.containsKey(DateHelper.resetTime(currentDate))); // Ensure currentDate is in the map - - // Get the map for currentDate - Map classificationMap = result.get(DateHelper.resetTime(currentDate)); - assertNotNull(classificationMap); // Ensure the classificationMap for currentDate is not null - - // Perform assertions on ContactClassification.HIGH_RISK - Long confirmedContactCount = classificationMap.get(ContactClassification.CONFIRMED); - assertNotNull(confirmedContactCount); // Ensure the count for HIGH_RISK is not null - assertEquals(1L, confirmedContactCount.longValue()); // Check the count for HIGH_RISK - - // Perform assertions on ContactClassification.LOW_RISK - Long unconfirmedCount = classificationMap.get(ContactClassification.UNCONFIRMED); - assertNotNull(unconfirmedCount); // Ensure the count for LOW_RISK is not null - assertEquals(1L, unconfirmedCount.longValue()); // Check the count for LOW_RISK - } - - @Test - public void testGetEpiCurveSeriesElementsPerContactFollowUpUntil() { - // Create necessary data for testing - RDCF rdcf = creator.createRDCF(); - UserDto user = creator.createSurveillanceSupervisor(rdcf); - Date currentDate = new Date(); - - // Create cases - CaseDataDto case1 = creator.createCase( - user.toReference(), - creator.createPerson("Case", "Person1").toReference(), - Disease.EVD, - CaseClassification.CONFIRMED, - InvestigationStatus.DONE, - currentDate, - rdcf); - - // Create contacts with follow-up dates - creator.createContact( - user.toReference(), - creator.createPerson("Contact", "Person1").toReference(), - case1, - rdcf, - ContactClassification.CONFIRMED, - DateHelper.subtractDays(currentDate, 5)); // Example follow-up date 5 days before currentDate - - // Define dashboard criteria - DashboardCriteria dashboardCriteria = new DashboardCriteria() - .region(rdcf.region) - .district(rdcf.district) - .disease(Disease.EVD) - .newCaseDateType(NewCaseDateType.MOST_RELEVANT) - .setEpiCurveGrouping(EpiCurveGrouping.DAY) - .dateBetween(DateHelper.subtractDays(currentDate, 1), DateHelper.addDays(currentDate, 1)); - - // Call the method under test - Map result = getDashboardFacade().getEpiCurveSeriesElementsPerContactFollowUpUntil(dashboardCriteria); - - // Assertions - assertEquals(3, result.size()); // Ensure only one date entry for current date - assertTrue(result.containsKey(DateHelper.resetTime(currentDate))); // Ensure currentDate is in the map - } - - @Test public void testGetEventCountByStatus() { // Create necessary data for testing @@ -680,36 +459,4 @@ public void testGetIntervalEndDate() { Date expectedEndDate3 = DateHelper.getEndOfMonth(startDate3); assertEquals(expectedEndDate3, dashboardFacadeEjb.getIntervalEndDate(startDate3, EpiCurveGrouping.MONTH)); } - - // Method to test - - @Test - public void testSetNewCaseDatesInCaseCriteria() { - DashboardFacadeEjb dashboardFacadeEjb = new DashboardFacadeEjb(); - - // Test case 1: DAY grouping - Date date1 = new Date(); // Replace with actual date values - DashboardCriteria dashboardCriteria1 = new DashboardCriteria() - .setEpiCurveGrouping(EpiCurveGrouping.DAY); - DashboardCriteria result1 = dashboardFacadeEjb.setNewCaseDatesInCaseCriteria(date1, dashboardCriteria1); - assertEquals(DateHelper.getStartOfDay(date1), result1.getDateFrom()); - assertEquals(DateHelper.getEndOfDay(date1), result1.getDateTo()); - - // Test case 2: WEEK grouping - Date date2 = new Date(); // Replace with actual date values - DashboardCriteria dashboardCriteria2 = new DashboardCriteria() - .setEpiCurveGrouping(EpiCurveGrouping.WEEK); - DashboardCriteria result2 = dashboardFacadeEjb.setNewCaseDatesInCaseCriteria(date2, dashboardCriteria2); - assertEquals(DateHelper.getStartOfWeek(date2), result2.getDateFrom()); - assertEquals(DateHelper.getEndOfWeek(date2), result2.getDateTo()); - - // Test case 3: MONTH grouping - Date date3 = new Date(); // Replace with actual date values - DashboardCriteria dashboardCriteria3 = new DashboardCriteria() - .setEpiCurveGrouping(EpiCurveGrouping.MONTH); - DashboardCriteria result3 = dashboardFacadeEjb.setNewCaseDatesInCaseCriteria(date3, dashboardCriteria3); - assertEquals(DateHelper.getStartOfMonth(date3), result3.getDateFrom()); - assertEquals(DateHelper.getEndOfMonth(date3), result3.getDateTo()); - } - } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java index 95aedf6f857..42cbf9303fc 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java @@ -43,7 +43,7 @@ public void testGetDiseaseForDashboard() { CriteriaDateType newCaseDateType = NewCaseDateType.MOST_RELEVANT; CaseClassification caseClassification = CaseClassification.CONFIRMED; - DiseaseBurdenDto result = getDiseaseFacade().getDiseaseForDashboard( + DiseaseBurdenDto result = getDashboardFacade().getDiseaseForDashboard( region, district, disease, @@ -84,7 +84,7 @@ public void testGetDiseaseGridForDashboard() { CriteriaDateType newCaseDateType = NewCaseDateType.MOST_RELEVANT; CaseClassification caseClassification = CaseClassification.CONFIRMED; - DiseaseBurdenDto result = getDiseaseFacade().getDiseaseGridForDashboard( + DiseaseBurdenDto result = getDashboardFacade().getDiseaseGridForDashboard( region, district, disease, @@ -104,6 +104,4 @@ public void testGetDiseaseGridForDashboard() { assertEquals("0", result.getDeaths()); assertEquals("0", result.getOther()); } - - } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java index 926699b7a09..f1ca06dc350 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java @@ -1,19 +1,20 @@ package de.symeda.sormas.backend.geo; -import de.symeda.sormas.api.infrastructure.region.RegionCriteria; -import de.symeda.sormas.api.infrastructure.region.RegionDto; -import de.symeda.sormas.api.infrastructure.region.RegionIndexDto; -import de.symeda.sormas.api.utils.SortProperty; -import de.symeda.sormas.backend.AbstractBeanTest; -import de.symeda.sormas.backend.infrastructure.region.Region; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; -import java.util.ArrayList; import java.util.Date; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; +import org.junit.jupiter.api.Test; + +import de.symeda.sormas.api.infrastructure.region.RegionDto; +import de.symeda.sormas.backend.AbstractBeanTest; +import de.symeda.sormas.backend.infrastructure.region.Region; import static org.junit.jupiter.api.Assertions.assertThrows; +import de.symeda.sormas.api.infrastructure.region.RegionCriteria; +import de.symeda.sormas.api.infrastructure.region.RegionIndexDto; +import de.symeda.sormas.api.utils.SortProperty; +import java.util.ArrayList; public class RegionFacadeEjbTest extends AbstractBeanTest { @@ -56,7 +57,7 @@ public void testGetAllRegion() { getRegionService().doFlush(); // Act - List results = getRegionFacade().getAllRegion(); + List results = getRegionFacade().getAllActiveRegions(); // Assert assertEquals(2, results.size()); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java index 36db57988e6..6a8b93b2624 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java @@ -17,23 +17,28 @@ *******************************************************************************/ package de.symeda.sormas.backend.outbreak; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.jupiter.api.Test; + import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.outbreak.OutbreakCriteria; import de.symeda.sormas.api.outbreak.OutbreakDto; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator.RDCF; -import de.symeda.sormas.backend.infrastructure.district.District; -import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; - +import de.symeda.sormas.backend.infrastructure.district.District; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; - -import static org.junit.jupiter.api.Assertions.*; public class OutbreakFacadeEjbTest extends AbstractBeanTest { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java index 10e92d91c24..70f3de7c037 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java @@ -17,9 +17,38 @@ *******************************************************************************/ package de.symeda.sormas.backend.sample; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.stream.Collectors; + +import org.hamcrest.MatcherAssert; +import org.junit.jupiter.api.Test; + import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.EntityRelevanceStatus; -import de.symeda.sormas.api.caze.*; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.CaseCriteria; +import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.caze.CaseIndexDto; +import de.symeda.sormas.api.caze.InvestigationStatus; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; import de.symeda.sormas.api.contact.ContactCriteria; @@ -28,7 +57,13 @@ import de.symeda.sormas.api.contact.ContactReferenceDto; import de.symeda.sormas.api.dashboard.SampleDashboardCriteria; import de.symeda.sormas.api.dashboard.sample.MapSampleDto; -import de.symeda.sormas.api.event.*; +import de.symeda.sormas.api.event.EventDto; +import de.symeda.sormas.api.event.EventInvestigationStatus; +import de.symeda.sormas.api.event.EventParticipantCriteria; +import de.symeda.sormas.api.event.EventParticipantDto; +import de.symeda.sormas.api.event.EventParticipantIndexDto; +import de.symeda.sormas.api.event.EventStatus; +import de.symeda.sormas.api.event.TypeOfPlace; import de.symeda.sormas.api.feature.FeatureConfigurationIndexDto; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.I18nProperties; @@ -40,7 +75,18 @@ import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.person.Sex; -import de.symeda.sormas.api.sample.*; +import de.symeda.sormas.api.sample.AdditionalTestDto; +import de.symeda.sormas.api.sample.AdditionalTestingStatus; +import de.symeda.sormas.api.sample.PathogenTestDto; +import de.symeda.sormas.api.sample.PathogenTestResultType; +import de.symeda.sormas.api.sample.PathogenTestType; +import de.symeda.sormas.api.sample.SampleAssociationType; +import de.symeda.sormas.api.sample.SampleCriteria; +import de.symeda.sormas.api.sample.SampleDto; +import de.symeda.sormas.api.sample.SampleIndexDto; +import de.symeda.sormas.api.sample.SampleMaterial; +import de.symeda.sormas.api.sample.SamplePurpose; +import de.symeda.sormas.api.sample.SampleSimilarityCriteria; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; @@ -49,16 +95,6 @@ import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; import de.symeda.sormas.backend.TestDataCreator.RDCF; -import org.hamcrest.MatcherAssert; -import org.junit.jupiter.api.Test; - -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.stream.Collectors; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; -import static org.junit.jupiter.api.Assertions.*; public class SampleFacadeEjbTest extends AbstractBeanTest { @@ -1187,8 +1223,6 @@ public void testCountAndGetSamplesForMap() { assertEquals(6, samples.size()); } - - @Test public void testGetEarliestPositiveSampleDate() { RDCF rdcf = creator.createRDCF(); @@ -1231,7 +1265,4 @@ public void testGetEarliestPositiveSampleDate() { assertEquals(new Date(2023 - 1900, 5, 15), earliestPositiveSampleDate); } - - - } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleServiceTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleServiceTest.java index b1be40eb791..059ee5d3c93 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleServiceTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleServiceTest.java @@ -1,33 +1,46 @@ package de.symeda.sormas.backend.sample; -import de.symeda.sormas.api.Disease; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.List; + +import org.junit.jupiter.api.Test; + import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.common.DeletionDetails; import de.symeda.sormas.api.common.DeletionReason; -import de.symeda.sormas.api.contact.ContactDto; -import de.symeda.sormas.api.event.*; import de.symeda.sormas.api.externalmessage.ExternalMessageDto; -import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.person.PersonDto; -import de.symeda.sormas.api.sample.SampleAssociationType; -import de.symeda.sormas.api.sample.SampleCriteria; import de.symeda.sormas.api.sample.SampleDto; import de.symeda.sormas.api.user.DefaultUserRole; import de.symeda.sormas.api.user.UserDto; -import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; -import org.junit.jupiter.api.Test; - -import javax.inject.Inject; -import javax.persistence.EntityManager; -import javax.persistence.criteria.*; +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.contact.ContactDto; +import de.symeda.sormas.api.event.EventDto; +import de.symeda.sormas.api.event.EventInvestigationStatus; +import de.symeda.sormas.api.event.EventParticipantDto; +import de.symeda.sormas.api.event.EventStatus; +import de.symeda.sormas.api.event.TypeOfPlace; +import de.symeda.sormas.api.feature.FeatureType; +import de.symeda.sormas.api.sample.SampleAssociationType; +import de.symeda.sormas.api.sample.SampleCriteria; +import de.symeda.sormas.api.utils.DateHelper; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Date; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; +import javax.inject.Inject; +import javax.persistence.EntityManager; +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 static org.junit.jupiter.api.Assertions.assertFalse; /** * @see SampleService @@ -75,6 +88,7 @@ public void testSamplePermanentDeletion() { assertNull(getSampleService().getByUuid(referralSample.getUuid()).getReferredTo()); assertNull(getSampleReportService().getByUuid(labMessage.getSampleReports().get(0).getUuid()).getSample()); } + @Test public void testBuildSampleListCriteriaFilterForCase() throws Exception { // Prepare data @@ -101,7 +115,6 @@ public void testBuildSampleListCriteriaFilterForCase() throws Exception { assertNotNull(predicate); } - @Test public void testBuildSampleListCriteriaFilterForContact() throws Exception { // Prepare data @@ -176,7 +189,6 @@ public void testBuildSampleListCriteriaFilterForEventParticipant() throws Except assertNotNull(predicate); } - @Test public void testIsEditAllowed() throws InvocationTargetException, IllegalAccessException { TestDataCreator.RDCF rdcf = creator.createRDCF(); @@ -200,9 +212,5 @@ public void testIsEditAllowed() throws InvocationTargetException, IllegalAccessE boolean notOwnerShipAndJurisdictionFlagStatus = getSampleService().getJurisdictionFlags(sampleEntity).getInJurisdiction() && !getSormasToSormasShareInfoService().isSamlpeOwnershipHandedOver(sampleEntity); assertTrue(notOwnerShipAndJurisdictionFlagStatus); - } - - - } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java index 11ad75263c6..768657d55ae 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java @@ -18,15 +18,15 @@ import java.util.Date; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.caze.CaseClassification; -import de.symeda.sormas.api.caze.NewCaseDateType; import de.symeda.sormas.api.dashboard.BaseDashboardCriteria; -import de.symeda.sormas.api.dashboard.DashboardCriteria; -import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.criteria.CriteriaDateType; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.NewCaseDateType; +import de.symeda.sormas.api.dashboard.DashboardCriteria; +import de.symeda.sormas.api.dashboard.NewDateFilterType; public abstract class AbstractDashboardDataProvider> { @@ -128,7 +128,6 @@ public CriteriaDateType getNewCaseDateType() { return newCaseDateType; } - public DashboardCriteria getCriteria() { return new DashboardCriteria().region(region) .district(district) @@ -179,5 +178,4 @@ public NewDateFilterType getDateFilterType() { public void setDateFilterType(NewDateFilterType dateFilterType) { this.dateFilterType = dateFilterType; } - } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java index 7cc075e4dd5..c9a627eb7d5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java @@ -17,26 +17,26 @@ *******************************************************************************/ package de.symeda.sormas.ui.dashboard; +import static de.symeda.sormas.ui.UiUtil.permitted; + import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; import com.vaadin.v7.data.Property; import com.vaadin.v7.ui.OptionGroup; -import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.FacadeProvider; + import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.ui.SormasUI; import de.symeda.sormas.ui.dashboard.campaigns.CampaignDashboardView; -import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; import de.symeda.sormas.ui.dashboard.contacts.ContactsDashboardView; import de.symeda.sormas.ui.dashboard.diseasedetails.DiseaseDetailsView; import de.symeda.sormas.ui.dashboard.surveillance.SurveillanceDashboardView; import de.symeda.sormas.ui.utils.AbstractView; import de.symeda.sormas.ui.utils.CssStyles; - -import static de.symeda.sormas.ui.UiUtil.permitted; +import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; +import de.symeda.sormas.api.Disease; @SuppressWarnings("serial") public abstract class AbstractDashboardView extends AbstractView { @@ -49,8 +49,6 @@ public abstract class AbstractDashboardView extends AbstractView { protected Disease disease; protected DashboardFilterLayout filterLayout; - - @SuppressWarnings("deprecation") protected AbstractDashboardView(String viewName) { @@ -78,81 +76,11 @@ protected AbstractDashboardView(String viewName) { dashboardSwitcher.setItemCaption(DashboardType.CAMPAIGNS, I18nProperties.getEnumCaption(DashboardType.CAMPAIGNS)); } - - - addHeaderComponent(dashboardSwitcher); - - // Hide the dashboard switcher if only one dashboard is accessible to the user - if (dashboardSwitcher.size() <= 1) { - dashboardSwitcher.setVisible(false); + if (permitted(FeatureType.DISEASE_DETAILS)) { + dashboardSwitcher.addItem(DashboardType.DISEASE); + dashboardSwitcher.setItemCaption(DashboardType.DISEASE, I18nProperties.getEnumCaption(DashboardType.DISEASE)); } - // Dashboard layout - dashboardLayout = new VerticalLayout(); - dashboardLayout.setMargin(false); - dashboardLayout.setSpacing(false); - dashboardLayout.setSizeFull(); - dashboardLayout.setStyleName("crud-main-layout"); - - addComponent(dashboardLayout); - setExpandRatio(dashboardLayout, 1); - } - - protected AbstractDashboardView(String viewName, DashboardType dashboardType) { - super(viewName); - - dashboardDataProvider = new DashboardDataProvider(); - - if (dashboardDataProvider.getDashboardType() == null) { - dashboardDataProvider.setDashboardType(dashboardType); - } - if (DashboardType.CONTACTS.equals(dashboardDataProvider.getDashboardType())) { - dashboardDataProvider.setDisease(FacadeProvider.getDiseaseConfigurationFacade().getDefaultDisease()); - } - if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) { - dashboardDataProvider.setDisease(getDiseases()); - } - - - - CssStyles.style(dashboardSwitcher, CssStyles.FORCE_CAPTION, ValoTheme.OPTIONGROUP_HORIZONTAL, CssStyles.OPTIONGROUP_HORIZONTAL_PRIMARY); - if (permitted(FeatureType.CASE_SURVEILANCE, UserRight.DASHBOARD_SURVEILLANCE_VIEW)) { - dashboardSwitcher.addItem(DashboardType.SURVEILLANCE); - dashboardSwitcher.setItemCaption(DashboardType.SURVEILLANCE, I18nProperties.getEnumCaption(DashboardType.SURVEILLANCE)); - } - if (permitted(FeatureType.CONTACT_TRACING, UserRight.DASHBOARD_CONTACT_VIEW)) { - dashboardSwitcher.addItem(DashboardType.CONTACTS); - dashboardSwitcher.setItemCaption(DashboardType.CONTACTS, I18nProperties.getEnumCaption(DashboardType.CONTACTS)); - } - if (permitted(FeatureType.CAMPAIGNS, UserRight.DASHBOARD_CAMPAIGNS_VIEW)) { - dashboardSwitcher.addItem(DashboardType.CAMPAIGNS); - dashboardSwitcher.setItemCaption(DashboardType.CAMPAIGNS, I18nProperties.getEnumCaption(DashboardType.CAMPAIGNS)); - } - - //if (permitted(FeatureType.DISEASE_DETAILS,UserRight.DASHBOARD_DISEASE_DETAILS_ACCESS)) { - - if(dashboardDataProvider.getDashboardType()==DashboardType.DISEASE) { - dashboardSwitcher.addItem(DashboardType.DISEASE); - dashboardSwitcher.setItemCaption(DashboardType.DISEASE, I18nProperties.getEnumCaption(DashboardType.DISEASE)); - } - //} - - - - dashboardSwitcher.setValue(dashboardType); - dashboardSwitcher.addValueChangeListener(e -> { - dashboardDataProvider.setDashboardType((DashboardType) e.getProperty().getValue()); - if (DashboardType.SURVEILLANCE.equals(e.getProperty().getValue())) { - SormasUI.get().getNavigator().navigateTo(SurveillanceDashboardView.VIEW_NAME); - } else if (DashboardType.DISEASE.equals(e.getProperty().getValue())) { - - SormasUI.get().getNavigator().navigateTo(DiseaseDetailsView.VIEW_NAME); - } - - else { - SormasUI.get().getNavigator().navigateTo(ContactsDashboardView.VIEW_NAME); - } - }); addHeaderComponent(dashboardSwitcher); // Hide the dashboard switcher if only one dashboard is accessible to the user @@ -167,10 +95,10 @@ protected AbstractDashboardView(String viewName, DashboardType dashboardType) { dashboardLayout.setSizeFull(); dashboardLayout.setStyleName("crud-main-layout"); - addComponent(dashboardLayout); setExpandRatio(dashboardLayout, 1); } + protected void navigateToDashboardView(Property.ValueChangeEvent e) { if (DashboardType.SURVEILLANCE.equals(e.getProperty().getValue())) { SormasUI.get().getNavigator().navigateTo(SurveillanceDashboardView.VIEW_NAME); @@ -178,9 +106,7 @@ protected void navigateToDashboardView(Property.ValueChangeEvent e) { else if (DashboardType.CONTACTS.equals(e.getProperty().getValue())) { SormasUI.get().getNavigator().navigateTo(ContactsDashboardView.VIEW_NAME); } - else if (DashboardType.DISEASE.equals(e.getProperty().getValue())) { - SormasUI.get().getNavigator().navigateTo(DiseaseDetailsView.VIEW_NAME); } else if (DashboardType.CAMPAIGNS.equals(e.getProperty().getValue())) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java index 06d8b83708e..ce68c0ae6fc 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java @@ -21,17 +21,10 @@ import com.vaadin.navigator.Navigator; -import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.caze.CaseClassification; -import de.symeda.sormas.api.caze.NewCaseDateType; -import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.api.feature.FeatureType; -import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.user.UserRight; -import de.symeda.sormas.ui.SormasUI; import de.symeda.sormas.ui.dashboard.campaigns.CampaignDashboardView; import de.symeda.sormas.ui.dashboard.contacts.ContactsDashboardView; -import de.symeda.sormas.ui.dashboard.diseasedetails.DiseaseDetailsView; import de.symeda.sormas.ui.dashboard.sample.SampleDashboardView; import de.symeda.sormas.ui.dashboard.surveillance.SurveillanceDashboardView; @@ -40,6 +33,13 @@ import java.util.Date; import java.util.Objects; import java.util.TimeZone; +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.NewCaseDateType; +import de.symeda.sormas.api.dashboard.NewDateFilterType; +import de.symeda.sormas.ui.dashboard.diseasedetails.DiseaseDetailsView; +import de.symeda.sormas.ui.SormasUI; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; public class DashboardController { @@ -61,12 +61,11 @@ public void registerViews(Navigator navigator) { navigator.addView(SampleDashboardView.VIEW_NAME, SampleDashboardView.class); } - //if (permitted(FeatureType.DISEASE_DETAILS,UserRight.DASHBOARD_DISEASE_DETAILS_ACCESS)) { + if (permitted(FeatureType.DISEASE_DETAILS)) { navigator.addView(DiseaseDetailsView.VIEW_NAME, DiseaseDetailsView.class); - //} + } } - public void navigateToDisease(Disease disease,DashboardDataProvider dashboardDataProvider) { Date dateFrom = dashboardDataProvider.getFromDate(); @@ -93,6 +92,5 @@ public void navigateToDisease(Disease disease,DashboardDataProvider dashboardDat String navigationState = DiseaseDetailsView.VIEW_NAME + "/" + disease.getName(); SormasUI.get().getNavigator().navigateTo(navigationState); - } } 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 5e1c2c2da71..feb332111f1 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 @@ -17,20 +17,30 @@ *******************************************************************************/ package de.symeda.sormas.ui.dashboard; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.time.DateUtils; + import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.caze.CaseReferenceDefinition; import de.symeda.sormas.api.caze.NewCaseDateType; -import de.symeda.sormas.api.dashboard.*; +import de.symeda.sormas.api.dashboard.DashboardCaseDto; +import de.symeda.sormas.api.dashboard.DashboardContactDto; +import de.symeda.sormas.api.dashboard.DashboardCriteria; +import de.symeda.sormas.api.dashboard.DashboardEventDto; +import de.symeda.sormas.api.dashboard.DashboardQuarantineDataDto; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.event.EventStatus; import de.symeda.sormas.api.outbreak.OutbreakCriteria; import de.symeda.sormas.api.sample.PathogenTestResultType; -import org.apache.commons.lang3.time.DateUtils; - -import java.util.*; -import java.util.function.Predicate; -import java.util.stream.Collectors; +import de.symeda.sormas.api.dashboard.NewDateFilterType; // FIXME: 06/08/2020 this should be refactored into two specific data providers for case and contact dashboards public class DashboardDataProvider extends AbstractDashboardDataProvider { @@ -55,6 +65,7 @@ public class DashboardDataProvider extends AbstractDashboardDataProvider events = new ArrayList<>(); private Map newCasesFinalLabResultCountByResultType; private Map eventCountByStatus; + private Long contactsInQuarantineCount = 0L; private Long contactsPlacedInQuarantineCount = 0L; private Long casesInQuarantineCount = 0L; @@ -76,16 +87,13 @@ public void refreshData() { this.refreshDataForSelectedDisease(); } - - @Override protected DashboardCriteria newCriteria() { - return new DashboardCriteria(newCaseDateType); + return new DashboardCriteria().setDateTypeClass(newCaseDateType); } - public void refreshDiseaseData() { - DiseaseBurdenDto dbd= FacadeProvider.getDiseaseFacade().getDiseaseForDashboard(region, district, disease, fromDate, toDate, previousFromDate, previousToDate + DiseaseBurdenDto dbd= FacadeProvider.getDashboardFacade().getDiseaseForDashboard(region, district, disease, fromDate, toDate, previousFromDate, previousToDate ,newCaseDateType ,caseClassification); @@ -129,37 +137,33 @@ private void refreshDataForQuarantinedCases() { private Predicate quarantineData(Date fromDate, Date toDate) { return p -> { - if (p != null) { - Date quarantineFrom = p.getQuarantineFrom(); - Date quarantineTo = p.getQuarantineTo(); - - if (fromDate != null && toDate != null) { - if (quarantineFrom != null && quarantineTo != null) { - return quarantineTo.after(fromDate) && quarantineFrom.before(toDate); - } else if (quarantineFrom != null) { - return quarantineFrom.after(fromDate) && quarantineFrom.before(toDate); - } else if (quarantineTo != null) { - return quarantineTo.after(fromDate) && quarantineTo.before(toDate); - } - } else if (fromDate != null) { - if (quarantineFrom != null) { - return quarantineFrom.after(fromDate); - } else if (quarantineTo != null) { - return quarantineTo.after(fromDate); - } - } else if (toDate != null) { - if (quarantineFrom != null) { - return quarantineFrom.before(toDate); - } else if (quarantineTo != null) { - return quarantineTo.before(toDate); - } + Date quarantineFrom = p.getQuarantineFrom(); + Date quarantineTo = p.getQuarantineTo(); + + if (fromDate != null && toDate != null) { + if (quarantineFrom != null && quarantineTo != null) { + return quarantineTo.after(fromDate) && quarantineFrom.before(toDate); + } else if (quarantineFrom != null) { + return quarantineFrom.after(fromDate) && quarantineFrom.before(toDate); + } else if (quarantineTo != null) { + return quarantineTo.after(fromDate) && quarantineTo.before(toDate); + } + } else if (fromDate != null) { + if (quarantineFrom != null) { + return quarantineFrom.after(fromDate); + } else if (quarantineTo != null) { + return quarantineTo.after(fromDate); + } + } else if (toDate != null) { + if (quarantineFrom != null) { + return quarantineFrom.before(toDate); + } else if (quarantineTo != null) { + return quarantineTo.before(toDate); } - - return false; } + return false; }; - } private Long getPlacedInQuarantine(List contactsInQuarantineDtos) { @@ -190,7 +194,7 @@ public void refreshDataForSelectedDisease() { // Contacts setContacts(FacadeProvider.getContactFacade().getContactsForDashboard(region, district, disease, fromDate, toDate)); setPreviousContacts( - FacadeProvider.getContactFacade().getContactsForDashboard(region, district, disease, previousFromDate, previousToDate)); + FacadeProvider.getContactFacade().getContactsForDashboard(region, district, disease, previousFromDate, previousToDate)); this.refreshDataForQuarantinedContacts(); } @@ -202,15 +206,15 @@ public void refreshDataForSelectedDisease() { setCases(FacadeProvider.getDashboardFacade().getCases(caseDashboardCriteria)); setLastReportedDistrict(FacadeProvider.getDashboardFacade().getLastReportedDistrictName(caseDashboardCriteria)); setCasesCountByClassification( - FacadeProvider.getDashboardFacade() - .getCasesCountByClassification(buildDashboardCriteria(fromDate, toDate).includeNotACaseClassification(true))); + FacadeProvider.getDashboardFacade() + .getCasesCountByClassification(buildDashboardCriteria(fromDate, toDate).includeNotACaseClassification(true))); setPreviousCases(FacadeProvider.getDashboardFacade().getCases(buildDashboardCriteria(previousFromDate, previousToDate))); // test results if (getDashboardType() != DashboardType.CONTACTS) { setNewCasesFinalLabResultCountByResultType( - FacadeProvider.getDashboardFacade().getNewCasesFinalLabResultCountByResultType(caseDashboardCriteria)); + FacadeProvider.getDashboardFacade().getNewCasesFinalLabResultCountByResultType(caseDashboardCriteria)); } } @@ -225,8 +229,8 @@ public void refreshDataForSelectedDisease() { Long districtOutbreakCount = FacadeProvider.getOutbreakFacade() .getOutbreakDistrictCount( - new OutbreakCriteria().region(region).district(district).disease(disease) - .reportedBetween(fromDate, toDate)); + new OutbreakCriteria().region(region).district(district).disease(disease) + .reportedBetween(fromDate, toDate)); setOutbreakDistrictCount(districtOutbreakCount); @@ -334,23 +338,22 @@ public String getLastReportedDistrict() { public void setLastReportedDistrict(String district) { this.lastReportedDistrict = district; } - @Override + public NewCaseDateType getNewCaseDateType() { if (newCaseDateType == null) { return NewCaseDateType.MOST_RELEVANT; } return newCaseDateType; } - @Override + public void setNewCaseDateType(NewCaseDateType newCaseDateType) { this.newCaseDateType = newCaseDateType; } - @Override public DashboardType getDashboardType() { return dashboardType; } - @Override + public void setDashboardType(DashboardType dashboardType) { this.dashboardType = dashboardType; } @@ -402,19 +405,16 @@ public Long getCaseWithReferenceDefinitionFulfilledCount() { public void setCaseWithReferenceDefinitionFulfilledCount(Long caseWithReferenceDefinitionFulfilledCount) { this.caseWithReferenceDefinitionFulfilledCount = caseWithReferenceDefinitionFulfilledCount; } - @Override + public CaseClassification getCaseClassification() { return caseClassification; } - @Override + public void setCaseClassification(CaseClassification caseClassification) { this.caseClassification = caseClassification; } - @Override public void setDateFilterType(NewDateFilterType dateFilterType) { this.dateFilterType = dateFilterType; } - - } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardType.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardType.java index 78f6b41b77c..f8fcd42c317 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardType.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardType.java @@ -24,9 +24,8 @@ public enum DashboardType { SURVEILLANCE, CONTACTS, CAMPAIGNS, - - DISEASE, - SAMPLES; + SAMPLES, + DISEASE; @Override public String toString() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java index 633470c8fb5..9b3a512115a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java @@ -17,23 +17,33 @@ *******************************************************************************/ package de.symeda.sormas.ui.dashboard.components; +import static de.symeda.sormas.ui.utils.AbstractFilterForm.FILTER_ITEM_STYLE; +import static de.symeda.sormas.ui.utils.LayoutUtil.filterLocs; + +import java.util.Date; +import java.util.HashSet; +import java.util.Set; + +import org.apache.commons.lang3.ArrayUtils; +import org.vaadin.hene.popupbutton.PopupButton; + import com.vaadin.event.ShortcutAction; -import com.vaadin.navigator.ViewChangeListener; import com.vaadin.server.Page; import com.vaadin.shared.ui.MarginInfo; -import com.vaadin.ui.*; +import com.vaadin.ui.Button; +import com.vaadin.ui.Component; +import com.vaadin.ui.CustomLayout; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.Notification; import com.vaadin.ui.Notification.Type; +import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.themes.ValoTheme; import com.vaadin.v7.ui.ComboBox; -import de.symeda.sormas.api.Disease; + import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.Language; -import de.symeda.sormas.api.caze.CaseClassification; -import de.symeda.sormas.api.caze.CaseIndexDto; import de.symeda.sormas.api.caze.NewCaseDateType; -import de.symeda.sormas.api.contact.ContactIndexDto; -import de.symeda.sormas.api.dashboard.DashboardCriteria; -import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -47,19 +57,21 @@ import de.symeda.sormas.ui.UiUtil; import de.symeda.sormas.ui.dashboard.AbstractDashboardDataProvider; import de.symeda.sormas.ui.dashboard.AbstractDashboardView; +import de.symeda.sormas.ui.utils.ButtonHelper; +import de.symeda.sormas.ui.utils.ComboBoxHelper; +import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.utils.DateFormatHelper; +import de.symeda.sormas.ui.utils.EpiWeekAndDateFilterComponent; +import com.vaadin.navigator.ViewChangeListener; +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.caze.CaseIndexDto; +import de.symeda.sormas.api.contact.ContactIndexDto; +import de.symeda.sormas.api.dashboard.DashboardCriteria; +import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.ui.dashboard.DashboardType; -import de.symeda.sormas.ui.utils.*; -import org.apache.commons.lang3.ArrayUtils; -import org.vaadin.hene.popupbutton.PopupButton; - -import java.util.Date; -import java.util.HashSet; -import java.util.Set; import java.util.function.Consumer; -import static de.symeda.sormas.ui.utils.AbstractFilterForm.FILTER_ITEM_STYLE; -import static de.symeda.sormas.ui.utils.LayoutUtil.filterLocs; - @SuppressWarnings("serial") public class DashboardFilterLayout

extends HorizontalLayout { @@ -94,15 +106,14 @@ public class DashboardFilterLayout

exte private Button resetButton; private Button applyButton; - DateFilterType currentDateFilterType; + private DateFilterType currentDateFilterType; private HorizontalLayout customDateFilterLayout; - private ComboBox diseaseFilter; private Runnable dateFilterChangeCallback; private Consumer diseaseFilterChangeCallback; private Label infoLabel; - + private ComboBox diseaseFilter; private ComboBox caseClassificationFilter; public DashboardFilterLayout(AbstractDashboardView dashboardView, P dashboardDataProvider, String[] templateContent) { @@ -128,6 +139,7 @@ public DashboardFilterLayout(AbstractDashboardView dashboardView, P dashboardDat addComponent(customLayout); populateLayout(); + if(currentDateFilterType!=null) { String dateFilterType = currentDateFilterType.name(); dashboardDataProvider.setDateFilterType(NewDateFilterType.valueOf(dateFilterType)); @@ -147,7 +159,6 @@ public void populateLayout() { createResetAndApplyButtons(); }; - private void createDiseaseFilter() { diseaseFilter.setWidth(200, Unit.PIXELS); diseaseFilter.setInputPrompt(I18nProperties.getString(Strings.promptDisease)); @@ -237,22 +248,22 @@ public void createDateFilters() { addCustomComponent(dateFilterLayout, DATE_FILTER); btnCurrentPeriod = ButtonHelper.createIconPopupButton( - "currentPeriod", - null, - new VerticalLayout(createDateFilterButtonsLayout(), createCustomDateFilterLayout()), - CssStyles.BUTTON_FILTER, - CssStyles.BUTTON_FILTER_LIGHT); + "currentPeriod", + null, + new VerticalLayout(createDateFilterButtonsLayout(), createCustomDateFilterLayout()), + CssStyles.BUTTON_FILTER, + CssStyles.BUTTON_FILTER_LIGHT); Label lblComparedTo = new Label(I18nProperties.getCaption(Captions.dashboardComparedTo)); CssStyles.style(lblComparedTo, CssStyles.VSPACE_TOP_4, CssStyles.LABEL_BOLD); btnComparisonPeriod = ButtonHelper.createIconPopupButton( - "comparisonPeriod", - null, - createDateComparisonButtonsLayout(), - ValoTheme.BUTTON_BORDERLESS, - CssStyles.BUTTON_FILTER, - CssStyles.BUTTON_FILTER_LIGHT); + "comparisonPeriod", + null, + createDateComparisonButtonsLayout(), + ValoTheme.BUTTON_BORDERLESS, + CssStyles.BUTTON_FILTER, + CssStyles.BUTTON_FILTER_LIGHT); dateFilterLayout.addComponents(btnCurrentPeriod, lblComparedTo, btnComparisonPeriod); @@ -649,8 +660,6 @@ private void updateCurrentPeriodButtons(DashboardCriteria criteria) { } - - private enum DateFilterType { TODAY, YESTERDAY, @@ -673,7 +682,6 @@ protected void addCustomComponent(Component component, String locator) { component.addStyleName(FILTER_ITEM_STYLE); } - public void reload(ViewChangeListener.ViewChangeEvent event) { DashboardCriteria criteria = dashboardDataProvider.getCriteria(); String params = event.getParameters().trim(); @@ -683,7 +691,5 @@ public void reload(ViewChangeListener.ViewChangeEvent event) { criteria.fromUrlParams(params); } setCriteria(criteria); - } - } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java index 4b7d53de5e1..102e3d3a18e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java @@ -80,7 +80,7 @@ public class ContactsDashboardView extends AbstractDashboardView { private Label contactsPlacedInQuarantineByDate = new Label(); public ContactsDashboardView() { - super(VIEW_NAME,DashboardType.CONTACTS); + super(VIEW_NAME); dashboardDataProvider = new DashboardDataProvider(); if (dashboardDataProvider.getDashboardType() == null) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java index 00af92955ea..dcedfe3aaf6 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java @@ -1,3 +1,17 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package de.symeda.sormas.ui.dashboard.diseasedetails; import com.vaadin.shared.ui.ContentMode; @@ -11,15 +25,11 @@ public class DiseaseDetailsComponent extends CssLayout { - /** - * - */ private static final long serialVersionUID = 1L; private DashboardDataProvider dashboardDataProvider; private static final String HTML_DIV_END = "

"; - public DiseaseDetailsComponent(DashboardDataProvider dashboardDataProvider) { this.dashboardDataProvider = dashboardDataProvider; addStyleName("disease-detail-card-display-top"); @@ -122,13 +132,11 @@ private void addStatsLayout(Long fatalities, Long totalCase, String outbreakDist CssStyles.style(layout, CssStyles.getDiseaseColor(disease), CssStyles.BACKGROUND_DARKER); float cfrPercent = calculateCfr(fatalities, totalCase); - layout.addComponent(createDeathCfrItem(I18nProperties.getCaption(Captions.dashboardFatalities)+": ", fatalities.toString()+"", fatalities > 0, I18nProperties.getCaption(Captions.DiseaseBurden_caseFatalityRate)+": ", String.valueOf(cfrPercent))); - HorizontalLayout statsItem = createStatsItem( I18nProperties.getCaption(Captions.dashboardLastReportedDistrict) + ": ", district.length() == 0 ? I18nProperties.getString(Strings.none) : district, @@ -163,7 +171,6 @@ private HorizontalLayout createDeathCfrItem(String fatalityLabel, String fatalit fatalityNameLabel.setValue("
" + fatalityLabel + HTML_DIV_END + "
" + fatalityValue+ HTML_DIV_END); - layout.addComponent(fatalityNameLabel); layout.setExpandRatio(fatalityNameLabel, 1); @@ -181,7 +188,6 @@ private HorizontalLayout createDeathCfrItem(String fatalityLabel, String fatalit layout.addComponent(cfrNameLabel); return layout; - } private HorizontalLayout createStatsItem(String label, String value, boolean isCritical, boolean singleColumn) { @@ -225,4 +231,4 @@ private float calculateCfr(long fatalities, long totalCaseCount){ return 0; return ((float) fatalities / totalCaseCount) * 100; } -} +} \ No newline at end of file diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java index 73f3e5f3373..f1a784437b5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java @@ -1,3 +1,17 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package de.symeda.sormas.ui.dashboard.diseasedetails; import de.symeda.sormas.api.Disease; @@ -7,6 +21,7 @@ import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.api.infrastructure.region.RegionDto; import de.symeda.sormas.ui.dashboard.AbstractDashboardView; +import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.DashboardType; import static com.vaadin.navigator.ViewChangeListener.*; import java.text.DateFormat; @@ -32,9 +47,15 @@ public static void setDiseaseDetailsData(String newData) { } public DiseaseDetailsView() { - super(VIEW_NAME, DashboardType.DISEASE); + super(VIEW_NAME); + dashboardDataProvider = new DashboardDataProvider(); dashboardLayout.setSpacing(false); + if (dashboardDataProvider.getDashboardType() == null) { + dashboardDataProvider.setDashboardType(DashboardType.DISEASE); + } + + dashboardDataProvider.setDisease(getDiseases()); if (diseaseDetailsData != null) { String[] dataParts = diseaseDetailsData.split("/"); @@ -45,7 +66,6 @@ public DiseaseDetailsView() { String caseClassification = dataParts[3]; String newCaseDateType = dataParts[4]; String regionId = dataParts[5]; - setDateFilters(dateFrom, dateTo); setDateFilterType(newDateFilterType); setCaseClassification(caseClassification); @@ -54,17 +74,10 @@ public DiseaseDetailsView() { } } - if (dashboardDataProvider.getDashboardType() == null) { - dashboardDataProvider.setDashboardType(DashboardType.DISEASE); - } - if (DashboardType.DISEASE.equals(dashboardDataProvider.getDashboardType())) { dashboardDataProvider.setDisease(FacadeProvider.getDiseaseConfigurationFacade().getDefaultDisease()); } - filterLayout = new DiseaseFilterLayout(this, dashboardDataProvider); - dashboardLayout.addComponent(filterLayout); - dashboardSwitcher.setValue(DashboardType.DISEASE); dashboardSwitcher.addValueChangeListener(e -> { dashboardDataProvider.setDashboardType((DashboardType) e.getProperty().getValue()); @@ -95,8 +108,10 @@ private void setDateFilters(String dateFrom, String dateTo) { private void setDateFilterType(String newDateFilterType) { try { - NewDateFilterType filterType = NewDateFilterType.valueOf(newDateFilterType); - dashboardDataProvider.setDateFilterType(filterType); + if(newDateFilterType!=null&&!newDateFilterType.equals("null")) { + NewDateFilterType filterType = NewDateFilterType.valueOf(newDateFilterType); + dashboardDataProvider.setDateFilterType(filterType); + } } catch (IllegalArgumentException e) { LOGGER.log(Level.WARNING, "Unsupported date filter type: " + newDateFilterType, e); } @@ -117,21 +132,12 @@ private void setCaseClassification(String caseClassification) { private void setNewCaseDateType(String newCaseDateType) { NewCaseDateType caseDateType; switch (newCaseDateType) { - case "Creation date": - caseDateType = NewCaseDateType.CREATION; - break; - case "Investigation date": - caseDateType = NewCaseDateType.INVESTIGATION; - break; case "Symptom onset date": caseDateType = NewCaseDateType.ONSET; break; case "Case report date": caseDateType = NewCaseDateType.REPORT; break; - case "Classification date": - caseDateType = NewCaseDateType.CLASSIFICATION; - break; default: caseDateType = NewCaseDateType.MOST_RELEVANT; } @@ -139,7 +145,7 @@ private void setNewCaseDateType(String newCaseDateType) { } private void setRegion(String regionId) { - if (!"null".equals(regionId)) { + if (regionId != null && !"null".equals(regionId) && !regionId.isEmpty()) { RegionDto region = FacadeProvider.getRegionFacade().getByUuid(regionId); dashboardDataProvider.setRegion(region.toReference()); } @@ -160,5 +166,4 @@ public void enter(ViewChangeEvent event) { dashboardDataProvider.setDisease(Disease.valueOf(event.getParameters())); refreshDiseaseData(); } - -} +} \ No newline at end of file diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java index 41e820f33a5..548beac64f0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java @@ -1,3 +1,17 @@ +/* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2022 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ package de.symeda.sormas.ui.dashboard.diseasedetails; import com.vaadin.shared.ui.MarginInfo; @@ -112,4 +126,4 @@ public HorizontalLayout viewMoreLayout(String title){ return viewMoreLayout; } -} +} \ No newline at end of file diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java deleted file mode 100644 index 7e69137efd1..00000000000 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseFilterLayout.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.symeda.sormas.ui.dashboard.diseasedetails; - - -import de.symeda.sormas.api.dashboard.DashboardCriteria; -import de.symeda.sormas.ui.dashboard.DashboardDataProvider; -import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; -import de.symeda.sormas.ui.utils.components.datetypeselector.DateTypeSelectorComponent; - -public class DiseaseFilterLayout extends DashboardFilterLayout { - public static final String DATE_TYPE_SELECTOR_FILTER = "dateTypeSelectorFilter"; - - private DateTypeSelectorComponent dateTypeSelectorComponent; - - private static final String CASE_CLASSIFICATION_FILTER ="caseClassificationFilter" ; - private static final String[] DISEASE_FILTERS = new String[]{ - DATE_TYPE_SELECTOR_FILTER, - REGION_FILTER, - DISTRICT_FILTER, - CASE_CLASSIFICATION_FILTER - }; - - public DiseaseFilterLayout(DiseaseDetailsView dashboardView, DashboardDataProvider dashboardDataProvider) { - super(dashboardView, dashboardDataProvider,DISEASE_FILTERS); - } - - - @Override - public void setCriteria(DashboardCriteria criteria) { - super.setCriteria(criteria); - dateTypeSelectorComponent.setValue(criteria.getNewCaseDateType()); - } - -} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java index e5f195d8c1d..51e58bf56c1 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java @@ -20,7 +20,6 @@ import java.util.Optional; import java.util.function.Consumer; -import de.symeda.sormas.ui.dashboard.DashboardType; import org.vaadin.hene.popupbutton.PopupButton; import com.vaadin.icons.VaadinIcons; @@ -50,6 +49,7 @@ import de.symeda.sormas.ui.map.MarkerIcon; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.dashboard.DashboardType; public abstract class BaseDashboardMapComponent, P extends AbstractDashboardDataProvider> extends VerticalLayout { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index 2271328c0df..a70c5e5bdde 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -17,15 +17,31 @@ *******************************************************************************/ package de.symeda.sormas.ui.dashboard.map; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; + import com.vaadin.icons.VaadinIcons; import com.vaadin.server.ExternalResource; -import com.vaadin.server.Sizeable; import com.vaadin.shared.ui.ContentMode; -import com.vaadin.ui.*; -import com.vaadin.ui.themes.ValoTheme; +import com.vaadin.ui.AbstractOrderedLayout; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Component; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Image; +import com.vaadin.ui.Label; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; import com.vaadin.v7.shared.ui.grid.HeightMode; import com.vaadin.v7.ui.CheckBox; import com.vaadin.v7.ui.OptionGroup; + import de.symeda.sormas.api.CaseMeasure; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.FacadeProvider; @@ -39,7 +55,6 @@ import de.symeda.sormas.api.dashboard.DashboardEventDto; import de.symeda.sormas.api.event.EventStatus; import de.symeda.sormas.api.geo.GeoLatLon; -import de.symeda.sormas.api.geo.GeoShapeProvider; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; @@ -49,31 +64,36 @@ import de.symeda.sormas.api.infrastructure.facility.FacilityDto; import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; -import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DataHelper.Pair; -import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UiUtil; -import de.symeda.sormas.ui.UserProvider; -import de.symeda.sormas.ui.dashboard.DashboardCssStyles; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.DashboardType; -import de.symeda.sormas.ui.map.*; -import de.symeda.sormas.ui.utils.ButtonHelper; +import de.symeda.sormas.ui.map.LeafletMapUtil; +import de.symeda.sormas.ui.map.LeafletMarker; +import de.symeda.sormas.ui.map.LeafletPolygon; +import de.symeda.sormas.ui.map.MarkerIcon; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.VaadinUiUtil; -import org.jetbrains.annotations.NotNull; +import java.util.stream.Collectors; +import javax.validation.constraints.NotNull; import org.vaadin.hene.popupbutton.PopupButton; - -import java.math.BigDecimal; -import java.math.RoundingMode; +import com.vaadin.ui.Button; +import com.vaadin.ui.ComboBox; +import com.vaadin.ui.CssLayout; +import com.vaadin.ui.themes.ValoTheme; +import de.symeda.sormas.api.geo.GeoShapeProvider; +import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.api.utils.DateHelper; +import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.dashboard.DashboardCssStyles; +import de.symeda.sormas.ui.map.LeafletMap; +import de.symeda.sormas.ui.utils.ButtonHelper; +import java.util.Collections; +import java.util.Optional; import java.text.SimpleDateFormat; -import java.util.*; -import java.util.function.Consumer; -import java.util.stream.Collectors; - import static java.util.Objects.nonNull; @SuppressWarnings("serial") @@ -96,8 +116,6 @@ public class DashboardMapComponent extends BaseDashboardMapComponent> casesByFacility = new HashMap<>(); private List mapCaseDtos = new ArrayList<>(); @@ -115,7 +133,6 @@ public class DashboardMapComponent extends BaseDashboardMapComponent onMarkerClicked(event.getGroupId(), event.getMarkerIndex())); { - GeoShapeProvider geoShapeProvider = FacadeProvider.getGeoShapeProvider(); final GeoLatLon mapCenter; @@ -1076,7 +1092,6 @@ else if (dashboardDataProvider.getDashboardType() == DashboardType.DISEASE) { mapHeaderLayout.setComponentAlignment(collapseMapButton, Alignment.MIDDLE_RIGHT); }); - return mapHeaderLayout; } @@ -1607,14 +1622,14 @@ private void showEventMarkers(List events) { for (DashboardEventDto event : events) { MarkerIcon icon; switch (event.getEventStatus()) { - case EVENT: - icon = MarkerIcon.EVENT_OUTBREAK; - break; - case SIGNAL: - icon = MarkerIcon.EVENT_RUMOR; - break; - default: - continue; + case EVENT: + icon = MarkerIcon.EVENT_OUTBREAK; + break; + case SIGNAL: + icon = MarkerIcon.EVENT_RUMOR; + break; + default: + continue; } // Because events are pulled from the dashboardDataProvider, we do not need to add additional filters for event dates here @@ -1726,7 +1741,6 @@ private void makeMapOverlayInvisible() { overlayBackground.setVisible(false); overlayLayout.setVisible(false); } - } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java index 5324ed8d4a4..2cbbeca3db5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java @@ -1,6 +1,22 @@ +/******************************************************************************* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *******************************************************************************/ package de.symeda.sormas.ui.dashboard.map; - import de.symeda.sormas.api.i18n.I18nProperties; public enum MapCasePeriodOption { @@ -12,4 +28,4 @@ public enum MapCasePeriodOption { public String toString() { return I18nProperties.getEnumCaption(this); } -} +} \ No newline at end of file diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java index 610f827a379..e4d01515d3d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java @@ -1,4 +1,3 @@ - /******************************************************************************* * SORMAS® - Surveillance Outbreak Response Management & Analysis System * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) @@ -30,5 +29,4 @@ public enum MapPeriodType { public String toString() { return I18nProperties.getEnumCaption(this); } - } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/sample/SampleDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/sample/SampleDashboardView.java index 7b01cc9956a..87298e1949a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/sample/SampleDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/sample/SampleDashboardView.java @@ -65,7 +65,7 @@ public class SampleDashboardView extends AbstractDashboardView { private final SampleDashboardMapComponent mapComponent; public SampleDashboardView() { - super(VIEW_NAME, DashboardType.SAMPLES); + super(VIEW_NAME); dashboardSwitcher.setValue(DashboardType.SAMPLES); dashboardSwitcher.addValueChangeListener(this::navigateToDashboardView); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java index 333233b701b..f0be95f2988 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceDashboardView.java @@ -36,7 +36,7 @@ public class SurveillanceDashboardView extends AbstractDashboardView { protected SurveillanceDiseaseCarouselLayout diseaseCarouselLayout; public SurveillanceDashboardView() { - super(VIEW_NAME, DashboardType.SURVEILLANCE); + super(VIEW_NAME); dashboardDataProvider = new DashboardDataProvider(); if (dashboardDataProvider.getDashboardType() == null) { @@ -49,8 +49,6 @@ public SurveillanceDashboardView() { filterLayout.addDateTypeValueChangeListener(e -> { dashboardDataProvider.setNewCaseDateType((NewCaseDateType) e.getProperty().getValue()); }); - - dashboardLayout.addComponent(filterLayout); dashboardSwitcher.setValue(DashboardType.SURVEILLANCE); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceOverviewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceOverviewLayout.java index cfa59b2e5bb..e1d4e300e85 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceOverviewLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/SurveillanceOverviewLayout.java @@ -70,7 +70,6 @@ public SurveillanceOverviewLayout(DashboardDataProvider dashboardDataProvider) { private void addDiseaseBurdenView() { diseaseOverviewComponent = new DiseaseOverviewComponent(dashboardDataProvider); - addComponent(diseaseOverviewComponent, BURDEN_LOC); if (UiUtil.hasRegionJurisdictionLevel()) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java index 4fe0ac79973..9ad85c8c107 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java @@ -3,14 +3,13 @@ import com.vaadin.v7.data.Property; import de.symeda.sormas.api.caze.NewCaseDateType; -import de.symeda.sormas.api.dashboard.DashboardCriteria; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; import de.symeda.sormas.ui.dashboard.surveillance.SurveillanceDashboardView; import de.symeda.sormas.ui.utils.components.datetypeselector.DateTypeSelectorComponent; - +import de.symeda.sormas.api.dashboard.DashboardCriteria; public class SurveillanceFilterLayout extends DashboardFilterLayout { @@ -18,8 +17,8 @@ public class SurveillanceFilterLayout extends DashboardFilterLayout(NewCaseDateType.class).dateTypePrompt(I18nProperties.getString(Strings.promptNewCaseDateType)) - .build(); + new DateTypeSelectorComponent.Builder<>(NewCaseDateType.class).dateTypePrompt(I18nProperties.getString(Strings.promptNewCaseDateType)) + .build(); dateTypeSelectorComponent.setValue(dashboardDataProvider.getNewCaseDateType()); addCustomComponent(dateTypeSelectorComponent, DATE_TYPE_SELECTOR_FILTER); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/DiseaseOverviewComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/DiseaseOverviewComponent.java index 0639bc02744..12faafe6ac5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/DiseaseOverviewComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/DiseaseOverviewComponent.java @@ -11,11 +11,11 @@ import com.vaadin.ui.HorizontalLayout; import de.symeda.sormas.api.disease.DiseaseBurdenDto; -import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.dashboard.surveillance.components.disease.burden.DiseaseBurdenComponent; import de.symeda.sormas.ui.dashboard.surveillance.components.disease.tile.DiseaseTileViewLayout; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; +import de.symeda.sormas.ui.dashboard.DashboardDataProvider; public class DiseaseOverviewComponent extends HorizontalLayout { @@ -23,6 +23,7 @@ public class DiseaseOverviewComponent extends HorizontalLayout { private final DiseaseBurdenComponent diseaseBurdenComponent; private final DiseaseTileViewLayout diseaseTileViewLayout; + private final Button showTableViewButton; public DiseaseOverviewComponent(DashboardDataProvider dashboardDataProvider) { @@ -36,9 +37,9 @@ public DiseaseOverviewComponent(DashboardDataProvider dashboardDataProvider) { // "Expand" and "Collapse" buttons showTableViewButton = - ButtonHelper.createIconButtonWithCaption("showTableView", "", VaadinIcons.TABLE, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); + ButtonHelper.createIconButtonWithCaption("showTableView", "", VaadinIcons.TABLE, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); Button showTileViewButton = ButtonHelper - .createIconButtonWithCaption("showTileView", "", VaadinIcons.SQUARE_SHADOW, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); + .createIconButtonWithCaption("showTileView", "", VaadinIcons.SQUARE_SHADOW, null, CssStyles.BUTTON_SUBTLE, CssStyles.VSPACE_NONE); showTableViewButton.addClickListener(e -> { removeComponent(diseaseTileViewLayout); @@ -66,7 +67,7 @@ public DiseaseOverviewComponent(DashboardDataProvider dashboardDataProvider) { public void refresh(List diseasesBurden, boolean isShowingAllDiseases) { // sort, limit and filter Stream diseasesBurdenStream = - diseasesBurden.stream().sorted((dto1, dto2) -> (int) (dto2.getCaseCount() - dto1.getCaseCount())); + diseasesBurden.stream().sorted((dto1, dto2) -> (int) (dto2.getCaseCount() - dto1.getCaseCount())); if (!isShowingAllDiseases) { diseasesBurdenStream = diseasesBurdenStream.limit(NUMBER_OF_DISEASES_COLLAPSED); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/burden/DiseaseBurdenComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/burden/DiseaseBurdenComponent.java index 6a230f6b73d..dec42b7bafa 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/burden/DiseaseBurdenComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/burden/DiseaseBurdenComponent.java @@ -44,6 +44,7 @@ public DiseaseBurdenComponent() { grid = new DiseaseBurdenGrid(); grid.setHeightMode(HeightMode.ROW); grid.setWidth(100, Unit.PERCENTAGE); + // layout setWidth(100, Unit.PERCENTAGE); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java index 6e31e97edd1..0398e2b6495 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java @@ -19,29 +19,34 @@ import com.vaadin.icons.VaadinIcons; import com.vaadin.shared.ui.ContentMode; -import com.vaadin.ui.*; -import com.vaadin.ui.themes.ValoTheme; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.VerticalLayout; + import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; +import de.symeda.sormas.ui.utils.CssStyles; +import javax.validation.constraints.NotNull; +import com.vaadin.ui.Button; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.utils.ButtonHelper; -import de.symeda.sormas.ui.utils.CssStyles; -import org.jetbrains.annotations.NotNull; +import com.vaadin.ui.themes.ValoTheme; public class DiseaseTileComponent extends VerticalLayout { private static final long serialVersionUID = 6582975657305031105L; - public DiseaseTileComponent(DiseaseBurdenDto diseaseBurden,DashboardDataProvider dashboardDataProvider) { + public DiseaseTileComponent(DiseaseBurdenDto diseaseBurden, DashboardDataProvider dashboardDataProvider) { setMargin(false); setSpacing(false); addTopLayout(diseaseBurden.getDisease(), diseaseBurden.getCaseCount(), diseaseBurden.getPreviousCaseCount(), - diseaseBurden.getOutbreakDistrictCount() > 0); + diseaseBurden.getOutbreakDistrictCount() > 0); addStatsLayout(diseaseBurden, dashboardDataProvider); } @@ -67,8 +72,8 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo nameLayout.setHeight(100, Unit.PERCENTAGE); Label nameLabel = new Label(disease.toShortString()); nameLabel.addStyleNames(CssStyles.LABEL_WHITE, - nameLabel.getValue().length() > 12 ? CssStyles.LABEL_LARGE : CssStyles.LABEL_XLARGE, - CssStyles.LABEL_BOLD, CssStyles.ALIGN_CENTER, CssStyles.LABEL_UPPERCASE); + nameLabel.getValue().length() > 12 ? CssStyles.LABEL_LARGE : CssStyles.LABEL_XLARGE, + CssStyles.LABEL_BOLD, CssStyles.ALIGN_CENTER, CssStyles.LABEL_UPPERCASE); nameLayout.addComponent(nameLabel); nameLayout.setComponentAlignment(nameLabel, Alignment.MIDDLE_CENTER); nameAndOutbreakLayout.addComponent(nameLayout); @@ -109,7 +114,6 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo comparisonLayout.setMargin(false); comparisonLayout.setSpacing(false); - Label growthLabel = getLabel(casesCount, previousCasesCount); comparisonLayout.addComponent(growthLabel); @@ -153,8 +157,7 @@ private static Label getLabel(Long casesCount, Long previousCasesCount) { } private void addStatsLayout(DiseaseBurdenDto diseaseBurden,DashboardDataProvider dashboardDataProvider) { - - Long fatalities = diseaseBurden.getCaseDeathCount(); + Long fatalities = diseaseBurden.getCaseDeathCount(); Long events = diseaseBurden.getEventCount(); String district = diseaseBurden.getLastReportedDistrictName(); Disease disease = diseaseBurden.getDisease(); @@ -166,22 +169,19 @@ private void addStatsLayout(DiseaseBurdenDto diseaseBurden,DashboardDataProvider layout.addStyleName(CssStyles.BACKGROUND_HIGHLIGHT); StatsItem lastReportItem = new StatsItem.Builder(Captions.dashboardLastReport, - district.isEmpty() ? I18nProperties.getString(Strings.none) : district).singleColumn(true).build(); + district.isEmpty() ? I18nProperties.getString(Strings.none) : district).singleColumn(true).build(); lastReportItem.addStyleName(CssStyles.VSPACE_TOP_4); layout.addComponent(lastReportItem); StatsItem fatality = new StatsItem.Builder(Captions.dashboardFatalities, fatalities).critical(fatalities > 0).build(); fatality.addStyleName(CssStyles.HSPACE_LEFT_5); layout.addComponent(fatality); - StatsItem noOfEventsItem = new StatsItem.Builder(Captions.DiseaseBurden_eventCount, events).build(); noOfEventsItem.addStyleName(CssStyles.VSPACE_4); layout.addComponent(noOfEventsItem); Button component = addDiseaseButton(disease, dashboardDataProvider); - layout.addComponent(component); - addComponent(layout); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java index a684a5e534d..f380a457248 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java @@ -25,7 +25,6 @@ import de.symeda.sormas.api.disease.DiseaseBurdenDto; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; - public class DiseaseTileViewLayout extends CssLayout { private final DashboardDataProvider dashboardDataProvider; @@ -45,7 +44,6 @@ public void refresh(List diseasesBurden) { this.removeAllComponents(); for (DiseaseBurdenDto diseaseBurden : diseasesBurden) { - DiseaseTileComponent tile = new DiseaseTileComponent(diseaseBurden,this.dashboardDataProvider); tile.setWidth(230, Unit.PIXELS); addComponent(tile); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java index 2526bdfe125..a3021b23e80 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -45,7 +45,7 @@ public class RegionalDiseaseBurdenGrid extends Grid { public RegionalDiseaseBurdenGrid(DashboardDataProvider dashboardDataProvider) { this.dashboardDataProvider = dashboardDataProvider; - regionDtoList = FacadeProvider.getRegionFacade().getAllRegion(); + regionDtoList = FacadeProvider.getRegionFacade().getAllActiveRegions(); setCaption(I18nProperties.getCaption(Captions.dashboardRegionalDiseaseBurden)); @@ -153,7 +153,7 @@ public void reload() { for (DistrictReferenceDto districtDto : districtDtoList){ - DiseaseBurdenDto diseaseBurdenDto = FacadeProvider.getDiseaseFacade().getDiseaseGridForDashboard( + DiseaseBurdenDto diseaseBurdenDto = FacadeProvider.getDashboardFacade().getDiseaseGridForDashboard( null, districtDto, dashboardDataProvider.getDisease(), @@ -182,12 +182,32 @@ public void reload() { diseaseBurdenDto.setRegion(regionDto); - diseaseBurdenDtoConfig(diseaseBurdenDtoList, casePercental, diseaseBurdenDto, total, activeCases, recovered, deaths, other); + diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(total), casePercental, "#5a95f4bf","#2f7df9")); + + diseaseBurdenDto.setTotalCount(makeDIvsCount(total)); + + diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(activeCases), casePercental, "#feba0199", "#dfa507")); + + diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases)); + + diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(recovered), casePercental, "#00e0a19c", "#038d66")); + + diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered)); + + diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(deaths), casePercental,"#FFAEAE", "#FF4040")); + + diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths)); + + diseaseBurdenDto.setOther(makeDIvs(Long.parseLong(other), casePercental,"#bf8678ba", "#91675d")); + + diseaseBurdenDto.setOtherCount(makeDIvsCount(other)); + + diseaseBurdenDtoList.add(diseaseBurdenDto); } }else { for (RegionDto regionDto : regionDtoList){ - DiseaseBurdenDto diseaseBurdenDto = FacadeProvider.getDiseaseFacade().getDiseaseGridForDashboard( + DiseaseBurdenDto diseaseBurdenDto = FacadeProvider.getDashboardFacade().getDiseaseGridForDashboard( regionDto.toReference(), null, dashboardDataProvider.getDisease(), @@ -209,37 +229,33 @@ public void reload() { String other = diseaseBurdenDto.getOther(); - diseaseBurdenDtoConfig(diseaseBurdenDtoList, casePercental, diseaseBurdenDto, total, activeCases, recovered, deaths, other); - } - } - - BeanItemContainer container = new BeanItemContainer<>(DiseaseBurdenDto.class, diseaseBurdenDtoList); - GeneratedPropertyContainer generatedContainer = new GeneratedPropertyContainer(container); - setContainerDataSource(generatedContainer); - } + diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(total), casePercental, "#5a95f4bf","#2f7df9")); - private void diseaseBurdenDtoConfig(List diseaseBurdenDtoList, Long casePercental, DiseaseBurdenDto diseaseBurdenDto, String total, String activeCases, String recovered, String deaths, String other) { - diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(total), casePercental, "#5a95f4bf","#2f7df9")); + diseaseBurdenDto.setTotalCount(makeDIvsCount(total)); - diseaseBurdenDto.setTotalCount(makeDIvsCount(total)); + diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(activeCases), casePercental, "#feba0199", "#dfa507")); - diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(activeCases), casePercental, "#feba0199", "#dfa507")); + diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases)); - diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases)); + diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(recovered), casePercental, "#00e0a19c", "#038d66")); - diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(recovered), casePercental, "#00e0a19c", "#038d66")); + diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered)); - diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered)); + diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(deaths), casePercental,"#FFAEAE", "#FF4040")); - diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(deaths), casePercental,"#FFAEAE", "#FF4040")); + diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths)); - diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths)); + diseaseBurdenDto.setOther(makeDIvs(Long.parseLong(other), casePercental,"#bf8678ba", "#91675d")); - diseaseBurdenDto.setOther(makeDIvs(Long.parseLong(other), casePercental,"#bf8678ba", "#91675d")); + diseaseBurdenDto.setOtherCount(makeDIvsCount(other)); - diseaseBurdenDto.setOtherCount(makeDIvsCount(other)); + diseaseBurdenDtoList.add(diseaseBurdenDto); + } + } - diseaseBurdenDtoList.add(diseaseBurdenDto); + BeanItemContainer container = new BeanItemContainer<>(DiseaseBurdenDto.class, diseaseBurdenDtoList); + GeneratedPropertyContainer generatedContainer = new GeneratedPropertyContainer(container); + setContainerDataSource(generatedContainer); } public String makeDIvs(long number, long total, String lightColor, String deepColor) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/SurveillanceEpiCurveBuilder.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/SurveillanceEpiCurveBuilder.java index 12e427d46a8..aa454599341 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/SurveillanceEpiCurveBuilder.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/epicurve/builders/SurveillanceEpiCurveBuilder.java @@ -2,6 +2,7 @@ import java.util.Date; import java.util.List; + import de.symeda.sormas.api.dashboard.DashboardCriteria; import de.symeda.sormas.api.dashboard.EpiCurveGrouping; import de.symeda.sormas.api.i18n.Captions; @@ -12,7 +13,6 @@ public abstract class SurveillanceEpiCurveBuilder extends AbstractEpiCurveBuilder { - public SurveillanceEpiCurveBuilder(EpiCurveGrouping epiCurveGrouping) { super(Captions.dashboardNumberOfCases, epiCurveGrouping); } 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 7fa20ec8a16..4776974fd30 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 @@ -68,7 +68,6 @@ private CssStyles() { public static final String HSPACE_LEFT_5 = "hspace-left-5"; public static final String HSPACE_LEFT_6 = "hspace-left-6"; public static final String HSPACE_LEFT_7 = "hspace-left-7"; - public static final String HSPACE_LEFT_NONE = "hspace-left-none"; public static final String HSPACE_RIGHT_0 = "hspace-right-0"; diff --git a/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java b/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java index 3a2fa5d411a..6e2c67e80b7 100644 --- a/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java +++ b/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java @@ -11,16 +11,14 @@ import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.outbreak.OutbreakCriteria; import de.symeda.sormas.api.utils.criteria.CriteriaDateType; -import de.symeda.sormas.backend.caze.CaseFacadeEjb.CaseFacadeEjbLocal; +import de.symeda.sormas.backend.dashboard.DashboardFacadeEjb; import de.symeda.sormas.backend.dashboard.DashboardService; import de.symeda.sormas.backend.disease.DiseaseConfigurationFacadeEjb; -import de.symeda.sormas.backend.disease.DiseaseFacadeEjb; import de.symeda.sormas.backend.event.EventFacadeEjb.EventFacadeEjbLocal; import de.symeda.sormas.backend.feature.FeatureConfigurationFacadeEjb; import de.symeda.sormas.backend.infrastructure.district.District; import de.symeda.sormas.backend.infrastructure.region.RegionFacadeEjb.RegionFacadeEjbLocal; import de.symeda.sormas.backend.outbreak.OutbreakFacadeEjb.OutbreakFacadeEjbLocal; -import de.symeda.sormas.backend.person.PersonFacadeEjb.PersonFacadeEjbLocal; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -57,7 +55,7 @@ public class DiseaseDashboardServiceTest { private FeatureConfigurationFacadeEjb.FeatureConfigurationFacadeEjbLocal featureConfigurationFacade; @InjectMocks - private DiseaseFacadeEjb diseaseFacade; + private DashboardFacadeEjb dashboardfacadeEjb; @BeforeEach public void setUp() { @@ -102,7 +100,7 @@ public void testGetDiseaseForDashboard() { when(dashboardService.getCaseCountByDisease(any(DashboardCriteria.class))).thenReturn(previousCases); // Invoke the method under test - DiseaseBurdenDto result = diseaseFacade.getDiseaseForDashboard( + DiseaseBurdenDto result = dashboardfacadeEjb.getDiseaseForDashboard( region, district, disease, fromDate, toDate, previousFrom, previousTo, newCaseDateType, caseClassification); // Assert expected results @@ -112,8 +110,8 @@ public void testGetDiseaseForDashboard() { assertNull(result.getOutbreakDistrict()); assertEquals(1L, result.getCaseDeathCount()); assertEquals(Disease.CORONAVIRUS, result.getDisease()); - } + @Test public void testGetDiseaseGridForDashboard() { RegionReferenceDto region = new RegionReferenceDto(); @@ -138,10 +136,10 @@ public void testGetDiseaseGridForDashboard() { when(dashboardService.getDeathCountByDisease(any(DashboardCriteria.class))) .thenReturn(caseFatalities); - DiseaseBurdenDto result = diseaseFacade.getDiseaseGridForDashboard( + DiseaseBurdenDto result = dashboardfacadeEjb.getDiseaseGridForDashboard( region, district, disease, fromDate, toDate, previousFrom, previousTo, newCaseDateType, caseClassification); assertEquals("15", result.getTotal()); assertEquals("2", result.getDeaths()); } -} +} \ No newline at end of file From 0081db4c43be89c7413783884355bb189b6c1db2 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Mon, 16 Sep 2024 11:13:37 +0000 Subject: [PATCH 49/71] clean up after review --- .../api/dashboard/BaseDashboardCriteria.java | 1 - .../sormas/backend/user/UserFacadeEjb.java | 5 ++++- .../src/main/resources/sql/sormas_schema.sql | 18 +++++++++--------- .../sormas/backend/AbstractBeanTest.java | 1 - .../ui/dashboard/AbstractDashboardView.java | 4 ++-- .../ui/dashboard/DashboardController.java | 1 + .../contacts/ContactsDashboardView.java | 10 +++++----- .../map/BaseDashboardMapComponent.java | 4 ++-- .../disease/DiseaseOverviewComponent.java | 1 + .../disease/burden/DiseaseBurdenComponent.java | 4 +++- .../EnvironmentSampleEditForm.java | 10 +++------- .../symeda/sormas/ui/user/UserController.java | 6 ------ .../de/symeda/sormas/ui/utils/CssStyles.java | 1 - 13 files changed, 30 insertions(+), 36 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/BaseDashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/BaseDashboardCriteria.java index 2c750cad526..cf51e2d6bf3 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/BaseDashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/BaseDashboardCriteria.java @@ -22,7 +22,6 @@ import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.utils.criteria.BaseCriteria; -import de.symeda.sormas.api.utils.criteria.CriteriaDateType; import de.symeda.sormas.api.caze.NewCaseDateType; public class BaseDashboardCriteria> extends BaseCriteria { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java index 7d0e73f0b43..76888b5035f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java @@ -1096,7 +1096,10 @@ public void syncUsersFromAuthenticationProvider() { UserRight._SYSTEM }) public boolean isSyncEnabled() { AuthProvider authProvider = AuthProvider.getProvider(configFacade); - return KEYCLOAK.equalsIgnoreCase(authProvider.getName()); + return KEYCLOAK.equalsIgnoreCase(authProvider.getName()) + && (featureConfigurationFacade.isFeatureDisabled(FeatureType.AUTH_PROVIDER_TO_SORMAS_USER_SYNC) + || StringUtils.isNotBlank(configFacade.getAuthenticationProviderSyncedNewUserRole())); + } @Override diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index 0f680c86c01..a2accce5dff 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -1769,7 +1769,7 @@ ALTER TABLE samples_history ADD COLUMN reportLatLonAccuracy real; INSERT INTO schema_version (version_number, comment) VALUES (71, 'Add accuracy to lat lon data #371'); --- 2017-10-24 Mpox disease fields #366 +-- 2017-10-24 Monkeypox disease fields #366 ALTER TABLE symptoms ADD COLUMN cutaneouseruption varchar(255); ALTER TABLE symptoms ADD COLUMN lesions varchar(255); ALTER TABLE symptoms ADD COLUMN lesionssamestate varchar(255); @@ -1800,9 +1800,9 @@ ALTER TABLE epidata ADD COLUMN dateoflastexposure timestamp; ALTER TABLE epidata ADD COLUMN placeoflastexposure varchar(512); ALTER TABLE epidata ADD COLUMN animalcondition varchar(255); -INSERT INTO schema_version (version_number, comment) VALUES (72, 'Mpox disease fields #366'); +INSERT INTO schema_version (version_number, comment) VALUES (72, 'Monkeypox disease fields #366'); --- 2017-10-27 Mpox disease fields for history table #366 +-- 2017-10-27 Monkeypox disease fields for history table #366 ALTER TABLE symptoms_history ADD COLUMN cutaneouseruption varchar(255); ALTER TABLE symptoms_history ADD COLUMN lesions varchar(255); ALTER TABLE symptoms_history ADD COLUMN lesionssamestate varchar(255); @@ -1833,7 +1833,7 @@ ALTER TABLE epidata_history ADD COLUMN dateoflastexposure timestamp; ALTER TABLE epidata_history ADD COLUMN placeoflastexposure varchar(512); ALTER TABLE epidata_history ADD COLUMN animalcondition varchar(255); -INSERT INTO schema_version (version_number, comment) VALUES (73, 'Mpox disease fields for history table #366'); +INSERT INTO schema_version (version_number, comment) VALUES (73, 'Monkeypox disease fields for history table #366'); -- 2017-11-01 Plague disease fields #373 ALTER TABLE symptoms ADD COLUMN painfullymphadenitis varchar(255); @@ -1852,14 +1852,14 @@ ALTER TABLE sampletest_history ADD COLUMN fourfoldincreaseantibodytiter boolean; INSERT INTO schema_version (version_number, comment) VALUES (74, 'Plague disease fields #373'); --- 2017-11-02 Additional Mpox fields #375 +-- 2017-11-02 Additional Monkeypox fields #375 ALTER TABLE cases ADD COLUMN smallpoxvaccinationreceived varchar(255); ALTER TABLE cases ADD COLUMN smallpoxvaccinationdate timestamp; ALTER TABLE cases_history ADD COLUMN smallpoxvaccinationreceived varchar(255); ALTER TABLE cases_history ADD COLUMN smallpoxvaccinationdate timestamp; -INSERT INTO schema_version (version_number, comment) VALUES (75, 'Additional Mpox fields #375'); +INSERT INTO schema_version (version_number, comment) VALUES (75, 'Additional Monkeypox fields #375'); -- 2017-11-22 Population for districts #342 ALTER TABLE district ADD COLUMN population integer; @@ -1998,14 +1998,14 @@ ALTER TABLE cases RENAME COLUMN smallpoxvaccinationdate TO vaccinationdate; INSERT INTO schema_version (version_number, comment) VALUES (89, 'Date of vaccination for all diseases #486'); --- 2018-02-09 Mpox field changes #401 +-- 2018-02-09 Monkeypox field changes #401 ALTER TABLE symptoms DROP COLUMN cutaneouseruption; ALTER TABLE symptoms ADD COLUMN lesionsonsetdate timestamp; ALTER TABLE symptoms_history DROP COLUMN cutaneouseruption; ALTER TABLE symptoms_history ADD COLUMN lesionsonsetdate timestamp; -INSERT INTO schema_version (version_number, comment) VALUES (90, 'Mpox field changes #401'); +INSERT INTO schema_version (version_number, comment) VALUES (90, 'Monkeypox field changes #401'); -- 2018-02-09 History table updates @@ -8783,7 +8783,7 @@ DROP FUNCTION IF EXISTS create_vaccination(bigint, bigint, timestamp, bigint, ti /* Step 4: Clean up cases, contacts and event participants */ ALTER TABLE cases RENAME COLUMN vaccination TO vaccinationstatus; ALTER TABLE cases_history RENAME COLUMN vaccination TO vaccinationstatus; --- last vaccination date has been moved to the vaccination entity, but still has to be used for Mpox +-- last vaccination date has been moved to the vaccination entity, but still has to be used for Monkeypox ALTER TABLE cases RENAME COLUMN lastvaccinationdate TO smallpoxlastvaccinationdate; ALTER TABLE cases_history RENAME COLUMN lastvaccinationdate TO smallpoxlastvaccinationdate; UPDATE cases SET smallpoxlastvaccinationdate = null WHERE disease != 'MONKEYPOX'; diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java index ef26b723ae4..d364db05bc5 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java @@ -1091,5 +1091,4 @@ public SelfReportFacadeEjbLocal getSelfReportFacade() { public SelfReportService getSelfReportService() { return getBean(SelfReportService.class); } - } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java index c9a627eb7d5..9e1065a6db3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java @@ -108,7 +108,7 @@ else if (DashboardType.CONTACTS.equals(e.getProperty().getValue())) { } else if (DashboardType.DISEASE.equals(e.getProperty().getValue())) { SormasUI.get().getNavigator().navigateTo(DiseaseDetailsView.VIEW_NAME); - } + } else if (DashboardType.CAMPAIGNS.equals(e.getProperty().getValue())) { SormasUI.get().getNavigator().navigateTo(CampaignDashboardView.VIEW_NAME); } @@ -124,7 +124,7 @@ public void refreshDiseaseData() { @Override public void enter(ViewChangeEvent event) { - refreshDashboard(); + refreshDashboard(); } public void setDiseases(Disease disease) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java index ce68c0ae6fc..4b305d23868 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java @@ -44,6 +44,7 @@ public class DashboardController { public DashboardController() { + } public void registerViews(Navigator navigator) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java index 102e3d3a18e..f9589142a17 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java @@ -52,7 +52,7 @@ public class ContactsDashboardView extends AbstractDashboardView { private static final int ROW_HEIGHT = 555; - protected ContactsFilterLayout contactsFilterLayout; + protected ContactsFilterLayout filterLayout; protected AbstractDashboardStatisticsComponent statisticsComponent; protected ContactsEpiCurveComponent epiCurveComponent; @@ -90,8 +90,8 @@ public ContactsDashboardView() { dashboardDataProvider.setDisease(FacadeProvider.getDiseaseConfigurationFacade().getDefaultDisease()); } - contactsFilterLayout = new ContactsFilterLayout(this, dashboardDataProvider); - dashboardLayout.addComponent(contactsFilterLayout); + filterLayout = new ContactsFilterLayout(this, dashboardDataProvider); + dashboardLayout.addComponent(filterLayout); dashboardSwitcher.setValue(DashboardType.CONTACTS); dashboardSwitcher.addValueChangeListener(e -> { @@ -327,8 +327,8 @@ protected HorizontalLayout createNetworkDiagramRowLayout() { noNetworkDiagramLayout.setVisible(false); networkDiagramLayout.ifPresent(l -> { - l.setVisible(contactsFilterLayout.hasDiseaseSelected()); - noNetworkDiagramLayout.setVisible(!contactsFilterLayout.hasDiseaseSelected()); + l.setVisible(filterLayout.hasDiseaseSelected()); + noNetworkDiagramLayout.setVisible(!filterLayout.hasDiseaseSelected()); }); return layout; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java index 51e58bf56c1..30d09125fa1 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/BaseDashboardMapComponent.java @@ -58,8 +58,8 @@ public abstract class BaseDashboardMapComponent diseasesBurden) { grid.reload(diseasesBurden); - grid.setHeightByRows(diseasesBurden.size()); + if (diseasesBurden != null && diseasesBurden.size() > 0) { + grid.setHeightByRows(diseasesBurden.size()); + } } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleEditForm.java index 530e5d69aea..884df0d1fca 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleEditForm.java @@ -369,14 +369,10 @@ private void addValidators() { } private Date getEarliestPathogenTestDate() { - if (!isCreate) { - List pathogenTests = FacadeProvider.getPathogenTestFacade().getAllByEnvironmentSample(getValue().toReference()); - if (pathogenTests.isEmpty()) { - return null; - } - return pathogenTests.stream().map(PathogenTestDto::getTestDateTime).filter(Objects::nonNull).min(Date::compareTo).orElseGet(() -> null); - } else { + List pathogenTests = FacadeProvider.getPathogenTestFacade().getAllByEnvironmentSample(getValue().toReference()); + if (pathogenTests.isEmpty()) { return null; } + return pathogenTests.stream().map(PathogenTestDto::getTestDateTime).filter(Objects::nonNull).min(Date::compareTo).orElseGet(() -> null); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java index 16c4f86b022..115313f799b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java @@ -347,12 +347,6 @@ public void setFlagIcons(ComboBox cbLanguage) { public void sync() { if (UiUtil.permitted(FeatureType.AUTH_PROVIDER_TO_SORMAS_USER_SYNC)) { - if (StringUtils.isBlank(FacadeProvider.getConfigFacade().getAuthenticationProviderSyncedNewUserRole())) { - VaadinUiUtil.showSimplePopupWindow( - I18nProperties.getString(Strings.headingSyncUsers), - I18nProperties.getString(Strings.messageSyncUsersFromAuthProviderConfigurationError)); - return; - } FacadeProvider.getUserFacade().syncUsersFromAuthenticationProvider(); SormasUI.refreshView(); } else { 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 4776974fd30..130e7bfad5f 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 @@ -67,7 +67,6 @@ private CssStyles() { public static final String HSPACE_LEFT_4 = "hspace-left-4"; public static final String HSPACE_LEFT_5 = "hspace-left-5"; public static final String HSPACE_LEFT_6 = "hspace-left-6"; - public static final String HSPACE_LEFT_7 = "hspace-left-7"; public static final String HSPACE_LEFT_NONE = "hspace-left-none"; public static final String HSPACE_RIGHT_0 = "hspace-right-0"; From 2f19f257a61c3726a499fb884e32a27dc66744d8 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Mon, 16 Sep 2024 15:37:08 +0000 Subject: [PATCH 50/71] clean up after review --- .../sormas/api/disease/DiseaseBurdenDto.java | 1 - .../de/symeda/sormas/api/i18n/Strings.java | 11 +++++ .../de/symeda/sormas/api/user/UserFacade.java | 47 +++++++------------ .../de/symeda/sormas/api/user/UserRight.java | 1 - .../backend/caze/CaseUserFilterCriteria.java | 2 - 5 files changed, 28 insertions(+), 34 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java index 542a89dce53..da452821ef3 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java @@ -466,5 +466,4 @@ public String toString() { + ", deaths=" + deaths + ", region=" + region + ", recovered=" + recovered + ", activeCases=" + activeCases + ", to=" + to + ", from=" + from + "]"; } - } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index ed87fae2ee3..b5ccbe197c2 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -190,6 +190,8 @@ public interface Strings { String confirmationVaccinationStatusUpdate = "confirmationVaccinationStatusUpdate"; String confirmExternalMessageCorrectionThrough = "confirmExternalMessageCorrectionThrough"; String confirmNetworkDiagramTooManyContacts = "confirmNetworkDiagramTooManyContacts"; + String confirmPassword = "confirmPassword"; + String currentPassword = "currentPassword"; String date = "date"; String day = "day"; String DefaultPassword_newPassword = "DefaultPassword.newPassword"; @@ -460,6 +462,7 @@ public interface Strings { String headingcasesWithReferenceDefinitionFulfilled = "headingcasesWithReferenceDefinitionFulfilled"; String headingCaution = "headingCaution"; String headingChangeCaseDisease = "headingChangeCaseDisease"; + String headingChangePassword = "headingChangePassword"; String headingChangePathogenTestResult = "headingChangePathogenTestResult"; String headingClinicalMeasurements = "headingClinicalMeasurements"; String headingClinicalVisitsDeleted = "headingClinicalVisitsDeleted"; @@ -843,6 +846,7 @@ public interface Strings { String headingUpdatedPersonInformation = "headingUpdatedPersonInformation"; String headingUpdatedSampleInformation = "headingUpdatedSampleInformation"; String headingUpdatePassword = "headingUpdatePassword"; + String headingUpdatePasswordFailed = "headingUpdatePasswordFailed"; String headingUpdatePersonContactDetails = "headingUpdatePersonContactDetails"; String headingUploadSuccess = "headingUploadSuccess"; String headingUserData = "headingUserData"; @@ -1390,6 +1394,8 @@ public interface Strings { String messageMissingDateFilter = "messageMissingDateFilter"; String messageMissingEpiWeekFilter = "messageMissingEpiWeekFilter"; String messageMultipleSampleReports = "messageMultipleSampleReports"; + String messageNewPasswordDoesNotMatchFailed = "messageNewPasswordDoesNotMatchFailed"; + String messageNewPasswordFailed = "messageNewPasswordFailed"; String messageNoCaseFound = "messageNoCaseFound"; String messageNoCaseFoundToLinkImmunization = "messageNoCaseFoundToLinkImmunization"; String messageNoCasesSelected = "messageNoCasesSelected"; @@ -1427,6 +1433,8 @@ public interface Strings { String messageNoVisitsSelected = "messageNoVisitsSelected"; String messageOtherDeleteReasonNotFilled = "messageOtherDeleteReasonNotFilled"; String messageOutbreakSaved = "messageOutbreakSaved"; + String messagePasswordChange = "messagePasswordChange"; + String messagePasswordFailed = "messagePasswordFailed"; String messagePasswordReset = "messagePasswordReset"; String messagePasswordResetEmailLink = "messagePasswordResetEmailLink"; String messagePathogenTestSaved = "messagePathogenTestSaved"; @@ -1538,6 +1546,7 @@ public interface Strings { String messageVisitsDeleted = "messageVisitsDeleted"; String messageVisitsWithWrongStatusNotCancelled = "messageVisitsWithWrongStatusNotCancelled"; String messageVisitsWithWrongStatusNotSetToLost = "messageVisitsWithWrongStatusNotSetToLost"; + String messageWrongCurrentPassword = "messageWrongCurrentPassword"; String messageWrongFileType = "messageWrongFileType"; String messageWrongTemplateFileType = "messageWrongTemplateFileType"; String min = "min"; @@ -1603,6 +1612,7 @@ public interface Strings { String of = "of"; String on = "on"; String or = "or"; + String passwordStrength = "passwordStrength"; String pathogenTestDeletedDuringLabMessageConversion = "pathogenTestDeletedDuringLabMessageConversion"; String pleaseSpecify = "pleaseSpecify"; String populationDataByArea = "populationDataByArea"; @@ -1754,6 +1764,7 @@ public interface Strings { String unsavedChanges_warningMessage = "unsavedChanges.warningMessage"; String unsavedChanges_warningTitle = "unsavedChanges.warningTitle"; String until = "until"; + String updatePassword = "updatePassword"; String uuidOf = "uuidOf"; String warningDashboardMapTooManyMarkers = "warningDashboardMapTooManyMarkers"; String warningNetworkDiagramTooManyContacts = "warningNetworkDiagramTooManyContacts"; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java index 8dd66e15369..4e525468592 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java @@ -57,15 +57,11 @@ public interface UserFacade { UserDto getByUserName(String userName); /** - * - * @param regionRef - * reference of the region to be filtered for. When this region is null, it is not filtered in this regard. - * NOTE: some users don't have a region (often users with NATIONAL_USER role, for example). They will - * not be included when a region is specified, but otherwise they will. - * @param limitedDisease - * can be used to remove users from the return value that are limited to diseases other that limitedDisease. - * @param userRights - * user rights to be filtered for. + * @param regionRef reference of the region to be filtered for. When this region is null, it is not filtered in this regard. + * NOTE: some users don't have a region (often users with NATIONAL_USER role, for example). They will + * not be included when a region is specified, but otherwise they will. + * @param limitedDisease can be used to remove users from the return value that are limited to diseases other that limitedDisease. + * @param userRights user rights to be filtered for. * @return */ List getUsersByRegionAndRights(RegionReferenceDto regionRef, Disease limitedDisease, UserRight... userRights); @@ -79,29 +75,21 @@ public interface UserFacade { long count(UserCriteria userCriteria); /** - * - * @param district - * reference of the district to be filtered for. When this district is null, it is not filtered in this regard. - * NOTE: some users don't have a district (often users with NATIONAL_USER role, for example). They will - * not be included when a district is specified, but otherwise they will. - * @param limitedDisease - * can be used to remove users from the return value that are limited to diseases other that limitedDisease. - * @param userRights - * user rights to be filtered for. + * @param district reference of the district to be filtered for. When this district is null, it is not filtered in this regard. + * NOTE: some users don't have a district (often users with NATIONAL_USER role, for example). They will + * not be included when a district is specified, but otherwise they will. + * @param limitedDisease can be used to remove users from the return value that are limited to diseases other that limitedDisease. + * @param userRights user rights to be filtered for. * @return */ List getUserRefsByDistrict(DistrictReferenceDto district, Disease limitedDisease, UserRight... userRights); /** - * - * @param district - * reference of the district to be filtered for. When this district is null, it is not filtered in this regard. - * NOTE: some users don't have a district (often users with NATIONAL_USER role, for example). They will - * * not be included when a district is specified, but otherwise they will. - * @param excludeLimitedDiseaseUsers - * if true, all users limited to diseases are excluded from the return value. - * @param userRights - * user rights to be filtered for. + * @param district reference of the district to be filtered for. When this district is null, it is not filtered in this regard. + * NOTE: some users don't have a district (often users with NATIONAL_USER role, for example). They will + * * not be included when a district is specified, but otherwise they will. + * @param excludeLimitedDiseaseUsers if true, all users limited to diseases are excluded from the return value. + * @param userRights user rights to be filtered for. * @return */ List getUserRefsByDistrict(DistrictReferenceDto district, boolean excludeLimitedDiseaseUsers, UserRight... userRights); @@ -160,9 +148,8 @@ List getUserRefsByInfrastructure( /** * Retrieves the user rights of the user specified by the passed UUID, or those of the current user if no UUID is specified. * Requesting the user rights of another user without the rights to view users and user roles results in an AccessDeniedException. - * - * @param userUuid - * The UUID of the user to request the user rights for + * + * @param userUuid The UUID of the user to request the user rights for * @return A set containing the user rights associated to all user roles assigned to the user */ List getUserRights(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 71c518d262d..9d43f73733f 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 @@ -516,7 +516,6 @@ public enum UserRight { public static final String _EXTERNAL_EMAIL_SEND = "EXTERNAL_EMAIL_SEND"; public static final String _EXTERNAL_EMAIL_ATTACH_DOCUMENTS = "EXTERNAL_EMAIL_ATTACH_DOCUMENTS"; public static final String _CUSTOMIZABLE_ENUM_MANAGEMENT = "CUSTOMIZABLE_ENUM_MANAGEMENT"; - //private static final String _DISEASE_DETAILS_ACCESS ="DISEASE_DETAILS_ACCESS" ; private static final Map> userRightDependencies = buildUserRightDependencies(); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteria.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteria.java index 63188d733c9..4f969373c87 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteria.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteria.java @@ -58,6 +58,4 @@ public CaseUserFilterCriteria excludeSharedCases(boolean excludeSharedCases) { this.excludeSharedCases = excludeSharedCases; return this; } - - } From 6e48a5dd7ef3e7c490854ec852924fe1e530fd84 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Mon, 16 Sep 2024 17:29:20 +0000 Subject: [PATCH 51/71] clean up after review --- .../de/symeda/sormas/api/caze/CaseFacade.java | 2 +- .../sormas/api/disease/DiseaseBurdenDto.java | 18 +- .../de/symeda/sormas/api/user/UserFacade.java | 45 ++-- .../sormas/api/user/UserRightGroup.java | 3 +- .../sormas/backend/caze/CaseService.java | 200 +++++++++--------- .../backend/contact/ContactService.java | 1 - .../backend/dashboard/DashboardService.java | 57 ++--- .../backend/outbreak/OutbreakFacadeEjb.java | 19 +- .../backend/outbreak/OutbreakService.java | 66 ++++-- .../backend/person/PersonFacadeEjb.java | 30 +-- .../sormas/backend/sample/SampleService.java | 82 +++---- .../sormas/backend/user/UserFacadeEjb.java | 5 +- .../src/main/resources/sql/sormas_schema.sql | 20 +- .../backend/geo/RegionFacadeEjbTest.java | 5 - .../outbreak/OutbreakFacadeEjbTest.java | 5 - .../backend/sample/SampleFacadeEjbTest.java | 1 - .../ui/dashboard/AbstractDashboardView.java | 4 +- .../ui/dashboard/DashboardController.java | 1 - .../contacts/ContactsDashboardView.java | 1 + .../dashboard/map/DashboardMapComponent.java | 146 ++++++------- .../components/SurveillanceFilterLayout.java | 12 +- .../EnvironmentSampleEditForm.java | 10 +- .../symeda/sormas/ui/user/UserController.java | 6 + 23 files changed, 392 insertions(+), 347 deletions(-) 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 ef6805b3afc..e2466b8fb60 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 @@ -202,7 +202,7 @@ List saveBulkEditWithFacilities( List getDuplicates(@Valid CasePersonDto casePerson); - List getDuplicatesWithPathogenTest(@Valid PersonReferenceDto personReferenceDto, PathogenTestDto pathogenTestDto); + List getDuplicatesWithPathogenTest(@Valid PersonReferenceDto personReferenceDto, PathogenTestDto pathogenTestDto); List getByPersonUuids(List personUuids); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java index da452821ef3..b4efcd25a59 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java @@ -37,8 +37,7 @@ public class DiseaseBurdenDto implements Serializable { public static final String CASES_DIFFERENCE_PERCENTAGE = "casesDifferencePercentage"; public static final String EVENT_COUNT = "eventCount"; public static final String OUTBREAK_DISTRICT_COUNT = "outbreakDistrictCount"; - public static final String - CASE_DEATH_COUNT = "caseDeathCount"; + public static final String CASE_DEATH_COUNT = "caseDeathCount"; public static final String CASE_FATALITY_RATE = "caseFatalityRate"; public static final String LAST_REPORTED_DISTRICT_NAME = "lastReportedDistrictName"; @@ -62,7 +61,6 @@ public class DiseaseBurdenDto implements Serializable { public static final String OTHER = "other"; public static final String OTHER_COUNT = "otherCount"; - private Disease disease; private String total; private String totalCount; @@ -179,13 +177,13 @@ public DiseaseBurdenDto( } public DiseaseBurdenDto( - Disease disease, - Long caseCount, - Long previousCaseCount, - Long eventCount, - Long outbreakDistrictCount, - Long caseDeathCount, - String lastReportedDistrictName) { + Disease disease, + Long caseCount, + Long previousCaseCount, + Long eventCount, + Long outbreakDistrictCount, + Long caseDeathCount, + String lastReportedDistrictName) { this.disease = disease; this.caseCount = caseCount; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java index 4e525468592..419b1f3b6a5 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java @@ -57,11 +57,15 @@ public interface UserFacade { UserDto getByUserName(String userName); /** - * @param regionRef reference of the region to be filtered for. When this region is null, it is not filtered in this regard. - * NOTE: some users don't have a region (often users with NATIONAL_USER role, for example). They will - * not be included when a region is specified, but otherwise they will. - * @param limitedDisease can be used to remove users from the return value that are limited to diseases other that limitedDisease. - * @param userRights user rights to be filtered for. + * + * @param regionRef + * reference of the region to be filtered for. When this region is null, it is not filtered in this regard. + * NOTE: some users don't have a region (often users with NATIONAL_USER role, for example). They will + * not be included when a region is specified, but otherwise they will. + * @param limitedDisease + * can be used to remove users from the return value that are limited to diseases other that limitedDisease. + * @param userRights + * user rights to be filtered for. * @return */ List getUsersByRegionAndRights(RegionReferenceDto regionRef, Disease limitedDisease, UserRight... userRights); @@ -75,21 +79,29 @@ public interface UserFacade { long count(UserCriteria userCriteria); /** - * @param district reference of the district to be filtered for. When this district is null, it is not filtered in this regard. - * NOTE: some users don't have a district (often users with NATIONAL_USER role, for example). They will - * not be included when a district is specified, but otherwise they will. - * @param limitedDisease can be used to remove users from the return value that are limited to diseases other that limitedDisease. - * @param userRights user rights to be filtered for. + * + * @param district + * reference of the district to be filtered for. When this district is null, it is not filtered in this regard. + * NOTE: some users don't have a district (often users with NATIONAL_USER role, for example). They will + * not be included when a district is specified, but otherwise they will. + * @param limitedDisease + * can be used to remove users from the return value that are limited to diseases other that limitedDisease. + * @param userRights + * user rights to be filtered for. * @return */ List getUserRefsByDistrict(DistrictReferenceDto district, Disease limitedDisease, UserRight... userRights); /** - * @param district reference of the district to be filtered for. When this district is null, it is not filtered in this regard. - * NOTE: some users don't have a district (often users with NATIONAL_USER role, for example). They will - * * not be included when a district is specified, but otherwise they will. - * @param excludeLimitedDiseaseUsers if true, all users limited to diseases are excluded from the return value. - * @param userRights user rights to be filtered for. + * + * @param district + * reference of the district to be filtered for. When this district is null, it is not filtered in this regard. + * NOTE: some users don't have a district (often users with NATIONAL_USER role, for example). They will + * * not be included when a district is specified, but otherwise they will. + * @param excludeLimitedDiseaseUsers + * if true, all users limited to diseases are excluded from the return value. + * @param userRights + * user rights to be filtered for. * @return */ List getUserRefsByDistrict(DistrictReferenceDto district, boolean excludeLimitedDiseaseUsers, UserRight... userRights); @@ -149,7 +161,8 @@ List getUserRefsByInfrastructure( * Retrieves the user rights of the user specified by the passed UUID, or those of the current user if no UUID is specified. * Requesting the user rights of another user without the rights to view users and user roles results in an AccessDeniedException. * - * @param userUuid The UUID of the user to request the user rights for + * @param userUuid + * The UUID of the user to request the user rights for * @return A set containing the user rights associated to all user roles assigned to the user */ List getUserRights(String userUuid); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java index aaa9b7e61ae..ece02973739 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java @@ -47,8 +47,7 @@ public enum UserRightGroup { EXPORT, CONFIGURATION, - EXTERNAL, - DISEASE; + EXTERNAL; @Override public String toString() { 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 90853d4e5af..ff6c6b3019f 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 @@ -270,7 +270,7 @@ public List findBy(CaseCriteria caseCriteria, boolean ignoreUserFilter) { Predicate filter = createCriteriaFilter(caseCriteria, caseQueryContext); if (!ignoreUserFilter) { - filter = and(cb, filter, createUserFilter(caseQueryContext)); + filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(caseQueryContext)); } if (filter != null) { @@ -288,7 +288,7 @@ protected Predicate createRelevantDataFilter(CriteriaBuilder cb, CriteriaQuery c Predicate filter = createActiveCasesFilter(cb, from); if (getCurrentUser() != null) { - filter = and(cb, filter, createUserFilterInternal(cb, cq, from)); + filter = CriteriaBuilderHelper.and(cb, filter, createUserFilterInternal(cb, cq, from)); } return filter; @@ -317,13 +317,13 @@ public List getAllActiveUuids() { if (getCurrentUser() != null) { Predicate userFilter = createUserFilter(cb, cq, from); - filter = and(cb, filter, userFilter); + filter = CriteriaBuilderHelper.and(cb, filter, userFilter); } if (RequestContextHolder.isMobileSync()) { Predicate predicate = createLimitedChangeDateFilter(cb, from); if (predicate != null) { - filter = and(cb, filter, predicate); + filter = CriteriaBuilderHelper.and(cb, filter, predicate); } } @@ -409,13 +409,13 @@ private Predicate createMapCasesFilter( // Userfilter filter = - and(cb, filter, createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true))); + CriteriaBuilderHelper.and(cb, filter, createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true))); // Filter by date. The relevancefilter uses a special algorithm that should reflect the current situation. if (dateType == null) { - filter = and(cb, filter, createCaseRelevanceFilter(caseQueryContext, from, to)); + filter = CriteriaBuilderHelper.and(cb, filter, createCaseRelevanceFilter(caseQueryContext, from, to)); } else { - filter = and(cb, filter, createNewCaseFilter(caseQueryContext, DateHelper.getStartOfDay(from), DateHelper.getEndOfDay(to), dateType)); + filter = CriteriaBuilderHelper.and(cb, filter, createNewCaseFilter(caseQueryContext, DateHelper.getStartOfDay(from), DateHelper.getEndOfDay(to), dateType)); } // only show cases which actually have GPS coordinates provided @@ -424,7 +424,7 @@ private Predicate createMapCasesFilter( and(cb, cb.isNotNull(root.get(Case.REPORT_LON)), cb.isNotNull(root.get(Case.REPORT_LAT))); Predicate facilityLatLonNotNull = and(cb, cb.isNotNull(joins.getFacility().get(Facility.LONGITUDE)), cb.isNotNull(joins.getFacility().get(Facility.LATITUDE))); Predicate latLonProvided = or(cb, personLatLonNotNull, reportLatLonNotNull, facilityLatLonNotNull); - filter = and(cb, filter, latLonProvided); + filter = CriteriaBuilderHelper.and(cb, filter, latLonProvided); if (region != null) { Predicate regionFilter = cb.equal(root.get(Case.REGION), region); @@ -504,10 +504,10 @@ public String getUuidByUuidEpidNumberOrExternalId(String searchTerm, CaseCriteri final CaseQueryContext caseQueryContext = new CaseQueryContext(cb, cq, root); filter = createCriteriaFilter(caseCriteria, caseQueryContext); // Userfilter - filter = and(cb, filter, createUserFilter(caseQueryContext, new CaseUserFilterCriteria())); + filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(caseQueryContext, new CaseUserFilterCriteria())); } - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, cb.or( @@ -677,60 +677,60 @@ public Predicate createCriteriaFilter(CaseCrite Predicate filter = null; if (caseCriteria.getReportingUserRole() != null) { Join rolesJoin = joins.getReportingUser().join(User.USER_ROLES, JoinType.LEFT); - filter = and(cb, filter, cb.equal(rolesJoin.get(UserRole.UUID), caseCriteria.getReportingUserRole().getUuid())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(rolesJoin.get(UserRole.UUID), caseCriteria.getReportingUserRole().getUuid())); } if (caseCriteria.getDisease() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.DISEASE), caseCriteria.getDisease())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.DISEASE), caseCriteria.getDisease())); } if (caseCriteria.getDiseaseVariant() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.DISEASE_VARIANT), caseCriteria.getDiseaseVariant())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.DISEASE_VARIANT), caseCriteria.getDiseaseVariant())); } if (caseCriteria.getOutcome() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.OUTCOME), caseCriteria.getOutcome())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.OUTCOME), caseCriteria.getOutcome())); } if (caseCriteria.getRegion() != null) { - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, CaseCriteriaHelper.createRegionCriteriaFilter(cb, joins, caseCriteria.getRegion(), caseCriteria.getJurisdictionType())); } if (caseCriteria.getDistrict() != null) { - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, CaseCriteriaHelper.createDistrictCriteriaFilter(cb, joins, caseCriteria.getDistrict(), caseCriteria.getJurisdictionType())); } if (caseCriteria.getCommunity() != null) { - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, CaseCriteriaHelper.createCommunityCriteriaFilter(cb, joins, caseCriteria.getCommunity(), caseCriteria.getJurisdictionType())); } if (caseCriteria.getFollowUpStatus() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.FOLLOW_UP_STATUS), caseCriteria.getFollowUpStatus())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.FOLLOW_UP_STATUS), caseCriteria.getFollowUpStatus())); } if (caseCriteria.getFollowUpUntilFrom() != null && caseCriteria.getFollowUpUntilTo() != null) { - filter = and(cb, filter, cb.between(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilFrom(), caseCriteria.getFollowUpUntilTo())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.between(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilFrom(), caseCriteria.getFollowUpUntilTo())); } else if (caseCriteria.getFollowUpUntilFrom() != null) { filter = and(cb, filter, cb.greaterThanOrEqualTo(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilFrom())); } else if (caseCriteria.getFollowUpUntilTo() != null) { - filter = and(cb, filter, cb.lessThanOrEqualTo(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilTo())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.lessThanOrEqualTo(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilTo())); } if (caseCriteria.getSymptomJournalStatus() != null) { - filter = and(cb, filter, cb.equal(joins.getPerson().get(Person.SYMPTOM_JOURNAL_STATUS), caseCriteria.getSymptomJournalStatus())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPerson().get(Person.SYMPTOM_JOURNAL_STATUS), caseCriteria.getSymptomJournalStatus())); } if (caseCriteria.getVaccinationStatus() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.VACCINATION_STATUS), caseCriteria.getVaccinationStatus())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.VACCINATION_STATUS), caseCriteria.getVaccinationStatus())); } if (caseCriteria.getReinfectionStatus() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.REINFECTION_STATUS), caseCriteria.getReinfectionStatus())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.REINFECTION_STATUS), caseCriteria.getReinfectionStatus())); } if (caseCriteria.getReportDateTo() != null) { - filter = and(cb, filter, cb.lessThanOrEqualTo(from.get(Case.REPORT_DATE), caseCriteria.getReportDateTo())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.lessThanOrEqualTo(from.get(Case.REPORT_DATE), caseCriteria.getReportDateTo())); } if (caseCriteria.getCaseOrigin() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.CASE_ORIGIN), caseCriteria.getCaseOrigin())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.CASE_ORIGIN), caseCriteria.getCaseOrigin())); } if (caseCriteria.getHealthFacility() != null) { filter = @@ -741,26 +741,26 @@ public Predicate createCriteriaFilter(CaseCrite and(cb, filter, from.get(Case.FACILITY_TYPE).in(FacilityType.getTypes(caseCriteria.getFacilityTypeGroup()))); } if (caseCriteria.getFacilityType() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.FACILITY_TYPE), caseCriteria.getFacilityType())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.FACILITY_TYPE), caseCriteria.getFacilityType())); } if (caseCriteria.getPointOfEntry() != null) { - filter = and(cb, filter, cb.equal(joins.getPointOfEntry().get(PointOfEntry.UUID), caseCriteria.getPointOfEntry().getUuid())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPointOfEntry().get(PointOfEntry.UUID), caseCriteria.getPointOfEntry().getUuid())); } if (caseCriteria.getSurveillanceOfficer() != null) { - filter = and(cb, filter, cb.equal(joins.getSurveillanceOfficer().get(User.UUID), caseCriteria.getSurveillanceOfficer().getUuid())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getSurveillanceOfficer().get(User.UUID), caseCriteria.getSurveillanceOfficer().getUuid())); } if (caseCriteria.getCaseClassification() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.CASE_CLASSIFICATION), caseCriteria.getCaseClassification())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.CASE_CLASSIFICATION), caseCriteria.getCaseClassification())); } if (caseCriteria.getInvestigationStatus() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.INVESTIGATION_STATUS), caseCriteria.getInvestigationStatus())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.INVESTIGATION_STATUS), caseCriteria.getInvestigationStatus())); } if (caseCriteria.getPresentCondition() != null) { filter = and(cb, filter, cb.equal(joins.getPerson().get(Person.PRESENT_CONDITION), caseCriteria.getPresentCondition())); } if (caseCriteria.getNewCaseDateFrom() != null && caseCriteria.getNewCaseDateTo() != null) { - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, createNewCaseFilter( @@ -770,16 +770,18 @@ public Predicate createCriteriaFilter(CaseCrite caseCriteria.getNewCaseDateType())); } if (caseCriteria.getCreationDateFrom() != null) { - filter = and(cb, filter, cb.greaterThan(from.get(Case.CREATION_DATE), DateHelper.getStartOfDay(caseCriteria.getCreationDateFrom()))); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.greaterThan(from.get(Case.CREATION_DATE), DateHelper.getStartOfDay(caseCriteria.getCreationDateFrom()))); } if (caseCriteria.getCreationDateTo() != null) { - filter = and(cb, filter, cb.lessThan(from.get(Case.CREATION_DATE), DateHelper.getEndOfDay(caseCriteria.getCreationDateTo()))); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.lessThan(from.get(Case.CREATION_DATE), DateHelper.getEndOfDay(caseCriteria.getCreationDateTo()))); } if (caseCriteria.getQuarantineType() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.QUARANTINE), caseCriteria.getQuarantineType())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.QUARANTINE), caseCriteria.getQuarantineType())); } if (caseCriteria.getQuarantineTo() != null) { - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, cb.between( @@ -788,11 +790,11 @@ public Predicate createCriteriaFilter(CaseCrite DateHelper.getEndOfDay(caseCriteria.getQuarantineTo()))); } if (caseCriteria.getPerson() != null) { - filter = and(cb, filter, cb.equal(joins.getPerson().get(Person.UUID), caseCriteria.getPerson().getUuid())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPerson().get(Person.UUID), caseCriteria.getPerson().getUuid())); } if (caseCriteria.getMustHaveNoGeoCoordinates() != null && caseCriteria.getMustHaveNoGeoCoordinates() == true) { Join personAddress = joins.getPersonAddress(); - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, cb.and( @@ -800,8 +802,8 @@ public Predicate createCriteriaFilter(CaseCrite cb.or(cb.isNull(personAddress.get(Location.LATITUDE)), cb.isNull(personAddress.get(Location.LONGITUDE))))); } if (caseCriteria.getMustBePortHealthCaseWithoutFacility() != null && caseCriteria.getMustBePortHealthCaseWithoutFacility() == true) { - filter = and(cb, filter, cb.and(cb.equal(from.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY), cb.isNull(joins.getFacility()))); - } + filter = CriteriaBuilderHelper + .and(cb, filter, cb.and(cb.equal(from.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY), cb.isNull(joins.getFacility()))); } if (caseCriteria.getMustHaveCaseManagementData() != null && caseCriteria.getMustHaveCaseManagementData() == true) { Subquery prescriptionSubquery = cq.subquery(Prescription.class); Root prescriptionRoot = prescriptionSubquery.from(Prescription.class); @@ -813,21 +815,23 @@ public Predicate createCriteriaFilter(CaseCrite Root clinicalVisitRoot = clinicalVisitSubquery.from(ClinicalVisit.class); clinicalVisitSubquery.select(clinicalVisitRoot) .where(cb.equal(clinicalVisitRoot.get(ClinicalVisit.CLINICAL_COURSE), from.get(Case.CLINICAL_COURSE))); - filter = and(cb, filter, cb.or(cb.exists(prescriptionSubquery), cb.exists(treatmentSubquery), cb.exists(clinicalVisitSubquery))); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.or(cb.exists(prescriptionSubquery), cb.exists(treatmentSubquery), cb.exists(clinicalVisitSubquery))); } if (Boolean.TRUE.equals(caseCriteria.getWithoutResponsibleOfficer())) { - filter = and(cb, filter, cb.isNull(from.get(Case.SURVEILLANCE_OFFICER))); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isNull(from.get(Case.SURVEILLANCE_OFFICER))); } if (Boolean.TRUE.equals(caseCriteria.getWithExtendedQuarantine())) { - filter = and(cb, filter, cb.isTrue(from.get(Case.QUARANTINE_EXTENDED))); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isTrue(from.get(Case.QUARANTINE_EXTENDED))); } if (Boolean.TRUE.equals(caseCriteria.getWithReducedQuarantine())) { - filter = and(cb, filter, cb.isTrue(from.get(Case.QUARANTINE_REDUCED))); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isTrue(from.get(Case.QUARANTINE_REDUCED))); } if (Boolean.TRUE.equals(caseCriteria.getOnlyQuarantineHelpNeeded())) { - filter = and(cb, filter, cb.and(cb.notEqual(from.get(Case.QUARANTINE_HELP_NEEDED), ""), cb.isNotNull(from.get(Case.QUARANTINE_HELP_NEEDED)))); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.and(cb.notEqual(from.get(Case.QUARANTINE_HELP_NEEDED), ""), cb.isNotNull(from.get(Case.QUARANTINE_HELP_NEEDED)))); } - filter = and(cb, filter, createRelevanceStatusFilter(caseCriteria, caseQueryContext)); + filter = CriteriaBuilderHelper.and(cb, filter, createRelevanceStatusFilter(caseCriteria, caseQueryContext)); if (!DataHelper.isNullOrEmpty(caseCriteria.getPersonLike())) { Predicate likeFilters = CriteriaBuilderHelper.buildFreeTextSearchPredicate( @@ -847,7 +851,7 @@ public Predicate createCriteriaFilter(CaseCrite CriteriaBuilderHelper.ilike(cb, joins.getPersonAddress().get(Location.POSTAL_CODE), textFilter), CriteriaBuilderHelper.ilike(cb, joins.getPerson().get(Person.NATIONAL_HEALTH_ID), textFilter))); - filter = and(cb, filter, likeFilters); + filter = CriteriaBuilderHelper.and(cb, filter, likeFilters); } if (!DataHelper.isNullOrEmpty(caseCriteria.getCaseLike())) { Predicate likeFilters = CriteriaBuilderHelper.buildFreeTextSearchPredicate( @@ -865,7 +869,7 @@ public Predicate createCriteriaFilter(CaseCrite //the below field is intentionally added to be available to be checked from two different filter fields CriteriaBuilderHelper.ilike(cb, joins.getPerson().get(Person.NATIONAL_HEALTH_ID), textFilter))); - filter = and(cb, filter, likeFilters); + filter = CriteriaBuilderHelper.and(cb, filter, likeFilters); } boolean hasEventLikeCriteria = caseCriteria.getEventLike() != null && !caseCriteria.getEventLike().trim().isEmpty(); @@ -874,7 +878,8 @@ public Predicate createCriteriaFilter(CaseCrite Join eventParticipant = joins.getEventParticipants(); Join event = joins.getEventParticipantJoins().getEvent(); - filter = and(cb, filter, cb.isFalse(event.get(Event.DELETED)), cb.isFalse(eventParticipant.get(EventParticipant.DELETED))); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.isFalse(event.get(Event.DELETED)), cb.isFalse(eventParticipant.get(EventParticipant.DELETED))); if (hasEventLikeCriteria) { String[] textFilters = caseCriteria.getEventLike().trim().split("\\s+"); @@ -884,11 +889,11 @@ public Predicate createCriteriaFilter(CaseCrite CriteriaBuilderHelper.unaccentedIlike(cb, event.get(Event.EVENT_TITLE), textFilter), CriteriaBuilderHelper.unaccentedIlike(cb, event.get(Event.INTERNAL_TOKEN), textFilter), CriteriaBuilderHelper.ilike(cb, event.get(Event.UUID), textFilter)); - filter = and(cb, filter, likeFilters, cb.isFalse(eventParticipant.get(EventParticipant.DELETED))); + filter = CriteriaBuilderHelper.and(cb, filter, likeFilters, cb.isFalse(eventParticipant.get(EventParticipant.DELETED))); } } if (hasOnlyCasesWithEventsCriteria) { - filter = and(cb, filter, cb.isNotNull(event.get(Event.ID))); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(event.get(Event.ID))); } } if (caseCriteria.getReportingUserLike() != null) { @@ -898,20 +903,20 @@ public Predicate createCriteriaFilter(CaseCrite CriteriaBuilderHelper.unaccentedIlike(cb, joins.getReportingUser().get(User.FIRST_NAME), textFilter), CriteriaBuilderHelper.unaccentedIlike(cb, joins.getReportingUser().get(User.LAST_NAME), textFilter), CriteriaBuilderHelper.unaccentedIlike(cb, joins.getReportingUser().get(User.USER_NAME), textFilter)); - filter = and(cb, filter, likeFilters); + filter = CriteriaBuilderHelper.and(cb, filter, likeFilters); } } if (caseCriteria.getBirthdateYYYY() != null) { - filter = and(cb, filter, cb.equal(joins.getPerson().get(Person.BIRTHDATE_YYYY), caseCriteria.getBirthdateYYYY())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPerson().get(Person.BIRTHDATE_YYYY), caseCriteria.getBirthdateYYYY())); } if (caseCriteria.getBirthdateMM() != null) { - filter = and(cb, filter, cb.equal(joins.getPerson().get(Person.BIRTHDATE_MM), caseCriteria.getBirthdateMM())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPerson().get(Person.BIRTHDATE_MM), caseCriteria.getBirthdateMM())); } if (caseCriteria.getBirthdateDD() != null) { - filter = and(cb, filter, cb.equal(joins.getPerson().get(Person.BIRTHDATE_DD), caseCriteria.getBirthdateDD())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPerson().get(Person.BIRTHDATE_DD), caseCriteria.getBirthdateDD())); } if (Boolean.TRUE.equals(caseCriteria.getOnlyContactsFromOtherInstances())) { - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, cb.or( @@ -919,23 +924,23 @@ public Predicate createCriteriaFilter(CaseCrite cb.isNotNull(from.get(Case.SORMAS_TO_SORMAS_ORIGIN_INFO)))); } if (Boolean.TRUE.equals(caseCriteria.getOnlyCasesWithReinfection())) { - filter = and(cb, filter, cb.equal(from.get(Case.RE_INFECTION), YesNoUnknown.YES)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.RE_INFECTION), YesNoUnknown.YES)); } if (Boolean.TRUE.equals(caseCriteria.getOnlyCasesWithDontShareWithExternalSurvTool())) { - filter = and(cb, filter, cb.isTrue(from.get(Case.DONT_SHARE_WITH_REPORTING_TOOL))); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isTrue(from.get(Case.DONT_SHARE_WITH_REPORTING_TOOL))); } if (Boolean.TRUE.equals(caseCriteria.getOnlyShowCasesWithFulfilledReferenceDefinition())) { - filter = and(cb, filter, cb.equal(from.get(Case.CASE_REFERENCE_DEFINITION), CaseReferenceDefinition.FULFILLED)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.CASE_REFERENCE_DEFINITION), CaseReferenceDefinition.FULFILLED)); } if (caseCriteria.getWithOwnership() != null) { filter = - and(cb, filter, createOwnershipPredicate(Boolean.TRUE.equals(caseCriteria.getWithOwnership()), from, cb, cq)); + CriteriaBuilderHelper.and(cb, filter, createOwnershipPredicate(Boolean.TRUE.equals(caseCriteria.getWithOwnership()), from, cb, cq)); } if (StringUtils.isNotBlank(caseCriteria.getCaseReferenceNumber())) { filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.CASE_REFERENCE_NUMBER), caseCriteria.getCaseReferenceNumber())); } - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, externalShareInfoService.buildShareCriteriaFilter( @@ -958,15 +963,15 @@ private Predicate createRelevanceStatusFilter(CaseCriteria caseCriteria, CaseQue if (caseCriteria.getRelevanceStatus() != null) { if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.ACTIVE) { - filter = and(cb, filter, cb.or(cb.equal(from.get(Case.ARCHIVED), false), cb.isNull(from.get(Case.ARCHIVED)))); + filter = CriteriaBuilderHelper.and(cb, filter, cb.or(cb.equal(from.get(Case.ARCHIVED), false), cb.isNull(from.get(Case.ARCHIVED)))); } else if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.ARCHIVED) { - filter = and(cb, filter, cb.equal(from.get(Case.ARCHIVED), true)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.ARCHIVED), true)); } else if (caseCriteria.getRelevanceStatus() == EntityRelevanceStatus.DELETED) { - filter = and(cb, filter, cb.equal(from.get(Case.DELETED), true)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.DELETED), true)); } } if (caseCriteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { - filter = and(cb, filter, createDefaultFilter(cb, from)); + filter = CriteriaBuilderHelper.and(cb, filter, createDefaultFilter(cb, from)); } return filter; } @@ -1416,7 +1421,7 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil case REGION: final Region region = currentUser.getRegion(); if (region != null) { - filter = or( + filter = CriteriaBuilderHelper.or( cb, filter, cb.equal(casePath.get(Case.REGION).get(Region.ID), region.getId()), @@ -1426,7 +1431,7 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil case DISTRICT: final District district = currentUser.getDistrict(); if (district != null) { - filter = or( + filter = CriteriaBuilderHelper.or( cb, filter, cb.equal(casePath.get(Case.DISTRICT).get(District.ID), district.getId()), @@ -1436,13 +1441,14 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil case HEALTH_FACILITY: final Facility healthFacility = currentUser.getHealthFacility(); if (healthFacility != null) { - filter = or(cb, filter, cb.equal(casePath.get(Case.HEALTH_FACILITY).get(Facility.ID), healthFacility.getId())); + filter = CriteriaBuilderHelper + .or(cb, filter, cb.equal(casePath.get(Case.HEALTH_FACILITY).get(Facility.ID), healthFacility.getId())); } break; case COMMUNITY: final Community community = currentUser.getCommunity(); if (community != null) { - filter = or( + filter = CriteriaBuilderHelper.or( cb, filter, cb.equal(casePath.get(Case.COMMUNITY).get(Community.ID), community.getId()), @@ -1452,7 +1458,8 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil case POINT_OF_ENTRY: final PointOfEntry pointOfEntry = currentUser.getPointOfEntry(); if (pointOfEntry != null) { - filter = or(cb, filter, cb.equal(casePath.get(Case.POINT_OF_ENTRY).get(PointOfEntry.ID), pointOfEntry.getId())); + filter = CriteriaBuilderHelper + .or(cb, filter, cb.equal(casePath.get(Case.POINT_OF_ENTRY).get(PointOfEntry.ID), pointOfEntry.getId())); } break; case LABORATORY: @@ -1462,7 +1469,7 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil final Join cazeJoin = sampleJoins.getCaze(); sampleSubQuery.where(cb.and(cb.equal(cazeJoin, casePath), sampleService.createUserFilterWithoutAssociations(cb, sampleJoins))); sampleSubQuery.select(sampleRoot.get(Sample.ID)); - filter = or(cb, filter, cb.exists(sampleSubQuery)); + filter = CriteriaBuilderHelper.or(cb, filter, cb.exists(sampleSubQuery)); break; default: } @@ -1486,7 +1493,7 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil // all users (without specific restrictions) get access to cases that have been made available to the whole country if ((userFilterCriteria == null || userFilterCriteria.getIncludeCasesFromOtherJurisdictions()) && !featureConfigurationFacade.isFeatureDisabled(FeatureType.NATIONAL_CASE_SHARING)) { - filter = or(cb, filter, cb.isTrue(casePath.get(Case.SHARED_TO_COUNTRY))); + filter = CriteriaBuilderHelper.or(cb, filter, cb.isTrue(casePath.get(Case.SHARED_TO_COUNTRY))); } } @@ -1502,10 +1509,10 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil // port health users can only see port health cases if (currentUser.getUserRoles().stream().anyMatch(userRole -> userRole.isPortHealthUser())) { - filter = and(cb, filter, cb.equal(casePath.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(casePath.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY)); } - filter = or(cb, filter, filterResponsible); + filter = CriteriaBuilderHelper.or(cb, filter, filterResponsible); if (RequestContextHolder.isMobileSync()) { if ((userFilterCriteria == null || !userFilterCriteria.isExcludeLimitedSyncRestrictions()) @@ -1517,12 +1524,12 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil cb.or( cb.notEqual(casePath.get(Case.REPORTING_USER), currentUser), cb.and(cb.equal(casePath.get(Case.REPORTING_USER), currentUser), cb.isNull(casePath.get(Case.CREATION_VERSION)))))); - filter = and(cb, filter, limitedCaseSyncPredicate); + filter = CriteriaBuilderHelper.and(cb, filter, limitedCaseSyncPredicate); } Predicate limitedChangeDatePredicate = and(cb, createLimitedChangeDateFilter(cb, casePath)); if (limitedChangeDatePredicate != null) { - filter = and(cb, filter, limitedChangeDatePredicate); + filter = CriteriaBuilderHelper.and(cb, filter, limitedChangeDatePredicate); } } @@ -1567,14 +1574,14 @@ public Predicate createNewCaseFilter(CaseQueryContext caseQueryContext, Date fro return newCaseFilter; } - public Case getRelevantCaseForFollowUp(Person person, Disease disease, Date referenceDate) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Case.class); Root caseRoot = cq.from(Case.class); - Predicate filter = and(cb, createDefaultFilter(cb, caseRoot), buildRelevantCasesFilterForFollowUp(person, disease, referenceDate, cb, caseRoot)); + Predicate filter = CriteriaBuilderHelper + .and(cb, createDefaultFilter(cb, caseRoot), buildRelevantCasesFilterForFollowUp(person, disease, referenceDate, cb, caseRoot)); cq.where(filter); return em.createQuery(cq).getResultStream().findFirst().orElse(null); @@ -1591,20 +1598,20 @@ private Predicate buildRelevantCasesFilterForFollowUp(Person person, Disease dis Date referenceDateStart = DateHelper.getStartOfDay(referenceDate); Date referenceDateEnd = DateHelper.getEndOfDay(referenceDate); - Predicate filter = and(cb, cb.equal(from.get(Case.PERSON), person), cb.equal(from.get(Case.DISEASE), disease)); + Predicate filter = CriteriaBuilderHelper.and(cb, cb.equal(from.get(Case.PERSON), person), cb.equal(from.get(Case.DISEASE), disease)); - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, cb.lessThanOrEqualTo(from.get(Case.REPORT_DATE), DateHelper.addDays(referenceDateEnd, FollowUpLogic.ALLOWED_DATE_OFFSET))); - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, - or( + CriteriaBuilderHelper.or( cb, // If the case does not have a follow-up until date, use the case report date as a fallback - and( + CriteriaBuilderHelper.and( cb, cb.isNull(from.get(Case.FOLLOW_UP_UNTIL)), cb.greaterThanOrEqualTo( @@ -1807,11 +1814,11 @@ public List getCaseSelectionList(CaseCriteria caseCriteria) { cq.orderBy(cb.desc(latestChangedDateFunction)); Predicate filter = - and(cb, createActiveCasesFilter(cb, root), createUserFilter(caseQueryContext, new CaseUserFilterCriteria())); + CriteriaBuilderHelper.and(cb, createActiveCasesFilter(cb, root), createUserFilter(caseQueryContext, new CaseUserFilterCriteria())); if (caseCriteria != null) { if (caseCriteria.getDisease() != null) { - filter = and(cb, filter, cb.equal(root.get(Case.DISEASE), caseCriteria.getDisease())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(root.get(Case.DISEASE), caseCriteria.getDisease())); } if (caseCriteria.getSourceCaseInfoLike() != null) { String[] textFilters = caseCriteria.getSourceCaseInfoLike().split("\\s+"); @@ -1822,7 +1829,7 @@ public List getCaseSelectionList(CaseCriteria caseCriteria) { CriteriaBuilderHelper.ilike(cb, root.get(Case.UUID), textFilter), CriteriaBuilderHelper.ilike(cb, root.get(Case.EPID_NUMBER), textFilter), CriteriaBuilderHelper.ilike(cb, root.get(Case.EXTERNAL_ID), textFilter)); - filter = and(cb, filter, likeFilters); + filter = CriteriaBuilderHelper.and(cb, filter, likeFilters); } } } @@ -1948,7 +1955,7 @@ private Predicate getSimilarityFilters(CaseSimilarityCriteria criteria, Criteria Predicate regionFilter = null; RegionReferenceDto criteriaRegion = caseCriteria.getRegion(); if (criteriaRegion != null) { - regionFilter = or(cb, regionFilter, CaseCriteriaHelper.createRegionCriteriaFilter(cb, joins, criteriaRegion, null)); + regionFilter = CriteriaBuilderHelper.or(cb, regionFilter, CaseCriteriaHelper.createRegionCriteriaFilter(cb, joins, criteriaRegion, null)); } Predicate reportDateFilter = criteria.getReportDate() != null @@ -1959,11 +1966,11 @@ private Predicate getSimilarityFilters(CaseSimilarityCriteria criteria, Criteria : null; Predicate filter = createDefaultFilter(cb, root); - filter = and(cb, filter, userFilter); - filter = and(cb, filter, personSimilarityFilter); - filter = and(cb, filter, diseaseFilter); - filter = and(cb, filter, regionFilter); - filter = and(cb, filter, reportDateFilter); + filter = CriteriaBuilderHelper.and(cb, filter, userFilter); + filter = CriteriaBuilderHelper.and(cb, filter, personSimilarityFilter); + filter = CriteriaBuilderHelper.and(cb, filter, diseaseFilter); + filter = CriteriaBuilderHelper.and(cb, filter, regionFilter); + filter = CriteriaBuilderHelper.and(cb, filter, reportDateFilter); return filter; } @@ -2049,16 +2056,16 @@ public List getCasesForDuplicateMerging( CriteriaBuilderHelper.dateDiff(cb, symptoms.get(Symptoms.ONSET_DATE), symptoms2.get(Symptoms.ONSET_DATE)), SECONDS_30_DAYS)); - Predicate filter = and(cb, userFilter, criteriaFilter, relevanceStatusRoot2Filter, nameSimilarityFilter, diseaseFilter); + Predicate filter = CriteriaBuilderHelper.and(cb, userFilter, criteriaFilter, relevanceStatusRoot2Filter, nameSimilarityFilter, diseaseFilter); if (!showDuplicatesWithDifferentRegion) { Predicate regionFilter = cb.or( cb.equal(root.get(Case.RESPONSIBLE_REGION), root2.get(Case.RESPONSIBLE_REGION)), cb.and(cb.isNotNull(root.get(Case.REGION)), cb.equal(root.get(Case.REGION), root2.get(Case.REGION)))); - filter = and(cb, filter, regionFilter); + filter = CriteriaBuilderHelper.and(cb, filter, regionFilter); } - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, reportDateFilter, @@ -2195,7 +2202,7 @@ public PreviousCaseDto getMostRecentPreviousCase(String personUuid, Disease dise symptomsJoin.get(Symptoms.ONSET_DATE)); cq.where( - and( + CriteriaBuilderHelper.and( cb, cb.equal(personJoin.get(AbstractDomainObject.UUID), personUuid), cb.equal(root.get(Case.DISEASE), disease), @@ -2260,7 +2267,8 @@ public void updateVaccinationStatuses(Long personId, Disease disease, Vaccinatio Predicate datePredicate = vaccinationService.getRelevantVaccinationPredicate(root, cu, cb, vaccination); cu.where( - and(cb, cb.equal(root.get(Case.PERSON).get(Person.ID), personId), cb.equal(root.get(Case.DISEASE), disease), datePredicate)); + CriteriaBuilderHelper + .and(cb, cb.equal(root.get(Case.PERSON).get(Person.ID), personId), cb.equal(root.get(Case.DISEASE), disease), datePredicate)); em.createQuery(cu).executeUpdate(); } 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 65b5e609787..53eb31d262a 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 @@ -146,7 +146,6 @@ import de.symeda.sormas.backend.visit.VisitFacadeEjb; import de.symeda.sormas.backend.visit.VisitService; import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.or; -import de.symeda.sormas.backend.event.EventParticipantService; @Stateless @LocalBean diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java index 63161f7887e..cdd8c58ed7f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java @@ -73,7 +73,8 @@ public class DashboardService { private CaseService caseService; @EJB private EventService eventService; - + @EJB + private SampleService sampleService; @EJB private ConfigFacadeEjb.ConfigFacadeEjbLocal configFacade; @@ -89,7 +90,7 @@ public List getCases(DashboardCriteria dashboardCriteria) { Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); Predicate criteriaFilter = createCaseCriteriaFilter(dashboardCriteria, caseQueryContext); - filter = and(cb, filter, criteriaFilter); + filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); List result; if (filter != null) { @@ -132,7 +133,7 @@ public Map getNewTestResultCountByResultType(Dashb final Predicate sampleFilter = cb.and( cb.isFalse(sample.get(Sample.DELETED)), cb.or(cb.isNull(sample.get(Sample.SPECIMEN_CONDITION)), cb.equal(sample.get(Sample.SPECIMEN_CONDITION), SpecimenCondition.ADEQUATE))); - cq.where(and(cb, userFilter, criteriaFilter, sampleFilter)); + cq.where(CriteriaBuilderHelper.and(cb, userFilter, criteriaFilter, sampleFilter)); final List queryResult = QueryHelper.getResultList(em, cq, null, null); @@ -168,7 +169,7 @@ public Map getCasesCountByClassification(DashboardC Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); Predicate criteriaFilter = createCaseCriteriaFilter(dashboardCriteria, caseQueryContext); - filter = and(cb, filter, criteriaFilter); + filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); Map result; if (filter != null) { @@ -219,7 +220,7 @@ public Map getCaseCountByDisease(DashboardCriteria dashboardCrite Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); - filter = and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); + filter = CriteriaBuilderHelper.and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); if (filter != null) { cq.where(filter); @@ -245,7 +246,7 @@ public String getLastReportedDistrictName(DashboardCriteria dashboardCriteria) { Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); - filter = and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); + filter = CriteriaBuilderHelper.and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); if (filter != null) { cq.where(filter); @@ -271,7 +272,7 @@ public Map getLastReportedDistrictByDisease(DashboardCriteria Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); - filter = and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); + filter = CriteriaBuilderHelper.and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); if (filter != null) { cq.where(filter); @@ -312,8 +313,8 @@ public Map getDeathCountByDisease(DashboardCriteria dashboardCrit Join person = joins.getPerson(); Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); - filter = and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); - filter = and(cb, filter, cb.equal(person.get(Person.CAUSE_OF_DEATH_DISEASE), root.get(Case.DISEASE))); + filter = CriteriaBuilderHelper.and(cb, filter, createCaseCriteriaFilter(dashboardCriteria, caseQueryContext)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(person.get(Person.CAUSE_OF_DEATH_DISEASE), root.get(Case.DISEASE))); if (filter != null) { cq.where(filter); @@ -338,7 +339,7 @@ public long countCasesConvertedFromContacts(DashboardCriteria dashboardCriteria) Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); Predicate criteriaFilter = createCaseCriteriaFilter(dashboardCriteria, caseQueryContext); - filter = and(cb, filter, criteriaFilter); + filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); caze.join(Case.CONVERTED_FROM_CONTACT, JoinType.INNER); @@ -362,7 +363,7 @@ public Map getCasesCountPerPersonCondition(DashboardC Predicate filter = caseService.createUserFilter(caseQueryContext, new CaseUserFilterCriteria().excludeCasesFromContacts(true)); Predicate criteriaFilter = createCaseCriteriaFilter(dashboardCriteria, caseQueryContext); - filter = and(cb, filter, criteriaFilter); + filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); if (filter != null) { cq.where(filter); @@ -392,8 +393,8 @@ public List getNewEvents(DashboardCriteria dashboardCriteria) Join eventDistrict = eventJoins.getDistrict(); Predicate filter = eventService.createDefaultFilter(cb, event); - filter = and(cb, filter, buildEventCriteriaFilter(dashboardCriteria, eventQueryContext)); - filter = and(cb, filter, eventService.createUserFilter(eventQueryContext)); + filter = CriteriaBuilderHelper.and(cb, filter, buildEventCriteriaFilter(dashboardCriteria, eventQueryContext)); + filter = CriteriaBuilderHelper.and(cb, filter, eventService.createUserFilter(eventQueryContext)); List result; @@ -437,8 +438,8 @@ public Map getEventCountByStatus(DashboardCriteria dashboardC cq.groupBy(event.get(Event.EVENT_STATUS)); Predicate filter = eventService.createDefaultFilter(cb, event); - filter = and(cb, filter, buildEventCriteriaFilter(dashboardCriteria, eventQueryContext)); - filter = and(cb, filter, eventService.createUserFilter(eventQueryContext)); + filter = CriteriaBuilderHelper.and(cb, filter, buildEventCriteriaFilter(dashboardCriteria, eventQueryContext)); + filter = CriteriaBuilderHelper.and(cb, filter, eventService.createUserFilter(eventQueryContext)); if (filter != null) cq.where(filter); @@ -461,17 +462,17 @@ private Predicate createCaseCriteriaFilter( Predicate filter = null; if (dashboardCriteria.getDisease() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.DISEASE), dashboardCriteria.getDisease())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.DISEASE), dashboardCriteria.getDisease())); } if (dashboardCriteria.getRegion() != null) { - filter = and(cb, filter, cb.equal(responsibleRegion.get(Region.UUID), dashboardCriteria.getRegion().getUuid())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(responsibleRegion.get(Region.UUID), dashboardCriteria.getRegion().getUuid())); } if (dashboardCriteria.getDistrict() != null) { filter = and(cb, filter, cb.equal(responsibleDistrict.get(District.UUID), dashboardCriteria.getDistrict().getUuid())); } if (dashboardCriteria.getDateFrom() != null && dashboardCriteria.getDateTo() != null) { - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, caseService.createNewCaseFilter( @@ -481,16 +482,16 @@ private Predicate createCaseCriteriaFilter( dashboardCriteria.getNewCaseDateType())); } if (!dashboardCriteria.shouldIncludeNotACaseClassification()) { - filter = and(cb, filter, cb.notEqual(caseQueryContext.getRoot().get(Case.CASE_CLASSIFICATION), CaseClassification.NO_CASE)); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.notEqual(caseQueryContext.getRoot().get(Case.CASE_CLASSIFICATION), CaseClassification.NO_CASE)); } if (dashboardCriteria.getOutcome() != null) { - filter = and(cb, filter, cb.equal(from.get(Case.OUTCOME), dashboardCriteria.getOutcome())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.OUTCOME), dashboardCriteria.getOutcome())); } - // Exclude deleted cases. Archived cases should stay included - filter = and(cb, filter, cb.isFalse(from.get(Case.DELETED))); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isFalse(from.get(Case.DELETED))); return filter; } @@ -502,10 +503,10 @@ private Predicate buildEventCriteriaFilter(DashboardCriteria dashboardCriteria, Predicate filter = null; if (dashboardCriteria.getDisease() != null) { - filter = and(cb, filter, cb.equal(from.get(Event.DISEASE), dashboardCriteria.getDisease())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Event.DISEASE), dashboardCriteria.getDisease())); } if (dashboardCriteria.getRegion() != null) { - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, cb.equal( @@ -513,7 +514,7 @@ private Predicate buildEventCriteriaFilter(DashboardCriteria dashboardCriteria, dashboardCriteria.getRegion().getUuid())); } if (dashboardCriteria.getDistrict() != null) { - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, cb.equal( @@ -521,10 +522,10 @@ private Predicate buildEventCriteriaFilter(DashboardCriteria dashboardCriteria, dashboardCriteria.getDistrict().getUuid())); } - filter = and(cb, filter, createEventDateFilter(eventQueryContext.getQuery(), cb, from, dashboardCriteria)); + filter = CriteriaBuilderHelper.and(cb, filter, createEventDateFilter(eventQueryContext.getQuery(), cb, from, dashboardCriteria)); // Exclude deleted events. Archived events should stay included - filter = and(cb, filter, cb.isFalse(from.get(Event.DELETED))); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isFalse(from.get(Event.DELETED))); return filter; } @@ -559,7 +560,7 @@ private Predicate createEventDateFilter(CriteriaQuery cq, CriteriaBuilder cb, cb.isNull(from.get(Event.START_DATE)), cb.isNull(from.get(Event.END_DATE)), cb.between(from.get(Event.REPORT_DATE_TIME), eventDateFrom, eventDateTo)); - filter = and(cb, filter, cb.or(eventDateFilter, reportFilter)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.or(eventDateFilter, reportFilter)); } return filter; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java index 2c192de00be..4dc123b2c46 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java @@ -197,12 +197,10 @@ public static OutbreakDto toDto(Outbreak source) { @RightsAllowed({ UserRight._DASHBOARD_SURVEILLANCE_VIEW, UserRight._DASHBOARD_CONTACT_VIEW }) - public Map getOutbreakDistrictNameByDisease(OutbreakCriteria criteria) { - return outbreakService.getOutbreakDistrictNameByDisease(criteria); - } - public Map getOutbreakDistrictCountByDisease(OutbreakCriteria criteria) { - return outbreakService.getOutbreakDistrictCountByDisease(criteria); + User user = userService.getCurrentUser(); + + return outbreakService.getOutbreakDistrictCountByDisease(criteria, user); } @Override @@ -210,7 +208,16 @@ public Map getOutbreakDistrictCountByDisease(OutbreakCriteria cri UserRight._DASHBOARD_SURVEILLANCE_VIEW, UserRight._DASHBOARD_CONTACT_VIEW }) public Long getOutbreakDistrictCount(OutbreakCriteria criteria) { - return outbreakService.getOutbreakDistrictCount(criteria); + User user = userService.getCurrentUser(); + + return outbreakService.getOutbreakDistrictCount(criteria, user); + } + + @RightsAllowed({ + UserRight._DASHBOARD_SURVEILLANCE_VIEW, + UserRight._DASHBOARD_CONTACT_VIEW }) + public Map getOutbreakDistrictNameByDisease(OutbreakCriteria criteria) { + return outbreakService.getOutbreakDistrictNameByDisease(criteria); } @LocalBean diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java index d2dd001ee14..aa622c51736 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java @@ -47,7 +47,6 @@ import de.symeda.sormas.backend.infrastructure.region.Region; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.util.QueryHelper; -import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; import java.util.HashMap; import de.symeda.sormas.backend.caze.Case; @@ -74,7 +73,7 @@ public List queryByCriteria(OutbreakCriteria criteria, User user, Stri Predicate filter = createUserFilter(cb, cq, from); Predicate activeDiseasePredicate = cb.exists(diseaseConfigurationService.existActiveDisease(cq, cb, from, Outbreak.DISEASE)); - filter = and(cb, filter, buildCriteriaFilter(criteria, cb, from), activeDiseasePredicate); + filter = CriteriaBuilderHelper.and(cb, filter, buildCriteriaFilter(criteria, cb, from), activeDiseasePredicate); if (filter != null) { cq.where(filter); @@ -110,7 +109,7 @@ public List queryByCriteria(OutbreakCriteria criteria, Integer first, } Predicate filter = createUserFilter(cb, cq, outbreak); - filter = and(cb, filter, buildCriteriaFilter(criteria, cb, outbreak)); + filter = CriteriaBuilderHelper.and(cb, filter, buildCriteriaFilter(criteria, cb, outbreak)); if (filter != null) { cq.where(filter); } @@ -132,7 +131,7 @@ public List queryUuidByCriteria(OutbreakCriteria criteria, User user, St } Predicate filter = createUserFilter(cb, cq, from); - filter = and(cb, filter, buildCriteriaFilter(criteria, cb, from)); + filter = CriteriaBuilderHelper.and(cb, filter, buildCriteriaFilter(criteria, cb, from)); if (filter != null) { cq.where(filter); } @@ -148,7 +147,7 @@ public Long countByCriteria(OutbreakCriteria criteria, User user) { Root from = cq.from(getElementClass()); Predicate filter = createUserFilter(cb, cq, from); - filter = and(cb, filter, buildCriteriaFilter(criteria, cb, from)); + filter = CriteriaBuilderHelper.and(cb, filter, buildCriteriaFilter(criteria, cb, from)); if (filter != null) { cq.where(filter); } @@ -169,16 +168,16 @@ public Predicate buildCriteriaFilter(OutbreakCriteria criteria, CriteriaBuilder Predicate filter = null; if (criteria.getChangeDateAfter() != null) { - filter = and(cb, filter, createChangeDateFilter(cb, from, criteria.getChangeDateAfter())); + filter = CriteriaBuilderHelper.and(cb, filter, createChangeDateFilter(cb, from, criteria.getChangeDateAfter())); } if (CollectionUtils.isNotEmpty(criteria.getDiseases())) { - filter = and(cb, filter, from.get(Outbreak.DISEASE).in(criteria.getDiseases())); + filter = CriteriaBuilderHelper.and(cb, filter, from.get(Outbreak.DISEASE).in(criteria.getDiseases())); } if (criteria.getDistrict() != null) { - filter = and(cb, filter, cb.equal(from.join(Outbreak.DISTRICT, JoinType.LEFT).get(District.UUID), criteria.getDistrict().getUuid())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.join(Outbreak.DISTRICT, JoinType.LEFT).get(District.UUID), criteria.getDistrict().getUuid())); } if (criteria.getRegion() != null) { - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, cb.equal( @@ -192,15 +191,54 @@ public Predicate buildCriteriaFilter(OutbreakCriteria criteria, CriteriaBuilder if (Boolean.FALSE.equals(criteria.getActive())) { activeFilter = cb.not(activeFilter); } - filter = and(cb, filter, activeFilter); + filter = CriteriaBuilderHelper.and(cb, filter, activeFilter); } if (criteria.getReportedDateFrom() != null || criteria.getReportedDateTo() != null) { - filter = and(cb, filter, cb.between(from.get(Outbreak.REPORT_DATE), criteria.getReportedDateFrom(), criteria.getReportedDateTo())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.between(from.get(Outbreak.REPORT_DATE), criteria.getReportedDateFrom(), criteria.getReportedDateTo())); } return filter; } + public Map getOutbreakDistrictCountByDisease(OutbreakCriteria criteria, User user) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Object[].class); + Root outbreak = cq.from(Outbreak.class); + cq.multiselect(outbreak.get(Outbreak.DISEASE), cb.countDistinct(outbreak.get(Outbreak.DISTRICT))); + cq.groupBy(outbreak.get(Outbreak.DISEASE)); + + Predicate filter = this.buildCriteriaFilter(criteria, cb, outbreak); + filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(cb, cq, outbreak)); + + if (filter != null) + cq.where(filter); + + List results = em.createQuery(cq).getResultList(); + + return results.stream().collect(Collectors.toMap(e -> (Disease) e[0], e -> (Long) e[1])); + } + + public Long getOutbreakDistrictCount(OutbreakCriteria criteria, User user) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root outbreak = cq.from(getElementClass()); + + Join regionJoin = outbreak.join(Outbreak.DISTRICT, JoinType.LEFT); + cq.groupBy(regionJoin); + + Predicate filter = this.buildCriteriaFilter(criteria, cb, outbreak); + filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(cb, cq, outbreak)); + + if (filter != null) + cq.where(filter); + + cq.select(cb.count(outbreak)); + + return em.createQuery(cq).getResultList().stream().findFirst().orElse(0L); + } + public Map getOutbreakDistrictNameByDisease(OutbreakCriteria criteria) { CriteriaBuilder cb = em.getCriteriaBuilder(); @@ -209,7 +247,7 @@ public Map getOutbreakDistrictNameByDisease(OutbreakCriteria Join districtJoin = outbreak.join(Case.DISTRICT, JoinType.LEFT); Predicate filter = this.buildCriteriaFilter(criteria, cb, outbreak); - filter = and(cb, filter, createUserFilter(cb, cq, outbreak)); + filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(cb, cq, outbreak)); if (filter != null) cq.where(filter); @@ -240,7 +278,7 @@ public Map getOutbreakDistrictCountByDisease(OutbreakCriteria cri cq.groupBy(outbreak.get(Outbreak.DISEASE)); Predicate filter = this.buildCriteriaFilter(criteria, cb, outbreak); - filter = and(cb, filter, createUserFilter(cb, cq, outbreak)); + filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(cb, cq, outbreak)); if (filter != null) cq.where(filter); @@ -260,7 +298,7 @@ public Long getOutbreakDistrictCount(OutbreakCriteria criteria) { cq.groupBy(regionJoin); Predicate filter = this.buildCriteriaFilter(criteria, cb, outbreak); - filter = and(cb, filter, createUserFilter(cb, cq, outbreak)); + filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(cb, cq, outbreak)); if (filter != null) cq.where(filter); 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 b153400e933..3e9c420a9fa 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 @@ -695,11 +695,11 @@ private Stream getContactLatestFollowUpEndDates(Date since Predicate filter = contactService.createUserFilter(new ContactQueryContext(cb, cq, new ContactJoins(contactRoot))); if (since != null) { - filter = and(cb, filter, contactService.createChangeDateFilter(cb, contactRoot, since)); + filter = CriteriaBuilderHelper.and(cb, filter, contactService.createChangeDateFilter(cb, contactRoot, since)); } if (forSymptomJournal) { - filter = and(cb, filter, cb.equal(personJoin.get(Person.SYMPTOM_JOURNAL_STATUS), SymptomJournalStatus.ACCEPTED)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(personJoin.get(Person.SYMPTOM_JOURNAL_STATUS), SymptomJournalStatus.ACCEPTED)); } if (filter != null) { @@ -724,11 +724,11 @@ private Stream getCaseLatestFollowUpEndDates(Date since, b Predicate filter = caseService.createUserFilter(new CaseQueryContext(cb, cq, new CaseJoins(caseRoot))); if (since != null) { - filter = and(cb, filter, caseService.createChangeDateFilter(cb, caseRoot, since)); + filter = CriteriaBuilderHelper.and(cb, filter, caseService.createChangeDateFilter(cb, caseRoot, since)); } if (forSymptomJournal) { - filter = and(cb, filter, cb.equal(personJoin.get(Person.SYMPTOM_JOURNAL_STATUS), SymptomJournalStatus.ACCEPTED)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(personJoin.get(Person.SYMPTOM_JOURNAL_STATUS), SymptomJournalStatus.ACCEPTED)); } if (filter != null) { @@ -765,13 +765,13 @@ private Date getContactLatestFollowUpEndDate(String uuid) { Join personJoin = contactRoot.join(Contact.PERSON, JoinType.LEFT); Predicate filter = contactService.createUserFilter(new ContactQueryContext(cb, cq, new ContactJoins(contactRoot))); - filter = and(cb, filter, cb.notEqual(contactRoot.get(Contact.FOLLOW_UP_STATUS), FollowUpStatus.CANCELED)); - filter = and(cb, filter, cb.notEqual(contactRoot.get(Contact.FOLLOW_UP_STATUS), FollowUpStatus.NO_FOLLOW_UP)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.notEqual(contactRoot.get(Contact.FOLLOW_UP_STATUS), FollowUpStatus.CANCELED)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.notEqual(contactRoot.get(Contact.FOLLOW_UP_STATUS), FollowUpStatus.NO_FOLLOW_UP)); - filter = and(cb, filter, cb.equal(contactRoot.get(Contact.DELETED), false)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(contactRoot.get(Contact.DELETED), false)); if (uuid != null) { - filter = and(cb, filter, cb.equal(personJoin.get(Person.UUID), uuid)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(personJoin.get(Person.UUID), uuid)); } if (filter != null) { @@ -797,10 +797,10 @@ private Date getCaseLatestFollowUpEndDate(String uuid) { Predicate filter = caseService.createUserFilter(new CaseQueryContext(cb, cq, new CaseJoins(caseRoot))); - filter = and(cb, filter, cb.equal(caseRoot.get(Case.DELETED), false)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(caseRoot.get(Case.DELETED), false)); if (uuid != null) { - filter = and(cb, filter, cb.equal(personJoin.get(Person.UUID), uuid)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(personJoin.get(Person.UUID), uuid)); } if (filter != null) { @@ -827,10 +827,10 @@ FollowUpStatus getMostRelevantFollowUpStatusByUuid(String uuid) { Join personContactJoin = contactRoot.join(Contact.PERSON, JoinType.LEFT); Predicate contactFilter = contactService.createUserFilter(new ContactQueryContext(cb, cq, new ContactJoins(contactRoot))); - contactFilter = and(cb, contactFilter, cb.equal(contactRoot.get(Contact.DELETED), false)); + contactFilter = CriteriaBuilderHelper.and(cb, contactFilter, cb.equal(contactRoot.get(Contact.DELETED), false)); if (uuid != null) { - contactFilter = and(cb, contactFilter, cb.equal(personContactJoin.get(Person.UUID), uuid)); + contactFilter = CriteriaBuilderHelper.and(cb, contactFilter, cb.equal(personContactJoin.get(Person.UUID), uuid)); } if (contactFilter != null) { cq.where(contactFilter); @@ -843,10 +843,10 @@ FollowUpStatus getMostRelevantFollowUpStatusByUuid(String uuid) { Join personCaseJoin = caseRoot.join(Case.PERSON, JoinType.LEFT); Predicate caseFilter = caseService.createUserFilter(new CaseQueryContext(cb, cq, new CaseJoins(caseRoot))); - caseFilter = and(cb, caseFilter, cb.equal(caseRoot.get(Case.DELETED), false)); + caseFilter = CriteriaBuilderHelper.and(cb, caseFilter, cb.equal(caseRoot.get(Case.DELETED), false)); if (uuid != null) { - caseFilter = and(cb, caseFilter, cb.equal(personCaseJoin.get(Person.UUID), uuid)); + caseFilter = CriteriaBuilderHelper.and(cb, caseFilter, cb.equal(personCaseJoin.get(Person.UUID), uuid)); } if (caseFilter != null) { @@ -1589,7 +1589,7 @@ private Predicate createIndexListFilter(PersonCriteria criteria, PersonQueryCont filter = service.createUserFilter(personQueryContext, criteria); if (criteria != null) { final Predicate criteriaFilter = service.buildCriteriaFilter(criteria, personQueryContext); - filter = and(cb, filter, criteriaFilter); + filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); } return filter; 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 15017bf0609..fbd10239d49 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 @@ -166,7 +166,7 @@ public List findBy(SampleCriteria criteria, User user, String sortProper Predicate filter = buildCriteriaFilter(criteria, sampleQueryContext); if (user != null) { - filter = and(cb, filter, createUserFilter(sampleQueryContext, null)); + filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(sampleQueryContext, null)); } if (filter != null) { cq.where(filter); @@ -364,7 +364,7 @@ public List getIndexListIds(SampleCriteria sampleCriteria, Integer first, if (sampleCriteria != null) { Predicate criteriaFilter = buildCriteriaFilter(sampleCriteria, sampleQueryContext); - filter = and(cb, filter, criteriaFilter); + filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); } if (filter != null) { @@ -488,9 +488,9 @@ public List getEntriesList(SampleCriteria sampleCriteria, In selections.addAll(getJurisdictionSelections(sampleQueryContext)); cq.multiselect(selections); - Predicate filter = and(cb, createDefaultFilter(cb, sample), createUserFilter(sampleQueryContext, sampleCriteria)); + Predicate filter = CriteriaBuilderHelper.and(cb, createDefaultFilter(cb, sample), createUserFilter(sampleQueryContext, sampleCriteria)); Predicate criteriaFilter = buildSampleListCriteriaFilter(sampleCriteria, cb, joins, sample); - filter = and(cb, filter, criteriaFilter); + filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); if (filter != null) { cq.where(filter); @@ -509,7 +509,7 @@ protected Predicate createRelevantDataFilter(CriteriaBuilder cb, CriteriaQuery c Predicate filter = createActiveSamplesFilter(sampleQueryContext); if (getCurrentUser() != null) { - filter = and(cb, filter, createUserFilter(sampleQueryContext, null)); + filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(sampleQueryContext, null)); } return filter; @@ -526,7 +526,7 @@ public List getAllActiveUuids(User user) { if (user != null) { Predicate userFilter = createUserFilter(sampleQueryContext, null); - filter = and(cb, filter, userFilter); + filter = CriteriaBuilderHelper.and(cb, filter, userFilter); } cq.where(filter); @@ -664,7 +664,7 @@ public Predicate createUserFilter(SampleQueryContext sampleQueryContext, SampleC eventParticipantService.createUserFilter(new EventParticipantQueryContext(cb, cq, joins.getEventParticipantJoins()))); } } else if (CollectionUtils.isNotEmpty(currentUser.getLimitedDiseases())) { - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, or( @@ -708,7 +708,7 @@ public Predicate createUserFilterWithoutAssociations(CriteriaBuilder cb, SampleJ } // Only show samples of a specific disease if a limited disease is set - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, CriteriaBuilderHelper.limitedDiseasePredicate( @@ -797,15 +797,15 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext Predicate filter = null; final SampleAssociationType sampleAssociationType = criteria.getSampleAssociationType(); if (sampleAssociationType == SampleAssociationType.CASE) { - filter = and(cb, filter, cb.isNotNull(joins.getCaze())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(joins.getCaze())); } else if (sampleAssociationType == SampleAssociationType.CONTACT) { - filter = and(cb, filter, cb.isNotNull(joins.getContact())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(joins.getContact())); } else if (sampleAssociationType == SampleAssociationType.EVENT_PARTICIPANT) { - filter = and(cb, filter, cb.isNotNull(joins.getEventParticipant())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(joins.getEventParticipant())); } if (criteria.getRegion() != null) { final String regionUuid = criteria.getRegion().getUuid(); - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, or( @@ -820,7 +820,7 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext } if (criteria.getDistrict() != null) { final String districtUuid = criteria.getDistrict().getUuid(); - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, or( @@ -838,23 +838,23 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext and(cb, filter, cb.equal(joins.getLab().get(AbstractDomainObject.UUID), criteria.getLaboratory().getUuid())); } if (criteria.getShipped() != null) { - filter = and(cb, filter, cb.equal(sample.get(Sample.SHIPPED), criteria.getShipped())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sample.get(Sample.SHIPPED), criteria.getShipped())); } if (criteria.getReceived() != null) { - filter = and(cb, filter, cb.equal(sample.get(Sample.RECEIVED), criteria.getReceived())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sample.get(Sample.RECEIVED), criteria.getReceived())); } if (criteria.getReferred() != null) { if (criteria.getReferred().equals(Boolean.TRUE)) { - filter = and(cb, filter, cb.isNotNull(sample.get(Sample.REFERRED_TO))); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(sample.get(Sample.REFERRED_TO))); } else { - filter = and(cb, filter, cb.isNull(sample.get(Sample.REFERRED_TO))); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isNull(sample.get(Sample.REFERRED_TO))); } } if (criteria.getPathogenTestResult() != null) { - filter = and(cb, filter, cb.equal(sample.get(Sample.PATHOGEN_TEST_RESULT), criteria.getPathogenTestResult())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sample.get(Sample.PATHOGEN_TEST_RESULT), criteria.getPathogenTestResult())); } if (criteria.getCaseClassification() != null) { - filter = and(cb, filter, cb.equal(joins.getCaze().get(Case.CASE_CLASSIFICATION), criteria.getCaseClassification())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getCaze().get(Case.CASE_CLASSIFICATION), criteria.getCaseClassification())); } if (criteria.getDisease() != null) { Expression diseaseExpression = cb.selectCase() @@ -863,42 +863,42 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext cb.selectCase() .when(cb.isNotNull(joins.getContact()), joins.getContact().get(Contact.DISEASE)) .otherwise(joins.getEvent().get(Event.DISEASE))); - filter = and(cb, filter, cb.equal(diseaseExpression, criteria.getDisease())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(diseaseExpression, criteria.getDisease())); } if (criteria.getCaze() != null) { - filter = and(cb, filter, cb.equal(joins.getCaze().get(Case.UUID), criteria.getCaze().getUuid())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getCaze().get(Case.UUID), criteria.getCaze().getUuid())); } if (criteria.getContact() != null) { - filter = and(cb, filter, cb.equal(joins.getContact().get(Contact.UUID), criteria.getContact().getUuid())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getContact().get(Contact.UUID), criteria.getContact().getUuid())); } if (criteria.getEventParticipant() != null) { - filter = and(cb, filter, cb.equal(joins.getEventParticipant().get(EventParticipant.UUID), criteria.getEventParticipant().getUuid())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getEventParticipant().get(EventParticipant.UUID), criteria.getEventParticipant().getUuid())); } if (criteria.getSampleReportDateFrom() != null && criteria.getSampleReportDateTo() != null) { - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, cb.between(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateFrom(), criteria.getSampleReportDateTo())); } else if (criteria.getSampleReportDateFrom() != null) { - filter = and(cb, filter, cb.greaterThanOrEqualTo(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateFrom())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.greaterThanOrEqualTo(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateFrom())); } else if (criteria.getSampleReportDateTo() != null) { filter = and(cb, filter, cb.lessThanOrEqualTo(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateTo())); } if (criteria.getSpecimenCondition() != null) { - filter = and(cb, filter, cb.equal(sample.get(Sample.SPECIMEN_CONDITION), criteria.getSpecimenCondition())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sample.get(Sample.SPECIMEN_CONDITION), criteria.getSpecimenCondition())); } if (criteria.getRelevanceStatus() != null) { if (criteria.getRelevanceStatus() == EntityRelevanceStatus.ACTIVE) { - filter = and(cb, filter, assignedToActiveEntity(cb, joins)); + filter = CriteriaBuilderHelper.and(cb, filter, assignedToActiveEntity(cb, joins)); } else if (criteria.getRelevanceStatus() == EntityRelevanceStatus.ARCHIVED) { - filter = and(cb, filter, allAssignedEntitiesAreArchived(cb, joins)); + filter = CriteriaBuilderHelper.and(cb, filter, allAssignedEntitiesAreArchived(cb, joins)); } else if (criteria.getRelevanceStatus() == EntityRelevanceStatus.DELETED) { - filter = and(cb, filter, cb.equal(sample.get(Sample.DELETED), true)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sample.get(Sample.DELETED), true)); } } if (criteria.getRelevanceStatus() != EntityRelevanceStatus.DELETED) { - filter = and(cb, filter, cb.isFalse(sample.get(Sample.DELETED))); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isFalse(sample.get(Sample.DELETED))); } if (criteria.getCaseCodeIdLike() != null) { @@ -927,7 +927,7 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext CriteriaBuilderHelper.ilike(cb, sample.get(Sample.LAB_SAMPLE_ID), textFilter), CriteriaBuilderHelper.ilike(cb, sample.get(Sample.FIELD_SAMPLE_ID), textFilter), CriteriaBuilderHelper.unaccentedIlike(cb, joins.getLab().get(Facility.NAME), textFilter)); - filter = and(cb, filter, likeFilters); + filter = CriteriaBuilderHelper.and(cb, filter, likeFilters); } } @@ -958,7 +958,7 @@ private Predicate addCaseContactEventParticipantSamplePredicate( filterEvPartUuids = sample.get(Sample.ASSOCIATED_EVENT_PARTICIPANT).get(EventParticipant.UUID).in(criteria.getEventParticipantUuids()); } - filter = and(cb, filter, or(cb, filterCaseUuids, filterContactUuids, filterEvPartUuids)); + filter = CriteriaBuilderHelper.and(cb, filter, or(cb, filterCaseUuids, filterContactUuids, filterEvPartUuids)); return filter; } @@ -966,21 +966,21 @@ private Predicate buildSampleListCriteriaFilter(SampleCriteria criteria, Criteri Predicate filter = null; final SampleAssociationType sampleAssociationType = criteria.getSampleAssociationType(); if (sampleAssociationType == SampleAssociationType.CASE) { - filter = and(cb, filter, cb.isNotNull(joins.getCaze())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(joins.getCaze())); } else if (sampleAssociationType == SampleAssociationType.CONTACT) { - filter = and(cb, filter, cb.isNotNull(joins.getContact())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(joins.getContact())); } else if (sampleAssociationType == SampleAssociationType.EVENT_PARTICIPANT) { - filter = and(cb, filter, cb.isNotNull(joins.getEventParticipant())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.isNotNull(joins.getEventParticipant())); } if (criteria.getCaze() != null) { - filter = and(cb, filter, cb.equal(joins.getCaze().get(Case.UUID), criteria.getCaze().getUuid())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getCaze().get(Case.UUID), criteria.getCaze().getUuid())); } if (criteria.getContact() != null) { - filter = and(cb, filter, cb.equal(joins.getContact().get(Contact.UUID), criteria.getContact().getUuid())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getContact().get(Contact.UUID), criteria.getContact().getUuid())); } if (criteria.getEventParticipant() != null) { - filter = and(cb, filter, cb.equal(joins.getEventParticipant().get(EventParticipant.UUID), criteria.getEventParticipant().getUuid())); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getEventParticipant().get(EventParticipant.UUID), criteria.getEventParticipant().getUuid())); } filter = addCaseContactEventParticipantSamplePredicate(criteria, cb, sample, filter); @@ -1269,8 +1269,8 @@ public List getAssociatedDiseaseVariants(String sampleUuid) { Predicate filter = createDefaultFilter(cb, from); - filter = and(cb, filter, cb.equal(from.get(AbstractDomainObject.UUID), sampleUuid)); - filter = and(cb, filter, cb.equal(pathogenTestJoin.get(DeletableAdo.DELETED), false)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(AbstractDomainObject.UUID), sampleUuid)); + filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(pathogenTestJoin.get(DeletableAdo.DELETED), false)); cq.where(filter); cq.select(pathogenTestJoin.get(PathogenTest.TESTED_DISEASE_VARIANT)); return em.createQuery(cq).getResultList(); @@ -1322,7 +1322,7 @@ public Predicate createUserFilterWithoutCase(CriteriaBuilder cb, SampleJoins joi // only show samples of a specific disease if a limited disease is set if (filter != null && currentUser.getLimitedDiseases() != null) { - filter = and( + filter = CriteriaBuilderHelper.and( cb, filter, cb.equal( diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java index 76888b5035f..7d0e73f0b43 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserFacadeEjb.java @@ -1096,10 +1096,7 @@ public void syncUsersFromAuthenticationProvider() { UserRight._SYSTEM }) public boolean isSyncEnabled() { AuthProvider authProvider = AuthProvider.getProvider(configFacade); - return KEYCLOAK.equalsIgnoreCase(authProvider.getName()) - && (featureConfigurationFacade.isFeatureDisabled(FeatureType.AUTH_PROVIDER_TO_SORMAS_USER_SYNC) - || StringUtils.isNotBlank(configFacade.getAuthenticationProviderSyncedNewUserRole())); - + return KEYCLOAK.equalsIgnoreCase(authProvider.getName()); } @Override diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index a2accce5dff..8aac9420f3f 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -1769,7 +1769,7 @@ ALTER TABLE samples_history ADD COLUMN reportLatLonAccuracy real; INSERT INTO schema_version (version_number, comment) VALUES (71, 'Add accuracy to lat lon data #371'); --- 2017-10-24 Monkeypox disease fields #366 +-- 2017-10-24 Mpox disease fields #366 ALTER TABLE symptoms ADD COLUMN cutaneouseruption varchar(255); ALTER TABLE symptoms ADD COLUMN lesions varchar(255); ALTER TABLE symptoms ADD COLUMN lesionssamestate varchar(255); @@ -1800,9 +1800,9 @@ ALTER TABLE epidata ADD COLUMN dateoflastexposure timestamp; ALTER TABLE epidata ADD COLUMN placeoflastexposure varchar(512); ALTER TABLE epidata ADD COLUMN animalcondition varchar(255); -INSERT INTO schema_version (version_number, comment) VALUES (72, 'Monkeypox disease fields #366'); +INSERT INTO schema_version (version_number, comment) VALUES (72, 'Mpox disease fields #366'); --- 2017-10-27 Monkeypox disease fields for history table #366 +-- 2017-10-27 Mpox disease fields for history table #366 ALTER TABLE symptoms_history ADD COLUMN cutaneouseruption varchar(255); ALTER TABLE symptoms_history ADD COLUMN lesions varchar(255); ALTER TABLE symptoms_history ADD COLUMN lesionssamestate varchar(255); @@ -1833,7 +1833,7 @@ ALTER TABLE epidata_history ADD COLUMN dateoflastexposure timestamp; ALTER TABLE epidata_history ADD COLUMN placeoflastexposure varchar(512); ALTER TABLE epidata_history ADD COLUMN animalcondition varchar(255); -INSERT INTO schema_version (version_number, comment) VALUES (73, 'Monkeypox disease fields for history table #366'); +INSERT INTO schema_version (version_number, comment) VALUES (73, 'Mpox disease fields for history table #366'); -- 2017-11-01 Plague disease fields #373 ALTER TABLE symptoms ADD COLUMN painfullymphadenitis varchar(255); @@ -1852,14 +1852,14 @@ ALTER TABLE sampletest_history ADD COLUMN fourfoldincreaseantibodytiter boolean; INSERT INTO schema_version (version_number, comment) VALUES (74, 'Plague disease fields #373'); --- 2017-11-02 Additional Monkeypox fields #375 +-- 2017-11-02 Additional Mpox fields #375 ALTER TABLE cases ADD COLUMN smallpoxvaccinationreceived varchar(255); ALTER TABLE cases ADD COLUMN smallpoxvaccinationdate timestamp; ALTER TABLE cases_history ADD COLUMN smallpoxvaccinationreceived varchar(255); ALTER TABLE cases_history ADD COLUMN smallpoxvaccinationdate timestamp; -INSERT INTO schema_version (version_number, comment) VALUES (75, 'Additional Monkeypox fields #375'); +INSERT INTO schema_version (version_number, comment) VALUES (75, 'Additional Mpox fields #375'); -- 2017-11-22 Population for districts #342 ALTER TABLE district ADD COLUMN population integer; @@ -1998,14 +1998,14 @@ ALTER TABLE cases RENAME COLUMN smallpoxvaccinationdate TO vaccinationdate; INSERT INTO schema_version (version_number, comment) VALUES (89, 'Date of vaccination for all diseases #486'); --- 2018-02-09 Monkeypox field changes #401 +-- 2018-02-09 Mpox field changes #401 ALTER TABLE symptoms DROP COLUMN cutaneouseruption; ALTER TABLE symptoms ADD COLUMN lesionsonsetdate timestamp; ALTER TABLE symptoms_history DROP COLUMN cutaneouseruption; ALTER TABLE symptoms_history ADD COLUMN lesionsonsetdate timestamp; -INSERT INTO schema_version (version_number, comment) VALUES (90, 'Monkeypox field changes #401'); +INSERT INTO schema_version (version_number, comment) VALUES (90, 'Mpox field changes #401'); -- 2018-02-09 History table updates @@ -8783,10 +8783,10 @@ DROP FUNCTION IF EXISTS create_vaccination(bigint, bigint, timestamp, bigint, ti /* Step 4: Clean up cases, contacts and event participants */ ALTER TABLE cases RENAME COLUMN vaccination TO vaccinationstatus; ALTER TABLE cases_history RENAME COLUMN vaccination TO vaccinationstatus; --- last vaccination date has been moved to the vaccination entity, but still has to be used for Monkeypox +-- last vaccination date has been moved to the vaccination entity, but still has to be used for Mpox ALTER TABLE cases RENAME COLUMN lastvaccinationdate TO smallpoxlastvaccinationdate; ALTER TABLE cases_history RENAME COLUMN lastvaccinationdate TO smallpoxlastvaccinationdate; -UPDATE cases SET smallpoxlastvaccinationdate = null WHERE disease != 'MONKEYPOX'; +UPDATE cases SET smallpoxlastvaccinationdate = null WHERE disease != 'Mpox'; ALTER TABLE cases DROP COLUMN vaccinationdoses; ALTER TABLE cases DROP COLUMN vaccinationinfosource; diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java index f1ca06dc350..1fcfca26d77 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java @@ -48,7 +48,6 @@ public void testGetAllActiveAsReference() { assertEquals(1, getRegionFacade().getAllActiveAsReference().size()); } - @Test public void testGetAllRegion() { // Arrange @@ -86,7 +85,6 @@ public void testGetByName() { assertEquals("region1", result1.getName()); } - @Test public void testGetIndexList_noCriteria() { // Arrange @@ -101,7 +99,6 @@ public void testGetIndexList_noCriteria() { assertEquals(2, results.size()); } - @Test public void testGetIndexList_withCriteriaAndSortProperties() { // Arrange @@ -129,7 +126,6 @@ public void testGetIndexList_withCriteriaAndSortProperties() { assertEquals("region3", result3.getName()); } - @Test public void testGetIndexList_withInvalidSortProperty() { // Arrange @@ -141,5 +137,4 @@ public void testGetIndexList_withInvalidSortProperty() { getRegionFacade().getIndexList(null, 0, 10, sortProperties); }); } - } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java index 6a8b93b2624..2875c1c3575 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjbTest.java @@ -34,7 +34,6 @@ import de.symeda.sormas.api.outbreak.OutbreakDto; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator.RDCF; -import org.mockito.InjectMocks; import de.symeda.sormas.backend.infrastructure.district.District; import java.util.HashSet; import java.util.Map; @@ -44,9 +43,6 @@ public class OutbreakFacadeEjbTest extends AbstractBeanTest { private RDCF rdcf; - @InjectMocks - private OutbreakFacadeEjb outbreakFacade; - @Override public void init() { super.init(); @@ -164,5 +160,4 @@ public void testGetOutbreakDistrictCount() { assertEquals(1, result); } - } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java index 70f3de7c037..8ebf253efc6 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java @@ -1263,6 +1263,5 @@ public void testGetEarliestPositiveSampleDate() { // Test - earliest positive sample date Date earliestPositiveSampleDate = getSampleFacade().getEarliestPositiveSampleDate(contact.getUuid()); assertEquals(new Date(2023 - 1900, 5, 15), earliestPositiveSampleDate); - } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java index 9e1065a6db3..bd736946ded 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java @@ -108,8 +108,8 @@ else if (DashboardType.CONTACTS.equals(e.getProperty().getValue())) { } else if (DashboardType.DISEASE.equals(e.getProperty().getValue())) { SormasUI.get().getNavigator().navigateTo(DiseaseDetailsView.VIEW_NAME); - } - else if (DashboardType.CAMPAIGNS.equals(e.getProperty().getValue())) { + } + else { SormasUI.get().getNavigator().navigateTo(CampaignDashboardView.VIEW_NAME); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java index 4b305d23868..7e4ae39a088 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java @@ -27,7 +27,6 @@ import de.symeda.sormas.ui.dashboard.contacts.ContactsDashboardView; import de.symeda.sormas.ui.dashboard.sample.SampleDashboardView; import de.symeda.sormas.ui.dashboard.surveillance.SurveillanceDashboardView; - import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java index f9589142a17..2e8845aae24 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/contacts/ContactsDashboardView.java @@ -52,6 +52,7 @@ public class ContactsDashboardView extends AbstractDashboardView { private static final int ROW_HEIGHT = 555; + protected DashboardDataProvider dashboardDataProvider; protected ContactsFilterLayout filterLayout; protected AbstractDashboardStatisticsComponent statisticsComponent; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index a70c5e5bdde..ca59882c586 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -888,14 +888,14 @@ protected void loadMapData(Date fromDate, Date toDate) { if (showCases) { showCaseMarkers( - FacadeProvider.getCaseFacade() - .getCasesForMap( - region, - district, - disease, - fromDate, - toDate, - showCurrentEpiSituation ? null : dashboardDataProvider.getNewCaseDateType())); + FacadeProvider.getCaseFacade() + .getCasesForMap( + region, + district, + disease, + fromDate, + toDate, + showCurrentEpiSituation ? null : dashboardDataProvider.getNewCaseDateType())); } if (showContacts) { showContactMarkers(FacadeProvider.getContactFacade().getContactsForMap(region, district, disease, fromDate, toDate)); @@ -1275,19 +1275,19 @@ public static AbstractOrderedLayout buildRegionLegend( } switch (caseMeasure) { - case CASE_COUNT: - legendEntry = buildMapIconLegendEntry( - "highest-region-small", - "> " + districtShapesUpperQuartile + " " + I18nProperties.getString(Strings.entityCases)); - break; - case CASE_INCIDENCE: - legendEntry = buildMapIconLegendEntry( - "highest-region-small", - "> " + DataHelper.getTruncatedBigDecimal(districtShapesUpperQuartile) + " " + I18nProperties.getString(Strings.entityCases) + " / " - + caseIncidenceDivisor); - break; - default: - throw new IllegalArgumentException(caseMeasure.toString()); + case CASE_COUNT: + legendEntry = buildMapIconLegendEntry( + "highest-region-small", + "> " + districtShapesUpperQuartile + " " + I18nProperties.getString(Strings.entityCases)); + break; + case CASE_INCIDENCE: + legendEntry = buildMapIconLegendEntry( + "highest-region-small", + "> " + DataHelper.getTruncatedBigDecimal(districtShapesUpperQuartile) + " " + I18nProperties.getString(Strings.entityCases) + " / " + + caseIncidenceDivisor); + break; + default: + throw new IllegalArgumentException(caseMeasure.toString()); } regionLegendLayout.addComponent(legendEntry); @@ -1338,14 +1338,14 @@ private void showRegionsShapes(CaseMeasure caseMeasure, Date fromDate, Date toDa map.addPolygonGroup(REGIONS_GROUP_ID, regionPolygons); List> measurePerDistrict = - FacadeProvider.getCaseFacade().getCaseMeasurePerDistrict(fromDate, toDate, disease, caseMeasure); + FacadeProvider.getCaseFacade().getCaseMeasurePerDistrict(fromDate, toDate, disease, caseMeasure); if (caseMeasure == CaseMeasure.CASE_COUNT) { districtValuesLowerQuartile = - measurePerDistrict.size() > 0 ? measurePerDistrict.get((int) (measurePerDistrict.size() * 0.25)).getElement1() : null; + measurePerDistrict.size() > 0 ? measurePerDistrict.get((int) (measurePerDistrict.size() * 0.25)).getElement1() : null; districtValuesMedian = - measurePerDistrict.size() > 0 ? measurePerDistrict.get((int) (measurePerDistrict.size() * 0.5)).getElement1() : null; + measurePerDistrict.size() > 0 ? measurePerDistrict.get((int) (measurePerDistrict.size() * 0.5)).getElement1() : null; districtValuesUpperQuartile = - measurePerDistrict.size() > 0 ? measurePerDistrict.get((int) (measurePerDistrict.size() * 0.75)).getElement1() : null; + measurePerDistrict.size() > 0 ? measurePerDistrict.get((int) (measurePerDistrict.size() * 0.75)).getElement1() : null; } else { // For case incidence, districts without or with a population <= 0 should not be // used for the calculation of the quartiles because they will falsify the @@ -1354,14 +1354,14 @@ private void showRegionsShapes(CaseMeasure caseMeasure, Date fromDate, Date toDa measurePerDistrictWithoutMissingPopulations.addAll(measurePerDistrict); measurePerDistrictWithoutMissingPopulations.removeIf(d -> d.getElement1() == null || d.getElement1().intValue() <= 0); districtValuesLowerQuartile = measurePerDistrictWithoutMissingPopulations.size() > 0 - ? measurePerDistrictWithoutMissingPopulations.get((int) (measurePerDistrictWithoutMissingPopulations.size() * 0.25)).getElement1() - : null; + ? measurePerDistrictWithoutMissingPopulations.get((int) (measurePerDistrictWithoutMissingPopulations.size() * 0.25)).getElement1() + : null; districtValuesMedian = measurePerDistrictWithoutMissingPopulations.size() > 0 - ? measurePerDistrictWithoutMissingPopulations.get((int) (measurePerDistrictWithoutMissingPopulations.size() * 0.5)).getElement1() - : null; + ? measurePerDistrictWithoutMissingPopulations.get((int) (measurePerDistrictWithoutMissingPopulations.size() * 0.5)).getElement1() + : null; districtValuesUpperQuartile = measurePerDistrictWithoutMissingPopulations.size() > 0 - ? measurePerDistrictWithoutMissingPopulations.get((int) (measurePerDistrictWithoutMissingPopulations.size() * 0.75)).getElement1() - : null; + ? measurePerDistrictWithoutMissingPopulations.get((int) (measurePerDistrictWithoutMissingPopulations.size() * 0.75)).getElement1() + : null; } List districtPolygons = new ArrayList(); @@ -1412,12 +1412,12 @@ private void showRegionsShapes(CaseMeasure caseMeasure, Date fromDate, Date toDa } private void clearCaseMarkers() { + map.removeGroup(CASES_GROUP_ID); markerCaseFacilities.clear(); casesByFacility.clear(); mapCaseDtos.clear(); mapAndFacilityCases.clear(); - } private void showCaseMarkers(List cases) { @@ -1464,7 +1464,6 @@ private void showCaseMarkers(List cases) { for (MapCaseDto caze : mapCaseDtos) { LeafletMarker marker = getLeafletMarker(caze); - caseMarkers.add(marker); } @@ -1582,18 +1581,18 @@ private void showContactMarkers(List contacts) { // icon = MarkerIcon.CONTACT_LONG_OVERDUE; // } switch (contact.getContactClassification()) { - case CONFIRMED: - icon = MarkerIcon.CONTACT_LONG_OVERDUE; - break; - case UNCONFIRMED: - icon = MarkerIcon.CONTACT_OVERDUE; - break; - case NO_CONTACT: - icon = MarkerIcon.CONTACT_OK; - break; - default: - icon = MarkerIcon.CONTACT_OK; - break; + case CONFIRMED: + icon = MarkerIcon.CONTACT_LONG_OVERDUE; + break; + case UNCONFIRMED: + icon = MarkerIcon.CONTACT_OVERDUE; + break; + case NO_CONTACT: + icon = MarkerIcon.CONTACT_OK; + break; + default: + icon = MarkerIcon.CONTACT_OK; + break; } LeafletMarker marker = new LeafletMarker(); @@ -1663,35 +1662,34 @@ private void showEventMarkers(List events) { protected void onMarkerClicked(String groupId, int markerIndex) { switch (groupId) { - case CASES_GROUP_ID: - if (markerIndex < markerCaseFacilities.size()) { - FacilityReferenceDto facility = markerCaseFacilities.get(markerIndex); - VerticalLayout layout = new VerticalLayout(); - Window window = VaadinUiUtil.showPopupWindow(layout); - CasePopupGrid caseGrid = new CasePopupGrid(window, facility, DashboardMapComponent.this); - caseGrid.setHeightMode(HeightMode.ROW); - layout.addComponent(caseGrid); - layout.setMargin(true); - FacilityDto facilityDto = FacadeProvider.getFacilityFacade().getByUuid(facility.getUuid()); - window.setCaption(I18nProperties.getCaption(Captions.dashboardCasesIn) + " " + facilityDto.buildCaption()); - } else { - markerIndex -= markerCaseFacilities.size(); - MapCaseDto caze = mapCaseDtos.get(markerIndex); - ControllerProvider.getCaseController().navigateToCase(caze.getUuid(), true); - } - break; - case CONTACTS_GROUP_ID: - MapContactDto contact = markerContacts.get(markerIndex); - ControllerProvider.getContactController().navigateToData(contact.getUuid(), true); - break; - case EVENTS_GROUP_ID: - DashboardEventDto event = markerEvents.get(markerIndex); - ControllerProvider.getEventController().navigateToData(event.getUuid(), true); - break; + case CASES_GROUP_ID: + if (markerIndex < markerCaseFacilities.size()) { + FacilityReferenceDto facility = markerCaseFacilities.get(markerIndex); + VerticalLayout layout = new VerticalLayout(); + Window window = VaadinUiUtil.showPopupWindow(layout); + CasePopupGrid caseGrid = new CasePopupGrid(window, facility, DashboardMapComponent.this); + caseGrid.setHeightMode(HeightMode.ROW); + layout.addComponent(caseGrid); + layout.setMargin(true); + FacilityDto facilityDto = FacadeProvider.getFacilityFacade().getByUuid(facility.getUuid()); + window.setCaption(I18nProperties.getCaption(Captions.dashboardCasesIn) + " " + facilityDto.buildCaption()); + } else { + markerIndex -= markerCaseFacilities.size(); + MapCaseDto caze = mapCaseDtos.get(markerIndex); + ControllerProvider.getCaseController().navigateToCase(caze.getUuid(), true); + } + break; + case CONTACTS_GROUP_ID: + MapContactDto contact = markerContacts.get(markerIndex); + ControllerProvider.getContactController().navigateToData(contact.getUuid(), true); + break; + case EVENTS_GROUP_ID: + DashboardEventDto event = markerEvents.get(markerIndex); + ControllerProvider.getEventController().navigateToData(event.getUuid(), true); + break; } } - private void refreshMapDashboard(boolean forced) { clearRegionShapes(); clearCaseMarkers(); @@ -1741,8 +1739,4 @@ private void makeMapOverlayInvisible() { overlayBackground.setVisible(false); overlayLayout.setVisible(false); } -} - - - - +} \ No newline at end of file diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java index 9ad85c8c107..3c97e2c32dc 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/SurveillanceFilterLayout.java @@ -9,7 +9,6 @@ import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; import de.symeda.sormas.ui.dashboard.surveillance.SurveillanceDashboardView; import de.symeda.sormas.ui.utils.components.datetypeselector.DateTypeSelectorComponent; -import de.symeda.sormas.api.dashboard.DashboardCriteria; public class SurveillanceFilterLayout extends DashboardFilterLayout { @@ -17,8 +16,7 @@ public class SurveillanceFilterLayout extends DashboardFilterLayout(NewCaseDateType.class).dateTypePrompt(I18nProperties.getString(Strings.promptNewCaseDateType)) .build(); - dateTypeSelectorComponent.setValue(dashboardDataProvider.getNewCaseDateType()); + dateTypeSelectorComponent.setValue(NewCaseDateType.MOST_RELEVANT); addCustomComponent(dateTypeSelectorComponent, DATE_TYPE_SELECTOR_FILTER); } - - public void setCriteria(DashboardCriteria criteria) { - super.setCriteria(criteria); - dateTypeSelectorComponent.setValue(criteria.getNewCaseDateType()); - } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleEditForm.java index 884df0d1fca..530e5d69aea 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/environmentsample/EnvironmentSampleEditForm.java @@ -369,10 +369,14 @@ private void addValidators() { } private Date getEarliestPathogenTestDate() { - List pathogenTests = FacadeProvider.getPathogenTestFacade().getAllByEnvironmentSample(getValue().toReference()); - if (pathogenTests.isEmpty()) { + if (!isCreate) { + List pathogenTests = FacadeProvider.getPathogenTestFacade().getAllByEnvironmentSample(getValue().toReference()); + if (pathogenTests.isEmpty()) { + return null; + } + return pathogenTests.stream().map(PathogenTestDto::getTestDateTime).filter(Objects::nonNull).min(Date::compareTo).orElseGet(() -> null); + } else { return null; } - return pathogenTests.stream().map(PathogenTestDto::getTestDateTime).filter(Objects::nonNull).min(Date::compareTo).orElseGet(() -> null); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java index 115313f799b..16c4f86b022 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserController.java @@ -347,6 +347,12 @@ public void setFlagIcons(ComboBox cbLanguage) { public void sync() { if (UiUtil.permitted(FeatureType.AUTH_PROVIDER_TO_SORMAS_USER_SYNC)) { + if (StringUtils.isBlank(FacadeProvider.getConfigFacade().getAuthenticationProviderSyncedNewUserRole())) { + VaadinUiUtil.showSimplePopupWindow( + I18nProperties.getString(Strings.headingSyncUsers), + I18nProperties.getString(Strings.messageSyncUsersFromAuthProviderConfigurationError)); + return; + } FacadeProvider.getUserFacade().syncUsersFromAuthenticationProvider(); SormasUI.refreshView(); } else { From 8d7ab41c51b9328df94378c765a6e519f6c831e4 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Mon, 16 Sep 2024 18:14:13 +0000 Subject: [PATCH 52/71] clean up after review --- .../SurveillanceDashboardCriteria.java | 2 +- .../sormas/backend/caze/CaseService.java | 38 +++-- .../backend/contact/ContactService.java | 24 +-- .../backend/dashboard/DashboardService.java | 2 +- .../sormas/backend/sample/SampleService.java | 36 +++-- .../symeda/sormas/backend/user/UserRole.java | 2 +- .../src/main/resources/sql/sormas_schema.sql | 2 +- .../caze/CaseUserFilterCriteriaTest.java | 2 +- .../dashboard/DashboardFacadeEjbTest.java | 1 - .../ui/dashboard/DashboardDataProvider.java | 14 +- .../components/DashboardFilterLayout.java | 1 - .../dashboard/map/DashboardMapComponent.java | 144 +++++++++--------- .../tile/RegionalDiseaseBurdenGrid.java | 1 - 13 files changed, 139 insertions(+), 130 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/SurveillanceDashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/SurveillanceDashboardCriteria.java index 59e412f5162..e9f7107ad47 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/SurveillanceDashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/SurveillanceDashboardCriteria.java @@ -6,7 +6,7 @@ public class SurveillanceDashboardCriteria extends DashboardCriteria { private NewCaseDateType newCaseDateType; - @Override + @Override public NewCaseDateType getNewCaseDateType() { return newCaseDateType; } 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 ff6c6b3019f..a4614958f30 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 @@ -415,15 +415,18 @@ private Predicate createMapCasesFilter( if (dateType == null) { filter = CriteriaBuilderHelper.and(cb, filter, createCaseRelevanceFilter(caseQueryContext, from, to)); } else { - filter = CriteriaBuilderHelper.and(cb, filter, createNewCaseFilter(caseQueryContext, DateHelper.getStartOfDay(from), DateHelper.getEndOfDay(to), dateType)); + filter = CriteriaBuilderHelper + .and(cb, filter, createNewCaseFilter(caseQueryContext, DateHelper.getStartOfDay(from), DateHelper.getEndOfDay(to), dateType)); } // only show cases which actually have GPS coordinates provided - Predicate personLatLonNotNull = and(cb, cb.isNotNull(joins.getPersonAddress().get(Location.LONGITUDE)), cb.isNotNull(joins.getPersonAddress().get(Location.LATITUDE))); + Predicate personLatLonNotNull = CriteriaBuilderHelper + .and(cb, cb.isNotNull(joins.getPersonAddress().get(Location.LONGITUDE)), cb.isNotNull(joins.getPersonAddress().get(Location.LATITUDE))); Predicate reportLatLonNotNull = - and(cb, cb.isNotNull(root.get(Case.REPORT_LON)), cb.isNotNull(root.get(Case.REPORT_LAT))); - Predicate facilityLatLonNotNull = and(cb, cb.isNotNull(joins.getFacility().get(Facility.LONGITUDE)), cb.isNotNull(joins.getFacility().get(Facility.LATITUDE))); - Predicate latLonProvided = or(cb, personLatLonNotNull, reportLatLonNotNull, facilityLatLonNotNull); + CriteriaBuilderHelper.and(cb, cb.isNotNull(root.get(Case.REPORT_LON)), cb.isNotNull(root.get(Case.REPORT_LAT))); + Predicate facilityLatLonNotNull = CriteriaBuilderHelper + .and(cb, cb.isNotNull(joins.getFacility().get(Facility.LONGITUDE)), cb.isNotNull(joins.getFacility().get(Facility.LATITUDE))); + Predicate latLonProvided = CriteriaBuilderHelper.or(cb, personLatLonNotNull, reportLatLonNotNull, facilityLatLonNotNull); filter = CriteriaBuilderHelper.and(cb, filter, latLonProvided); if (region != null) { @@ -710,15 +713,17 @@ public Predicate createCriteriaFilter(CaseCrite filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.FOLLOW_UP_STATUS), caseCriteria.getFollowUpStatus())); } if (caseCriteria.getFollowUpUntilFrom() != null && caseCriteria.getFollowUpUntilTo() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.between(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilFrom(), caseCriteria.getFollowUpUntilTo())); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.between(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilFrom(), caseCriteria.getFollowUpUntilTo())); } else if (caseCriteria.getFollowUpUntilFrom() != null) { filter = - and(cb, filter, cb.greaterThanOrEqualTo(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilFrom())); + CriteriaBuilderHelper.and(cb, filter, cb.greaterThanOrEqualTo(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilFrom())); } else if (caseCriteria.getFollowUpUntilTo() != null) { filter = CriteriaBuilderHelper.and(cb, filter, cb.lessThanOrEqualTo(from.get(Case.FOLLOW_UP_UNTIL), caseCriteria.getFollowUpUntilTo())); } if (caseCriteria.getSymptomJournalStatus() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPerson().get(Person.SYMPTOM_JOURNAL_STATUS), caseCriteria.getSymptomJournalStatus())); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.equal(joins.getPerson().get(Person.SYMPTOM_JOURNAL_STATUS), caseCriteria.getSymptomJournalStatus())); } if (caseCriteria.getVaccinationStatus() != null) { filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.VACCINATION_STATUS), caseCriteria.getVaccinationStatus())); @@ -734,20 +739,22 @@ public Predicate createCriteriaFilter(CaseCrite } if (caseCriteria.getHealthFacility() != null) { filter = - and(cb, filter, cb.equal(joins.getFacility().get(Facility.UUID), caseCriteria.getHealthFacility().getUuid())); + CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getFacility().get(Facility.UUID), caseCriteria.getHealthFacility().getUuid())); } if (caseCriteria.getFacilityTypeGroup() != null) { filter = - and(cb, filter, from.get(Case.FACILITY_TYPE).in(FacilityType.getTypes(caseCriteria.getFacilityTypeGroup()))); + CriteriaBuilderHelper.and(cb, filter, from.get(Case.FACILITY_TYPE).in(FacilityType.getTypes(caseCriteria.getFacilityTypeGroup()))); } if (caseCriteria.getFacilityType() != null) { filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.FACILITY_TYPE), caseCriteria.getFacilityType())); } if (caseCriteria.getPointOfEntry() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPointOfEntry().get(PointOfEntry.UUID), caseCriteria.getPointOfEntry().getUuid())); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.equal(joins.getPointOfEntry().get(PointOfEntry.UUID), caseCriteria.getPointOfEntry().getUuid())); } if (caseCriteria.getSurveillanceOfficer() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getSurveillanceOfficer().get(User.UUID), caseCriteria.getSurveillanceOfficer().getUuid())); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.equal(joins.getSurveillanceOfficer().get(User.UUID), caseCriteria.getSurveillanceOfficer().getUuid())); } if (caseCriteria.getCaseClassification() != null) { filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.get(Case.CASE_CLASSIFICATION), caseCriteria.getCaseClassification())); @@ -757,7 +764,7 @@ public Predicate createCriteriaFilter(CaseCrite } if (caseCriteria.getPresentCondition() != null) { filter = - and(cb, filter, cb.equal(joins.getPerson().get(Person.PRESENT_CONDITION), caseCriteria.getPresentCondition())); + CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getPerson().get(Person.PRESENT_CONDITION), caseCriteria.getPresentCondition())); } if (caseCriteria.getNewCaseDateFrom() != null && caseCriteria.getNewCaseDateTo() != null) { filter = CriteriaBuilderHelper.and( @@ -803,7 +810,8 @@ public Predicate createCriteriaFilter(CaseCrite } if (caseCriteria.getMustBePortHealthCaseWithoutFacility() != null && caseCriteria.getMustBePortHealthCaseWithoutFacility() == true) { filter = CriteriaBuilderHelper - .and(cb, filter, cb.and(cb.equal(from.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY), cb.isNull(joins.getFacility()))); } + .and(cb, filter, cb.and(cb.equal(from.get(Case.CASE_ORIGIN), CaseOrigin.POINT_OF_ENTRY), cb.isNull(joins.getFacility()))); + } if (caseCriteria.getMustHaveCaseManagementData() != null && caseCriteria.getMustHaveCaseManagementData() == true) { Subquery prescriptionSubquery = cq.subquery(Prescription.class); Root prescriptionRoot = prescriptionSubquery.from(Prescription.class); @@ -1527,7 +1535,7 @@ public Predicate createUserFilter(CaseQueryContext caseQueryContext, CaseUserFil filter = CriteriaBuilderHelper.and(cb, filter, limitedCaseSyncPredicate); } - Predicate limitedChangeDatePredicate = and(cb, createLimitedChangeDateFilter(cb, casePath)); + Predicate limitedChangeDatePredicate = CriteriaBuilderHelper.and(cb, createLimitedChangeDateFilter(cb, casePath)); if (limitedChangeDatePredicate != null) { filter = CriteriaBuilderHelper.and(cb, filter, limitedChangeDatePredicate); } 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 53eb31d262a..fdff566349e 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 @@ -414,7 +414,7 @@ private Predicate buildRelevantContactsFilter(Person person, Disease disease, Da filter = CriteriaBuilderHelper.and( cb, filter, - or( + CriteriaBuilderHelper.or( cb, CriteriaBuilderHelper.and( cb, @@ -427,14 +427,14 @@ private Predicate buildRelevantContactsFilter(Person person, Disease disease, Da filter = CriteriaBuilderHelper.and( cb, filter, - or( + CriteriaBuilderHelper.or( cb, // If the contact does not have a follow-up until date, use the last // contact/contact report date as a fallback CriteriaBuilderHelper.and( cb, cb.isNull(from.get(Contact.FOLLOW_UP_UNTIL)), - or( + CriteriaBuilderHelper.or( cb, CriteriaBuilderHelper.and( cb, @@ -632,7 +632,7 @@ private Predicate createMapContactsFilter(ContactQueryContext cqc, Region region cb.isNotNull(joins.getPersonJoins().getAddress().get(Location.LATITUDE))); Predicate reportLatLonNotNull = CriteriaBuilderHelper.and(cb, cb.isNotNull(contactRoot.get(Contact.REPORT_LON)), cb.isNotNull(contactRoot.get(Contact.REPORT_LAT))); - Predicate latLonProvided = or(cb, personLatLonNotNull, reportLatLonNotNull); + Predicate latLonProvided = CriteriaBuilderHelper.or(cb, personLatLonNotNull, reportLatLonNotNull); filter = CriteriaBuilderHelper.and(cb, filter, latLonProvided); return filter; @@ -1051,7 +1051,7 @@ public Predicate createUserFilter(ContactQueryContext contactQueryContext, Conta Predicate filter; if (userFilter != null) { - filter = or(cb, createUserFilterWithoutCase(contactQueryContext, contactCriteria), userFilter); + filter = CriteriaBuilderHelper.or(cb, createUserFilterWithoutCase(contactQueryContext, contactCriteria), userFilter); } else { filter = createUserFilterWithoutCase(contactQueryContext, contactCriteria); } @@ -1105,19 +1105,19 @@ public Predicate createUserFilterWithoutCase(ContactQueryContext qc, ContactCrit case REGION: final Region region = currentUser.getRegion(); if (region != null) { - filter = or(cb, filter, cb.equal(contactRoot.get(Contact.REGION), currentUser.getRegion())); + filter = CriteriaBuilderHelper.or(cb, filter, cb.equal(contactRoot.get(Contact.REGION), currentUser.getRegion())); } break; case DISTRICT: final District district = currentUser.getDistrict(); if (district != null) { - filter = or(cb, filter, cb.equal(contactRoot.get(Contact.DISTRICT), currentUser.getDistrict())); + filter = CriteriaBuilderHelper.or(cb, filter, cb.equal(contactRoot.get(Contact.DISTRICT), currentUser.getDistrict())); } break; case COMMUNITY: final Community community = currentUser.getCommunity(); if (community != null) { - filter = or(cb, filter, cb.equal(contactRoot.get(Contact.COMMUNITY), currentUser.getCommunity())); + filter = CriteriaBuilderHelper.or(cb, filter, cb.equal(contactRoot.get(Contact.COMMUNITY), currentUser.getCommunity())); } break; case LABORATORY: @@ -1128,7 +1128,7 @@ public Predicate createUserFilterWithoutCase(ContactQueryContext qc, ContactCrit sampleSubQuery.where(cb.and(cb.equal(contactJoin, contactRoot), sampleService.createUserFilterWithoutAssociations(cb, joins))); sampleSubQuery.select(sampleRoot.get(Sample.ID)); - filter = or(cb, filter, cb.exists(sampleSubQuery)); + filter = CriteriaBuilderHelper.or(cb, filter, cb.exists(sampleSubQuery)); break; default: } @@ -1186,7 +1186,7 @@ public Predicate buildCriteriaFilter(ContactCriteria contactCriteria, ContactQue filter = CriteriaBuilderHelper.and( cb, filter, - or( + CriteriaBuilderHelper.or( cb, cb.equal(joins.getRegion().get(Region.UUID), regionUuid), cb.equal(joins.getCaseRegion().get(Region.UUID), regionUuid), @@ -1199,7 +1199,7 @@ public Predicate buildCriteriaFilter(ContactCriteria contactCriteria, ContactQue filter = CriteriaBuilderHelper.and( cb, filter, - or( + CriteriaBuilderHelper.or( cb, cb.equal(joins.getDistrict().get(District.UUID), districtUuid), cb.equal(joins.getCaseDistrict().get(District.UUID), districtUuid), @@ -1210,7 +1210,7 @@ public Predicate buildCriteriaFilter(ContactCriteria contactCriteria, ContactQue filter = CriteriaBuilderHelper.and( cb, filter, - or( + CriteriaBuilderHelper.or( cb, cb.equal(joins.getCommunity().get(Community.UUID), communityUuid), cb.equal(joins.getCaseCommunity().get(Community.UUID), communityUuid), diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java index cdd8c58ed7f..f5a1ae9835e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java @@ -469,7 +469,7 @@ private Predicate createCaseCriteriaFilter( } if (dashboardCriteria.getDistrict() != null) { filter = - and(cb, filter, cb.equal(responsibleDistrict.get(District.UUID), dashboardCriteria.getDistrict().getUuid())); + CriteriaBuilderHelper.and(cb, filter, cb.equal(responsibleDistrict.get(District.UUID), dashboardCriteria.getDistrict().getUuid())); } if (dashboardCriteria.getDateFrom() != null && dashboardCriteria.getDateTo() != null) { filter = CriteriaBuilderHelper.and( 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 fbd10239d49..10806d430b4 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 @@ -654,11 +654,12 @@ public Predicate createUserFilter(SampleQueryContext sampleQueryContext, SampleC && criteria.getSampleAssociationType() != SampleAssociationType.PERSON) { final SampleAssociationType sampleAssociationType = criteria.getSampleAssociationType(); if (sampleAssociationType == SampleAssociationType.CASE) { - filter = or(cb, filter, caseService.createUserFilter(new CaseQueryContext(cb, cq, joins.getCaseJoins()), null)); + filter = CriteriaBuilderHelper.or(cb, filter, caseService.createUserFilter(new CaseQueryContext(cb, cq, joins.getCaseJoins()), null)); } else if (sampleAssociationType == SampleAssociationType.CONTACT && !RequestContextHolder.isMobileSync()) { - filter = or(cb, filter, contactService.createUserFilter(new ContactQueryContext(cb, cq, joins.getContactJoins()), null)); + filter = CriteriaBuilderHelper + .or(cb, filter, contactService.createUserFilter(new ContactQueryContext(cb, cq, joins.getContactJoins()), null)); } else if (sampleAssociationType == SampleAssociationType.EVENT_PARTICIPANT && !RequestContextHolder.isMobileSync()) { - filter = or( + filter = CriteriaBuilderHelper.or( cb, filter, eventParticipantService.createUserFilter(new EventParticipantQueryContext(cb, cq, joins.getEventParticipantJoins()))); @@ -667,7 +668,7 @@ public Predicate createUserFilter(SampleQueryContext sampleQueryContext, SampleC filter = CriteriaBuilderHelper.and( cb, filter, - or( + CriteriaBuilderHelper.or( cb, caseService.createUserFilter(new CaseQueryContext(cb, cq, joins.getCaseJoins()), null), RequestContextHolder.isMobileSync() @@ -677,7 +678,7 @@ public Predicate createUserFilter(SampleQueryContext sampleQueryContext, SampleC ? null : eventParticipantService.createUserFilter(new EventParticipantQueryContext(cb, cq, joins.getEventParticipantJoins())))); } else { - filter = or( + filter = CriteriaBuilderHelper.or( cb, filter, caseService.createUserFilter(new CaseQueryContext(cb, cq, joins.getCaseJoins()), null), @@ -703,8 +704,10 @@ public Predicate createUserFilterWithoutAssociations(CriteriaBuilder cb, SampleJ User currentUser = getCurrentUser(); final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); // Lab users can see samples assigned to their laboratory - if ((jurisdictionLevel == JurisdictionLevel.LABORATORY || jurisdictionLevel == JurisdictionLevel.EXTERNAL_LABORATORY) && currentUser.getLaboratory() != null) { - filter = or(cb, filter, cb.equal(joins.getLab(), currentUser.getLaboratory())); + if (jurisdictionLevel == JurisdictionLevel.LABORATORY || jurisdictionLevel == JurisdictionLevel.EXTERNAL_LABORATORY) { + if (currentUser.getLaboratory() != null) { + filter = CriteriaBuilderHelper.or(cb, filter, cb.equal(joins.getLab(), currentUser.getLaboratory())); + } } // Only show samples of a specific disease if a limited disease is set @@ -808,7 +811,7 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext filter = CriteriaBuilderHelper.and( cb, filter, - or( + CriteriaBuilderHelper.or( cb, cb.equal(joins.getCaseRegion().get(Region.UUID), regionUuid), cb.equal(joins.getCaseResponsibleRegion().get(Region.UUID), regionUuid), @@ -823,7 +826,7 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext filter = CriteriaBuilderHelper.and( cb, filter, - or( + CriteriaBuilderHelper.or( cb, cb.equal(joins.getCaseDistrict().get(District.UUID), districtUuid), cb.equal(joins.getCaseResponsibleDistrict().get(District.UUID), districtUuid), @@ -835,7 +838,7 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext } if (criteria.getLaboratory() != null) { filter = - and(cb, filter, cb.equal(joins.getLab().get(AbstractDomainObject.UUID), criteria.getLaboratory().getUuid())); + CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getLab().get(AbstractDomainObject.UUID), criteria.getLaboratory().getUuid())); } if (criteria.getShipped() != null) { filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sample.get(Sample.SHIPPED), criteria.getShipped())); @@ -872,7 +875,8 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getContact().get(Contact.UUID), criteria.getContact().getUuid())); } if (criteria.getEventParticipant() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getEventParticipant().get(EventParticipant.UUID), criteria.getEventParticipant().getUuid())); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.equal(joins.getEventParticipant().get(EventParticipant.UUID), criteria.getEventParticipant().getUuid())); } if (criteria.getSampleReportDateFrom() != null && criteria.getSampleReportDateTo() != null) { filter = CriteriaBuilderHelper.and( @@ -880,10 +884,11 @@ public Predicate buildCriteriaFilter(SampleCriteria criteria, SampleQueryContext filter, cb.between(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateFrom(), criteria.getSampleReportDateTo())); } else if (criteria.getSampleReportDateFrom() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.greaterThanOrEqualTo(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateFrom())); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.greaterThanOrEqualTo(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateFrom())); } else if (criteria.getSampleReportDateTo() != null) { filter = - and(cb, filter, cb.lessThanOrEqualTo(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateTo())); + CriteriaBuilderHelper.and(cb, filter, cb.lessThanOrEqualTo(sample.get(Sample.SAMPLE_DATE_TIME), criteria.getSampleReportDateTo())); } if (criteria.getSpecimenCondition() != null) { filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(sample.get(Sample.SPECIMEN_CONDITION), criteria.getSpecimenCondition())); @@ -958,7 +963,7 @@ private Predicate addCaseContactEventParticipantSamplePredicate( filterEvPartUuids = sample.get(Sample.ASSOCIATED_EVENT_PARTICIPANT).get(EventParticipant.UUID).in(criteria.getEventParticipantUuids()); } - filter = CriteriaBuilderHelper.and(cb, filter, or(cb, filterCaseUuids, filterContactUuids, filterEvPartUuids)); + filter = CriteriaBuilderHelper.and(cb, filter, CriteriaBuilderHelper.or(cb, filterCaseUuids, filterContactUuids, filterEvPartUuids)); return filter; } @@ -980,7 +985,8 @@ private Predicate buildSampleListCriteriaFilter(SampleCriteria criteria, Criteri filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getContact().get(Contact.UUID), criteria.getContact().getUuid())); } if (criteria.getEventParticipant() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(joins.getEventParticipant().get(EventParticipant.UUID), criteria.getEventParticipant().getUuid())); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.equal(joins.getEventParticipant().get(EventParticipant.UUID), criteria.getEventParticipant().getUuid())); } filter = addCaseContactEventParticipantSamplePredicate(criteria, cb, sample, filter); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserRole.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserRole.java index 5d6c38a4faa..55a2c10305c 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserRole.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/UserRole.java @@ -54,7 +54,7 @@ @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) public class UserRole extends AbstractDomainObject { - private static final long serialVersionUID = 9053095630718041842L; + private static final long serialVersionUID = 9053095630718041842L; public static final String TABLE_NAME = "userroles"; public static final String TABLE_NAME_EMAIL_NOTIFICATIONS = "userroles_emailnotificationtypes"; diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index 8aac9420f3f..0f680c86c01 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -8786,7 +8786,7 @@ ALTER TABLE cases_history RENAME COLUMN vaccination TO vaccinationstatus; -- last vaccination date has been moved to the vaccination entity, but still has to be used for Mpox ALTER TABLE cases RENAME COLUMN lastvaccinationdate TO smallpoxlastvaccinationdate; ALTER TABLE cases_history RENAME COLUMN lastvaccinationdate TO smallpoxlastvaccinationdate; -UPDATE cases SET smallpoxlastvaccinationdate = null WHERE disease != 'Mpox'; +UPDATE cases SET smallpoxlastvaccinationdate = null WHERE disease != 'MONKEYPOX'; ALTER TABLE cases DROP COLUMN vaccinationdoses; ALTER TABLE cases DROP COLUMN vaccinationinfosource; diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java index 316cb752e4f..ec621aa5971 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java @@ -38,4 +38,4 @@ public void testExcludeSharedCases() { criteria.excludeSharedCases(false); assertFalse(criteria.isExcludeSharedCases()); } -} +} \ No newline at end of file diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java index a0f275c1f44..6056b46ca12 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java @@ -313,7 +313,6 @@ private void createCasesForPersonWithCondition(PresentCondition presentCondition } } - @Test public void testGetCasesCountByClassification() { 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 feb332111f1..a4db71e2b27 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 @@ -80,9 +80,9 @@ public void refreshData() { // Update the entities lists according to the filters // Disease burden - List diseaseBurden = FacadeProvider.getDashboardFacade() - .getDiseaseBurden(region, district, fromDate, toDate, previousFromDate, previousToDate, newCaseDateType); - setDiseasesBurden(diseaseBurden); + setDiseasesBurden( + FacadeProvider.getDashboardFacade() + .getDiseaseBurden(region, district, fromDate, toDate, previousFromDate, previousToDate, newCaseDateType)); this.refreshDataForSelectedDisease(); } @@ -227,12 +227,10 @@ public void refreshDataForSelectedDisease() { setEvents(FacadeProvider.getDashboardFacade().getNewEvents(eventDashboardCriteria)); setEventCountByStatus(FacadeProvider.getDashboardFacade().getEventCountByStatus(eventDashboardCriteria)); - Long districtOutbreakCount = FacadeProvider.getOutbreakFacade() + setOutbreakDistrictCount( + FacadeProvider.getOutbreakFacade() .getOutbreakDistrictCount( - new OutbreakCriteria().region(region).district(district).disease(disease) - .reportedBetween(fromDate, toDate)); - - setOutbreakDistrictCount(districtOutbreakCount); + new OutbreakCriteria().region(region).district(district).disease(disease).reportedBetween(fromDate, toDate))); refreshDataForQuarantinedCases(); refreshDataForConvertedContactsToCase(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java index 9b3a512115a..d584c8ba4ef 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java @@ -123,7 +123,6 @@ public DashboardFilterLayout(AbstractDashboardView dashboardView, P dashboardDat this.districtFilter = ComboBoxHelper.createComboBoxV7(); dateFilterButtons = new HashSet<>(); dateComparisonButtons = new HashSet<>(); - this.caseClassificationFilter = ComboBoxHelper.createComboBoxV7(); setSpacing(true); setSizeUndefined(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index ca59882c586..890d1b44197 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -860,13 +860,13 @@ protected Long getMarkerCount(Date fromDate, Date toDate, int maxCount) { if (showCases) { count += FacadeProvider.getCaseFacade() - .countCasesForMap( - region, - district, - disease, - fromDate, - toDate, - showCurrentEpiSituation ? null : dashboardDataProvider.getNewCaseDateType()); + .countCasesForMap( + region, + district, + disease, + fromDate, + toDate, + showCurrentEpiSituation ? null : dashboardDataProvider.getNewCaseDateType()); } if (count < maxCount && showContacts) { @@ -888,7 +888,7 @@ protected void loadMapData(Date fromDate, Date toDate) { if (showCases) { showCaseMarkers( - FacadeProvider.getCaseFacade() + FacadeProvider.getCaseFacade() .getCasesForMap( region, district, @@ -1149,14 +1149,14 @@ protected List getLegendComponents() { Label districtsKeyLabel= createStyledLabel(); legendComponents.add(districtsKeyLabel); legendComponents.add( - buildRegionLegend( - false, - caseMeasure, - emptyPopulationDistrictPresent, - districtValuesLowerQuartile, - districtValuesMedian, - districtValuesUpperQuartile, - InfrastructureHelper.CASE_INCIDENCE_DIVISOR)); + buildRegionLegend( + false, + caseMeasure, + emptyPopulationDistrictPresent, + districtValuesLowerQuartile, + districtValuesMedian, + districtValuesUpperQuartile, + InfrastructureHelper.CASE_INCIDENCE_DIVISOR)); Label descLabel = new Label(I18nProperties.getString(Strings.infoDashboardIncidence)); CssStyles.style(descLabel, CssStyles.LABEL_SMALL); @@ -1194,13 +1194,13 @@ public static HorizontalLayout buildMapIconLegendEntry(String iconName, String l } public static AbstractOrderedLayout buildRegionLegend( - boolean vertical, - CaseMeasure caseMeasure, - boolean emptyPopulationDistrictPresent, - BigDecimal districtShapesLowerQuartile, - BigDecimal districtShapesMedian, - BigDecimal districtShapesUpperQuartile, - int caseIncidenceDivisor) { + boolean vertical, + CaseMeasure caseMeasure, + boolean emptyPopulationDistrictPresent, + BigDecimal districtShapesLowerQuartile, + BigDecimal districtShapesMedian, + BigDecimal districtShapesUpperQuartile, + int caseIncidenceDivisor) { AbstractOrderedLayout regionLegendLayout = vertical ? new VerticalLayout() : new HorizontalLayout(); regionLegendLayout.setSpacing(true); CssStyles.style(regionLegendLayout, CssStyles.LAYOUT_MINIMAL); @@ -1208,43 +1208,43 @@ public static AbstractOrderedLayout buildRegionLegend( HorizontalLayout legendEntry; switch (caseMeasure) { + case CASE_COUNT: + legendEntry = buildMapIconLegendEntry( + "lowest-region-small", + districtShapesLowerQuartile.compareTo(BigDecimal.ONE) > 0 + ? "1 - " + districtShapesLowerQuartile + " " + I18nProperties.getString(Strings.entityCases) + : "1 " + I18nProperties.getString(Strings.entityCase)); + break; + case CASE_INCIDENCE: + legendEntry = buildMapIconLegendEntry( + "lowest-region-small", + "<= " + DataHelper.getTruncatedBigDecimal(districtShapesLowerQuartile) + " " + I18nProperties.getString(Strings.entityCases) + " / " + + caseIncidenceDivisor); + break; + default: + throw new IllegalArgumentException(caseMeasure.toString()); + } + regionLegendLayout.addComponent(legendEntry); + + if (districtShapesLowerQuartile.compareTo(districtShapesMedian) < 0) { + switch (caseMeasure) { case CASE_COUNT: legendEntry = buildMapIconLegendEntry( - "lowest-region-small", - districtShapesLowerQuartile.compareTo(BigDecimal.ONE) > 0 - ? "1 - " + districtShapesLowerQuartile + " " + I18nProperties.getString(Strings.entityCases) - : "1 " + I18nProperties.getString(Strings.entityCase)); + "low-region-small", + districtShapesMedian.compareTo(districtShapesLowerQuartile.add(BigDecimal.ONE)) > 0 + ? districtShapesLowerQuartile.add(BigDecimal.ONE) + " - " + districtShapesMedian + " " + + I18nProperties.getString(Strings.entityCases) + : districtShapesMedian + " " + I18nProperties.getString(Strings.entityCases)); break; case CASE_INCIDENCE: legendEntry = buildMapIconLegendEntry( - "lowest-region-small", - "<= " + DataHelper.getTruncatedBigDecimal(districtShapesLowerQuartile) + " " + I18nProperties.getString(Strings.entityCases) + " / " - + caseIncidenceDivisor); + "low-region-small", + DataHelper.getTruncatedBigDecimal(districtShapesLowerQuartile.add(new BigDecimal(0.1)).setScale(1, RoundingMode.HALF_UP)) + " - " + + DataHelper.getTruncatedBigDecimal(districtShapesMedian) + " " + I18nProperties.getString(Strings.entityCases) + " / " + + caseIncidenceDivisor); break; default: throw new IllegalArgumentException(caseMeasure.toString()); - } - regionLegendLayout.addComponent(legendEntry); - - if (districtShapesLowerQuartile.compareTo(districtShapesMedian) < 0) { - switch (caseMeasure) { - case CASE_COUNT: - legendEntry = buildMapIconLegendEntry( - "low-region-small", - districtShapesMedian.compareTo(districtShapesLowerQuartile.add(BigDecimal.ONE)) > 0 - ? districtShapesLowerQuartile.add(BigDecimal.ONE) + " - " + districtShapesMedian + " " - + I18nProperties.getString(Strings.entityCases) - : districtShapesMedian + " " + I18nProperties.getString(Strings.entityCases)); - break; - case CASE_INCIDENCE: - legendEntry = buildMapIconLegendEntry( - "low-region-small", - DataHelper.getTruncatedBigDecimal(districtShapesLowerQuartile.add(new BigDecimal(0.1)).setScale(1, RoundingMode.HALF_UP)) + " - " - + DataHelper.getTruncatedBigDecimal(districtShapesMedian) + " " + I18nProperties.getString(Strings.entityCases) + " / " - + caseIncidenceDivisor); - break; - default: - throw new IllegalArgumentException(caseMeasure.toString()); } regionLegendLayout.addComponent(legendEntry); @@ -1252,23 +1252,23 @@ public static AbstractOrderedLayout buildRegionLegend( if (districtShapesMedian.compareTo(districtShapesUpperQuartile) < 0) { switch (caseMeasure) { - case CASE_COUNT: - legendEntry = buildMapIconLegendEntry( - "high-region-small", - districtShapesUpperQuartile.compareTo(districtShapesMedian.add(BigDecimal.ONE)) > 0 - ? districtShapesMedian.add(BigDecimal.ONE) + " - " + districtShapesUpperQuartile + " " - + I18nProperties.getString(Strings.entityCases) - : districtShapesUpperQuartile + " " + I18nProperties.getString(Strings.entityCases)); - break; - case CASE_INCIDENCE: - legendEntry = buildMapIconLegendEntry( - "high-region-small", - DataHelper.getTruncatedBigDecimal(districtShapesMedian.add(new BigDecimal(0.1)).setScale(1, RoundingMode.HALF_UP)) + " - " - + DataHelper.getTruncatedBigDecimal(districtShapesUpperQuartile) + " " + I18nProperties.getString(Strings.entityCases) + " / " - + caseIncidenceDivisor); - break; - default: - throw new IllegalArgumentException(caseMeasure.toString()); + case CASE_COUNT: + legendEntry = buildMapIconLegendEntry( + "high-region-small", + districtShapesUpperQuartile.compareTo(districtShapesMedian.add(BigDecimal.ONE)) > 0 + ? districtShapesMedian.add(BigDecimal.ONE) + " - " + districtShapesUpperQuartile + " " + + I18nProperties.getString(Strings.entityCases) + : districtShapesUpperQuartile + " " + I18nProperties.getString(Strings.entityCases)); + break; + case CASE_INCIDENCE: + legendEntry = buildMapIconLegendEntry( + "high-region-small", + DataHelper.getTruncatedBigDecimal(districtShapesMedian.add(new BigDecimal(0.1)).setScale(1, RoundingMode.HALF_UP)) + " - " + + DataHelper.getTruncatedBigDecimal(districtShapesUpperQuartile) + " " + I18nProperties.getString(Strings.entityCases) + " / " + + caseIncidenceDivisor); + break; + default: + throw new IllegalArgumentException(caseMeasure.toString()); } regionLegendLayout.addComponent(legendEntry); @@ -1501,7 +1501,7 @@ private void fillCaseLists(List cases) { if (caseClassificationOption == MapCaseClassificationOption.CONFIRMED_CASES_ONLY && classification != CaseClassification.CONFIRMED) continue; boolean hasCaseGps = - (caze.getAddressLat() != null && caze.getAddressLon() != null) || (caze.getReportLat() != null && caze.getReportLon() != null); + (caze.getAddressLat() != null && caze.getAddressLon() != null) || (caze.getReportLat() != null && caze.getReportLon() != null); boolean hasFacilityGps = caze.getHealthFacilityLat() != null && caze.getHealthFacilityLon() != null; if (mapCaseDisplayMode == MapCaseDisplayMode.CASE_ADDRESS) { @@ -1511,8 +1511,8 @@ private void fillCaseLists(List cases) { mapCaseDtos.add(caze); } else { if (FacilityDto.NONE_FACILITY_UUID.equals(caze.getHealthFacilityUuid()) - || FacilityDto.OTHER_FACILITY_UUID.equals(caze.getHealthFacilityUuid()) - || !hasFacilityGps) { + || FacilityDto.OTHER_FACILITY_UUID.equals(caze.getHealthFacilityUuid()) + || !hasFacilityGps) { if (mapCaseDisplayMode == MapCaseDisplayMode.FACILITY_OR_CASE_ADDRESS) { if (!hasCaseGps) { continue; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java index a3021b23e80..6b7103cc252 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -311,5 +311,4 @@ public String element(String type, String style, String content) { return sb.toString(); } - } From 1d09aa631e05f3cc955fb8f2b1728601fe4fd3f8 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Mon, 16 Sep 2024 18:43:00 +0000 Subject: [PATCH 53/71] clean up after review --- .../sormas/api/disease/DiseaseBurdenDto.java | 50 +++++-------------- .../backend/disease/DiseaseFacadeEjbTest.java | 4 +- 2 files changed, 15 insertions(+), 39 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java index b4efcd25a59..ca1b2d2a844 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java @@ -93,8 +93,8 @@ public class DiseaseBurdenDto implements Serializable { private String otherCount; - private Date to; - private Date from; + private Date toDate; + private Date fromDate; public DiseaseBurdenDto( RegionDto regionDto, @@ -152,8 +152,8 @@ public DiseaseBurdenDto( this.caseDeathCount = caseDeathCount; this.lastReportedDistrictName = lastReportedDistrictName; this.outbreakDistrict = outbreakDistrict; - this.from= from; - this.to=to; + this.fromDate = from; + this.toDate =to; } public DiseaseBurdenDto( @@ -366,94 +366,70 @@ public void setTotal(String total) { this.total = total; } - - public Date getTo() { - return to; + public Date getToDate() { + return toDate; } - - public void setTo(Date to) { - this.to = to; + public void setToDate(Date toDate) { + this.toDate = toDate; } - - public Date getFrom() { - return from; + public Date getFromDate() { + return fromDate; } - - public void setFrom(Date from) { - this.from = from; + public void setFromDate(Date fromDate) { + this.fromDate = fromDate; } - - public String getTotalCount() { return totalCount; } - public void setTotalCount(String totalCount) { this.totalCount = totalCount; } - public String getDeathsCount() { return deathsCount; } - public void setDeathsCount(String deathsCount) { this.deathsCount = deathsCount; } - public String getRecoveredCount() { return recoveredCount; } - public void setRecoveredCount(String recoveredCount) { this.recoveredCount = recoveredCount; } - - - - public String getActiveCount() { return activeCount; } - public void setActiveCount(String activeCount) { this.activeCount = activeCount; } - public String getOther() { return other; } - public void setOther(String other) { this.other = other; } - - - - public String getOtherCount() { return otherCount; } - public void setOtherCount(String otherCount) { this.otherCount = otherCount; } - @Override public String toString() { return "DiseaseBurdenDto [disease=" + disease + ", total=" + total + ", caseCount=" + caseCount @@ -462,6 +438,6 @@ public String toString() { + lastReportedDistrictName + ", caseClassification=" + caseClassification + ", cfr=" + cfr + ", lastReportedDistrict=" + lastReportedDistrict + ", outbreakDistrict=" + outbreakDistrict + ", deaths=" + deaths + ", region=" + region + ", recovered=" + recovered + ", activeCases=" - + activeCases + ", to=" + to + ", from=" + from + "]"; + + activeCases + ", toDate=" + toDate + ", fromDate=" + fromDate + "]"; } } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java index 42cbf9303fc..2672a7b496a 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java @@ -64,8 +64,8 @@ public void testGetDiseaseForDashboard() { assertEquals(0L, result.getCaseDeathCount()); assertEquals("", result.getLastReportedDistrictName()); assertEquals("", result.getOutbreakDistrict()); - assertEquals(fromDate, result.getFrom()); - assertEquals(toDate, result.getTo()); + assertEquals(fromDate, result.getFromDate()); + assertEquals(toDate, result.getToDate()); } @Test From 394a5e2ccebf73919409200f585d22f3e9d5025b Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 17 Sep 2024 10:32:16 +0000 Subject: [PATCH 54/71] clean up after review --- .../sormas/api/event/EventCriteria.java | 2 +- .../de/symeda/sormas/api/i18n/Strings.java | 11 ---- .../backend/person/PersonFacadeEjb.java | 3 +- .../sormas/backend/sample/SampleService.java | 1 - .../de/symeda/sormas/backend/user/User.java | 2 +- .../ui/dashboard/AbstractDashboardView.java | 2 +- .../disease/tile/DiseaseTileComponent.java | 13 +++-- .../tile/RegionalDiseaseBurdenGrid.java | 57 +------------------ .../disease/DiseaseDashboardServiceTest.java | 2 - 9 files changed, 14 insertions(+), 79 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventCriteria.java index 6fac7327f45..3bfb417870b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventCriteria.java @@ -567,7 +567,7 @@ public DateFilterOption getActionDateFilterOption() { return actionDateFilterOption; } - public enum DateType { + public enum DateType { EVENT, EVENT_SIGNAL_EVOLUTION, ACTION_CHANGE, diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java index b5ccbe197c2..ed87fae2ee3 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java @@ -190,8 +190,6 @@ public interface Strings { String confirmationVaccinationStatusUpdate = "confirmationVaccinationStatusUpdate"; String confirmExternalMessageCorrectionThrough = "confirmExternalMessageCorrectionThrough"; String confirmNetworkDiagramTooManyContacts = "confirmNetworkDiagramTooManyContacts"; - String confirmPassword = "confirmPassword"; - String currentPassword = "currentPassword"; String date = "date"; String day = "day"; String DefaultPassword_newPassword = "DefaultPassword.newPassword"; @@ -462,7 +460,6 @@ public interface Strings { String headingcasesWithReferenceDefinitionFulfilled = "headingcasesWithReferenceDefinitionFulfilled"; String headingCaution = "headingCaution"; String headingChangeCaseDisease = "headingChangeCaseDisease"; - String headingChangePassword = "headingChangePassword"; String headingChangePathogenTestResult = "headingChangePathogenTestResult"; String headingClinicalMeasurements = "headingClinicalMeasurements"; String headingClinicalVisitsDeleted = "headingClinicalVisitsDeleted"; @@ -846,7 +843,6 @@ public interface Strings { String headingUpdatedPersonInformation = "headingUpdatedPersonInformation"; String headingUpdatedSampleInformation = "headingUpdatedSampleInformation"; String headingUpdatePassword = "headingUpdatePassword"; - String headingUpdatePasswordFailed = "headingUpdatePasswordFailed"; String headingUpdatePersonContactDetails = "headingUpdatePersonContactDetails"; String headingUploadSuccess = "headingUploadSuccess"; String headingUserData = "headingUserData"; @@ -1394,8 +1390,6 @@ public interface Strings { String messageMissingDateFilter = "messageMissingDateFilter"; String messageMissingEpiWeekFilter = "messageMissingEpiWeekFilter"; String messageMultipleSampleReports = "messageMultipleSampleReports"; - String messageNewPasswordDoesNotMatchFailed = "messageNewPasswordDoesNotMatchFailed"; - String messageNewPasswordFailed = "messageNewPasswordFailed"; String messageNoCaseFound = "messageNoCaseFound"; String messageNoCaseFoundToLinkImmunization = "messageNoCaseFoundToLinkImmunization"; String messageNoCasesSelected = "messageNoCasesSelected"; @@ -1433,8 +1427,6 @@ public interface Strings { String messageNoVisitsSelected = "messageNoVisitsSelected"; String messageOtherDeleteReasonNotFilled = "messageOtherDeleteReasonNotFilled"; String messageOutbreakSaved = "messageOutbreakSaved"; - String messagePasswordChange = "messagePasswordChange"; - String messagePasswordFailed = "messagePasswordFailed"; String messagePasswordReset = "messagePasswordReset"; String messagePasswordResetEmailLink = "messagePasswordResetEmailLink"; String messagePathogenTestSaved = "messagePathogenTestSaved"; @@ -1546,7 +1538,6 @@ public interface Strings { String messageVisitsDeleted = "messageVisitsDeleted"; String messageVisitsWithWrongStatusNotCancelled = "messageVisitsWithWrongStatusNotCancelled"; String messageVisitsWithWrongStatusNotSetToLost = "messageVisitsWithWrongStatusNotSetToLost"; - String messageWrongCurrentPassword = "messageWrongCurrentPassword"; String messageWrongFileType = "messageWrongFileType"; String messageWrongTemplateFileType = "messageWrongTemplateFileType"; String min = "min"; @@ -1612,7 +1603,6 @@ public interface Strings { String of = "of"; String on = "on"; String or = "or"; - String passwordStrength = "passwordStrength"; String pathogenTestDeletedDuringLabMessageConversion = "pathogenTestDeletedDuringLabMessageConversion"; String pleaseSpecify = "pleaseSpecify"; String populationDataByArea = "populationDataByArea"; @@ -1764,7 +1754,6 @@ public interface Strings { String unsavedChanges_warningMessage = "unsavedChanges.warningMessage"; String unsavedChanges_warningTitle = "unsavedChanges.warningTitle"; String until = "until"; - String updatePassword = "updatePassword"; String uuidOf = "uuidOf"; String warningDashboardMapTooManyMarkers = "warningDashboardMapTooManyMarkers"; String warningNetworkDiagramTooManyContacts = "warningNetworkDiagramTooManyContacts"; 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 3e9c420a9fa..4b376cbcc6e 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 @@ -1072,7 +1072,8 @@ public boolean exists(String uuid) { @Override public boolean doesExternalTokenExist(String externalToken, String personUuid) { return service.exists( - (cb, personRoot, cq) -> and(cb, cb.equal(personRoot.get(Person.EXTERNAL_TOKEN), externalToken), cb.notEqual(personRoot.get(Person.UUID), personUuid))); + (cb, personRoot, cq) -> CriteriaBuilderHelper + .and(cb, cb.equal(personRoot.get(Person.EXTERNAL_TOKEN), externalToken), cb.notEqual(personRoot.get(Person.UUID), personUuid))); } @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 10806d430b4..1e01d39c366 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 @@ -115,7 +115,6 @@ import de.symeda.sormas.backend.util.ModelConstants; import de.symeda.sormas.backend.util.Pseudonymizer; import de.symeda.sormas.backend.util.QueryHelper; -import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.or; import java.math.BigInteger; import javax.persistence.Query; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/User.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/User.java index b5d9cf11793..bd3ab43b94e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/user/User.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/user/User.java @@ -386,7 +386,7 @@ public static String buildCaptionForNotification(User user) { return caption; } - static class UserListener { + static class UserListener { @PostPersist @PostUpdate diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java index bd736946ded..74dd086cef8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java @@ -108,7 +108,7 @@ else if (DashboardType.CONTACTS.equals(e.getProperty().getValue())) { } else if (DashboardType.DISEASE.equals(e.getProperty().getValue())) { SormasUI.get().getNavigator().navigateTo(DiseaseDetailsView.VIEW_NAME); - } + } else { SormasUI.get().getNavigator().navigateTo(CampaignDashboardView.VIEW_NAME); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java index 0398e2b6495..35aed39c35d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java @@ -71,9 +71,12 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo nameLayout.setWidth(100, Unit.PERCENTAGE); nameLayout.setHeight(100, Unit.PERCENTAGE); Label nameLabel = new Label(disease.toShortString()); - nameLabel.addStyleNames(CssStyles.LABEL_WHITE, - nameLabel.getValue().length() > 12 ? CssStyles.LABEL_LARGE : CssStyles.LABEL_XLARGE, - CssStyles.LABEL_BOLD, CssStyles.ALIGN_CENTER, CssStyles.LABEL_UPPERCASE); + nameLabel.addStyleNames( + CssStyles.LABEL_WHITE, + nameLabel.getValue().length() > 12 ? CssStyles.LABEL_LARGE : CssStyles.LABEL_XLARGE, + CssStyles.LABEL_BOLD, + CssStyles.ALIGN_CENTER, + CssStyles.LABEL_UPPERCASE); nameLayout.addComponent(nameLabel); nameLayout.setComponentAlignment(nameLabel, Alignment.MIDDLE_CENTER); nameAndOutbreakLayout.addComponent(nameLayout); @@ -104,8 +107,8 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo countLayout.setWidth(100, Unit.PERCENTAGE); Label countLabel = new Label(casesCount.toString()); - countLabel.addStyleNames(CssStyles.LABEL_WHITE, CssStyles.LABEL_BOLD, CssStyles.LABEL_XXXLARGE, - CssStyles.ALIGN_CENTER, CssStyles.VSPACE_TOP_4); + countLabel + .addStyleNames(CssStyles.LABEL_WHITE, CssStyles.LABEL_BOLD, CssStyles.LABEL_XXXLARGE, CssStyles.ALIGN_CENTER, CssStyles.VSPACE_TOP_4); countLayout.addComponent(countLabel); countLayout.setComponentAlignment(countLabel, Alignment.BOTTOM_CENTER); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java index 6b7103cc252..69fbbaee59c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -25,19 +25,13 @@ public class RegionalDiseaseBurdenGrid extends Grid { Grid.Column regionDistrictColumn; Grid.Column totalColumn; - Grid.Column totalCountColumn; - Grid.Column activeCaseColumn; - Grid.Column activeCaseCountColumn; - Grid.Column recoveredCasesColumn; Grid.Column recoveredCasesCountColumn; - Grid.Column deathColumn; Grid.Column deathCountColumn; - Grid.Column otherColumn; Grid.Column otherCountColumn; @@ -72,23 +66,18 @@ public RegionalDiseaseBurdenGrid(DashboardDataProvider dashboardDataProvider) { regionDistrictColumn = getColumn(DiseaseBurdenDto.CASES_REGION); totalCountColumn = getColumn(DiseaseBurdenDto.CASES_COUNT_TOTAL); - totalColumn = getColumn(DiseaseBurdenDto.CASES_TOTAL); activeCaseCountColumn = getColumn(DiseaseBurdenDto.ACTIVE_COUNT_CASE); - activeCaseColumn = getColumn(DiseaseBurdenDto.ACTIVE_CASE); recoveredCasesCountColumn = getColumn(DiseaseBurdenDto.RECOVERED_COUNT_CASES); - recoveredCasesColumn = getColumn(DiseaseBurdenDto.RECOVERED_CASES); deathCountColumn = getColumn(DiseaseBurdenDto.DEATH_COUNT); - deathColumn = getColumn(DiseaseBurdenDto.DEATH); otherCountColumn = getColumn(DiseaseBurdenDto.OTHER_COUNT); - otherColumn = getColumn(DiseaseBurdenDto.OTHER); } @@ -110,41 +99,29 @@ public void reload() { regionDistrictColumn.setHeaderCaption("REGION NAME"); totalCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); - totalColumn.setRenderer(new HtmlRenderer()).setWidth(100); - totalColumn.setHeaderCaption("TOTAL %"); activeCaseCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); - activeCaseColumn.setRenderer(new HtmlRenderer()).setWidth(100); - activeCaseColumn.setHeaderCaption("ACTIVE CASES %"); recoveredCasesCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); - recoveredCasesCountColumn.setHeaderCaption("RECOVER COUNT"); recoveredCasesColumn.setRenderer(new HtmlRenderer()).setWidth(100); - recoveredCasesColumn.setHeaderCaption("RECOVER CASES %"); deathCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); - deathColumn.setRenderer(new HtmlRenderer()).setWidth(100); - deathColumn.setHeaderCaption("DEATH CASES %"); - otherCountColumn.setRenderer(new HtmlRenderer()).setWidth(100); - otherColumn.setRenderer(new HtmlRenderer()).setWidth(100); - otherColumn.setHeaderCaption("OTHER CASES %"); if(dashboardDataProvider.getRegion()!=null) { regionDistrictColumn.setHeaderCaption("DISTRICT NAME"); - setCaption(I18nProperties.getCaption(Captions.dashboardDistrictDiseaseBurden)); String regionUuid=dashboardDataProvider.getRegion().getUuid(); @@ -167,41 +144,24 @@ public void reload() { String total = diseaseBurdenDto.getTotal(); - String activeCases = diseaseBurdenDto.getActiveCases(); - String recovered = diseaseBurdenDto.getRecovered(); - String deaths = diseaseBurdenDto.getDeaths(); - String other = diseaseBurdenDto.getOther(); - RegionDto regionDto = new RegionDto(); - regionDto.setName(districtDto.getCaption()); diseaseBurdenDto.setRegion(regionDto); - diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(total), casePercental, "#5a95f4bf","#2f7df9")); - diseaseBurdenDto.setTotalCount(makeDIvsCount(total)); - diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(activeCases), casePercental, "#feba0199", "#dfa507")); - diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases)); - diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(recovered), casePercental, "#00e0a19c", "#038d66")); - diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered)); - diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(deaths), casePercental,"#FFAEAE", "#FF4040")); - diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths)); - diseaseBurdenDto.setOther(makeDIvs(Long.parseLong(other), casePercental,"#bf8678ba", "#91675d")); - diseaseBurdenDto.setOtherCount(makeDIvsCount(other)); - diseaseBurdenDtoList.add(diseaseBurdenDto); } }else { @@ -220,35 +180,21 @@ public void reload() { ); String total = diseaseBurdenDto.getTotal(); - String activeCases = diseaseBurdenDto.getActiveCases(); - String recovered = diseaseBurdenDto.getRecovered(); - String deaths = diseaseBurdenDto.getDeaths(); - String other = diseaseBurdenDto.getOther(); diseaseBurdenDto.setTotal(makeDIvs(Long.parseLong(total), casePercental, "#5a95f4bf","#2f7df9")); - diseaseBurdenDto.setTotalCount(makeDIvsCount(total)); - diseaseBurdenDto.setActiveCases(makeDIvs(Long.parseLong(activeCases), casePercental, "#feba0199", "#dfa507")); - diseaseBurdenDto.setActiveCount(makeDIvsCount(activeCases)); - diseaseBurdenDto.setRecovered(makeDIvs(Long.parseLong(recovered), casePercental, "#00e0a19c", "#038d66")); - diseaseBurdenDto.setRecoveredCount(makeDIvsCount(recovered)); - diseaseBurdenDto.setDeaths(makeDIvs(Long.parseLong(deaths), casePercental,"#FFAEAE", "#FF4040")); - diseaseBurdenDto.setDeathsCount(makeDIvsCount(deaths)); - diseaseBurdenDto.setOther(makeDIvs(Long.parseLong(other), casePercental,"#bf8678ba", "#91675d")); - diseaseBurdenDto.setOtherCount(makeDIvsCount(other)); - diseaseBurdenDtoList.add(diseaseBurdenDto); } } @@ -307,8 +253,7 @@ public String element(String type, String style, String content) { sb.append(content); sb.append(""); - return sb.toString(); } -} +} \ No newline at end of file diff --git a/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java b/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java index 6e2c67e80b7..8149cb74eea 100644 --- a/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java +++ b/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java @@ -24,11 +24,9 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.MockitoAnnotations; - import java.util.Date; import java.util.HashMap; import java.util.Map; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.mockito.ArgumentMatchers.any; From 0a7e2885826317e219d0136c786984c2dc94deee Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Mon, 28 Oct 2024 12:00:48 +0000 Subject: [PATCH 55/71] updates to take out white space after review --- .../sormas/api/disease/DiseaseBurdenDto.java | 4 +- .../sormas/api/feature/FeatureType.java | 2 +- .../sormas/api/geo/GeoShapeProvider.java | 24 +-- .../infrastructure/region/RegionFacade.java | 18 +-- .../src/main/resources/captions.properties | 2 - sormas-api/src/main/resources/enum.properties | 2 - .../backend/contact/ContactService.java | 1 - .../backend/dashboard/DashboardFacadeEjb.java | 1 + .../backend/person/PersonFacadeEjb.java | 23 ++- .../sormas/backend/sample/SampleService.java | 1 + .../sormas/backend/AbstractBeanTest.java | 1 + .../sormas/backend/TestDataCreator.java | 7 - .../backend/geo/RegionFacadeEjbTest.java | 2 +- .../backend/sample/SampleFacadeEjbTest.java | 42 ----- .../backend/sample/SampleServiceTest.java | 149 ------------------ .../ui/dashboard/AbstractDashboardView.java | 1 + .../disease/tile/DiseaseTileComponent.java | 50 +++--- .../disease/tile/DiseaseTileViewLayout.java | 2 +- 18 files changed, 64 insertions(+), 268 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java index ca1b2d2a844..87a96db668c 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java @@ -207,9 +207,7 @@ public DiseaseBurdenDto( this.recovered = recovered; this.deaths = deaths; } - - - + public Disease getDisease() { return disease; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java index 156ededa04b..a5e9675189b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java @@ -332,7 +332,7 @@ public enum FeatureType { CONTACT_TRACING }, null, ImmutableMap.of(FeatureTypeProperty.S2S_SHARING, Boolean.FALSE)), - DISEASE_DETAILS(true, true, null, null, null); + DISEASE_DETAILS(false, true, null, null, null); public static final FeatureType[] SURVEILLANCE_FEATURE_TYPES = { FeatureType.CASE_SURVEILANCE, diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/geo/GeoShapeProvider.java b/sormas-api/src/main/java/de/symeda/sormas/api/geo/GeoShapeProvider.java index 41f76db0132..b2f81a601da 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/geo/GeoShapeProvider.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/geo/GeoShapeProvider.java @@ -25,24 +25,24 @@ @Remote public interface GeoShapeProvider { - /** - * @return array of polygons, which are arrays of geo-points - */ - GeoLatLon[][] getRegionShape(RegionReferenceDto region); + /** + * @return array of polygons, which are arrays of geo-points + */ + GeoLatLon[][] getRegionShape(RegionReferenceDto region); - RegionReferenceDto getRegionByCoord(GeoLatLon latLon); + RegionReferenceDto getRegionByCoord(GeoLatLon latLon); - GeoLatLon getCenterOfAllRegions(); + GeoLatLon getCenterOfAllRegions(); - GeoLatLon getCenterOfRegion(RegionReferenceDto region); + GeoLatLon getCenterOfRegion(RegionReferenceDto region); - GeoLatLon[][] getDistrictShape(DistrictReferenceDto district); + GeoLatLon[][] getDistrictShape(DistrictReferenceDto district); - DistrictReferenceDto getDistrictByCoord(GeoLatLon latLon); + DistrictReferenceDto getDistrictByCoord(GeoLatLon latLon); - GeoLatLon getCenterOfDistrict(DistrictReferenceDto district); + GeoLatLon getCenterOfDistrict(DistrictReferenceDto district); - GeoLatLon[][] getCountryShape(); + GeoLatLon[][] getCountryShape(); - String loadShapefileAttributions(); + String loadShapefileAttributions(); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java index 32fbaacbb7d..b0a7703f2b3 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionFacade.java @@ -29,24 +29,24 @@ @Remote public interface RegionFacade extends GeoLocationFacade { - List getAllActiveByServerCountry(); + List getAllActiveByServerCountry(); - List getAllActiveByCountry(String countryUuid); + List getAllActiveByCountry(String countryUuid); - List getAllActiveByArea(String areaUuid); + List getAllActiveByArea(String areaUuid); - List getAllActiveAsReference(); + List getAllActiveAsReference(); - Page getIndexPage(RegionCriteria regionCriteria, Integer offset, Integer size, List sortProperties); + Page getIndexPage(RegionCriteria regionCriteria, Integer offset, Integer size, List sortProperties); - RegionReferenceDto getRegionReferenceById(int id); + RegionReferenceDto getRegionReferenceById(int id); - List getByName(String name, boolean includeArchivedEntities); + List getByName(String name, boolean includeArchivedEntities); - List getNamesByIds(List regionIds); + List getNamesByIds(List regionIds); - boolean isUsedInOtherInfrastructureData(Collection regionUuids); + boolean isUsedInOtherInfrastructureData(Collection regionUuids); List getAllActiveRegions(); } diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index 720d6b86b2d..74ffe81bb3c 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -3091,7 +3091,6 @@ View.dashboard.surveillance=Surveillance Dashboard View.dashboard.campaigns=Campaigns Dashboard View.dashboard.samples=Samples Dashboard View.dashboard.disease=Disease Dashboard - View.dashboard.adverseevents=Adverse Events Dashboard View.events=Event Directory View.events.archive=Event Archive @@ -3125,7 +3124,6 @@ View.selfreports=Self reports directory # Visit visitNewVisit=New visit viewMore=View More - Visit=Visit Visit.person=Visited person Visit.symptoms=Symptoms diff --git a/sormas-api/src/main/resources/enum.properties b/sormas-api/src/main/resources/enum.properties index ee8612f612e..8d66487befb 100644 --- a/sormas-api/src/main/resources/enum.properties +++ b/sormas-api/src/main/resources/enum.properties @@ -953,7 +953,6 @@ Month.DECEMBER = December NewCaseDateType.MOST_RELEVANT = Most relevant date NewCaseDateType.ONSET = Symptom onset date NewCaseDateType.REPORT = Case report date - NewDateFilterType.TODAY = Today's date NewDateFilterType.YESTERDAY = Yesterday's date NewDateFilterType.THIS_WEEK = Current week's date range @@ -1427,7 +1426,6 @@ UserRight.DASHBOARD_CONTACT_VIEW = Access the contact supervisor dashboard UserRight.DASHBOARD_SURVEILLANCE_VIEW = Access the surveillance supervisor dashboard UserRight.DASHBOARD_SAMPLES_VIEW = Access the samples dashboard UserRight.DASHBOARD_DISEASE_DETAILS_ACCESS = Access the disease dashboard - UserRight.DATABASE_EXPORT_ACCESS = Export the whole database UserRight.EVENT_ARCHIVE = Archive events UserRight.EVENT_CREATE = Create new events 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 fdff566349e..3c8f1cd2b22 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 @@ -145,7 +145,6 @@ import de.symeda.sormas.backend.visit.Visit; import de.symeda.sormas.backend.visit.VisitFacadeEjb; import de.symeda.sormas.backend.visit.VisitService; -import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.or; @Stateless @LocalBean diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java index cf820bd2a14..defa0249587 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java @@ -789,6 +789,7 @@ public List getDiseaseBurden( Long outbreakDistrictCount = outbreakDistrictsCount.getOrDefault(disease, 0L); Long caseFatalityCount = caseFatalities.getOrDefault(disease, 0L); District lastReportedDistrict = lastReportedDistricts.getOrDefault(disease, null); + String lastReportedDistrictName = lastReportedDistrict == null ? "" : lastReportedDistrict.getName(); return new DiseaseBurdenDto( 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 4b376cbcc6e..0c9d9f9f17f 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 @@ -191,7 +191,6 @@ import de.symeda.sormas.backend.util.RightsAllowed; import de.symeda.sormas.backend.visit.Visit; import de.symeda.sormas.backend.visit.VisitService; -import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; @Stateless(name = "PersonFacade") @RightsAllowed(UserRight._PERSON_VIEW) @@ -309,6 +308,16 @@ public void updateExternalData(@Valid List externalData) throws service.updateExternalData(externalData); } + @Override + public List getDeathsBetween(Date fromDate, Date toDate, DistrictReferenceDto districtRef, Disease disease) { + final User user = userService.getCurrentUser(); + if (user == null) { + return Collections.emptyList(); + } + final District district = districtService.getByReferenceDto(districtRef); + return toPseudonymizedDtos(service.getDeathsBetween(fromDate, toDate, district, disease, user)); + } + public Long getPersonIdByUuid(String uuid) { return Optional.of(uuid).map(u -> service.getIdByUuid(u)).orElse(null); } @@ -2063,17 +2072,7 @@ public List getByNationalHealthId(String nationalHealthId) { .collect(Collectors.toList()); } - @Override - public List getDeathsBetween(Date fromDate, Date toDate, DistrictReferenceDto districtRef, Disease disease) { - final User user = userService.getCurrentUser(); - if (user == null) { - return Collections.emptyList(); - } - final District district = districtService.getByReferenceDto(districtRef); - return toPseudonymizedDtos(service.getDeathsBetween(fromDate, toDate, district, disease, user)); - } - - @LocalBean + @LocalBean @Stateless public static class PersonFacadeEjbLocal extends PersonFacadeEjb { 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 a49fcb8c63b..e5275a7ae82 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 @@ -1347,6 +1347,7 @@ public Predicate createUserFilterWithoutCase(CriteriaBuilder cb, SampleJoins joi return filter; } + public void cleanupOldCovidSamples() { final Integer maxAgeDays = configFacade.getNegaiveCovidSamplesMaxAgeDays(); if (maxAgeDays == null) { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java index d364db05bc5..ddbe585a803 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java @@ -660,6 +660,7 @@ public OutbreakFacade getOutbreakFacade() { public OutbreakService getOutbreakService() { return getBean(OutbreakService.class); } + public ImportFacade getImportFacade() { return getBean(ImportFacadeEjbLocal.class); } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java index 8fb682df815..c0724dc3c14 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java @@ -967,13 +967,6 @@ public ContactDto createContact( return contact; } - public ContactDto createContact(UserReferenceDto reportingUser, PersonReferenceDto contactPerson, CaseDataDto caze, RDCF rdcf, ContactClassification classification,Date contactDate) { - ContactDto contact = createContact(reportingUser, null, contactPerson, caze, contactDate, null, null, rdcf); - contact.setContactClassification(classification); - contact = beanTest.getContactFacade().save(contact); - return contact; - } - public TaskDto createTask(UserReferenceDto assigneeUser) { return createTask(TaskContext.GENERAL, TaskType.OTHER, TaskStatus.PENDING, null, null, null, null, new Date(), assigneeUser); } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java index 1fcfca26d77..0f275f3fc12 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java @@ -86,7 +86,7 @@ public void testGetByName() { } @Test - public void testGetIndexList_noCriteria() { + public void testGetIndexListNoCriteria() { // Arrange creator.createRegion("region1"); creator.createRegion("region2"); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java index 8ebf253efc6..b9331faceb9 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleFacadeEjbTest.java @@ -1222,46 +1222,4 @@ public void testCountAndGetSamplesForMap() { assertEquals(6, count); assertEquals(6, samples.size()); } - - @Test - public void testGetEarliestPositiveSampleDate() { - RDCF rdcf = creator.createRDCF(); - UserDto user = creator.createSurveillanceSupervisor(rdcf); - PersonDto person = creator.createPerson("New", "Person"); - CaseDataDto caze = creator.createCase(user.toReference(), person.toReference(), rdcf); - - // Create contact with positive samples - ContactDto contact = creator.createContact( - user.toReference(), - user.toReference(), // Assuming user is also contact officer for simplicity - person.toReference(), - caze, - new Date(), // Report DateTime - new Date(), // Last Contact Date - Disease.EVD, - creator.createRDCF() - ); - - // Sample 1 - Positive - SampleDto sample1 = creator.createSample(caze.toReference(), user.toReference(), creator.createRDCF().facility); - sample1.setPathogenTestResult(PathogenTestResultType.POSITIVE); - sample1.setSampleDateTime(new Date(2023 - 1900, 5, 15)); // June 15, 2023 - getSampleFacade().saveSample(sample1); - - // Sample 2 - Positive - SampleDto sample2 = creator.createSample(caze.toReference(), user.toReference(), creator.createRDCF().facility); - sample2.setPathogenTestResult(PathogenTestResultType.POSITIVE); - sample2.setSampleDateTime(new Date(2023 - 1900, 5, 20)); // June 20, 2023 - getSampleFacade().saveSample(sample2); - - // Sample 3 - Negative - SampleDto sample3 = creator.createSample(caze.toReference(), user.toReference(), creator.createRDCF().facility); - sample3.setPathogenTestResult(PathogenTestResultType.NEGATIVE); - sample3.setSampleDateTime(new Date(2023 - 1900, 5, 10)); // June 10, 2023 - getSampleFacade().saveSample(sample3); - - // Test - earliest positive sample date - Date earliestPositiveSampleDate = getSampleFacade().getEarliestPositiveSampleDate(contact.getUuid()); - assertEquals(new Date(2023 - 1900, 5, 15), earliestPositiveSampleDate); - } } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleServiceTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleServiceTest.java index 059ee5d3c93..27cba075c46 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleServiceTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/sample/SampleServiceTest.java @@ -19,35 +19,11 @@ import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.backend.AbstractBeanTest; import de.symeda.sormas.backend.TestDataCreator; -import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.contact.ContactDto; -import de.symeda.sormas.api.event.EventDto; -import de.symeda.sormas.api.event.EventInvestigationStatus; -import de.symeda.sormas.api.event.EventParticipantDto; -import de.symeda.sormas.api.event.EventStatus; -import de.symeda.sormas.api.event.TypeOfPlace; -import de.symeda.sormas.api.feature.FeatureType; -import de.symeda.sormas.api.sample.SampleAssociationType; -import de.symeda.sormas.api.sample.SampleCriteria; -import de.symeda.sormas.api.utils.DateHelper; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Date; -import javax.inject.Inject; -import javax.persistence.EntityManager; -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 static org.junit.jupiter.api.Assertions.assertFalse; /** * @see SampleService */ public class SampleServiceTest extends AbstractBeanTest { - @Inject - private EntityManager em; @Test public void testSamplePermanentDeletion() { @@ -88,129 +64,4 @@ public void testSamplePermanentDeletion() { assertNull(getSampleService().getByUuid(referralSample.getUuid()).getReferredTo()); assertNull(getSampleReportService().getByUuid(labMessage.getSampleReports().get(0).getUuid()).getSample()); } - - @Test - public void testBuildSampleListCriteriaFilterForCase() throws Exception { - // Prepare data - SampleCriteria criteria = new SampleCriteria(); - criteria.sampleAssociationType(SampleAssociationType.CASE); - TestDataCreator.RDCF rdcf = creator.createRDCF(); - UserDto user = creator - .createUser(rdcf, creator.getUserRoleReference(DefaultUserRole.ADMIN), creator.getUserRoleReference(DefaultUserRole.NATIONAL_USER)); - PersonDto person = creator.createPerson(); - CaseDataDto caze = creator.createCase(user.toReference(), person.toReference(), rdcf); - criteria.caze(caze.toReference()); - - // Create a CriteriaBuilder, CriteriaQuery, Root, and SampleJoins - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(Sample.class); - Root root = cq.from(Sample.class); - SampleJoins joins = new SampleJoins(root); - // Access private method using reflection - Method method = SampleService.class.getDeclaredMethod("buildSampleListCriteriaFilter", SampleCriteria.class, CriteriaBuilder.class, SampleJoins.class, From.class); - method.setAccessible(true); - - Predicate predicate = (Predicate) method.invoke(getSampleService(), criteria, cb, joins, root); - - assertNotNull(predicate); - } - - @Test - public void testBuildSampleListCriteriaFilterForContact() throws Exception { - // Prepare data - SampleCriteria criteria = new SampleCriteria(); - criteria.sampleAssociationType(SampleAssociationType.CONTACT); - - TestDataCreator.RDCF rdcf = creator.createRDCF(); - UserDto user = creator - .createUser(rdcf, creator.getUserRoleReference(DefaultUserRole.ADMIN), creator.getUserRoleReference(DefaultUserRole.NATIONAL_USER)); - PersonDto person = creator.createPerson(); - CaseDataDto caze = creator.createCase(user.toReference(), person.toReference(), rdcf); - - ContactDto contactDto = creator.createContact(user.toReference(), creator.createPerson("Contact", "Person").toReference(), caze, rdcf); - criteria.contact(contactDto.toReference()); - - // Create a CriteriaBuilder, CriteriaQuery, Root, and SampleJoins - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(Sample.class); - Root root = cq.from(Sample.class); - SampleJoins joins = new SampleJoins(root); - - // Access private method using reflection - Method method = SampleService.class.getDeclaredMethod("buildSampleListCriteriaFilter", SampleCriteria.class, CriteriaBuilder.class, SampleJoins.class, From.class); - method.setAccessible(true); - - Predicate predicate = (Predicate) method.invoke(getSampleService(), criteria, cb, joins, root); - - assertNotNull(predicate); - } - - @Test - public void testBuildSampleListCriteriaFilterForEventParticipant() throws Exception { - // Prepare data - SampleCriteria criteria = new SampleCriteria(); - criteria.sampleAssociationType(SampleAssociationType.EVENT_PARTICIPANT); - - TestDataCreator.RDCF rdcf = creator.createRDCF(); - UserDto user = creator - .createUser(rdcf, creator.getUserRoleReference(DefaultUserRole.ADMIN), creator.getUserRoleReference(DefaultUserRole.NATIONAL_USER)); - EventDto eventDto = creator.createEvent( - EventStatus.SIGNAL, - EventInvestigationStatus.PENDING, - "Title", - "Description", - "First", - "Name", - "12345", - TypeOfPlace.PUBLIC_PLACE, - DateHelper.subtractDays(new Date(), 1), - new Date(), - user.toReference(), - user.toReference(), - Disease.EVD, - rdcf); - PersonDto eventPerson = creator.createPerson("Event", "Person"); - EventParticipantDto eventParticipantDto = creator.createEventParticipant(eventDto.toReference(), eventPerson, "Description", user.toReference()); - - criteria.eventParticipant(eventParticipantDto.toReference()); - - // Create a CriteriaBuilder, CriteriaQuery, Root, and SampleJoins - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(Sample.class); - Root root = cq.from(Sample.class); - SampleJoins joins = new SampleJoins(root); - - // Access private method using reflection - Method method = SampleService.class.getDeclaredMethod("buildSampleListCriteriaFilter", SampleCriteria.class, CriteriaBuilder.class, SampleJoins.class, From.class); - method.setAccessible(true); - - Predicate predicate = (Predicate) method.invoke(getSampleService(), criteria, cb, joins, root); - - assertNotNull(predicate); - } - - @Test - public void testIsEditAllowed() throws InvocationTargetException, IllegalAccessException { - TestDataCreator.RDCF rdcf = creator.createRDCF(); - - UserDto user = creator - .createUser(rdcf, creator.getUserRoleReference(DefaultUserRole.ADMIN), creator.getUserRoleReference(DefaultUserRole.NATIONAL_USER)); - PersonDto person = creator.createPerson(); - CaseDataDto caze = creator.createCase(user.toReference(), person.toReference(), rdcf); - - SampleDto sample = creator.createSample(caze.toReference(), user.toReference(), rdcf.facility); - - Sample sampleEntity = getSampleService().getByUuid(sample.getUuid()); - - getFeatureConfigurationFacade().isFeatureDisabled(FeatureType.EDIT_ARCHIVED_ENTITIES); - - boolean sormasToSormasOriginInfoAndNotOwnershipHandoverStatus = (sample.getSormasToSormasOriginInfo() != null && !sample.getSormasToSormasOriginInfo().isOwnershipHandedOver()); - assertFalse(sormasToSormasOriginInfoAndNotOwnershipHandoverStatus); - - boolean isEditAllowed = getSampleService().isEditAllowed(sampleEntity) && !getSampleService().sampleAssignedToActiveEntity(sample.getUuid()); - assertFalse(isEditAllowed); - - boolean notOwnerShipAndJurisdictionFlagStatus = getSampleService().getJurisdictionFlags(sampleEntity).getInJurisdiction() && !getSormasToSormasShareInfoService().isSamlpeOwnershipHandedOver(sampleEntity); - assertTrue(notOwnerShipAndJurisdictionFlagStatus); - } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java index 686f33c80ae..9bcb3bc4e3c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java @@ -33,6 +33,7 @@ import de.symeda.sormas.ui.dashboard.campaigns.CampaignDashboardView; import de.symeda.sormas.ui.dashboard.contacts.ContactsDashboardView; import de.symeda.sormas.ui.dashboard.diseasedetails.DiseaseDetailsView; +import de.symeda.sormas.ui.dashboard.sample.SampleDashboardView; import de.symeda.sormas.ui.dashboard.surveillance.SurveillanceDashboardView; import de.symeda.sormas.ui.utils.AbstractView; import de.symeda.sormas.ui.utils.CssStyles; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java index 35aed39c35d..2ad55559488 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java @@ -30,7 +30,6 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.ui.utils.CssStyles; -import javax.validation.constraints.NotNull; import com.vaadin.ui.Button; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.dashboard.DashboardDataProvider; @@ -45,7 +44,10 @@ public DiseaseTileComponent(DiseaseBurdenDto diseaseBurden, DashboardDataProvide setMargin(false); setSpacing(false); - addTopLayout(diseaseBurden.getDisease(), diseaseBurden.getCaseCount(), diseaseBurden.getPreviousCaseCount(), + addTopLayout( + diseaseBurden.getDisease(), + diseaseBurden.getCaseCount(), + diseaseBurden.getPreviousCaseCount(), diseaseBurden.getOutbreakDistrictCount() > 0); addStatsLayout(diseaseBurden, dashboardDataProvider); @@ -117,13 +119,24 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo comparisonLayout.setMargin(false); comparisonLayout.setSpacing(false); - Label growthLabel = getLabel(casesCount, previousCasesCount); + Label growthLabel = new Label("", ContentMode.HTML); + String chevronType; + if (previousCasesCount < casesCount) { + chevronType = VaadinIcons.CHEVRON_UP.getHtml(); + } else if (previousCasesCount > casesCount) { + chevronType = VaadinIcons.CHEVRON_DOWN.getHtml(); + } else { + chevronType = VaadinIcons.CHEVRON_RIGHT.getHtml(); + } + growthLabel.setValue( + "
" + + " " + chevronType + " " + "
"); comparisonLayout.addComponent(growthLabel); Label previousCountLabel = new Label(previousCasesCount.toString()); - previousCountLabel.addStyleNames(CssStyles.LABEL_WHITE, CssStyles.LABEL_BOLD, CssStyles.LABEL_XLARGE, - CssStyles.HSPACE_LEFT_4); + previousCountLabel.addStyleNames(CssStyles.LABEL_WHITE, CssStyles.LABEL_BOLD, CssStyles.LABEL_XLARGE, CssStyles.HSPACE_LEFT_4); comparisonLayout.addComponent(previousCountLabel); comparisonLayout.setComponentAlignment(growthLabel, Alignment.MIDDLE_CENTER); comparisonLayout.setComponentAlignment(previousCountLabel, Alignment.MIDDLE_CENTER); @@ -140,25 +153,6 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo addComponent(layout); } - @NotNull - private static Label getLabel(Long casesCount, Long previousCasesCount) { - Label growthLabel = new Label("", ContentMode.HTML); - String chevronType; - if (previousCasesCount < casesCount) { - chevronType = VaadinIcons.CHEVRON_UP.getHtml(); - } else if (previousCasesCount > casesCount) { - chevronType = VaadinIcons.CHEVRON_DOWN.getHtml(); - } else { - chevronType = VaadinIcons.CHEVRON_RIGHT.getHtml(); - } - growthLabel.setValue("
" - + " " + chevronType + " " - + "
"); - return growthLabel; - } - private void addStatsLayout(DiseaseBurdenDto diseaseBurden,DashboardDataProvider dashboardDataProvider) { Long fatalities = diseaseBurden.getCaseDeathCount(); Long events = diseaseBurden.getEventCount(); @@ -171,20 +165,24 @@ private void addStatsLayout(DiseaseBurdenDto diseaseBurden,DashboardDataProvider layout.setSpacing(false); layout.addStyleName(CssStyles.BACKGROUND_HIGHLIGHT); - StatsItem lastReportItem = new StatsItem.Builder(Captions.dashboardLastReport, - district.isEmpty() ? I18nProperties.getString(Strings.none) : district).singleColumn(true).build(); + StatsItem lastReportItem = + new StatsItem.Builder(Captions.dashboardLastReport, district.isEmpty() ? I18nProperties.getString(Strings.none) : district) + .singleColumn(true) + .build(); lastReportItem.addStyleName(CssStyles.VSPACE_TOP_4); layout.addComponent(lastReportItem); StatsItem fatality = new StatsItem.Builder(Captions.dashboardFatalities, fatalities).critical(fatalities > 0).build(); fatality.addStyleName(CssStyles.HSPACE_LEFT_5); layout.addComponent(fatality); + StatsItem noOfEventsItem = new StatsItem.Builder(Captions.DiseaseBurden_eventCount, events).build(); noOfEventsItem.addStyleName(CssStyles.VSPACE_4); layout.addComponent(noOfEventsItem); Button component = addDiseaseButton(disease, dashboardDataProvider); layout.addComponent(component); + addComponent(layout); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java index f380a457248..51c997401a4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java @@ -49,4 +49,4 @@ public void refresh(List diseasesBurden) { addComponent(tile); } } -} \ No newline at end of file +} From 6508926047b1a4232022a7bb7dc934cfc6e6f438 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Mon, 28 Oct 2024 17:34:01 +0000 Subject: [PATCH 56/71] cleaning white space --- .../sormas/backend/sample/SampleService.java | 65 +-- .../sormas/backend/TestDataCreator.java | 1 - .../dashboard/DashboardFacadeEjbTest.java | 1 + .../backend/disease/DiseaseFacadeEjbTest.java | 2 +- .../ui/dashboard/AbstractDashboardView.java | 5 +- .../dashboard/map/DashboardMapComponent.java | 455 ++++++++++-------- 6 files changed, 269 insertions(+), 260 deletions(-) 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 e5275a7ae82..8bb70bb1994 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 @@ -121,10 +121,6 @@ import de.symeda.sormas.backend.util.ModelConstants; import de.symeda.sormas.backend.util.Pseudonymizer; import de.symeda.sormas.backend.util.QueryHelper; -import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.or; -import java.math.BigInteger; -import javax.persistence.Query; -import de.symeda.sormas.api.sample.SpecimenCondition; @Stateless @LocalBean @@ -1001,7 +997,7 @@ private Predicate buildSampleListCriteriaFilter(SampleCriteria criteria, Criteri return filter; } - protected boolean sampleAssignedToActiveEntity(String sampleUuid) { + private boolean sampleAssignedToActiveEntity(String sampleUuid) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Boolean.class); @@ -1289,65 +1285,6 @@ public List getAssociatedDiseaseVariants(String sampleUuid) { return em.createQuery(cq).getResultList(); } - public Map getNewTestResultCountByResultType(List caseIds) { - - if (CollectionUtils.isEmpty(caseIds)) { - // Avoid empty IN clause - return new HashMap<>(); - } - - // Avoid parameter limit by joining caseIds to a String instead of n parameters - StringBuilder queryBuilder = new StringBuilder(); - //@formatter:off - queryBuilder.append("WITH sortedsamples AS (SELECT DISTINCT ON (").append(Sample.ASSOCIATED_CASE).append("_id) ") - .append(Sample.ASSOCIATED_CASE).append("_id, ").append(Sample.PATHOGEN_TEST_RESULT).append(", ").append(Sample.SAMPLE_DATE_TIME) - .append(" FROM ").append(Sample.TABLE_NAME).append(" WHERE (").append(Sample.SPECIMEN_CONDITION).append(" IS NULL OR ") - .append(Sample.SPECIMEN_CONDITION).append(" = '").append(SpecimenCondition.ADEQUATE.name()).append("') AND ").append(Sample.TABLE_NAME) - .append(".").append(Sample.DELETED).append(" = false ORDER BY ").append(Sample.ASSOCIATED_CASE).append("_id, ") - .append(Sample.SAMPLE_DATE_TIME).append(" desc) SELECT sortedsamples.").append(Sample.PATHOGEN_TEST_RESULT).append(", COUNT(") - .append(Sample.ASSOCIATED_CASE).append("_id) FROM sortedsamples JOIN ").append(Case.TABLE_NAME).append(" ON sortedsamples.") - .append(Sample.ASSOCIATED_CASE).append("_id = ").append(Case.TABLE_NAME).append(".id ") - .append(" WHERE sortedsamples.").append(Sample.ASSOCIATED_CASE).append("_id IN (").append(QueryHelper.concatLongs(caseIds)).append(") ") - .append(" GROUP BY sortedsamples." + Sample.PATHOGEN_TEST_RESULT); - //@formatter:on - - Query query = em.createNativeQuery(queryBuilder.toString()); - - @SuppressWarnings("unchecked") - List results = query.getResultList(); - - return results.stream() - .filter(e -> e[0] != null) - .collect(Collectors.toMap(e -> PathogenTestResultType.valueOf((String) e[0]), e -> ((BigInteger) e[1]).longValue())); - } - - public Predicate createUserFilterWithoutCase(CriteriaBuilder cb, SampleJoins joins) { - Predicate filter = null; - // user that reported it is not able to access it. Otherwise they would also need to access the case - User currentUser = getCurrentUser(); - final JurisdictionLevel jurisdictionLevel = currentUser.getJurisdictionLevel(); - // lab users can see samples assigned to their laboratory - if (jurisdictionLevel == JurisdictionLevel.LABORATORY || jurisdictionLevel == JurisdictionLevel.EXTERNAL_LABORATORY) { - if (currentUser.getLaboratory() != null) { - filter = or(cb, filter, cb.equal(joins.getRoot().get(Sample.LAB), currentUser.getLaboratory())); - } - } - - // only show samples of a specific disease if a limited disease is set - if (filter != null && currentUser.getLimitedDiseases() != null) { - filter = CriteriaBuilderHelper.and( - cb, - filter, - cb.equal( - cb.selectCase() - .when(cb.isNotNull(joins.getCaze()), joins.getCaze().get(Case.DISEASE)) - .otherwise(joins.getContact().get(Contact.DISEASE)), - currentUser.getLimitedDiseases())); - } - - return filter; - } - public void cleanupOldCovidSamples() { final Integer maxAgeDays = configFacade.getNegaiveCovidSamplesMaxAgeDays(); if (maxAgeDays == null) { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java index c0724dc3c14..a45518e4ce8 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/TestDataCreator.java @@ -162,7 +162,6 @@ import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfo; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserRole; -import de.symeda.sormas.api.contact.ContactClassification; public class TestDataCreator { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java index 6056b46ca12..c8f9c042b32 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java @@ -177,6 +177,7 @@ public void testDashboardEventListCreation() { // List should have one entry assertEquals(1, dashboardEventDtos.size()); } + @Test public void testDiseaseBurdenForDashboard() { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java index 2672a7b496a..7d3d6ce6f5c 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java @@ -104,4 +104,4 @@ public void testGetDiseaseGridForDashboard() { assertEquals("0", result.getDeaths()); assertEquals("0", result.getOther()); } -} +} \ No newline at end of file diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java index 9bcb3bc4e3c..87d8c116c2c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java @@ -32,13 +32,13 @@ import de.symeda.sormas.ui.dashboard.adverseeventsfollowingimmunization.AefiDashboardView; import de.symeda.sormas.ui.dashboard.campaigns.CampaignDashboardView; import de.symeda.sormas.ui.dashboard.contacts.ContactsDashboardView; -import de.symeda.sormas.ui.dashboard.diseasedetails.DiseaseDetailsView; import de.symeda.sormas.ui.dashboard.sample.SampleDashboardView; import de.symeda.sormas.ui.dashboard.surveillance.SurveillanceDashboardView; import de.symeda.sormas.ui.utils.AbstractView; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.dashboard.components.DashboardFilterLayout; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.ui.dashboard.diseasedetails.DiseaseDetailsView; @SuppressWarnings("serial") public abstract class AbstractDashboardView extends AbstractView { @@ -109,8 +109,7 @@ protected AbstractDashboardView(String viewName) { protected void navigateToDashboardView(Property.ValueChangeEvent e) { if (DashboardType.SURVEILLANCE.equals(e.getProperty().getValue())) { SormasUI.get().getNavigator().navigateTo(SurveillanceDashboardView.VIEW_NAME); - } - else if (DashboardType.CONTACTS.equals(e.getProperty().getValue())) { + } else if (DashboardType.CONTACTS.equals(e.getProperty().getValue())) { SormasUI.get().getNavigator().navigateTo(ContactsDashboardView.VIEW_NAME); } else if (DashboardType.DISEASE.equals(e.getProperty().getValue())) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index 890d1b44197..fd37a8148c9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -77,24 +77,23 @@ import de.symeda.sormas.ui.map.MarkerIcon; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.VaadinUiUtil; -import java.util.stream.Collectors; -import javax.validation.constraints.NotNull; import org.vaadin.hene.popupbutton.PopupButton; +import java.text.SimpleDateFormat; +import java.util.stream.Collectors; +import de.symeda.sormas.api.geo.GeoShapeProvider; +import static java.util.Objects.nonNull; +import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.dashboard.DashboardCssStyles; +import de.symeda.sormas.ui.utils.ButtonHelper; +import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.api.utils.DateHelper; import com.vaadin.ui.Button; import com.vaadin.ui.ComboBox; import com.vaadin.ui.CssLayout; import com.vaadin.ui.themes.ValoTheme; -import de.symeda.sormas.api.geo.GeoShapeProvider; -import de.symeda.sormas.api.user.UserDto; -import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.ui.UserProvider; -import de.symeda.sormas.ui.dashboard.DashboardCssStyles; import de.symeda.sormas.ui.map.LeafletMap; -import de.symeda.sormas.ui.utils.ButtonHelper; import java.util.Collections; import java.util.Optional; -import java.text.SimpleDateFormat; -import static java.util.Objects.nonNull; @SuppressWarnings("serial") public class DashboardMapComponent extends BaseDashboardMapComponent { @@ -132,7 +131,6 @@ public class DashboardMapComponent extends BaseDashboardMapComponent { + caseMeasure = (CaseMeasure) event.getProperty().getValue(); + refreshMapDashboard(true); + }); + + HorizontalLayout showRegionsLayout = new HorizontalLayout(); + { + showRegionsLayout.setMargin(false); + showRegionsLayout.setSpacing(false); + CheckBox showRegionsCheckBox = new CheckBox(); + showRegionsCheckBox.setId(Captions.dashboardShowRegions); + showRegionsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowRegions)); + showRegionsCheckBox.setValue(showRegions); + showRegionsCheckBox.addValueChangeListener(e -> { + showRegions = (boolean) e.getProperty().getValue(); + regionMapVisualizationSelect.setEnabled(showRegions); + regionMapVisualizationSelect.setValue(caseMeasure); + refreshMapDashboard(true); + }); + showRegionsLayout.addComponent(showRegionsCheckBox); + + Label infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); + infoLabel.setDescription(I18nProperties.getString(Strings.infoCaseIncidence)); + CssStyles.style(infoLabel, CssStyles.LABEL_MEDIUM, CssStyles.LABEL_SECONDARY, CssStyles.HSPACE_LEFT_3); + infoLabel.setHeightUndefined(); + showRegionsLayout.addComponent(infoLabel); + showRegionsLayout.setComponentAlignment(infoLabel, Alignment.TOP_CENTER); + } + layersLayout.addComponent(showRegionsLayout); + layersLayout.addComponent(regionMapVisualizationSelect); + regionMapVisualizationSelect.setEnabled(showRegions); } - checkBoxesHideOtherCountriesAndShowCurrentEpiSituationCBConfig(layersLayout); + CheckBox hideOtherCountriesCheckBox = new CheckBox(); + hideOtherCountriesCheckBox.setId(Captions.dashboardHideOtherCountries); + hideOtherCountriesCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardHideOtherCountries)); + hideOtherCountriesCheckBox.setValue(hideOtherCountries); + hideOtherCountriesCheckBox.addValueChangeListener(e -> { + hideOtherCountries = (boolean) e.getProperty().getValue(); + refreshMapDashboard(true); + }); + CssStyles.style(hideOtherCountriesCheckBox, CssStyles.VSPACE_3); + layersLayout.addComponent(hideOtherCountriesCheckBox); + + CheckBox showCurrentEpiSituationCB = new CheckBox(); + showCurrentEpiSituationCB.setId(Captions.dashboardMapShowEpiSituation); + showCurrentEpiSituationCB.setCaption(I18nProperties.getCaption(Captions.dashboardMapShowEpiSituation)); + showCurrentEpiSituationCB.setValue(false); + showCurrentEpiSituationCB.addValueChangeListener(e -> { + showCurrentEpiSituation = (boolean) e.getProperty().getValue(); + refreshMapDashboard(true); + }); + layersLayout.addComponent(showCurrentEpiSituationCB); createPeriodFilters(layersLayout); } @@ -435,44 +486,6 @@ private HorizontalLayout createMapFooter() { return mapFooterLayout; } - private void regionalOptionGroupHorizontalLayoutConfigMap(VerticalLayout layersLayout) { - OptionGroup regionMapVisualizationSelect = new OptionGroup(); - regionMapVisualizationSelect.setWidth(100, Unit.PERCENTAGE); - regionMapVisualizationSelect.addItems((Object[]) CaseMeasure.values()); - regionMapVisualizationSelect.setValue(caseMeasure); - regionMapVisualizationSelect.addValueChangeListener(event -> { - caseMeasure = (CaseMeasure) event.getProperty().getValue(); - refreshMapDashboard(true); - }); - - HorizontalLayout showRegionsLayout = new HorizontalLayout(); - { - showRegionsLayout.setMargin(false); - showRegionsLayout.setSpacing(false); - CheckBox showRegionsCheckBox = new CheckBox(); - showRegionsCheckBox.setId(Captions.dashboardShowRegions); - showRegionsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowRegions)); - showRegionsCheckBox.setValue(showRegions); - showRegionsCheckBox.addValueChangeListener(e -> { - showRegions = (boolean) e.getProperty().getValue(); - regionMapVisualizationSelect.setEnabled(showRegions); - regionMapVisualizationSelect.setValue(caseMeasure); - refreshMapDashboard(true); - }); - showRegionsLayout.addComponent(showRegionsCheckBox); - - Label infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); - infoLabel.setDescription(I18nProperties.getString(Strings.infoCaseIncidence)); - CssStyles.style(infoLabel, CssStyles.LABEL_MEDIUM, CssStyles.LABEL_SECONDARY, CssStyles.HSPACE_LEFT_3); - infoLabel.setHeightUndefined(); - showRegionsLayout.addComponent(infoLabel); - showRegionsLayout.setComponentAlignment(infoLabel, Alignment.TOP_CENTER); - } - layersLayout.addComponent(showRegionsLayout); - layersLayout.addComponent(regionMapVisualizationSelect); - regionMapVisualizationSelect.setEnabled(showRegions); - } - private VerticalLayout createMapLegend() { VerticalLayout legendLayout = new VerticalLayout(); legendLayout.setSpacing(false); @@ -496,14 +509,52 @@ private VerticalLayout createMapLegend() { CssStyles.style(facilitiesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); legendLayout.addComponent(facilitiesKeyLabel); - HorizontalLayout facilitiesKeyLayout = createFacilitiesKeyLayout(); + HorizontalLayout facilitiesKeyLayout = new HorizontalLayout(); + { + facilitiesKeyLayout.setSpacing(false); + facilitiesKeyLayout.setMargin(false); + HorizontalLayout legendEntry = + buildMarkerLegendEntry(MarkerIcon.FACILITY_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassifiedOnly)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + facilitiesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_SUSPECT, I18nProperties.getCaption(Captions.dashboardGt1SuspectCases)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + facilitiesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_PROBABLE, I18nProperties.getCaption(Captions.dashboardGt1ProbableCases)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + facilitiesKeyLayout.addComponent(legendEntry); + legendEntry = + buildMarkerLegendEntry(MarkerIcon.FACILITY_CONFIRMED, I18nProperties.getCaption(Captions.dashboardGt1ConfirmedCases)); + facilitiesKeyLayout.addComponent(legendEntry); + } legendLayout.addComponent(facilitiesKeyLayout); } - Label casesKeyLabel = createCasesKeyLabel(); + Label casesKeyLabel = new Label(I18nProperties.getString(Strings.entityCases)); + if (mapCaseDisplayMode == MapCaseDisplayMode.FACILITY || mapCaseDisplayMode == MapCaseDisplayMode.FACILITY_OR_CASE_ADDRESS) { + CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); + } else { + CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + } legendLayout.addComponent(casesKeyLabel); - HorizontalLayout casesKeyLayout = createCasesKeyLayout(); + HorizontalLayout casesKeyLayout = new HorizontalLayout(); + { + casesKeyLayout.setSpacing(false); + casesKeyLayout.setMargin(false); + HorizontalLayout legendEntry = + buildMarkerLegendEntry(MarkerIcon.CASE_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassified)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + casesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_SUSPECT, I18nProperties.getCaption(Captions.dashboardSuspect)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + casesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_PROBABLE, I18nProperties.getCaption(Captions.dashboardProbable)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + casesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_CONFIRMED, I18nProperties.getCaption(Captions.dashboardConfirmed)); + casesKeyLayout.addComponent(legendEntry); + } legendLayout.addComponent(casesKeyLayout); } @@ -517,7 +568,20 @@ private VerticalLayout createMapLegend() { } legendLayout.addComponent(contactsKeyLabel); - HorizontalLayout contactsKeyLayout = contactsKeyLayout(); + HorizontalLayout contactsKeyLayout = new HorizontalLayout(); + { + contactsKeyLayout.setSpacing(false); + contactsKeyLayout.setMargin(false); + HorizontalLayout legendEntry = + buildMarkerLegendEntry(MarkerIcon.CONTACT_OK, I18nProperties.getCaption(Captions.dashboardNotAContact)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + contactsKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_OVERDUE, I18nProperties.getCaption(Captions.dashboardUnconfirmedContact)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + contactsKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_LONG_OVERDUE, I18nProperties.getCaption(Captions.dashboardConfirmedContact)); + contactsKeyLayout.addComponent(legendEntry); + } legendLayout.addComponent(contactsKeyLayout); } @@ -531,13 +595,27 @@ private VerticalLayout createMapLegend() { } legendLayout.addComponent(eventsKeyLabel); - HorizontalLayout eventsKeyLayout = createEventsKeyLayout(); + HorizontalLayout eventsKeyLayout = new HorizontalLayout(); + { + eventsKeyLayout.setSpacing(false); + eventsKeyLayout.setMargin(false); + HorizontalLayout legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_RUMOR, EventStatus.SIGNAL.toString()); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + eventsKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_OUTBREAK, EventStatus.EVENT.toString()); + eventsKeyLayout.addComponent(legendEntry); + } legendLayout.addComponent(eventsKeyLayout); } // Districts if (showRegions && districtValuesLowerQuartile != null && districtValuesMedian != null && districtValuesUpperQuartile != null) { - Label districtsKeyLabel = createStyledLabel(); + Label districtsKeyLabel = new Label(I18nProperties.getString(Strings.entityDistricts)); + if (showCases || showContacts || showEvents) { + CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); + } else { + CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + } legendLayout.addComponent(districtsKeyLabel); legendLayout.addComponent( buildRegionLegend( @@ -557,82 +635,6 @@ private VerticalLayout createMapLegend() { return legendLayout; } - private HorizontalLayout contactsKeyLayout() { - HorizontalLayout contactsKeyLayout = new HorizontalLayout(); - { - contactsKeyLayout.setSpacing(false); - contactsKeyLayout.setMargin(false); - HorizontalLayout legendEntry = - buildMarkerLegendEntry(MarkerIcon.CONTACT_OK, I18nProperties.getCaption(Captions.dashboardNotAContact)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - contactsKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_OVERDUE, I18nProperties.getCaption(Captions.dashboardUnconfirmedContact)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - contactsKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_LONG_OVERDUE, I18nProperties.getCaption(Captions.dashboardConfirmedContact)); - contactsKeyLayout.addComponent(legendEntry); - } - return contactsKeyLayout; - } - - private HorizontalLayout createCasesKeyLayout() { - HorizontalLayout casesKeyLayout = new HorizontalLayout(); - { - casesKeyLayout.setSpacing(false); - casesKeyLayout.setMargin(false); - HorizontalLayout legendEntry = - buildMarkerLegendEntry(MarkerIcon.CASE_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassified)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - casesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_SUSPECT, I18nProperties.getCaption(Captions.dashboardSuspect)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - casesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_PROBABLE, I18nProperties.getCaption(Captions.dashboardProbable)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - casesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_CONFIRMED, I18nProperties.getCaption(Captions.dashboardConfirmed)); - casesKeyLayout.addComponent(legendEntry); - } - return casesKeyLayout; - } - - private HorizontalLayout createEventsKeyLayout() { - HorizontalLayout eventsKeyLayout = new HorizontalLayout(); - { - eventsKeyLayout.setSpacing(false); - eventsKeyLayout.setMargin(false); - HorizontalLayout legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_RUMOR, EventStatus.SIGNAL.toString()); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - eventsKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_OUTBREAK, EventStatus.EVENT.toString()); - eventsKeyLayout.addComponent(legendEntry); - } - return eventsKeyLayout; - } - - private HorizontalLayout createFacilitiesKeyLayout() { - HorizontalLayout facilitiesKeyLayout = new HorizontalLayout(); - { - facilitiesKeyLayout.setSpacing(false); - facilitiesKeyLayout.setMargin(false); - HorizontalLayout legendEntry = - buildMarkerLegendEntry(MarkerIcon.FACILITY_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassifiedOnly)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - facilitiesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_SUSPECT, I18nProperties.getCaption(Captions.dashboardGt1SuspectCases)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - facilitiesKeyLayout.addComponent(legendEntry); - legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_PROBABLE, I18nProperties.getCaption(Captions.dashboardGt1ProbableCases)); - CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); - facilitiesKeyLayout.addComponent(legendEntry); - legendEntry = - buildMarkerLegendEntry(MarkerIcon.FACILITY_CONFIRMED, I18nProperties.getCaption(Captions.dashboardGt1ConfirmedCases)); - facilitiesKeyLayout.addComponent(legendEntry); - } - return facilitiesKeyLayout; - - } - private void createPeriodFilters(VerticalLayout layersLayout) { cmbPeriodType = new ComboBox(); cmbPeriodFilter = new ComboBox(); @@ -1025,13 +1027,43 @@ protected void addLayerOptions(VerticalLayout layersLayout) { } if (UiUtil.hasNationJurisdictionLevel() && UiUtil.permitted(UserRight.CASE_VIEW)) { - regionalOptionGroupHorizontalLayoutConfigMap(layersLayout); - } + OptionGroup regionMapVisualizationSelect = new OptionGroup(); + regionMapVisualizationSelect.setWidth(100, Unit.PERCENTAGE); + regionMapVisualizationSelect.addItems((Object[]) CaseMeasure.values()); + regionMapVisualizationSelect.setValue(caseMeasure); + regionMapVisualizationSelect.addValueChangeListener(event -> { + caseMeasure = (CaseMeasure) event.getProperty().getValue(); + refreshMapDashboard(true); + }); - checkBoxesHideOtherCountriesAndShowCurrentEpiSituationCBConfig(layersLayout); - } + HorizontalLayout showRegionsLayout = new HorizontalLayout(); + { + showRegionsLayout.setMargin(false); + showRegionsLayout.setSpacing(false); + CheckBox showRegionsCheckBox = new CheckBox(); + showRegionsCheckBox.setId(Captions.dashboardShowRegions); + showRegionsCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardShowRegions)); + showRegionsCheckBox.setValue(showRegions); + showRegionsCheckBox.addValueChangeListener(e -> { + showRegions = (boolean) e.getProperty().getValue(); + regionMapVisualizationSelect.setEnabled(showRegions); + regionMapVisualizationSelect.setValue(caseMeasure); + refreshMapDashboard(true); + }); + showRegionsLayout.addComponent(showRegionsCheckBox); + + Label infoLabel = new Label(VaadinIcons.INFO_CIRCLE.getHtml(), ContentMode.HTML); + infoLabel.setDescription(I18nProperties.getString(Strings.infoCaseIncidence)); + CssStyles.style(infoLabel, CssStyles.LABEL_MEDIUM, CssStyles.LABEL_SECONDARY, CssStyles.HSPACE_LEFT_3); + infoLabel.setHeightUndefined(); + showRegionsLayout.addComponent(infoLabel); + showRegionsLayout.setComponentAlignment(infoLabel, Alignment.TOP_CENTER); + } + layersLayout.addComponent(showRegionsLayout); + layersLayout.addComponent(regionMapVisualizationSelect); + regionMapVisualizationSelect.setEnabled(showRegions); + } - private void checkBoxesHideOtherCountriesAndShowCurrentEpiSituationCBConfig(VerticalLayout layersLayout) { CheckBox hideOtherCountriesCheckBox = new CheckBox(); hideOtherCountriesCheckBox.setId(Captions.dashboardHideOtherCountries); hideOtherCountriesCheckBox.setCaption(I18nProperties.getCaption(Captions.dashboardHideOtherCountries)); @@ -1092,6 +1124,7 @@ else if (dashboardDataProvider.getDashboardType() == DashboardType.DISEASE) { mapHeaderLayout.setComponentAlignment(collapseMapButton, Alignment.MIDDLE_RIGHT); }); + return mapHeaderLayout; } @@ -1105,14 +1138,52 @@ protected List getLegendComponents() { CssStyles.style(facilitiesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); legendComponents.add(facilitiesKeyLabel); - HorizontalLayout facilitiesKeyLayout = createFacilitiesKeyLayout(); + HorizontalLayout facilitiesKeyLayout = new HorizontalLayout(); + { + facilitiesKeyLayout.setSpacing(false); + facilitiesKeyLayout.setMargin(false); + HorizontalLayout legendEntry = + buildMarkerLegendEntry(MarkerIcon.FACILITY_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassifiedOnly)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + facilitiesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_SUSPECT, I18nProperties.getCaption(Captions.dashboardGt1SuspectCases)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + facilitiesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.FACILITY_PROBABLE, I18nProperties.getCaption(Captions.dashboardGt1ProbableCases)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + facilitiesKeyLayout.addComponent(legendEntry); + legendEntry = + buildMarkerLegendEntry(MarkerIcon.FACILITY_CONFIRMED, I18nProperties.getCaption(Captions.dashboardGt1ConfirmedCases)); + facilitiesKeyLayout.addComponent(legendEntry); + } legendComponents.add(facilitiesKeyLayout); } - Label casesKeyLabel = createCasesKeyLabel(); + Label casesKeyLabel = new Label(I18nProperties.getString(Strings.entityCases)); + if (mapCaseDisplayMode == MapCaseDisplayMode.FACILITY || mapCaseDisplayMode == MapCaseDisplayMode.FACILITY_OR_CASE_ADDRESS) { + CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); + } else { + CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + } legendComponents.add(casesKeyLabel); - HorizontalLayout casesKeyLayout = createCasesKeyLayout(); + HorizontalLayout casesKeyLayout = new HorizontalLayout(); + { + casesKeyLayout.setSpacing(false); + casesKeyLayout.setMargin(false); + HorizontalLayout legendEntry = + buildMarkerLegendEntry(MarkerIcon.CASE_UNCLASSIFIED, I18nProperties.getCaption(Captions.dashboardNotYetClassified)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + casesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_SUSPECT, I18nProperties.getCaption(Captions.dashboardSuspect)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + casesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_PROBABLE, I18nProperties.getCaption(Captions.dashboardProbable)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + casesKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CASE_CONFIRMED, I18nProperties.getCaption(Captions.dashboardConfirmed)); + casesKeyLayout.addComponent(legendEntry); + } legendComponents.add(casesKeyLayout); } @@ -1126,7 +1197,20 @@ protected List getLegendComponents() { } legendComponents.add(contactsKeyLabel); - HorizontalLayout contactsKeyLayout = contactsKeyLayout(); + HorizontalLayout contactsKeyLayout = new HorizontalLayout(); + { + contactsKeyLayout.setSpacing(false); + contactsKeyLayout.setMargin(false); + HorizontalLayout legendEntry = + buildMarkerLegendEntry(MarkerIcon.CONTACT_OK, I18nProperties.getCaption(Captions.dashboardNotAContact)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + contactsKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_OVERDUE, I18nProperties.getCaption(Captions.dashboardUnconfirmedContact)); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + contactsKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.CONTACT_LONG_OVERDUE, I18nProperties.getCaption(Captions.dashboardConfirmedContact)); + contactsKeyLayout.addComponent(legendEntry); + } legendComponents.add(contactsKeyLayout); } @@ -1140,13 +1224,27 @@ protected List getLegendComponents() { } legendComponents.add(eventsKeyLabel); - HorizontalLayout eventsKeyLayout =createEventsKeyLayout(); + HorizontalLayout eventsKeyLayout = new HorizontalLayout(); + { + eventsKeyLayout.setSpacing(false); + eventsKeyLayout.setMargin(false); + HorizontalLayout legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_RUMOR, EventStatus.SIGNAL.toString()); + CssStyles.style(legendEntry, CssStyles.HSPACE_RIGHT_3); + eventsKeyLayout.addComponent(legendEntry); + legendEntry = buildMarkerLegendEntry(MarkerIcon.EVENT_OUTBREAK, EventStatus.EVENT.toString()); + eventsKeyLayout.addComponent(legendEntry); + } legendComponents.add(eventsKeyLayout); } // Districts if (showRegions && districtValuesLowerQuartile != null && districtValuesMedian != null && districtValuesUpperQuartile != null) { - Label districtsKeyLabel= createStyledLabel(); + Label districtsKeyLabel = new Label(I18nProperties.getString(Strings.entityDistricts)); + if (showCases || showContacts || showEvents) { + CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); + } else { + CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); + } legendComponents.add(districtsKeyLabel); legendComponents.add( buildRegionLegend( @@ -1166,26 +1264,6 @@ protected List getLegendComponents() { return legendComponents; } - private Label createCasesKeyLabel() { - Label casesKeyLabel = new Label(I18nProperties.getString(Strings.entityCases)); - if (mapCaseDisplayMode == MapCaseDisplayMode.FACILITY || mapCaseDisplayMode == MapCaseDisplayMode.FACILITY_OR_CASE_ADDRESS) { - CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); - } else { - CssStyles.style(casesKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); - } - return casesKeyLabel; - } - - private Label createStyledLabel() { - Label districtsKeyLabel = new Label(I18nProperties.getString(Strings.entityDistricts)); - if (showCases || showContacts || showEvents) { - CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_3); - } else { - CssStyles.style(districtsKeyLabel, CssStyles.H4, CssStyles.VSPACE_4, CssStyles.VSPACE_TOP_NONE); - } - return districtsKeyLabel; - } - public static HorizontalLayout buildMapIconLegendEntry(String iconName, String labelCaption) { Image icon = new Image(null, new ExternalResource("VAADIN/map/marker/" + iconName + ".png")); icon.setWidth(12.375f, Unit.PIXELS); @@ -1463,35 +1541,30 @@ private void showCaseMarkers(List cases) { } for (MapCaseDto caze : mapCaseDtos) { - LeafletMarker marker = getLeafletMarker(caze); - caseMarkers.add(marker); - } - - map.addMarkerGroup("cases", caseMarkers); - } - - @NotNull - private static LeafletMarker getLeafletMarker(MapCaseDto caze) { - LeafletMarker marker = new LeafletMarker(); - CaseClassification caseClassification = caze.getCaseClassification(); - if (caseClassification == CaseClassification.CONFIRMED + LeafletMarker marker = new LeafletMarker(); + CaseClassification caseClassification = caze.getCaseClassification(); + if (caseClassification == CaseClassification.CONFIRMED || caseClassification == CaseClassification.CONFIRMED_NO_SYMPTOMS || caseClassification == CaseClassification.CONFIRMED_UNKNOWN_SYMPTOMS) { - marker.setIcon(MarkerIcon.CASE_CONFIRMED); - } else if (caseClassification == CaseClassification.PROBABLE) { - marker.setIcon(MarkerIcon.CASE_PROBABLE); - } else if (caseClassification == CaseClassification.SUSPECT) { - marker.setIcon(MarkerIcon.CASE_SUSPECT); - } else { - marker.setIcon(MarkerIcon.CASE_UNCLASSIFIED); - } + marker.setIcon(MarkerIcon.CASE_CONFIRMED); + } else if (caseClassification == CaseClassification.PROBABLE) { + marker.setIcon(MarkerIcon.CASE_PROBABLE); + } else if (caseClassification == CaseClassification.SUSPECT) { + marker.setIcon(MarkerIcon.CASE_SUSPECT); + } else { + marker.setIcon(MarkerIcon.CASE_UNCLASSIFIED); + } - if (caze.getAddressLat() != null && caze.getAddressLon() != null) { - marker.setLatLon(caze.getAddressLat(), caze.getAddressLon()); - } else { - marker.setLatLon(caze.getReportLat(), caze.getReportLon()); + if (caze.getAddressLat() != null && caze.getAddressLon() != null) { + marker.setLatLon(caze.getAddressLat(), caze.getAddressLon()); + } else { + marker.setLatLon(caze.getReportLat(), caze.getReportLon()); + } + + caseMarkers.add(marker); } - return marker; + + map.addMarkerGroup("cases", caseMarkers); } private void fillCaseLists(List cases) { @@ -1739,4 +1812,4 @@ private void makeMapOverlayInvisible() { overlayBackground.setVisible(false); overlayLayout.setVisible(false); } -} \ No newline at end of file +} From 08d76d040e5a40bb87ae5db27618525034a3555f Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 29 Oct 2024 09:43:03 +0000 Subject: [PATCH 57/71] clean up white space --- .../src/main/java/de/symeda/sormas/api/user/UserFacade.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java index 419b1f3b6a5..341fe405863 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java @@ -160,7 +160,7 @@ List getUserRefsByInfrastructure( /** * Retrieves the user rights of the user specified by the passed UUID, or those of the current user if no UUID is specified. * Requesting the user rights of another user without the rights to view users and user roles results in an AccessDeniedException. - * + * * @param userUuid * The UUID of the user to request the user rights for * @return A set containing the user rights associated to all user roles assigned to the user From 681e97961cfb7c81caac8564b7b0118ce7ec367b Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 29 Oct 2024 09:44:02 +0000 Subject: [PATCH 58/71] clean up white space --- .../src/main/java/de/symeda/sormas/api/user/UserFacade.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java index 341fe405863..419b1f3b6a5 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java @@ -160,7 +160,7 @@ List getUserRefsByInfrastructure( /** * Retrieves the user rights of the user specified by the passed UUID, or those of the current user if no UUID is specified. * Requesting the user rights of another user without the rights to view users and user roles results in an AccessDeniedException. - * + * * @param userUuid * The UUID of the user to request the user rights for * @return A set containing the user rights associated to all user roles assigned to the user From e76ec5b6982a42f9c9c5c91baa8c86325c932356 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 29 Oct 2024 09:50:25 +0000 Subject: [PATCH 59/71] clean up space --- .../src/main/java/de/symeda/sormas/api/user/UserFacade.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java index 419b1f3b6a5..ca40dbc6d78 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java @@ -79,7 +79,7 @@ public interface UserFacade { long count(UserCriteria userCriteria); /** - * + * * @param district * reference of the district to be filtered for. When this district is null, it is not filtered in this regard. * NOTE: some users don't have a district (often users with NATIONAL_USER role, for example). They will From 08cc854d517992955f26ccc94dc9f4d78a37f0eb Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 29 Oct 2024 09:57:15 +0000 Subject: [PATCH 60/71] clean space --- .../src/main/java/de/symeda/sormas/api/user/UserFacade.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java index ca40dbc6d78..62ca46527a2 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java @@ -57,7 +57,7 @@ public interface UserFacade { UserDto getByUserName(String userName); /** - * + * * @param regionRef * reference of the region to be filtered for. When this region is null, it is not filtered in this regard. * NOTE: some users don't have a region (often users with NATIONAL_USER role, for example). They will From ebe670c393f431ef6b02b2520485df3cdde53ced Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 29 Oct 2024 09:59:06 +0000 Subject: [PATCH 61/71] clean white space --- .../src/main/java/de/symeda/sormas/api/user/UserFacade.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java index 62ca46527a2..5825e3f3b27 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java @@ -57,7 +57,7 @@ public interface UserFacade { UserDto getByUserName(String userName); /** - * + * * @param regionRef * reference of the region to be filtered for. When this region is null, it is not filtered in this regard. * NOTE: some users don't have a region (often users with NATIONAL_USER role, for example). They will From d40c820d744e4f01dd7656cf7195b146a36dffe9 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 29 Oct 2024 10:00:04 +0000 Subject: [PATCH 62/71] clean --- .../src/main/java/de/symeda/sormas/api/user/UserFacade.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java index 5825e3f3b27..2606ce8da7e 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java @@ -93,7 +93,7 @@ public interface UserFacade { List getUserRefsByDistrict(DistrictReferenceDto district, Disease limitedDisease, UserRight... userRights); /** - * + * * @param district * reference of the district to be filtered for. When this district is null, it is not filtered in this regard. * NOTE: some users don't have a district (often users with NATIONAL_USER role, for example). They will From 0a00257a3d9c614911dc0ea7767acf15a5bc61e8 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 29 Oct 2024 10:09:20 +0000 Subject: [PATCH 63/71] clean up white space --- .../src/main/java/de/symeda/sormas/api/user/UserFacade.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java index 2606ce8da7e..62ca46527a2 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java @@ -57,7 +57,7 @@ public interface UserFacade { UserDto getByUserName(String userName); /** - * + * * @param regionRef * reference of the region to be filtered for. When this region is null, it is not filtered in this regard. * NOTE: some users don't have a region (often users with NATIONAL_USER role, for example). They will @@ -93,7 +93,7 @@ public interface UserFacade { List getUserRefsByDistrict(DistrictReferenceDto district, Disease limitedDisease, UserRight... userRights); /** - * + * * @param district * reference of the district to be filtered for. When this district is null, it is not filtered in this regard. * NOTE: some users don't have a district (often users with NATIONAL_USER role, for example). They will From 03d471368f950aca205648c18a9345a35ee0879d Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 29 Oct 2024 10:11:28 +0000 Subject: [PATCH 64/71] clean up white space --- .../src/main/java/de/symeda/sormas/api/user/UserFacade.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java index 62ca46527a2..faa43269b9b 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java @@ -93,7 +93,7 @@ public interface UserFacade { List getUserRefsByDistrict(DistrictReferenceDto district, Disease limitedDisease, UserRight... userRights); /** - * + * * @param district * reference of the district to be filtered for. When this district is null, it is not filtered in this regard. * NOTE: some users don't have a district (often users with NATIONAL_USER role, for example). They will From 8b4b9a95a057cc2811334ed8a1b11a1ef1efee20 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 29 Oct 2024 10:13:03 +0000 Subject: [PATCH 65/71] clean up space --- .../src/main/java/de/symeda/sormas/api/user/UserFacade.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java index faa43269b9b..8dd66e15369 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserFacade.java @@ -160,7 +160,7 @@ List getUserRefsByInfrastructure( /** * Retrieves the user rights of the user specified by the passed UUID, or those of the current user if no UUID is specified. * Requesting the user rights of another user without the rights to view users and user roles results in an AccessDeniedException. - * + * * @param userUuid * The UUID of the user to request the user rights for * @return A set containing the user rights associated to all user roles assigned to the user From abd7f5198abdb52c13d2ae9129842fa5174ac3e3 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:59:55 +0000 Subject: [PATCH 66/71] Added DiseaseDetails Rights --- .../symeda/sormas/api/feature/FeatureType.java | 2 +- .../sormas/api/user/DefaultUserRole.java | 2 ++ .../de/symeda/sormas/api/user/UserRight.java | 3 +++ .../symeda/sormas/api/user/UserRightGroup.java | 3 ++- sormas-api/src/main/resources/enum.properties | 2 ++ .../backend/dashboard/DashboardFacadeEjb.java | 3 +++ .../backend/outbreak/OutbreakService.java | 6 ++++-- .../resources/META-INF/glassfish-ejb-jar.xml | 5 +++++ .../src/main/resources/sql/sormas_schema.sql | 5 +++++ .../src/main/webapp/WEB-INF/glassfish-web.xml | 5 +++++ sormas-rest/src/main/webapp/WEB-INF/web.xml | 4 ++++ .../java/de/symeda/sormas/ui/MainScreen.java | 4 ++++ .../ui/dashboard/AbstractDashboardView.java | 2 +- .../ui/dashboard/DashboardController.java | 2 +- .../disease/tile/DiseaseTileComponent.java | 18 +++++++++++++----- .../src/main/webapp/WEB-INF/glassfish-web.xml | 7 ++++++- sormas-ui/src/main/webapp/WEB-INF/web.xml | 4 ++++ 17 files changed, 65 insertions(+), 12 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java index a5e9675189b..f54a6b4e65f 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/feature/FeatureType.java @@ -332,7 +332,7 @@ public enum FeatureType { CONTACT_TRACING }, null, ImmutableMap.of(FeatureTypeProperty.S2S_SHARING, Boolean.FALSE)), - DISEASE_DETAILS(false, true, null, null, null); + DISEASE_DETAILS(true, false, null, null, null); public static final FeatureType[] SURVEILLANCE_FEATURE_TYPES = { FeatureType.CASE_SURVEILANCE, diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/DefaultUserRole.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/DefaultUserRole.java index b91d28b515b..afc901005c1 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/DefaultUserRole.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/DefaultUserRole.java @@ -311,6 +311,7 @@ public Set getDefaultUserRights() { ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_ARCHIVE, ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_DELETE, ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_EXPORT, + DISEASE_DETAILS_VIEW, PERSON_VIEW, PERSON_EDIT, PERSON_DELETE, @@ -1329,6 +1330,7 @@ public Set getDefaultUserRights() { ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_ARCHIVE, ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_DELETE, ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_EXPORT, + DISEASE_DETAILS_VIEW, PERSON_VIEW, PERSON_EDIT, PERSON_DELETE, 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 806a73d1cb6..25d16a9eb20 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 @@ -70,6 +70,8 @@ public enum UserRight { ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_DELETE(UserRightGroup.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION), ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_EXPORT(UserRightGroup.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION), + DISEASE_DETAILS_VIEW(UserRightGroup.DISEASE_DETAILS_VIEW), + PERSON_VIEW(UserRightGroup.PERSON), PERSON_EDIT(UserRightGroup.PERSON, UserRight._PERSON_VIEW), PERSON_DELETE(UserRightGroup.PERSON, UserRight._PERSON_VIEW, UserRight._VISIT_DELETE), @@ -531,6 +533,7 @@ public enum UserRight { public static final String _EXTERNAL_EMAIL_SEND = "EXTERNAL_EMAIL_SEND"; public static final String _EXTERNAL_EMAIL_ATTACH_DOCUMENTS = "EXTERNAL_EMAIL_ATTACH_DOCUMENTS"; public static final String _CUSTOMIZABLE_ENUM_MANAGEMENT = "CUSTOMIZABLE_ENUM_MANAGEMENT"; + public static final String _DISEASE_DETAILS_VIEW ="DISEASE_DETAILS_VIEW" ; private static final Map> userRightDependencies = buildUserRightDependencies(); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java index 7fa2dd34069..ada0bee03be 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/user/UserRightGroup.java @@ -48,7 +48,8 @@ public enum UserRightGroup { EXPORT, CONFIGURATION, - EXTERNAL; + EXTERNAL, + DISEASE_DETAILS_VIEW; @Override public String toString() { diff --git a/sormas-api/src/main/resources/enum.properties b/sormas-api/src/main/resources/enum.properties index 8d66487befb..26ac488e736 100644 --- a/sormas-api/src/main/resources/enum.properties +++ b/sormas-api/src/main/resources/enum.properties @@ -1565,6 +1565,7 @@ UserRight.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_EDIT = Edit existing adverse eve UserRight.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_DELETE = Delete adverse events following immunization from the system UserRight.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_ARCHIVE = Archive adverse events following immunization UserRight.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_EXPORT = Export adverse events following immunization +UserRight.DISEASE_DETAILS_VIEW = View details of selected disease UserRight.PERSON_EXPORT = Export persons UserRight.CONTACT_MERGE = Merge contacts UserRight.EVENTGROUP_CREATE = Create new event groups @@ -1790,6 +1791,7 @@ UserRight.Desc.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_EDIT = Able to edit existin UserRight.Desc.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_DELETE = Able to delete adverse events following immunization from the system UserRight.Desc.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_ARCHIVE = Able to archive adverse events following immunization UserRight.Desc.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_EXPORT = Able to export adverse events following immunization +UserRight.Desc.DISEASE_DETAILS_VIEW = Able to View details of selected disease UserRight.Desc.PERSON_EXPORT = Able to export persons UserRight.Desc.CONTACT_MERGE = Able to merge contacts UserRight.Desc.EVENTGROUP_CREATE = Able to create new event groups diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java index defa0249587..2ebf72ffd27 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjb.java @@ -807,6 +807,7 @@ public List getDiseaseBurden( } @Override + @RightsAllowed({UserRight._DISEASE_DETAILS_VIEW}) public DiseaseBurdenDto getDiseaseForDashboard( RegionReferenceDto region, DistrictReferenceDto district, @@ -875,6 +876,8 @@ public DiseaseBurdenDto getDiseaseForDashboard( } @Override + @RightsAllowed({ + UserRight._DISEASE_DETAILS_VIEW}) public DiseaseBurdenDto getDiseaseGridForDashboard( RegionReferenceDto region, DistrictReferenceDto district, diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java index aa622c51736..2e5ce59dc69 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakService.java @@ -174,7 +174,8 @@ public Predicate buildCriteriaFilter(OutbreakCriteria criteria, CriteriaBuilder filter = CriteriaBuilderHelper.and(cb, filter, from.get(Outbreak.DISEASE).in(criteria.getDiseases())); } if (criteria.getDistrict() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.equal(from.join(Outbreak.DISTRICT, JoinType.LEFT).get(District.UUID), criteria.getDistrict().getUuid())); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.equal(from.join(Outbreak.DISTRICT, JoinType.LEFT).get(District.UUID), criteria.getDistrict().getUuid())); } if (criteria.getRegion() != null) { filter = CriteriaBuilderHelper.and( @@ -194,7 +195,8 @@ public Predicate buildCriteriaFilter(OutbreakCriteria criteria, CriteriaBuilder filter = CriteriaBuilderHelper.and(cb, filter, activeFilter); } if (criteria.getReportedDateFrom() != null || criteria.getReportedDateTo() != null) { - filter = CriteriaBuilderHelper.and(cb, filter, cb.between(from.get(Outbreak.REPORT_DATE), criteria.getReportedDateFrom(), criteria.getReportedDateTo())); + filter = CriteriaBuilderHelper + .and(cb, filter, cb.between(from.get(Outbreak.REPORT_DATE), criteria.getReportedDateFrom(), criteria.getReportedDateTo())); } return filter; diff --git a/sormas-backend/src/main/resources/META-INF/glassfish-ejb-jar.xml b/sormas-backend/src/main/resources/META-INF/glassfish-ejb-jar.xml index c907e3669f4..79a1412f56a 100644 --- a/sormas-backend/src/main/resources/META-INF/glassfish-ejb-jar.xml +++ b/sormas-backend/src/main/resources/META-INF/glassfish-ejb-jar.xml @@ -642,6 +642,11 @@ DASHBOARD_ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_VIEW + + DISEASE_DETAILS_VIEW + DISEASE_DETAILS_VIEW + + CASE_CLINICIAN_VIEW CASE_CLINICIAN_VIEW diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index fb32127ab77..970885c691d 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -13668,4 +13668,9 @@ INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'ADVERSE_EV INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_EXPORT' FROM public.userroles WHERE userroles.linkeddefaultuserrole in ('ADMIN','NATIONAL_USER'); INSERT INTO schema_version (version_number, comment) VALUES (552, 'Adverse Events Following Immunization (AEFI) - Entities #12634'); + +-- Assign DISEASE_DETAILS_VIEW user rights to default admin and national_user user roles +INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'DISEASE_DETAILS_VIEW' FROM public.userroles WHERE userroles.linkeddefaultuserrole in ('ADMIN','NATIONAL_USER'); + +INSERT INTO schema_version (version_number, comment) VALUES (553, 'Dashboard Diseases Details View - #12880'); -- *** Insert new sql commands BEFORE this line. Remember to always consider _history tables. *** diff --git a/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml b/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml index d9f6a362c55..12fc5998e12 100644 --- a/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml +++ b/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml @@ -625,6 +625,11 @@ DASHBOARD_ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_VIEW + + DISEASE_DETAILS_VIEW + DISEASE_DETAILS_VIEW + + CASE_CLINICIAN_VIEW CASE_CLINICIAN_VIEW diff --git a/sormas-rest/src/main/webapp/WEB-INF/web.xml b/sormas-rest/src/main/webapp/WEB-INF/web.xml index dc2a67e6b83..b5a41db8405 100644 --- a/sormas-rest/src/main/webapp/WEB-INF/web.xml +++ b/sormas-rest/src/main/webapp/WEB-INF/web.xml @@ -508,6 +508,10 @@ DASHBOARD_ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_VIEW + + DISEASE_DETAILS_VIEW + + CASE_CLINICIAN_VIEW diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java index 00ecea96b08..8504987662f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java @@ -460,6 +460,10 @@ private static boolean aefiDashboardPermitted() { UserRight.DASHBOARD_ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_VIEW); } + private static boolean diseaseDetailsDashboardPermitted() { + return permitted(EnumSet.of(FeatureType.DISEASE_DETAILS),UserRight.DISEASE_DETAILS_VIEW); + } + private static Set initKnownViews() { final Set views = new HashSet<>( Arrays.asList( diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java index 87d8c116c2c..948647bdf82 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java @@ -83,7 +83,7 @@ protected AbstractDashboardView(String viewName) { dashboardSwitcher.setItemCaption(DashboardType.CAMPAIGNS, I18nProperties.getEnumCaption(DashboardType.CAMPAIGNS)); } - if (permitted(FeatureType.DISEASE_DETAILS)) { + if (permitted(FeatureType.DISEASE_DETAILS , UserRight.DISEASE_DETAILS_VIEW) ) { dashboardSwitcher.addItem(DashboardType.DISEASE); dashboardSwitcher.setItemCaption(DashboardType.DISEASE, I18nProperties.getEnumCaption(DashboardType.DISEASE)); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java index b5f972071ce..cbfccd7b739 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java @@ -62,7 +62,7 @@ public void registerViews(Navigator navigator) { navigator.addView(SampleDashboardView.VIEW_NAME, SampleDashboardView.class); } - if (permitted(FeatureType.DISEASE_DETAILS)) { + if (permitted(FeatureType.DISEASE_DETAILS, UserRight.DISEASE_DETAILS_VIEW)) { navigator.addView(DiseaseDetailsView.VIEW_NAME, DiseaseDetailsView.class); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java index 2ad55559488..1fdb3e89554 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java @@ -35,6 +35,9 @@ import de.symeda.sormas.ui.dashboard.DashboardDataProvider; import de.symeda.sormas.ui.utils.ButtonHelper; import com.vaadin.ui.themes.ValoTheme; +import de.symeda.sormas.api.feature.FeatureType; +import de.symeda.sormas.api.user.UserRight; +import static de.symeda.sormas.ui.UiUtil.permitted; public class DiseaseTileComponent extends VerticalLayout { @@ -153,7 +156,7 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo addComponent(layout); } - private void addStatsLayout(DiseaseBurdenDto diseaseBurden,DashboardDataProvider dashboardDataProvider) { + private void addStatsLayout(DiseaseBurdenDto diseaseBurden, DashboardDataProvider dashboardDataProvider) { Long fatalities = diseaseBurden.getCaseDeathCount(); Long events = diseaseBurden.getEventCount(); String district = diseaseBurden.getLastReportedDistrictName(); @@ -166,22 +169,27 @@ private void addStatsLayout(DiseaseBurdenDto diseaseBurden,DashboardDataProvider layout.addStyleName(CssStyles.BACKGROUND_HIGHLIGHT); StatsItem lastReportItem = - new StatsItem.Builder(Captions.dashboardLastReport, district.isEmpty() ? I18nProperties.getString(Strings.none) : district) + new StatsItem.Builder(Captions.dashboardLastReport, district.length() == 0 ? I18nProperties.getString(Strings.none) : district) .singleColumn(true) .build(); lastReportItem.addStyleName(CssStyles.VSPACE_TOP_4); layout.addComponent(lastReportItem); StatsItem fatality = new StatsItem.Builder(Captions.dashboardFatalities, fatalities).critical(fatalities > 0).build(); - fatality.addStyleName(CssStyles.HSPACE_LEFT_5); + if (permitted(FeatureType.DISEASE_DETAILS , UserRight.DISEASE_DETAILS_VIEW) ) { + fatality.addStyleName(CssStyles.HSPACE_LEFT_5); + } + layout.addComponent(fatality); StatsItem noOfEventsItem = new StatsItem.Builder(Captions.DiseaseBurden_eventCount, events).build(); noOfEventsItem.addStyleName(CssStyles.VSPACE_4); layout.addComponent(noOfEventsItem); - Button component = addDiseaseButton(disease, dashboardDataProvider); - layout.addComponent(component); + if (permitted(FeatureType.DISEASE_DETAILS , UserRight.DISEASE_DETAILS_VIEW) ) { + Button component = addDiseaseButton(disease, dashboardDataProvider); + layout.addComponent(component); + } addComponent(layout); } diff --git a/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml b/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml index cc6f9e6ccf8..2f1cb43dd34 100644 --- a/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml +++ b/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml @@ -622,7 +622,12 @@ DASHBOARD_ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_VIEW - DASHBOARD_ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_VIEW + DASHBOARD_ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_VI+EW + + + + DISEASE_DETAILS_VIEW + DISEASE_DETAILS_VIEW diff --git a/sormas-ui/src/main/webapp/WEB-INF/web.xml b/sormas-ui/src/main/webapp/WEB-INF/web.xml index b62eb6a327a..5916fc2f1d9 100644 --- a/sormas-ui/src/main/webapp/WEB-INF/web.xml +++ b/sormas-ui/src/main/webapp/WEB-INF/web.xml @@ -513,6 +513,10 @@ DASHBOARD_ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_VIEW + + DISEASE_DETAILS_VIEW + + CASE_CLINICIAN_VIEW From 62774dda412cd634220a6b061b2107e66857b586 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Wed, 30 Oct 2024 09:44:04 +0000 Subject: [PATCH 67/71] cleanning unnessary white space --- .../src/main/java/de/symeda/sormas/api/user/UserRight.java | 1 - 1 file changed, 1 deletion(-) 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 25d16a9eb20..9208c87739c 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 @@ -71,7 +71,6 @@ public enum UserRight { ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_EXPORT(UserRightGroup.ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION), DISEASE_DETAILS_VIEW(UserRightGroup.DISEASE_DETAILS_VIEW), - PERSON_VIEW(UserRightGroup.PERSON), PERSON_EDIT(UserRightGroup.PERSON, UserRight._PERSON_VIEW), PERSON_DELETE(UserRightGroup.PERSON, UserRight._PERSON_VIEW, UserRight._VISIT_DELETE), From dd4b4bf956579336d33a3a85bd80a029217f3d39 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Mon, 4 Nov 2024 09:24:54 +0000 Subject: [PATCH 68/71] update on sormas_schema.sql --- sormas-backend/src/main/resources/sql/sormas_schema.sql | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index e04fde93685..cdfcba874fe 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -13669,10 +13669,6 @@ INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'ADVERSE_EV INSERT INTO schema_version (version_number, comment) VALUES (552, 'Adverse Events Following Immunization (AEFI) - Entities #12634'); -<<<<<<< HEAD - -======= - -- 2024-10-23 Add "Disease" Attribute to Document Templates for Filtering #13160 CREATE TABLE documenttemplates ( id bigint not null, @@ -13701,7 +13697,7 @@ CREATE TRIGGER delete_history_trigger ALTER TABLE documenttemplates_history OWNER TO sormas_user; INSERT INTO schema_version (version_number, comment, upgradeneeded) VALUES (553, 'Add "Disease" Attribute to Document Templates for Filtering #13160', true); ->>>>>>> 247e01fb52a290d194896a3c521cd701f868a843 + -- Assign DISEASE_DETAILS_VIEW user rights to default admin and national_user user roles INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'DISEASE_DETAILS_VIEW' FROM public.userroles WHERE userroles.linkeddefaultuserrole in ('ADMIN','NATIONAL_USER'); From ece33a1f1284c3302557a8f4341892f893b28453 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Thu, 7 Nov 2024 10:16:37 +0000 Subject: [PATCH 69/71] method guidelines --- .../api/dashboard/DashboardCriteria.java | 7 + .../sormas/api/disease/DiseaseBurdenDto.java | 120 ++++++----- .../api/infrastructure/region/RegionDto.java | 1 + .../sormas/api/outbreak/OutbreakCriteria.java | 4 +- .../api/outbreak/OutbreakCriteriaTest.java | 194 ++++++++++-------- .../sormas/backend/caze/CaseService.java | 2 - .../backend/caze/CaseUserFilterCriteria.java | 4 + .../backend/dashboard/DashboardService.java | 1 - .../backend/outbreak/OutbreakFacadeEjb.java | 1 + .../sormas/backend/AbstractBeanTest.java | 1 + .../caze/CaseUserFilterCriteriaTest.java | 2 + .../dashboard/DashboardFacadeEjbTest.java | 4 + .../backend/disease/DiseaseFacadeEjbTest.java | 2 + .../backend/geo/RegionFacadeEjbTest.java | 5 + .../java/de/symeda/sormas/ui/MainScreen.java | 4 - .../AbstractDashboardDataProvider.java | 10 + .../ui/dashboard/AbstractDashboardView.java | 4 + .../ui/dashboard/DashboardController.java | 1 + .../ui/dashboard/DashboardDataProvider.java | 6 + .../components/DashboardFilterLayout.java | 17 +- .../DiseaseDetailsComponent.java | 7 + .../diseasedetails/DiseaseDetailsView.java | 8 + .../DiseaseDetailsViewLayout.java | 10 +- .../dashboard/map/DashboardMapComponent.java | 2 + .../ui/dashboard/map/MapCasePeriodOption.java | 1 + .../ui/dashboard/map/MapPeriodType.java | 1 + .../disease/DiseaseOverviewComponent.java | 1 + .../disease/tile/DiseaseTileComponent.java | 3 +- .../disease/tile/DiseaseTileViewLayout.java | 1 + .../disease/DiseaseDashboardServiceTest.java | 3 + 30 files changed, 259 insertions(+), 168 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java index b7d1ec03004..3efd57cce50 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/dashboard/DashboardCriteria.java @@ -56,32 +56,39 @@ public CaseMeasure getCaseMeasure() { } public CaseClassification getCaseClassification() { + return caseClassification; } public DashboardCriteria caseClassification(CaseClassification caseClassification) { + this.caseClassification = caseClassification; return this; } public NewDateFilterType getDateFilterType() { + return dateFilterType; } public DashboardCriteria dateFilterType(NewDateFilterType dateFilterType) { + this.dateFilterType = dateFilterType; return this; } public void setOutcome(CaseOutcome outcome) { + this.outcome = outcome; } public CaseOutcome getOutcome() { + return outcome; } public DashboardCriteria setDateTypeClass(NewCaseDateType dateTypeClass) { + this.dateTypeClass = dateTypeClass; return this; } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java index 87a96db668c..d90832eb9c0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java @@ -18,11 +18,11 @@ package de.symeda.sormas.api.disease; import java.io.Serializable; +import java.util.Date; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.infrastructure.region.RegionDto; -import java.util.Date; public class DiseaseBurdenDto implements Serializable { @@ -57,7 +57,6 @@ public class DiseaseBurdenDto implements Serializable { public static final String DEATH = "deaths"; public static final String DEATH_COUNT = "deathsCount"; - public static final String OTHER = "other"; public static final String OTHER_COUNT = "otherCount"; @@ -80,7 +79,6 @@ public class DiseaseBurdenDto implements Serializable { private String deaths; private String deathsCount; - private RegionDto region; private String recovered; @@ -92,35 +90,28 @@ public class DiseaseBurdenDto implements Serializable { private String other; private String otherCount; - private Date toDate; private Date fromDate; - public DiseaseBurdenDto( - RegionDto regionDto, - String total, - String activeCases, - String recovered, - String deaths,String other) { + public DiseaseBurdenDto(RegionDto regionDto, String total, String activeCases, String recovered, String deaths, String other) { this.region = regionDto; this.total = total; this.activeCases = activeCases; this.recovered = recovered; this.deaths = deaths; - this.other=other; + this.other = other; } - public DiseaseBurdenDto( - Disease disease, - Long caseCount, - Long previousCaseCount, - Long eventCount, - Long outbreakDistrictCount, - Long caseDeathCount, - String lastReportedDistrictName, - String outbreakDistrict) { + Disease disease, + Long caseCount, + Long previousCaseCount, + Long eventCount, + Long outbreakDistrictCount, + Long caseDeathCount, + String lastReportedDistrictName, + String outbreakDistrict) { this.disease = disease; this.caseCount = caseCount; @@ -133,16 +124,16 @@ public DiseaseBurdenDto( } public DiseaseBurdenDto( - Disease disease, - Long caseCount, - Long previousCaseCount, - Long eventCount, - Long outbreakDistrictCount, - Long caseDeathCount, - String lastReportedDistrictName, - String outbreakDistrict, - Date from, - Date to) { + Disease disease, + Long caseCount, + Long previousCaseCount, + Long eventCount, + Long outbreakDistrictCount, + Long caseDeathCount, + String lastReportedDistrictName, + String outbreakDistrict, + Date from, + Date to) { this.disease = disease; this.caseCount = caseCount; @@ -153,18 +144,18 @@ public DiseaseBurdenDto( this.lastReportedDistrictName = lastReportedDistrictName; this.outbreakDistrict = outbreakDistrict; this.fromDate = from; - this.toDate =to; + this.toDate = to; } public DiseaseBurdenDto( - Disease disease, - Long caseCount, - Long previousCaseCount, - Long eventCount, - Long outbreakDistrictCount, - Long caseDeathCount, - String lastReportedDistrictName, - CaseClassification caseClassification) { + Disease disease, + Long caseCount, + Long previousCaseCount, + Long eventCount, + Long outbreakDistrictCount, + Long caseDeathCount, + String lastReportedDistrictName, + CaseClassification caseClassification) { this.disease = disease; this.caseCount = caseCount; @@ -194,12 +185,7 @@ public DiseaseBurdenDto( this.lastReportedDistrictName = lastReportedDistrictName; } - public DiseaseBurdenDto( - RegionDto regionDto, - String total, - String activeCases, - String recovered, - String deaths) { + public DiseaseBurdenDto(RegionDto regionDto, String total, String activeCases, String recovered, String deaths) { this.region = regionDto; this.total = total; @@ -207,7 +193,7 @@ public DiseaseBurdenDto( this.recovered = recovered; this.deaths = deaths; } - + public Disease getDisease() { return disease; } @@ -217,10 +203,12 @@ public void setDisease(Disease disease) { } public CaseClassification getCaseClassification() { + return caseClassification; } public void setCaseClassification(CaseClassification caseClassification) { + this.caseClassification = caseClassification; } @@ -301,18 +289,22 @@ public Boolean hasCount() { } public Integer getCfr() { + return cfr; } public void setCfr(Integer cfr) { + this.cfr = cfr; } public String getLastReportedDistrict() { + return lastReportedDistrict; } public void setLastReportedDistrict(String lastReportedDistrict) { + this.lastReportedDistrict = lastReportedDistrict; } @@ -321,6 +313,7 @@ public String getOutbreakDistrict() { } public void setOutbreakDistrict(String outbreakDistrict) { + this.outbreakDistrict = outbreakDistrict; } @@ -329,14 +322,17 @@ public String getDeaths() { } public void setDeaths(String deaths) { + this.deaths = deaths; } public RegionDto getRegion() { + return region; } public void setRegion(RegionDto region) { + this.region = region; } @@ -345,58 +341,72 @@ public String getRecovered() { } public void setRecovered(String recovered) { + this.recovered = recovered; } public String getActiveCases() { + return activeCases; } public void setActiveCases(String activeCases) { + this.activeCases = activeCases; } public String getTotal() { + return total; } public void setTotal(String total) { + this.total = total; } public Date getToDate() { + return toDate; } public void setToDate(Date toDate) { + this.toDate = toDate; } public Date getFromDate() { + return fromDate; } public void setFromDate(Date fromDate) { + this.fromDate = fromDate; } public String getTotalCount() { + return totalCount; } public void setTotalCount(String totalCount) { + this.totalCount = totalCount; } public String getDeathsCount() { + return deathsCount; } public void setDeathsCount(String deathsCount) { + this.deathsCount = deathsCount; } public String getRecoveredCount() { + return recoveredCount; } @@ -405,37 +415,41 @@ public void setRecoveredCount(String recoveredCount) { } public String getActiveCount() { + return activeCount; } public void setActiveCount(String activeCount) { + this.activeCount = activeCount; } public String getOther() { + return other; } public void setOther(String other) { + this.other = other; } public String getOtherCount() { + return otherCount; } public void setOtherCount(String otherCount) { + this.otherCount = otherCount; } @Override public String toString() { - return "DiseaseBurdenDto [disease=" + disease + ", total=" + total + ", caseCount=" + caseCount - + ", previousCaseCount=" + previousCaseCount + ", eventCount=" + eventCount + ", outbreakDistrictCount=" - + outbreakDistrictCount + ", caseDeathCount=" + caseDeathCount + ", lastReportedDistrictName=" - + lastReportedDistrictName + ", caseClassification=" + caseClassification + ", cfr=" + cfr - + ", lastReportedDistrict=" + lastReportedDistrict + ", outbreakDistrict=" + outbreakDistrict - + ", deaths=" + deaths + ", region=" + region + ", recovered=" + recovered + ", activeCases=" - + activeCases + ", toDate=" + toDate + ", fromDate=" + fromDate + "]"; + return "DiseaseBurdenDto [disease=" + disease + ", total=" + total + ", caseCount=" + caseCount + ", previousCaseCount=" + previousCaseCount + + ", eventCount=" + eventCount + ", outbreakDistrictCount=" + outbreakDistrictCount + ", caseDeathCount=" + caseDeathCount + + ", lastReportedDistrictName=" + lastReportedDistrictName + ", caseClassification=" + caseClassification + ", cfr=" + cfr + + ", lastReportedDistrict=" + lastReportedDistrict + ", outbreakDistrict=" + outbreakDistrict + ", deaths=" + deaths + ", region=" + + region + ", recovered=" + recovered + ", activeCases=" + activeCases + ", toDate=" + toDate + ", fromDate=" + fromDate + "]"; } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java index de2b2d74676..47a3204fa1d 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/region/RegionDto.java @@ -159,6 +159,7 @@ public String i18nPrefix() { @Override public String toString() { + return getName(); } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java index 4ba9e4cb745..2f63d3d3d03 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java @@ -23,10 +23,10 @@ import java.util.Set; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.utils.criteria.BaseCriteria; -import de.symeda.sormas.api.caze.CaseClassification; public class OutbreakCriteria extends BaseCriteria implements Serializable { @@ -140,10 +140,12 @@ public Date getReportedDateTo() { } public CaseClassification getCaseClassification() { + return caseClassification; } public OutbreakCriteria caseClassification(CaseClassification caseClassification) { + this.caseClassification = caseClassification; return this; } diff --git a/sormas-api/src/test/java/de/symeda/sormas/api/outbreak/OutbreakCriteriaTest.java b/sormas-api/src/test/java/de/symeda/sormas/api/outbreak/OutbreakCriteriaTest.java index f5886d43d1f..13332b5c0fa 100644 --- a/sormas-api/src/test/java/de/symeda/sormas/api/outbreak/OutbreakCriteriaTest.java +++ b/sormas-api/src/test/java/de/symeda/sormas/api/outbreak/OutbreakCriteriaTest.java @@ -1,101 +1,115 @@ package de.symeda.sormas.api.outbreak; -import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.caze.CaseClassification; -import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; -import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; -import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.Set; -import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.caze.CaseClassification; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; public class OutbreakCriteriaTest { - @Test - public void testSetAndGetRegion() { - RegionReferenceDto region = new RegionReferenceDto(); - OutbreakCriteria criteria = new OutbreakCriteria().region(region); - assertEquals(region, criteria.getRegion()); - } - - @Test - public void testSetAndGetDistrict() { - DistrictReferenceDto district = new DistrictReferenceDto(); - OutbreakCriteria criteria = new OutbreakCriteria().district(district); - assertEquals(district, criteria.getDistrict()); - } - - @Test - public void testSetAndGetDiseases() { - Set diseases = new HashSet<>(); - diseases.add(Disease.CORONAVIRUS); - OutbreakCriteria criteria = new OutbreakCriteria().diseases(diseases); - assertEquals(diseases, criteria.getDiseases()); - } - - @Test - public void testSetAndGetDisease() { - Disease disease = Disease.CORONAVIRUS; - OutbreakCriteria criteria = new OutbreakCriteria().disease(disease); - assertEquals(Collections.singleton(disease), criteria.getDiseases()); - } - - @Test - public void testSetAndGetActive() { - OutbreakCriteria criteria = new OutbreakCriteria().active(true); - assertTrue(criteria.getActive()); - criteria.active(false); - assertFalse(criteria.getActive()); - } - - @Test - public void testSetAndGetActiveWithDates() { - Date lower = new Date(); - Date upper = new Date(); - OutbreakCriteria criteria = new OutbreakCriteria().active(true, lower, upper); - assertTrue(criteria.getActive()); - assertEquals(lower, criteria.getActiveLower()); - assertEquals(upper, criteria.getActiveUpper()); - } - - @Test - public void testSetAndGetChangeDateAfter() { - Date changeDate = new Date(); - OutbreakCriteria criteria = new OutbreakCriteria().changeDateAfter(changeDate); - assertEquals(changeDate, criteria.getChangeDateAfter()); - } - - @Test - public void testSetAndGetReportedBetween() { - Date reportedFrom = new Date(); - Date reportedTo = new Date(); - OutbreakCriteria criteria = new OutbreakCriteria().reportedBetween(reportedFrom, reportedTo); - assertEquals(reportedFrom, criteria.getReportedDateFrom()); - assertEquals(reportedTo, criteria.getReportedDateTo()); - } - - @Test - public void testSetAndGetReportedDateFrom() { - Date reportedFrom = new Date(); - OutbreakCriteria criteria = new OutbreakCriteria().reportedDateFrom(reportedFrom); - assertEquals(reportedFrom, criteria.getReportedDateFrom()); - } - - @Test - public void testSetAndGetReportedDateTo() { - Date reportedTo = new Date(); - OutbreakCriteria criteria = new OutbreakCriteria().reportedDateTo(reportedTo); - assertEquals(reportedTo, criteria.getReportedDateTo()); - } - - @Test - public void testSetAndGetCaseClassification() { - CaseClassification caseClassification = CaseClassification.CONFIRMED; - OutbreakCriteria criteria = new OutbreakCriteria().caseClassification(caseClassification); - assertEquals(caseClassification, criteria.getCaseClassification()); - } -} \ No newline at end of file + @Test + public void testSetAndGetRegion() { + + RegionReferenceDto region = new RegionReferenceDto(); + OutbreakCriteria criteria = new OutbreakCriteria().region(region); + assertEquals(region, criteria.getRegion()); + } + + @Test + public void testSetAndGetDistrict() { + + DistrictReferenceDto district = new DistrictReferenceDto(); + OutbreakCriteria criteria = new OutbreakCriteria().district(district); + assertEquals(district, criteria.getDistrict()); + } + + @Test + public void testSetAndGetDiseases() { + + Set diseases = new HashSet<>(); + diseases.add(Disease.CORONAVIRUS); + OutbreakCriteria criteria = new OutbreakCriteria().diseases(diseases); + assertEquals(diseases, criteria.getDiseases()); + } + + @Test + public void testSetAndGetDisease() { + + Disease disease = Disease.CORONAVIRUS; + OutbreakCriteria criteria = new OutbreakCriteria().disease(disease); + assertEquals(Collections.singleton(disease), criteria.getDiseases()); + } + + @Test + public void testSetAndGetActive() { + + OutbreakCriteria criteria = new OutbreakCriteria().active(true); + assertTrue(criteria.getActive()); + criteria.active(false); + assertFalse(criteria.getActive()); + } + + @Test + public void testSetAndGetActiveWithDates() { + + Date lower = new Date(); + Date upper = new Date(); + OutbreakCriteria criteria = new OutbreakCriteria().active(true, lower, upper); + assertTrue(criteria.getActive()); + assertEquals(lower, criteria.getActiveLower()); + assertEquals(upper, criteria.getActiveUpper()); + } + + @Test + public void testSetAndGetChangeDateAfter() { + + Date changeDate = new Date(); + OutbreakCriteria criteria = new OutbreakCriteria().changeDateAfter(changeDate); + assertEquals(changeDate, criteria.getChangeDateAfter()); + } + + @Test + public void testSetAndGetReportedBetween() { + + Date reportedFrom = new Date(); + Date reportedTo = new Date(); + OutbreakCriteria criteria = new OutbreakCriteria().reportedBetween(reportedFrom, reportedTo); + assertEquals(reportedFrom, criteria.getReportedDateFrom()); + assertEquals(reportedTo, criteria.getReportedDateTo()); + } + + @Test + public void testSetAndGetReportedDateFrom() { + + Date reportedFrom = new Date(); + OutbreakCriteria criteria = new OutbreakCriteria().reportedDateFrom(reportedFrom); + assertEquals(reportedFrom, criteria.getReportedDateFrom()); + } + + @Test + public void testSetAndGetReportedDateTo() { + + Date reportedTo = new Date(); + OutbreakCriteria criteria = new OutbreakCriteria().reportedDateTo(reportedTo); + assertEquals(reportedTo, criteria.getReportedDateTo()); + } + + @Test + public void testSetAndGetCaseClassification() { + + CaseClassification caseClassification = CaseClassification.CONFIRMED; + OutbreakCriteria criteria = new OutbreakCriteria().caseClassification(caseClassification); + assertEquals(caseClassification, criteria.getCaseClassification()); + } +} 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 a1d1359017d..fd359454347 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 @@ -186,8 +186,6 @@ import de.symeda.sormas.backend.vaccination.VaccinationService; import de.symeda.sormas.backend.visit.Visit; import de.symeda.sormas.backend.visit.VisitFacadeEjb; -import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; -import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.or; @Stateless @LocalBean diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteria.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteria.java index 4f969373c87..f19cf986322 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteria.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteria.java @@ -43,18 +43,22 @@ public CaseUserFilterCriteria excludeLimitedSyncRestrictions(boolean excludeLimi } public boolean isRestrictAccessToAssignedEntities() { + return restrictAccessToAssignedEntities; } public void setRestrictAccessToAssignedEntities(boolean restrictAccessToAssignedEntities) { + this.restrictAccessToAssignedEntities = restrictAccessToAssignedEntities; } public boolean isExcludeSharedCases() { + return excludeSharedCases; } public CaseUserFilterCriteria excludeSharedCases(boolean excludeSharedCases) { + this.excludeSharedCases = excludeSharedCases; return this; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java index f5a1ae9835e..ee26ad2e7a4 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/dashboard/DashboardService.java @@ -60,7 +60,6 @@ import de.symeda.sormas.backend.util.JurisdictionHelper; import de.symeda.sormas.backend.util.ModelConstants; import de.symeda.sormas.backend.util.QueryHelper; -import static de.symeda.sormas.backend.common.CriteriaBuilderHelper.and; @Stateless @LocalBean diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java index 4dc123b2c46..183fb3da0b6 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/outbreak/OutbreakFacadeEjb.java @@ -217,6 +217,7 @@ public Long getOutbreakDistrictCount(OutbreakCriteria criteria) { UserRight._DASHBOARD_SURVEILLANCE_VIEW, UserRight._DASHBOARD_CONTACT_VIEW }) public Map getOutbreakDistrictNameByDisease(OutbreakCriteria criteria) { + return outbreakService.getOutbreakDistrictNameByDisease(criteria); } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java index 9d4a85db5ce..17437e32085 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/AbstractBeanTest.java @@ -659,6 +659,7 @@ public OutbreakFacade getOutbreakFacade() { } public OutbreakService getOutbreakService() { + return getBean(OutbreakService.class); } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java index ec621aa5971..67977d9af0a 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java @@ -9,6 +9,7 @@ public class CaseUserFilterCriteriaTest extends AbstractBeanTest { @Test public void testRestrictAccessToAssignedEntities() { + CaseUserFilterCriteria criteria = new CaseUserFilterCriteria(); // Test default value @@ -25,6 +26,7 @@ public void testRestrictAccessToAssignedEntities() { @Test public void testExcludeSharedCases() { + CaseUserFilterCriteria criteria = new CaseUserFilterCriteria(); // Test default value diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java index c8f9c042b32..3e5d099a243 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/dashboard/DashboardFacadeEjbTest.java @@ -369,6 +369,7 @@ public void testGetCasesCountByClassification() { @Test public void testGetCaseMeasurePerDistrict() { + // Create necessary data for testing RDCF rdcf = creator.createRDCF(); Date currentDate = new Date(); @@ -390,6 +391,7 @@ public void testGetCaseMeasurePerDistrict() { @Test public void testCountCasesConvertedFromContacts() { + // Create necessary data for testing RDCF rdcf = creator.createRDCF(); Date currentDate = new Date(); @@ -411,6 +413,7 @@ public void testCountCasesConvertedFromContacts() { @Test public void testGetEventCountByStatus() { + // Create necessary data for testing RDCF rdcf = creator.createRDCF(); UserDto user = creator.createSurveillanceSupervisor(rdcf); @@ -442,6 +445,7 @@ public void testGetEventCountByStatus() { @Test public void testGetIntervalEndDate() { + DashboardFacadeEjb dashboardFacadeEjb = new DashboardFacadeEjb(); // Test case 1: DAY grouping diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java index 7d3d6ce6f5c..c4d0d39c8ac 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java @@ -22,6 +22,7 @@ public class DiseaseFacadeEjbTest extends AbstractBeanTest { @Override public void init() { + super.init(); rdcf = creator.createRDCF(); @@ -30,6 +31,7 @@ public void init() { @Test public void testGetDiseaseForDashboard() { + TestDataCreator.RDCF rdcf2 = creator.createRDCF("Region2", "District2", "Community2", "Facility2"); RegionReferenceDto region = new RegionReferenceDto(rdcf2.region.getUuid()); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java index 0f275f3fc12..09c6ab97b4c 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/geo/RegionFacadeEjbTest.java @@ -50,6 +50,7 @@ public void testGetAllActiveAsReference() { @Test public void testGetAllRegion() { + // Arrange creator.createRegion("region1"); creator.createRegion("region2"); @@ -70,6 +71,7 @@ public void testGetAllRegion() { @Test public void testGetByName() { + // Arrange creator.createRegion("region1"); getRegionService().doFlush(); @@ -87,6 +89,7 @@ public void testGetByName() { @Test public void testGetIndexListNoCriteria() { + // Arrange creator.createRegion("region1"); creator.createRegion("region2"); @@ -101,6 +104,7 @@ public void testGetIndexListNoCriteria() { @Test public void testGetIndexList_withCriteriaAndSortProperties() { + // Arrange creator.createRegion("region1"); creator.createRegion("region2"); @@ -128,6 +132,7 @@ public void testGetIndexList_withCriteriaAndSortProperties() { @Test public void testGetIndexList_withInvalidSortProperty() { + // Arrange List sortProperties = new ArrayList<>(); sortProperties.add(new SortProperty("invalidProperty", true)); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java index 3598107c55c..260e045d60f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/MainScreen.java @@ -460,10 +460,6 @@ private static boolean aefiDashboardPermitted() { UserRight.DASHBOARD_ADVERSE_EVENTS_FOLLOWING_IMMUNIZATION_VIEW); } - private static boolean diseaseDetailsDashboardPermitted() { - return permitted(EnumSet.of(FeatureType.DISEASE_DETAILS),UserRight.DISEASE_DETAILS_VIEW); - } - private static Set initKnownViews() { final Set views = new HashSet<>( Arrays.asList( diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java index 768657d55ae..3004155db49 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardDataProvider.java @@ -113,22 +113,27 @@ public void setDisease(Disease disease) { } public DashboardType getDashboardType() { + return dashboardType; } public void setDashboardType(DashboardType dashboardType) { + this.dashboardType = dashboardType; } public void setNewCaseDateType(CriteriaDateType newCaseDateType) { + this.newCaseDateType = newCaseDateType; } public CriteriaDateType getNewCaseDateType() { + return newCaseDateType; } public DashboardCriteria getCriteria() { + return new DashboardCriteria().region(region) .district(district) .disease(disease) @@ -140,18 +145,22 @@ public DashboardCriteria getCriteria() { public CaseClassification getCaseClassification() { + return caseClassification; } public void setCaseClassification(CaseClassification caseClassification) { + this.caseClassification = caseClassification; } public void setNewCaseDateType(NewCaseDateType newCaseDateType) { + this.newCaseDateType = newCaseDateType; } public NewDateFilterType getDateFilterType() { + if (dateFilterType == NewDateFilterType.TODAY) { setFromDate(DateHelper.getStartOfDay(new Date())); setToDate(new Date()); @@ -176,6 +185,7 @@ public NewDateFilterType getDateFilterType() { } public void setDateFilterType(NewDateFilterType dateFilterType) { + this.dateFilterType = dateFilterType; } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java index 948647bdf82..c01bc544376 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/AbstractDashboardView.java @@ -125,10 +125,12 @@ else if (DashboardType.SAMPLES.equals(e.getProperty().getValue())) { } public void refreshDashboard() { + dashboardDataProvider.refreshData(); } public void refreshDiseaseData() { + dashboardDataProvider.refreshDiseaseData(); } @@ -138,10 +140,12 @@ public void enter(ViewChangeEvent event) { } public void setDiseases(Disease disease) { + this.disease = disease; } public Disease getDiseases() { + return disease; } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java index cbfccd7b739..3aec76d0780 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/DashboardController.java @@ -72,6 +72,7 @@ public void registerViews(Navigator navigator) { } public void navigateToDisease(Disease disease,DashboardDataProvider dashboardDataProvider) { + Date dateFrom = dashboardDataProvider.getFromDate(); Date dateTo = dashboardDataProvider.getToDate(); 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 a4db71e2b27..9581ab5cb03 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 @@ -93,6 +93,7 @@ protected DashboardCriteria newCriteria() { } public void refreshDiseaseData() { + DiseaseBurdenDto dbd= FacadeProvider.getDashboardFacade().getDiseaseForDashboard(region, district, disease, fromDate, toDate, previousFromDate, previousToDate ,newCaseDateType ,caseClassification); @@ -314,10 +315,12 @@ public void setDiseasesBurden(List diseasesBurden) { } public DiseaseBurdenDto getDiseaseBurdenDetail() { + return diseaseBurdenDetail; } public void setDiseaseBurdenDetail(DiseaseBurdenDto diseaseBurdenDetail) { + this.diseaseBurdenDetail = diseaseBurdenDetail; } @@ -405,14 +408,17 @@ public void setCaseWithReferenceDefinitionFulfilledCount(Long caseWithReferenceD } public CaseClassification getCaseClassification() { + return caseClassification; } public void setCaseClassification(CaseClassification caseClassification) { + this.caseClassification = caseClassification; } public void setDateFilterType(NewDateFilterType dateFilterType) { + this.dateFilterType = dateFilterType; } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java index d584c8ba4ef..48863e81294 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/components/DashboardFilterLayout.java @@ -64,9 +64,6 @@ import de.symeda.sormas.ui.utils.EpiWeekAndDateFilterComponent; import com.vaadin.navigator.ViewChangeListener; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.caze.CaseClassification; -import de.symeda.sormas.api.caze.CaseIndexDto; -import de.symeda.sormas.api.contact.ContactIndexDto; import de.symeda.sormas.api.dashboard.DashboardCriteria; import de.symeda.sormas.api.dashboard.NewDateFilterType; import de.symeda.sormas.ui.dashboard.DashboardType; @@ -159,6 +156,7 @@ public void populateLayout() { }; private void createDiseaseFilter() { + diseaseFilter.setWidth(200, Unit.PIXELS); diseaseFilter.setInputPrompt(I18nProperties.getString(Strings.promptDisease)); if (dashboardDataProvider.getDashboardType() == DashboardType.CONTACTS) { @@ -182,16 +180,6 @@ protected void createRegionAndDistrictFilter() { createDistrictFilter(null); } - //Case Classification filter - public void createCaseClassificationFilter() { - caseClassificationFilter.setWidth(200, Unit.PIXELS); - caseClassificationFilter.setInputPrompt(I18nProperties.getPrefixCaption(CaseIndexDto.I18N_PREFIX, ContactIndexDto.CASE_CLASSIFICATION)); - caseClassificationFilter.addItems((Object[]) CaseClassification.values()); - caseClassificationFilter.addValueChangeListener(e -> dashboardDataProvider.setCaseClassification((CaseClassification) caseClassificationFilter.getValue())); - addCustomComponent(caseClassificationFilter, CASE_CLASSIFICATION_FILTER); - dashboardDataProvider.setCaseClassification((CaseClassification) caseClassificationFilter.getValue()); - } - protected void createRegionFilter(String description) { if (UiUtil.getUser().getRegion() == null && UiUtil.disabled(FeatureType.HIDE_JURISDICTION_FIELDS)) { regionFilter.setWidth(200, Unit.PIXELS); @@ -626,6 +614,7 @@ private void updateComparisonDates() { } public void setCriteria(DashboardCriteria criteria) { + regionFilter.setValue(criteria.getRegion()); caseClassificationFilter.setValue(criteria.getCaseClassification()); setDateFilter(criteria.getDateFrom(), criteria.getDateTo()); @@ -638,6 +627,7 @@ public void setCriteria(DashboardCriteria criteria) { } private void updateCurrentPeriodButtons(DashboardCriteria criteria) { + if (criteria.getDateFilterType().equals(NewDateFilterType.TODAY)) { btnCurrentPeriod.setCaption(btnToday.getCaption()); } @@ -682,6 +672,7 @@ protected void addCustomComponent(Component component, String locator) { } public void reload(ViewChangeListener.ViewChangeEvent event) { + DashboardCriteria criteria = dashboardDataProvider.getCriteria(); String params = event.getParameters().trim(); if (params.startsWith("?")) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java index dcedfe3aaf6..4489bc4dca8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsComponent.java @@ -31,11 +31,13 @@ public class DiseaseDetailsComponent extends CssLayout { private static final String HTML_DIV_END = ""; public DiseaseDetailsComponent(DashboardDataProvider dashboardDataProvider) { + this.dashboardDataProvider = dashboardDataProvider; addStyleName("disease-detail-card-display-top"); } public void refresh(){ + addTopLayout( dashboardDataProvider.getDiseaseBurdenDetail().getDisease(), dashboardDataProvider.getDiseaseBurdenDetail().getCaseCount(), @@ -50,6 +52,7 @@ public void refresh(){ } private void addTopLayout(Disease disease, Long casesCount, boolean isOutbreak) { + VerticalLayout layout = new VerticalLayout(); layout.setMargin(true); layout.setSpacing(false); @@ -123,6 +126,7 @@ private void addTopLayout(Disease disease, Long casesCount, boolean isOutbreak) } private void addStatsLayout(Long fatalities, Long totalCase, String outbreakDistrict, String district, Disease disease) { + VerticalLayout layout = new VerticalLayout(); layout.setWidth(250, Unit.PIXELS); layout.setHeight(120, Unit.PIXELS); @@ -161,6 +165,7 @@ private void addStatsLayout(Long fatalities, Long totalCase, String outbreakDist private HorizontalLayout createDeathCfrItem(String fatalityLabel, String fatalityValue, boolean isCritical, String cfrLabel, String cfrValue ) { + HorizontalLayout layout = new HorizontalLayout(); layout.setMargin(false); layout.setSpacing(true); @@ -191,6 +196,7 @@ private HorizontalLayout createDeathCfrItem(String fatalityLabel, String fatalit } private HorizontalLayout createStatsItem(String label, String value, boolean isCritical, boolean singleColumn) { + HorizontalLayout layout = new HorizontalLayout(); layout.setWidth(250, Unit.PIXELS); layout.setMargin(false); @@ -227,6 +233,7 @@ private HorizontalLayout createStatsItem(String label, String value, boolean isC } private float calculateCfr(long fatalities, long totalCaseCount){ + if (fatalities == 0 ) return 0; return ((float) fatalities / totalCaseCount) * 100; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java index f1a784437b5..f76969cd746 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsView.java @@ -43,10 +43,12 @@ public class DiseaseDetailsView extends AbstractDashboardView { private static String diseaseDetailsData; public static void setDiseaseDetailsData(String newData) { + diseaseDetailsData =newData; } public DiseaseDetailsView() { + super(VIEW_NAME); dashboardDataProvider = new DashboardDataProvider(); @@ -91,6 +93,7 @@ public DiseaseDetailsView() { } private void setDateFilters(String dateFrom, String dateTo) { + DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); try { if (dateFrom != null) { @@ -107,6 +110,7 @@ private void setDateFilters(String dateFrom, String dateTo) { } private void setDateFilterType(String newDateFilterType) { + try { if(newDateFilterType!=null&&!newDateFilterType.equals("null")) { NewDateFilterType filterType = NewDateFilterType.valueOf(newDateFilterType); @@ -118,6 +122,7 @@ private void setDateFilterType(String newDateFilterType) { } private void setCaseClassification(String caseClassification) { + try { if(caseClassification!=null && !caseClassification.equals("null")) { CaseClassification classification = CaseClassification.valueOf(caseClassification.replace(" ", "_").toUpperCase().trim()); @@ -130,6 +135,7 @@ private void setCaseClassification(String caseClassification) { } private void setNewCaseDateType(String newCaseDateType) { + NewCaseDateType caseDateType; switch (newCaseDateType) { case "Symptom onset date": @@ -145,6 +151,7 @@ private void setNewCaseDateType(String newCaseDateType) { } private void setRegion(String regionId) { + if (regionId != null && !"null".equals(regionId) && !regionId.isEmpty()) { RegionDto region = FacadeProvider.getRegionFacade().getByUuid(regionId); dashboardDataProvider.setRegion(region.toReference()); @@ -162,6 +169,7 @@ public void refreshDiseaseData() { @Override public void enter(ViewChangeEvent event) { + super.enter(event); dashboardDataProvider.setDisease(Disease.valueOf(event.getParameters())); refreshDiseaseData(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java index 548beac64f0..41541ac5630 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/diseasedetails/DiseaseDetailsViewLayout.java @@ -63,6 +63,7 @@ public DiseaseDetailsViewLayout(DashboardDataProvider dashboardDataProvider) { } public void refresh() { + diseaseDetailsComponent.removeAllComponents(); diseaseDetailsComponent.refresh(); regionalDiseaseBurdenGrid.refresh(); @@ -70,7 +71,8 @@ public void refresh() { } public void reload() { -// Disease Card Layout + + // Disease Card Layout HorizontalLayout diseaseCardLayout = new HorizontalLayout(); diseaseCardLayout.setWidth(50, Unit.PERCENTAGE); diseaseCardLayout.setMargin(true); @@ -78,7 +80,8 @@ public void reload() { diseaseCardLayout.addComponent(diseaseDetailsComponent); addComponent(diseaseCardLayout, CARD); -// Grid card layout + + // Grid card layout HorizontalLayout diseaseGridLayout = new HorizontalLayout(); diseaseGridLayout.setWidth(400, Unit.PIXELS); regionalDiseaseBurdenGrid.setHeight(320, Unit.PIXELS); @@ -98,7 +101,7 @@ public void reload() { } }); -// Map layout +// Map layout HorizontalLayout mapLayout = new HorizontalLayout(); mapLayout.setWidth(100, Unit.PERCENTAGE); final int BASE_HEIGHT = 600; @@ -114,6 +117,7 @@ public void reload() { } public HorizontalLayout viewMoreLayout(String title){ + HorizontalLayout viewMoreLayout = new HorizontalLayout(); viewMoreLayout.setMargin(false); viewMoreLayout.setSpacing(false); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java index fd37a8148c9..7668714b545 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/DashboardMapComponent.java @@ -1087,6 +1087,7 @@ protected void addLayerOptions(VerticalLayout layersLayout) { } private HorizontalLayout createMapHeader() { + HorizontalLayout mapHeaderLayout = new HorizontalLayout(); mapHeaderLayout.setWidth(100, Unit.PERCENTAGE); mapHeaderLayout.setSpacing(true); @@ -1764,6 +1765,7 @@ protected void onMarkerClicked(String groupId, int markerIndex) { } private void refreshMapDashboard(boolean forced) { + clearRegionShapes(); clearCaseMarkers(); clearContactMarkers(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java index 2cbbeca3db5..67dc651a250 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapCasePeriodOption.java @@ -26,6 +26,7 @@ public enum MapCasePeriodOption { @Override public String toString() { + return I18nProperties.getEnumCaption(this); } } \ No newline at end of file diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java index e4d01515d3d..0bee9500172 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/map/MapPeriodType.java @@ -27,6 +27,7 @@ public enum MapPeriodType { YEARLY; public String toString() { + return I18nProperties.getEnumCaption(this); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/DiseaseOverviewComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/DiseaseOverviewComponent.java index 0ceba67be03..660cc43d894 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/DiseaseOverviewComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/DiseaseOverviewComponent.java @@ -27,6 +27,7 @@ public class DiseaseOverviewComponent extends HorizontalLayout { private final Button showTableViewButton; public DiseaseOverviewComponent(DashboardDataProvider dashboardDataProvider) { + setWidth(100, Sizeable.Unit.PERCENTAGE); setMargin(false); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java index 1fdb3e89554..4ed64a57276 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileComponent.java @@ -157,7 +157,8 @@ private void addTopLayout(Disease disease, Long casesCount, Long previousCasesCo } private void addStatsLayout(DiseaseBurdenDto diseaseBurden, DashboardDataProvider dashboardDataProvider) { - Long fatalities = diseaseBurden.getCaseDeathCount(); + + Long fatalities = diseaseBurden.getCaseDeathCount(); Long events = diseaseBurden.getEventCount(); String district = diseaseBurden.getLastReportedDistrictName(); Disease disease = diseaseBurden.getDisease(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java index 51c997401a4..ccf650162aa 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/DiseaseTileViewLayout.java @@ -32,6 +32,7 @@ public class DiseaseTileViewLayout extends CssLayout { private static final long serialVersionUID = 6582975657305031105L; public DiseaseTileViewLayout(DashboardDataProvider dashboardDataProvider) { + this.dashboardDataProvider = dashboardDataProvider; } diff --git a/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java b/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java index 8149cb74eea..3d4208cbc19 100644 --- a/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java +++ b/sormas-ui/src/test/java/de/symeda/sormas/ui/dashboard/disease/DiseaseDashboardServiceTest.java @@ -57,11 +57,13 @@ public class DiseaseDashboardServiceTest { @BeforeEach public void setUp() { + MockitoAnnotations.openMocks(this); } @Test public void testGetDiseaseForDashboard() { + RegionReferenceDto region = new RegionReferenceDto(); DistrictReferenceDto district = new DistrictReferenceDto(); Disease disease = Disease.CORONAVIRUS; @@ -112,6 +114,7 @@ public void testGetDiseaseForDashboard() { @Test public void testGetDiseaseGridForDashboard() { + RegionReferenceDto region = new RegionReferenceDto(); DistrictReferenceDto district = new DistrictReferenceDto(); Disease disease = Disease.CORONAVIRUS; From b26aa1744ec933ea98e0b993026a9099825e30bf Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Thu, 7 Nov 2024 10:32:25 +0000 Subject: [PATCH 70/71] reordering imports --- .../java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java | 2 +- .../java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java index d90832eb9c0..6503d5032c7 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/disease/DiseaseBurdenDto.java @@ -18,11 +18,11 @@ package de.symeda.sormas.api.disease; import java.io.Serializable; -import java.util.Date; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.infrastructure.region.RegionDto; +import java.util.Date; public class DiseaseBurdenDto implements Serializable { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java b/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java index 2f63d3d3d03..42846d7cfb9 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/outbreak/OutbreakCriteria.java @@ -23,10 +23,10 @@ import java.util.Set; import de.symeda.sormas.api.Disease; -import de.symeda.sormas.api.caze.CaseClassification; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.utils.criteria.BaseCriteria; +import de.symeda.sormas.api.caze.CaseClassification; public class OutbreakCriteria extends BaseCriteria implements Serializable { From aad5608e00c672a4ff61acaa4c7b04b579b93675 Mon Sep 17 00:00:00 2001 From: daveotengo <30934250+daveotengo@users.noreply.github.com> Date: Mon, 11 Nov 2024 09:26:20 +0000 Subject: [PATCH 71/71] update with license --- .../caze/CaseUserFilterCriteriaTest.java | 17 +++++++++++++++ .../backend/disease/DiseaseFacadeEjbTest.java | 17 +++++++++++++++ .../tile/RegionalDiseaseBurdenGrid.java | 21 +++++++++++++++++++ .../disease/DiseaseDashboardServiceTest.java | 17 +++++++++++++++ 4 files changed, 72 insertions(+) diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java index 67977d9af0a..43e189934b9 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseUserFilterCriteriaTest.java @@ -1,3 +1,20 @@ +/******************************************************************************* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *******************************************************************************/ package de.symeda.sormas.backend.caze; import de.symeda.sormas.backend.AbstractBeanTest; diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java index c4d0d39c8ac..a44d41c58f8 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/disease/DiseaseFacadeEjbTest.java @@ -1,3 +1,20 @@ +/******************************************************************************* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *******************************************************************************/ package de.symeda.sormas.backend.disease; import de.symeda.sormas.api.Disease; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java index 69fbbaee59c..40b9615ce85 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/dashboard/surveillance/components/disease/tile/RegionalDiseaseBurdenGrid.java @@ -1,3 +1,20 @@ +/******************************************************************************* + * SORMAS® - Surveillance Outbreak Response Management & Analysis System + * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *******************************************************************************/ package de.symeda.sormas.ui.dashboard.surveillance.components.disease.tile; import com.vaadin.v7.data.util.BeanItemContainer; @@ -38,6 +55,7 @@ public class RegionalDiseaseBurdenGrid extends Grid { private final DecimalFormat decimalFormat; public RegionalDiseaseBurdenGrid(DashboardDataProvider dashboardDataProvider) { + this.dashboardDataProvider = dashboardDataProvider; regionDtoList = FacadeProvider.getRegionFacade().getAllActiveRegions(); @@ -83,6 +101,7 @@ public RegionalDiseaseBurdenGrid(DashboardDataProvider dashboardDataProvider) { } public void refresh(){ + setColumnResizeMode(ColumnResizeMode.ANIMATED); setSelectionMode(Grid.SelectionMode.NONE); @@ -231,6 +250,7 @@ public String makeDIvs(long number, long total, String lightColor, String deepCo } public String makeDIvsCount(String num) { + String endDiv = " "; String divWithStyleAttr="