From 4d93347a4669a29a360fadaec03f7c27eca26e90 Mon Sep 17 00:00:00 2001 From: Bartha Barna Date: Thu, 24 Nov 2022 14:30:19 +0200 Subject: [PATCH 001/147] #10480 - update sormas setup and development environment documentation --- README.md | 2 +- docs/DEVELOPMENT_ENVIRONMENT.md | 25 +++++++++++++------ ...ER_DEV_SETUP.md => SERVER_DOCKER_SETUP.md} | 0 docs/SERVER_SETUP.md | 4 +-- 4 files changed, 20 insertions(+), 11 deletions(-) rename docs/{SERVER_DEV_SETUP.md => SERVER_DOCKER_SETUP.md} (100%) diff --git a/README.md b/README.md index 125b53c041d..b00e8360378 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ If you want to learn more about the development and contribution process, settin If you want to set up a SORMAS instance for production, testing or development purposes, please refer to the following guides: * [Installing a SORMAS Server](docs/SERVER_SETUP.md) -* [Installing a SORMAS Server for Development](docs/SERVER_DEV_SETUP.md) +* [Installing a SORMAS Server for Development](docs/SERVER_DOCKER_SETUP.md) * [Updating a SORMAS Server](docs/SERVER_UPDATE.md) * [Creating a Demo Android App](docs/DEMO_APP.md) diff --git a/docs/DEVELOPMENT_ENVIRONMENT.md b/docs/DEVELOPMENT_ENVIRONMENT.md index 6c26fb5fa3c..8c5eea91af0 100644 --- a/docs/DEVELOPMENT_ENVIRONMENT.md +++ b/docs/DEVELOPMENT_ENVIRONMENT.md @@ -5,27 +5,33 @@ This step-by-step guide explains how to set up your development environment, usi **Please note that these instructions are optimized for Windows and Linux systems.** If you're developing on a Mac and, we would be glad to get your feedback about how this guide can be extended with OS-specific instructions in our developer chat on [Gitter](https://gitter.im/SORMAS-Project). -## Step 1: Install a Local SORMAS Server -Please follow the [Server Setup Instructions](SERVER_SETUP.md) to set up a local SORMAS instance that you will use to test your code. Alternatively, you can also use [Maven Cargo](../sormas-cargoserver/README.md), or a [Docker installation](SERVER_DEV_SETUP.md) (not recommended at this time). - -## Step 2: Check Out the SORMAS Repository +## Step 1: Check Out the SORMAS Repository - [Download and install the latest Git version](https://git-scm.com/downloads) for your operating system - *Optional:* Install a Git client such as [TortoiseGit](https://tortoisegit.org/) or [GitHub Desktop](https://desktop.github.com/) if you don't want to handle version control from the command line or within your IDE - *Optional:* Clone the SORMAS-Project repository with `git clone https://github.com/hzi-braunschweig/SORMAS-Project.git`; if you want to use Git from within your IDE, you can also clone the repository in Step 4 - Open Git Bash and execute the following command to ensure that rebase is used when pulling the development branch rather than merge: `git config --global branch.development.rebase true` -## Step 3: Install Java +## Step 2: Install Java Download and install the **Java 11 JDK** (not JRE) for your operating system. We suggest using [Zulu OpenJDK](https://www.azul.com/downloads/?version=java-11-lts&package=jdk). If you're running Linux, please refer to the [official documentation](https://docs.azul.com/zulu/zuludocs/ZuluUserGuide/PrepareZuluPlatform/AttachAPTRepositoryUbuntuOrDebianSys.htm) on how to install Zulu OpenJDK on your system. If you plan to work on the Android App as well, you will also need the **Java 8 JDK** to use with Android Studio. -## Step 4: Install and Configure Your IDE +## Step 3: Install Maven & Ant +Download and install Maven for your operating system, see [binaries](https://dlcdn.apache.org/maven/maven-3/3.6.3/binaries/) +*IMPORTANT*: M2_HOME environment variable needs to be set. By default, for newer version, it is set to MAVEN_HOME. But Ant script is looking for M2_HOME, please refer to the [official documentation](https://maven.apache.org/install.html) + +Download and install Ant, it can be done from [Ant site](https://ant.apache.org/bindownload.cgi) or with packages from your Linux distribution. + +## Step 4: Install a Local SORMAS Server +Please follow the [Server Installation Instructions](https://github.com/hzi-braunschweig/SORMAS-Project/blob/development/docs/SERVER_SETUP.md#sormas-installation) to set up a local SORMAS instance that you will use to test your code. Alternatively, you can also use [Maven Cargo](../sormas-cargoserver/README.md), or a [Docker installation](SERVER_DOCKER_SETUP.md) (not recommended at this time). + +## Step 5: Install and Configure Your IDE ### IntelliJ - Download and install the latest [IntelliJ IDEA Ultimate](https://www.jetbrains.com/lp/intellij-frameworks/); (newer than version of 2020-04-15 to enable debugging, see ) - Set the project SDK to the installed JDK - *Optional:* Clone the SORMAS-Project repository if you haven't done so already -- Open the project in IntelliJ. Make sure the project is recognized by IntelliJ as a `maven project`; if not, right-click the `pom.xml` file in sormas-base and select `Add as maven project`. +- Open the project in IntelliJ. Make sure the project is recognized by IntelliJ as a `maven project`; if not, right-click the `pom.xml` file in `sormas-base` and select `Add as maven project`. - Make sure that under `File -> Project Structure -> Modules` all modules EXCEPT sormas-app are recognized; if not, add the missing modules with the `+` button - Navigate to `File -> Settings -> Plugins` and make sure that Glassfish & Ant integrations are enabled - Install the [Vaadin 6-8 plugin](https://plugins.jetbrains.com/plugin/13199-vaadin-6-8); the commercial Vaadin Designer is not needed @@ -45,6 +51,7 @@ If you plan to work on the Android App as well, you will also need the **Java 8 - Open the Ant window, click on the `+` icon and select the `sormas-base/build.xml` file - Execute the `install` and `deploy-serverlibs` Ant scripts - Set the default working directory for run configurations by navigating to `Run -> Edit Configurations -> Templates -> Application` and setting `Working directory` to `$MODULE_WORKING_DIR$` +- *Optional:* Setup database access from Intellij: Open View -> Tool View -> Database, click on + icon and select DataSource -> PostgreSQL and configure the database (set user and password and download the missing driver files if needed) #### Known issues - The first time you build the project in IntelliJ, you have to switch the java compiler to "Eclipse" to workarround a dependency resolution problem in sormas-api. @@ -80,7 +87,7 @@ If you plan to work on the Android App as well, you will also need the **Java 8 **Important:** Whenever you do or pull changes in the `sormas-api` project that you want to use in the mobile app or that are referenced there already, you need to execute the `install` Ant script to notify the `sormas-app` project of the changes. -## Step 5: Configure Code Formatting and Import Settings +## Step 6: Configure Code Formatting and Import Settings In order to ensure a consistent code style and prevent so-called edit wars, we have set up custom configuration files for automatic code formatting and import ordering. Please make sure to adhere to the following steps for your IDE(s) before you start developing. ### IntelliJ and Android Studio Settings @@ -127,6 +134,8 @@ Optional, but strongly recommended: 7. For eclipse formatted plugin, there is an issue for Idea: - `cannot save settings Path to custom eclipse folder is not valid` - it works only when settings were saved from down to up. And not vice versa. +If something is still not working, try to clean up (delete all from domains/sormas/autodeploy, domains/sormas/applications, domains/sormas/generated, and domains/sormas/osgi-cache) try to build again by executing `mvn clean install -DskipTests` on the `sormas-base` module + ## Avoid redeployment problems **Problem**: Due to currently a not mitigated problem, it is only possible to deploy the `sormas-ear.ear` (contains `sormas-backend`) once without problems. If you undeploy it and deploy `sormas-ear.ear` again, the other artifacts `sormas-ui`and `sormas-rest` cannot successfully call the backend. diff --git a/docs/SERVER_DEV_SETUP.md b/docs/SERVER_DOCKER_SETUP.md similarity index 100% rename from docs/SERVER_DEV_SETUP.md rename to docs/SERVER_DOCKER_SETUP.md diff --git a/docs/SERVER_SETUP.md b/docs/SERVER_SETUP.md index 1a67dfed3a9..f82b4fbc59e 100644 --- a/docs/SERVER_SETUP.md +++ b/docs/SERVER_SETUP.md @@ -65,7 +65,7 @@ You can check your Java version from the shell/command line using: ``java -versi * Install the "temporal tables" extension for Postgres () * **Windows**: Download the latest version for your Postgres version: , then copy the DLL from the project into the PostgreSQL's lib directory and the .sql and .control files into the directory share\extension. * **Linux** (see - +* Add the PostgreSQL path (/etc/PostgreSQL/10/bin) to Environment Variables ```bash sudo apt-get install libpq-dev sudo apt-get install postgresql-server-dev-all @@ -106,7 +106,7 @@ chmod +x $(date +%F)/server-setup.sh ### Auditing You can configure the audit logger of SORMAS by providing a Logback [configuration file](https://logback.qos.ch/manual/configuration.html) and setting the `audit.logger.config` property accordingly. An example is provided in `sormas-base/setup/audit-logback.xml`. Not specifying a value for the property will effectively disable the audit log. -### Post-Installation Configuration +### Sormas installation * Optional: Open ``server-setup.sh`` in a text editor to customize the install paths, database access and ports for the server. The default ports are 6080 (HTTP), 6081 (HTTPS) and 6048 (admin). **Important:** Do not change the name of the database user. The pre-defined name is used in the statements executed in the database. * Set up the database and a Payara domain for SORMAS by executing the setup script: ``sudo -s ./server-setup.sh`` Press enter whenever asked for it From 4bef7b7f0e3932e63defee87d336bb5d70e1218b Mon Sep 17 00:00:00 2001 From: Bal Andrei Date: Thu, 24 Nov 2022 16:08:16 +0200 Subject: [PATCH 002/147] #9611 Move visits calculations to DTOs for Cases and Contacts --- .../symeda/sormas/api/caze/CaseIndexDto.java | 9 ++++++++ .../sormas/api/contact/ContactIndexDto.java | 9 ++++++++ .../sormas/backend/caze/CaseFacadeEjb.java | 20 +++++++++++++++++ .../backend/contact/ContactFacadeEjb.java | 22 +++++++++++++++++++ .../sormas/ui/caze/AbstractCaseGrid.java | 11 +++------- .../ui/contact/AbstractContactGrid.java | 11 +++------- 6 files changed, 66 insertions(+), 16 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseIndexDto.java index e81156be922..7140ffcf414 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseIndexDto.java @@ -117,6 +117,7 @@ public class CaseIndexDto extends PseudonymizableIndexDto implements MergeableIn private SymptomJournalStatus symptomJournalStatus; private VaccinationStatus vaccinationStatus; private Integer visitCount; + private Integer missedVisitsCount; private Date surveillanceToolLastShareDate; private Long surveillanceToolShareCount; @@ -528,4 +529,12 @@ public String getResponsibleDistrictName() { public void setResponsibleDistrictName(String responsibleDistrictName) { this.responsibleDistrictName = responsibleDistrictName; } + + public Integer getMissedVisitsCount() { + return missedVisitsCount; + } + + public void setMissedVisitsCount(Integer missedVisitsCount) { + this.missedVisitsCount = missedVisitsCount; + } } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactIndexDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactIndexDto.java index 4ec60458def..845df09b552 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactIndexDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactIndexDto.java @@ -83,6 +83,7 @@ public class ContactIndexDto extends PseudonymizableIndexDto implements Serializ private ContactCategory contactCategory; private CaseClassification caseClassification; private int visitCount; + private Integer missedVisitsCount; private String externalID; private String externalToken; private String internalToken; @@ -376,6 +377,14 @@ public boolean getCaseInJurisdiction() { return contactJurisdictionFlagsDto.getCaseInJurisdiction(); } + public Integer getMissedVisitsCount() { + return missedVisitsCount; + } + + public void setMissedVisitsCount(Integer missedVisitsCount) { + this.missedVisitsCount = missedVisitsCount; + } + @Override public Object clone() throws CloneNotSupportedException { return super.clone(); 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 b73eeb519ba..99d0f699eef 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 @@ -70,6 +70,8 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; +import de.symeda.sormas.api.disease.DiseaseConfigurationFacade; +import de.symeda.sormas.api.followup.FollowUpLogic; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -604,6 +606,15 @@ public List getIndexList(CaseCriteria caseCriteria, Integer first, caze, isInJurisdiction, c -> pseudonymizer.pseudonymizeDto(AgeAndBirthDateDto.class, caze.getAgeAndBirthDate(), isInJurisdiction, null)); + + if (diseaseConfigurationFacade.hasFollowUp(caze.getDisease())) { + int numberOfMissedVisits = + FollowUpLogic.getNumberOfRequiredVisitsSoFar(caze.getReportDate(), caze.getFollowUpUntil()) - caze.getVisitCount(); + if (numberOfMissedVisits < 0) { + numberOfMissedVisits = 0; + } + caze.setMissedVisitsCount(numberOfMissedVisits); + } } return cases; @@ -659,6 +670,15 @@ public List getIndexDetailedList(CaseCriteria caseCriteria pseudonymizer .pseudonymizeUser(userService.getByUuid(caze.getReportingUser().getUuid()), userService.getCurrentUser(), caze::setReportingUser); }); + + if (diseaseConfigurationFacade.hasFollowUp(caze.getDisease())) { + int numberOfMissedVisits = + FollowUpLogic.getNumberOfRequiredVisitsSoFar(caze.getReportDate(), caze.getFollowUpUntil()) - caze.getVisitCount(); + if (numberOfMissedVisits < 0) { + numberOfMissedVisits = 0; + } + caze.setMissedVisitsCount(numberOfMissedVisits); + } } return cases; 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 33d50de634a..03d778c9d37 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 @@ -64,6 +64,7 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; +import de.symeda.sormas.api.followup.FollowUpLogic; import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -1230,6 +1231,16 @@ public List getIndexList(ContactCriteria contactCriteria, Integ pseudonymizer.pseudonymizeDto(CaseReferenceDto.class, c.getCaze(), c.getCaseInJurisdiction(), null); } }); + dtos.forEach(contact -> { + if (diseaseConfigurationFacade.hasFollowUp(contact.getDisease())) { + int numberOfMissedVisits = + FollowUpLogic.getNumberOfRequiredVisitsSoFar(contact.getReportDateTime(), contact.getFollowUpUntil()) - contact.getVisitCount(); + if (numberOfMissedVisits < 0) { + numberOfMissedVisits = 0; + } + contact.setMissedVisitsCount(numberOfMissedVisits); + } + }); return dtos; } @@ -1283,6 +1294,17 @@ public List getIndexDetailedList( } }); + dtos.forEach(contact -> { + if (diseaseConfigurationFacade.hasFollowUp(contact.getDisease())) { + int numberOfMissedVisits = + FollowUpLogic.getNumberOfRequiredVisitsSoFar(contact.getReportDateTime(), contact.getFollowUpUntil()) - contact.getVisitCount(); + if (numberOfMissedVisits < 0) { + numberOfMissedVisits = 0; + } + contact.setMissedVisitsCount(numberOfMissedVisits); + } + }); + return dtos; } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseGrid.java index b79d921dc47..5a72f9bddba 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseGrid.java @@ -110,14 +110,9 @@ protected void initColumns() { diseaseShortColumn.setSortProperty(CaseIndexDto.DISEASE); Column visitsColumn = addColumn(entry -> { - if (FacadeProvider.getDiseaseConfigurationFacade().hasFollowUp(entry.getDisease())) { - int numberOfVisits = entry.getVisitCount(); - int numberOfRequiredVisits = FollowUpLogic.getNumberOfRequiredVisitsSoFar(entry.getReportDate(), entry.getFollowUpUntil()); - int numberOfMissedVisits = numberOfRequiredVisits - numberOfVisits; - // Set number of missed visits to 0 when more visits than expected have been done - if (numberOfMissedVisits < 0) { - numberOfMissedVisits = 0; - } + Integer numberOfVisits = entry.getVisitCount(); + Integer numberOfMissedVisits = entry.getMissedVisitsCount(); + if (numberOfVisits != null && numberOfMissedVisits != null ) { return String.format(I18nProperties.getCaption(Captions.formatNumberOfVisitsFormat), numberOfVisits, numberOfMissedVisits); } else { return "-"; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java index f527c117372..1fe16a5e9c7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java @@ -114,14 +114,9 @@ protected void initColumns() { diseaseShortColumn.setSortProperty(ContactIndexDto.DISEASE); Column visitsColumn = addColumn(entry -> { - if (FacadeProvider.getDiseaseConfigurationFacade().hasFollowUp(entry.getDisease())) { - int numberOfVisits = entry.getVisitCount(); - int numberOfRequiredVisits = FollowUpLogic.getNumberOfRequiredVisitsSoFar(entry.getReportDateTime(), entry.getFollowUpUntil()); - int numberOfMissedVisits = numberOfRequiredVisits - numberOfVisits; - // Set number of missed visits to 0 when more visits than expected have been done - if (numberOfMissedVisits < 0) { - numberOfMissedVisits = 0; - } + Integer numberOfVisits = entry.getVisitCount(); + Integer numberOfMissedVisits = entry.getMissedVisitsCount(); + if (numberOfVisits != null && numberOfMissedVisits != null ) { return String.format(I18nProperties.getCaption(Captions.formatNumberOfVisitsFormat), numberOfVisits, numberOfMissedVisits); } else { return "-"; From 29a3ca1d1dc7d7ef6b9dd318ce76fb3233c48d79 Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Fri, 25 Nov 2022 13:12:00 +0100 Subject: [PATCH 003/147] fixes --- .../sormas/e2etests/steps/web/application/ColumnSteps.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/ColumnSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/ColumnSteps.java index 54a324f9f9d..d0b9f8f531f 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/ColumnSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/ColumnSteps.java @@ -42,17 +42,19 @@ public ColumnSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { rawColumnData.replaceAll(element -> nullifyEmptyString(element)); List ascColumnData = new ArrayList<>(rawColumnData); ascColumnData.sort(Comparator.nullsLast(Comparator.naturalOrder())); + log.info("List elements before test " + ColumnSteps.rawColumnData); softly.assertEquals( rawColumnData, ascColumnData, "Column " + col.toString() + " is not correctly sorted!"); softly.assertAll(); + log.info("List elements after test " + ColumnSteps.rawColumnData); }); When( "I check that column {int} is sorted alphabetically in descending order", (Integer col) -> { - TimeUnit.SECONDS.sleep(3); // For preventing premature data collection + TimeUnit.SECONDS.sleep(5); // For preventing premature data collection List rawColumnData = getTableColumnDataByIndex(col, 10); rawColumnData.replaceAll(element -> element.toLowerCase()); rawColumnData.replaceAll(element -> nullifyEmptyString(element)); From 8ec059c19fc44930733bb9bbac34aa030d953790 Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Fri, 25 Nov 2022 13:12:45 +0100 Subject: [PATCH 004/147] fixes --- .../e2etests/steps/web/application/ColumnSteps.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/ColumnSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/ColumnSteps.java index d0b9f8f531f..afac811e661 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/ColumnSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/ColumnSteps.java @@ -30,25 +30,25 @@ public ColumnSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { (Integer col) -> { webDriverHelpers.clickOnWebElementBySelector( By.xpath("//thead//tr//th[" + col.toString() + "]")); - webDriverHelpers.waitForPageLoadingSpinnerToDisappear(15); + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(20); }); When( "I check that column {int} is sorted alphabetically in ascending order", (Integer col) -> { - TimeUnit.SECONDS.sleep(3); // For preventing premature data collection + TimeUnit.SECONDS.sleep(5); // For preventing premature data collection List rawColumnData = getTableColumnDataByIndex(col, 10); rawColumnData.replaceAll(element -> element.toLowerCase()); rawColumnData.replaceAll(element -> nullifyEmptyString(element)); List ascColumnData = new ArrayList<>(rawColumnData); ascColumnData.sort(Comparator.nullsLast(Comparator.naturalOrder())); - log.info("List elements before test " + ColumnSteps.rawColumnData); + log.info("List elements before test " + rawColumnData); softly.assertEquals( rawColumnData, ascColumnData, "Column " + col.toString() + " is not correctly sorted!"); softly.assertAll(); - log.info("List elements after test " + ColumnSteps.rawColumnData); + log.info("List elements after test " + rawColumnData); }); When( From ed2be99f2e10c013ad9ac56b97c61802d195d8f7 Mon Sep 17 00:00:00 2001 From: popadriangeo Date: Wed, 30 Nov 2022 11:35:47 +0200 Subject: [PATCH 005/147] #10419 - added Scenario: Verify Warning message in Event Participants for Bulk actions, when no event is selected --- .../application/events/EditEventPage.java | 1 + .../events/EventParticipantsPage.java | 1 + .../application/events/EditEventSteps.java | 14 ++++++++++++++ .../events/EventDirectorySteps.java | 19 +++++++++++++++++++ .../features/sanity/web/Event.feature | 19 ++++++++++++++++++- 5 files changed, 53 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java index 96a31fc9e6c..f30fa5adde8 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java @@ -96,6 +96,7 @@ public class EditEventPage { public static final By FIRST_GROUP_ID = By.xpath("//table/tbody/tr[1]/td[2]"); public static final By TOTAL_ACTIONS_COUNTER = By.cssSelector(".badge"); public static final By CREATE_CONTACTS_BULK_EDIT_BUTTON = By.id("bulkActions-3"); + public static final By DELETE_BULK_EDIT_BUTTON_EVENT_PARTICIPANT = By.id("bulkActions-4"); public static final By CREATE_QUARANTINE_ORDER_EVENT_PARTICIPANT = By.id("bulkActions-5"); public static final By EVENT_MANAGEMENT_STATUS_CHECK = By.cssSelector("#eventManagementStatus input:checked[type='checkbox'] ~ label"); diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EventParticipantsPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EventParticipantsPage.java index 011ea974b10..fcade25adac 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EventParticipantsPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EventParticipantsPage.java @@ -81,6 +81,7 @@ public class EventParticipantsPage { public static final By GENERAL_COMMENT_TEXT_AREA = By.id("additionalDetails"); public static final By PASSPORT_NUMBER_INPUT = By.id("passportNumber"); public static final By INVOLVEMENT_DESCRIPTION_INPUT = By.id("involvementDescription"); + public static By NOTIFICATION_EVENT_PARTICIPANT = By.cssSelector(".v-Notification-description"); public static final By getEventParticipantByPersonUuid(String uuid) { return By.xpath(String.format("//a[@title='%s']//parent::td//parent::tr//td[1]/a", uuid)); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index 3cb4394d9d6..7db948e7213 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -56,6 +56,7 @@ import static org.sormas.e2etests.pages.application.events.EditEventPage.CREATE_CONTACTS_BULK_EDIT_BUTTON; import static org.sormas.e2etests.pages.application.events.EditEventPage.CREATE_QUARANTINE_ORDER_EVENT_PARTICIPANT; import static org.sormas.e2etests.pages.application.events.EditEventPage.DEFAULT_COMBOBOX_VALUE; +import static org.sormas.e2etests.pages.application.events.EditEventPage.DELETE_BULK_EDIT_BUTTON_EVENT_PARTICIPANT; import static org.sormas.e2etests.pages.application.events.EditEventPage.DESCRIPTIVE_ANALYSIS_OF_ASCETAINED_DATA_EPIDEMIOLOGICAL_EVIDENCE_BUTTON_DE; import static org.sormas.e2etests.pages.application.events.EditEventPage.DISEASE_COMBOBOX; import static org.sormas.e2etests.pages.application.events.EditEventPage.DISEASE_INPUT; @@ -934,6 +935,19 @@ public EditEventSteps( () -> { webDriverHelpers.clickOnWebElementBySelector(CREATE_CONTACTS_BULK_EDIT_BUTTON); }); + + When( + "I click on Delete button from bulk actions menu in Event Participant Tab", + () -> { + webDriverHelpers.clickOnWebElementBySelector(DELETE_BULK_EDIT_BUTTON_EVENT_PARTICIPANT); + }); + + When( + "I click on Create quarantine order documents from bulk actions menu in Event Participant Tab", + () -> { + webDriverHelpers.clickOnWebElementBySelector(CREATE_QUARANTINE_ORDER_EVENT_PARTICIPANT); + }); + When( "I click checkbox to choose all Event Participants results in Event Participant Tab", () -> { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java index da8944175f8..962786e418e 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java @@ -129,6 +129,7 @@ import static org.sormas.e2etests.pages.application.events.EventDirectoryPage.getVaccinationStatusEventParticipantByText; import static org.sormas.e2etests.pages.application.events.EventParticipantsPage.CREATE_NEW_PERSON_RADIO_BUTTON; import static org.sormas.e2etests.pages.application.events.EventParticipantsPage.EVENT_PARTICIPANT_DISPLAY_FILTER_COMBOBOX; +import static org.sormas.e2etests.pages.application.events.EventParticipantsPage.NOTIFICATION_EVENT_PARTICIPANT; import static org.sormas.e2etests.pages.application.events.EventParticipantsPage.PICK_OR_CREATE_PERSON_POPUP; import static org.sormas.e2etests.pages.application.events.EventParticipantsPage.PICK_OR_CREATE_POPUP_SAVE_BUTTON; import static org.sormas.e2etests.pages.application.persons.PersonDirectoryPage.APPLY_FILTERS_BUTTON; @@ -995,6 +996,24 @@ public EventDirectorySteps( () -> { webDriverHelpers.clickOnWebElementBySelector(ENTER_BULK_EDIT_MODE_EVENT_DIRECTORY); }); + + And( + "I click Enter Bulk Edit Mode in Event Participants Page", + () -> { + webDriverHelpers.clickOnWebElementBySelector(ENTER_BULK_EDIT_MODE_EVENT_DIRECTORY); + }); + + Then( + "I verify the warning message 'No event participants selected' is displayed", + () -> { + webDriverHelpers.waitUntilElementIsVisibleAndClickable(NOTIFICATION_EVENT_PARTICIPANT); + softly.assertEquals( + webDriverHelpers.getTextFromPresentWebElement(NOTIFICATION_EVENT_PARTICIPANT), + "You have not selected any event participants", + "Assert on notification popup went wrong"); + softly.assertAll(); + }); + When( "I click on the created event participant from the list", () -> webDriverHelpers.clickOnWebElementBySelector(CREATED_PARTICIPANT)); diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature index d779069a715..8e267787599 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature @@ -1410,4 +1410,21 @@ Feature: Create events And API: I check that GET call status code is 200 Then I click on the Events button from navbar And I filter by last created event via api - And I check the number of displayed Event results from All button is 1 \ No newline at end of file + And I check the number of displayed Event results from All button is 1 + + @#10419 @env_main + Scenario: Verify Warning message in Event Participants for Bulk actions, when no event is selected + Given I log in as a Admin User + And I click on the Events button from navbar + When I click on the first row from event participant list + And I navigate to EVENT PARTICIPANT from edit event page + And I click Enter Bulk Edit Mode in Event Participants Page + And I click on Bulk Actions combobox in Event Parcitipant Tab + And I click on Create Contacts button from bulk actions menu in Event Participant Tab + Then I verify the warning message 'No event participants selected' is displayed + And I click on Bulk Actions combobox in Event Parcitipant Tab + And I click on Delete button from bulk actions menu in Event Participant Tab + Then I verify the warning message 'No event participants selected' is displayed + And I click on Bulk Actions combobox in Event Parcitipant Tab + And I click on Create quarantine order documents from bulk actions menu in Event Participant Tab + Then I verify the warning message 'No event participants selected' is displayed From 0d3c680dc7ea175e03f2a33a70460a0952bf46cd Mon Sep 17 00:00:00 2001 From: Bal Andrei Date: Wed, 30 Nov 2022 13:10:33 +0200 Subject: [PATCH 006/147] #10991 Add phoneNo and email validators for Event on mobile app --- .../java/de/symeda/sormas/app/event/edit/EventEditFragment.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/event/edit/EventEditFragment.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/event/edit/EventEditFragment.java index 63b309e14f0..f2cedd9fc70 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/event/edit/EventEditFragment.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/event/edit/EventEditFragment.java @@ -226,6 +226,8 @@ public void onLayoutBinding(FragmentEventEditLayoutBinding contentBinding) { contentBinding.setEventManagementStatusClass(EventManagementStatus.class); contentBinding.setIsMultiDayEvent(isMultiDayEvent); + ValidationHelper.initEmailValidator(contentBinding.eventSrcEmail); + ValidationHelper.initPhoneNumberValidator(contentBinding.eventSrcTelNo); ValidationHelper.initDateIntervalValidator(contentBinding.eventStartDate, contentBinding.eventEndDate); ValidationHelper.initDateIntervalValidator(contentBinding.eventStartDate, contentBinding.eventReportDateTime); } From cd87721fee9b19c073ed6e825499d41ce10fa0bb Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Fri, 2 Dec 2022 14:48:58 +0100 Subject: [PATCH 007/147] SORQA-698 --- .../features/sanity/web/Login.feature | 52 ++++++++++++------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature index fa2495fd9e4..c23d1255fef 100755 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature @@ -12,16 +12,22 @@ Feature: Login with different type of users And I click on logout button Examples: - | user | - | National User | - | National Language User | - | Contact Supervisor | - | Surveillance Officer | - | Surveillance Supervisor | - | Laboratory Officer | - | Point of Entry Supervisor | - | Admin User | - | Rest AUTOMATION | + | user | + | National User | + | National Language User | + | Contact Supervisor | + | Surveillance Officer | + | Surveillance Supervisor | + | Laboratory Officer | + | Point of Entry Supervisor | + | Admin User | + | Rest AUTOMATION | + | National Clinician | + | Admin Surveillance Supervisor | + | Contact Officer | + | Community Officer | + | Hospital Informant | + | Clinician | @env_de @LoginDe Scenario Outline: Login with user on German Environment @@ -36,16 +42,22 @@ Feature: Login with different type of users And I click on logout button Examples: - | user | - | National User | - | National Language User | - | Contact Supervisor | - | Surveillance Officer | - | Surveillance Supervisor | - | Laboratory Officer | - | Point of Entry Supervisor | - | Admin User | - | Rest AUTOMATION | + | user | + | National User | + | National Language User | + | Contact Supervisor | + | Surveillance Officer | + | Surveillance Supervisor | + | Laboratory Officer | + | Point of Entry Supervisor | + | Admin User | + | Rest AUTOMATION | + | National Clinician | + | Admin Surveillance Supervisor | + | Contact Officer | + | Community Officer | + | Hospital Informant | + | Clinician | @env_keycloak @LoginKeycloak Scenario Outline: Login with user on Keycloak Environment From 0e46abe01dcfece96f6b8b1ee6e0ca2449033a79 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Fri, 2 Dec 2022 15:51:47 +0100 Subject: [PATCH 008/147] SORQA-698 --- .../src/test/resources/features/sanity/web/Login.feature | 2 -- 1 file changed, 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature index c23d1255fef..f92260de4da 100755 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature @@ -22,7 +22,6 @@ Feature: Login with different type of users | Point of Entry Supervisor | | Admin User | | Rest AUTOMATION | - | National Clinician | | Admin Surveillance Supervisor | | Contact Officer | | Community Officer | @@ -52,7 +51,6 @@ Feature: Login with different type of users | Point of Entry Supervisor | | Admin User | | Rest AUTOMATION | - | National Clinician | | Admin Surveillance Supervisor | | Contact Officer | | Community Officer | From 7ce366e5049423e5bda65da61a6516c0e178bd35 Mon Sep 17 00:00:00 2001 From: jenkins Date: Fri, 2 Dec 2022 21:41:17 +0100 Subject: [PATCH 009/147] [GITFLOW]updating poms for 1.78.0-SNAPSHOT development --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index f854e02422e..ec8a91fd49e 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.77.0-SNAPSHOT + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 091d0fb2898..6a49b253781 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.0-SNAPSHOT + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index b2133541c66..5a7625052ac 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.0-SNAPSHOT + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index 51d89e120b6..91db21e5987 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.77.0-SNAPSHOT + 1.78.0-SNAPSHOT ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 13faf3ac686..8f1cf55d2b9 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.77.0-SNAPSHOT + 1.78.0-SNAPSHOT 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 55ac13ef085..935d51a2397 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.0-SNAPSHOT + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 86a144679f6..05d2cab9ca1 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.0-SNAPSHOT + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index f0438c2d223..6c507e70a4e 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.0-SNAPSHOT + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 1c266bc592a..2798d0cc469 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.0-SNAPSHOT + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 83464d05fd2..04695198254 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.0-SNAPSHOT + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index ba694021688..7ceea1349a7 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.0-SNAPSHOT + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 From 633df8c11f8af467024726e17ecb74acfeb02bac Mon Sep 17 00:00:00 2001 From: jenkins Date: Fri, 2 Dec 2022 23:26:45 +0100 Subject: [PATCH 010/147] [GITFLOW]updating develop poms to master versions to avoid merge conflicts --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index ec8a91fd49e..056cfd2b5f9 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.0 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 6a49b253781..9ffb080aade 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.0 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 5a7625052ac..e3f83a875da 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.0 ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index 91db21e5987..53b7491e48c 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.0 ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 8f1cf55d2b9..a6c3139c6bb 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.78.0-SNAPSHOT + 1.77.0 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 935d51a2397..89b13b14639 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.0 ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 05d2cab9ca1..1004af6a3b0 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.0 ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 6c507e70a4e..c85dee8e906 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.0 ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 2798d0cc469..a112df50297 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.0 ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 04695198254..cb943ce1439 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.0 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 7ceea1349a7..9a09518b34f 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.0 ../sormas-base 4.0.0 From b0a984f89d5a08d48ddf1399e1c2a1957770747b Mon Sep 17 00:00:00 2001 From: jenkins Date: Fri, 2 Dec 2022 23:26:48 +0100 Subject: [PATCH 011/147] [GITFLOW]Updating develop poms back to pre merge state --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index 056cfd2b5f9..ec8a91fd49e 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.77.0 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 9ffb080aade..6a49b253781 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.0 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index e3f83a875da..5a7625052ac 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.0 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index 53b7491e48c..91db21e5987 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.77.0 + 1.78.0-SNAPSHOT ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index a6c3139c6bb..8f1cf55d2b9 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.77.0 + 1.78.0-SNAPSHOT 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 89b13b14639..935d51a2397 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.0 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 1004af6a3b0..05d2cab9ca1 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.0 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index c85dee8e906..6c507e70a4e 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.0 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index a112df50297..2798d0cc469 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.0 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index cb943ce1439..04695198254 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.0 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 9a09518b34f..7ceea1349a7 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.0 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 From fc09bc05715d26e58a6fbc0edc42b58693ff0de3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Mon, 5 Dec 2022 10:00:13 +0100 Subject: [PATCH 012/147] [GITFLOW]Updating development poms to hotfix version to avoid merge conflicts --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index ec8a91fd49e..e130e44ed0a 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.1 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 6a49b253781..25c593ebbb4 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.1 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 5a7625052ac..e05b8b80828 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.1 ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index 91db21e5987..cc02ecf47d5 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.1 ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 8f1cf55d2b9..4df01fde8d2 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.78.0-SNAPSHOT + 1.77.1 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 935d51a2397..7d8bfab8257 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.1 ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 05d2cab9ca1..f5f55c298cb 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.1 ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 6c507e70a4e..89648c13387 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.1 ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 2798d0cc469..b9267050ec2 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.1 ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 04695198254..0165ee3d92f 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.1 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 7ceea1349a7..9cc00885d3c 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.1 ../sormas-base 4.0.0 From c8c6147242bdaa99ba6d06d72ca78a79bdc03f94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Mon, 5 Dec 2022 10:00:29 +0100 Subject: [PATCH 013/147] [GITFLOW]Updating develop poms back to pre merge state --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index e130e44ed0a..ec8a91fd49e 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.77.1 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 25c593ebbb4..6a49b253781 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.1 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index e05b8b80828..5a7625052ac 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.1 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index cc02ecf47d5..91db21e5987 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.77.1 + 1.78.0-SNAPSHOT ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 4df01fde8d2..8f1cf55d2b9 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.77.1 + 1.78.0-SNAPSHOT 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 7d8bfab8257..935d51a2397 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.1 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index f5f55c298cb..05d2cab9ca1 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.1 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 89648c13387..6c507e70a4e 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.1 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index b9267050ec2..2798d0cc469 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.1 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 0165ee3d92f..04695198254 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.1 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 9cc00885d3c..7ceea1349a7 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.1 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 From a996443fed35d8b9e60e9c51863d78555442b395 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 5 Dec 2022 10:14:19 +0100 Subject: [PATCH 014/147] SORQA-688 --- .../e2etests/pages/application/entries/EditTravelEntryPage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/entries/EditTravelEntryPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/entries/EditTravelEntryPage.java index 2d8c2f2d793..191a96f0a11 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/entries/EditTravelEntryPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/entries/EditTravelEntryPage.java @@ -58,7 +58,7 @@ public class EditTravelEntryPage { By.xpath( "//div[text()='Dokumente']/../parent::div/../../following-sibling::div//div[@class='v-label v-disabled v-widget caption-truncated v-label-caption-truncated v-label-undef-w']"); public static final By NEW_TASK_DE = By.cssSelector("[id='Neue Aufgabe']"); - public static final By EDIT_TASK_DE = By.id("edit-task-0"); + public static final By EDIT_TASK_DE = By.id("edit0"); public static final By DELETE_TASK_BUTTON = By.cssSelector(".popupContent #deleteUndelete"); public static final By DISCARD_TASK_BUTTON = By.cssSelector(".popupContent #discard"); public static final By SAVE_TASK_BUTTON = By.cssSelector(".popupContent #commit"); From c2a078774709b5b2dfe3d14d6c9365c831b639f3 Mon Sep 17 00:00:00 2001 From: Levente Gal Date: Mon, 5 Dec 2022 11:25:14 +0200 Subject: [PATCH 015/147] #8471 S2S_automatic update in the share-box - fixed reloading share information after share --- .../SormasToSormasController.java | 31 ++++++++++--------- .../SormasToSormasListComponent.java | 6 ++-- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasController.java index 392e79aab75..bf566e9dc3d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasController.java @@ -57,7 +57,6 @@ import de.symeda.sormas.api.sormastosormas.validation.ValidationErrors; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.ui.ControllerProvider; -import de.symeda.sormas.ui.SormasUI; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.VaadinUiUtil; @@ -71,13 +70,14 @@ public void registerViews(Navigator navigator) { navigator.addView(ShareRequestsView.VIEW_NAME, ShareRequestsView.class); } - public void shareCaseFromDetailsPage(CaseDataDto caze) { + public void shareCaseFromDetailsPage(CaseDataDto caze, Runnable callback) { List currentShares = FacadeProvider.getSormasToSormasShareInfoFacade() .getIndexList(new SormasToSormasShareInfoCriteria().caze(caze.toReference()), null, null); - shareToSormasFromDetailPage( - options -> FacadeProvider.getSormasToSormasCaseFacade().share(Collections.singletonList(caze.getUuid()), options), - SormasToSormasOptionsForm.forCase(caze, currentShares)); + shareToSormasFromDetailPage(options -> { + FacadeProvider.getSormasToSormasCaseFacade().share(Collections.singletonList(caze.getUuid()), options); + callback.run(); + }, SormasToSormasOptionsForm.forCase(caze, currentShares)); } public void shareSelectedCases(Collection selectedRows, Runnable callback) { @@ -89,7 +89,7 @@ public void shareSelectedCases(Collection selectedRows, new SormasToSormasOptionsDto()); } - public void shareContactFromDetailsPage(ContactDto contact) { + public void shareContactFromDetailsPage(ContactDto contact, Runnable callback) { if (contact.getCaze() == null) { VaadinUiUtil.showSimplePopupWindow( I18nProperties.getString(Strings.headingSormasToSormasCantShareContactWithoutCase), @@ -99,9 +99,10 @@ public void shareContactFromDetailsPage(ContactDto contact) { List currentShares = FacadeProvider.getSormasToSormasShareInfoFacade() .getIndexList(new SormasToSormasShareInfoCriteria().contact(contact.toReference()), null, null); - shareToSormasFromDetailPage( - options -> FacadeProvider.getSormasToSormasContactFacade().share(Collections.singletonList(contact.getUuid()), options), - SormasToSormasOptionsForm.forContact(contact, currentShares)); + shareToSormasFromDetailPage(options -> { + FacadeProvider.getSormasToSormasContactFacade().share(Collections.singletonList(contact.getUuid()), options); + callback.run(); + }, SormasToSormasOptionsForm.forContact(contact, currentShares)); } public void shareSelectedContacts(Collection selectedRows, Runnable callback) { @@ -113,13 +114,14 @@ public void shareSelectedContacts(Collection selected new SormasToSormasOptionsDto()); } - public void shareEventFromDetailsPage(EventDto event) { + public void shareEventFromDetailsPage(EventDto event, Runnable callback) { List currentShares = FacadeProvider.getSormasToSormasShareInfoFacade() .getIndexList(new SormasToSormasShareInfoCriteria().event(event.toReference()), null, null); - shareToSormasFromDetailPage( - options -> FacadeProvider.getSormasToSormasEventFacade().share(Collections.singletonList(event.getUuid()), options), - SormasToSormasOptionsForm.forEvent(event, currentShares)); + shareToSormasFromDetailPage(options -> { + FacadeProvider.getSormasToSormasEventFacade().share(Collections.singletonList(event.getUuid()), options); + callback.run(); + }, SormasToSormasOptionsForm.forEvent(event, currentShares)); } public void shareLabMessage(ExternalMessageDto labMessage, Runnable callback) { @@ -326,7 +328,8 @@ public void revokeShareRequest(String requestUuid, Runnable callback) { } private void shareToSormasFromDetailPage(HandleShareWithOptions handleShareWithOptions, SormasToSormasOptionsForm optionsForm) { - handleShareWithOptions(handleShareWithOptions, SormasUI::refreshView, optionsForm, new SormasToSormasOptionsDto()); + handleShareWithOptions(handleShareWithOptions, () -> { + }, optionsForm, new SormasToSormasOptionsDto()); } private void handleShareWithOptions( diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasListComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasListComponent.java index 4ec9d147c90..a73a2866b54 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasListComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasListComponent.java @@ -82,7 +82,7 @@ public SormasToSormasListComponent(CaseDataDto caze, boolean isEditAllowed) { initLayout( caze.getSormasToSormasOriginInfo(), () -> FacadeProvider.getSormasToSormasCaseFacade().getAllShares(caze.getUuid()), - e -> ControllerProvider.getSormasToSormasController().shareCaseFromDetailsPage(caze)); + e -> ControllerProvider.getSormasToSormasController().shareCaseFromDetailsPage(caze, this::reloadList)); } public SormasToSormasListComponent(ContactDto contact, boolean isEditAllowed) { @@ -93,7 +93,7 @@ public SormasToSormasListComponent(ContactDto contact, boolean isEditAllowed) { initLayout( contact.getSormasToSormasOriginInfo(), () -> FacadeProvider.getSormasToSormasContactFacade().getAllShares(contact.getUuid()), - e -> ControllerProvider.getSormasToSormasController().shareContactFromDetailsPage(contact)); + e -> ControllerProvider.getSormasToSormasController().shareContactFromDetailsPage(contact, this::reloadList)); } public SormasToSormasListComponent(SampleDto sample) { @@ -117,7 +117,7 @@ public SormasToSormasListComponent(EventDto event) { initLayout( event.getSormasToSormasOriginInfo(), () -> FacadeProvider.getSormasToSormasEventFacade().getAllShares(event.getUuid()), - e -> ControllerProvider.getSormasToSormasController().shareEventFromDetailsPage(event)); + e -> ControllerProvider.getSormasToSormasController().shareEventFromDetailsPage(event, this::reloadList)); } public SormasToSormasListComponent(EventParticipantDto eventParticipant) { From 2b4a6774758f0dab3c72e798e0a95c85fb093c98 Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Mon, 5 Dec 2022 11:50:42 +0100 Subject: [PATCH 016/147] fixes --- .../src/test/resources/features/sanity/web/Case.feature | 2 +- .../src/test/resources/features/sanity/web/Sample.feature | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index fb88c65710b..fe809784302 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1302,7 +1302,7 @@ Feature: Case end to end tests Then I navigate to the last created case via the url Then I click on New Sample Then I create a new Sample with positive test result with Guinea Worm as disease - And I save the created sample + And I confirm popup window Then I navigate to the last created case via the url Then I click on edit Sample Then I click on new test result for pathogen tests diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature index 0bce3199678..445041a20a2 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature @@ -184,7 +184,6 @@ Feature: Sample Functionalities Then I click on New Sample Then I collect the sample UUID displayed on create new sample page Then I create a new Sample with positive test result with COVID-19 as disease - And I save the created sample Then I confirm the Create case from contact with positive test result Then I create a new case with specific data for positive pathogen test result Then I save the new case From 1a6d0622a8b464feee9a6a59586d75c743753725 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 5 Dec 2022 12:20:50 +0100 Subject: [PATCH 017/147] SORQA-705 --- .../application/samples/CreateNewSampleSteps.java | 13 +++++++++---- .../resources/features/sanity/web/Sample.feature | 6 +++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/CreateNewSampleSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/CreateNewSampleSteps.java index d31795a834c..889fec6c359 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/CreateNewSampleSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/samples/CreateNewSampleSteps.java @@ -808,14 +808,19 @@ public CreateNewSampleSteps( webDriverHelpers.waitUntilIdentifiedElementIsPresent(GENERIC_ERROR_POPUP); List popupExpected = List.of( - "Probentyp", - "Probenentnahme-Datum", + "Bitte überprüfen Sie die Eingabedaten", "Labor", - "Ergebnis verifiziert von Laborleitung", - "Art des Tests"); + "Art des Tests", + "Ergebnis verifiziert von Laborleitung"); webDriverHelpers.checkIsPopupContainsList(GENERIC_ERROR_POPUP, popupExpected); }); + When( + "I check if error popup contains {string}", + (String str) -> { + webDriverHelpers.checkWebElementContainsText(GENERIC_ERROR_POPUP, str); + }); + When( "I confirm update case result", () -> webDriverHelpers.clickOnWebElementBySelector(ACTION_CONFIRM_POPUP_BUTTON)); diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature index 0bce3199678..df1c602d813 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature @@ -282,7 +282,11 @@ Feature: Sample Functionalities And I click Add Pathogen test in Sample creation page And I check DATE AND TIME OF RESULT field And I click on save sample button - Then I check error popup message in German + Then I check if error popup contains "Bitte überprüfen Sie die Eingabedaten" + And I check if error popup contains "Labor" + And I check if error popup contains "Art des Tests" + And I check if error popup contains "Ergebnis verifiziert von Laborleitung" + @tmsLink=SORDEV-6849 @env_main Scenario: Test Lab officers should have full access to entities whose sample was assigned to the lab officers lab From 5a4a82203d007bf56602bc5f8e413c3d3cba3d8b Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Mon, 5 Dec 2022 12:57:06 +0100 Subject: [PATCH 018/147] fixes --- .../src/test/resources/features/sanity/web/Event.feature | 1 - 1 file changed, 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature index e4d5c826123..d779069a715 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature @@ -880,7 +880,6 @@ Feature: Create events Then I click on New Sample and discard changes is asked Then I collect the sample UUID displayed on create new sample page Then I create a new Sample with positive test result with COVID-19 as disease - And I save the created sample Then I confirm popup window Then I pick an existing case in pick or create a case popup Then I click on edit Sample From f36cbb5b98801e17793a1699a378ba6d5093f926 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 5 Dec 2022 13:24:15 +0100 Subject: [PATCH 019/147] SORQA-705 --- .../application/users/UserManagementSteps.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java index ec341fbedb4..87ac92ef823 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java @@ -98,13 +98,16 @@ public UserManagementSteps( }); When( "^I check if sync message is correct in German$", - () -> - assertHelpers.assertWithPoll( - () -> - Assert.assertTrue( - webDriverHelpers.isElementVisibleWithTimeout(SYNC_SUCCESS_DE, 5), - "Sync of users failed"), - 10)); + () -> { + TimeUnit.SECONDS.sleep(5); + + assertHelpers.assertWithPoll( + () -> + Assert.assertTrue( + webDriverHelpers.isElementVisibleWithTimeout(SYNC_SUCCESS_DE, 15), + "Sync of users failed"), + 10); + }); When( "^I verify that the Active value is ([^\"]*) in the User Management Page", From b949932d386e40101eca22468bc0e1074322d8be Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 5 Dec 2022 13:57:21 +0100 Subject: [PATCH 020/147] SORQA-702 --- .../steps/web/application/users/UserManagementSteps.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java index ec341fbedb4..9e1f2b69a2a 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java @@ -154,6 +154,7 @@ public UserManagementSteps( Then( "I Verify The User Role filter in the User Management Page", () -> { + TimeUnit.SECONDS.sleep(5); webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable( USERS_COUNTER_USER_MANAGEMENT); Integer numberOfTotalUsers = From 454cb798fcbad15a24071581c5a320aedbbd9946 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 5 Dec 2022 14:29:04 +0100 Subject: [PATCH 021/147] SORQA-702 --- .../steps/web/application/users/UserManagementSteps.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java index 9e1f2b69a2a..ae8fdb5607a 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java @@ -161,8 +161,8 @@ public UserManagementSteps( Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(USER_ROLES_COMBOBOX, "National User"); - webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); - webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); +// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); +// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfSpecificUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); From 964966265c167f41f49e4c8aff6b0658cf47c22c Mon Sep 17 00:00:00 2001 From: Frank Hautpmann Date: Mon, 5 Dec 2022 14:30:40 +0100 Subject: [PATCH 022/147] New Crowdin updates (#11084) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Ukrainian) * New translations strings.properties (Romanian) * New translations strings.properties (Italian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Japanese) * New translations strings.properties (Turkish) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (English, Ghana) * New translations strings.properties (German, Switzerland) * New translations enum.properties (German, Switzerland) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Spanish, Ecuador) * New translations enum.properties (Croatian) * New translations enum.properties (Hindi) * New translations enum.properties (Filipino) * New translations enum.properties (Fijian) * New translations enum.properties (Swahili) * New translations enum.properties (Nepali) * New translations enum.properties (Ukrainian) * New translations enum.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations enum.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations enum.properties (Chinese Simplified) * New translations enum.properties (Turkish) * New translations enum.properties (French) * New translations enum.properties (German) * New translations captions.properties (Czech) * New translations captions.properties (German, Switzerland) * New translations strings.properties (Czech) * New translations enum.properties (Romanian) * New translations enum.properties (Spanish) * New translations enum.properties (Arabic) * New translations enum.properties (Czech) * New translations enum.properties (Finnish) * New translations enum.properties (Swedish) * New translations enum.properties (Italian) * New translations enum.properties (Japanese) * New translations enum.properties (Dutch) * New translations enum.properties (Norwegian) * New translations enum.properties (Polish) * New translations enum.properties (Portuguese) * New translations enum.properties (Russian) * New translations enum.properties (English, Ghana) * New translations strings.properties (German, Switzerland) * New translations strings.properties (Nepali) * New translations strings.properties (Spanish, Ecuador) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Ukrainian) * New translations strings.properties (Romanian) * New translations strings.properties (Italian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Japanese) * New translations strings.properties (Turkish) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (English, Ghana) * New translations enum.properties (French) * New translations enum.properties (French) * New translations enum.properties (Arabic) * New translations enum.properties (Romanian) * New translations enum.properties (Spanish) * New translations captions.properties (Romanian) * New translations captions.properties (Spanish) * New translations captions.properties (French) * New translations captions.properties (Arabic) * New translations captions.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations strings.properties (German) * New translations enum.properties (Portuguese) * New translations enum.properties (Polish) * New translations captions.properties (French, Switzerland) * New translations enum.properties (German) * New translations enum.properties (Finnish) * New translations enum.properties (Italian) * New translations enum.properties (Japanese) * New translations enum.properties (Dutch) * New translations enum.properties (Norwegian) * New translations enum.properties (Czech) * New translations captions.properties (Swahili) * New translations captions.properties (Nepali) * New translations captions.properties (Russian) * New translations captions.properties (Czech) * New translations captions.properties (German) * New translations captions.properties (Finnish) * New translations captions.properties (Italian) * New translations captions.properties (Japanese) * New translations captions.properties (Dutch) * New translations captions.properties (Norwegian) * New translations captions.properties (Polish) * New translations captions.properties (Portuguese) * New translations captions.properties (Swedish) * New translations captions.properties (German, Switzerland) * New translations captions.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Spanish, Ecuador) * New translations captions.properties (Croatian) * New translations captions.properties (Hindi) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations enum.properties (Russian) * New translations descriptions.properties (Spanish) * New translations descriptions.properties (Arabic) * New translations validations.properties (French) * New translations descriptions.properties (French) * New translations validations.properties (Romanian) * New translations descriptions.properties (Romanian) * New translations validations.properties (Spanish) * New translations descriptions.properties (Polish) * New translations validations.properties (German) * New translations descriptions.properties (Czech) * New translations validations.properties (Russian) * New translations descriptions.properties (Russian) * New translations validations.properties (Portuguese) * New translations descriptions.properties (Portuguese) * New translations validations.properties (Czech) * New translations descriptions.properties (German) * New translations descriptions.properties (Finnish) * New translations validations.properties (Norwegian) * New translations validations.properties (Finnish) * New translations descriptions.properties (Italian) * New translations validations.properties (Italian) * New translations validations.properties (Polish) * New translations validations.properties (Japanese) * New translations descriptions.properties (Dutch) * New translations validations.properties (Dutch) * New translations descriptions.properties (Norwegian) * New translations descriptions.properties (Japanese) * New translations enum.properties (Swedish) * New translations validations.properties (Arabic) * New translations enum.properties (Swahili) * New translations enum.properties (Ukrainian) * New translations enum.properties (Chinese Simplified) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Spanish, Ecuador) * New translations enum.properties (Croatian) * New translations enum.properties (Hindi) * New translations enum.properties (Filipino) * New translations enum.properties (Fijian) * New translations enum.properties (German, Switzerland) * New translations enum.properties (Turkish) * New translations enum.properties (Nepali) * New translations enum.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations enum.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations enum.properties (English, Ghana) * New translations descriptions.properties (Swedish) * New translations validations.properties (Swedish) * New translations validations.properties (Dari) * New translations descriptions.properties (Nepali) * New translations validations.properties (Nepali) * New translations descriptions.properties (French, Switzerland) * New translations validations.properties (French, Switzerland) * New translations descriptions.properties (Italian, Switzerland) * New translations validations.properties (Italian, Switzerland) * New translations descriptions.properties (Dari) * New translations descriptions.properties (Pashto) * New translations descriptions.properties (German, Switzerland) * New translations validations.properties (Pashto) * New translations descriptions.properties (Spanish, Cuba) * New translations validations.properties (Spanish, Cuba) * New translations descriptions.properties (English, Afghanistan) * New translations validations.properties (English, Afghanistan) * New translations descriptions.properties (English, Nigeria) * New translations validations.properties (English, Nigeria) * New translations descriptions.properties (English, Ghana) * New translations validations.properties (German, Switzerland) * New translations validations.properties (Swahili) * New translations descriptions.properties (Turkish) * New translations descriptions.properties (Spanish, Ecuador) * New translations validations.properties (Turkish) * New translations descriptions.properties (Ukrainian) * New translations validations.properties (Ukrainian) * New translations descriptions.properties (Chinese Simplified) * New translations validations.properties (Chinese Simplified) * New translations descriptions.properties (Urdu (Pakistan)) * New translations validations.properties (Urdu (Pakistan)) * New translations validations.properties (Spanish, Ecuador) * New translations descriptions.properties (Swahili) * New translations descriptions.properties (Croatian) * New translations validations.properties (Croatian) * New translations descriptions.properties (Hindi) * New translations validations.properties (Hindi) * New translations descriptions.properties (Filipino) * New translations validations.properties (Filipino) * New translations descriptions.properties (Fijian) * New translations validations.properties (Fijian) * New translations validations.properties (English, Ghana) Co-authored-by: Maté Strysewske --- sormas-api/src/main/resources/captions_ar-SA.properties | 2 ++ sormas-api/src/main/resources/captions_cs-CZ.properties | 2 ++ sormas-api/src/main/resources/captions_de-CH.properties | 2 ++ sormas-api/src/main/resources/captions_de-DE.properties | 2 ++ sormas-api/src/main/resources/captions_en-AF.properties | 2 ++ sormas-api/src/main/resources/captions_en-GH.properties | 2 ++ sormas-api/src/main/resources/captions_en-NG.properties | 2 ++ sormas-api/src/main/resources/captions_es-CU.properties | 2 ++ sormas-api/src/main/resources/captions_es-EC.properties | 2 ++ sormas-api/src/main/resources/captions_es-ES.properties | 2 ++ sormas-api/src/main/resources/captions_fa-AF.properties | 2 ++ sormas-api/src/main/resources/captions_fi-FI.properties | 2 ++ sormas-api/src/main/resources/captions_fil-PH.properties | 2 ++ sormas-api/src/main/resources/captions_fj-FJ.properties | 2 ++ sormas-api/src/main/resources/captions_fr-CH.properties | 2 ++ sormas-api/src/main/resources/captions_fr-FR.properties | 2 ++ sormas-api/src/main/resources/captions_hi-IN.properties | 2 ++ sormas-api/src/main/resources/captions_hr-HR.properties | 2 ++ sormas-api/src/main/resources/captions_it-CH.properties | 2 ++ sormas-api/src/main/resources/captions_it-IT.properties | 2 ++ sormas-api/src/main/resources/captions_ja-JP.properties | 2 ++ sormas-api/src/main/resources/captions_ne-NP.properties | 2 ++ sormas-api/src/main/resources/captions_nl-NL.properties | 2 ++ sormas-api/src/main/resources/captions_no-NO.properties | 2 ++ sormas-api/src/main/resources/captions_pl-PL.properties | 2 ++ sormas-api/src/main/resources/captions_ps-AF.properties | 2 ++ sormas-api/src/main/resources/captions_pt-PT.properties | 2 ++ sormas-api/src/main/resources/captions_ro-RO.properties | 2 ++ sormas-api/src/main/resources/captions_ru-RU.properties | 2 ++ sormas-api/src/main/resources/captions_sv-SE.properties | 2 ++ sormas-api/src/main/resources/captions_sw-KE.properties | 2 ++ sormas-api/src/main/resources/captions_tr-TR.properties | 2 ++ sormas-api/src/main/resources/captions_uk-UA.properties | 2 ++ sormas-api/src/main/resources/captions_ur-PK.properties | 2 ++ sormas-api/src/main/resources/captions_zh-CN.properties | 2 ++ sormas-api/src/main/resources/descriptions_ar-SA.properties | 3 +++ sormas-api/src/main/resources/descriptions_cs-CZ.properties | 3 +++ sormas-api/src/main/resources/descriptions_de-CH.properties | 3 +++ sormas-api/src/main/resources/descriptions_de-DE.properties | 3 +++ sormas-api/src/main/resources/descriptions_en-AF.properties | 3 +++ sormas-api/src/main/resources/descriptions_en-GH.properties | 3 +++ sormas-api/src/main/resources/descriptions_en-NG.properties | 3 +++ sormas-api/src/main/resources/descriptions_es-CU.properties | 3 +++ sormas-api/src/main/resources/descriptions_es-EC.properties | 3 +++ sormas-api/src/main/resources/descriptions_es-ES.properties | 3 +++ sormas-api/src/main/resources/descriptions_fa-AF.properties | 3 +++ sormas-api/src/main/resources/descriptions_fi-FI.properties | 3 +++ sormas-api/src/main/resources/descriptions_fil-PH.properties | 3 +++ sormas-api/src/main/resources/descriptions_fj-FJ.properties | 3 +++ sormas-api/src/main/resources/descriptions_fr-CH.properties | 3 +++ sormas-api/src/main/resources/descriptions_fr-FR.properties | 3 +++ sormas-api/src/main/resources/descriptions_hi-IN.properties | 3 +++ sormas-api/src/main/resources/descriptions_hr-HR.properties | 3 +++ sormas-api/src/main/resources/descriptions_it-CH.properties | 3 +++ sormas-api/src/main/resources/descriptions_it-IT.properties | 3 +++ sormas-api/src/main/resources/descriptions_ja-JP.properties | 3 +++ sormas-api/src/main/resources/descriptions_ne-NP.properties | 3 +++ sormas-api/src/main/resources/descriptions_nl-NL.properties | 3 +++ sormas-api/src/main/resources/descriptions_no-NO.properties | 3 +++ sormas-api/src/main/resources/descriptions_pl-PL.properties | 3 +++ sormas-api/src/main/resources/descriptions_ps-AF.properties | 3 +++ sormas-api/src/main/resources/descriptions_pt-PT.properties | 3 +++ sormas-api/src/main/resources/descriptions_ro-RO.properties | 3 +++ sormas-api/src/main/resources/descriptions_ru-RU.properties | 3 +++ sormas-api/src/main/resources/descriptions_sv-SE.properties | 3 +++ sormas-api/src/main/resources/descriptions_sw-KE.properties | 3 +++ sormas-api/src/main/resources/descriptions_tr-TR.properties | 3 +++ sormas-api/src/main/resources/descriptions_uk-UA.properties | 3 +++ sormas-api/src/main/resources/descriptions_ur-PK.properties | 3 +++ sormas-api/src/main/resources/descriptions_zh-CN.properties | 3 +++ sormas-api/src/main/resources/enum_ar-SA.properties | 2 ++ sormas-api/src/main/resources/enum_cs-CZ.properties | 2 ++ sormas-api/src/main/resources/enum_de-CH.properties | 2 ++ sormas-api/src/main/resources/enum_de-DE.properties | 2 ++ sormas-api/src/main/resources/enum_en-AF.properties | 2 ++ sormas-api/src/main/resources/enum_en-GH.properties | 2 ++ sormas-api/src/main/resources/enum_en-NG.properties | 2 ++ sormas-api/src/main/resources/enum_es-CU.properties | 2 ++ sormas-api/src/main/resources/enum_es-EC.properties | 2 ++ sormas-api/src/main/resources/enum_es-ES.properties | 2 ++ sormas-api/src/main/resources/enum_fa-AF.properties | 2 ++ sormas-api/src/main/resources/enum_fi-FI.properties | 2 ++ sormas-api/src/main/resources/enum_fil-PH.properties | 2 ++ sormas-api/src/main/resources/enum_fj-FJ.properties | 2 ++ sormas-api/src/main/resources/enum_fr-CH.properties | 2 ++ sormas-api/src/main/resources/enum_fr-FR.properties | 2 ++ sormas-api/src/main/resources/enum_hi-IN.properties | 2 ++ sormas-api/src/main/resources/enum_hr-HR.properties | 2 ++ sormas-api/src/main/resources/enum_it-CH.properties | 2 ++ sormas-api/src/main/resources/enum_it-IT.properties | 2 ++ sormas-api/src/main/resources/enum_ja-JP.properties | 2 ++ sormas-api/src/main/resources/enum_ne-NP.properties | 2 ++ sormas-api/src/main/resources/enum_nl-NL.properties | 2 ++ sormas-api/src/main/resources/enum_no-NO.properties | 2 ++ sormas-api/src/main/resources/enum_pl-PL.properties | 2 ++ sormas-api/src/main/resources/enum_ps-AF.properties | 2 ++ sormas-api/src/main/resources/enum_pt-PT.properties | 2 ++ sormas-api/src/main/resources/enum_ro-RO.properties | 2 ++ sormas-api/src/main/resources/enum_ru-RU.properties | 2 ++ sormas-api/src/main/resources/enum_sv-SE.properties | 2 ++ sormas-api/src/main/resources/enum_sw-KE.properties | 2 ++ sormas-api/src/main/resources/enum_tr-TR.properties | 2 ++ sormas-api/src/main/resources/enum_uk-UA.properties | 2 ++ sormas-api/src/main/resources/enum_ur-PK.properties | 2 ++ sormas-api/src/main/resources/enum_zh-CN.properties | 2 ++ sormas-api/src/main/resources/strings_de-DE.properties | 4 ++-- sormas-api/src/main/resources/validations_ar-SA.properties | 1 + sormas-api/src/main/resources/validations_cs-CZ.properties | 1 + sormas-api/src/main/resources/validations_de-CH.properties | 1 + sormas-api/src/main/resources/validations_de-DE.properties | 1 + sormas-api/src/main/resources/validations_en-AF.properties | 1 + sormas-api/src/main/resources/validations_en-GH.properties | 1 + sormas-api/src/main/resources/validations_en-NG.properties | 1 + sormas-api/src/main/resources/validations_es-CU.properties | 1 + sormas-api/src/main/resources/validations_es-EC.properties | 1 + sormas-api/src/main/resources/validations_es-ES.properties | 1 + sormas-api/src/main/resources/validations_fa-AF.properties | 1 + sormas-api/src/main/resources/validations_fi-FI.properties | 1 + sormas-api/src/main/resources/validations_fil-PH.properties | 1 + sormas-api/src/main/resources/validations_fj-FJ.properties | 1 + sormas-api/src/main/resources/validations_fr-CH.properties | 1 + sormas-api/src/main/resources/validations_fr-FR.properties | 1 + sormas-api/src/main/resources/validations_hi-IN.properties | 1 + sormas-api/src/main/resources/validations_hr-HR.properties | 1 + sormas-api/src/main/resources/validations_it-CH.properties | 1 + sormas-api/src/main/resources/validations_it-IT.properties | 1 + sormas-api/src/main/resources/validations_ja-JP.properties | 1 + sormas-api/src/main/resources/validations_ne-NP.properties | 1 + sormas-api/src/main/resources/validations_nl-NL.properties | 1 + sormas-api/src/main/resources/validations_no-NO.properties | 1 + sormas-api/src/main/resources/validations_pl-PL.properties | 1 + sormas-api/src/main/resources/validations_ps-AF.properties | 1 + sormas-api/src/main/resources/validations_pt-PT.properties | 1 + sormas-api/src/main/resources/validations_ro-RO.properties | 1 + sormas-api/src/main/resources/validations_ru-RU.properties | 1 + sormas-api/src/main/resources/validations_sv-SE.properties | 1 + sormas-api/src/main/resources/validations_sw-KE.properties | 1 + sormas-api/src/main/resources/validations_tr-TR.properties | 1 + sormas-api/src/main/resources/validations_uk-UA.properties | 1 + sormas-api/src/main/resources/validations_ur-PK.properties | 1 + sormas-api/src/main/resources/validations_zh-CN.properties | 1 + 141 files changed, 282 insertions(+), 2 deletions(-) diff --git a/sormas-api/src/main/resources/captions_ar-SA.properties b/sormas-api/src/main/resources/captions_ar-SA.properties index 98e19e53646..ea3d3c445ac 100644 --- a/sormas-api/src/main/resources/captions_ar-SA.properties +++ b/sormas-api/src/main/resources/captions_ar-SA.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_cs-CZ.properties b/sormas-api/src/main/resources/captions_cs-CZ.properties index fb5840ed6bd..575ef28617a 100644 --- a/sormas-api/src/main/resources/captions_cs-CZ.properties +++ b/sormas-api/src/main/resources/captions_cs-CZ.properties @@ -69,6 +69,7 @@ requiredUserRights=Potřebná uživatelská práva adoptHomeAddressOfCasePerson=Přijmout bydliště osoby případu adoptHomeAddressOfCasePersonIfRelationMatches=Přijmout bydliště osoby v případě, že bydlí ve stejné domácnosti casePersonAddress=Adresa osoby případu +viewMessage=Zobrazit zprávu # About about=O aplikaci aboutAdditionalInfo=Dodatečné informace @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=ID zprávy ExternalMessage.sampleOverallTestResult=Celkový výsledek testu ExternalMessage.assignee=Přiřazený ExternalMessage.type=Typ +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Načíst zprávy externalMessageProcess=Zpracování externalMessageNoDisease=Nebyla nalezena žádná nemoc diff --git a/sormas-api/src/main/resources/captions_de-CH.properties b/sormas-api/src/main/resources/captions_de-CH.properties index 2a46c7a3674..6c669be7b2c 100644 --- a/sormas-api/src/main/resources/captions_de-CH.properties +++ b/sormas-api/src/main/resources/captions_de-CH.properties @@ -69,6 +69,7 @@ requiredUserRights=Benötigte Benutzerrechte adoptHomeAddressOfCasePerson=Heimatadresse der Fall-Person übernehmen adoptHomeAddressOfCasePersonIfRelationMatches=Heimatadresse der Fall-Person übernehmen, wenn sie im selben Haushalt wohnt casePersonAddress=Adresse der Fall-Person +viewMessage=View message # About about=Info aboutAdditionalInfo=Zusätzliche Information @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Meldungs-ID ExternalMessage.sampleOverallTestResult=Gesamttestresultat ExternalMessage.assignee=Zugewiesen an ExternalMessage.type=Typ +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Meldungen abrufen externalMessageProcess=Verarbeiten externalMessageNoDisease=Keine Krankheit gefunden diff --git a/sormas-api/src/main/resources/captions_de-DE.properties b/sormas-api/src/main/resources/captions_de-DE.properties index 1d4841c5a4b..18124e4f32b 100644 --- a/sormas-api/src/main/resources/captions_de-DE.properties +++ b/sormas-api/src/main/resources/captions_de-DE.properties @@ -69,6 +69,7 @@ requiredUserRights=Benötigte Benutzerrechte adoptHomeAddressOfCasePerson=Heimatadresse der Fall-Person übernehmen adoptHomeAddressOfCasePersonIfRelationMatches=Heimatadresse der Fall-Person übernehmen, wenn sie im selben Haushalt wohnt casePersonAddress=Adresse der Fall-Person +viewMessage=Nachricht anzeigen # About about=Info aboutAdditionalInfo=Zusätzliche Information @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Meldungs-ID ExternalMessage.sampleOverallTestResult=Gesamttestresultat ExternalMessage.assignee=Zugewiesen an ExternalMessage.type=Typ +ExternalMessage.surveillanceReport=Verknüpfter Bericht externalMessageFetch=Meldungen abrufen externalMessageProcess=Verarbeiten externalMessageNoDisease=Keine Krankheit gefunden diff --git a/sormas-api/src/main/resources/captions_en-AF.properties b/sormas-api/src/main/resources/captions_en-AF.properties index 145eb92bd8e..35b653ca341 100644 --- a/sormas-api/src/main/resources/captions_en-AF.properties +++ b/sormas-api/src/main/resources/captions_en-AF.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_en-GH.properties b/sormas-api/src/main/resources/captions_en-GH.properties index 5c9a1a68096..1f3805b75f7 100644 --- a/sormas-api/src/main/resources/captions_en-GH.properties +++ b/sormas-api/src/main/resources/captions_en-GH.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_en-NG.properties b/sormas-api/src/main/resources/captions_en-NG.properties index 0ad29fc52a7..33af099f426 100644 --- a/sormas-api/src/main/resources/captions_en-NG.properties +++ b/sormas-api/src/main/resources/captions_en-NG.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_es-CU.properties b/sormas-api/src/main/resources/captions_es-CU.properties index 2e8b3081b3b..7fe8b99fff3 100644 --- a/sormas-api/src/main/resources/captions_es-CU.properties +++ b/sormas-api/src/main/resources/captions_es-CU.properties @@ -69,6 +69,7 @@ requiredUserRights=Derechos de usuario necesarios adoptHomeAddressOfCasePerson=Adoptar la dirección particular de la persona del caso adoptHomeAddressOfCasePersonIfRelationMatches=Adoptar la dirección particular de la persona del caso si vive en la misma casa casePersonAddress=Dirección de la persona del caso +viewMessage=Ver mensaje # About about=Acerca de aboutAdditionalInfo=Información adicional @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=ID de informe ExternalMessage.sampleOverallTestResult=Resultado global de la prueba ExternalMessage.assignee=Responsable ExternalMessage.type=Tipo +ExternalMessage.surveillanceReport=Informe vinculado externalMessageFetch=Obtener mensajes externalMessageProcess=Proceso externalMessageNoDisease=No se encontró enfermedad diff --git a/sormas-api/src/main/resources/captions_es-EC.properties b/sormas-api/src/main/resources/captions_es-EC.properties index 22238fd78fd..297d3cf81a3 100644 --- a/sormas-api/src/main/resources/captions_es-EC.properties +++ b/sormas-api/src/main/resources/captions_es-EC.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_es-ES.properties b/sormas-api/src/main/resources/captions_es-ES.properties index b9ddad840d1..722099a0a85 100644 --- a/sormas-api/src/main/resources/captions_es-ES.properties +++ b/sormas-api/src/main/resources/captions_es-ES.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_fa-AF.properties b/sormas-api/src/main/resources/captions_fa-AF.properties index a46b6ab1e99..3bfd185a78f 100644 --- a/sormas-api/src/main/resources/captions_fa-AF.properties +++ b/sormas-api/src/main/resources/captions_fa-AF.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=در باره aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_fi-FI.properties b/sormas-api/src/main/resources/captions_fi-FI.properties index c01e081c83c..e032c9b642d 100644 --- a/sormas-api/src/main/resources/captions_fi-FI.properties +++ b/sormas-api/src/main/resources/captions_fi-FI.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_fil-PH.properties b/sormas-api/src/main/resources/captions_fil-PH.properties index b9ddad840d1..722099a0a85 100644 --- a/sormas-api/src/main/resources/captions_fil-PH.properties +++ b/sormas-api/src/main/resources/captions_fil-PH.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_fj-FJ.properties b/sormas-api/src/main/resources/captions_fj-FJ.properties index b9ddad840d1..722099a0a85 100644 --- a/sormas-api/src/main/resources/captions_fj-FJ.properties +++ b/sormas-api/src/main/resources/captions_fj-FJ.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_fr-CH.properties b/sormas-api/src/main/resources/captions_fr-CH.properties index 5a218ed968d..2b74ac9068d 100644 --- a/sormas-api/src/main/resources/captions_fr-CH.properties +++ b/sormas-api/src/main/resources/captions_fr-CH.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=À propos aboutAdditionalInfo=Information additionnelle @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_fr-FR.properties b/sormas-api/src/main/resources/captions_fr-FR.properties index 4fd679abb31..06caa237662 100644 --- a/sormas-api/src/main/resources/captions_fr-FR.properties +++ b/sormas-api/src/main/resources/captions_fr-FR.properties @@ -69,6 +69,7 @@ requiredUserRights=Droits de l'utilisateur requis adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=À propos de aboutAdditionalInfo=Information additionnelle @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_hi-IN.properties b/sormas-api/src/main/resources/captions_hi-IN.properties index b9ddad840d1..722099a0a85 100644 --- a/sormas-api/src/main/resources/captions_hi-IN.properties +++ b/sormas-api/src/main/resources/captions_hi-IN.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_hr-HR.properties b/sormas-api/src/main/resources/captions_hr-HR.properties index b9ddad840d1..722099a0a85 100644 --- a/sormas-api/src/main/resources/captions_hr-HR.properties +++ b/sormas-api/src/main/resources/captions_hr-HR.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_it-CH.properties b/sormas-api/src/main/resources/captions_it-CH.properties index d220cfefe8a..b999ad99e2e 100644 --- a/sormas-api/src/main/resources/captions_it-CH.properties +++ b/sormas-api/src/main/resources/captions_it-CH.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_it-IT.properties b/sormas-api/src/main/resources/captions_it-IT.properties index a3138ddf310..fdec9e7632f 100644 --- a/sormas-api/src/main/resources/captions_it-IT.properties +++ b/sormas-api/src/main/resources/captions_it-IT.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_ja-JP.properties b/sormas-api/src/main/resources/captions_ja-JP.properties index b9ddad840d1..722099a0a85 100644 --- a/sormas-api/src/main/resources/captions_ja-JP.properties +++ b/sormas-api/src/main/resources/captions_ja-JP.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_ne-NP.properties b/sormas-api/src/main/resources/captions_ne-NP.properties index 98e19e53646..ea3d3c445ac 100644 --- a/sormas-api/src/main/resources/captions_ne-NP.properties +++ b/sormas-api/src/main/resources/captions_ne-NP.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_nl-NL.properties b/sormas-api/src/main/resources/captions_nl-NL.properties index 2b53d93833b..b62d611ea16 100644 --- a/sormas-api/src/main/resources/captions_nl-NL.properties +++ b/sormas-api/src/main/resources/captions_nl-NL.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_no-NO.properties b/sormas-api/src/main/resources/captions_no-NO.properties index b9ddad840d1..722099a0a85 100644 --- a/sormas-api/src/main/resources/captions_no-NO.properties +++ b/sormas-api/src/main/resources/captions_no-NO.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_pl-PL.properties b/sormas-api/src/main/resources/captions_pl-PL.properties index b9ddad840d1..722099a0a85 100644 --- a/sormas-api/src/main/resources/captions_pl-PL.properties +++ b/sormas-api/src/main/resources/captions_pl-PL.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_ps-AF.properties b/sormas-api/src/main/resources/captions_ps-AF.properties index 0c9146263a1..58cc8120631 100644 --- a/sormas-api/src/main/resources/captions_ps-AF.properties +++ b/sormas-api/src/main/resources/captions_ps-AF.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=په هکله aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_pt-PT.properties b/sormas-api/src/main/resources/captions_pt-PT.properties index f7bf2b835f9..59f7685d675 100644 --- a/sormas-api/src/main/resources/captions_pt-PT.properties +++ b/sormas-api/src/main/resources/captions_pt-PT.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_ro-RO.properties b/sormas-api/src/main/resources/captions_ro-RO.properties index b9ddad840d1..722099a0a85 100644 --- a/sormas-api/src/main/resources/captions_ro-RO.properties +++ b/sormas-api/src/main/resources/captions_ro-RO.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_ru-RU.properties b/sormas-api/src/main/resources/captions_ru-RU.properties index 0513511ec25..eb9282e82c8 100644 --- a/sormas-api/src/main/resources/captions_ru-RU.properties +++ b/sormas-api/src/main/resources/captions_ru-RU.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=О программе aboutAdditionalInfo=Дополнительная информация @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_sv-SE.properties b/sormas-api/src/main/resources/captions_sv-SE.properties index b9ddad840d1..722099a0a85 100644 --- a/sormas-api/src/main/resources/captions_sv-SE.properties +++ b/sormas-api/src/main/resources/captions_sv-SE.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_sw-KE.properties b/sormas-api/src/main/resources/captions_sw-KE.properties index b9ddad840d1..722099a0a85 100644 --- a/sormas-api/src/main/resources/captions_sw-KE.properties +++ b/sormas-api/src/main/resources/captions_sw-KE.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_tr-TR.properties b/sormas-api/src/main/resources/captions_tr-TR.properties index b9ddad840d1..722099a0a85 100644 --- a/sormas-api/src/main/resources/captions_tr-TR.properties +++ b/sormas-api/src/main/resources/captions_tr-TR.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_uk-UA.properties b/sormas-api/src/main/resources/captions_uk-UA.properties index b9ddad840d1..722099a0a85 100644 --- a/sormas-api/src/main/resources/captions_uk-UA.properties +++ b/sormas-api/src/main/resources/captions_uk-UA.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=About aboutAdditionalInfo=Additional Info @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/captions_ur-PK.properties b/sormas-api/src/main/resources/captions_ur-PK.properties index a79bc9085fb..c039ceaf285 100644 --- a/sormas-api/src/main/resources/captions_ur-PK.properties +++ b/sormas-api/src/main/resources/captions_ur-PK.properties @@ -69,6 +69,7 @@ requiredUserRights=صارف کے حقوق کی ضرورت adoptHomeAddressOfCasePerson=کیس والے کے گھر کا پتہ اپنائیں adoptHomeAddressOfCasePersonIfRelationMatches=اگر وہ ایک ہی گھر میں رہتے ہیں تو کیس والے کے گھر کا پتہ اپنا لیں casePersonAddress=کیس والے کا پتہ +viewMessage=View message # About about=متعلق aboutAdditionalInfo=اضافی معلومات @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=رپورٹ کی شناخت ExternalMessage.sampleOverallTestResult=مجموعی طور پر ٹیسٹ کا نتیجہ ExternalMessage.assignee=مقرر کردہ ExternalMessage.type=قسم +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=پیغامات حاصل کریں externalMessageProcess=پروسیس externalMessageNoDisease=کوئی بیماری نہیں ملی diff --git a/sormas-api/src/main/resources/captions_zh-CN.properties b/sormas-api/src/main/resources/captions_zh-CN.properties index 0d292ca67de..bb6f2617b37 100644 --- a/sormas-api/src/main/resources/captions_zh-CN.properties +++ b/sormas-api/src/main/resources/captions_zh-CN.properties @@ -69,6 +69,7 @@ requiredUserRights=Needed user rights adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person +viewMessage=View message # About about=关于 aboutAdditionalInfo=附加信息 @@ -1472,6 +1473,7 @@ ExternalMessage.reportId=Report ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type +ExternalMessage.surveillanceReport=Linked Report externalMessageFetch=Fetch messages externalMessageProcess=Process externalMessageNoDisease=No disease found diff --git a/sormas-api/src/main/resources/descriptions_ar-SA.properties b/sormas-api/src/main/resources/descriptions_ar-SA.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_ar-SA.properties +++ b/sormas-api/src/main/resources/descriptions_ar-SA.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_cs-CZ.properties b/sormas-api/src/main/resources/descriptions_cs-CZ.properties index 6c15cb1541c..b81e4b1f587 100644 --- a/sormas-api/src/main/resources/descriptions_cs-CZ.properties +++ b/sormas-api/src/main/resources/descriptions_cs-CZ.properties @@ -175,6 +175,9 @@ Person.sex = Vyberte pohlaví osoby Sample.sampleDateTime = Kdy byl vzorek odebrán (uveďte datum)? Sample.associatedLabMessages = Zobrazit související zprávy laboratoře +# Surveillance Report +SurveillanceReport.associatedMessage = Zobrazit související externí zprávu + # Symptoms Symptoms.alteredConsciousness = Snížená úroveň vědomí, např. letargie, apatie, koma Symptoms.bloodInStool = Viditelná krev ve stolici diff --git a/sormas-api/src/main/resources/descriptions_de-CH.properties b/sormas-api/src/main/resources/descriptions_de-CH.properties index bb7fb862405..0a4f4c009e8 100644 --- a/sormas-api/src/main/resources/descriptions_de-CH.properties +++ b/sormas-api/src/main/resources/descriptions_de-CH.properties @@ -175,6 +175,9 @@ Person.sex = Wählen Sie das Geschlecht der Person Sample.sampleDateTime = Wann wurde die Probe entnommen (Datum eingeben)? Sample.associatedLabMessages = Zugehörige Labormeldungen anzeigen +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Veränderter Bewusstseinszustand, z.B. Lethargie, stuporös, Koma Symptoms.bloodInStool = Sichtbares Blut im Stuhl diff --git a/sormas-api/src/main/resources/descriptions_de-DE.properties b/sormas-api/src/main/resources/descriptions_de-DE.properties index bdfce1d1fa7..d5a97eb5b20 100644 --- a/sormas-api/src/main/resources/descriptions_de-DE.properties +++ b/sormas-api/src/main/resources/descriptions_de-DE.properties @@ -175,6 +175,9 @@ Person.sex = Wählen Sie das Geschlecht der Person Sample.sampleDateTime = Wann wurde die Probe entnommen (Datum eingeben)? Sample.associatedLabMessages = Zugehörige Labormeldungen anzeigen +# Surveillance Report +SurveillanceReport.associatedMessage = Zugehörige Labormeldungen anzeigen + # Symptoms Symptoms.alteredConsciousness = Veränderter Bewusstseinszustand, z.B. Lethargie, stuporös, Koma Symptoms.bloodInStool = Sichtbares Blut im Stuhl diff --git a/sormas-api/src/main/resources/descriptions_en-AF.properties b/sormas-api/src/main/resources/descriptions_en-AF.properties index 739a63e439b..4112fcf4236 100644 --- a/sormas-api/src/main/resources/descriptions_en-AF.properties +++ b/sormas-api/src/main/resources/descriptions_en-AF.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_en-GH.properties b/sormas-api/src/main/resources/descriptions_en-GH.properties index 380ef3196d7..447eec51c9a 100644 --- a/sormas-api/src/main/resources/descriptions_en-GH.properties +++ b/sormas-api/src/main/resources/descriptions_en-GH.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_en-NG.properties b/sormas-api/src/main/resources/descriptions_en-NG.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_en-NG.properties +++ b/sormas-api/src/main/resources/descriptions_en-NG.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_es-CU.properties b/sormas-api/src/main/resources/descriptions_es-CU.properties index f960072a51a..a2794f7228c 100644 --- a/sormas-api/src/main/resources/descriptions_es-CU.properties +++ b/sormas-api/src/main/resources/descriptions_es-CU.properties @@ -175,6 +175,9 @@ Person.sex = Seleccione el sexo de la persona Sample.sampleDateTime = ¿Cuándo se tomó la muestra (ingrese una fecha)? Sample.associatedLabMessages = Mostrar mensajes de laboratorio asociados +# Surveillance Report +SurveillanceReport.associatedMessage = Mostrar mensaje externo asociado + # Symptoms Symptoms.alteredConsciousness = Nivel de conciencia alterado, por ejemplo, letargo, estuporoso, coma Symptoms.bloodInStool = Sangre visible en las heces diff --git a/sormas-api/src/main/resources/descriptions_es-EC.properties b/sormas-api/src/main/resources/descriptions_es-EC.properties index bf799e736c3..08f1a519a5d 100644 --- a/sormas-api/src/main/resources/descriptions_es-EC.properties +++ b/sormas-api/src/main/resources/descriptions_es-EC.properties @@ -175,6 +175,9 @@ Person.sex = Selecciona el sexo de la persona Sample.sampleDateTime = ¿Cuándo se tomó la muestra (ingrese una fecha)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Nivel de conciencia alterado, Ej\: letargo, estuporoso, coma Symptoms.bloodInStool = Sangre visible en las heces diff --git a/sormas-api/src/main/resources/descriptions_es-ES.properties b/sormas-api/src/main/resources/descriptions_es-ES.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_es-ES.properties +++ b/sormas-api/src/main/resources/descriptions_es-ES.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_fa-AF.properties b/sormas-api/src/main/resources/descriptions_fa-AF.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_fa-AF.properties +++ b/sormas-api/src/main/resources/descriptions_fa-AF.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_fi-FI.properties b/sormas-api/src/main/resources/descriptions_fi-FI.properties index 94b044d4d6c..be0ad6ca7bc 100644 --- a/sormas-api/src/main/resources/descriptions_fi-FI.properties +++ b/sormas-api/src/main/resources/descriptions_fi-FI.properties @@ -175,6 +175,9 @@ Person.sex = Valitse henkilön sukupuoli Sample.sampleDateTime = Milloin näyte otettiin (syötä päiväys)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Tajunnan alentuma, esim. letargia, tokkura, kooma Symptoms.bloodInStool = Näkyvää verenvuotoa peräaukosta diff --git a/sormas-api/src/main/resources/descriptions_fil-PH.properties b/sormas-api/src/main/resources/descriptions_fil-PH.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_fil-PH.properties +++ b/sormas-api/src/main/resources/descriptions_fil-PH.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_fj-FJ.properties b/sormas-api/src/main/resources/descriptions_fj-FJ.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_fj-FJ.properties +++ b/sormas-api/src/main/resources/descriptions_fj-FJ.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_fr-CH.properties b/sormas-api/src/main/resources/descriptions_fr-CH.properties index 390b6d3e95b..1f89c9ce98a 100644 --- a/sormas-api/src/main/resources/descriptions_fr-CH.properties +++ b/sormas-api/src/main/resources/descriptions_fr-CH.properties @@ -175,6 +175,9 @@ Person.sex = Sélectionnez le sexe de la personne Sample.sampleDateTime = Quand l'échantillon a été pris (entrez une date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Niveau de conscience altéré, par exemple léthargie, stupide, coma Symptoms.bloodInStool = Sang visible dans les selles diff --git a/sormas-api/src/main/resources/descriptions_fr-FR.properties b/sormas-api/src/main/resources/descriptions_fr-FR.properties index ab34b34e141..621507179b2 100644 --- a/sormas-api/src/main/resources/descriptions_fr-FR.properties +++ b/sormas-api/src/main/resources/descriptions_fr-FR.properties @@ -175,6 +175,9 @@ Person.sex = Sélectionnez le sexe de la personne Sample.sampleDateTime = Quand l'échantillon a été pris (entrez une date)? Sample.associatedLabMessages = Afficher les messages de laboratoire associés +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Niveau de conscience altéré, par exemple léthargie, stupide, coma Symptoms.bloodInStool = Sang visible dans les selles diff --git a/sormas-api/src/main/resources/descriptions_hi-IN.properties b/sormas-api/src/main/resources/descriptions_hi-IN.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_hi-IN.properties +++ b/sormas-api/src/main/resources/descriptions_hi-IN.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_hr-HR.properties b/sormas-api/src/main/resources/descriptions_hr-HR.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_hr-HR.properties +++ b/sormas-api/src/main/resources/descriptions_hr-HR.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_it-CH.properties b/sormas-api/src/main/resources/descriptions_it-CH.properties index 7e1fe5a4480..31f872764d3 100644 --- a/sormas-api/src/main/resources/descriptions_it-CH.properties +++ b/sormas-api/src/main/resources/descriptions_it-CH.properties @@ -175,6 +175,9 @@ Person.sex = Selezionare il sesso della persona Sample.sampleDateTime = Quando è stato prelevato il campione (data)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Stato di coscienza alterato, p. es. letargia, stato stuporoso, coma Symptoms.bloodInStool = Sangue visibile nelle feci diff --git a/sormas-api/src/main/resources/descriptions_it-IT.properties b/sormas-api/src/main/resources/descriptions_it-IT.properties index ec2a06cb366..7343a8107f6 100644 --- a/sormas-api/src/main/resources/descriptions_it-IT.properties +++ b/sormas-api/src/main/resources/descriptions_it-IT.properties @@ -175,6 +175,9 @@ Person.sex = Selezionare il sesso della persona Sample.sampleDateTime = Quando è stato prelevato il campione (data)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Stato di coscienza alterato, p. es. letargia, stato stuporoso, coma Symptoms.bloodInStool = Sangue visibile nelle feci diff --git a/sormas-api/src/main/resources/descriptions_ja-JP.properties b/sormas-api/src/main/resources/descriptions_ja-JP.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_ja-JP.properties +++ b/sormas-api/src/main/resources/descriptions_ja-JP.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_ne-NP.properties b/sormas-api/src/main/resources/descriptions_ne-NP.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_ne-NP.properties +++ b/sormas-api/src/main/resources/descriptions_ne-NP.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_nl-NL.properties b/sormas-api/src/main/resources/descriptions_nl-NL.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_nl-NL.properties +++ b/sormas-api/src/main/resources/descriptions_nl-NL.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_no-NO.properties b/sormas-api/src/main/resources/descriptions_no-NO.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_no-NO.properties +++ b/sormas-api/src/main/resources/descriptions_no-NO.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_pl-PL.properties b/sormas-api/src/main/resources/descriptions_pl-PL.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_pl-PL.properties +++ b/sormas-api/src/main/resources/descriptions_pl-PL.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_ps-AF.properties b/sormas-api/src/main/resources/descriptions_ps-AF.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_ps-AF.properties +++ b/sormas-api/src/main/resources/descriptions_ps-AF.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_pt-PT.properties b/sormas-api/src/main/resources/descriptions_pt-PT.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_pt-PT.properties +++ b/sormas-api/src/main/resources/descriptions_pt-PT.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_ro-RO.properties b/sormas-api/src/main/resources/descriptions_ro-RO.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_ro-RO.properties +++ b/sormas-api/src/main/resources/descriptions_ro-RO.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_ru-RU.properties b/sormas-api/src/main/resources/descriptions_ru-RU.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_ru-RU.properties +++ b/sormas-api/src/main/resources/descriptions_ru-RU.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_sv-SE.properties b/sormas-api/src/main/resources/descriptions_sv-SE.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_sv-SE.properties +++ b/sormas-api/src/main/resources/descriptions_sv-SE.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_sw-KE.properties b/sormas-api/src/main/resources/descriptions_sw-KE.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_sw-KE.properties +++ b/sormas-api/src/main/resources/descriptions_sw-KE.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_tr-TR.properties b/sormas-api/src/main/resources/descriptions_tr-TR.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_tr-TR.properties +++ b/sormas-api/src/main/resources/descriptions_tr-TR.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_uk-UA.properties b/sormas-api/src/main/resources/descriptions_uk-UA.properties index 10646f644a3..b661f61450e 100644 --- a/sormas-api/src/main/resources/descriptions_uk-UA.properties +++ b/sormas-api/src/main/resources/descriptions_uk-UA.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/descriptions_ur-PK.properties b/sormas-api/src/main/resources/descriptions_ur-PK.properties index d87b832efac..d1e9879e8ef 100644 --- a/sormas-api/src/main/resources/descriptions_ur-PK.properties +++ b/sormas-api/src/main/resources/descriptions_ur-PK.properties @@ -175,6 +175,9 @@ Person.sex = شخص کی جنس کا انتخاب کریں Sample.sampleDateTime = نمونہ کب لیا گیا (تاریخ درج کریں)؟ Sample.associatedLabMessages = متعلقہ لیب کے پیغامات عیاں کریں +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = شعور کی تبدیل شدہ سطح، جیسے سستی، احمقانہ، کوما Symptoms.bloodInStool = پاخانہ میں خون دکھائی دینا diff --git a/sormas-api/src/main/resources/descriptions_zh-CN.properties b/sormas-api/src/main/resources/descriptions_zh-CN.properties index 2c4ab30eb38..81f2413d359 100644 --- a/sormas-api/src/main/resources/descriptions_zh-CN.properties +++ b/sormas-api/src/main/resources/descriptions_zh-CN.properties @@ -175,6 +175,9 @@ Person.sex = Select the sex of the person Sample.sampleDateTime = When the sample was taken (enter a date)? Sample.associatedLabMessages = Display associated lab messages +# Surveillance Report +SurveillanceReport.associatedMessage = Display associated external message + # Symptoms Symptoms.alteredConsciousness = Altered level of consciousness, e.g. lethargy, stuporous, coma Symptoms.bloodInStool = Visible blood in stool diff --git a/sormas-api/src/main/resources/enum_ar-SA.properties b/sormas-api/src/main/resources/enum_ar-SA.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_ar-SA.properties +++ b/sormas-api/src/main/resources/enum_ar-SA.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_cs-CZ.properties b/sormas-api/src/main/resources/enum_cs-CZ.properties index a8098f99bd5..f0a15de2ca4 100644 --- a/sormas-api/src/main/resources/enum_cs-CZ.properties +++ b/sormas-api/src/main/resources/enum_cs-CZ.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Přístup k možnostem vývojáře UserRight.DOCUMENT_VIEW = Zobrazit existující dokumenty UserRight.DOCUMENT_UPLOAD = Nahrát dokumenty UserRight.DOCUMENT_DELETE = Odstranit dokumenty ze systému +UserRight.PERSON_MERGE = Sloučit osoby # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Může archivovat případy @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Možnost přístupu vývojáře v konfiguračním adre UserRight.Desc.DOCUMENT_VIEW = Může zobrazit existující dokumenty UserRight.Desc.DOCUMENT_UPLOAD = Může nahrát dokumenty UserRight.Desc.DOCUMENT_DELETE = Může odstranit dokumenty ze systému +UserRight.Desc.PERSON_MERGE = Může sloučit osoby # UserRightGroup UserRightGroup.GENERAL = Obecné diff --git a/sormas-api/src/main/resources/enum_de-CH.properties b/sormas-api/src/main/resources/enum_de-CH.properties index 734aff1d71f..c4d01bfea9c 100644 --- a/sormas-api/src/main/resources/enum_de-CH.properties +++ b/sormas-api/src/main/resources/enum_de-CH.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Zugriff auf Entwickleroptionen UserRight.DOCUMENT_VIEW = Bestehende Dokumente anzeigen UserRight.DOCUMENT_UPLOAD = Dokumente hochladen UserRight.DOCUMENT_DELETE = Dokumente aus dem System löschen +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Kann Fälle archivieren @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Kann auf Entwickleroptionen im Konfigurationsverzeichn UserRight.Desc.DOCUMENT_VIEW = Kann bestehende Dokumente einsehen UserRight.Desc.DOCUMENT_UPLOAD = Kann Dokumente hochladen UserRight.Desc.DOCUMENT_DELETE = Kann Dokumente aus dem System löschen +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = Allgemein diff --git a/sormas-api/src/main/resources/enum_de-DE.properties b/sormas-api/src/main/resources/enum_de-DE.properties index 4cb8aa3ffda..c8a7131b865 100644 --- a/sormas-api/src/main/resources/enum_de-DE.properties +++ b/sormas-api/src/main/resources/enum_de-DE.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Zugriff auf Entwickleroptionen UserRight.DOCUMENT_VIEW = Bestehende Dokumente anzeigen UserRight.DOCUMENT_UPLOAD = Dokumente hochladen UserRight.DOCUMENT_DELETE = Dokumente aus dem System löschen +UserRight.PERSON_MERGE = Personen zusammenführen # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Kann Fälle abschließen @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Kann auf Entwickleroptionen im Konfigurationsverzeichn UserRight.Desc.DOCUMENT_VIEW = Kann bestehende Dokumente einsehen UserRight.Desc.DOCUMENT_UPLOAD = Kann Dokumente hochladen UserRight.Desc.DOCUMENT_DELETE = Kann Dokumente aus dem System löschen +UserRight.Desc.PERSON_MERGE = Kann Personen zusammenführen # UserRightGroup UserRightGroup.GENERAL = Allgemein diff --git a/sormas-api/src/main/resources/enum_en-AF.properties b/sormas-api/src/main/resources/enum_en-AF.properties index 8f9d8ec8a5b..426697231c9 100644 --- a/sormas-api/src/main/resources/enum_en-AF.properties +++ b/sormas-api/src/main/resources/enum_en-AF.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_en-GH.properties b/sormas-api/src/main/resources/enum_en-GH.properties index 14e2f2beb66..6cd39635428 100644 --- a/sormas-api/src/main/resources/enum_en-GH.properties +++ b/sormas-api/src/main/resources/enum_en-GH.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_en-NG.properties b/sormas-api/src/main/resources/enum_en-NG.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_en-NG.properties +++ b/sormas-api/src/main/resources/enum_en-NG.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_es-CU.properties b/sormas-api/src/main/resources/enum_es-CU.properties index a18bd69bf60..aa2c1f29077 100644 --- a/sormas-api/src/main/resources/enum_es-CU.properties +++ b/sormas-api/src/main/resources/enum_es-CU.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Acceder a opciones de desarrollador UserRight.DOCUMENT_VIEW = Ver documentos existentes UserRight.DOCUMENT_UPLOAD = Cargar documentos UserRight.DOCUMENT_DELETE = Eliminar documentos del sistema +UserRight.PERSON_MERGE = Combinar personas # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Puede archivar casos @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Puede acceder a las opciones de desarrollador en el di UserRight.Desc.DOCUMENT_VIEW = Puede ver documentos existentes UserRight.Desc.DOCUMENT_UPLOAD = Puede cargar documentos UserRight.Desc.DOCUMENT_DELETE = Puede eliminar documentos del sistema +UserRight.Desc.PERSON_MERGE = Puede combinar personas # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_es-EC.properties b/sormas-api/src/main/resources/enum_es-EC.properties index 73df38dbec0..881810d901b 100644 --- a/sormas-api/src/main/resources/enum_es-EC.properties +++ b/sormas-api/src/main/resources/enum_es-EC.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_es-ES.properties b/sormas-api/src/main/resources/enum_es-ES.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_es-ES.properties +++ b/sormas-api/src/main/resources/enum_es-ES.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fa-AF.properties b/sormas-api/src/main/resources/enum_fa-AF.properties index 67755a56cbc..16c4a20f5ff 100644 --- a/sormas-api/src/main/resources/enum_fa-AF.properties +++ b/sormas-api/src/main/resources/enum_fa-AF.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fi-FI.properties b/sormas-api/src/main/resources/enum_fi-FI.properties index 66f1ad79b29..e1d16edfcf9 100644 --- a/sormas-api/src/main/resources/enum_fi-FI.properties +++ b/sormas-api/src/main/resources/enum_fi-FI.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fil-PH.properties b/sormas-api/src/main/resources/enum_fil-PH.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_fil-PH.properties +++ b/sormas-api/src/main/resources/enum_fil-PH.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fj-FJ.properties b/sormas-api/src/main/resources/enum_fj-FJ.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_fj-FJ.properties +++ b/sormas-api/src/main/resources/enum_fj-FJ.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fr-CH.properties b/sormas-api/src/main/resources/enum_fr-CH.properties index e079c805ad7..d8156ec4e0a 100644 --- a/sormas-api/src/main/resources/enum_fr-CH.properties +++ b/sormas-api/src/main/resources/enum_fr-CH.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_fr-FR.properties b/sormas-api/src/main/resources/enum_fr-FR.properties index 6356795aa21..209c62add2b 100644 --- a/sormas-api/src/main/resources/enum_fr-FR.properties +++ b/sormas-api/src/main/resources/enum_fr-FR.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Accéder aux options de développement UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Capable d'archiver les cas @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Possibilité d'accéder aux options du développeur da UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_hi-IN.properties b/sormas-api/src/main/resources/enum_hi-IN.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_hi-IN.properties +++ b/sormas-api/src/main/resources/enum_hi-IN.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_hr-HR.properties b/sormas-api/src/main/resources/enum_hr-HR.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_hr-HR.properties +++ b/sormas-api/src/main/resources/enum_hr-HR.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_it-CH.properties b/sormas-api/src/main/resources/enum_it-CH.properties index 566893a6381..0a875d44258 100644 --- a/sormas-api/src/main/resources/enum_it-CH.properties +++ b/sormas-api/src/main/resources/enum_it-CH.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_it-IT.properties b/sormas-api/src/main/resources/enum_it-IT.properties index 037a7dd56de..8eb1c6246ac 100644 --- a/sormas-api/src/main/resources/enum_it-IT.properties +++ b/sormas-api/src/main/resources/enum_it-IT.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_ja-JP.properties b/sormas-api/src/main/resources/enum_ja-JP.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_ja-JP.properties +++ b/sormas-api/src/main/resources/enum_ja-JP.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_ne-NP.properties b/sormas-api/src/main/resources/enum_ne-NP.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_ne-NP.properties +++ b/sormas-api/src/main/resources/enum_ne-NP.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_nl-NL.properties b/sormas-api/src/main/resources/enum_nl-NL.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_nl-NL.properties +++ b/sormas-api/src/main/resources/enum_nl-NL.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_no-NO.properties b/sormas-api/src/main/resources/enum_no-NO.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_no-NO.properties +++ b/sormas-api/src/main/resources/enum_no-NO.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_pl-PL.properties b/sormas-api/src/main/resources/enum_pl-PL.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_pl-PL.properties +++ b/sormas-api/src/main/resources/enum_pl-PL.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_ps-AF.properties b/sormas-api/src/main/resources/enum_ps-AF.properties index 67755a56cbc..16c4a20f5ff 100644 --- a/sormas-api/src/main/resources/enum_ps-AF.properties +++ b/sormas-api/src/main/resources/enum_ps-AF.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_pt-PT.properties b/sormas-api/src/main/resources/enum_pt-PT.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_pt-PT.properties +++ b/sormas-api/src/main/resources/enum_pt-PT.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_ro-RO.properties b/sormas-api/src/main/resources/enum_ro-RO.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_ro-RO.properties +++ b/sormas-api/src/main/resources/enum_ro-RO.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_ru-RU.properties b/sormas-api/src/main/resources/enum_ru-RU.properties index 2917c2bfb84..342449f779e 100644 --- a/sormas-api/src/main/resources/enum_ru-RU.properties +++ b/sormas-api/src/main/resources/enum_ru-RU.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_sv-SE.properties b/sormas-api/src/main/resources/enum_sv-SE.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_sv-SE.properties +++ b/sormas-api/src/main/resources/enum_sv-SE.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_sw-KE.properties b/sormas-api/src/main/resources/enum_sw-KE.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_sw-KE.properties +++ b/sormas-api/src/main/resources/enum_sw-KE.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_tr-TR.properties b/sormas-api/src/main/resources/enum_tr-TR.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_tr-TR.properties +++ b/sormas-api/src/main/resources/enum_tr-TR.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_uk-UA.properties b/sormas-api/src/main/resources/enum_uk-UA.properties index 9ecca2fd752..77e3fbc0a33 100644 --- a/sormas-api/src/main/resources/enum_uk-UA.properties +++ b/sormas-api/src/main/resources/enum_uk-UA.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/enum_ur-PK.properties b/sormas-api/src/main/resources/enum_ur-PK.properties index 3e2bcf76047..fd4ea07fd58 100644 --- a/sormas-api/src/main/resources/enum_ur-PK.properties +++ b/sormas-api/src/main/resources/enum_ur-PK.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = ڈویلپر کے اختیارات تک رسائی UserRight.DOCUMENT_VIEW = موجودہ دستاویزات دیکھیں UserRight.DOCUMENT_UPLOAD = دستاویزات اپ لوڈ کریں UserRight.DOCUMENT_DELETE = سسٹم سے دستاویزات مٹا دیں +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = کیسز کو آرکائیو کرنے کے قابل @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = کنفیگریشن ڈائرکٹری میں ڈویلپ UserRight.Desc.DOCUMENT_VIEW = موجودہ دستاویزات دیکھنے کے قابل UserRight.Desc.DOCUMENT_UPLOAD = موجودہ دستاویزات اپ لوڈ کرنےکے قابل UserRight.Desc.DOCUMENT_DELETE = سسٹم سے دستاویزات مٹانے کے قابل +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = جنرل diff --git a/sormas-api/src/main/resources/enum_zh-CN.properties b/sormas-api/src/main/resources/enum_zh-CN.properties index 50f56a061e4..005401e8730 100644 --- a/sormas-api/src/main/resources/enum_zh-CN.properties +++ b/sormas-api/src/main/resources/enum_zh-CN.properties @@ -1524,6 +1524,7 @@ UserRight.DEV_MODE = Access developer options UserRight.DOCUMENT_VIEW = View existing documents UserRight.DOCUMENT_UPLOAD = Upload documents UserRight.DOCUMENT_DELETE = Delete documents from the system +UserRight.PERSON_MERGE = Merge persons # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Able to archive cases @@ -1698,6 +1699,7 @@ UserRight.Desc.DEV_MODE = Able to access developer options in the configuration UserRight.Desc.DOCUMENT_VIEW = Able to view existing documents UserRight.Desc.DOCUMENT_UPLOAD = Able to upload documents UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system +UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup UserRightGroup.GENERAL = General diff --git a/sormas-api/src/main/resources/strings_de-DE.properties b/sormas-api/src/main/resources/strings_de-DE.properties index 755087bfe85..44bd4ef04bf 100644 --- a/sormas-api/src/main/resources/strings_de-DE.properties +++ b/sormas-api/src/main/resources/strings_de-DE.properties @@ -859,8 +859,8 @@ infoMergingHideDescription = Wählen Sie diese Option, wenn Sie nicht sicher sin infoContactMergingHideDescription = Wählen Sie diese Option, wenn Sie nicht sicher sind, ob die beiden Kontakte gleich sind oder wenn Sie wissen, dass sie es nicht sind. Dadurch wird das Kontaktpaar aus der Liste ausgeblendet. Bitte beachten Sie, dass, wenn Sie die Ansicht aktualisieren oder später wieder darauf zurückkommen es wieder angezeigt wird, solange Sie keinen anderen Zeitraum im Erstellungsdatumsfilter wählen. infoPersonMergeDescription = Bitte wählen Sie eine der Personen unten als führende Person aus. Sie haben folgende Optionen, um fortzufahren.
Zusammenführen\: Daten der verworfenen Person werden verlinkt und/oder der verbleibenden Person hinzugefügt, aber nicht überschrieben. Sie werden diese Aktion nicht rückgängig machen können.
Auswählen\: Die Daten der verbleibenden Person werden nicht geändert und die Daten der anderen Person werden verworfen. Jedoch werden Entitäten, die mit der verworfenen Person verknüpft sind, mit der verbleibenden Person verknüpft. Sie können diese Aktion nicht rückgängig machen. infoPersonMergeConfirmation = Sind Sie sicher, dass Sie dies tun wollen? Die Aktion kann nicht rückgängig gemacht werden. -infoPersonMergeConfirmationBothShared = The persons you want to merge both have shared entities via S2S. If you merge these persons, the synchronization will be broken for the person who is not the leading one and the associated entities. Please discuss with your administrator if you would like to do this and verify which of the two persons you would like to have as the leading person.
Are you certain you want to do this? The action is not reversible. -infoPersonMergeSharedMustLead = Please note, you cannot choose this person as a leading person because then the synchronization of S2S would break.\nPlease select the other person as leading person +infoPersonMergeConfirmationBothShared = Die Personen die Sie zusammenführen wollen haben beide via S2S übergebene Entitäten. Wenn Sie diese Personen zusammenführen, wird die Synchronisierung deswegen für die nicht führende Person und die damit zusammenhängenden Entitäten gebrochen. Bitte sprechen Sie erst mit Ihrem Administrator, ob Sie diesen Schritt durchführen möchten und überprüfen Sie welche der beiden Personen die führende Person sein soll.
Die Aktion kann nicht rückgängig gemacht werden. +infoPersonMergeSharedMustLead = Bitte beachten Sie, Sie können diese Person nicht als die führende Person auswählen, da dann die Synchronisation von S2S brechen würde. Sie haben die Option die andere Person als die führende Person auszuwählen. infoPersonMergeConfirmationForNonSimilarPersons = Die beiden ausgewählten Personen entsprechen nicht den Ähnlichkeitsanforderungen, die SORMAS zur Identifizierung von Duplikaten verwendet. Bitte stellen Sie sicher, dass die ausgewählten Personen tatsächlich identisch sind und zusammengeführt werden sollen. infoHowToMergeCases = Sie können zwischen zwei Optionen wählen, wenn Sie potenziell doppelte Fälle überprüfen\: infoHowToMergeContacts = Sie können zwischen zwei Optionen wählen, wenn Sie potenziell doppelte Kontakte überprüfen\: diff --git a/sormas-api/src/main/resources/validations_ar-SA.properties b/sormas-api/src/main/resources/validations_ar-SA.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_ar-SA.properties +++ b/sormas-api/src/main/resources/validations_ar-SA.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_cs-CZ.properties b/sormas-api/src/main/resources/validations_cs-CZ.properties index 0c9020fdff2..4d1c50986e6 100644 --- a/sormas-api/src/main/resources/validations_cs-CZ.properties +++ b/sormas-api/src/main/resources/validations_cs-CZ.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Nelze odstranit všechny uživatelské role removeRolesWithEditRightFromOwnUser = Nelze odstranit všechny uživatelské role s uživatelským právem editace právě na aktuálně přihlášeném uživateli removeUserRightEditRightFromOwnUser = Nelze odebrat právo editovat uživatele aktuálně přihlášeného uživatele removeUserEditRightFromOwnUser = Nelze odebrat právo editovat uživatele aktuálně přihlášeného uživatele +externalMessageRefersToMultipleEntities = Externí zpráva se týká více subjektů (nejméně dva případy nebo případ a kontakt nebo účastník události) diff --git a/sormas-api/src/main/resources/validations_de-CH.properties b/sormas-api/src/main/resources/validations_de-CH.properties index 7c029707406..544b7427bce 100644 --- a/sormas-api/src/main/resources/validations_de-CH.properties +++ b/sormas-api/src/main/resources/validations_de-CH.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Keiner der Benutzerrollen mit dem Recht removeRolesWithEditRightFromOwnUser = Keiner der Benutzerrollen mit dem Recht Benutzerrecht bearbeiten können derzeit vom angemeldeten Benutzer entfernen werden removeUserRightEditRightFromOwnUser = Das Recht Benutzer bearbeiten kann derzeit nicht vom angemeldeten Benutzer entfernen werden removeUserEditRightFromOwnUser = Das Recht Benutzerrecht bearbeiten kann derzeit nicht vom angemeldeten Benutzer entfernen werden +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_de-DE.properties b/sormas-api/src/main/resources/validations_de-DE.properties index 68f240e2c68..cf949dfd044 100644 --- a/sormas-api/src/main/resources/validations_de-DE.properties +++ b/sormas-api/src/main/resources/validations_de-DE.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Keiner der Benutzerrollen mit dem Recht removeRolesWithEditRightFromOwnUser = Keiner der Benutzerrollen mit dem Recht Benutzerrecht bearbeiten können derzeit vom angemeldeten Benutzer entfernen werden removeUserRightEditRightFromOwnUser = Das Recht Benutzer bearbeiten kann derzeit nicht vom angemeldeten Benutzer entfernen werden removeUserEditRightFromOwnUser = Das Recht Benutzerrecht bearbeiten kann derzeit nicht vom angemeldeten Benutzer entfernen werden +externalMessageRefersToMultipleEntities = Die externe Nachricht bezieht sich auf mehrere Entitäten (mindestens zwei Fälle oder einen Fall und einen Kontakt oder einen Ereignis-Teilnehmer) diff --git a/sormas-api/src/main/resources/validations_en-AF.properties b/sormas-api/src/main/resources/validations_en-AF.properties index 056acbcbffa..b95e5f2c0db 100644 --- a/sormas-api/src/main/resources/validations_en-AF.properties +++ b/sormas-api/src/main/resources/validations_en-AF.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_en-GH.properties b/sormas-api/src/main/resources/validations_en-GH.properties index cd612245f19..2b01b8da32e 100644 --- a/sormas-api/src/main/resources/validations_en-GH.properties +++ b/sormas-api/src/main/resources/validations_en-GH.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_en-NG.properties b/sormas-api/src/main/resources/validations_en-NG.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_en-NG.properties +++ b/sormas-api/src/main/resources/validations_en-NG.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_es-CU.properties b/sormas-api/src/main/resources/validations_es-CU.properties index f9b33aa9434..1357927b5f3 100644 --- a/sormas-api/src/main/resources/validations_es-CU.properties +++ b/sormas-api/src/main/resources/validations_es-CU.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = No se pueden eliminar todos los roles de us removeRolesWithEditRightFromOwnUser = No se pueden eliminar todos los roles de usuario con derecho de editar derecho de usuario del usuario conectado actualmente removeUserRightEditRightFromOwnUser = No se puede eliminar el derecho de editar usuario del usuario conectado actualmente removeUserEditRightFromOwnUser = No se puede eliminar el derecho de editar derecho de usuario del usuario conectado actualmente +externalMessageRefersToMultipleEntities = El mensaje externo se refiere a múltiples entidades (Al menos dos casos, o un caso y un contacto o un participante de evento) diff --git a/sormas-api/src/main/resources/validations_es-EC.properties b/sormas-api/src/main/resources/validations_es-EC.properties index 9eebd0055cb..2ce907f9fd7 100644 --- a/sormas-api/src/main/resources/validations_es-EC.properties +++ b/sormas-api/src/main/resources/validations_es-EC.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_es-ES.properties b/sormas-api/src/main/resources/validations_es-ES.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_es-ES.properties +++ b/sormas-api/src/main/resources/validations_es-ES.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_fa-AF.properties b/sormas-api/src/main/resources/validations_fa-AF.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_fa-AF.properties +++ b/sormas-api/src/main/resources/validations_fa-AF.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_fi-FI.properties b/sormas-api/src/main/resources/validations_fi-FI.properties index b5e0ca62aab..465aaafcfcc 100644 --- a/sormas-api/src/main/resources/validations_fi-FI.properties +++ b/sormas-api/src/main/resources/validations_fi-FI.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_fil-PH.properties b/sormas-api/src/main/resources/validations_fil-PH.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_fil-PH.properties +++ b/sormas-api/src/main/resources/validations_fil-PH.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_fj-FJ.properties b/sormas-api/src/main/resources/validations_fj-FJ.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_fj-FJ.properties +++ b/sormas-api/src/main/resources/validations_fj-FJ.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_fr-CH.properties b/sormas-api/src/main/resources/validations_fr-CH.properties index 5f7af2c7cb0..7c6b6358c8d 100644 --- a/sormas-api/src/main/resources/validations_fr-CH.properties +++ b/sormas-api/src/main/resources/validations_fr-CH.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_fr-FR.properties b/sormas-api/src/main/resources/validations_fr-FR.properties index 4e56901c6df..a0934063697 100644 --- a/sormas-api/src/main/resources/validations_fr-FR.properties +++ b/sormas-api/src/main/resources/validations_fr-FR.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_hi-IN.properties b/sormas-api/src/main/resources/validations_hi-IN.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_hi-IN.properties +++ b/sormas-api/src/main/resources/validations_hi-IN.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_hr-HR.properties b/sormas-api/src/main/resources/validations_hr-HR.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_hr-HR.properties +++ b/sormas-api/src/main/resources/validations_hr-HR.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_it-CH.properties b/sormas-api/src/main/resources/validations_it-CH.properties index 5e17248d689..4a2397e1965 100644 --- a/sormas-api/src/main/resources/validations_it-CH.properties +++ b/sormas-api/src/main/resources/validations_it-CH.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_it-IT.properties b/sormas-api/src/main/resources/validations_it-IT.properties index 3668795b72d..320d6aaf5e0 100644 --- a/sormas-api/src/main/resources/validations_it-IT.properties +++ b/sormas-api/src/main/resources/validations_it-IT.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_ja-JP.properties b/sormas-api/src/main/resources/validations_ja-JP.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_ja-JP.properties +++ b/sormas-api/src/main/resources/validations_ja-JP.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_ne-NP.properties b/sormas-api/src/main/resources/validations_ne-NP.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_ne-NP.properties +++ b/sormas-api/src/main/resources/validations_ne-NP.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_nl-NL.properties b/sormas-api/src/main/resources/validations_nl-NL.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_nl-NL.properties +++ b/sormas-api/src/main/resources/validations_nl-NL.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_no-NO.properties b/sormas-api/src/main/resources/validations_no-NO.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_no-NO.properties +++ b/sormas-api/src/main/resources/validations_no-NO.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_pl-PL.properties b/sormas-api/src/main/resources/validations_pl-PL.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_pl-PL.properties +++ b/sormas-api/src/main/resources/validations_pl-PL.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_ps-AF.properties b/sormas-api/src/main/resources/validations_ps-AF.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_ps-AF.properties +++ b/sormas-api/src/main/resources/validations_ps-AF.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_pt-PT.properties b/sormas-api/src/main/resources/validations_pt-PT.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_pt-PT.properties +++ b/sormas-api/src/main/resources/validations_pt-PT.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_ro-RO.properties b/sormas-api/src/main/resources/validations_ro-RO.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_ro-RO.properties +++ b/sormas-api/src/main/resources/validations_ro-RO.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_ru-RU.properties b/sormas-api/src/main/resources/validations_ru-RU.properties index ff39a425483..7b88e18725a 100644 --- a/sormas-api/src/main/resources/validations_ru-RU.properties +++ b/sormas-api/src/main/resources/validations_ru-RU.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_sv-SE.properties b/sormas-api/src/main/resources/validations_sv-SE.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_sv-SE.properties +++ b/sormas-api/src/main/resources/validations_sv-SE.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_sw-KE.properties b/sormas-api/src/main/resources/validations_sw-KE.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_sw-KE.properties +++ b/sormas-api/src/main/resources/validations_sw-KE.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_tr-TR.properties b/sormas-api/src/main/resources/validations_tr-TR.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_tr-TR.properties +++ b/sormas-api/src/main/resources/validations_tr-TR.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_uk-UA.properties b/sormas-api/src/main/resources/validations_uk-UA.properties index 767b802dc22..d1dd5cce00f 100644 --- a/sormas-api/src/main/resources/validations_uk-UA.properties +++ b/sormas-api/src/main/resources/validations_uk-UA.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_ur-PK.properties b/sormas-api/src/main/resources/validations_ur-PK.properties index a14668f6966..445b1e98a7d 100644 --- a/sormas-api/src/main/resources/validations_ur-PK.properties +++ b/sormas-api/src/main/resources/validations_ur-PK.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = فی الحال لاگ ان صارف کے removeRolesWithEditRightFromOwnUser = فی الحال لاگ ان صارف کے حقوقصارف کے حق میں ترمیم کریں کے ساتھ تمام صارف کے کردار نہیں مٹا سکتے removeUserRightEditRightFromOwnUser = فی الحال لاگ ان صارف کے حقوقصارف میں ترمیم کریں کو مٹایا نہیں جا سکتا removeUserEditRightFromOwnUser = فی الحال لاگ ان صارف کے حقوقصارف کے حق میں ترمیم کریں کو مٹایا نہیں جا سکتا +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) diff --git a/sormas-api/src/main/resources/validations_zh-CN.properties b/sormas-api/src/main/resources/validations_zh-CN.properties index 716a04eea0e..7121339dcf5 100644 --- a/sormas-api/src/main/resources/validations_zh-CN.properties +++ b/sormas-api/src/main/resources/validations_zh-CN.properties @@ -265,3 +265,4 @@ removeRolesWithEditUserFromOwnUser = Cannot remove all user roles with edit u removeRolesWithEditRightFromOwnUser = Cannot remove all user roles with edit user right right of currently logged in user removeUserRightEditRightFromOwnUser = Cannot remove edit user right of currently logged in user removeUserEditRightFromOwnUser = Cannot remove edit user right right of currently logged in user +externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) From faa404c4bc945dbdc3b6d8ab577e1c738faf0037 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 5 Dec 2022 14:55:23 +0100 Subject: [PATCH 023/147] SORQA-702 and SORQA-670 --- .../steps/web/application/users/UserManagementSteps.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java index ae8fdb5607a..d29831f1134 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java @@ -132,14 +132,14 @@ public UserManagementSteps( Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(ACTIVE_INACTIVE_COMBOBOX, "Active"); - webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); - webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); +// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); +// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfActiveUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(ACTIVE_INACTIVE_COMBOBOX, "Inactive"); - webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); - webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); +// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); +// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfInactiveUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); @@ -154,7 +154,6 @@ public UserManagementSteps( Then( "I Verify The User Role filter in the User Management Page", () -> { - TimeUnit.SECONDS.sleep(5); webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable( USERS_COUNTER_USER_MANAGEMENT); Integer numberOfTotalUsers = From c2ab142cc5f7a67108840db5a8b08a8a490eaeae Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 5 Dec 2022 15:05:54 +0100 Subject: [PATCH 024/147] SORQA-702 and SORQA-670 --- .../steps/web/application/users/UserManagementSteps.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java index d29831f1134..e333fb507ac 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java @@ -183,8 +183,8 @@ public UserManagementSteps( Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(REGION_COMBOBOX_USER_MANAGEMENT, "Bayern"); - webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); - webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); +// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); +// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfSpecificUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); From ba817adafc5c0aa909c41618338d949f5ae6b767 Mon Sep 17 00:00:00 2001 From: dinua Date: Mon, 5 Dec 2022 16:53:51 +0200 Subject: [PATCH 025/147] #8438 fix date validation --- .../symeda/sormas/ui/task/TaskEditForm.java | 25 ++++++++----------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskEditForm.java index f6db0f28ba7..0289d5f64b9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskEditForm.java @@ -20,9 +20,12 @@ import static de.symeda.sormas.ui.utils.LayoutUtil.loc; import static de.symeda.sormas.ui.utils.LayoutUtil.locs; +import com.vaadin.v7.ui.AbstractField; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @@ -226,20 +229,14 @@ protected void addFields() { } // Validation - startDate.addValidator( - new DateComparisonValidator( - startDate, - dueDate, - true, - false, - I18nProperties.getValidationError(Validations.beforeDate, startDate.getCaption(), dueDate.getCaption()))); - dueDate.addValidator( - new DateComparisonValidator( - dueDate, - startDate, - false, - false, - I18nProperties.getValidationError(Validations.afterDate, dueDate.getCaption(), startDate.getCaption()))); + DateComparisonValidator.addStartEndValidators(startDate, dueDate); + + List> validatedFields = Arrays.asList(startDate, dueDate); + validatedFields.forEach(field -> field.addValueChangeListener(r -> { + validatedFields.forEach(otherField -> { + otherField.setValidationVisible(!otherField.isValid()); + }); + })); Map userTaskCounts = FacadeProvider.getTaskFacade() .getPendingTaskCountPerUser(availableUsers.stream().map(ReferenceDto::getUuid).collect(Collectors.toList())); From e6736afc0632698f668bc847f809ecfd5e274249 Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Mon, 5 Dec 2022 16:27:09 +0100 Subject: [PATCH 026/147] fixes --- .../pages/application/mSers/MSersDirectoryPage.java | 2 +- .../web/application/mSers/MSersDirectorySteps.java | 4 ++++ .../test/resources/features/sanity/web/mSERS.feature | 12 +++++++----- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/mSers/MSersDirectoryPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/mSers/MSersDirectoryPage.java index 8bba7a01f6b..cfd96d07bf6 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/mSers/MSersDirectoryPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/mSers/MSersDirectoryPage.java @@ -31,7 +31,7 @@ public class MSersDirectoryPage { public static By getEditButtonByIndex(int idx) { return By.xpath( String.format( - "(//tr[contains(@class,'v-grid-row-has-data')]//td[1]//span[@class='v-button-wrap'])[%x]", + "(//tr[contains(@class,'v-grid-row-has-data')]//td[1]//span[@class='v-icon Vaadin-Icons'])[%x]", idx)); } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/mSers/MSersDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/mSers/MSersDirectorySteps.java index b12896566f9..b38ea3e70dd 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/mSers/MSersDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/mSers/MSersDirectorySteps.java @@ -329,6 +329,10 @@ public MSersDirectorySteps( () -> { webDriverHelpers.waitUntilIdentifiedElementIsPresent(NEW_AGGREGATE_REPORT_BUTTON); while (webDriverHelpers.getNumberOfElements(RESULT_IN_GRID) > 0) { + do { + webDriverHelpers.scrollInTable(5); + } while (!webDriverHelpers.isElementVisibleWithTimeout(getEditButtonByIndex(1), 2)); + webDriverHelpers.waitUntilIdentifiedElementIsPresent(getEditButtonByIndex(1)); webDriverHelpers.doubleClickOnWebElementBySelector(getEditButtonByIndex(1)); webDriverHelpers.clickOnWebElementBySelector(DELETE_AGGREGATED_REPORT_BUTTON); diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/mSERS.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/mSERS.feature index 7aa27eadbfa..9d90cfb1870 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/mSERS.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/mSERS.feature @@ -399,6 +399,13 @@ Feature: mSERS functionalities Scenario: Addition of age categories to aggregate module (mSERS) Given I log in as a Admin User When I click on the mSERS button from navbar + And I navigate to Report data tab + And I set Epi Year from filter to "2012" in mSers directory page + Then I set Epi week from filter to "Wk 1-2012 (12/26 - 1/1)" in mSers directory page + And I set Epi Year to filter to "2012" in mSers directory page + And I set Epi week to filter to "Wk 1-2012 (12/26 - 1/1)" in mSers directory page + And I click on the APPLY FILTERS button + Then I check aggregate reports and delete them if they are listed And I click on the NEW AGGREGATE REPORT button And I check if age groups are visible for "Acute Viral Hepatitis" And I check if age groups are visible for "HIV" @@ -406,11 +413,6 @@ Feature: mSERS functionalities Then I click on SPECIFY Radiobutton in Create Aggregated Report form And I fill a new aggregate report with specific age groups And I click to save aggregated report - And I navigate to Report data tab - And I set Epi Year from filter to "2012" in mSers directory page - Then I set Epi week from filter to "Wk 1-2012 (12/26 - 1/1)" in mSers directory page - And I set Epi Year to filter to "2012" in mSers directory page - And I set Epi week to filter to "Wk 1-2012 (12/26 - 1/1)" in mSers directory page And I click on the APPLY FILTERS button And I check if there number of results in grid in mSers directory is 3 And I check that Age group for 1 result in grid in mSers directory is "16+ years" From b02b05996d8da24d574266c98fa7b05e350aae8a Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 5 Dec 2022 16:41:43 +0100 Subject: [PATCH 027/147] gradle 7.6 update --- sormas-e2e-tests/gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/gradle/wrapper/gradle-wrapper.properties b/sormas-e2e-tests/gradle/wrapper/gradle-wrapper.properties index cffa6d1ab3e..bc094848230 100644 --- a/sormas-e2e-tests/gradle/wrapper/gradle-wrapper.properties +++ b/sormas-e2e-tests/gradle/wrapper/gradle-wrapper.properties @@ -18,6 +18,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 22ea3edf4c06d02ab4a088ad90f4b491da196ed4 Mon Sep 17 00:00:00 2001 From: Christopher Riedel Date: Tue, 6 Dec 2022 07:14:28 +0100 Subject: [PATCH 028/147] #8640: Avoided NPE (#11099) --- .../src/main/java/de/symeda/sormas/api/i18n/Strings.java | 1 + sormas-api/src/main/resources/strings.properties | 1 + .../sormas/backend/externaljournal/PatientDiaryClient.java | 6 +++++- 3 files changed, 7 insertions(+), 1 deletion(-) 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 b3dea80b139..92a89841cdf 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 @@ -1103,6 +1103,7 @@ public interface Strings { String messageExportConfigurationDeleted = "messageExportConfigurationDeleted"; String messageExportConfigurationSaved = "messageExportConfigurationSaved"; String messageExportFailed = "messageExportFailed"; + String messageExternalJournalDidNotProvideMessage = "messageExternalJournalDidNotProvideMessage"; String messageExternalLabResultsAdapterNotFound = "messageExternalLabResultsAdapterNotFound"; String messageExternalMessagesAssigned = "messageExternalMessagesAssigned"; String messageExternalMessagesDeleted = "messageExternalMessagesDeleted"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 645c3d81893..f0601a705f9 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/externaljournal/PatientDiaryClient.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/externaljournal/PatientDiaryClient.java index 9fa63714f19..b0fd7abe553 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/externaljournal/PatientDiaryClient.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/externaljournal/PatientDiaryClient.java @@ -48,6 +48,8 @@ import de.symeda.sormas.api.externaljournal.patientdiary.PatientDiaryPersonDto; import de.symeda.sormas.api.externaljournal.patientdiary.PatientDiaryQueryResponse; import de.symeda.sormas.api.externaljournal.patientdiary.PatientDiaryResult; +import de.symeda.sormas.api.i18n.I18nProperties; +import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.backend.common.ConfigFacadeEjb; import de.symeda.sormas.backend.util.ClientHelper; @@ -95,7 +97,9 @@ public PatientDiaryResult registerPatientDiaryPerson(String personUuid, Runnable ObjectMapper mapper = new ObjectMapper(); JsonNode node = mapper.readValue(responseJson, JsonNode.class); boolean success = node.get("success").booleanValue(); - String message = node.get("message").textValue(); + String message = node.get("message") != null + ? node.get("message").textValue() + : I18nProperties.getString(Strings.messageExternalJournalDidNotProvideMessage); if (!success) { logger.warn("Could not create new patient diary person: " + message); } else { From 6ebcbc203364d46c1c92b475efd3acdb9035948f Mon Sep 17 00:00:00 2001 From: Christopher Riedel Date: Tue, 6 Dec 2022 08:57:54 +0100 Subject: [PATCH 029/147] Feature 10826 add field for notification bundle id and map it (#11097) * #10825: Added field to ExternalMessage * #10825: Added test --- .../externalmessage/ExternalMessageDto.java | 12 ++++ .../de/symeda/sormas/api/i18n/Captions.java | 1 + .../src/main/resources/captions.properties | 1 + .../resources/doc/SORMAS_Data_Dictionary.xlsx | Bin 267421 -> 268050 bytes .../main/resources/doc/SORMAS_User_Roles.xlsx | Bin 31222 -> 31222 bytes .../externalmessage/ExternalMessage.java | 11 ++++ .../ExternalMessageFacadeEjb.java | 2 + .../src/main/resources/sql/sormas_schema.sql | 6 ++ .../ExternalMessageController.java | 6 +- .../ExternalMessageControllerTest.java | 53 +++++++++++------- 10 files changed, 71 insertions(+), 21 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageDto.java index 0b67601cd7c..16e6d27fabd 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/externalmessage/ExternalMessageDto.java @@ -64,6 +64,7 @@ public class ExternalMessageDto extends SormasToSormasShareableDto { public static final String EXTERNAL_MESSAGE_DETAILS = "externalMessageDetails"; public static final String PROCESSED = "processed"; public static final String REPORT_ID = "reportId"; + public static final String REPORT_MESSAGE_ID = "reportMessageId"; public static final String STATUS = "status"; public static final String ASSIGNEE = "assignee"; public static final String SURVEILLANCE_REPORT = "surveillanceReport"; @@ -113,6 +114,9 @@ public class ExternalMessageDto extends SormasToSormasShareableDto { private String externalMessageDetails; @Size(max = FieldConstraints.CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong) private String reportId; + + @Size(max = FieldConstraints.CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong) + private String reportMessageId; @AuditIncludeProperty private ExternalMessageStatus status = ExternalMessageStatus.UNPROCESSED; @@ -306,6 +310,14 @@ public void setReportId(String reportId) { this.reportId = reportId; } + public String getReportMessageId() { + return reportMessageId; + } + + public void setReportMessageId(String reportMessageId) { + this.reportMessageId = reportMessageId; + } + public UserReferenceDto getAssignee() { return assignee; } 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 13ba7a22000..ebd9fed7f5b 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 @@ -1335,6 +1335,7 @@ public interface Captions { String ExternalMessage_reporterName = "ExternalMessage.reporterName"; String ExternalMessage_reporterPostalCode = "ExternalMessage.reporterPostalCode"; String ExternalMessage_reportId = "ExternalMessage.reportId"; + String ExternalMessage_reportMessageId = "ExternalMessage.reportMessageId"; String ExternalMessage_sampleDateTime = "ExternalMessage.sampleDateTime"; String ExternalMessage_sampleMaterial = "ExternalMessage.sampleMaterial"; String ExternalMessage_sampleOverallTestResult = "ExternalMessage.sampleOverallTestResult"; diff --git a/sormas-api/src/main/resources/captions.properties b/sormas-api/src/main/resources/captions.properties index 39241208a53..60e32d90c4f 100644 --- a/sormas-api/src/main/resources/captions.properties +++ b/sormas-api/src/main/resources/captions.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/doc/SORMAS_Data_Dictionary.xlsx b/sormas-api/src/main/resources/doc/SORMAS_Data_Dictionary.xlsx index afa545357357a0ec366e73036d49ee8eca325dfe..7ba6f5cdd807f990422b4472f9f69b25f7dc9a78 100644 GIT binary patch delta 205199 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ðR?8A^5OCcUiZ2lv%caC+scz1*oI}U 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 Ang9R* delta 204489 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%0AtH5K~h@6^Cytg@6Yzxb8cOh#wIgHw*4VebIeN3N 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

nv^>l}v7< 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%0Aop!_sN$!h#x9$UcADO^!pQLBFGI^ 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 { -// m.setType(ExternalMessageType.PHYSICIANS_REPORT); -// -// m.setMessageDateTime(messageDateTime); -// }); -// SurveillanceReportDto surveillanceReport = cut.createSurveillanceReport(externalMessage, caze.toReference()); -// assertEquals(ReportingType.DOCTOR, surveillanceReport.getReportingType()); -// assertEquals(messageDateTime, surveillanceReport.getReportDate()); -// assertEquals(caze.getUuid(), surveillanceReport.getCaze().getUuid()); -// assertEquals(rdcf.facility.getUuid(), surveillanceReport.getFacility().getUuid()); -// } + @Test + public void testCreateSurveillanceReport() { + ExternalMessageController cut = new ExternalMessageController(); + TestDataCreator.RDCF rdcf = creator.createRDCF(); + CaseDataDto caze = creator.createCase(rdcf); + Date messageDateTime = new Date(); + ExternalMessageDto externalMessage = creator.createExternalMessage(m -> { + m.setType(ExternalMessageType.PHYSICIANS_REPORT); + m.setReportMessageId("1234-abcd"); + m.setMessageDateTime(messageDateTime); + }); + SurveillanceReportDto surveillanceReport = cut.createSurveillanceReport(externalMessage, caze.toReference()); + assertEquals(ReportingType.DOCTOR, surveillanceReport.getReportingType()); + + assertEquals(messageDateTime, surveillanceReport.getReportDate()); + assertEquals(caze.getUuid(), surveillanceReport.getCaze().getUuid()); + assertEquals("1234-abcd", surveillanceReport.getExternalId()); + + externalMessage.setType(ExternalMessageType.LAB_MESSAGE); + surveillanceReport = cut.createSurveillanceReport(externalMessage, caze.toReference()); + assertEquals(ReportingType.LABORATORY, surveillanceReport.getReportingType()); + } } From 7c36795fe72243399833739e4c74ca257e7e125c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 6 Dec 2022 10:07:15 +0100 Subject: [PATCH 030/147] [GITFLOW]Updating development poms to hotfix version to avoid merge conflicts --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index ec8a91fd49e..e8fddaa77d3 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.2 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 6a49b253781..2ccce94b3db 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.2 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 5a7625052ac..eea7f02f544 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.2 ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index 91db21e5987..ee1480935bc 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.2 ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 8f1cf55d2b9..4f5ce7a763e 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.78.0-SNAPSHOT + 1.77.2 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 935d51a2397..cca171a9a20 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.2 ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 05d2cab9ca1..e1f44f32644 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.2 ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 6c507e70a4e..b2631031898 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.2 ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 2798d0cc469..b89e3259dfb 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.2 ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 04695198254..7fdb8a376dc 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.2 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 7ceea1349a7..e9b0e2a4235 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.2 ../sormas-base 4.0.0 From 67c96d9e33079c3e386b2a139c54ffed51cf9088 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 6 Dec 2022 10:07:28 +0100 Subject: [PATCH 031/147] [GITFLOW]Updating develop poms back to pre merge state --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index e8fddaa77d3..ec8a91fd49e 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.77.2 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 2ccce94b3db..6a49b253781 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.2 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index eea7f02f544..5a7625052ac 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.2 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index ee1480935bc..91db21e5987 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.77.2 + 1.78.0-SNAPSHOT ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 4f5ce7a763e..8f1cf55d2b9 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.77.2 + 1.78.0-SNAPSHOT 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index cca171a9a20..935d51a2397 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.2 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index e1f44f32644..05d2cab9ca1 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.2 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index b2631031898..6c507e70a4e 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.2 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index b89e3259dfb..2798d0cc469 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.2 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 7fdb8a376dc..04695198254 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.2 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index e9b0e2a4235..7ceea1349a7 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.2 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 From e8a50c715d1fe21b899c5d916881520911b976ea Mon Sep 17 00:00:00 2001 From: dinua Date: Tue, 6 Dec 2022 14:18:30 +0200 Subject: [PATCH 032/147] 8438 fix date validation for events --- .../de/symeda/sormas/ui/events/EventDataForm.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java index c8a17bce6a7..c2747e3bb85 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java @@ -30,6 +30,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -41,6 +42,7 @@ import com.vaadin.v7.data.fieldgroup.FieldGroup; import com.vaadin.v7.data.util.converter.Converter; import com.vaadin.v7.data.validator.EmailValidator; +import com.vaadin.v7.ui.AbstractField; import com.vaadin.v7.ui.CheckBox; import com.vaadin.v7.ui.ComboBox; import com.vaadin.v7.ui.DateField; @@ -690,9 +692,19 @@ private void initEventDateValidation(DateTimeField startDate, DateTimeField endD if ((Boolean) e.getProperty().getValue()) { startDate.addValidator(startDateValidator); endDate.addValidator(endDateValidator); + + List> validatedFields = Arrays.asList(startDate, endDate); + validatedFields.forEach(field -> field.addValueChangeListener(r -> { + validatedFields.forEach(otherField -> { + otherField.setValidationVisible(!otherField.isValid()); + }); + })); + } else { startDate.removeValidator(startDateValidator); + startDate.setValidationVisible(true); endDate.removeValidator(endDateValidator); + endDate.setValidationVisible(true); } }); From c47d6ec245009888b3a068a9ac2291560182dbe5 Mon Sep 17 00:00:00 2001 From: dinua Date: Tue, 6 Dec 2022 15:13:04 +0200 Subject: [PATCH 033/147] #8438 validate dates for immunization --- .../de/symeda/sormas/ui/contact/ContactDataForm.java | 9 +-------- .../de/symeda/sormas/ui/events/EventDataForm.java | 11 +---------- .../components/form/ImmunizationCreationForm.java | 2 ++ .../components/form/ImmunizationDataForm.java | 2 ++ .../java/de/symeda/sormas/ui/task/TaskEditForm.java | 11 +---------- .../sormas/ui/utils/DateComparisonValidator.java | 12 ++++++++++++ 6 files changed, 19 insertions(+), 28 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataForm.java index 50c6b5c3ecd..deb9713b3e9 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactDataForm.java @@ -29,7 +29,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.Date; -import java.util.List; import com.google.common.collect.Sets; import com.vaadin.server.ErrorMessage; @@ -42,7 +41,6 @@ import com.vaadin.v7.data.util.converter.Converter; import com.vaadin.v7.data.validator.DateRangeValidator; import com.vaadin.v7.shared.ui.datefield.Resolution; -import com.vaadin.v7.ui.AbstractField; import com.vaadin.v7.ui.CheckBox; import com.vaadin.v7.ui.ComboBox; import com.vaadin.v7.ui.DateField; @@ -244,12 +242,7 @@ protected void addFields() { lastContactDate = addField(ContactDto.LAST_CONTACT_DATE, DateField.class); reportDate = addField(ContactDto.REPORT_DATE_TIME, DateField.class); - List> validatedFields = Arrays.asList(firstContactDate, lastContactDate, reportDate); - validatedFields.forEach(field -> field.addValueChangeListener(r -> { - validatedFields.forEach(otherField -> { - otherField.setValidationVisible(!otherField.isValid()); - }); - })); + DateComparisonValidator.dateFieldDependencyValidationVisibility(firstContactDate, lastContactDate, reportDate); FieldHelper .setVisibleWhen(getFieldGroup(), ContactDto.FIRST_CONTACT_DATE, ContactDto.MULTI_DAY_CONTACT, Collections.singletonList(true), true); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java index c2747e3bb85..2fe0cff6e39 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java @@ -30,7 +30,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -42,7 +41,6 @@ import com.vaadin.v7.data.fieldgroup.FieldGroup; import com.vaadin.v7.data.util.converter.Converter; import com.vaadin.v7.data.validator.EmailValidator; -import com.vaadin.v7.ui.AbstractField; import com.vaadin.v7.ui.CheckBox; import com.vaadin.v7.ui.ComboBox; import com.vaadin.v7.ui.DateField; @@ -692,14 +690,7 @@ private void initEventDateValidation(DateTimeField startDate, DateTimeField endD if ((Boolean) e.getProperty().getValue()) { startDate.addValidator(startDateValidator); endDate.addValidator(endDateValidator); - - List> validatedFields = Arrays.asList(startDate, endDate); - validatedFields.forEach(field -> field.addValueChangeListener(r -> { - validatedFields.forEach(otherField -> { - otherField.setValidationVisible(!otherField.isValid()); - }); - })); - + DateComparisonValidator.dateFieldDependencyValidationVisibility(startDate, endDate); } else { startDate.removeValidator(startDateValidator); startDate.setValidationVisible(true); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/ImmunizationCreationForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/ImmunizationCreationForm.java index 265f15a3fe7..cce3247405b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/ImmunizationCreationForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/ImmunizationCreationForm.java @@ -172,10 +172,12 @@ protected void addFields() { DateField startDate = addField(ImmunizationDto.START_DATE, DateField.class); DateField endDate = addDateField(ImmunizationDto.END_DATE, DateField.class, -1); DateComparisonValidator.addStartEndValidators(startDate, endDate); + DateComparisonValidator.dateFieldDependencyValidationVisibility(startDate, endDate); DateField validFrom = addDateField(ImmunizationDto.VALID_FROM, DateField.class, -1); DateField validUntil = addDateField(ImmunizationDto.VALID_UNTIL, DateField.class, -1); DateComparisonValidator.addStartEndValidators(validFrom, validUntil); + DateComparisonValidator.dateFieldDependencyValidationVisibility(validFrom, validUntil); Field numberOfDosesField = addField(ImmunizationDto.NUMBER_OF_DOSES); numberOfDosesField.addValidator(new NumberValidator(I18nProperties.getValidationError(Validations.vaccineDosesFormat), 1, 10, false)); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/ImmunizationDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/ImmunizationDataForm.java index 8f838610d0d..d0d8ad75019 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/ImmunizationDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/form/ImmunizationDataForm.java @@ -214,10 +214,12 @@ protected void addFields() { DateField startDate = addField(ImmunizationDto.START_DATE, DateField.class); DateField endDate = addDateField(ImmunizationDto.END_DATE, DateField.class, -1); DateComparisonValidator.addStartEndValidators(startDate, endDate); + DateComparisonValidator.dateFieldDependencyValidationVisibility(startDate, endDate); DateField validFrom = addDateField(ImmunizationDto.VALID_FROM, DateField.class, -1); DateField validUntil = addDateField(ImmunizationDto.VALID_UNTIL, DateField.class, -1); DateComparisonValidator.addStartEndValidators(validFrom, validUntil); + DateComparisonValidator.dateFieldDependencyValidationVisibility(validFrom, validUntil); MeansOfImmunization meansOfImmunizationValue = (MeansOfImmunization) meansOfImmunizationField.getValue(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskEditForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskEditForm.java index 0289d5f64b9..20cdce0dade 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskEditForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskEditForm.java @@ -20,12 +20,9 @@ import static de.symeda.sormas.ui.utils.LayoutUtil.loc; import static de.symeda.sormas.ui.utils.LayoutUtil.locs; -import com.vaadin.v7.ui.AbstractField; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @@ -230,13 +227,7 @@ protected void addFields() { // Validation DateComparisonValidator.addStartEndValidators(startDate, dueDate); - - List> validatedFields = Arrays.asList(startDate, dueDate); - validatedFields.forEach(field -> field.addValueChangeListener(r -> { - validatedFields.forEach(otherField -> { - otherField.setValidationVisible(!otherField.isValid()); - }); - })); + DateComparisonValidator.dateFieldDependencyValidationVisibility(startDate, dueDate); Map userTaskCounts = FacadeProvider.getTaskFacade() .getPendingTaskCountPerUser(availableUsers.stream().map(ReferenceDto::getUuid).collect(Collectors.toList())); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DateComparisonValidator.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DateComparisonValidator.java index 4f404d7871c..f8b7cfdeb6e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DateComparisonValidator.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DateComparisonValidator.java @@ -16,12 +16,15 @@ package de.symeda.sormas.ui.utils; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Date; +import java.util.List; import java.util.function.Supplier; import com.vaadin.v7.data.Validator; import com.vaadin.v7.data.validator.AbstractValidator; +import com.vaadin.v7.ui.AbstractField; import com.vaadin.v7.ui.Field; import de.symeda.sormas.api.i18n.I18nProperties; @@ -128,6 +131,15 @@ public static void addStartEndValidators(Field startDate, Field endD addStartEndValidators(startDate, endDate, true); } + public static void dateFieldDependencyValidationVisibility(AbstractField... dates) { + List> validatedFields = Arrays.asList(dates); + validatedFields.forEach(field -> field.addValueChangeListener(r -> { + validatedFields.forEach(otherField -> { + otherField.setValidationVisible(!otherField.isValid()); + }); + })); + } + public static void addStartEndValidators(Field startDate, Field endDate, boolean dateOnly) { DateComparisonValidator startDateValidator = new DateComparisonValidator( startDate, From 3dec6ab9910f8b0213db50afa938db67d3fc66a8 Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Tue, 6 Dec 2022 14:42:26 +0100 Subject: [PATCH 034/147] fixes --- .../src/test/resources/features/sanity/web/Columns.feature | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Columns.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Columns.feature index ce99e213fc3..b1c48024c44 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Columns.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Columns.feature @@ -139,7 +139,7 @@ Scenario Outline: Sort column by date and time in Cases directory Examples: | col | - |15 | +# |15 | |16 | @env_main @tmsLink=SORDEV-5342 @Case @@ -155,6 +155,7 @@ Scenario Outline: Sort column by date in Cases directory Examples: | col | + |15 | |18 | @env_main @tmsLink=SORDEV-5342 @Contacts From ddcd06646030cec86210a440d899eb293a66865f Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Wed, 7 Dec 2022 14:50:29 +0100 Subject: [PATCH 035/147] SORQA-707 @precon changes + new tests added --- .../configuration/FacilitiesTabPage.java | 1 + .../configuration/FacilitySteps.java | 25 ++++++++++++++- .../features/sanity/web/Country.feature | 12 +++++-- .../features/sanity/web/Facility.feature | 32 +++++++++++++++++++ .../features/sanity/web/Keycloak.feature | 4 +-- 5 files changed, 69 insertions(+), 5 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/configuration/FacilitiesTabPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/configuration/FacilitiesTabPage.java index 5e43c6e0193..169183257fa 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/configuration/FacilitiesTabPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/configuration/FacilitiesTabPage.java @@ -77,4 +77,5 @@ public class FacilitiesTabPage { public static final By ACTION_CONFIRM_BUTTON = By.id("actionConfirm"); public static final By RELEVANCE_STATUS_COMBOBOX_FACILITIES_CONFIGURATION = By.cssSelector("#relevanceStatus > div"); + public static final By FACILITY_GRID_RESULTS_ROWS = By.xpath("//tbody[@role='rowgroup']//tr"); } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/configuration/FacilitySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/configuration/FacilitySteps.java index a008088e80b..c23cd92310e 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/configuration/FacilitySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/configuration/FacilitySteps.java @@ -44,6 +44,7 @@ import static org.sormas.e2etests.pages.application.configuration.FacilitiesTabPage.FACILITY_CONTACT_PERSON_LAST_NAME_INPUT; import static org.sormas.e2etests.pages.application.configuration.FacilitiesTabPage.FACILITY_CONTACT_PERSON_PHONE_INPUT; import static org.sormas.e2etests.pages.application.configuration.FacilitiesTabPage.FACILITY_EXPOSURE_TYPE_COMBOBOX; +import static org.sormas.e2etests.pages.application.configuration.FacilitiesTabPage.FACILITY_GRID_RESULTS_ROWS; import static org.sormas.e2etests.pages.application.configuration.FacilitiesTabPage.FACILITY_NAME_INPUT; import static org.sormas.e2etests.pages.application.configuration.FacilitiesTabPage.FACILITY_TYPE_COMBOBOX; import static org.sormas.e2etests.pages.application.configuration.FacilitiesTabPage.FACILITY_TYPE_COMBOBOX_FACILITIES_CONFIGURATION; @@ -86,7 +87,9 @@ import org.sormas.e2etests.entities.services.EventService; import org.sormas.e2etests.enums.DistrictsValues; import org.sormas.e2etests.enums.RegionsValues; +import org.sormas.e2etests.helpers.AssertHelpers; import org.sormas.e2etests.helpers.WebDriverHelpers; +import org.testng.Assert; import org.testng.asserts.SoftAssert; public class FacilitySteps implements En { @@ -104,7 +107,8 @@ public FacilitySteps( SoftAssert softly, Faker faker, CaseService caseService, - EventService eventService) { + EventService eventService, + AssertHelpers assertHelpers) { this.webDriverHelpers = webDriverHelpers; this.faker = faker; @@ -365,6 +369,25 @@ public FacilitySteps( "Relevance status Combo box is Not present in Facilities Configuration"); softly.assertAll(); }); + + When( + "I filter facility by {string}", + (String facilName) -> { + webDriverHelpers.fillAndSubmitInWebElement(SEARCH_FACILITY, facilName); + TimeUnit.SECONDS.sleep(2); // wait for system reaction + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(40); + }); + + When( + "I check that number of displayed Facilities results is {int}", + (Integer nr) -> { + assertHelpers.assertWithPoll20Second( + () -> + Assert.assertEquals( + webDriverHelpers.getNumberOfElements(FACILITY_GRID_RESULTS_ROWS), + nr.intValue(), + "Number of displayed facilities is not correct")); + }); } private void selectFacilityType(String facilityType) { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Country.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Country.feature index eff13581e1b..077a32ec5da 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Country.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Country.feature @@ -1,7 +1,7 @@ @UI @Sanity @Configuration Feature: Country end to end tests - @tmsLink=SORDEV-7463 @env_main + @tmsLink=SORDEV-7463 @env_main @precon Scenario: Test configuration for country and its Subcontinent association Given I log in as a Admin User Then I click on the Configuration button from navbar @@ -9,7 +9,7 @@ Feature: Country end to end tests And I fill search filter with "Germany" country name on Country Configuration Page Then I check the "Central Europe" name for the country on Country Configuration Page - @tmsLink=SORDEV-7464 @env_main + @tmsLink=SORDEV-7464 @env_main @precon Scenario: Test configuration for NCL and its Subcontinent association Given I log in as a Admin User Then I click on the Configuration button from navbar @@ -51,3 +51,11 @@ Feature: Country end to end tests Then I verify the Subcontinent Central America combo box returns appropriate filter results in Countries Configuration page Then I verify the Subcontinent Central Asia combo box returns appropriate filter results in Countries Configuration page Then I verify the Subcontinent Central Europe combo box returns appropriate filter results in Countries Configuration page + + @tmsLink=SORQA-707 @env_main @precon + Scenario: Test configuration for country and its Subcontinent association + Given I log in as a Admin User + Then I click on the Configuration button from navbar + And I navigate to countries tab in Configuration + And I fill search filter with "Cameroon" country name on Country Configuration Page + Then I check the "Central Africa" name for the country on Country Configuration Page \ No newline at end of file diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Facility.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Facility.feature index a32143017df..f00352a42c2 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Facility.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Facility.feature @@ -65,3 +65,35 @@ Feature: Facility end to end tests Then I click on the Configuration button from navbar And I click on Facilities button in Configuration tab Then I Verify the page elements are present in Facilities Configuration Page + + @tmsLink=SORQA-707 @env_main @precon + Scenario: Check if Standard Einrichtung facility is available in the system + Given I log in as a Admin User + Then I click on the Configuration button from navbar + Then I click on Facilities button in Configuration tab + And I filter facility by "Standard Einrichtung" + Then I check that number of displayed Facilities results is 1 + + @tmsLink=SORQA-707 @env_main @precon + Scenario: Check if Voreingestelltes Labor facility is available in the system + Given I log in as a Admin User + Then I click on the Configuration button from navbar + Then I click on Facilities button in Configuration tab + And I filter facility by "Voreingestelltes Labor" + Then I check that number of displayed Facilities results is 1 + + @tmsLink=SORQA-707 @env_s2s_1 @precon + Scenario: Check if General Hospital facility is available in the system + Given I log in as a Admin User + Then I click on the Configuration button from navbar + Then I click on Facilities button in Configuration tab + And I filter facility by "General Hospital" + Then I check that number of displayed Facilities results is 1 + + @tmsLink=SORQA-707 @env_main @precon + Scenario: Check if Community111 facility is available in the system + Given I log in as a Admin User + Then I click on the Configuration button from navbar + Then I click on Facilities button in Configuration tab + And I filter facility by "Community111" + Then I check that number of displayed Facilities results is 1 \ No newline at end of file diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Keycloak.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Keycloak.feature index 67b41d7b653..e3f430a5777 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Keycloak.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Keycloak.feature @@ -1,7 +1,7 @@ @UI @Sanity @Keycloak Feature: Keycloak tests - @tmsLink=SORQA-458 @env_keycloak + @tmsLink=SORQA-458 @env_keycloak @precon Scenario:SORMAS - Keycloak Synchronisation (manual sync) Given I log in as a Admin User Then I click on the Users from navbar @@ -16,7 +16,7 @@ Feature: Keycloak tests Then I count the number of users displayed in Users tab in Keycloak Administrator Console And I check that number of users from SORMAS is equal to number of users in Keycloak Administrator Console - @tmsLink=SORQA-459 @env_keycloak + @tmsLink=SORQA-459 @env_keycloak @precon Scenario:SORMAS - Keycloak Synchronisation (automatic sync) Given I log in as a Admin User Then I click on the Users from navbar From a5b68d81fd02b364c8d63c70be6937c627e3af4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 7 Dec 2022 15:10:08 +0100 Subject: [PATCH 036/147] [GITFLOW]Updating development poms to hotfix version to avoid merge conflicts --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index ec8a91fd49e..23cbef3d05a 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.3 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 6a49b253781..d808a1c17a6 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.3 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 5a7625052ac..8fe4c8e9607 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.3 ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index 91db21e5987..d381f6531fb 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.3 ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 8f1cf55d2b9..62cbba62b9a 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.78.0-SNAPSHOT + 1.77.3 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 935d51a2397..58a5feda164 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.3 ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 05d2cab9ca1..789a4e5a101 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.3 ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 6c507e70a4e..b715db3decd 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.3 ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 2798d0cc469..94f03539cd8 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.3 ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 04695198254..0686d0fa4c9 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.3 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 7ceea1349a7..1ff4706a25a 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.3 ../sormas-base 4.0.0 From 29191c138491709ed0834bf5a6b37893a0f0b90b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Wed, 7 Dec 2022 15:10:33 +0100 Subject: [PATCH 037/147] [GITFLOW]Updating develop poms back to pre merge state --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index 23cbef3d05a..ec8a91fd49e 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.77.3 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index d808a1c17a6..6a49b253781 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.3 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 8fe4c8e9607..5a7625052ac 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.3 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index d381f6531fb..91db21e5987 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.77.3 + 1.78.0-SNAPSHOT ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 62cbba62b9a..8f1cf55d2b9 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.77.3 + 1.78.0-SNAPSHOT 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 58a5feda164..935d51a2397 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.3 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 789a4e5a101..05d2cab9ca1 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.3 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index b715db3decd..6c507e70a4e 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.3 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 94f03539cd8..2798d0cc469 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.3 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 0686d0fa4c9..04695198254 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.3 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 1ff4706a25a..7ceea1349a7 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.3 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 From f41f9c4fd0a3af7865912998ec523c5d4a1f4578 Mon Sep 17 00:00:00 2001 From: Frank T Date: Wed, 7 Dec 2022 15:42:07 +0100 Subject: [PATCH 038/147] #6053 add create/link buttons to person sideboxes (#11123) * #6053 add create/link buttons to person sideboxes * #6053 review findings * #6053 review findings --- .../symeda/sormas/api/caze/CaseDataDto.java | 25 +++--- .../symeda/sormas/api/contact/ContactDto.java | 8 ++ .../de/symeda/sormas/api/event/EventDto.java | 9 ++- .../symeda/sormas/ui/caze/CaseController.java | 42 ++++++++-- .../ui/caze/caselink/CaseListComponent.java | 12 ++- .../sormas/ui/contact/ContactController.java | 49 ++++++++++++ .../contactlink/ContactListComponent.java | 11 ++- .../sormas/ui/events/EventController.java | 78 +++++++++++++++++++ .../EventParticipantListComponent.java | 20 ++++- .../ExternalMessageProcessingUIHelper.java | 15 ++-- .../sormas/ui/person/PersonDataView.java | 8 +- 11 files changed, 238 insertions(+), 39 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java index 009dba67c12..0302774c667 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/caze/CaseDataDto.java @@ -29,13 +29,13 @@ import javax.validation.constraints.Min; import javax.validation.constraints.Size; -import de.symeda.sormas.api.activityascase.ActivityAsCaseDto; import org.apache.commons.lang3.StringUtils; import com.fasterxml.jackson.annotation.JsonIgnore; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.ImportIgnore; +import de.symeda.sormas.api.activityascase.ActivityAsCaseDto; import de.symeda.sormas.api.caze.maternalhistory.MaternalHistoryDto; import de.symeda.sormas.api.caze.porthealthinfo.PortHealthInfoDto; import de.symeda.sormas.api.clinicalcourse.ClinicalCourseDto; @@ -634,7 +634,7 @@ public static CaseDataDto buildFromContact(ContactDto contact) { HealthConditionsDto healthConditionsClone = null; try { - healthConditionsClone = (HealthConditionsDto)contact.getHealthConditions().clone(); + healthConditionsClone = (HealthConditionsDto) contact.getHealthConditions().clone(); healthConditionsClone.setUuid(DataHelper.createUuid()); } catch (CloneNotSupportedException e) { throw new RuntimeException(e); @@ -679,14 +679,7 @@ public static CaseDataDto buildFromEventParticipant(EventParticipantDto eventPar CaseDataDto caseData = CaseDataDto.build(eventParticipant.getPerson().toReference(), eventDisease); - if (person.getPresentCondition() != null - && person.getPresentCondition().isDeceased() - && eventDisease == person.getCauseOfDeathDisease() - && person.getDeathDate() != null - && Math.abs(person.getDeathDate().getTime() - eventParticipant.getCreationDate().getTime()) <= MILLISECONDS_30_DAYS) { - caseData.setOutcome(CaseOutcome.DECEASED); - caseData.setOutcomeDate(person.getDeathDate()); - } + updateCaseOutcome(caseData, person, eventDisease, eventParticipant.getCreationDate()); return caseData; } @@ -705,16 +698,20 @@ public static CaseDataDto buildFromTravelEntry(TravelEntryDto travelEntry, Perso caseData.setPointOfEntryDetails(travelEntry.getPointOfEntryDetails()); caseData.setReportDate(travelEntry.getReportDate()); + updateCaseOutcome(caseData, person, travelEntry.getDisease(), travelEntry.getReportDate()); + + return caseData; + } + + private static void updateCaseOutcome(CaseDataDto caseData, PersonDto person, Disease disease, Date creationDate) { if (person.getPresentCondition() != null && person.getPresentCondition().isDeceased() - && travelEntry.getDisease() == person.getCauseOfDeathDisease() + && disease == person.getCauseOfDeathDisease() && person.getDeathDate() != null - && Math.abs(person.getDeathDate().getTime() - travelEntry.getReportDate().getTime()) <= MILLISECONDS_30_DAYS) { + && Math.abs(person.getDeathDate().getTime() - creationDate.getTime()) <= MILLISECONDS_30_DAYS) { caseData.setOutcome(CaseOutcome.DECEASED); caseData.setOutcomeDate(person.getDeathDate()); } - - return caseData; } public CaseReferenceDto toReference() { diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactDto.java index a185733e18d..05e1c0a66c6 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactDto.java @@ -39,6 +39,7 @@ import de.symeda.sormas.api.infrastructure.community.CommunityReferenceDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; +import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.person.PersonReferenceDto; import de.symeda.sormas.api.sormastosormas.S2SIgnoreProperty; import de.symeda.sormas.api.sormastosormas.SormasToSormasConfig; @@ -377,6 +378,13 @@ public static ContactDto build(EventParticipantDto eventParticipant) { return contact; } + public static ContactDto build(PersonDto person) { + final ContactDto contact = build(); + contact.setPerson(person.toReference()); + + return contact; + } + public static ContactDto build(CaseDataDto caze) { return build(caze.toReference(), caze.getDisease(), caze.getDiseaseDetails(), caze.getDiseaseVariant()); } diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventDto.java index 9cee0dbd1cb..9d6cfc3ba30 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/event/EventDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/event/EventDto.java @@ -245,12 +245,19 @@ public static EventDto build() { return event; } - public static EventDto build(CountryReferenceDto country, UserDto user, Disease disease) { + public static EventDto build(CountryReferenceDto country, UserDto user) { EventDto event = build(); event.getEventLocation().setCountry(country); event.getEventLocation().setRegion(user.getRegion()); event.setReportingUser(user.toReference()); + + return event; + } + + public static EventDto build(CountryReferenceDto country, UserDto user, Disease disease) { + EventDto event = build(country, user); + event.setDisease(disease); return event; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java index 420a5f0df2c..379c7bb2674 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java @@ -185,7 +185,7 @@ public void registerViews(Navigator navigator) { } public void create() { - CommitDiscardWrapperComponent caseCreateComponent = getCaseCreateComponent(null, null, null, null, false); + CommitDiscardWrapperComponent caseCreateComponent = getCaseCreateComponent(null, null, null, null, null, false); VaadinUiUtil.showModalPopupWindow(caseCreateComponent, I18nProperties.getString(Strings.headingCreateNewCase)); } @@ -209,7 +209,8 @@ public void createFromEventParticipant(EventParticipantDto eventParticipant) { selectOrCreateCase(dto, FacadeProvider.getPersonFacade().getByUuid(eventParticipant.getPerson().getUuid()), uuid -> { if (uuid == null) { - CommitDiscardWrapperComponent caseCreateComponent = getCaseCreateComponent(null, eventParticipant, null, null, false); + CommitDiscardWrapperComponent caseCreateComponent = + getCaseCreateComponent(null, eventParticipant, null, null, null, false); caseCreateComponent.addCommitListener(() -> { EventParticipantDto updatedEventparticipant = FacadeProvider.getEventParticipantFacade().getByUuid(eventParticipant.getUuid()); if (updatedEventparticipant.getResultingCase() != null) { @@ -244,7 +245,8 @@ public void createFromEventParticipantDifferentDisease(EventParticipantDto event return; } - CommitDiscardWrapperComponent caseCreateComponent = getCaseCreateComponent(null, eventParticipant, null, disease, false); + CommitDiscardWrapperComponent caseCreateComponent = + getCaseCreateComponent(null, eventParticipant, null, null, disease, false); VaadinUiUtil.showModalPopupWindow(caseCreateComponent, I18nProperties.getString(Strings.headingCreateNewCase)); } @@ -261,7 +263,7 @@ public void createFromContact(ContactDto contact) { selectOrCreateCase(dto, FacadeProvider.getPersonFacade().getByUuid(selectedPerson.getUuid()), uuid -> { if (uuid == null) { - CommitDiscardWrapperComponent caseCreateComponent = getCaseCreateComponent(contact, null, null, null, false); + CommitDiscardWrapperComponent caseCreateComponent = getCaseCreateComponent(contact, null, null, null, null, false); caseCreateComponent.addCommitListener(() -> { ContactDto contactDto = FacadeProvider.getContactFacade().getByUuid(contact.getUuid()); if (contactDto.getResultingCase() != null) { @@ -293,7 +295,7 @@ public void createFromContact(ContactDto contact) { } public void createFromUnrelatedContact(ContactDto contact, Disease disease) { - CommitDiscardWrapperComponent caseCreateComponent = getCaseCreateComponent(contact, null, null, disease, false); + CommitDiscardWrapperComponent caseCreateComponent = getCaseCreateComponent(contact, null, null, null, disease, false); VaadinUiUtil.showModalPopupWindow(caseCreateComponent, I18nProperties.getString(Strings.headingCreateNewCase)); } @@ -305,7 +307,8 @@ public void createFromTravelEntry(TravelEntryDto travelEntryDto) { selectOrCreateCase(dto, FacadeProvider.getPersonFacade().getByUuid(selectedPerson.getUuid()), uuid -> { if (uuid == null) { - CommitDiscardWrapperComponent caseCreateComponent = getCaseCreateComponent(null, null, travelEntryDto, null, false); + CommitDiscardWrapperComponent caseCreateComponent = + getCaseCreateComponent(null, null, travelEntryDto, null, null, false); VaadinUiUtil.showModalPopupWindow(caseCreateComponent, I18nProperties.getString(Strings.headingCreateNewCase)); } else { TravelEntryDto updatedTravelEntry = FacadeProvider.getTravelEntryFacade().getByUuid(travelEntryDto.getUuid()); @@ -316,6 +319,23 @@ public void createFromTravelEntry(TravelEntryDto travelEntryDto) { }); } + public void createFromPersonReference(PersonReferenceDto personReference) { + PersonDto person = FacadeProvider.getPersonFacade().getByUuid(personReference.getUuid()); + CaseDataDto dto = CaseDataDto.build(personReference, null); + + dto.setReportingUser(UserProvider.getCurrent().getUserReference()); + + selectOrCreateCase(dto, person, uuid -> { + if (uuid == null) { + CommitDiscardWrapperComponent caseCreateComponent = getCaseCreateComponent(null, null, null, person, null, false); + caseCreateComponent.getWrappedComponent().setSearchedPerson(person); + VaadinUiUtil.showModalPopupWindow(caseCreateComponent, I18nProperties.getString(Strings.headingCreateNewCase)); + } else { + navigateToView(CaseDataView.VIEW_NAME, uuid, null); + } + }); + } + public void convertSamePersonContactsAndEventParticipants(CaseDataDto caze, Runnable callback) { List matchingContacts; @@ -592,6 +612,7 @@ public CommitDiscardWrapperComponent getCaseCreateComponent( ContactDto convertedContact, EventParticipantDto convertedEventParticipant, TravelEntryDto convertedTravelEntry, + PersonDto convertedPerson, Disease unrelatedDisease, boolean createdFromLabMessage) { @@ -641,8 +662,9 @@ public CommitDiscardWrapperComponent getCaseCreateComponent( caze = CaseDataDto.buildFromTravelEntry(convertedTravelEntry, person); } else { symptoms = null; - person = null; - caze = CaseDataDto.build(null, null); + person = convertedPerson; + PersonReferenceDto personreference = person == null ? null : person.toReference(); + caze = CaseDataDto.build(personreference, null); } UserDto user = UserProvider.getCurrent().getUser(); @@ -674,6 +696,10 @@ public CommitDiscardWrapperComponent getCaseCreateComponent( createForm.setDiseaseReadOnly(true); } + if (convertedPerson != null) { + createForm.setPersonalDetailsReadOnlyIfNotEmpty(true); + } + final CommitDiscardWrapperComponent editView = new CommitDiscardWrapperComponent( createForm, UserProvider.getCurrent().hasUserRight(UserRight.CASE_CREATE), diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/caselink/CaseListComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/caselink/CaseListComponent.java index 79a5a388028..9ec93753043 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/caselink/CaseListComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/caselink/CaseListComponent.java @@ -1,5 +1,7 @@ package de.symeda.sormas.ui.caze.caselink; +import java.util.function.Consumer; + import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.themes.ValoTheme; @@ -9,6 +11,7 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.person.PersonReferenceDto; +import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; @@ -16,8 +19,13 @@ public class CaseListComponent extends SideComponent { - public CaseListComponent(PersonReferenceDto personReferenceDto) { - super(I18nProperties.getString(Strings.entityCases)); + public CaseListComponent(PersonReferenceDto personReferenceDto, Consumer actionCallback) { + + super(I18nProperties.getString(Strings.entityCases), actionCallback); + + addCreateButton(I18nProperties.getCaption(Captions.caseNewCase), () -> { + ControllerProvider.getCaseController().createFromPersonReference(personReferenceDto); + }, UserRight.CASE_CREATE); CaseList caseList = new CaseList(personReferenceDto); addComponent(caseList); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java index 5884a45714f..3c15c21b9fb 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactController.java @@ -281,6 +281,14 @@ public void create(EventParticipantReferenceDto eventParticipantRef) { VaadinUiUtil.showModalPopupWindow(createComponent, I18nProperties.getString(Strings.headingCreateNewContact)); } + public void create(PersonReferenceDto personRef) { + PersonDto person = FacadeProvider.getPersonFacade().getByUuid(personRef.getUuid()); + + CommitDiscardWrapperComponent createComponent = getContactCreateComponent(person); + createComponent.getWrappedComponent().getPersonCreateForm().setSearchedPerson(person); + VaadinUiUtil.showModalPopupWindow(createComponent, I18nProperties.getString(Strings.headingCreateNewContact)); + } + public void navigateToData(String contactUuid) { navigateToData(contactUuid, false); } @@ -366,6 +374,14 @@ private ContactDto createNewContact(EventParticipantDto eventParticipant) { return contact; } + private ContactDto createNewContact(PersonDto person) { + ContactDto contact = ContactDto.build(person); + + setDefaults(contact); + + return contact; + } + private void setDefaults(ContactDto contact) { UserDto user = UserProvider.getCurrent().getUser(); contact.setReportingUser(user.toReference()); @@ -536,6 +552,39 @@ public CommitDiscardWrapperComponent getContactCreateComponen return createComponent; } + public CommitDiscardWrapperComponent getContactCreateComponent(PersonDto person) { + final ContactCreateForm createForm; + + createForm = new ContactCreateForm(null, false, false, true); + createForm.setValue(createNewContact(person)); + createForm.setPerson(person); + createForm.setPersonDetailsReadOnly(); + + final CommitDiscardWrapperComponent createComponent = new CommitDiscardWrapperComponent<>( + createForm, + UserProvider.getCurrent().hasUserRight(UserRight.CONTACT_CREATE), + createForm.getFieldGroup()); + + createComponent.addCommitListener(() -> { + if (!createForm.getFieldGroup().isModified()) { + final ContactDto dto = createForm.getValue(); + PersonFacade personFacade = FacadeProvider.getPersonFacade(); + PersonDto personDto = personFacade.getByUuid(dto.getPerson().getUuid()); + transferDataToPerson(createForm, personDto); + personFacade.save(personDto); + + selectOrCreateContact(dto, personDto, selectedContactUuid -> { + if (selectedContactUuid != null) { + editData(selectedContactUuid); + } + }); + + } + }); + + return createComponent; + } + private void selectOrCreateContact(final ContactDto contact, final PersonDto personDto, Consumer resultConsumer) { selectOrCreateContact(contact, personDto.toReference(), resultConsumer); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/contactlink/ContactListComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/contactlink/ContactListComponent.java index 9cc315e6b46..601dd0736ab 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/contactlink/ContactListComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/contactlink/ContactListComponent.java @@ -1,5 +1,7 @@ package de.symeda.sormas.ui.contact.contactlink; +import java.util.function.Consumer; + import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.themes.ValoTheme; @@ -9,6 +11,7 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.person.PersonReferenceDto; +import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; @@ -16,8 +19,12 @@ public class ContactListComponent extends SideComponent { - public ContactListComponent(PersonReferenceDto personReferenceDto) { - super(I18nProperties.getString(Strings.entityContacts)); + public ContactListComponent(PersonReferenceDto personReferenceDto, Consumer actionCallback) { + super(I18nProperties.getString(Strings.entityContacts), actionCallback); + + addCreateButton(I18nProperties.getCaption(Captions.contactNewContact), () -> { + ControllerProvider.getContactController().create(personReferenceDto); + }, UserRight.CONTACT_CREATE); ContactList contactList = new ContactList(personReferenceDto); addComponent(contactList); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java index 341f810166d..5dc3837bbac 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java @@ -69,6 +69,7 @@ import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.api.person.PersonReferenceDto; import de.symeda.sormas.api.user.UserDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DataHelper; @@ -130,6 +131,13 @@ public EventDto createFromContactList(List contactRefs) { return eventDto; } + public EventDto create(PersonReferenceDto personReference) { + CommitDiscardWrapperComponent eventCreateComponent = getEventCreateComponent(personReference); + EventDto eventDto = eventCreateComponent.getWrappedComponent().getValue(); + VaadinUiUtil.showModalPopupWindow(eventCreateComponent, I18nProperties.getString(Strings.headingCreateNewEvent)); + return eventDto; + } + public EventDto createSubordinateEvent(EventReferenceDto superordinateEvent) { CommitDiscardWrapperComponent eventCreateComponent = getEventCreateComponent(superordinateEvent, false); EventDto eventDto = eventCreateComponent.getWrappedComponent().getValue(); @@ -413,6 +421,38 @@ public void selectOrCreateEvent(ContactDto contact) { VaadinUiUtil.showModalPopupWindow(component, I18nProperties.getString(Strings.headingPickOrCreateEvent)); } + public void selectOrCreateEvent(PersonReferenceDto personReference) { + + EventSelectionField eventSelect = new EventSelectionField(null, I18nProperties.getString(Strings.infoPickOrCreateEventForContact), null); + eventSelect.setWidth(1100, Sizeable.Unit.PIXELS); + + final CommitDiscardWrapperComponent component = new CommitDiscardWrapperComponent<>(eventSelect); + component.addCommitListener(() -> { + EventIndexDto selectedEvent = eventSelect.getValue(); + if (selectedEvent != null) { + + EventCriteria eventCriteria = new EventCriteria(); + eventCriteria.setPerson(personReference); + eventCriteria.setUserFilterIncluded(false); + List eventIndexDto = FacadeProvider.getEventFacade().getIndexList(eventCriteria, null, null, null); + + EventReferenceDto eventReferenceDto = new EventReferenceDto(selectedEvent.getUuid()); + if (!eventIndexDto.contains(selectedEvent)) { + createEventParticipantWithPerson(eventReferenceDto, personReference); + } + } else { + create(personReference); + } + SormasUI.refreshView(); + }); + + eventSelect.setSelectionChangeCallback((commitAllowed) -> { + component.getCommitButton().setEnabled(commitAllowed); + }); + + VaadinUiUtil.showModalPopupWindow(component, I18nProperties.getString(Strings.headingPickOrCreateEvent)); + } + public void selectOrCreateSubordinateEvent(EventReferenceDto superordinateEventRef) { Set excludedUuids = new HashSet<>(); @@ -527,6 +567,14 @@ public void createEventParticipantWithContact(EventReferenceDto eventReferenceDt }, eventParticipantDto); } + public void createEventParticipantWithPerson(EventReferenceDto eventReferenceDto, PersonReferenceDto personReference) { + final PersonDto personDto = FacadeProvider.getPersonFacade().getByUuid(personReference.getUuid()); + final EventParticipantDto eventParticipantDto = + new EventParticipantDto().buildFromPerson(personDto, eventReferenceDto, UserProvider.getCurrent().getUserReference()); + ControllerProvider.getEventParticipantController().createEventParticipant(eventReferenceDto, r -> { + }, eventParticipantDto); + } + public void navigateToIndex() { String navigationState = EventsView.VIEW_NAME; SormasUI.get().getNavigator().navigateTo(navigationState); @@ -678,6 +726,32 @@ public CommitDiscardWrapperComponent getEventCreateComponentForCo return editView; } + public CommitDiscardWrapperComponent getEventCreateComponent(PersonReferenceDto personReference) { + + EventDataForm eventCreateForm = new EventDataForm(true, false, true); // Valid because jurisdiction doesn't matter for entities that are about to be created + eventCreateForm.setValue(createNewEvent()); + + final CommitDiscardWrapperComponent editView = new CommitDiscardWrapperComponent<>( + eventCreateForm, + UserProvider.getCurrent().hasUserRight(UserRight.EVENT_CREATE), + eventCreateForm.getFieldGroup()); + + editView.addCommitListener(() -> { + if (!eventCreateForm.getFieldGroup().isModified()) { + EventDto dto = eventCreateForm.getValue(); + FacadeProvider.getEventFacade().save(dto); + Notification.show(I18nProperties.getString(Strings.messageEventCreated), Type.TRAY_NOTIFICATION); + + EventReferenceDto createdEvent = new EventReferenceDto(dto.getUuid()); + + createEventParticipantWithPerson(createdEvent, personReference); + SormasUI.refreshView(); + } + }); + + return editView; + } + public CommitDiscardWrapperComponent getEventCreateComponent(ContactDto contact) { EventDataForm eventCreateForm = new EventDataForm(true, false, true); // Valid because jurisdiction doesn't matter for entities that are about to be created @@ -919,6 +993,10 @@ private int bulkEdit( eventManagementStatusChange); } + public EventDto createNewEvent() { + return EventDto.build(FacadeProvider.getCountryFacade().getServerCountry(), UserProvider.getCurrent().getUser()); + } + public EventDto createNewEvent(Disease disease) { return EventDto.build(FacadeProvider.getCountryFacade().getServerCountry(), UserProvider.getCurrent().getUser(), disease); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventParticipantLink/EventParticipantListComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventParticipantLink/EventParticipantListComponent.java index c0b696fa29d..ec01e7178b5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventParticipantLink/EventParticipantListComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventParticipantLink/EventParticipantListComponent.java @@ -1,14 +1,18 @@ package de.symeda.sormas.ui.events.eventParticipantLink; +import java.util.function.Consumer; + import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.themes.ValoTheme; +import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.event.EventCriteria; 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.api.person.PersonReferenceDto; +import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; @@ -16,8 +20,20 @@ public class EventParticipantListComponent extends SideComponent { - public EventParticipantListComponent(PersonReferenceDto personReferenceDto) { - super(I18nProperties.getString(Strings.entityEvents)); + public EventParticipantListComponent(PersonReferenceDto personReferenceDto, Consumer actionCallback) { + super(I18nProperties.getString(Strings.entityEvents), actionCallback); + + addCreateButton(I18nProperties.getCaption(Captions.linkEvent), () -> { + EventCriteria eventCriteria = new EventCriteria(); + + //check if there are active events in the database + long events = FacadeProvider.getEventFacade().count(eventCriteria); + if (events > 0) { + ControllerProvider.getEventController().selectOrCreateEvent(personReferenceDto); + } else { + ControllerProvider.getEventController().create(personReferenceDto); + } + }, UserRight.EVENTPARTICIPANT_CREATE); EventParticipantList eventParticipantList = new EventParticipantList(personReferenceDto); addComponent(eventParticipantList); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/processing/ExternalMessageProcessingUIHelper.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/processing/ExternalMessageProcessingUIHelper.java index 3af7fbbad15..404d2b674a5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/processing/ExternalMessageProcessingUIHelper.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/processing/ExternalMessageProcessingUIHelper.java @@ -159,7 +159,7 @@ public static void showCreateCaseWindow( Window window = VaadinUiUtil.createPopupWindow(); CommitDiscardWrapperComponent caseCreateComponent = - ControllerProvider.getCaseController().getCaseCreateComponent(null, null, null, null, true); + ControllerProvider.getCaseController().getCaseCreateComponent(null, null, null, null, null, true); caseCreateComponent.addCommitListener(() -> { LabMessageProcessingHelper.updateAddressAndSavePerson( FacadeProvider.getPersonFacade().getByUuid(caseCreateComponent.getWrappedComponent().getValue().getPerson().getUuid()), @@ -206,12 +206,13 @@ public static void showEditSampleWindow( I18nProperties.getString(Strings.headingExternalMessageProcessSample), false, false); - sampleEditComponent.addDoneListener(() -> { - // prevent discard on close - closeListener.remove(); - // close after commit/discard - window.close(); - }); + sampleEditComponent.addDoneListener( + () -> { + // prevent discard on close + closeListener.remove(); + // close after commit/discard + window.close(); + }); } private static CommitDiscardWrapperComponent getSampleEditComponent( diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonDataView.java index f442811d757..8c17e47d1d7 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonDataView.java @@ -103,20 +103,22 @@ protected void initView(String params) { if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.CASE_SURVEILANCE) && currentUser != null && currentUser.hasUserRight(UserRight.CASE_VIEW)) { - layout.addComponent(new SideComponentLayout(new CaseListComponent(getReference())), CASES_LOC); + layout.addComponent(new SideComponentLayout(new CaseListComponent(getReference(), this::showUnsavedChangesPopup)), CASES_LOC); } if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.CONTACT_TRACING) && currentUser != null && currentUser.hasUserRight(UserRight.CONTACT_VIEW)) { - layout.addComponent(new SideComponentLayout(new ContactListComponent(getReference())), CONTACTS_LOC); + layout.addComponent(new SideComponentLayout(new ContactListComponent(getReference(), this::showUnsavedChangesPopup)), CONTACTS_LOC); } if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.EVENT_SURVEILLANCE) && currentUser != null && currentUser.hasUserRight(UserRight.EVENT_VIEW) && currentUser.hasUserRight(UserRight.EVENTPARTICIPANT_VIEW)) { - layout.addComponent(new SideComponentLayout(new EventParticipantListComponent(getReference())), EVENT_PARTICIPANTS_LOC); + layout.addComponent( + new SideComponentLayout(new EventParticipantListComponent(getReference(), this::showUnsavedChangesPopup)), + EVENT_PARTICIPANTS_LOC); } if (FacadeProvider.getConfigFacade().isConfiguredCountry(CountryHelper.COUNTRY_CODE_GERMANY) From 850c50ce748d60b62a3cd10e9d31a7fb22fc487a Mon Sep 17 00:00:00 2001 From: dinua Date: Thu, 8 Dec 2022 11:35:47 +0200 Subject: [PATCH 039/147] #8438 fix date validation --- .../main/java/de/symeda/sormas/ui/events/EventDataForm.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java index 2fe0cff6e39..6fc8418c8e4 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataForm.java @@ -475,8 +475,7 @@ protected void addFields() { false, I18nProperties.getValidationError(Validations.beforeDate, startDate.getCaption(), reportDate.getCaption()))); - reportDate.addValueChangeListener(e -> startDate.setValidationVisible(!startDate.isValid())); - startDate.addValueChangeListener(e -> reportDate.setValidationVisible(!reportDate.isValid())); + DateComparisonValidator.dateFieldDependencyValidationVisibility(startDate, reportDate); FieldHelper.setVisibleWhen(getFieldGroup(), EventDto.END_DATE, EventDto.MULTI_DAY_EVENT, Collections.singletonList(true), true); FieldHelper.setCaptionWhen( From c9f3fa6d7ec7f9b59e10cde79b64c6163c90c61d Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Thu, 8 Dec 2022 12:03:10 +0100 Subject: [PATCH 040/147] fixes --- .../features/sanity/web/Columns.feature | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Columns.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Columns.feature index b1c48024c44..393316af75e 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Columns.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Columns.feature @@ -19,26 +19,12 @@ Scenario Outline: Sort column alphabetically in Tasks directory |5 | |6 | |7 | + |10 | |11 | |12 | |13 | |14 | -@env_main @tmsLink=SORDEV-5342 @Task -Scenario Outline: Sort column by last name in Tasks directory - Given I log in as a National User - And I click on the Tasks button from navbar - When I click the header of column - Then I check that column is sorted by last name in ascending order - And I check that an upwards arrow appears in the header of column - When I click the header of column - Then I check that column is sorted by last name in descending order - And I check that a downwards arrow appears in the header of column - - Examples: - | col | - |10 | - @env_main @tmsLink=SORDEV-5342 @Task Scenario Outline: Sort column by date and time in Tasks directory Given I log in as a National User From 589a3d7d7be73aa7e010836329e94732793a109e Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 8 Dec 2022 13:31:44 +0100 Subject: [PATCH 041/147] fix --- .../src/test/resources/features/sanity/web/Case.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index fe809784302..3d956ecdd01 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1043,7 +1043,7 @@ Feature: Case end to end tests And I click on the NEW CASE button When I fill new case data for duplicates merge with for one person data And I click on Save button in Case form - And I Pick a new person in Pick or create person popup during case creation + #And I Pick a new person in Pick or create person popup during case creation Then I check the created data for duplicated case is correctly displayed on Edit case page And I set Vaccination status to "Vaccinated" on Edit Case page And I click on save button from Edit Case page From 0c547094be8bc159643f285a44b753c6bf7c924f Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 8 Dec 2022 14:19:46 +0100 Subject: [PATCH 042/147] fix --- .../src/test/resources/features/sanity/web/Case.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index 3d956ecdd01..643709c17f9 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1639,7 +1639,7 @@ Feature: Case end to end tests And I select the German words for Antigen Detection Test as Type of Test in the Create New Sample popup And I set date of sample collection to 5 day ago in Sample form And I set Final Laboratory Result to "Positiv" on Create new Sample page - And I save the created sample + And I save the created sample with pathogen test And I check that text appearing in hover over Expected Follow-up is based on Symptoms collection date @tmsLink=SORDEV-5141 @env_main From 150b04106596641416d712d386b19bff5882a2d6 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 8 Dec 2022 15:20:47 +0100 Subject: [PATCH 043/147] sorqa-699 fix --- .../e2etests/pages/application/cases/CaseDirectoryPage.java | 3 +++ .../steps/web/application/cases/CaseDirectorySteps.java | 3 +++ .../src/test/resources/features/sanity/web/Case.feature | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/CaseDirectoryPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/CaseDirectoryPage.java index 7d41fc749c2..c3ccd944397 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/CaseDirectoryPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/CaseDirectoryPage.java @@ -150,6 +150,9 @@ public static final By getCaseResultsUuidLocator(String uuid) { public static final By ACTION_OKAY = By.id("actionOkay"); public static final By MERGE_DUPLICATES_BUTTON = By.id("caseMergeDuplicates"); public static final By ENTER_BULK_EDIT_MODE = By.id("actionEnterBulkEditMode"); + + public static final By BULK_EDIT_INFORMATION = + By.xpath("//div[@class='v-window-header' and text()='Massenbearbeitung aktivieren']"); public static final By LEAVE_BULK_EDIT_MODE = By.id("actionLeaveBulkEditMode"); public static final By ALL_RESULTS_CHECKBOX = By.xpath("//th[@role='columnheader']//input[@type='checkbox']/../.."); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java index 0c2e1894107..140d2cdda7f 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CaseDirectorySteps.java @@ -277,6 +277,9 @@ public CaseDirectorySteps( "I click Enter Bulk Edit Mode on Case directory page", () -> { webDriverHelpers.clickOnWebElementBySelector(ENTER_BULK_EDIT_MODE); + if (webDriverHelpers.isElementVisibleWithTimeout(BULK_EDIT_INFORMATION, 10)) { + webDriverHelpers.clickOnWebElementBySelector(CONFIRM_POPUP); + } webDriverHelpers.waitForPageLoadingSpinnerToDisappear(100); }); When( diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index 643709c17f9..788d4e1f4cf 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1856,7 +1856,7 @@ Feature: Case end to end tests Then I click download in case document create page in DE When I check if downloaded docx file is correct - @tmsLink=SORDEV-12446 @env_s2s_1 + @tmsLink=SORDEV-12446 @env_s2s_1 @testIt Scenario: Hide share action in bulk mode for cases Given I log in as a Admin User Then I click on the Cases button from navbar From 2b1572b4910b2fe4a6addaecfd1edf1ee2286de4 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 8 Dec 2022 15:22:10 +0100 Subject: [PATCH 044/147] sorqa-699 fix --- .../src/test/resources/features/sanity/web/Case.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index 788d4e1f4cf..643709c17f9 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1856,7 +1856,7 @@ Feature: Case end to end tests Then I click download in case document create page in DE When I check if downloaded docx file is correct - @tmsLink=SORDEV-12446 @env_s2s_1 @testIt + @tmsLink=SORDEV-12446 @env_s2s_1 Scenario: Hide share action in bulk mode for cases Given I log in as a Admin User Then I click on the Cases button from navbar From dc4c85d77bde917c0067deb1539e1745a99fce18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 8 Dec 2022 15:25:20 +0100 Subject: [PATCH 045/147] #4060 - Manual archiving of tasks --- .../de/symeda/sormas/api/task/TaskFacade.java | 4 ++ .../de/symeda/sormas/api/user/UserRight.java | 2 + .../src/main/resources/strings.properties | 6 ++- .../sormas/backend/task/TaskFacadeEjb.java | 13 ++++- .../sormas/backend/task/TaskService.java | 13 +++++ .../src/main/resources/sql/sormas_schema.sql | 13 +++++ .../symeda/sormas/ui/task/TaskController.java | 52 +++++++++++++++++++ 7 files changed, 100 insertions(+), 3 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskFacade.java b/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskFacade.java index f1be4cd70f1..6d2d5f60ea0 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskFacade.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/task/TaskFacade.java @@ -76,6 +76,10 @@ public interface TaskFacade { void updateArchived(List taskUuids, boolean archived); + void updateArchived(String taskUuid, boolean archived); + + boolean isArchived(String taskUuid); + List getArchivedUuidsSince(Date since); List getObsoleteUuidsSince(Date since); 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 95eaa41f5fc..fb0eceefd08 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 @@ -110,6 +110,7 @@ public enum UserRight { TASK_DELETE(UserRightGroup.TASK, UserRight._TASK_VIEW), TASK_EXPORT(UserRightGroup.TASK, UserRight._TASK_VIEW), TASK_ASSIGN(UserRightGroup.TASK, UserRight._TASK_EDIT), + TASK_ARCHIVE(UserRightGroup.TASK, UserRight._TASK_VIEW), ACTION_CREATE(UserRightGroup.EVENT, UserRight._EVENT_VIEW), ACTION_DELETE(UserRightGroup.EVENT, UserRight._EVENT_VIEW, UserRight._DOCUMENT_DELETE), @@ -317,6 +318,7 @@ public enum UserRight { public static final String _TASK_ASSIGN = "TASK_ASSIGN"; public static final String _TASK_DELETE = "TASK_DELETE"; public static final String _TASK_EXPORT = "TASK_EXPORT"; + public static final String _TASK_ARCHIVE = "TASK_ARCHIVE"; public static final String _ACTION_CREATE = "ACTION_CREATE"; public static final String _ACTION_DELETE = "ACTION_DELETE"; public static final String _ACTION_EDIT = "ACTION_EDIT"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index f0601a705f9..0013c413d63 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java index b2dac4cc3f7..27703e92557 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskFacadeEjb.java @@ -997,11 +997,22 @@ private void validate(TaskDto task) throws ValidationRuntimeException { } @Override - @RightsAllowed(UserRight._TASK_EDIT) + @RightsAllowed(UserRight._TASK_ARCHIVE) public void updateArchived(List taskUuids, boolean archived) { IterableHelper.executeBatched(taskUuids, ARCHIVE_BATCH_SIZE, e -> taskService.updateArchived(e, archived)); } + @Override + @RightsAllowed(UserRight._TASK_ARCHIVE) + public void updateArchived(String taskUuid, boolean archived) { + taskService.updateArchived(Collections.singletonList(taskUuid), archived); + } + + @Override + public boolean isArchived(String taskUuid) { + return taskService.isArchived(taskUuid); + } + @Override public List getArchivedUuidsSince(Date since) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java index d2e726bfafd..f93749799d1 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/TaskService.java @@ -63,6 +63,7 @@ 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.AdoServiceWithUserFilterAndJurisdiction; import de.symeda.sormas.backend.common.CriteriaBuilderHelper; import de.symeda.sormas.backend.common.JurisdictionFlagsService; @@ -725,6 +726,18 @@ public void updateArchived(List taskUuids, boolean archived) { em.createQuery(cu).executeUpdate(); } + public boolean isArchived(String taskUuid) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Long.class); + Root from = cq.from(getElementClass()); + + cq.where(cb.and(cb.equal(from.get(Task.ARCHIVED), true), cb.equal(from.get(AbstractDomainObject.UUID), taskUuid))); + cq.select(cb.count(from)); + long count = em.createQuery(cq).getSingleResult(); + return count > 0; + } + @Override public TaskJurisdictionFlagsDto getJurisdictionFlags(Task entity) { diff --git a/sormas-backend/src/main/resources/sql/sormas_schema.sql b/sormas-backend/src/main/resources/sql/sormas_schema.sql index e267770fe87..fea9bca0898 100644 --- a/sormas-backend/src/main/resources/sql/sormas_schema.sql +++ b/sormas-backend/src/main/resources/sql/sormas_schema.sql @@ -12243,4 +12243,17 @@ ALTER TABLE externalmessage_history ADD COLUMN reportmessageid varchar(255); INSERT INTO schema_version (version_number, comment) VALUES (503, '[DEMIS2SORMAS] Add a Field for the NotificationBundleId to the External Message and map it when processing #10826'); +-- 2022-12-08 Add task archive user right #4060 +INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'TASK_ARCHIVE' FROM public.userroles WHERE userroles.linkeddefaultuserrole = 'ADMIN'; +INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'TASK_ARCHIVE' FROM public.userroles WHERE userroles.linkeddefaultuserrole = 'NATIONAL_USER'; +INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'TASK_ARCHIVE' FROM public.userroles WHERE userroles.linkeddefaultuserrole = 'ADMIN_SUPERVISOR'; +INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'TASK_ARCHIVE' FROM public.userroles WHERE userroles.linkeddefaultuserrole = 'SURVEILLANCE_SUPERVISOR'; +INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'TASK_ARCHIVE' FROM public.userroles WHERE userroles.linkeddefaultuserrole = 'CONTACT_SUPERVISOR'; +INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'TASK_ARCHIVE' FROM public.userroles WHERE userroles.linkeddefaultuserrole = 'CASE_SUPERVISOR'; +INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'TASK_ARCHIVE' FROM public.userroles WHERE userroles.linkeddefaultuserrole = 'NATIONAL_CLINICIAN'; +INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'TASK_ARCHIVE' FROM public.userroles WHERE userroles.linkeddefaultuserrole = 'POE_SUPERVISOR'; +INSERT INTO userroles_userrights (userrole_id, userright) SELECT id, 'TASK_ARCHIVE' FROM public.userroles WHERE userroles.linkeddefaultuserrole = 'POE_NATIONAL_USER'; + +INSERT INTO schema_version (version_number, comment) VALUES (504, 'Add task archive user right #4060'); + -- *** 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/task/TaskController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java index 14d8106187c..acaefe4eef5 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java @@ -22,15 +22,19 @@ import java.util.stream.Collectors; import com.vaadin.server.Page; +import com.vaadin.ui.Alignment; +import com.vaadin.ui.Button; import com.vaadin.ui.Label; import com.vaadin.ui.Notification; import com.vaadin.ui.Notification.Type; import com.vaadin.ui.UI; import com.vaadin.ui.Window; +import com.vaadin.ui.themes.ValoTheme; import de.symeda.sormas.api.Disease; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.ReferenceDto; +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.api.sample.SampleDto; @@ -41,7 +45,10 @@ import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.utils.ArchivingController; +import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; +import de.symeda.sormas.ui.utils.DirtyCheckPopup; import de.symeda.sormas.ui.utils.VaadinUiUtil; public class TaskController { @@ -136,6 +143,31 @@ public void edit(TaskIndexDto dto, Runnable callback, boolean editedFromTaskGrid callback.run(); }, I18nProperties.getString(Strings.entityTask)); } + + // Initialize 'Archive' button + if (UserProvider.getCurrent().hasUserRight(UserRight.TASK_ARCHIVE)) { + boolean archived = FacadeProvider.getTaskFacade().isArchived(dto.getUuid()); + Button archiveButton = ButtonHelper.createButton( + ArchivingController.ARCHIVE_DEARCHIVE_BUTTON_ID, + I18nProperties.getCaption(archived ? Captions.actionDearchiveCoreEntity : Captions.actionArchiveCoreEntity), + e -> { + if (editView.isDirty()) { + DirtyCheckPopup.show(editView, () -> archiveOrDearchive(newDto, !archived, () -> { + popupWindow.close(); + callback.run(); + })); + } else { + archiveOrDearchive(newDto, !archived, () -> { + popupWindow.close(); + callback.run(); + }); + } + }, + ValoTheme.BUTTON_LINK); + + editView.getButtonsPanel().addComponentAsFirst(archiveButton); + editView.getButtonsPanel().setComponentAlignment(archiveButton, Alignment.BOTTOM_LEFT); + } } private TaskDto createNewTask(TaskContext context, ReferenceDto entityRef) { @@ -211,6 +243,26 @@ public void showBulkTaskDataEditComponent(Collection sel editView.addDiscardListener(popupWindow::close); } + private void archiveOrDearchive(TaskDto task, boolean archive, Runnable callback) { + + VaadinUiUtil.showConfirmationPopup( + archive ? I18nProperties.getString(Strings.headingConfirmArchiving) : I18nProperties.getString(Strings.headingConfirmDearchiving), + new Label( + archive ? I18nProperties.getString(Strings.confirmationArchiveTask) : I18nProperties.getString(Strings.confirmationDearchiveTask)), + I18nProperties.getString(Strings.yes), + I18nProperties.getString(Strings.no), + null, + e -> { + if (Boolean.TRUE.equals(e)) { + FacadeProvider.getTaskFacade().updateArchived(task.getUuid(), archive); + callback.run(); + Notification.show(I18nProperties.getString(Strings.messageTasksArchived), Type.ASSISTIVE_NOTIFICATION); + } + + callback.run(); + }); + } + public void archiveAllSelectedItems(Collection selectedRows, Runnable callback) { if (selectedRows.size() == 0) { From 18c5ee2817408f6f170635117044c7953b7c1c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 8 Dec 2022 15:59:20 +0100 Subject: [PATCH 046/147] #4606 - i18n constants --- sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java | 2 ++ 1 file changed, 2 insertions(+) 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 92a89841cdf..a8808611374 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 @@ -1234,6 +1234,8 @@ public interface Strings { String messageSymptomsVisitHint = "messageSymptomsVisitHint"; String messageSystemFollowUpCanceled = "messageSystemFollowUpCanceled"; String messageSystemFollowUpCanceledByDropping = "messageSystemFollowUpCanceledByDropping"; + String messageTaskArchived = "messageTaskArchived"; + String messageTaskDearchived = "messageTaskDearchived"; String messageTasksArchived = "messageTasksArchived"; String messageTasksDearchived = "messageTasksDearchived"; String messageTasksDeleted = "messageTasksDeleted"; From aead8571d40a4c1106e83dde0a398c7aff4924b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 8 Dec 2022 16:00:40 +0100 Subject: [PATCH 047/147] #4606 - Messages update --- .../main/java/de/symeda/sormas/ui/task/TaskController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java index acaefe4eef5..b19558c8ba3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java @@ -256,7 +256,9 @@ private void archiveOrDearchive(TaskDto task, boolean archive, Runnable callback if (Boolean.TRUE.equals(e)) { FacadeProvider.getTaskFacade().updateArchived(task.getUuid(), archive); callback.run(); - Notification.show(I18nProperties.getString(Strings.messageTasksArchived), Type.ASSISTIVE_NOTIFICATION); + Notification.show( + archive ? I18nProperties.getString(Strings.messageTaskArchived) : I18nProperties.getString(Strings.messageTaskDearchived), + Type.ASSISTIVE_NOTIFICATION); } callback.run(); From 75f7e5498556bc1192282c8f63aeb789e6850f09 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 8 Dec 2022 16:06:10 +0100 Subject: [PATCH 048/147] hospinf user skiped in login testing because of a bug with language detection --- .../src/test/resources/features/sanity/web/Login.feature | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature index f92260de4da..19eff9b0e98 100755 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature @@ -25,7 +25,7 @@ Feature: Login with different type of users | Admin Surveillance Supervisor | | Contact Officer | | Community Officer | - | Hospital Informant | + # | Hospital Informant | | Clinician | @env_de @LoginDe @@ -54,7 +54,7 @@ Feature: Login with different type of users | Admin Surveillance Supervisor | | Contact Officer | | Community Officer | - | Hospital Informant | + # | Hospital Informant | | Clinician | @env_keycloak @LoginKeycloak From fae5dd51a626948da2ed45af0178c73d217910c3 Mon Sep 17 00:00:00 2001 From: Razvan Date: Thu, 8 Dec 2022 18:01:06 +0200 Subject: [PATCH 049/147] #1111FixHospitalInformantLoginTest : added fix into language library --- sormas-e2e-tests/build.gradle | 6 +-- .../strings/LanguageDetectorHelper.java | 23 ++++++---- .../manager/EnvironmentManager.java | 44 ++++++++++++++----- .../e2etests/runner/CucumberTestRunner.java | 4 +- 4 files changed, 52 insertions(+), 25 deletions(-) diff --git a/sormas-e2e-tests/build.gradle b/sormas-e2e-tests/build.gradle index 221027e54a0..d4116f6b394 100755 --- a/sormas-e2e-tests/build.gradle +++ b/sormas-e2e-tests/build.gradle @@ -79,9 +79,9 @@ dependencies { implementation group: 'net.lingala.zip4j', name: 'zip4j', version: '1.2.4' implementation group: 'com.github.cafdataprocessing', name: 'language-detection', version: '3.5.2-1079' - implementation group: 'org.apache.tika', name: 'tika-langdetect-optimaize', version: '2.3.0' - implementation group: 'org.apache.tika', name: 'tika-langdetect', version: '2.3.0', ext: 'pom' - implementation group: 'org.apache.tika', name: 'tika-core', version: '2.3.0' + implementation group: 'org.apache.tika', name: 'tika-langdetect-optimaize', version: '2.6.0' + implementation group: 'org.apache.tika', name: 'tika-langdetect', version: '2.6.0', ext: 'pom' + implementation group: 'org.apache.tika', name: 'tika-core', version: '2.6.0' implementation group: 'org.apache.poi', name: 'poi', version: '3.17' implementation group: 'ru.yandex.qatools.ashot', name: 'ashot', version: '1.5.4' diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/helpers/strings/LanguageDetectorHelper.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/helpers/strings/LanguageDetectorHelper.java index b05661c9058..8e9954b8a04 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/helpers/strings/LanguageDetectorHelper.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/helpers/strings/LanguageDetectorHelper.java @@ -18,7 +18,9 @@ public static void checkLanguage(String textToScan, String expectedLanguage) { if (isConfidenceStrong(textToScan)) { log.info("Check if text {} language is {}", textToScan, expectedLanguage); Assert.assertEquals( - scanLanguage(textToScan), expectedLanguage, "Language is not as expected"); + scanLanguage(textToScan), + expectedLanguage, + "Text: [" + textToScan + "] Language is not as expected"); } else { throw new LanguageDetectorException( "LanguageDetectorHelper confidence is not at least MEDIUM"); @@ -28,13 +30,18 @@ public static void checkLanguage(String textToScan, String expectedLanguage) { @SneakyThrows public static String scanLanguage(String textToScan) { detector = LanguageDetector.getDefaultLanguageDetector().loadModels(); - return Arrays.stream(Locale.getAvailableLocales()) - .filter( - locale -> - locale.getLanguage().equalsIgnoreCase(detector.detect(textToScan).getLanguage())) - .findFirst() - .get() - .getDisplayLanguage(); + String detectedLanguageCode = detector.detect(textToScan).getLanguage(); + String detectedLanguage = + Arrays.stream(Locale.getAvailableLocales()) + .filter(locale -> locale.getLanguage().equalsIgnoreCase(detectedLanguageCode)) + .findFirst() + .orElseThrow( + () -> + new LanguageDetectorException( + "Unable to find language for code: " + detectedLanguageCode)) + .getDisplayLanguage(); + // Workaround for Malay due to library bug + return (detectedLanguage.equalsIgnoreCase("Malay")) ? "English" : detectedLanguage; } @SneakyThrows diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/environmentdata/manager/EnvironmentManager.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/environmentdata/manager/EnvironmentManager.java index 88d58726c7c..203727a6cdc 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/environmentdata/manager/EnvironmentManager.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/helpers/environmentdata/manager/EnvironmentManager.java @@ -58,9 +58,14 @@ public String getCountryUUID(String countryName) { return countries.stream() .filter(country -> country.getDefaultName().equalsIgnoreCase(countryName)) .findFirst() - .orElseThrow(() -> new Exception("Unable to find country: " + countryName + "\n" - + "Available countries: " - + countries)) + .orElseThrow( + () -> + new Exception( + "Unable to find country: " + + countryName + + "\n" + + "Available countries: " + + countries)) .getUuid(); } @@ -115,9 +120,14 @@ public String getDistrictUUID(String districtName) { return districts.stream() .filter(district -> district.getName().equalsIgnoreCase(districtName)) .findFirst() - .orElseThrow(() -> new Exception("Unable to find district: " + districtName + "\n" - + "Available districts: " - + districts)) + .orElseThrow( + () -> + new Exception( + "Unable to find district: " + + districtName + + "\n" + + "Available districts: " + + districts)) .getUuid(); } @@ -165,9 +175,14 @@ public String getContinentUUID(String continentName) { return continents.stream() .filter(continent -> continent.getDefaultName().equalsIgnoreCase(continentName)) .findFirst() - .orElseThrow(() -> new Exception("Unable to find continent: " + continentName + "\n" - + "Available continents: " - + continents)) + .orElseThrow( + () -> + new Exception( + "Unable to find continent: " + + continentName + + "\n" + + "Available continents: " + + continents)) .getUuid(); } @@ -199,9 +214,14 @@ public String getCommunityUUID(String communityName) { return communities.stream() .filter(community -> community.getName().equalsIgnoreCase(communityName)) .findFirst() - .orElseThrow(() -> new Exception("Unable to find community: " + communityName + "\n" - + "Available communities: " - + communities)) + .orElseThrow( + () -> + new Exception( + "Unable to find community: " + + communityName + + "\n" + + "Available communities: " + + communities)) .getUuid(); } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/runner/CucumberTestRunner.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/runner/CucumberTestRunner.java index 02d4d9b93c6..ca42a03a16a 100755 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/runner/CucumberTestRunner.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/runner/CucumberTestRunner.java @@ -28,8 +28,8 @@ @CourgetteOptions( runLevel = CourgetteRunLevel.SCENARIO, showTestOutput = true, - rerunFailedScenarios = true, - rerunAttempts = 3, + rerunFailedScenarios = true, + rerunAttempts = 3, cucumberOptions = @CucumberOptions( features = "src/test/resources/features", From ebe8d5baa99a27a33e6753da6b3765ff39c3b764 Mon Sep 17 00:00:00 2001 From: Razvan Date: Thu, 8 Dec 2022 18:04:48 +0200 Subject: [PATCH 050/147] #1111FixHospitalInformantLoginTest : added back role to login tests --- .../src/test/resources/features/sanity/web/Login.feature | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature index 19eff9b0e98..f92260de4da 100755 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature @@ -25,7 +25,7 @@ Feature: Login with different type of users | Admin Surveillance Supervisor | | Contact Officer | | Community Officer | - # | Hospital Informant | + | Hospital Informant | | Clinician | @env_de @LoginDe @@ -54,7 +54,7 @@ Feature: Login with different type of users | Admin Surveillance Supervisor | | Contact Officer | | Community Officer | - # | Hospital Informant | + | Hospital Informant | | Clinician | @env_keycloak @LoginKeycloak From 53b4010d8077f75610e27f6bb19f58e8a6877e8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 9 Dec 2022 09:19:11 +0100 Subject: [PATCH 051/147] #4606 - i18n, defaults and missing mappings --- .../java/de/symeda/sormas/api/user/DefaultUserRole.java | 9 +++++++++ sormas-api/src/main/resources/enum.properties | 2 ++ .../src/main/resources/META-INF/glassfish-ejb-jar.xml | 5 +++++ sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml | 5 +++++ sormas-rest/src/main/webapp/WEB-INF/web.xml | 4 ++++ sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml | 5 +++++ sormas-ui/src/main/webapp/WEB-INF/web.xml | 4 ++++ 7 files changed, 34 insertions(+) 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 9f48e9a486a..f95438efa27 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 @@ -339,6 +339,7 @@ public Set getDefaultUserRights() { TASK_ASSIGN, TASK_DELETE, TASK_EXPORT, + TASK_ARCHIVE, ACTION_CREATE, ACTION_DELETE, ACTION_EDIT, @@ -493,6 +494,7 @@ public Set getDefaultUserRights() { TASK_ASSIGN, TASK_EXPORT, TASK_DELETE, + TASK_ARCHIVE, ACTION_CREATE, ACTION_EDIT, ACTION_DELETE, @@ -636,6 +638,7 @@ public Set getDefaultUserRights() { TASK_EDIT, TASK_ASSIGN, TASK_EXPORT, + TASK_ARCHIVE, EVENT_VIEW, EVENT_EXPORT, EVENTPARTICIPANT_VIEW, @@ -856,6 +859,7 @@ public Set getDefaultUserRights() { TASK_EDIT, TASK_ASSIGN, TASK_EXPORT, + TASK_ARCHIVE, EVENT_VIEW, EVENT_EDIT, EVENT_EXPORT, @@ -1128,6 +1132,7 @@ public Set getDefaultUserRights() { TASK_EDIT, TASK_ASSIGN, TASK_EXPORT, + TASK_ARCHIVE, EVENT_VIEW, EVENT_EXPORT, EVENTPARTICIPANT_VIEW, @@ -1252,6 +1257,7 @@ public Set getDefaultUserRights() { TASK_ASSIGN, TASK_DELETE, TASK_EXPORT, + TASK_ARCHIVE, ACTION_CREATE, ACTION_EDIT, ACTION_DELETE, @@ -1363,6 +1369,7 @@ public Set getDefaultUserRights() { TASK_EDIT, TASK_ASSIGN, TASK_EXPORT, + TASK_ARCHIVE, EVENT_EXPORT, EVENT_VIEW, EVENTPARTICIPANT_VIEW, @@ -1407,6 +1414,7 @@ public Set getDefaultUserRights() { TASK_EDIT, TASK_ASSIGN, TASK_EXPORT, + TASK_ARCHIVE, EVENT_VIEW, EVENT_EXPORT, EVENTPARTICIPANT_VIEW, @@ -1601,6 +1609,7 @@ public Set getDefaultUserRights() { TASK_EDIT, TASK_ASSIGN, TASK_EXPORT, + TASK_ARCHIVE, ACTION_CREATE, ACTION_EDIT, EVENT_CREATE, diff --git a/sormas-api/src/main/resources/enum.properties b/sormas-api/src/main/resources/enum.properties index 9a0774379fb..5f3a98cefa9 100644 --- a/sormas-api/src/main/resources/enum.properties +++ b/sormas-api/src/main/resources/enum.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users 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 b0fe4d39fc9..7844527a1d4 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 @@ -317,6 +317,11 @@ TASK_EXPORT + + TASK_ARCHIVE + TASK_ARCHIVE + + ACTION_CREATE ACTION_CREATE 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 96214cb6826..5a3a191a7d5 100644 --- a/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml +++ b/sormas-rest/src/main/webapp/WEB-INF/glassfish-web.xml @@ -310,6 +310,11 @@ TASK_EXPORT + + TASK_ARCHIVE + TASK_ARCHIVE + + ACTION_CREATE ACTION_CREATE diff --git a/sormas-rest/src/main/webapp/WEB-INF/web.xml b/sormas-rest/src/main/webapp/WEB-INF/web.xml index 36347b09ec9..c9f63ebde7b 100644 --- a/sormas-rest/src/main/webapp/WEB-INF/web.xml +++ b/sormas-rest/src/main/webapp/WEB-INF/web.xml @@ -256,6 +256,10 @@ TASK_EXPORT + + TASK_ARCHIVE + + ACTION_CREATE 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 96214cb6826..5a3a191a7d5 100644 --- a/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml +++ b/sormas-ui/src/main/webapp/WEB-INF/glassfish-web.xml @@ -310,6 +310,11 @@ TASK_EXPORT + + TASK_ARCHIVE + TASK_ARCHIVE + + ACTION_CREATE ACTION_CREATE diff --git a/sormas-ui/src/main/webapp/WEB-INF/web.xml b/sormas-ui/src/main/webapp/WEB-INF/web.xml index 66ca302d9d2..c8a483913d2 100644 --- a/sormas-ui/src/main/webapp/WEB-INF/web.xml +++ b/sormas-ui/src/main/webapp/WEB-INF/web.xml @@ -256,6 +256,10 @@ TASK_EXPORT + + TASK_ARCHIVE + + ACTION_CREATE From 54ebd69a2b40762a4f49e8e3cd83c4ba5029c94e Mon Sep 17 00:00:00 2001 From: Frank Hautpmann Date: Fri, 9 Dec 2022 09:29:44 +0100 Subject: [PATCH 052/147] New Crowdin updates (#11108) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Ukrainian) * New translations strings.properties (Romanian) * New translations strings.properties (Italian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Japanese) * New translations strings.properties (Turkish) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (English, Ghana) * New translations enum.properties (French) * New translations enum.properties (French) * New translations enum.properties (Arabic) * New translations enum.properties (Romanian) * New translations enum.properties (Spanish) * New translations captions.properties (Romanian) * New translations captions.properties (Spanish) * New translations captions.properties (French) * New translations captions.properties (Arabic) * New translations captions.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations strings.properties (German) * New translations enum.properties (Portuguese) * New translations enum.properties (Polish) * New translations captions.properties (French, Switzerland) * New translations enum.properties (German) * New translations enum.properties (Finnish) * New translations enum.properties (Italian) * New translations enum.properties (Japanese) * New translations enum.properties (Dutch) * New translations enum.properties (Norwegian) * New translations enum.properties (Czech) * New translations captions.properties (Swahili) * New translations captions.properties (Nepali) * New translations captions.properties (Russian) * New translations captions.properties (Czech) * New translations captions.properties (German) * New translations captions.properties (Finnish) * New translations captions.properties (Italian) * New translations captions.properties (Japanese) * New translations captions.properties (Dutch) * New translations captions.properties (Norwegian) * New translations captions.properties (Polish) * New translations captions.properties (Portuguese) * New translations captions.properties (Swedish) * New translations captions.properties (German, Switzerland) * New translations captions.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Spanish, Ecuador) * New translations captions.properties (Croatian) * New translations captions.properties (Hindi) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations enum.properties (Russian) * New translations descriptions.properties (Spanish) * New translations descriptions.properties (Arabic) * New translations validations.properties (French) * New translations descriptions.properties (French) * New translations validations.properties (Romanian) * New translations descriptions.properties (Romanian) * New translations validations.properties (Spanish) * New translations descriptions.properties (Polish) * New translations validations.properties (German) * New translations descriptions.properties (Czech) * New translations validations.properties (Russian) * New translations descriptions.properties (Russian) * New translations validations.properties (Portuguese) * New translations descriptions.properties (Portuguese) * New translations validations.properties (Czech) * New translations descriptions.properties (German) * New translations descriptions.properties (Finnish) * New translations validations.properties (Norwegian) * New translations validations.properties (Finnish) * New translations descriptions.properties (Italian) * New translations validations.properties (Italian) * New translations validations.properties (Polish) * New translations validations.properties (Japanese) * New translations descriptions.properties (Dutch) * New translations validations.properties (Dutch) * New translations descriptions.properties (Norwegian) * New translations descriptions.properties (Japanese) * New translations enum.properties (Swedish) * New translations validations.properties (Arabic) * New translations enum.properties (Swahili) * New translations enum.properties (Ukrainian) * New translations enum.properties (Chinese Simplified) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Spanish, Ecuador) * New translations enum.properties (Croatian) * New translations enum.properties (Hindi) * New translations enum.properties (Filipino) * New translations enum.properties (Fijian) * New translations enum.properties (German, Switzerland) * New translations enum.properties (Turkish) * New translations enum.properties (Nepali) * New translations enum.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations enum.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations enum.properties (English, Ghana) * New translations descriptions.properties (Swedish) * New translations validations.properties (Swedish) * New translations validations.properties (Dari) * New translations descriptions.properties (Nepali) * New translations validations.properties (Nepali) * New translations descriptions.properties (French, Switzerland) * New translations validations.properties (French, Switzerland) * New translations descriptions.properties (Italian, Switzerland) * New translations validations.properties (Italian, Switzerland) * New translations descriptions.properties (Dari) * New translations descriptions.properties (Pashto) * New translations descriptions.properties (German, Switzerland) * New translations validations.properties (Pashto) * New translations descriptions.properties (Spanish, Cuba) * New translations validations.properties (Spanish, Cuba) * New translations descriptions.properties (English, Afghanistan) * New translations validations.properties (English, Afghanistan) * New translations descriptions.properties (English, Nigeria) * New translations validations.properties (English, Nigeria) * New translations descriptions.properties (English, Ghana) * New translations validations.properties (German, Switzerland) * New translations validations.properties (Swahili) * New translations descriptions.properties (Turkish) * New translations descriptions.properties (Spanish, Ecuador) * New translations validations.properties (Turkish) * New translations descriptions.properties (Ukrainian) * New translations validations.properties (Ukrainian) * New translations descriptions.properties (Chinese Simplified) * New translations validations.properties (Chinese Simplified) * New translations descriptions.properties (Urdu (Pakistan)) * New translations validations.properties (Urdu (Pakistan)) * New translations validations.properties (Spanish, Ecuador) * New translations descriptions.properties (Swahili) * New translations descriptions.properties (Croatian) * New translations validations.properties (Croatian) * New translations descriptions.properties (Hindi) * New translations validations.properties (Hindi) * New translations descriptions.properties (Filipino) * New translations validations.properties (Filipino) * New translations descriptions.properties (Fijian) * New translations validations.properties (Fijian) * New translations validations.properties (English, Ghana) * New translations strings.properties (German, Switzerland) * New translations captions.properties (Romanian) * New translations captions.properties (French) * New translations captions.properties (Spanish) * New translations captions.properties (Arabic) * New translations captions.properties (Czech) * New translations captions.properties (German) * New translations captions.properties (Finnish) * New translations captions.properties (Italian) * New translations captions.properties (Japanese) * New translations captions.properties (Dutch) * New translations captions.properties (Norwegian) * New translations captions.properties (Polish) * New translations captions.properties (Portuguese) * New translations captions.properties (Russian) * New translations captions.properties (Swedish) * New translations captions.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Spanish, Ecuador) * New translations captions.properties (Croatian) * New translations captions.properties (Hindi) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations captions.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Spanish, Ecuador) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations enum.properties (German, Switzerland) * New translations descriptions.properties (German, Switzerland) * New translations validations.properties (German, Switzerland) * New translations captions.properties (German) * New translations captions.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) Co-authored-by: Maté Strysewske --- sormas-api/src/main/resources/captions_ar-SA.properties | 1 + sormas-api/src/main/resources/captions_cs-CZ.properties | 1 + sormas-api/src/main/resources/captions_de-CH.properties | 5 +++-- sormas-api/src/main/resources/captions_de-DE.properties | 1 + sormas-api/src/main/resources/captions_en-AF.properties | 1 + sormas-api/src/main/resources/captions_en-GH.properties | 1 + sormas-api/src/main/resources/captions_en-NG.properties | 1 + sormas-api/src/main/resources/captions_es-CU.properties | 1 + sormas-api/src/main/resources/captions_es-EC.properties | 1 + sormas-api/src/main/resources/captions_es-ES.properties | 1 + sormas-api/src/main/resources/captions_fa-AF.properties | 1 + sormas-api/src/main/resources/captions_fi-FI.properties | 1 + sormas-api/src/main/resources/captions_fil-PH.properties | 1 + sormas-api/src/main/resources/captions_fj-FJ.properties | 1 + sormas-api/src/main/resources/captions_fr-CH.properties | 1 + sormas-api/src/main/resources/captions_fr-FR.properties | 1 + sormas-api/src/main/resources/captions_hi-IN.properties | 1 + sormas-api/src/main/resources/captions_hr-HR.properties | 1 + sormas-api/src/main/resources/captions_it-CH.properties | 1 + sormas-api/src/main/resources/captions_it-IT.properties | 1 + sormas-api/src/main/resources/captions_ja-JP.properties | 1 + sormas-api/src/main/resources/captions_ne-NP.properties | 1 + sormas-api/src/main/resources/captions_nl-NL.properties | 1 + sormas-api/src/main/resources/captions_no-NO.properties | 1 + sormas-api/src/main/resources/captions_pl-PL.properties | 1 + sormas-api/src/main/resources/captions_ps-AF.properties | 1 + sormas-api/src/main/resources/captions_pt-PT.properties | 1 + sormas-api/src/main/resources/captions_ro-RO.properties | 1 + sormas-api/src/main/resources/captions_ru-RU.properties | 1 + sormas-api/src/main/resources/captions_sv-SE.properties | 1 + sormas-api/src/main/resources/captions_sw-KE.properties | 1 + sormas-api/src/main/resources/captions_tr-TR.properties | 1 + sormas-api/src/main/resources/captions_uk-UA.properties | 1 + sormas-api/src/main/resources/captions_ur-PK.properties | 1 + sormas-api/src/main/resources/captions_zh-CN.properties | 1 + sormas-api/src/main/resources/descriptions_de-CH.properties | 2 +- sormas-api/src/main/resources/enum_de-CH.properties | 4 ++-- sormas-api/src/main/resources/strings_ar-SA.properties | 1 + sormas-api/src/main/resources/strings_cs-CZ.properties | 1 + sormas-api/src/main/resources/strings_de-CH.properties | 5 +++-- sormas-api/src/main/resources/strings_de-DE.properties | 1 + sormas-api/src/main/resources/strings_en-AF.properties | 1 + sormas-api/src/main/resources/strings_en-GH.properties | 1 + sormas-api/src/main/resources/strings_en-NG.properties | 1 + sormas-api/src/main/resources/strings_es-CU.properties | 1 + sormas-api/src/main/resources/strings_es-EC.properties | 1 + sormas-api/src/main/resources/strings_es-ES.properties | 1 + sormas-api/src/main/resources/strings_fa-AF.properties | 1 + sormas-api/src/main/resources/strings_fi-FI.properties | 1 + sormas-api/src/main/resources/strings_fil-PH.properties | 1 + sormas-api/src/main/resources/strings_fj-FJ.properties | 1 + sormas-api/src/main/resources/strings_fr-CH.properties | 1 + sormas-api/src/main/resources/strings_fr-FR.properties | 1 + sormas-api/src/main/resources/strings_hi-IN.properties | 1 + sormas-api/src/main/resources/strings_hr-HR.properties | 1 + sormas-api/src/main/resources/strings_it-CH.properties | 1 + sormas-api/src/main/resources/strings_it-IT.properties | 1 + sormas-api/src/main/resources/strings_ja-JP.properties | 1 + sormas-api/src/main/resources/strings_ne-NP.properties | 1 + sormas-api/src/main/resources/strings_nl-NL.properties | 1 + sormas-api/src/main/resources/strings_no-NO.properties | 1 + sormas-api/src/main/resources/strings_pl-PL.properties | 1 + sormas-api/src/main/resources/strings_ps-AF.properties | 1 + sormas-api/src/main/resources/strings_pt-PT.properties | 1 + sormas-api/src/main/resources/strings_ro-RO.properties | 1 + sormas-api/src/main/resources/strings_ru-RU.properties | 1 + sormas-api/src/main/resources/strings_sv-SE.properties | 1 + sormas-api/src/main/resources/strings_sw-KE.properties | 1 + sormas-api/src/main/resources/strings_tr-TR.properties | 1 + sormas-api/src/main/resources/strings_uk-UA.properties | 1 + sormas-api/src/main/resources/strings_ur-PK.properties | 1 + sormas-api/src/main/resources/strings_zh-CN.properties | 1 + sormas-api/src/main/resources/validations_de-CH.properties | 2 +- 73 files changed, 78 insertions(+), 8 deletions(-) diff --git a/sormas-api/src/main/resources/captions_ar-SA.properties b/sormas-api/src/main/resources/captions_ar-SA.properties index ea3d3c445ac..6bc44c954a6 100644 --- a/sormas-api/src/main/resources/captions_ar-SA.properties +++ b/sormas-api/src/main/resources/captions_ar-SA.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_cs-CZ.properties b/sormas-api/src/main/resources/captions_cs-CZ.properties index 575ef28617a..7ba8ccc19cd 100644 --- a/sormas-api/src/main/resources/captions_cs-CZ.properties +++ b/sormas-api/src/main/resources/captions_cs-CZ.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Odstranit nový případ, který jste pr externalMessage.deleteNewlyCreatedContact=Odstranit nový kontakt, který jste právě vytvořili externalMessage.deleteNewlyCreatedEventParticipant=Odstranit nového účastníka události, kterého jste právě vytvořili ExternalMessage.reportId=ID zprávy +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Celkový výsledek testu ExternalMessage.assignee=Přiřazený ExternalMessage.type=Typ diff --git a/sormas-api/src/main/resources/captions_de-CH.properties b/sormas-api/src/main/resources/captions_de-CH.properties index 6c669be7b2c..9a47899c362 100644 --- a/sormas-api/src/main/resources/captions_de-CH.properties +++ b/sormas-api/src/main/resources/captions_de-CH.properties @@ -69,7 +69,7 @@ requiredUserRights=Benötigte Benutzerrechte adoptHomeAddressOfCasePerson=Heimatadresse der Fall-Person übernehmen adoptHomeAddressOfCasePersonIfRelationMatches=Heimatadresse der Fall-Person übernehmen, wenn sie im selben Haushalt wohnt casePersonAddress=Adresse der Fall-Person -viewMessage=View message +viewMessage=Nachricht anzeigen # About about=Info aboutAdditionalInfo=Zusätzliche Information @@ -1470,10 +1470,11 @@ externalMessage.deleteNewlyCreatedCase=Neuen Fall, den Sie gerade erstellt haben externalMessage.deleteNewlyCreatedContact=Neuen Kontakt, den Sie gerade erstellt haben löschen externalMessage.deleteNewlyCreatedEventParticipant=Neuen Ereignisteilnehmer, den Sie gerade erstellt haben löschen ExternalMessage.reportId=Meldungs-ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Gesamttestresultat ExternalMessage.assignee=Zugewiesen an ExternalMessage.type=Typ -ExternalMessage.surveillanceReport=Linked Report +ExternalMessage.surveillanceReport=Verknüpfter Bericht externalMessageFetch=Meldungen abrufen externalMessageProcess=Verarbeiten externalMessageNoDisease=Keine Krankheit gefunden diff --git a/sormas-api/src/main/resources/captions_de-DE.properties b/sormas-api/src/main/resources/captions_de-DE.properties index 18124e4f32b..143b876b5d1 100644 --- a/sormas-api/src/main/resources/captions_de-DE.properties +++ b/sormas-api/src/main/resources/captions_de-DE.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Neuen Fall, den Sie gerade erstellt haben externalMessage.deleteNewlyCreatedContact=Neuen Kontakt, den Sie gerade erstellt haben löschen externalMessage.deleteNewlyCreatedEventParticipant=Neuen Ereignisteilnehmer, den Sie gerade erstellt haben löschen ExternalMessage.reportId=Meldungs-ID +ExternalMessage.reportMessageId=Meldevorgangs-ID ExternalMessage.sampleOverallTestResult=Gesamttestresultat ExternalMessage.assignee=Zugewiesen an ExternalMessage.type=Typ diff --git a/sormas-api/src/main/resources/captions_en-AF.properties b/sormas-api/src/main/resources/captions_en-AF.properties index 35b653ca341..fbf259cee95 100644 --- a/sormas-api/src/main/resources/captions_en-AF.properties +++ b/sormas-api/src/main/resources/captions_en-AF.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_en-GH.properties b/sormas-api/src/main/resources/captions_en-GH.properties index 1f3805b75f7..75ab19777e3 100644 --- a/sormas-api/src/main/resources/captions_en-GH.properties +++ b/sormas-api/src/main/resources/captions_en-GH.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_en-NG.properties b/sormas-api/src/main/resources/captions_en-NG.properties index 33af099f426..036ae4b89c3 100644 --- a/sormas-api/src/main/resources/captions_en-NG.properties +++ b/sormas-api/src/main/resources/captions_en-NG.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_es-CU.properties b/sormas-api/src/main/resources/captions_es-CU.properties index 7fe8b99fff3..b71324614f5 100644 --- a/sormas-api/src/main/resources/captions_es-CU.properties +++ b/sormas-api/src/main/resources/captions_es-CU.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Eliminar el nuevo caso que acaba de crear externalMessage.deleteNewlyCreatedContact=Eliminar el nuevo contacto que acaba de crear externalMessage.deleteNewlyCreatedEventParticipant=Eliminar el nuevo participante de evento que acaba de crear ExternalMessage.reportId=ID de informe +ExternalMessage.reportMessageId=ID de mensaje de informe ExternalMessage.sampleOverallTestResult=Resultado global de la prueba ExternalMessage.assignee=Responsable ExternalMessage.type=Tipo diff --git a/sormas-api/src/main/resources/captions_es-EC.properties b/sormas-api/src/main/resources/captions_es-EC.properties index 297d3cf81a3..13fc4b89c15 100644 --- a/sormas-api/src/main/resources/captions_es-EC.properties +++ b/sormas-api/src/main/resources/captions_es-EC.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_es-ES.properties b/sormas-api/src/main/resources/captions_es-ES.properties index 722099a0a85..cb0cdd23811 100644 --- a/sormas-api/src/main/resources/captions_es-ES.properties +++ b/sormas-api/src/main/resources/captions_es-ES.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_fa-AF.properties b/sormas-api/src/main/resources/captions_fa-AF.properties index 3bfd185a78f..f0e61fec6bf 100644 --- a/sormas-api/src/main/resources/captions_fa-AF.properties +++ b/sormas-api/src/main/resources/captions_fa-AF.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_fi-FI.properties b/sormas-api/src/main/resources/captions_fi-FI.properties index e032c9b642d..197b65217dd 100644 --- a/sormas-api/src/main/resources/captions_fi-FI.properties +++ b/sormas-api/src/main/resources/captions_fi-FI.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_fil-PH.properties b/sormas-api/src/main/resources/captions_fil-PH.properties index 722099a0a85..cb0cdd23811 100644 --- a/sormas-api/src/main/resources/captions_fil-PH.properties +++ b/sormas-api/src/main/resources/captions_fil-PH.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_fj-FJ.properties b/sormas-api/src/main/resources/captions_fj-FJ.properties index 722099a0a85..cb0cdd23811 100644 --- a/sormas-api/src/main/resources/captions_fj-FJ.properties +++ b/sormas-api/src/main/resources/captions_fj-FJ.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_fr-CH.properties b/sormas-api/src/main/resources/captions_fr-CH.properties index 2b74ac9068d..6da88f00878 100644 --- a/sormas-api/src/main/resources/captions_fr-CH.properties +++ b/sormas-api/src/main/resources/captions_fr-CH.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_fr-FR.properties b/sormas-api/src/main/resources/captions_fr-FR.properties index 06caa237662..9e520512595 100644 --- a/sormas-api/src/main/resources/captions_fr-FR.properties +++ b/sormas-api/src/main/resources/captions_fr-FR.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_hi-IN.properties b/sormas-api/src/main/resources/captions_hi-IN.properties index 722099a0a85..cb0cdd23811 100644 --- a/sormas-api/src/main/resources/captions_hi-IN.properties +++ b/sormas-api/src/main/resources/captions_hi-IN.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_hr-HR.properties b/sormas-api/src/main/resources/captions_hr-HR.properties index 722099a0a85..cb0cdd23811 100644 --- a/sormas-api/src/main/resources/captions_hr-HR.properties +++ b/sormas-api/src/main/resources/captions_hr-HR.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_it-CH.properties b/sormas-api/src/main/resources/captions_it-CH.properties index b999ad99e2e..68ce85579b9 100644 --- a/sormas-api/src/main/resources/captions_it-CH.properties +++ b/sormas-api/src/main/resources/captions_it-CH.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_it-IT.properties b/sormas-api/src/main/resources/captions_it-IT.properties index fdec9e7632f..05c27b631ad 100644 --- a/sormas-api/src/main/resources/captions_it-IT.properties +++ b/sormas-api/src/main/resources/captions_it-IT.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_ja-JP.properties b/sormas-api/src/main/resources/captions_ja-JP.properties index 722099a0a85..cb0cdd23811 100644 --- a/sormas-api/src/main/resources/captions_ja-JP.properties +++ b/sormas-api/src/main/resources/captions_ja-JP.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_ne-NP.properties b/sormas-api/src/main/resources/captions_ne-NP.properties index ea3d3c445ac..6bc44c954a6 100644 --- a/sormas-api/src/main/resources/captions_ne-NP.properties +++ b/sormas-api/src/main/resources/captions_ne-NP.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_nl-NL.properties b/sormas-api/src/main/resources/captions_nl-NL.properties index b62d611ea16..04ac985a0f3 100644 --- a/sormas-api/src/main/resources/captions_nl-NL.properties +++ b/sormas-api/src/main/resources/captions_nl-NL.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_no-NO.properties b/sormas-api/src/main/resources/captions_no-NO.properties index 722099a0a85..cb0cdd23811 100644 --- a/sormas-api/src/main/resources/captions_no-NO.properties +++ b/sormas-api/src/main/resources/captions_no-NO.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_pl-PL.properties b/sormas-api/src/main/resources/captions_pl-PL.properties index 722099a0a85..cb0cdd23811 100644 --- a/sormas-api/src/main/resources/captions_pl-PL.properties +++ b/sormas-api/src/main/resources/captions_pl-PL.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_ps-AF.properties b/sormas-api/src/main/resources/captions_ps-AF.properties index 58cc8120631..d05f9da6564 100644 --- a/sormas-api/src/main/resources/captions_ps-AF.properties +++ b/sormas-api/src/main/resources/captions_ps-AF.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_pt-PT.properties b/sormas-api/src/main/resources/captions_pt-PT.properties index 59f7685d675..7de4578215a 100644 --- a/sormas-api/src/main/resources/captions_pt-PT.properties +++ b/sormas-api/src/main/resources/captions_pt-PT.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_ro-RO.properties b/sormas-api/src/main/resources/captions_ro-RO.properties index 722099a0a85..cb0cdd23811 100644 --- a/sormas-api/src/main/resources/captions_ro-RO.properties +++ b/sormas-api/src/main/resources/captions_ro-RO.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_ru-RU.properties b/sormas-api/src/main/resources/captions_ru-RU.properties index eb9282e82c8..0a2f5ef0c36 100644 --- a/sormas-api/src/main/resources/captions_ru-RU.properties +++ b/sormas-api/src/main/resources/captions_ru-RU.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_sv-SE.properties b/sormas-api/src/main/resources/captions_sv-SE.properties index 722099a0a85..cb0cdd23811 100644 --- a/sormas-api/src/main/resources/captions_sv-SE.properties +++ b/sormas-api/src/main/resources/captions_sv-SE.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_sw-KE.properties b/sormas-api/src/main/resources/captions_sw-KE.properties index 722099a0a85..cb0cdd23811 100644 --- a/sormas-api/src/main/resources/captions_sw-KE.properties +++ b/sormas-api/src/main/resources/captions_sw-KE.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_tr-TR.properties b/sormas-api/src/main/resources/captions_tr-TR.properties index 722099a0a85..cb0cdd23811 100644 --- a/sormas-api/src/main/resources/captions_tr-TR.properties +++ b/sormas-api/src/main/resources/captions_tr-TR.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_uk-UA.properties b/sormas-api/src/main/resources/captions_uk-UA.properties index 722099a0a85..cb0cdd23811 100644 --- a/sormas-api/src/main/resources/captions_uk-UA.properties +++ b/sormas-api/src/main/resources/captions_uk-UA.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/captions_ur-PK.properties b/sormas-api/src/main/resources/captions_ur-PK.properties index c039ceaf285..773e9a38094 100644 --- a/sormas-api/src/main/resources/captions_ur-PK.properties +++ b/sormas-api/src/main/resources/captions_ur-PK.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=نیا کیس مٹا دیں جو آپ ن externalMessage.deleteNewlyCreatedContact=نیا رابطہ مٹا دیں جو آپ نے ابھی بنایا ہے externalMessage.deleteNewlyCreatedEventParticipant=نئی تقریب کے شریک کو مٹا دیں جسے آپ نے ابھی بنایا ہے ExternalMessage.reportId=رپورٹ کی شناخت +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=مجموعی طور پر ٹیسٹ کا نتیجہ ExternalMessage.assignee=مقرر کردہ ExternalMessage.type=قسم diff --git a/sormas-api/src/main/resources/captions_zh-CN.properties b/sormas-api/src/main/resources/captions_zh-CN.properties index bb6f2617b37..47aca9f03ed 100644 --- a/sormas-api/src/main/resources/captions_zh-CN.properties +++ b/sormas-api/src/main/resources/captions_zh-CN.properties @@ -1470,6 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Delete new case you just created externalMessage.deleteNewlyCreatedContact=Delete new contact you just created externalMessage.deleteNewlyCreatedEventParticipant=Delete new event participant you just created ExternalMessage.reportId=Report ID +ExternalMessage.reportMessageId=Report Message ID ExternalMessage.sampleOverallTestResult=Overall test result ExternalMessage.assignee=Assignee ExternalMessage.type=Type diff --git a/sormas-api/src/main/resources/descriptions_de-CH.properties b/sormas-api/src/main/resources/descriptions_de-CH.properties index 0a4f4c009e8..815d439a0b0 100644 --- a/sormas-api/src/main/resources/descriptions_de-CH.properties +++ b/sormas-api/src/main/resources/descriptions_de-CH.properties @@ -176,7 +176,7 @@ Sample.sampleDateTime = Wann wurde die Probe entnommen (Datum eingeben)? Sample.associatedLabMessages = Zugehörige Labormeldungen anzeigen # Surveillance Report -SurveillanceReport.associatedMessage = Display associated external message +SurveillanceReport.associatedMessage = Zugehörige Labormeldungen anzeigen # Symptoms Symptoms.alteredConsciousness = Veränderter Bewusstseinszustand, z.B. Lethargie, stuporös, Koma diff --git a/sormas-api/src/main/resources/enum_de-CH.properties b/sormas-api/src/main/resources/enum_de-CH.properties index c4d01bfea9c..54a68d01ea7 100644 --- a/sormas-api/src/main/resources/enum_de-CH.properties +++ b/sormas-api/src/main/resources/enum_de-CH.properties @@ -1524,7 +1524,7 @@ UserRight.DEV_MODE = Zugriff auf Entwickleroptionen UserRight.DOCUMENT_VIEW = Bestehende Dokumente anzeigen UserRight.DOCUMENT_UPLOAD = Dokumente hochladen UserRight.DOCUMENT_DELETE = Dokumente aus dem System löschen -UserRight.PERSON_MERGE = Merge persons +UserRight.PERSON_MERGE = Personen zusammenführen # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = Kann Fälle archivieren @@ -1699,7 +1699,7 @@ UserRight.Desc.DEV_MODE = Kann auf Entwickleroptionen im Konfigurationsverzeichn UserRight.Desc.DOCUMENT_VIEW = Kann bestehende Dokumente einsehen UserRight.Desc.DOCUMENT_UPLOAD = Kann Dokumente hochladen UserRight.Desc.DOCUMENT_DELETE = Kann Dokumente aus dem System löschen -UserRight.Desc.PERSON_MERGE = Able to merge persons +UserRight.Desc.PERSON_MERGE = Kann Personen zusammenführen # UserRightGroup UserRightGroup.GENERAL = Allgemein diff --git a/sormas-api/src/main/resources/strings_ar-SA.properties b/sormas-api/src/main/resources/strings_ar-SA.properties index 250cb4f5509..bb6ff816f17 100644 --- a/sormas-api/src/main/resources/strings_ar-SA.properties +++ b/sormas-api/src/main/resources/strings_ar-SA.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_cs-CZ.properties b/sormas-api/src/main/resources/strings_cs-CZ.properties index 7c9e2053bbf..9e26d113ae3 100644 --- a/sormas-api/src/main/resources/strings_cs-CZ.properties +++ b/sormas-api/src/main/resources/strings_cs-CZ.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Léčba uložena messageTreatmentsDeleted = Všechny vybrané léčby byly odstraněny messageUnknownFilterAttributeForPopulationData = Zobrazení podílu výskytu případu pro neznámé pohlaví nebo věkovou skupinu není možné. Odstraňte příslušné hodnoty z filtrů. messageDeletionUnsupportedByExternalJournalWarning = Externí deník ještě neposkytl funkci pro zrušení registrace osob v rámci SORMAS. Vymažte tuto osobu ručně z externího deníku. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = Nemoc externí zprávy nebylo možné automaticky určit. Ověřte prosím ručně, zda se tato zpráva týká nemoci, kterou je třeba řešit v systému SORMAS. messageUserRoleCombination = nelze kombinovat s messageUserRoleSaved = Uživatelská role uložena diff --git a/sormas-api/src/main/resources/strings_de-CH.properties b/sormas-api/src/main/resources/strings_de-CH.properties index 027de3cd03f..3cb5d670c55 100644 --- a/sormas-api/src/main/resources/strings_de-CH.properties +++ b/sormas-api/src/main/resources/strings_de-CH.properties @@ -859,8 +859,8 @@ infoMergingHideDescription = Wählen Sie diese Option, wenn Sie nicht sicher sin infoContactMergingHideDescription = Wählen Sie diese Option, wenn Sie nicht sicher sind, ob die beiden Kontakte gleich sind oder wenn Sie wissen, dass sie es nicht sind. Dadurch wird das Kontaktpaar aus der Liste ausgeblendet. Bitte beachten Sie, dass, wenn Sie die Ansicht aktualisieren oder später wieder darauf zurückkommen es wieder angezeigt wird, solange Sie keinen anderen Zeitraum im Erstellungsdatumsfilter wählen. infoPersonMergeDescription = Bitte wählen Sie eine der Personen unten als führende Person aus. Sie haben folgende Optionen, um fortzufahren.
Zusammenführen\: Daten der verworfenen Person werden verlinkt und/oder der verbleibenden Person hinzugefügt, aber nicht überschrieben. Sie werden diese Aktion nicht rückgängig machen können.
Auswählen\: Die Daten der verbleibenden Person werden nicht geändert und die Daten der anderen Person werden verworfen. Jedoch werden Entitäten, die mit der verworfenen Person verknüpft sind, mit der verbleibenden Person verknüpft. Sie können diese Aktion nicht rückgängig machen. infoPersonMergeConfirmation = Sind Sie sicher, dass Sie dies tun wollen? Die Aktion kann nicht rückgängig gemacht werden. -infoPersonMergeConfirmationBothShared = The persons you want to merge both have shared entities via S2S. If you merge these persons, the synchronization will be broken for the person who is not the leading one and the associated entities. Please discuss with your administrator if you would like to do this and verify which of the two persons you would like to have as the leading person.
Are you certain you want to do this? The action is not reversible. -infoPersonMergeSharedMustLead = Please note, you cannot choose this person as a leading person because then the synchronization of S2S would break.\nPlease select the other person as leading person +infoPersonMergeConfirmationBothShared = Die Personen die Sie zusammenführen wollen haben beide via S2S übergebene Entitäten. Wenn Sie diese Personen zusammenführen, wird die Synchronisierung deswegen für die nicht führende Person und die damit zusammenhängenden Entitäten gebrochen. Bitte sprechen Sie erst mit Ihrem Administrator, ob Sie diesen Schritt durchführen möchten und überprüfen Sie welche der beiden Personen die führende Person sein soll.
Die Aktion kann nicht rückgängig gemacht werden. +infoPersonMergeSharedMustLead = Bitte beachten Sie, Sie können diese Person nicht als die führende Person auswählen, da dann die Synchronisation von S2S brechen würde. Sie haben die Option die andere Person als die führende Person auszuwählen. infoPersonMergeConfirmationForNonSimilarPersons = Die beiden ausgewählten Personen entsprechen nicht den Ähnlichkeitsanforderungen, die SORMAS zur Identifizierung von Duplikaten verwendet. Bitte stellen Sie sicher, dass die ausgewählten Personen tatsächlich identisch sind und zusammengeführt werden sollen. infoHowToMergeCases = Sie können zwischen zwei Optionen wählen, wenn Sie potenziell doppelte Fälle überprüfen\: infoHowToMergeContacts = Sie können zwischen zwei Optionen wählen, wenn Sie potenziell doppelte Kontakte überprüfen\: @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Behandlung gespeichert messageTreatmentsDeleted = Alle ausgewählten Behandlungen wurden gelöscht messageUnknownFilterAttributeForPopulationData = Die Anzeige der Fall-Inzidenzanteile für unbekanntes Geschlecht oder Altersgruppe ist nicht möglich. Bitte entfernen Sie die entsprechenden Werte aus Ihrem Filter. messageDeletionUnsupportedByExternalJournalWarning = Das externe Symptomtagebuch hat noch keine Funktion zum Entfernen von Personen innerhalb von SORMAS zur Verfügung gestellt. Bitte löschen Sie die Person manuell aus dem externen Symptomtagebuch. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = Die Krankheit der Meldung konnte nicht automatisch ermittelt werden. Bitte überprüfen Sie manuell, ob es sich bei dieser Meldung um eine Krankheit handelt, die in SORMAS bearbeitet werden soll. messageUserRoleCombination = kann nicht kombiniert werden mit messageUserRoleSaved = Benutzerrolle gespeichert diff --git a/sormas-api/src/main/resources/strings_de-DE.properties b/sormas-api/src/main/resources/strings_de-DE.properties index 44bd4ef04bf..9c5ac694e55 100644 --- a/sormas-api/src/main/resources/strings_de-DE.properties +++ b/sormas-api/src/main/resources/strings_de-DE.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Behandlung gespeichert messageTreatmentsDeleted = Alle ausgewählten Behandlungen wurden gelöscht messageUnknownFilterAttributeForPopulationData = Die Anzeige der Fall-Inzidenzanteile für unbekanntes Geschlecht oder Altersgruppe ist nicht möglich. Bitte entfernen Sie die entsprechenden Werte aus Ihrem Filter. messageDeletionUnsupportedByExternalJournalWarning = Das externe Symptomtagebuch hat noch keine Funktion zum Entfernen von Personen innerhalb von SORMAS zur Verfügung gestellt. Bitte löschen Sie die Person manuell aus dem externen Symptomtagebuch. +messageExternalJournalDidNotProvideMessage = Das externe Symptomtagebuch hat keine Daten übermittelt. messageDiseaseNotSpecifiedInLabMessage = Die Krankheit der externen Meldung konnte nicht automatisch ermittelt werden. Bitte überprüfen Sie manuell, dass es bei dieser Meldung um eine Krankheit geht, die in SORMAS behandelt werden soll. messageUserRoleCombination = kann nicht kombiniert werden mit messageUserRoleSaved = Benutzerrolle gespeichert diff --git a/sormas-api/src/main/resources/strings_en-AF.properties b/sormas-api/src/main/resources/strings_en-AF.properties index cea9630b32d..41a740ed944 100644 --- a/sormas-api/src/main/resources/strings_en-AF.properties +++ b/sormas-api/src/main/resources/strings_en-AF.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_en-GH.properties b/sormas-api/src/main/resources/strings_en-GH.properties index 49ffb9239fc..c7ac7ed8b0f 100644 --- a/sormas-api/src/main/resources/strings_en-GH.properties +++ b/sormas-api/src/main/resources/strings_en-GH.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_en-NG.properties b/sormas-api/src/main/resources/strings_en-NG.properties index c300e5f62af..d599ae2cf4d 100644 --- a/sormas-api/src/main/resources/strings_en-NG.properties +++ b/sormas-api/src/main/resources/strings_en-NG.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_es-CU.properties b/sormas-api/src/main/resources/strings_es-CU.properties index 6b9adfd3183..cc4da3738a5 100644 --- a/sormas-api/src/main/resources/strings_es-CU.properties +++ b/sormas-api/src/main/resources/strings_es-CU.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Tratamiento guardado messageTreatmentsDeleted = Todos los tratamientos seleccionados fueron eliminados messageUnknownFilterAttributeForPopulationData = No es posible mostrar la proporción de incidencia de casos para sexo o grupo de edad desconocido. Por favor elimine de sus filtros los valores respectivos. messageDeletionUnsupportedByExternalJournalWarning = El diario externo aún no ha proporcionado una función para anular el registro de personas desde SORMAS. Por favor, elimine manualmente la persona en el diario externo. +messageExternalJournalDidNotProvideMessage = El diario externo no proporcionó un mensaje. messageDiseaseNotSpecifiedInLabMessage = No se pudo determinar automáticamente la enfermedad del mensaje externo. Por favor verifique manualmente que este mensaje sea sobre una enfermedad a tratar en SORMAS. messageUserRoleCombination = no se puede combinar con messageUserRoleSaved = Rol de usuario guardado diff --git a/sormas-api/src/main/resources/strings_es-EC.properties b/sormas-api/src/main/resources/strings_es-EC.properties index cf1bda42768..25eedf39b1d 100644 --- a/sormas-api/src/main/resources/strings_es-EC.properties +++ b/sormas-api/src/main/resources/strings_es-EC.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Tratamiento guardado messageTreatmentsDeleted = Todos los tratamientos seleccionados han sido eliminados messageUnknownFilterAttributeForPopulationData = No es posible mostrar la proporción de incidencia de casos para sexo desconocido o grupo de edad. Elimine los valores respectivos de sus filtros. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = no puede combinarse con messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_es-ES.properties b/sormas-api/src/main/resources/strings_es-ES.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_es-ES.properties +++ b/sormas-api/src/main/resources/strings_es-ES.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_fa-AF.properties b/sormas-api/src/main/resources/strings_fa-AF.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_fa-AF.properties +++ b/sormas-api/src/main/resources/strings_fa-AF.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_fi-FI.properties b/sormas-api/src/main/resources/strings_fi-FI.properties index b5f315fe26c..409cbd0406c 100644 --- a/sormas-api/src/main/resources/strings_fi-FI.properties +++ b/sormas-api/src/main/resources/strings_fi-FI.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Hoito tallennettu messageTreatmentsDeleted = Kaikki valitut hoidot on poistettu messageUnknownFilterAttributeForPopulationData = Ilmaantuvuutta ei voida näyttää tuntemattomalle sukupuolelle tai ikäryhmälle. Poista sellaiset arvot suodattimistasi. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = ei voi yhdistää roolin kanssa messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_fil-PH.properties b/sormas-api/src/main/resources/strings_fil-PH.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_fil-PH.properties +++ b/sormas-api/src/main/resources/strings_fil-PH.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_fj-FJ.properties b/sormas-api/src/main/resources/strings_fj-FJ.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_fj-FJ.properties +++ b/sormas-api/src/main/resources/strings_fj-FJ.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_fr-CH.properties b/sormas-api/src/main/resources/strings_fr-CH.properties index a0f5f50aca5..0cd52c6a2de 100644 --- a/sormas-api/src/main/resources/strings_fr-CH.properties +++ b/sormas-api/src/main/resources/strings_fr-CH.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Traitement enregistré messageTreatmentsDeleted = Tous les traitements sélectionnés ont été supprimés messageUnknownFilterAttributeForPopulationData = L'affichage de la proportion d'incidence de cas pour un groupe d'âge ou un sexe inconnu n'est pas possible. Veuillez supprimer les valeurs respectives de vos filtres. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = ne peut pas être combiné avec messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_fr-FR.properties b/sormas-api/src/main/resources/strings_fr-FR.properties index d031c319978..3b2bed6a5a7 100644 --- a/sormas-api/src/main/resources/strings_fr-FR.properties +++ b/sormas-api/src/main/resources/strings_fr-FR.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Traitement enregistré messageTreatmentsDeleted = Tous les traitements sélectionnés ont été supprimés messageUnknownFilterAttributeForPopulationData = L'affichage de la proportion d'incidence de cas pour un groupe d'âge ou un sexe inconnu n'est pas possible. Veuillez supprimer les valeurs respectives de vos filtres. messageDeletionUnsupportedByExternalJournalWarning = Le journal externe n'a pas encore fourni de fonction pour désinscrire les personnes de SORMAS. Veuillez supprimer manuellement la personne du journal externe. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = ne peut pas être combiné avec messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_hi-IN.properties b/sormas-api/src/main/resources/strings_hi-IN.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_hi-IN.properties +++ b/sormas-api/src/main/resources/strings_hi-IN.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_hr-HR.properties b/sormas-api/src/main/resources/strings_hr-HR.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_hr-HR.properties +++ b/sormas-api/src/main/resources/strings_hr-HR.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_it-CH.properties b/sormas-api/src/main/resources/strings_it-CH.properties index cc23039fde4..471abd750f7 100644 --- a/sormas-api/src/main/resources/strings_it-CH.properties +++ b/sormas-api/src/main/resources/strings_it-CH.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Trattamento salvato messageTreatmentsDeleted = Tutti i trattamenti selezionati sono stati eliminati messageUnknownFilterAttributeForPopulationData = Non è possibile visualizzare la proporzione di incidenza dei casi per sesso o gruppo di età sconosciuti. Rimuovi i valori corrispondenti dai filtri. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = non può essere combinato con messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_it-IT.properties b/sormas-api/src/main/resources/strings_it-IT.properties index b7a12aeb6d1..0b8cf131659 100644 --- a/sormas-api/src/main/resources/strings_it-IT.properties +++ b/sormas-api/src/main/resources/strings_it-IT.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Trattamento salvato messageTreatmentsDeleted = Tutti i trattamenti selezionati sono stati eliminati messageUnknownFilterAttributeForPopulationData = Non è possibile visualizzare la proporzione di incidenza dei casi per sesso o gruppo di età sconosciuti. Rimuovi i valori corrispondenti dai filtri. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = non può essere combinato con messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_ja-JP.properties b/sormas-api/src/main/resources/strings_ja-JP.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_ja-JP.properties +++ b/sormas-api/src/main/resources/strings_ja-JP.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_ne-NP.properties b/sormas-api/src/main/resources/strings_ne-NP.properties index 250cb4f5509..bb6ff816f17 100644 --- a/sormas-api/src/main/resources/strings_ne-NP.properties +++ b/sormas-api/src/main/resources/strings_ne-NP.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_nl-NL.properties b/sormas-api/src/main/resources/strings_nl-NL.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_nl-NL.properties +++ b/sormas-api/src/main/resources/strings_nl-NL.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_no-NO.properties b/sormas-api/src/main/resources/strings_no-NO.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_no-NO.properties +++ b/sormas-api/src/main/resources/strings_no-NO.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_pl-PL.properties b/sormas-api/src/main/resources/strings_pl-PL.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_pl-PL.properties +++ b/sormas-api/src/main/resources/strings_pl-PL.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_ps-AF.properties b/sormas-api/src/main/resources/strings_ps-AF.properties index a445a69cc33..7f6f4525b52 100644 --- a/sormas-api/src/main/resources/strings_ps-AF.properties +++ b/sormas-api/src/main/resources/strings_ps-AF.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_pt-PT.properties b/sormas-api/src/main/resources/strings_pt-PT.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_pt-PT.properties +++ b/sormas-api/src/main/resources/strings_pt-PT.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_ro-RO.properties b/sormas-api/src/main/resources/strings_ro-RO.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_ro-RO.properties +++ b/sormas-api/src/main/resources/strings_ro-RO.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_ru-RU.properties b/sormas-api/src/main/resources/strings_ru-RU.properties index 0cd7ae9562c..90181200c1f 100644 --- a/sormas-api/src/main/resources/strings_ru-RU.properties +++ b/sormas-api/src/main/resources/strings_ru-RU.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_sv-SE.properties b/sormas-api/src/main/resources/strings_sv-SE.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_sv-SE.properties +++ b/sormas-api/src/main/resources/strings_sv-SE.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_sw-KE.properties b/sormas-api/src/main/resources/strings_sw-KE.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_sw-KE.properties +++ b/sormas-api/src/main/resources/strings_sw-KE.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_tr-TR.properties b/sormas-api/src/main/resources/strings_tr-TR.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_tr-TR.properties +++ b/sormas-api/src/main/resources/strings_tr-TR.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_uk-UA.properties b/sormas-api/src/main/resources/strings_uk-UA.properties index 7bd43e6798e..296b02042f1 100644 --- a/sormas-api/src/main/resources/strings_uk-UA.properties +++ b/sormas-api/src/main/resources/strings_uk-UA.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/strings_ur-PK.properties b/sormas-api/src/main/resources/strings_ur-PK.properties index 221cd439628..e839dcde84a 100644 --- a/sormas-api/src/main/resources/strings_ur-PK.properties +++ b/sormas-api/src/main/resources/strings_ur-PK.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = علاج محفوظ کر لیا messageTreatmentsDeleted = تمام منتخب تقریبات کو مٹا دیا گیا ہے messageUnknownFilterAttributeForPopulationData = نامعلوم جنس یا عمر گروپ کے لیے کیس کے واقعات کا تناسب ظاہر کرنا ممکن نہیں ہے۔ براہ کرم اپنے فلٹرز سے متعلقہ ویلیوز کو ہٹا دیں۔ messageDeletionUnsupportedByExternalJournalWarning = بیرونی جریدے نے ابھی تک سورماس کے اندر سے غیر رجسٹرڈ افراد کو کوئی فنکشن فراہم نہیں کیا ہے۔ براہ کرم دستی طور پر اس شخص کو بیرونی جریدے سے مٹا دیں۔ +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = خارجی پیغام کی بیماری کا خود بخود تعین نہیں ہو سکا۔ براہ کرم دستی طور پر تصدیق کریں کہ یہ پیغام SORMAS میں نمٹنے والی بیماری کے بارے میں ہے۔ messageUserRoleCombination = کے ساتھ مل کر نہیں کیا جا سکتا messageUserRoleSaved = صارف کا کردار محفوظ ہو گیا diff --git a/sormas-api/src/main/resources/strings_zh-CN.properties b/sormas-api/src/main/resources/strings_zh-CN.properties index c67bb9bd475..37dd413665a 100644 --- a/sormas-api/src/main/resources/strings_zh-CN.properties +++ b/sormas-api/src/main/resources/strings_zh-CN.properties @@ -1142,6 +1142,7 @@ messageTreatmentSaved = Treatment saved messageTreatmentsDeleted = All selected treatments have been deleted messageUnknownFilterAttributeForPopulationData = Displaying case incidence proportion for unknown sex or age group is not possible. Please remove the respective values from your filters. messageDeletionUnsupportedByExternalJournalWarning = The external journal has not yet provided a function to unregister persons from within SORMAS. Please manually delete the person from the external journal. +messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. messageDiseaseNotSpecifiedInLabMessage = The disease of the external message could not automatically be determined. Please manually verify that this message is about a disease to be dealt with in SORMAS. messageUserRoleCombination = cannot be combined with messageUserRoleSaved = User role saved diff --git a/sormas-api/src/main/resources/validations_de-CH.properties b/sormas-api/src/main/resources/validations_de-CH.properties index 544b7427bce..a67bbd63708 100644 --- a/sormas-api/src/main/resources/validations_de-CH.properties +++ b/sormas-api/src/main/resources/validations_de-CH.properties @@ -265,4 +265,4 @@ removeRolesWithEditUserFromOwnUser = Keiner der Benutzerrollen mit dem Recht removeRolesWithEditRightFromOwnUser = Keiner der Benutzerrollen mit dem Recht Benutzerrecht bearbeiten können derzeit vom angemeldeten Benutzer entfernen werden removeUserRightEditRightFromOwnUser = Das Recht Benutzer bearbeiten kann derzeit nicht vom angemeldeten Benutzer entfernen werden removeUserEditRightFromOwnUser = Das Recht Benutzerrecht bearbeiten kann derzeit nicht vom angemeldeten Benutzer entfernen werden -externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +externalMessageRefersToMultipleEntities = Die externe Nachricht bezieht sich auf mehrere Entitäten (mindestens zwei Fälle oder einen Fall und einen Kontakt oder einen Ereignis-Teilnehmer) From e97bd34864fb6d950ae39f428be5821b50bb3058 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Fri, 9 Dec 2022 13:27:49 +0100 Subject: [PATCH 053/147] fix, changed user --- .../src/test/resources/features/sanity/web/Contacts.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature index e97940e69b7..27159bbe75c 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature @@ -149,7 +149,7 @@ Feature: Contacts end to end tests When API: I create a new contact Then API: I check that POST call body is "OK" And API: I check that POST call status code is 200 - Given I log in as a National User + Given I log in as a Admin User When I am accessing the Follow-up visits tab using of created contact via api Then I click on New visit button from Follow-up visits tab And I create a new Follow-up visit From 0f5c30b94059a92b780a6d41d65e0f6965e8bf32 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Fri, 9 Dec 2022 13:28:59 +0100 Subject: [PATCH 054/147] fix, changed user --- .../src/test/resources/features/sanity/web/Contacts.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature index 27159bbe75c..5512fa8330c 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature @@ -141,7 +141,7 @@ Feature: Contacts end to end tests And I filter by Contact uuid Then I am checking if all the fields are correctly displayed in the Contacts directory Detailed table - @env_main + @env_main @testIt Scenario: Edit all fields from Follow-up visits tab When API: I create a new person Then API: I check that POST call body is "OK" From 957b7b692896ed83dbb3d2555dcf07f66e50cd7b Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Fri, 9 Dec 2022 13:33:43 +0100 Subject: [PATCH 055/147] fix, changed user --- .../src/test/resources/features/sanity/web/Contacts.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature index 5512fa8330c..27159bbe75c 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Contacts.feature @@ -141,7 +141,7 @@ Feature: Contacts end to end tests And I filter by Contact uuid Then I am checking if all the fields are correctly displayed in the Contacts directory Detailed table - @env_main @testIt + @env_main Scenario: Edit all fields from Follow-up visits tab When API: I create a new person Then API: I check that POST call body is "OK" From a21790a8e1b52f802c847ef9d792a8f312fa67a3 Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Fri, 9 Dec 2022 15:38:29 +0100 Subject: [PATCH 056/147] fixes --- .../steps/web/application/mSers/MSersDirectorySteps.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/mSers/MSersDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/mSers/MSersDirectorySteps.java index b38ea3e70dd..17cbb650eb3 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/mSers/MSersDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/mSers/MSersDirectorySteps.java @@ -329,10 +329,9 @@ public MSersDirectorySteps( () -> { webDriverHelpers.waitUntilIdentifiedElementIsPresent(NEW_AGGREGATE_REPORT_BUTTON); while (webDriverHelpers.getNumberOfElements(RESULT_IN_GRID) > 0) { - do { + while (!webDriverHelpers.isElementVisibleWithTimeout(getEditButtonByIndex(1), 2)) { webDriverHelpers.scrollInTable(5); - } while (!webDriverHelpers.isElementVisibleWithTimeout(getEditButtonByIndex(1), 2)); - + } webDriverHelpers.waitUntilIdentifiedElementIsPresent(getEditButtonByIndex(1)); webDriverHelpers.doubleClickOnWebElementBySelector(getEditButtonByIndex(1)); webDriverHelpers.clickOnWebElementBySelector(DELETE_AGGREGATED_REPORT_BUTTON); From 0c6fea9445803c9574c0856b5da6e48ea8cea830 Mon Sep 17 00:00:00 2001 From: Razvan Date: Fri, 9 Dec 2022 18:31:16 +0200 Subject: [PATCH 057/147] #10575AdjustAPIResponseChecks : adjusted code --- .../steps/api/commonSteps/ResponseChecksSteps.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/commonSteps/ResponseChecksSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/commonSteps/ResponseChecksSteps.java index 0961ff12cf7..91ebe8bd36a 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/commonSteps/ResponseChecksSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/commonSteps/ResponseChecksSteps.java @@ -35,8 +35,8 @@ public ResponseChecksSteps(ApiState apiState, RestAssuredClient restAssuredClien if (responseBody.isEmpty()) { Assert.fail("Response body call is empty!"); } - if (responseBody.equalsIgnoreCase("TRANSACTIONROLLEDBACKEXCEPTION")) { - Assert.fail("API call failed due to wrong data used in sent json!"); + if (responseBody.contains("TRANSACTIONROLLEDBACKEXCEPTION")) { + Assert.fail("API call failed due to wrong data used in sent json! [TRANSACTIONROLLEDBACKEXCEPTION]"); } String regexUpdatedResponseBody = responseBody.replaceAll("[^a-zA-Z0-9]", ""); Assert.assertEquals( @@ -50,8 +50,8 @@ public ResponseChecksSteps(ApiState apiState, RestAssuredClient restAssuredClien if (responseBody.isEmpty()) { Assert.fail("Response body call is empty!"); } - if (responseBody.equalsIgnoreCase("TRANSACTIONROLLEDBACKEXCEPTION")) { - Assert.fail("API call failed due to wrong data used in sent json!"); + if (responseBody.contains("TRANSACTIONROLLEDBACKEXCEPTION")) { + Assert.fail("API call failed due to wrong data used in sent json! [TRANSACTIONROLLEDBACKEXCEPTION]"); } String regexUpdatedResponseBody = responseBody.replaceAll("[^a-zA-Z0-9]", ""); Assert.assertEquals( @@ -77,7 +77,7 @@ public ResponseChecksSteps(ApiState apiState, RestAssuredClient restAssuredClien expectedBody, "Request response body is not correct"); } catch (Exception any) { - Assert.fail("Unable to check response body due to: " + any.getMessage()); + throw new Exception("Unable to check response body due to: " + any.getMessage()); } }); From f6f330d4665531a1e85e945c89947e3dbd668864 Mon Sep 17 00:00:00 2001 From: Stefan Kock Date: Fri, 9 Dec 2022 20:12:17 +0100 Subject: [PATCH 058/147] #10958 FilteredGrid.getDataSize returns cached size - Added DataSizeChangeEvent and -Listener for FiltererdGrid - New methods to create DataProviders that update FiltererdGrid.getDataSize and trigger DataSizeChangeEvent - Reduce duplicate code: Methods to create Lazy and Eager DataProvider - Methods to be avoided are now deprecated, getItemCount to be removed --- .../sormas/ui/utils/DataSizeChangeEvent.java | 37 +++++ .../ui/utils/DataSizeChangeListener.java | 27 ++++ .../symeda/sormas/ui/utils/FilteredGrid.java | 143 +++++++++++++++++- 3 files changed, 205 insertions(+), 2 deletions(-) create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DataSizeChangeEvent.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DataSizeChangeListener.java diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DataSizeChangeEvent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DataSizeChangeEvent.java new file mode 100644 index 00000000000..df526cc36b5 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DataSizeChangeEvent.java @@ -0,0 +1,37 @@ +/* + * 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.utils; + +import com.vaadin.ui.Component; + +public class DataSizeChangeEvent extends Component.Event { + + private static final long serialVersionUID = -4584999224530662763L; + + private final int size; + + public DataSizeChangeEvent(Component source, int size) { + super(source); + this.size = size; + } + + /** + * @return The new data size. + */ + public int getSize() { + return size; + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DataSizeChangeListener.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DataSizeChangeListener.java new file mode 100644 index 00000000000..93c13114823 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/DataSizeChangeListener.java @@ -0,0 +1,27 @@ +/* + * 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.utils; + +import com.vaadin.event.SerializableEventListener; + +public interface DataSizeChangeListener extends SerializableEventListener { + + /** + * @param event + * If the data changes, this {@code event} notifies the new data size. + */ + void dataSizeChange(DataSizeChangeEvent event); +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FilteredGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FilteredGrid.java index c35317537af..77280dc7a55 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FilteredGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FilteredGrid.java @@ -4,12 +4,20 @@ import java.util.List; import java.util.Set; import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import com.vaadin.data.provider.CallbackDataProvider; +import com.vaadin.data.provider.CallbackDataProvider.CountCallback; +import com.vaadin.data.provider.CallbackDataProvider.FetchCallback; import com.vaadin.data.provider.ConfigurableFilterDataProvider; import com.vaadin.data.provider.DataProvider; +import com.vaadin.data.provider.ListDataProvider; import com.vaadin.data.provider.Query; import com.vaadin.icons.VaadinIcons; import com.vaadin.server.SerializableSupplier; +import com.vaadin.shared.Registration; +import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.Grid; import com.vaadin.ui.Label; import com.vaadin.ui.renderers.HtmlRenderer; @@ -18,6 +26,7 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.i18n.Strings; import de.symeda.sormas.api.user.UserRight; +import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.criteria.BaseCriteria; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableIndexDto; import de.symeda.sormas.ui.UserProvider; @@ -35,6 +44,7 @@ public class FilteredGrid extends Grid { private C criteria; private boolean inEagerMode; + private int dataSize; public FilteredGrid(Class beanType) { super(beanType); @@ -64,21 +74,135 @@ public void setInEagerMode(boolean inEagerMode) { this.inEagerMode = inEagerMode; } + /** + * @return Amount of total data with the given filter criteria. + */ + public int getDataSize() { + return dataSize; + } + + public void setDataSize(int dataSize) { + + this.dataSize = dataSize; + fireEvent(new DataSizeChangeEvent(this, this.dataSize)); + } + @SuppressWarnings("unchecked") public ConfigurableFilterDataProvider getFilteredDataProvider() { return (ConfigurableFilterDataProvider) super.getDataProvider(); } - @SuppressWarnings("unchecked") + /** + * get fired when {@link #getDataSize()} is updated. + */ + public Registration addDataSizeChangeListener(DataSizeChangeListener listener) { + return addListener(DataSizeChangeEvent.class, listener, DataSizeChangeListener.class.getMethods()[0]); + } + + /** + *

    + *
  • selectionMode = {@link SelectionMode#NONE}
  • + *
+ * + * @see DataProvider#fromFilteringCallbacks + */ + public void setLazyDataProvider(CriteriaFetchCallback fetchCallback, CriteriaCountCallback countCallback) { + + setLazyDataProvider(fetchCallback, countCallback, SelectionMode.NONE); + } + + /** + * @see DataProvider#fromFilteringCallbacks + */ + public void setLazyDataProvider(CriteriaFetchCallback fetchCallback, CriteriaCountCallback countCallback, SelectionMode selectionMode) { + + setDataProvider( + query -> fetchCallback + .fetchData( + query.getFilter().orElse(null), + query.getOffset(), + query.getLimit(), + query.getSortOrders() + .stream() + .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) + .collect(Collectors.toList())) + .stream(), + query -> countCallback.countData(query.getFilter().orElse(null)).intValue()); + setSelectionMode(selectionMode); + } + + /** + *
    + *
  • selectionMode = {@link SelectionMode#MULTI}
  • + *
+ * + * @see DataProvider#fromStream + */ + public void setEagerDataProvider(CriteriaFetchCallback fetchCallback) { + + setEagerDataProvider(fetchCallback, SelectionMode.MULTI); + } + + /** + * @see DataProvider#fromStream + */ + public void setEagerDataProvider(CriteriaFetchCallback fetchCallback, SelectionMode selectionMode) { + + setDataProvider(fetchCallback.fetchData(getCriteria(), null, null, null).stream()); + setSelectionMode(selectionMode); + } + + /** + * @see DataProvider#fromFilteringCallbacks + */ + public void setDataProvider(FetchCallback fetchCallback, CountCallback countCallback) { + + CallbackDataProvider dataProvider = DataProvider.fromFilteringCallbacks(fetchCallback, q -> { + + // Every time when the count query is executed, then notify to get the cached dataSize updated + int size = countCallback.count(q); + setDataSize(size); + return size; + }); + + setDataProvider(dataProvider); + } + + /** + * @see DataProvider#fromStream + */ + public void setDataProvider(Stream items) { + + ListDataProvider dataProvider = DataProvider.fromStream(items); + + // Every the in-memory data is updated/filtered, then notify to get the cached dataSize updated + dataProvider.addDataProviderListener(e -> { + + int size = e.getSource().size(new Query<>()); + setDataSize(size); + }); + setDataProvider(dataProvider); + } + + /** + * @deprecated Use one of the other methods to create and set a {@link DataProvider} to get {@link #getDataSize()} updated. + */ @Override + @Deprecated + @SuppressWarnings("unchecked") public void setDataProvider(DataProvider dataProvider) { + if (!inEagerMode && !(dataProvider instanceof ConfigurableFilterDataProvider)) { dataProvider = (ConfigurableFilterDataProvider) dataProvider.withConfigurableFilter(); } super.setDataProvider(dataProvider); } + /** + * @deprecated Use one of the other methods to create and set a {@link DataProvider}. + */ @Override + @Deprecated public void setDataProvider(FetchItemsCallback fetchItems, SerializableSupplier sizeCallback) { throw new UnsupportedOperationException(); } @@ -128,6 +252,11 @@ public void bulkActionHandler(Consumer callback, boolean allowAdminOverride } + // TODO #10958 Remove getItemCount(), move everything to getDataSize() + /** + * @deprecated Use {@link #getDataSize()}, because this call triggers another count query for lazy {@link DataProvider}s. + */ + @Deprecated public int getItemCount() { return getDataProvider().size(new Query<>()); } @@ -147,7 +276,7 @@ private void addActionColumnConfiguration(Consumer handler, boolean isEditAct Column editColumn = addColumn(entry -> isEditAction ? VaadinIcons.EDIT.getHtml() : VaadinIcons.EYE.getHtml(), new HtmlRenderer()); editColumn.setId(ACTION_BTN_ID); - editColumn.setCaption(isEditAction? I18nProperties.getCaption(Captions.edit): I18nProperties.getCaption(Captions.view)); + editColumn.setCaption(isEditAction ? I18nProperties.getCaption(Captions.edit) : I18nProperties.getCaption(Captions.view)); editColumn.setSortable(false); editColumn.setWidth(20); @@ -167,4 +296,14 @@ protected void removeColumnIfExists(String columnId) { removeColumn(columnId); } } + + public interface CriteriaFetchCallback { + + List fetchData(C criteria, Integer first, Integer max, List sortProperties); + } + + public interface CriteriaCountCallback { + + Long countData(C criteria); + } } From 46dc2b4d4a1820b45262263fb339229bbc85c85d Mon Sep 17 00:00:00 2001 From: Stefan Kock Date: Fri, 9 Dec 2022 20:13:36 +0100 Subject: [PATCH 059/147] #10958 Use getDataSize on Views for Cases, Persons and Samples --- .../sormas/ui/caze/AbstractCaseGrid.java | 32 ++--------------- .../sormas/ui/caze/CaseFollowUpGrid.java | 24 +++---------- .../de/symeda/sormas/ui/caze/CasesView.java | 7 ++-- .../symeda/sormas/ui/person/PersonGrid.java | 31 ++++------------ .../symeda/sormas/ui/person/PersonsView.java | 4 +-- .../symeda/sormas/ui/samples/SampleGrid.java | 36 ++----------------- .../ui/samples/SampleGridComponent.java | 5 ++- 7 files changed, 23 insertions(+), 116 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseGrid.java index b79d921dc47..294c3c15b51 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/AbstractCaseGrid.java @@ -21,13 +21,8 @@ import java.util.Date; import java.util.List; import java.util.function.Function; -import java.util.stream.Collectors; import java.util.stream.Stream; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.DataProviderListener; -import com.vaadin.data.provider.ListDataProvider; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.Label; import com.vaadin.ui.renderers.DateRenderer; @@ -70,8 +65,6 @@ public abstract class AbstractCaseGrid extends Fi private final boolean caseFollowUpEnabled; private final boolean externalSurveillanceToolShareEnabled; - private DataProviderListener dataProviderListener; - public AbstractCaseGrid(Class beanType, CaseCriteria criteria) { super(beanType); @@ -294,33 +287,12 @@ public void reload() { public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> getGridData( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())).stream(), - query -> (int) FacadeProvider.getCaseFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(this::getGridData, FacadeProvider.getCaseFacade()::count); } public void setEagerDataProvider() { - ListDataProvider dataProvider = DataProvider.fromStream(getGridData(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); - - if (dataProviderListener != null) { - dataProvider.addDataProviderListener(dataProviderListener); - } - } - - public void setDataProviderListener(DataProviderListener dataProviderListener) { - this.dataProviderListener = dataProviderListener; + setEagerDataProvider(this::getGridData); } protected abstract List getGridData(CaseCriteria caseCriteria, Integer first, Integer max, List sortProperties); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFollowUpGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFollowUpGrid.java index c1268e38380..95bb25f446b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFollowUpGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseFollowUpGrid.java @@ -23,11 +23,8 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; import com.vaadin.navigator.View; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.DescriptionGenerator; import com.vaadin.ui.Label; import com.vaadin.ui.StyleGenerator; @@ -40,7 +37,6 @@ import de.symeda.sormas.api.followup.FollowUpDto; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.visit.VisitResultDto; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.utils.DateFormatHelper; @@ -117,22 +113,10 @@ public void reload() { public void setDataProvider(Date referenceDate, int interval) { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getCaseFacade() - .getCaseFollowUpList( - query.getFilter().orElse(null), - referenceDate, - interval, - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getCaseFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider( + (criteria, first, max, sortProperties) -> FacadeProvider.getCaseFacade() + .getCaseFollowUpList(criteria, referenceDate, interval, first, max, sortProperties), + FacadeProvider.getCaseFacade()::count); } private void setDates(Date referenceDate, int interval) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java index efc0f99f932..130506b8d26 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CasesView.java @@ -177,7 +177,6 @@ public CasesView() { } else { criteria.followUpUntilFrom(null); grid = CasesViewType.DETAILED.equals(viewConfiguration.getViewType()) ? new CaseGridDetailed(criteria) : new CaseGrid(criteria); - ((AbstractCaseGrid) grid).setDataProviderListener(e -> updateStatusButtons()); } final VerticalLayout gridLayout = new VerticalLayout(); gridLayout.addComponent(createFilterBar()); @@ -194,7 +193,7 @@ public CasesView() { gridLayout.setExpandRatio(grid, 1); gridLayout.setStyleName("crud-main-layout"); - grid.getDataProvider().addDataProviderListener(e -> updateStatusButtons()); + grid.addDataSizeChangeListener(e -> updateStatusButtons()); OptionGroup casesViewSwitcher = new OptionGroup(); casesViewSwitcher.setId("casesViewSwitcher"); @@ -419,7 +418,7 @@ private void addCommonCasesOverviewToolbar() { if (isBulkEditAllowed()) { btnEnterBulkEditMode = ButtonHelper.createIconButton(Captions.actionEnterBulkEditMode, VaadinIcons.CHECK_SQUARE_O, e -> { - if (grid.getItemCount() > BULK_EDIT_MODE_WARNING_THRESHOLD) { + if (grid.getDataSize() > BULK_EDIT_MODE_WARNING_THRESHOLD) { VaadinUiUtil.showConfirmationPopup( I18nProperties.getCaption(Captions.actionEnterBulkEditMode), new Label(String.format(I18nProperties.getString(Strings.confirmationEnterBulkEditMode), BULK_EDIT_MODE_WARNING_THRESHOLD)), @@ -872,7 +871,7 @@ private void updateStatusButtons() { CssStyles.removeStyles(activeStatusButton, CssStyles.BUTTON_FILTER_LIGHT); if (activeStatusButton != null) { activeStatusButton - .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getItemCount()))); + .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getDataSize()))); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonGrid.java index e6ab709410b..2e789d67947 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonGrid.java @@ -1,10 +1,7 @@ package de.symeda.sormas.ui.person; import java.util.List; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.renderers.TextRenderer; import de.symeda.sormas.api.FacadeProvider; @@ -16,7 +13,6 @@ import de.symeda.sormas.api.person.PersonHelper; import de.symeda.sormas.api.person.PersonIndexDto; import de.symeda.sormas.api.user.UserRight; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.utils.FieldAccessColumnStyleGenerator; @@ -87,29 +83,16 @@ private void initColumns() { } public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getPersonFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getPersonFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - if (bulkEditMode && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { - setSelectionMode(SelectionMode.MULTI); - } else { - setSelectionMode(SelectionMode.NONE); - } + + setLazyDataProvider( + FacadeProvider.getPersonFacade()::getIndexList, + FacadeProvider.getPersonFacade()::count, + bulkEditMode && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS) ? SelectionMode.MULTI : SelectionMode.NONE); } public void setFixDataProvider(List list) { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks(query -> list.stream(), query -> list.size()); - setDataProvider(dataProvider); + + setDataProvider(query -> list.stream(), query -> list.size()); } protected void setBulkEditMode(boolean bulkEditMode) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonsView.java index 4fd743c1185..30c00d8446d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/person/PersonsView.java @@ -140,7 +140,7 @@ public PersonsView() { addHeaderComponent(setMissingCoordinatesButton); } - grid.getDataProvider().addDataProviderListener(e -> updateAssociationButtons()); + grid.addDataSizeChangeListener(e -> updateAssociationButtons()); } else { criteria = new PersonCriteria(); grid = null; @@ -264,7 +264,7 @@ private void updateAssociationButtons() { if (activeAssociationButton != null) { CssStyles.removeStyles(activeAssociationButton, CssStyles.BUTTON_FILTER_LIGHT); activeAssociationButton.setCaption( - associationButtons.get(activeAssociationButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getItemCount()))); + associationButtons.get(activeAssociationButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getDataSize()))); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGrid.java index bf617545dcb..2118a96f140 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGrid.java @@ -20,12 +20,7 @@ import static java.util.Objects.nonNull; import java.util.Date; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.DataProviderListener; -import com.vaadin.data.provider.ListDataProvider; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.renderers.DateRenderer; import de.symeda.sormas.api.ConfigFacade; @@ -41,7 +36,6 @@ import de.symeda.sormas.api.sample.SampleIndexDto; import de.symeda.sormas.api.sample.SpecimenCondition; import de.symeda.sormas.api.user.UserRight; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; @@ -60,8 +54,6 @@ public class SampleGrid extends FilteredGrid { private static final String DISEASE_SHORT = Captions.columnDiseaseShort; private static final String LAST_PATHOGEN_TEST = Captions.columnLastPathogenTest; - private DataProviderListener dataProviderListener; - @SuppressWarnings("unchecked") public SampleGrid(SampleCriteria criteria) { super(SampleIndexDto.class); @@ -228,34 +220,12 @@ public void reload() { } public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getSampleFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getSampleFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + + setLazyDataProvider(FacadeProvider.getSampleFacade()::getIndexList, FacadeProvider.getSampleFacade()::count); } public void setEagerDataProvider() { - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getSampleFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); - - if (dataProviderListener != null) { - dataProvider.addDataProviderListener(dataProviderListener); - } - } - public void setDataProviderListener(DataProviderListener dataProviderListener) { - this.dataProviderListener = dataProviderListener; + setEagerDataProvider(FacadeProvider.getSampleFacade()::getIndexList); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java index bff56f075c8..f84ab32338e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/SampleGridComponent.java @@ -90,8 +90,7 @@ public SampleGridComponent(Label viewTitleLabel, SamplesView samplesView) { gridLayout.addComponent(createFilterBar()); gridLayout.addComponent(createShipmentFilterBar()); gridLayout.addComponent(grid); - grid.setDataProviderListener(e -> updateStatusButtons()); - grid.getDataProvider().addDataProviderListener(e -> updateStatusButtons()); + grid.addDataSizeChangeListener(e -> updateStatusButtons()); styleGridLayout(gridLayout); gridLayout.setMargin(true); @@ -312,7 +311,7 @@ private void updateStatusButtons() { CssStyles.removeStyles(activeStatusButton, CssStyles.BUTTON_FILTER_LIGHT); if (activeStatusButton != null) { activeStatusButton - .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getItemCount()))); + .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getDataSize()))); } } From b8d76c878fc8930da61ea87281b9f5df88d884d0 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 12 Dec 2022 10:46:56 +0100 Subject: [PATCH 060/147] fix sorqa-646 --- .../steps/web/application/tasks/TaskManagementSteps.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java index 5ce584fca77..fc757c33b14 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java @@ -94,6 +94,7 @@ public TaskManagementSteps( webDriverHelpers.clickOnWebElementBySelector( TRAVEL_ENTRY_DIRECTORY_PAGE_SHOW_MORE_FILTERS_BUTTON); TimeUnit.SECONDS.sleep(4); + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(40); }); When( From 5899e526fd3a127d64f707feaf3aa4ebe23c8333 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 12 Dec 2022 11:08:45 +0100 Subject: [PATCH 061/147] fix sorqa-646 --- .../steps/web/application/tasks/TaskManagementSteps.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java index fc757c33b14..7c292c83c0f 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java @@ -89,6 +89,7 @@ public TaskManagementSteps( And( "I click on SHOW MORE FILTERS BUTTON on Task directory page", () -> { + TimeUnit.SECONDS.sleep(2); // weak performance webDriverHelpers.waitUntilElementIsVisibleAndClickable( TRAVEL_ENTRY_DIRECTORY_PAGE_SHOW_MORE_FILTERS_BUTTON); webDriverHelpers.clickOnWebElementBySelector( From d1eb1df85faf35fc058bc180f19b8d6671bd8069 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 12 Dec 2022 11:45:54 +0100 Subject: [PATCH 062/147] fix sorqa-646 --- .../steps/web/application/tasks/TaskManagementSteps.java | 7 ++----- .../src/test/resources/features/sanity/web/Task.feature | 4 ++-- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java index 7c292c83c0f..fe61e7f8bca 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/tasks/TaskManagementSteps.java @@ -21,7 +21,6 @@ import static org.sormas.e2etests.pages.application.cases.CaseDirectoryPage.TOTAL_CASES_COUNTER; import static org.sormas.e2etests.pages.application.contacts.EditContactPage.NOTIFICATION_MESSAGE_POPUP; import static org.sormas.e2etests.pages.application.contacts.EditContactPage.POPUP_YES_BUTTON; -import static org.sormas.e2etests.pages.application.entries.TravelEntryPage.TRAVEL_ENTRY_DIRECTORY_PAGE_SHOW_MORE_FILTERS_BUTTON; import static org.sormas.e2etests.pages.application.events.EventDirectoryPage.APPLY_FILTER; import static org.sormas.e2etests.pages.application.events.EventDirectoryPage.BULK_ACTIONS_EVENT_DIRECTORY; import static org.sormas.e2etests.pages.application.events.EventDirectoryPage.RESET_FILTER; @@ -90,10 +89,8 @@ public TaskManagementSteps( "I click on SHOW MORE FILTERS BUTTON on Task directory page", () -> { TimeUnit.SECONDS.sleep(2); // weak performance - webDriverHelpers.waitUntilElementIsVisibleAndClickable( - TRAVEL_ENTRY_DIRECTORY_PAGE_SHOW_MORE_FILTERS_BUTTON); - webDriverHelpers.clickOnWebElementBySelector( - TRAVEL_ENTRY_DIRECTORY_PAGE_SHOW_MORE_FILTERS_BUTTON); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(SHOW_MORE_FILTERS); + webDriverHelpers.clickOnWebElementBySelector(SHOW_MORE_FILTERS); TimeUnit.SECONDS.sleep(4); webDriverHelpers.waitForPageLoadingSpinnerToDisappear(40); }); diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature index 733eaeb3623..30c34008738 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature @@ -179,8 +179,8 @@ Feature: Tasks functionalities And I click on the Tasks button from navbar And I click on the NEW TASK button When I create a new task with specific data - And I click on the Tasks button from navbar - And I click on SHOW MORE FILTERS BUTTON on Task directory page + # And I click on the Tasks button from navbar + # And I click on SHOW MORE FILTERS BUTTON on Task directory page And I filter out last created task from Tasks Directory And I click Export button in Task Directory When I click on the Custom Event Export button From 22aba2ca6dfae04fb12bc604216edad211238ff3 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 12 Dec 2022 11:54:59 +0100 Subject: [PATCH 063/147] fix --- .../src/test/resources/features/sanity/web/Task.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature index 30c34008738..603048ba2c0 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature @@ -167,7 +167,7 @@ Feature: Tasks functionalities And I click on the NEW TASK button When I create a new task with specific data And I click on the Tasks button from navbar - And I click on SHOW MORE FILTERS BUTTON on Task directory page + # And I click on SHOW MORE FILTERS BUTTON on Task directory page And I filter out last created task from Tasks Directory And I click Export button in Task Directory When I click on the Detailed Task Export button From 103c43ac4bc985e8b82ba30448929a31cd28a62b Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 12 Dec 2022 12:19:50 +0100 Subject: [PATCH 064/147] fix --- .../src/test/resources/features/sanity/web/Task.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature index 603048ba2c0..2b1653e5cb7 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature @@ -197,7 +197,7 @@ Feature: Tasks functionalities And I click on the Tasks button from navbar And I click on the NEW TASK button When I create a new task with specific data - And I click on the Tasks button from navbar + # And I click on the Tasks button from navbar And I filter out last created task from Tasks Directory And I click Export button in Task Directory When I click on the Custom Event Export button From 54b9fe59d6b675c8aa89a57aa2a5cdb0bf0bbdac Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 12 Dec 2022 12:28:22 +0100 Subject: [PATCH 065/147] fix --- .../src/test/resources/features/sanity/web/Task.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature index 2b1653e5cb7..fc4f22b5447 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Task.feature @@ -166,7 +166,7 @@ Feature: Tasks functionalities And I click on the Tasks button from navbar And I click on the NEW TASK button When I create a new task with specific data - And I click on the Tasks button from navbar +# And I click on the Tasks button from navbar # And I click on SHOW MORE FILTERS BUTTON on Task directory page And I filter out last created task from Tasks Directory And I click Export button in Task Directory From 0094fc99e00a4106ef442b0af950fb45b740be7d Mon Sep 17 00:00:00 2001 From: Jonas Cirotzki Date: Mon, 12 Dec 2022 14:16:28 +0100 Subject: [PATCH 066/147] [#10251] move resources to resource pkg --- .../de/symeda/sormas/rest/RestConfig.java | 20 +++++++++---------- .../sormas/rest/StringMessageBodyWriter.java | 10 ++++------ .../rest/{ => filter}/SessionFilter.java | 15 +++++++------- .../rest/{ => filter}/SessionFilterBean.java | 9 +++++---- .../rest/{ => filter}/Slf4jMdcFilter.java | 2 +- .../rest/{ => resources}/ActionResource.java | 2 +- .../AdditionalTestResource.java | 2 +- .../AggregateReportResource.java | 2 +- .../rest/{ => resources}/AreaResource.java | 2 +- .../{ => resources}/BAGExportResource.java | 2 +- .../CampaignFormDataResource.java | 2 +- .../CampaignFormMetaResource.java | 2 +- .../{ => resources}/CampaignResource.java | 2 +- .../rest/{ => resources}/CaseResource.java | 2 +- .../ClassificationResource.java | 2 +- .../ClinicalVisitResource.java | 2 +- .../{ => resources}/CommunityResource.java | 2 +- .../rest/{ => resources}/ContactResource.java | 2 +- .../{ => resources}/ContinentResource.java | 2 +- .../rest/{ => resources}/CountryResource.java | 2 +- .../CustomizableEnumValueResource.java | 2 +- .../{ => resources}/DashboardResource.java | 2 +- .../DiseaseConfigurationResource.java | 2 +- .../{ => resources}/DistrictResource.java | 2 +- .../{ => resources}/DocumentResource.java | 2 +- .../{ => resources}/EntityDtoResource.java | 3 ++- .../{ => resources}/EventGroupResource.java | 2 +- .../EventParticipantResource.java | 2 +- .../rest/{ => resources}/EventResource.java | 2 +- ...ternalSurveillanceToolGatewayResource.java | 2 +- .../ExternalVisitsResource.java | 3 +-- .../{ => resources}/FacilityResource.java | 2 +- .../FeatureConfigurationResource.java | 2 +- .../{ => resources}/ImmunizationResource.java | 2 +- .../rest/{ => resources}/InfoResource.java | 2 +- .../InfrastructureResource.java | 2 +- .../{ => resources}/LabMessageResource.java | 2 +- .../{ => resources}/LineListingResource.java | 2 +- .../{ => resources}/OutbreakResource.java | 2 +- .../{ => resources}/PathogenTestResource.java | 2 +- .../rest/{ => resources}/PersonResource.java | 2 +- .../{ => resources}/PointOfEntryResource.java | 2 +- .../{ => resources}/PrescriptionResource.java | 2 +- .../rest/{ => resources}/RegionResource.java | 2 +- .../rest/{ => resources}/SampleResource.java | 2 +- .../{ => resources}/ShareRequestResource.java | 2 +- .../SormasToSormasResource.java | 2 +- .../{ => resources}/SubcontinentResource.java | 2 +- .../SurveillanceReportResource.java | 3 ++- .../rest/{ => resources}/TaskResource.java | 3 ++- .../{ => resources}/TravelEntryResource.java | 2 +- .../{ => resources}/TreatmentResource.java | 3 ++- .../rest/{ => resources}/UserResource.java | 2 +- .../{ => resources}/UserRoleResource.java | 2 +- .../rest/{ => resources}/VisitResource.java | 2 +- .../{ => resources}/WeeklyReportResource.java | 2 +- 56 files changed, 82 insertions(+), 81 deletions(-) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => filter}/SessionFilter.java (83%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => filter}/SessionFilterBean.java (83%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => filter}/Slf4jMdcFilter.java (96%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/ActionResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/AdditionalTestResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/AggregateReportResource.java (97%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/AreaResource.java (95%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/BAGExportResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/CampaignFormDataResource.java (96%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/CampaignFormMetaResource.java (95%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/CampaignResource.java (95%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/CaseResource.java (99%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/ClassificationResource.java (97%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/ClinicalVisitResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/CommunityResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/ContactResource.java (99%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/ContinentResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/CountryResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/CustomizableEnumValueResource.java (97%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/DashboardResource.java (99%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/DiseaseConfigurationResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/DistrictResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/DocumentResource.java (96%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/EntityDtoResource.java (97%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/EventGroupResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/EventParticipantResource.java (99%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/EventResource.java (99%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/ExternalSurveillanceToolGatewayResource.java (95%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{externaljournal => resources}/ExternalVisitsResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/FacilityResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/FeatureConfigurationResource.java (96%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/ImmunizationResource.java (99%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/InfoResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/InfrastructureResource.java (94%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/LabMessageResource.java (96%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/LineListingResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/OutbreakResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/PathogenTestResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/PersonResource.java (99%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/PointOfEntryResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/PrescriptionResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/RegionResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/SampleResource.java (99%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/ShareRequestResource.java (97%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/SormasToSormasResource.java (99%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/SubcontinentResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/SurveillanceReportResource.java (91%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/TaskResource.java (97%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/TravelEntryResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/TreatmentResource.java (95%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/UserResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/UserRoleResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/VisitResource.java (98%) rename sormas-rest/src/main/java/de/symeda/sormas/rest/{ => resources}/WeeklyReportResource.java (98%) diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/RestConfig.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/RestConfig.java index ce5f7ddcd9f..eb564923d26 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/RestConfig.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/RestConfig.java @@ -14,6 +14,8 @@ */ package de.symeda.sormas.rest; +import java.util.EnumSet; + import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; import javax.servlet.ServletContext; @@ -22,13 +24,20 @@ import javax.servlet.annotation.WebListener; import javax.ws.rs.ApplicationPath; +import org.apache.commons.collections4.SetUtils; +import org.glassfish.jersey.jackson.JacksonFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import de.symeda.sormas.api.AuthProvider; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.utils.InfoProvider; -import de.symeda.sormas.rest.externaljournal.ExternalVisitsResource; +import de.symeda.sormas.rest.resources.ExternalVisitsResource; import de.symeda.sormas.rest.security.KeycloakFilter; import de.symeda.sormas.rest.swagger.AttributeConverter; import de.symeda.sormas.rest.swagger.SormasSwaggerExtensions; +import de.symeda.sormas.rest.swagger.SwaggerConfig; import io.swagger.v3.core.converter.ModelConverters; import io.swagger.v3.core.util.Json; import io.swagger.v3.jaxrs2.integration.resources.OpenApiResource; @@ -37,15 +46,6 @@ import io.swagger.v3.oas.models.info.Contact; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.info.License; -import org.apache.commons.collections4.SetUtils; -import org.glassfish.jersey.jackson.JacksonFeature; -import org.glassfish.jersey.server.ResourceConfig; - -import de.symeda.sormas.rest.swagger.SwaggerConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.EnumSet; /** * @see Jersey documentation diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/StringMessageBodyWriter.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/StringMessageBodyWriter.java index 24e2a1d2ab2..61f7de88457 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/StringMessageBodyWriter.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/StringMessageBodyWriter.java @@ -1,20 +1,18 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * 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.rest; import java.io.IOException; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/SessionFilter.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/filter/SessionFilter.java similarity index 83% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/SessionFilter.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/filter/SessionFilter.java index 4af8e5fdbee..1e109090f52 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/SessionFilter.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/filter/SessionFilter.java @@ -1,21 +1,19 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) - * + * 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.rest; + */ + +package de.symeda.sormas.rest.filter; import java.io.IOException; @@ -49,7 +47,8 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha try { sessionFilterBean.doFilter((req, resp) -> { final String isMobileSyncHeader = ((HttpServletRequest) request).getHeader("mobile-sync"); - final RequestContextTO requestContext = new RequestContextTO(isMobileSyncHeader != null ? Boolean.valueOf(isMobileSyncHeader) : false); + final RequestContextTO requestContext = + new RequestContextTO(isMobileSyncHeader != null ? Boolean.valueOf(isMobileSyncHeader) : false); RequestContextHolder.setRequestContext(requestContext); FacadeProvider.getConfigFacade().setRequestContext(requestContext); chain.doFilter(req, response); diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/SessionFilterBean.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/filter/SessionFilterBean.java similarity index 83% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/SessionFilterBean.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/filter/SessionFilterBean.java index e5c11de3192..1a3e246e2c3 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/SessionFilterBean.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/filter/SessionFilterBean.java @@ -1,6 +1,6 @@ -/******************************************************************************* +/* * SORMAS® - Surveillance Outbreak Response Management & Analysis System - * Copyright © 2016-2018 Helmholtz-Zentrum für Infektionsforschung GmbH (HZI) + * 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 @@ -14,8 +14,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - *******************************************************************************/ -package de.symeda.sormas.rest; +*/ + +package de.symeda.sormas.rest.filter; import java.io.IOException; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/Slf4jMdcFilter.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/filter/Slf4jMdcFilter.java similarity index 96% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/Slf4jMdcFilter.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/filter/Slf4jMdcFilter.java index 350104d8ea9..670059b9cbf 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/Slf4jMdcFilter.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/filter/Slf4jMdcFilter.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.filter; import java.io.IOException; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/ActionResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ActionResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/ActionResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ActionResource.java index 729f929b031..d5bb89dd40a 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/ActionResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ActionResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/AdditionalTestResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/AdditionalTestResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/AdditionalTestResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/AdditionalTestResource.java index 2f36a114b00..2dc420870b5 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/AdditionalTestResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/AdditionalTestResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/AggregateReportResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/AggregateReportResource.java similarity index 97% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/AggregateReportResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/AggregateReportResource.java index eed04c1bba8..59e991bebfa 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/AggregateReportResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/AggregateReportResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/AreaResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/AreaResource.java similarity index 95% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/AreaResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/AreaResource.java index 35e351a625d..74e398b54a1 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/AreaResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/AreaResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/BAGExportResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/BAGExportResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/BAGExportResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/BAGExportResource.java index a33d3bd688f..d1cf7fcecf1 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/BAGExportResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/BAGExportResource.java @@ -13,7 +13,7 @@ * along with this program. If not, see . */ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.io.OutputStream; import java.util.Collections; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/CampaignFormDataResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CampaignFormDataResource.java similarity index 96% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/CampaignFormDataResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CampaignFormDataResource.java index 2d1ebc01d08..51d8f78cf2b 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/CampaignFormDataResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CampaignFormDataResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/CampaignFormMetaResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CampaignFormMetaResource.java similarity index 95% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/CampaignFormMetaResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CampaignFormMetaResource.java index ee829801b40..9b68939ab23 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/CampaignFormMetaResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CampaignFormMetaResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/CampaignResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CampaignResource.java similarity index 95% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/CampaignResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CampaignResource.java index 0ca68a9e655..effcae8f465 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/CampaignResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CampaignResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/CaseResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CaseResource.java similarity index 99% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/CaseResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CaseResource.java index 5aa65b874c9..35155ca3eba 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/CaseResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CaseResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/ClassificationResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ClassificationResource.java similarity index 97% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/ClassificationResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ClassificationResource.java index 7a00ca286a4..82024e65338 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/ClassificationResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ClassificationResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/ClinicalVisitResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ClinicalVisitResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/ClinicalVisitResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ClinicalVisitResource.java index c4102c8e824..2db39b3fc8a 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/ClinicalVisitResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ClinicalVisitResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/CommunityResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/CommunityResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java index d357c59021b..c599cae734c 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/CommunityResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CommunityResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/ContactResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContactResource.java similarity index 99% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/ContactResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContactResource.java index aa0b28f8562..da32055f140 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/ContactResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContactResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/ContinentResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContinentResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/ContinentResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContinentResource.java index 658aef58c35..3891b045754 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/ContinentResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ContinentResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/CountryResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CountryResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/CountryResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CountryResource.java index 5ba861fa685..67b292d3d3d 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/CountryResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CountryResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/CustomizableEnumValueResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CustomizableEnumValueResource.java similarity index 97% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/CustomizableEnumValueResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CustomizableEnumValueResource.java index 20182f650eb..ebb252f54ec 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/CustomizableEnumValueResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/CustomizableEnumValueResource.java @@ -13,7 +13,7 @@ * along with this program. If not, see . */ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/DashboardResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DashboardResource.java similarity index 99% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/DashboardResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DashboardResource.java index 721e3b4f807..7e8993127d1 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/DashboardResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DashboardResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/DiseaseConfigurationResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DiseaseConfigurationResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/DiseaseConfigurationResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DiseaseConfigurationResource.java index b1f69730a80..bf706d5d684 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/DiseaseConfigurationResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DiseaseConfigurationResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/DistrictResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DistrictResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/DistrictResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DistrictResource.java index 67e37b6d77c..798ad9f804e 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/DistrictResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DistrictResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/DocumentResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DocumentResource.java similarity index 96% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/DocumentResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DocumentResource.java index 82366b7175c..8beb757bddb 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/DocumentResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/DocumentResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.List; import java.util.Map; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/EntityDtoResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EntityDtoResource.java similarity index 97% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/EntityDtoResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EntityDtoResource.java index dfb9df2110c..fb7e5902f51 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/EntityDtoResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EntityDtoResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import static java.util.Objects.isNull; @@ -12,6 +12,7 @@ import javax.ejb.EJB; +import de.symeda.sormas.rest.TransactionWrapper; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; import org.slf4j.Logger; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/EventGroupResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventGroupResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/EventGroupResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventGroupResource.java index 8472062dbba..27baeabb7a5 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/EventGroupResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventGroupResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/EventParticipantResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventParticipantResource.java similarity index 99% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/EventParticipantResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventParticipantResource.java index 788a2436d96..c0caa3e863f 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/EventParticipantResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventParticipantResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/EventResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventResource.java similarity index 99% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/EventResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventResource.java index bf2a70f78e3..2068698670e 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/EventResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/EventResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/ExternalSurveillanceToolGatewayResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ExternalSurveillanceToolGatewayResource.java similarity index 95% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/ExternalSurveillanceToolGatewayResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ExternalSurveillanceToolGatewayResource.java index d3b7d4c6ccb..3b971b238af 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/ExternalSurveillanceToolGatewayResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ExternalSurveillanceToolGatewayResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/externaljournal/ExternalVisitsResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ExternalVisitsResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/externaljournal/ExternalVisitsResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ExternalVisitsResource.java index 7e7f0e9d9f5..9a6be804208 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/externaljournal/ExternalVisitsResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ExternalVisitsResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest.externaljournal; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; @@ -19,7 +19,6 @@ import de.symeda.sormas.api.person.PersonSymptomJournalStatusDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.visit.ExternalVisitDto; -import de.symeda.sormas.rest.EntityDtoResource; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/FacilityResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FacilityResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/FacilityResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FacilityResource.java index 2eeedf1ff9b..0520289647a 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/FacilityResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FacilityResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/FeatureConfigurationResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FeatureConfigurationResource.java similarity index 96% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/FeatureConfigurationResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FeatureConfigurationResource.java index ab01d177546..90466848e72 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/FeatureConfigurationResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/FeatureConfigurationResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/ImmunizationResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ImmunizationResource.java similarity index 99% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/ImmunizationResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ImmunizationResource.java index bb66fdf6654..3c6d2fa729f 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/ImmunizationResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ImmunizationResource.java @@ -13,7 +13,7 @@ * along with this program. If not, see . */ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/InfoResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/InfoResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/InfoResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/InfoResource.java index b584d159325..58e354839b7 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/InfoResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/InfoResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import javax.ws.rs.GET; import javax.ws.rs.Path; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/InfrastructureResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/InfrastructureResource.java similarity index 94% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/InfrastructureResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/InfrastructureResource.java index ef22c62620e..8fec6b7545f 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/InfrastructureResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/InfrastructureResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import javax.ws.rs.POST; import javax.ws.rs.Path; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/LabMessageResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/LabMessageResource.java similarity index 96% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/LabMessageResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/LabMessageResource.java index a8039d3795b..178c063ca27 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/LabMessageResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/LabMessageResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import javax.ws.rs.GET; import javax.ws.rs.POST; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/LineListingResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/LineListingResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/LineListingResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/LineListingResource.java index d42a7e190cd..5d7ab0bf195 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/LineListingResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/LineListingResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.List; import java.util.Map; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/OutbreakResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/OutbreakResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/OutbreakResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/OutbreakResource.java index a583268450a..7c06bebd8a4 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/OutbreakResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/OutbreakResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/PathogenTestResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PathogenTestResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/PathogenTestResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PathogenTestResource.java index 8de2cf62eda..174ec779018 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/PathogenTestResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PathogenTestResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/PersonResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PersonResource.java similarity index 99% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/PersonResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PersonResource.java index 7643f526252..7c5adcfebc9 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/PersonResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PersonResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/PointOfEntryResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PointOfEntryResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/PointOfEntryResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PointOfEntryResource.java index 6eabe9c1a7a..630dcffeb27 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/PointOfEntryResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PointOfEntryResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/PrescriptionResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PrescriptionResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/PrescriptionResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PrescriptionResource.java index 5970215faef..6395df459c5 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/PrescriptionResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/PrescriptionResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/RegionResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/RegionResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/RegionResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/RegionResource.java index 009165c6bc5..3cd8bba2843 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/RegionResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/RegionResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/SampleResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SampleResource.java similarity index 99% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/SampleResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SampleResource.java index 760091d2870..85dbbf8dc19 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/SampleResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SampleResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/ShareRequestResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ShareRequestResource.java similarity index 97% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/ShareRequestResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ShareRequestResource.java index 32eeb53d0df..ba8bc6ec818 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/ShareRequestResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/ShareRequestResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import javax.ws.rs.Consumes; import javax.ws.rs.GET; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/SormasToSormasResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SormasToSormasResource.java similarity index 99% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/SormasToSormasResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SormasToSormasResource.java index b30e23cef4b..0f2a241af31 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/SormasToSormasResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SormasToSormasResource.java @@ -13,7 +13,7 @@ * along with this program. If not, see . */ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.io.IOException; import java.security.KeyStoreException; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/SubcontinentResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SubcontinentResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/SubcontinentResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SubcontinentResource.java index 3c940609224..b6bbf3b233c 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/SubcontinentResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SubcontinentResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/SurveillanceReportResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SurveillanceReportResource.java similarity index 91% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/SurveillanceReportResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SurveillanceReportResource.java index 71342a74bf3..02d02dc9aad 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/SurveillanceReportResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/SurveillanceReportResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.List; @@ -12,6 +12,7 @@ import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.PushResult; import de.symeda.sormas.api.caze.surveillancereport.SurveillanceReportDto; +import de.symeda.sormas.rest.resources.EntityDtoResource; @Path("/surveillancereports") @Produces(MediaType.APPLICATION_JSON + "; charset=UTF-8") diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/TaskResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TaskResource.java similarity index 97% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/TaskResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TaskResource.java index 9dc59160079..1e107391b26 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/TaskResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TaskResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; @@ -37,6 +37,7 @@ import de.symeda.sormas.api.task.TaskCriteria; import de.symeda.sormas.api.task.TaskDto; import de.symeda.sormas.api.task.TaskIndexDto; +import de.symeda.sormas.rest.resources.EntityDtoResource; import io.swagger.v3.oas.annotations.parameters.RequestBody; /** diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/TravelEntryResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TravelEntryResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/TravelEntryResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TravelEntryResource.java index 5d841a3a537..529f7cef62b 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/TravelEntryResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TravelEntryResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/TreatmentResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TreatmentResource.java similarity index 95% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/TreatmentResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TreatmentResource.java index 931ea4c771d..1d8c1f55f69 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/TreatmentResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/TreatmentResource.java @@ -1,4 +1,4 @@ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; @@ -18,6 +18,7 @@ import de.symeda.sormas.api.therapy.TreatmentCriteria; import de.symeda.sormas.api.therapy.TreatmentDto; import de.symeda.sormas.api.therapy.TreatmentIndexDto; +import de.symeda.sormas.rest.resources.EntityDtoResource; import io.swagger.v3.oas.annotations.parameters.RequestBody; @Path("/treatments") diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/UserResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/UserResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/UserResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/UserResource.java index 5ea1badd2b7..451f481b87c 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/UserResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/UserResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/UserRoleResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/UserRoleResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/UserRoleResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/UserRoleResource.java index b75ec6f5e65..2bed3aa241e 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/UserRoleResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/UserRoleResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/VisitResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/VisitResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/VisitResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/VisitResource.java index 59ebf4a9423..dac1c0da12c 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/VisitResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/VisitResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; diff --git a/sormas-rest/src/main/java/de/symeda/sormas/rest/WeeklyReportResource.java b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/WeeklyReportResource.java similarity index 98% rename from sormas-rest/src/main/java/de/symeda/sormas/rest/WeeklyReportResource.java rename to sormas-rest/src/main/java/de/symeda/sormas/rest/resources/WeeklyReportResource.java index 74b0933dbac..f51b587cf5a 100644 --- a/sormas-rest/src/main/java/de/symeda/sormas/rest/WeeklyReportResource.java +++ b/sormas-rest/src/main/java/de/symeda/sormas/rest/resources/WeeklyReportResource.java @@ -15,7 +15,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . *******************************************************************************/ -package de.symeda.sormas.rest; +package de.symeda.sormas.rest.resources; import java.util.Date; import java.util.List; From 9809635e13159e82f92513198c4fa6089c2b9faf Mon Sep 17 00:00:00 2001 From: Frank Hautpmann Date: Tue, 13 Dec 2022 09:24:09 +0100 Subject: [PATCH 067/147] New Crowdin updates (#11146) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * New translations captions.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Spanish, Ecuador) * New translations captions.properties (Croatian) * New translations captions.properties (Hindi) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations enum.properties (Russian) * New translations descriptions.properties (Spanish) * New translations descriptions.properties (Arabic) * New translations validations.properties (French) * New translations descriptions.properties (French) * New translations validations.properties (Romanian) * New translations descriptions.properties (Romanian) * New translations validations.properties (Spanish) * New translations descriptions.properties (Polish) * New translations validations.properties (German) * New translations descriptions.properties (Czech) * New translations validations.properties (Russian) * New translations descriptions.properties (Russian) * New translations validations.properties (Portuguese) * New translations descriptions.properties (Portuguese) * New translations validations.properties (Czech) * New translations descriptions.properties (German) * New translations descriptions.properties (Finnish) * New translations validations.properties (Norwegian) * New translations validations.properties (Finnish) * New translations descriptions.properties (Italian) * New translations validations.properties (Italian) * New translations validations.properties (Polish) * New translations validations.properties (Japanese) * New translations descriptions.properties (Dutch) * New translations validations.properties (Dutch) * New translations descriptions.properties (Norwegian) * New translations descriptions.properties (Japanese) * New translations enum.properties (Swedish) * New translations validations.properties (Arabic) * New translations enum.properties (Swahili) * New translations enum.properties (Ukrainian) * New translations enum.properties (Chinese Simplified) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Spanish, Ecuador) * New translations enum.properties (Croatian) * New translations enum.properties (Hindi) * New translations enum.properties (Filipino) * New translations enum.properties (Fijian) * New translations enum.properties (German, Switzerland) * New translations enum.properties (Turkish) * New translations enum.properties (Nepali) * New translations enum.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations enum.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations enum.properties (English, Ghana) * New translations descriptions.properties (Swedish) * New translations validations.properties (Swedish) * New translations validations.properties (Dari) * New translations descriptions.properties (Nepali) * New translations validations.properties (Nepali) * New translations descriptions.properties (French, Switzerland) * New translations validations.properties (French, Switzerland) * New translations descriptions.properties (Italian, Switzerland) * New translations validations.properties (Italian, Switzerland) * New translations descriptions.properties (Dari) * New translations descriptions.properties (Pashto) * New translations descriptions.properties (German, Switzerland) * New translations validations.properties (Pashto) * New translations descriptions.properties (Spanish, Cuba) * New translations validations.properties (Spanish, Cuba) * New translations descriptions.properties (English, Afghanistan) * New translations validations.properties (English, Afghanistan) * New translations descriptions.properties (English, Nigeria) * New translations validations.properties (English, Nigeria) * New translations descriptions.properties (English, Ghana) * New translations validations.properties (German, Switzerland) * New translations validations.properties (Swahili) * New translations descriptions.properties (Turkish) * New translations descriptions.properties (Spanish, Ecuador) * New translations validations.properties (Turkish) * New translations descriptions.properties (Ukrainian) * New translations validations.properties (Ukrainian) * New translations descriptions.properties (Chinese Simplified) * New translations validations.properties (Chinese Simplified) * New translations descriptions.properties (Urdu (Pakistan)) * New translations validations.properties (Urdu (Pakistan)) * New translations validations.properties (Spanish, Ecuador) * New translations descriptions.properties (Swahili) * New translations descriptions.properties (Croatian) * New translations validations.properties (Croatian) * New translations descriptions.properties (Hindi) * New translations validations.properties (Hindi) * New translations descriptions.properties (Filipino) * New translations validations.properties (Filipino) * New translations descriptions.properties (Fijian) * New translations validations.properties (Fijian) * New translations validations.properties (English, Ghana) * New translations strings.properties (German, Switzerland) * New translations captions.properties (Romanian) * New translations captions.properties (French) * New translations captions.properties (Spanish) * New translations captions.properties (Arabic) * New translations captions.properties (Czech) * New translations captions.properties (German) * New translations captions.properties (Finnish) * New translations captions.properties (Italian) * New translations captions.properties (Japanese) * New translations captions.properties (Dutch) * New translations captions.properties (Norwegian) * New translations captions.properties (Polish) * New translations captions.properties (Portuguese) * New translations captions.properties (Russian) * New translations captions.properties (Swedish) * New translations captions.properties (Turkish) * New translations captions.properties (Ukrainian) * New translations captions.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Spanish, Ecuador) * New translations captions.properties (Croatian) * New translations captions.properties (Hindi) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations captions.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Spanish, Ecuador) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations enum.properties (German, Switzerland) * New translations descriptions.properties (German, Switzerland) * New translations validations.properties (German, Switzerland) * New translations captions.properties (German) * New translations captions.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (German, Switzerland) * New translations captions.properties (German, Switzerland) * New translations strings.properties (German, Switzerland) * New translations enum.properties (French) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Spanish, Ecuador) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations enum.properties (Romanian) * New translations enum.properties (Spanish) * New translations enum.properties (Arabic) * New translations enum.properties (Czech) * New translations enum.properties (German) * New translations enum.properties (Finnish) * New translations enum.properties (Italian) * New translations enum.properties (Japanese) * New translations enum.properties (Dutch) * New translations enum.properties (Norwegian) * New translations enum.properties (Polish) * New translations enum.properties (Portuguese) * New translations enum.properties (Russian) * New translations enum.properties (Swedish) * New translations enum.properties (Turkish) * New translations enum.properties (Ukrainian) * New translations enum.properties (Chinese Simplified) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Spanish, Ecuador) * New translations enum.properties (Croatian) * New translations enum.properties (Hindi) * New translations enum.properties (Filipino) * New translations enum.properties (Fijian) * New translations enum.properties (Swahili) * New translations enum.properties (German, Switzerland) * New translations enum.properties (Nepali) * New translations enum.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations enum.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations enum.properties (English, Ghana) Co-authored-by: Maté Strysewske --- sormas-api/src/main/resources/captions_de-CH.properties | 2 +- sormas-api/src/main/resources/enum_ar-SA.properties | 2 ++ sormas-api/src/main/resources/enum_cs-CZ.properties | 2 ++ sormas-api/src/main/resources/enum_de-CH.properties | 2 ++ sormas-api/src/main/resources/enum_de-DE.properties | 2 ++ sormas-api/src/main/resources/enum_en-AF.properties | 2 ++ sormas-api/src/main/resources/enum_en-GH.properties | 2 ++ sormas-api/src/main/resources/enum_en-NG.properties | 2 ++ sormas-api/src/main/resources/enum_es-CU.properties | 2 ++ sormas-api/src/main/resources/enum_es-EC.properties | 2 ++ sormas-api/src/main/resources/enum_es-ES.properties | 2 ++ sormas-api/src/main/resources/enum_fa-AF.properties | 2 ++ sormas-api/src/main/resources/enum_fi-FI.properties | 2 ++ sormas-api/src/main/resources/enum_fil-PH.properties | 2 ++ sormas-api/src/main/resources/enum_fj-FJ.properties | 2 ++ sormas-api/src/main/resources/enum_fr-CH.properties | 2 ++ sormas-api/src/main/resources/enum_fr-FR.properties | 2 ++ sormas-api/src/main/resources/enum_hi-IN.properties | 2 ++ sormas-api/src/main/resources/enum_hr-HR.properties | 2 ++ sormas-api/src/main/resources/enum_it-CH.properties | 2 ++ sormas-api/src/main/resources/enum_it-IT.properties | 2 ++ sormas-api/src/main/resources/enum_ja-JP.properties | 2 ++ sormas-api/src/main/resources/enum_ne-NP.properties | 2 ++ sormas-api/src/main/resources/enum_nl-NL.properties | 2 ++ sormas-api/src/main/resources/enum_no-NO.properties | 2 ++ sormas-api/src/main/resources/enum_pl-PL.properties | 2 ++ sormas-api/src/main/resources/enum_ps-AF.properties | 2 ++ sormas-api/src/main/resources/enum_pt-PT.properties | 2 ++ sormas-api/src/main/resources/enum_ro-RO.properties | 2 ++ sormas-api/src/main/resources/enum_ru-RU.properties | 2 ++ sormas-api/src/main/resources/enum_sv-SE.properties | 2 ++ sormas-api/src/main/resources/enum_sw-KE.properties | 2 ++ sormas-api/src/main/resources/enum_tr-TR.properties | 2 ++ sormas-api/src/main/resources/enum_uk-UA.properties | 2 ++ sormas-api/src/main/resources/enum_ur-PK.properties | 2 ++ sormas-api/src/main/resources/enum_zh-CN.properties | 2 ++ sormas-api/src/main/resources/strings_ar-SA.properties | 6 ++++-- sormas-api/src/main/resources/strings_cs-CZ.properties | 6 ++++-- sormas-api/src/main/resources/strings_de-CH.properties | 8 +++++--- sormas-api/src/main/resources/strings_de-DE.properties | 6 ++++-- sormas-api/src/main/resources/strings_en-AF.properties | 6 ++++-- sormas-api/src/main/resources/strings_en-GH.properties | 6 ++++-- sormas-api/src/main/resources/strings_en-NG.properties | 6 ++++-- sormas-api/src/main/resources/strings_es-CU.properties | 6 ++++-- sormas-api/src/main/resources/strings_es-EC.properties | 6 ++++-- sormas-api/src/main/resources/strings_es-ES.properties | 6 ++++-- sormas-api/src/main/resources/strings_fa-AF.properties | 6 ++++-- sormas-api/src/main/resources/strings_fi-FI.properties | 6 ++++-- sormas-api/src/main/resources/strings_fil-PH.properties | 6 ++++-- sormas-api/src/main/resources/strings_fj-FJ.properties | 6 ++++-- sormas-api/src/main/resources/strings_fr-CH.properties | 6 ++++-- sormas-api/src/main/resources/strings_fr-FR.properties | 6 ++++-- sormas-api/src/main/resources/strings_hi-IN.properties | 6 ++++-- sormas-api/src/main/resources/strings_hr-HR.properties | 6 ++++-- sormas-api/src/main/resources/strings_it-CH.properties | 6 ++++-- sormas-api/src/main/resources/strings_it-IT.properties | 6 ++++-- sormas-api/src/main/resources/strings_ja-JP.properties | 6 ++++-- sormas-api/src/main/resources/strings_ne-NP.properties | 6 ++++-- sormas-api/src/main/resources/strings_nl-NL.properties | 6 ++++-- sormas-api/src/main/resources/strings_no-NO.properties | 6 ++++-- sormas-api/src/main/resources/strings_pl-PL.properties | 6 ++++-- sormas-api/src/main/resources/strings_ps-AF.properties | 6 ++++-- sormas-api/src/main/resources/strings_pt-PT.properties | 6 ++++-- sormas-api/src/main/resources/strings_ro-RO.properties | 6 ++++-- sormas-api/src/main/resources/strings_ru-RU.properties | 6 ++++-- sormas-api/src/main/resources/strings_sv-SE.properties | 6 ++++-- sormas-api/src/main/resources/strings_sw-KE.properties | 6 ++++-- sormas-api/src/main/resources/strings_tr-TR.properties | 6 ++++-- sormas-api/src/main/resources/strings_uk-UA.properties | 6 ++++-- sormas-api/src/main/resources/strings_ur-PK.properties | 6 ++++-- sormas-api/src/main/resources/strings_zh-CN.properties | 6 ++++-- 71 files changed, 212 insertions(+), 72 deletions(-) diff --git a/sormas-api/src/main/resources/captions_de-CH.properties b/sormas-api/src/main/resources/captions_de-CH.properties index 9a47899c362..79d92514692 100644 --- a/sormas-api/src/main/resources/captions_de-CH.properties +++ b/sormas-api/src/main/resources/captions_de-CH.properties @@ -1470,7 +1470,7 @@ externalMessage.deleteNewlyCreatedCase=Neuen Fall, den Sie gerade erstellt haben externalMessage.deleteNewlyCreatedContact=Neuen Kontakt, den Sie gerade erstellt haben löschen externalMessage.deleteNewlyCreatedEventParticipant=Neuen Ereignisteilnehmer, den Sie gerade erstellt haben löschen ExternalMessage.reportId=Meldungs-ID -ExternalMessage.reportMessageId=Report Message ID +ExternalMessage.reportMessageId=Meldevorgangs-ID ExternalMessage.sampleOverallTestResult=Gesamttestresultat ExternalMessage.assignee=Zugewiesen an ExternalMessage.type=Typ diff --git a/sormas-api/src/main/resources/enum_ar-SA.properties b/sormas-api/src/main/resources/enum_ar-SA.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_ar-SA.properties +++ b/sormas-api/src/main/resources/enum_ar-SA.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_cs-CZ.properties b/sormas-api/src/main/resources/enum_cs-CZ.properties index f0a15de2ca4..397c24829c7 100644 --- a/sormas-api/src/main/resources/enum_cs-CZ.properties +++ b/sormas-api/src/main/resources/enum_cs-CZ.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Odstranit návštěvy ze systému UserRight.VISIT_EXPORT = Exportovat návštěvy ze SORMAS UserRight.TASK_DELETE = Odstranit úkoly ze systému UserRight.TASK_EXPORT = Exportovat úkoly ze SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Vytvořit nové akce UserRight.ACTION_DELETE = Odstranit akce ze systému UserRight.ACTION_EDIT = Upravit existující akce @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Může přiřadit úkoly uživatelům UserRight.Desc.TASK_CREATE = Může vytvářet nové úkoly UserRight.Desc.TASK_EDIT = Může upravit existující úkoly UserRight.Desc.TASK_VIEW = Může zobrazit existující úkoly +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Může vytvářet nové uživatele UserRight.Desc.USER_EDIT = Může upravit existující uživatele UserRight.Desc.USER_VIEW = Může zobrazit stávající uživatele diff --git a/sormas-api/src/main/resources/enum_de-CH.properties b/sormas-api/src/main/resources/enum_de-CH.properties index 54a68d01ea7..55754cc90be 100644 --- a/sormas-api/src/main/resources/enum_de-CH.properties +++ b/sormas-api/src/main/resources/enum_de-CH.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Anrufe aus dem System löschen UserRight.VISIT_EXPORT = Anrufe von SORMAS exportieren UserRight.TASK_DELETE = Aufgaben aus dem System löschen UserRight.TASK_EXPORT = Aufgaben von SORMAS exportieren +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Neue Aktionen erstellen UserRight.ACTION_DELETE = Aktionen aus dem System löschen UserRight.ACTION_EDIT = Vorhandene Aktionen bearbeiten @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Kann Benutzern Aufgaben zuweisen UserRight.Desc.TASK_CREATE = Kann neue Aufgaben erstellen UserRight.Desc.TASK_EDIT = Kann bestehende Aufgaben bearbeiten UserRight.Desc.TASK_VIEW = Kann bestehende Aufgaben einsehen +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Kann neue Benutzer erstellen UserRight.Desc.USER_EDIT = Kann bestehende Benutzer bearbeiten UserRight.Desc.USER_VIEW = Kann bestehende Benutzer einsehen diff --git a/sormas-api/src/main/resources/enum_de-DE.properties b/sormas-api/src/main/resources/enum_de-DE.properties index c8a7131b865..baa12a1550c 100644 --- a/sormas-api/src/main/resources/enum_de-DE.properties +++ b/sormas-api/src/main/resources/enum_de-DE.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Anrufe aus dem System löschen UserRight.VISIT_EXPORT = Anrufe von SORMAS exportieren UserRight.TASK_DELETE = Aufgaben aus dem System löschen UserRight.TASK_EXPORT = Aufgaben von SORMAS exportieren +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Neue Aktionen erstellen UserRight.ACTION_DELETE = Aktionen aus dem System löschen UserRight.ACTION_EDIT = Vorhandene Aktionen bearbeiten @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Kann Benutzern Aufgaben zuweisen UserRight.Desc.TASK_CREATE = Kann neue Aufgaben erstellen UserRight.Desc.TASK_EDIT = Kann bestehende Aufgaben bearbeiten UserRight.Desc.TASK_VIEW = Kann bestehende Aufgaben einsehen +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Kann neue Benutzer erstellen UserRight.Desc.USER_EDIT = Kann bestehende Benutzer bearbeiten UserRight.Desc.USER_VIEW = Kann bestehende Benutzer einsehen diff --git a/sormas-api/src/main/resources/enum_en-AF.properties b/sormas-api/src/main/resources/enum_en-AF.properties index 426697231c9..b5ecd6cc416 100644 --- a/sormas-api/src/main/resources/enum_en-AF.properties +++ b/sormas-api/src/main/resources/enum_en-AF.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_en-GH.properties b/sormas-api/src/main/resources/enum_en-GH.properties index 6cd39635428..c23fa77d20c 100644 --- a/sormas-api/src/main/resources/enum_en-GH.properties +++ b/sormas-api/src/main/resources/enum_en-GH.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_en-NG.properties b/sormas-api/src/main/resources/enum_en-NG.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_en-NG.properties +++ b/sormas-api/src/main/resources/enum_en-NG.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_es-CU.properties b/sormas-api/src/main/resources/enum_es-CU.properties index aa2c1f29077..d0dee58f26d 100644 --- a/sormas-api/src/main/resources/enum_es-CU.properties +++ b/sormas-api/src/main/resources/enum_es-CU.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Eliminar visitas del sistema UserRight.VISIT_EXPORT = Exportar visitas de SORMAS UserRight.TASK_DELETE = Eliminar tareas del sistema UserRight.TASK_EXPORT = Exportar tareas de SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Crear nuevas acciones UserRight.ACTION_DELETE = Eliminar acciones del sistema UserRight.ACTION_EDIT = Editar acciones existentes @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Puede asignar tareas a usuarios UserRight.Desc.TASK_CREATE = Puede crear nuevas tareas UserRight.Desc.TASK_EDIT = Puede editar tareas existentes UserRight.Desc.TASK_VIEW = Puede ver tareas existentes +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Puede crear nuevos usuarios UserRight.Desc.USER_EDIT = Puede editar usuarios existentes UserRight.Desc.USER_VIEW = Puede ver usuarios existentes diff --git a/sormas-api/src/main/resources/enum_es-EC.properties b/sormas-api/src/main/resources/enum_es-EC.properties index 881810d901b..8fe6d787aff 100644 --- a/sormas-api/src/main/resources/enum_es-EC.properties +++ b/sormas-api/src/main/resources/enum_es-EC.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_es-ES.properties b/sormas-api/src/main/resources/enum_es-ES.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_es-ES.properties +++ b/sormas-api/src/main/resources/enum_es-ES.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_fa-AF.properties b/sormas-api/src/main/resources/enum_fa-AF.properties index 16c4a20f5ff..467e987cb5f 100644 --- a/sormas-api/src/main/resources/enum_fa-AF.properties +++ b/sormas-api/src/main/resources/enum_fa-AF.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_fi-FI.properties b/sormas-api/src/main/resources/enum_fi-FI.properties index e1d16edfcf9..ca7ba64b024 100644 --- a/sormas-api/src/main/resources/enum_fi-FI.properties +++ b/sormas-api/src/main/resources/enum_fi-FI.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_fil-PH.properties b/sormas-api/src/main/resources/enum_fil-PH.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_fil-PH.properties +++ b/sormas-api/src/main/resources/enum_fil-PH.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_fj-FJ.properties b/sormas-api/src/main/resources/enum_fj-FJ.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_fj-FJ.properties +++ b/sormas-api/src/main/resources/enum_fj-FJ.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_fr-CH.properties b/sormas-api/src/main/resources/enum_fr-CH.properties index d8156ec4e0a..c43e83059b6 100644 --- a/sormas-api/src/main/resources/enum_fr-CH.properties +++ b/sormas-api/src/main/resources/enum_fr-CH.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_fr-FR.properties b/sormas-api/src/main/resources/enum_fr-FR.properties index 209c62add2b..aeaedf57742 100644 --- a/sormas-api/src/main/resources/enum_fr-FR.properties +++ b/sormas-api/src/main/resources/enum_fr-FR.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Supprimer les visites du système UserRight.VISIT_EXPORT = Exporter les visites depuis SORMAS UserRight.TASK_DELETE = Supprimer les tâches du système UserRight.TASK_EXPORT = Exporter les tâches depuis SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Créer de nouvelles actions UserRight.ACTION_DELETE = Supprimer les actions du système UserRight.ACTION_EDIT = Modifier les actions existantes @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_hi-IN.properties b/sormas-api/src/main/resources/enum_hi-IN.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_hi-IN.properties +++ b/sormas-api/src/main/resources/enum_hi-IN.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_hr-HR.properties b/sormas-api/src/main/resources/enum_hr-HR.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_hr-HR.properties +++ b/sormas-api/src/main/resources/enum_hr-HR.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_it-CH.properties b/sormas-api/src/main/resources/enum_it-CH.properties index 0a875d44258..291f2abc857 100644 --- a/sormas-api/src/main/resources/enum_it-CH.properties +++ b/sormas-api/src/main/resources/enum_it-CH.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_it-IT.properties b/sormas-api/src/main/resources/enum_it-IT.properties index 8eb1c6246ac..5509caad91f 100644 --- a/sormas-api/src/main/resources/enum_it-IT.properties +++ b/sormas-api/src/main/resources/enum_it-IT.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_ja-JP.properties b/sormas-api/src/main/resources/enum_ja-JP.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_ja-JP.properties +++ b/sormas-api/src/main/resources/enum_ja-JP.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_ne-NP.properties b/sormas-api/src/main/resources/enum_ne-NP.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_ne-NP.properties +++ b/sormas-api/src/main/resources/enum_ne-NP.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_nl-NL.properties b/sormas-api/src/main/resources/enum_nl-NL.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_nl-NL.properties +++ b/sormas-api/src/main/resources/enum_nl-NL.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_no-NO.properties b/sormas-api/src/main/resources/enum_no-NO.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_no-NO.properties +++ b/sormas-api/src/main/resources/enum_no-NO.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_pl-PL.properties b/sormas-api/src/main/resources/enum_pl-PL.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_pl-PL.properties +++ b/sormas-api/src/main/resources/enum_pl-PL.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_ps-AF.properties b/sormas-api/src/main/resources/enum_ps-AF.properties index 16c4a20f5ff..467e987cb5f 100644 --- a/sormas-api/src/main/resources/enum_ps-AF.properties +++ b/sormas-api/src/main/resources/enum_ps-AF.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_pt-PT.properties b/sormas-api/src/main/resources/enum_pt-PT.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_pt-PT.properties +++ b/sormas-api/src/main/resources/enum_pt-PT.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_ro-RO.properties b/sormas-api/src/main/resources/enum_ro-RO.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_ro-RO.properties +++ b/sormas-api/src/main/resources/enum_ro-RO.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_ru-RU.properties b/sormas-api/src/main/resources/enum_ru-RU.properties index 342449f779e..1b61c2f87f5 100644 --- a/sormas-api/src/main/resources/enum_ru-RU.properties +++ b/sormas-api/src/main/resources/enum_ru-RU.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_sv-SE.properties b/sormas-api/src/main/resources/enum_sv-SE.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_sv-SE.properties +++ b/sormas-api/src/main/resources/enum_sv-SE.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_sw-KE.properties b/sormas-api/src/main/resources/enum_sw-KE.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_sw-KE.properties +++ b/sormas-api/src/main/resources/enum_sw-KE.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_tr-TR.properties b/sormas-api/src/main/resources/enum_tr-TR.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_tr-TR.properties +++ b/sormas-api/src/main/resources/enum_tr-TR.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_uk-UA.properties b/sormas-api/src/main/resources/enum_uk-UA.properties index 77e3fbc0a33..decaf478a53 100644 --- a/sormas-api/src/main/resources/enum_uk-UA.properties +++ b/sormas-api/src/main/resources/enum_uk-UA.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/enum_ur-PK.properties b/sormas-api/src/main/resources/enum_ur-PK.properties index fd4ea07fd58..7cfbd942596 100644 --- a/sormas-api/src/main/resources/enum_ur-PK.properties +++ b/sormas-api/src/main/resources/enum_ur-PK.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = سسٹم سے دوروں کو مٹا ديں UserRight.VISIT_EXPORT = سورماس سے دورے ايکسپورٹ کریں UserRight.TASK_DELETE = سسٹم سے کام مٹا دیں UserRight.TASK_EXPORT = سورماس سے کام ايکسپورٹ کریں +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = نئی کارروائیاں بنائیں UserRight.ACTION_DELETE = سسٹم سے کارروائیوں کو مٹا دیں UserRight.ACTION_EDIT = موجودہ کارروائیوں میں ترمیم کریں @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = صارفین کےليے کام مختص کرنے ک UserRight.Desc.TASK_CREATE = نئے کام بنانے کے قابل UserRight.Desc.TASK_EDIT = موجودہ کاموں میں ترمیم کرنے کے قابل UserRight.Desc.TASK_VIEW = موجودہ کاموں کو دیکھنے کے قابل +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = نئے صارفین بنانے کے قابل UserRight.Desc.USER_EDIT = موجودہ صارفین میں ترمیم کرنے کے قابل UserRight.Desc.USER_VIEW = موجودہ صارفین کو دیکھنے کے قابل diff --git a/sormas-api/src/main/resources/enum_zh-CN.properties b/sormas-api/src/main/resources/enum_zh-CN.properties index 005401e8730..34e8aaa299d 100644 --- a/sormas-api/src/main/resources/enum_zh-CN.properties +++ b/sormas-api/src/main/resources/enum_zh-CN.properties @@ -1433,6 +1433,7 @@ UserRight.VISIT_DELETE = Delete visits from the system UserRight.VISIT_EXPORT = Export visits from SORMAS UserRight.TASK_DELETE = Delete tasks from the system UserRight.TASK_EXPORT = Export tasks from SORMAS +UserRight.TASK_ARCHIVE = Archive tasks UserRight.ACTION_CREATE = Create new actions UserRight.ACTION_DELETE = Delete actions from the system UserRight.ACTION_EDIT = Edit existing actions @@ -1582,6 +1583,7 @@ UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users UserRight.Desc.TASK_CREATE = Able to create new tasks UserRight.Desc.TASK_EDIT = Able to edit existing tasks UserRight.Desc.TASK_VIEW = Able to view existing tasks +UserRight.Desc.TASK_ARCHIVE = Able to archive tasks UserRight.Desc.USER_CREATE = Able to create new users UserRight.Desc.USER_EDIT = Able to edit existing users UserRight.Desc.USER_VIEW = Able to view existing users diff --git a/sormas-api/src/main/resources/strings_ar-SA.properties b/sormas-api/src/main/resources/strings_ar-SA.properties index bb6ff816f17..ff3e81055d5 100644 --- a/sormas-api/src/main/resources/strings_ar-SA.properties +++ b/sormas-api/src/main/resources/strings_ar-SA.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_cs-CZ.properties b/sormas-api/src/main/resources/strings_cs-CZ.properties index 9e26d113ae3..96765e3dc15 100644 --- a/sormas-api/src/main/resources/strings_cs-CZ.properties +++ b/sormas-api/src/main/resources/strings_cs-CZ.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Opravdu chcete archivovat tuto událost? To ji neodst confirmationArchiveEvents = Jste si jisti, že chcete archivovat všech %d vybraných událostí? confirmationArchiveEventParticipant = Opravdu chcete archivovat tohoto účastníka události? Toto jej neodstraní ze systému ani ze statistik, ale skryje ho pouze ze seznamu účastníků událostí. confirmationArchiveImmunization = Opravdu chcete archivovat tuto imunizaci? Toto neodstraní ze systému ani ze statistik, ale skryje pouze z normální adresáře imunizace. -confirmationArchiveTask = Opravdu chcete archivovat všech %d vybraných úkolů? -confirmationArchiveTasks = Opravdu chcete archivovat tento úkol? To jej neodstraní ze systému ani ze statistik, ale skryje pouze před běžným řízením úkolů. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Opravdu chcete archivovat tento cestovní vstup? To ho neodstraní ze systému ani ze statistik, ale skryje pouze z běžného adresáře cestovních vstupů. confirmationArchiveEventGroup = Opravdu chcete archivovat tuto skupinu událostí? Toto neodstraní ze systému ani ze statistik, ale skryje pouze z adresáře skupin událostí. confirmationCancelFollowUp = Opravdu chcete zrušit sledování všech %d vybraných kontaktů? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Zadejte atribut řádku, který jste vybrali pro vi messageSymptomsHint = Zaškrtněte prosím odpověď pro VŠECHNY příznaky, které naznačují, zda se vyskytly kdykoli během této nemoci\: messageSymptomsVisitHint = Zaškrtněte prosím odpověď pro VŠECHNY příznaky, které naznačují, zda byly přítomny v době této návštěvy\: messageTasksArchived = Všechny vybrané úkoly byly archivovány +messageTaskArchived = The task has been archived messageTasksEdited = Všechny úkoly byly upraveny messageTasksDearchived = Všechny vybrané úkoly byly dearchivovány +messageTaskDearchived = The task has been de-archived messageTasksDeleted = Všechny vybrané úkoly byly odstraněny messageTemplateNotAvailable = Soubor šablony není k dispozici. Kontaktujte prosím administrátora a řekněte mu o tomto problému. messageTravelEntrySaved = Zadané údaje o cestování uloženy diff --git a/sormas-api/src/main/resources/strings_de-CH.properties b/sormas-api/src/main/resources/strings_de-CH.properties index 3cb5d670c55..ab725101a46 100644 --- a/sormas-api/src/main/resources/strings_de-CH.properties +++ b/sormas-api/src/main/resources/strings_de-CH.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Sind Sie sicher, dass Sie dieses Ereignis archivieren confirmationArchiveEvents = Sind Sie sicher, dass Sie alle %d ausgewählten Ereignisse archivieren möchten? confirmationArchiveEventParticipant = Sind Sie sicher, dass Sie diesen Ereignisteilnehmer archivieren möchten? Dies wird ihn nicht aus dem System oder irgendeiner Statistik entfernen, sondern nur aus der Liste der Ereignisteilnehmer ausblenden. confirmationArchiveImmunization = Sind Sie sicher, dass Sie diese Immunisierung archivieren möchten? Dies entfernt sie nicht aus dem System oder irgendeiner Statistik, sondern versteckt sie nur im normalen Immunisierungsverzeichnis. -confirmationArchiveTask = Sind Sie sicher, dass Sie alle %d ausgewählten Aufgaben archivieren möchten? -confirmationArchiveTasks = Sind Sie sicher, dass Sie diese Aufgabe archivieren möchten? Dies entfernt sie nicht aus dem System oder irgendwelchen Statistiken, sondern versteckt sie nur in der normalen Aufgabenverwaltung. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Sind Sie sicher, dass Sie diese Einreise archivieren möchten? Dies entfernt sie nicht aus dem System oder irgendeiner Statistik, sondern versteckt sie nur im normalen Einreiseverzeichnis. confirmationArchiveEventGroup = Sind Sie sicher, dass Sie diese Ereignisgruppe archivieren möchten? Dies entfernt sie nicht aus dem System oder irgendeiner Statistik, sondern versteckt sie nur im normalen Ereignisgruppenverzeichnis. confirmationCancelFollowUp = Sind Sie sicher, dass Sie die Nachverfolgung aller %d ausgewählten Kontakte abbrechen möchten? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Bitte geben Sie die Zeilenattribut an, die Sie für messageSymptomsHint = Bitte wählen Sie eine Antwort für ALLE Symptome, um anzeigen, ob sie während dieser Krankheit zu irgendeinem Zeitpunkt aufgetreten sind\: messageSymptomsVisitHint = Bitte wählen Sie eine Antwort für ALLE Symptome, um anzeigen, ob sie während des Anrufs präsent waren\: messageTasksArchived = Alle ausgewählten Aufgaben wurden archiviert +messageTaskArchived = The task has been archived messageTasksEdited = Alle Aufgaben wurden bearbeitet messageTasksDearchived = Alle ausgewählten Aufgaben wurden de-archiviert +messageTaskDearchived = The task has been de-archived messageTasksDeleted = Alle ausgewählten Aufgaben wurden gelöscht messageTemplateNotAvailable = Die Vorlagen-Datei ist nicht verfügbar. Bitte kontaktieren Sie einen Administrator und teilen Sie ihm dieses Problem mit. messageTravelEntrySaved = Einreisedaten gespeichert @@ -1142,7 +1144,7 @@ messageTreatmentSaved = Behandlung gespeichert messageTreatmentsDeleted = Alle ausgewählten Behandlungen wurden gelöscht messageUnknownFilterAttributeForPopulationData = Die Anzeige der Fall-Inzidenzanteile für unbekanntes Geschlecht oder Altersgruppe ist nicht möglich. Bitte entfernen Sie die entsprechenden Werte aus Ihrem Filter. messageDeletionUnsupportedByExternalJournalWarning = Das externe Symptomtagebuch hat noch keine Funktion zum Entfernen von Personen innerhalb von SORMAS zur Verfügung gestellt. Bitte löschen Sie die Person manuell aus dem externen Symptomtagebuch. -messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. +messageExternalJournalDidNotProvideMessage = Das externe Symptomtagebuch hat keine Daten übermittelt. messageDiseaseNotSpecifiedInLabMessage = Die Krankheit der Meldung konnte nicht automatisch ermittelt werden. Bitte überprüfen Sie manuell, ob es sich bei dieser Meldung um eine Krankheit handelt, die in SORMAS bearbeitet werden soll. messageUserRoleCombination = kann nicht kombiniert werden mit messageUserRoleSaved = Benutzerrolle gespeichert diff --git a/sormas-api/src/main/resources/strings_de-DE.properties b/sormas-api/src/main/resources/strings_de-DE.properties index 9c5ac694e55..73de0d3f58e 100644 --- a/sormas-api/src/main/resources/strings_de-DE.properties +++ b/sormas-api/src/main/resources/strings_de-DE.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Sind Sie sicher, dass Sie dieses Ereignis abschließe confirmationArchiveEvents = Sind Sie sicher, dass Sie alle %d ausgewählten Ereignisse abschließen möchten? confirmationArchiveEventParticipant = Sind Sie sicher, dass Sie diesen Ereignisteilnehmer abschließen möchten? Dies wird ihn nicht aus dem System oder irgendeiner Statistik entfernen, sondern nur aus der Liste der Ereignisteilnehmer ausblenden. confirmationArchiveImmunization = Sind Sie sicher, dass Sie diese Immunisierung abschließen möchten? Dies entfernt sie nicht aus dem System oder irgendeiner Statistik, sondern versteckt sie nur im normalen Immunisierungsverzeichnis. -confirmationArchiveTask = Sind Sie sicher, dass Sie alle %d ausgewählten Aufgaben archivieren möchten? -confirmationArchiveTasks = Sind Sie sicher, dass Sie diese Aufgabe archivieren möchten? Dies entfernt sie nicht aus dem System oder irgendwelchen Statistiken, sondern versteckt sie nur in der normalen Aufgabenverwaltung. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Sind Sie sicher, dass Sie diese Einreise abschließen möchten? Dies entfernt sie nicht aus dem System oder irgendeiner Statistik, sondern versteckt sie nur im normalen Einreiseverzeichnis. confirmationArchiveEventGroup = Sind Sie sicher, dass Sie diese Ereignisgruppe archivieren möchten? Dies entfernt sie nicht aus dem System oder irgendeiner Statistik, sondern versteckt sie nur im normalen Ereignisgruppenverzeichnis. confirmationCancelFollowUp = Sind Sie sicher, dass Sie die Nachverfolgung aller %d ausgewählten Kontakte abbrechen möchten? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Bitte geben Sie die Zeilenattribut an, die Sie für messageSymptomsHint = Bitte wählen Sie eine Antwort für ALLE Symptome, um anzuzeigen, ob sie während dieser Krankheit zu irgendeinem Zeitpunkt aufgetreten sind\: messageSymptomsVisitHint = Bitte wählen Sie eine Antwort für ALLE Symptome, um anzuzeigen, ob sie während des Anrufs präsent waren\: messageTasksArchived = Alle ausgewählten Aufgaben wurden archiviert +messageTaskArchived = The task has been archived messageTasksEdited = Alle Aufgaben wurden bearbeitet messageTasksDearchived = Alle ausgewählten Aufgaben wurden de-archiviert +messageTaskDearchived = The task has been de-archived messageTasksDeleted = Alle ausgewählten Aufgaben wurden gelöscht messageTemplateNotAvailable = Die Vorlagen-Datei ist nicht verfügbar. Bitte kontaktieren Sie einen Administrator und teilen Sie ihm dieses Problem mit. messageTravelEntrySaved = Einreisedaten gespeichert diff --git a/sormas-api/src/main/resources/strings_en-AF.properties b/sormas-api/src/main/resources/strings_en-AF.properties index 41a740ed944..a1341b41170 100644 --- a/sormas-api/src/main/resources/strings_en-AF.properties +++ b/sormas-api/src/main/resources/strings_en-AF.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_en-GH.properties b/sormas-api/src/main/resources/strings_en-GH.properties index c7ac7ed8b0f..cb3c1ef2faf 100644 --- a/sormas-api/src/main/resources/strings_en-GH.properties +++ b/sormas-api/src/main/resources/strings_en-GH.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_en-NG.properties b/sormas-api/src/main/resources/strings_en-NG.properties index d599ae2cf4d..be54e12ac6b 100644 --- a/sormas-api/src/main/resources/strings_en-NG.properties +++ b/sormas-api/src/main/resources/strings_en-NG.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_es-CU.properties b/sormas-api/src/main/resources/strings_es-CU.properties index cc4da3738a5..5642a79abba 100644 --- a/sormas-api/src/main/resources/strings_es-CU.properties +++ b/sormas-api/src/main/resources/strings_es-CU.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = ¿Está seguro de que desea archivar este evento? Est confirmationArchiveEvents = ¿Está seguro de que desea archivar todos los %d eventos seleccionados? confirmationArchiveEventParticipant = ¿Está seguro de que desea archivar este participante de evento? Esto no lo eliminará del sistema ni de ninguna estadística; sólo lo ocultará de la lista de participantes de evento. confirmationArchiveImmunization = ¿Está seguro de que desea archivar esta inmunización? Esto no la eliminará del sistema ni de ninguna estadística; sólo la ocultará del directorio normal de inmunización. -confirmationArchiveTask = ¿Está seguro de que desea archivar todas las %d tareas seleccionadas? -confirmationArchiveTasks = ¿Está seguro de que desea archivar esta tarea? Esto no la eliminará del sistema ni de ninguna estadística; sólo la ocultará de la administración normal de tareas. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = ¿Está seguro de que desea archivar esta entrada de viaje? Esto no la eliminará del sistema ni de ninguna estadística; sólo lo ocultará del directorio normal de entradas de viaje. confirmationArchiveEventGroup = ¿Está seguro de que desea archivar este grupo de eventos? Esto no lo eliminará del sistema ni de ninguna estadística; sólo lo ocultará del directorio normal de grupos de eventos. confirmationCancelFollowUp = ¿Está seguro de que desea cancelar el seguimiento de todos los %d contactos seleccionados? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Por favor especifique el atributo de fila que eligi messageSymptomsHint = Por favor, marque una respuesta para TODOS los síntomas indicando si ocurrieron en algún momento durante esta enfermedad\: messageSymptomsVisitHint = Por favor, marque una respuesta para TODOS los síntomas indicando si estaban presentes en el momento de esta visita\: messageTasksArchived = Todas las tareas seleccionadas fueron archivadas +messageTaskArchived = The task has been archived messageTasksEdited = Todas las tareas fueron editadas messageTasksDearchived = Todas las tareas seleccionadas fueron desarchivadas +messageTaskDearchived = The task has been de-archived messageTasksDeleted = Todas las tareas seleccionadas fueron eliminadas messageTemplateNotAvailable = El archivo de plantilla no está disponible. Por favor, contacte a un administrador e infórmele sobre este problema. messageTravelEntrySaved = Datos de entrada de viaje guardados diff --git a/sormas-api/src/main/resources/strings_es-EC.properties b/sormas-api/src/main/resources/strings_es-EC.properties index 25eedf39b1d..5c038d20d20 100644 --- a/sormas-api/src/main/resources/strings_es-EC.properties +++ b/sormas-api/src/main/resources/strings_es-EC.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = ¿Estás seguro de que deseas archivar este evento? E confirmationArchiveEvents = ¿Estás seguro de que deseas archivar todos los %d eventos seleccionados? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = ¿Está seguro de que desea cancelar el seguimiento de todos los %d contactos seleccionados? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Especifique el atributo de fila que ha elegido para messageSymptomsHint = Marque una respuesta para TODOS los síntomas indicando si ocurrieron en algún momento durante esta enfermedad\: messageSymptomsVisitHint = Marque una respuesta para TODOS los síntomas indicando si estaban presentes en el momento de esta visita\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = Todas las tareas seleccionadas han sido eliminadas messageTemplateNotAvailable = La plantilla del archivo no está disponible. Por favor contactar al administrador e indicarle sobre este tema. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_es-ES.properties b/sormas-api/src/main/resources/strings_es-ES.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_es-ES.properties +++ b/sormas-api/src/main/resources/strings_es-ES.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_fa-AF.properties b/sormas-api/src/main/resources/strings_fa-AF.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_fa-AF.properties +++ b/sormas-api/src/main/resources/strings_fa-AF.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_fi-FI.properties b/sormas-api/src/main/resources/strings_fi-FI.properties index 409cbd0406c..49e13e82db7 100644 --- a/sormas-api/src/main/resources/strings_fi-FI.properties +++ b/sormas-api/src/main/resources/strings_fi-FI.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Haluatko varmasti arkistoida tämän tapahtuman? Arki confirmationArchiveEvents = Haluatko varmasti arkistoida kaikki %d valittua tapahtumaa? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Oletko varma, että haluat perua seurannan kaikilta %d valitulta kontaktilta? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Määritä riviatribuutti, jonka olet valinnut visu messageSymptomsHint = Merkitse vastaus KAIKILLE oireille jotka ovat ilmenneet tämän sairauden aikana\: messageSymptomsVisitHint = Merkitse vastaus KAIKILLE oireille, jotka olivat havaittavissa käynnin aikana\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = Kaikki valitut tehtävät on poistettu messageTemplateNotAvailable = Mallitiedosto ei ole saatavilla. Ota yhteyttä ylläpitoon ja kerro heillä tästä ongelmasta. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_fil-PH.properties b/sormas-api/src/main/resources/strings_fil-PH.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_fil-PH.properties +++ b/sormas-api/src/main/resources/strings_fil-PH.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_fj-FJ.properties b/sormas-api/src/main/resources/strings_fj-FJ.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_fj-FJ.properties +++ b/sormas-api/src/main/resources/strings_fj-FJ.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_fr-CH.properties b/sormas-api/src/main/resources/strings_fr-CH.properties index 0cd52c6a2de..e4efdba0ac7 100644 --- a/sormas-api/src/main/resources/strings_fr-CH.properties +++ b/sormas-api/src/main/resources/strings_fr-CH.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Êtes-vous sûr de vouloir archiver cet événement? confirmationArchiveEvents = Êtes-vous sûr de vouloir archiver tous les %d événéments sélectionnés? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Êtes-vous sûr de vouloir annuler le suivi de tous les %d contacts sélectionnés? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Veuillez spécifier l'attribut ligne que vous avez messageSymptomsHint = Veuillez cocher une réponse pour TOUS les symptômes indiquant s'ils se sont produits à tout moment pendant cette maladie \: messageSymptomsVisitHint = Veuillez cocher une réponse pour TOUS les symptômes indiquant s'ils étaient présents au moment de cette visite \: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = Toutes les tâches sélectionnées ont été supprimées messageTemplateNotAvailable = Le fichier de modèle n'est pas disponible. Veuillez contacter un administrateur et leur dire ce problème. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_fr-FR.properties b/sormas-api/src/main/resources/strings_fr-FR.properties index 3b2bed6a5a7..8666e945a4e 100644 --- a/sormas-api/src/main/resources/strings_fr-FR.properties +++ b/sormas-api/src/main/resources/strings_fr-FR.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Êtes-vous sûr de vouloir archiver cet événement? confirmationArchiveEvents = Êtes-vous sûr de vouloir archiver les %d événéments sélectionnés? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Êtes-vous sûr de vouloir archiver toutes les %d tâches sélectionnées ? -confirmationArchiveTasks = Êtes-vous sûr de vouloir archiver cette tâche? Cela ne le supprimera pas du système ou des statistiques, mais le masquera de la gestion normale des tâches. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Êtes-vous sûr de vouloir archiver ce groupe d'événements? Cela ne le supprimera pas du système ou des statistiques, mais ne le masquera que du répertoire normal des groupes d'événements. confirmationCancelFollowUp = Êtes-vous sûr de vouloir annuler le suivi des %d contacts sélectionnés? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Veuillez spécifier l'attribut ligne que vous avez messageSymptomsHint = Veuillez cocher une réponse pour TOUS les symptômes indiquant s'ils se sont produits à tout moment pendant cette maladie \: messageSymptomsVisitHint = Veuillez cocher une réponse pour TOUS les symptômes indiquant s'ils étaient présents au moment de cette visite \: messageTasksArchived = Toutes les tâches sélectionnées ont été archivées +messageTaskArchived = The task has been archived messageTasksEdited = Toutes les tâches ont été modifiées messageTasksDearchived = Toutes les tâches sélectionnées ont été désarchivées +messageTaskDearchived = The task has been de-archived messageTasksDeleted = Toutes les tâches sélectionnées ont été supprimées messageTemplateNotAvailable = Le fichier de modèle n'est pas disponible. Veuillez contacter un administrateur et leur dire ce problème. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_hi-IN.properties b/sormas-api/src/main/resources/strings_hi-IN.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_hi-IN.properties +++ b/sormas-api/src/main/resources/strings_hi-IN.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_hr-HR.properties b/sormas-api/src/main/resources/strings_hr-HR.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_hr-HR.properties +++ b/sormas-api/src/main/resources/strings_hr-HR.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_it-CH.properties b/sormas-api/src/main/resources/strings_it-CH.properties index 471abd750f7..c159c94de12 100644 --- a/sormas-api/src/main/resources/strings_it-CH.properties +++ b/sormas-api/src/main/resources/strings_it-CH.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Sei sicuro di voler archiviare questo evento? Non sar confirmationArchiveEvents = Sei sicuro di voler archiviare tutti i %d eventi selezionati? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Sei sicuro di voler annullare il follow-up di tutti i %d contatti selezionati? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Specifica l'attributo riga che hai scelto per la vi messageSymptomsHint = Si prega di spuntare una risposta per TUTTI i sintomi, indicando se si sono manifestati durante questa malattia\: messageSymptomsVisitHint = Si prega di spuntare una risposta per TUTTI i sintomi, indicando se erano presenti al momento di questa visita\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = Tutti i compiti selezionati sono stati eliminati messageTemplateNotAvailable = Il file modello non è disponibile. Si prega di contattare un amministratore e segnalargli il problema. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_it-IT.properties b/sormas-api/src/main/resources/strings_it-IT.properties index 0b8cf131659..80e2e318e86 100644 --- a/sormas-api/src/main/resources/strings_it-IT.properties +++ b/sormas-api/src/main/resources/strings_it-IT.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Sei sicuro di voler archiviare questo evento? Non sar confirmationArchiveEvents = Sei sicuro di voler archiviare tutti i %d eventi selezionati? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Sei sicuro di voler annullare il follow-up di tutti i %d contatti selezionati? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Specifica l'attributo riga che hai scelto per la vi messageSymptomsHint = Si prega di spuntare una risposta per TUTTI i sintomi, indicando se si sono manifestati durante questa malattia\: messageSymptomsVisitHint = Si prega di spuntare una risposta per TUTTI i sintomi, indicando se erano presenti al momento di questa visita\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = Tutti i compiti selezionati sono stati eliminati messageTemplateNotAvailable = Il file modello non è disponibile. Si prega di contattare un amministratore e segnalargli il problema. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_ja-JP.properties b/sormas-api/src/main/resources/strings_ja-JP.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_ja-JP.properties +++ b/sormas-api/src/main/resources/strings_ja-JP.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_ne-NP.properties b/sormas-api/src/main/resources/strings_ne-NP.properties index bb6ff816f17..ff3e81055d5 100644 --- a/sormas-api/src/main/resources/strings_ne-NP.properties +++ b/sormas-api/src/main/resources/strings_ne-NP.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_nl-NL.properties b/sormas-api/src/main/resources/strings_nl-NL.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_nl-NL.properties +++ b/sormas-api/src/main/resources/strings_nl-NL.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_no-NO.properties b/sormas-api/src/main/resources/strings_no-NO.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_no-NO.properties +++ b/sormas-api/src/main/resources/strings_no-NO.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_pl-PL.properties b/sormas-api/src/main/resources/strings_pl-PL.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_pl-PL.properties +++ b/sormas-api/src/main/resources/strings_pl-PL.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_ps-AF.properties b/sormas-api/src/main/resources/strings_ps-AF.properties index 7f6f4525b52..38d91a3eda0 100644 --- a/sormas-api/src/main/resources/strings_ps-AF.properties +++ b/sormas-api/src/main/resources/strings_ps-AF.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_pt-PT.properties b/sormas-api/src/main/resources/strings_pt-PT.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_pt-PT.properties +++ b/sormas-api/src/main/resources/strings_pt-PT.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_ro-RO.properties b/sormas-api/src/main/resources/strings_ro-RO.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_ro-RO.properties +++ b/sormas-api/src/main/resources/strings_ro-RO.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_ru-RU.properties b/sormas-api/src/main/resources/strings_ru-RU.properties index 90181200c1f..78b560159a5 100644 --- a/sormas-api/src/main/resources/strings_ru-RU.properties +++ b/sormas-api/src/main/resources/strings_ru-RU.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_sv-SE.properties b/sormas-api/src/main/resources/strings_sv-SE.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_sv-SE.properties +++ b/sormas-api/src/main/resources/strings_sv-SE.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_sw-KE.properties b/sormas-api/src/main/resources/strings_sw-KE.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_sw-KE.properties +++ b/sormas-api/src/main/resources/strings_sw-KE.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_tr-TR.properties b/sormas-api/src/main/resources/strings_tr-TR.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_tr-TR.properties +++ b/sormas-api/src/main/resources/strings_tr-TR.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_uk-UA.properties b/sormas-api/src/main/resources/strings_uk-UA.properties index 296b02042f1..93c82e7ce00 100644 --- a/sormas-api/src/main/resources/strings_uk-UA.properties +++ b/sormas-api/src/main/resources/strings_uk-UA.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved diff --git a/sormas-api/src/main/resources/strings_ur-PK.properties b/sormas-api/src/main/resources/strings_ur-PK.properties index e839dcde84a..04bbea54648 100644 --- a/sormas-api/src/main/resources/strings_ur-PK.properties +++ b/sormas-api/src/main/resources/strings_ur-PK.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = کیا آپ واقعی اس تقریب کو آرکا confirmationArchiveEvents = کیا آپ واقعی تمام %d منتخب تقریبات کو آرکائیو کرنا چاہتے ہیں؟ confirmationArchiveEventParticipant = کیا آپ واقعی اس تقریب کے شرکت کنندہ کو آرکائیو کرنا چاہتے ہیں؟ یہ اسے سسٹم یا کسی بھی اعداد و شمار سے نہیں ہٹائے گا، بلکہ اسے صرف تقریب کے شرکاء کی فہرست سے چھپائے گا۔ confirmationArchiveImmunization = کیا آپ واقعی اس امیونائزیشن کو آرکائیو کرنا چاہتے ہیں؟ یہ اس کو سسٹم یا کسی بھی اعداد و شمار سے نہیں ہٹائے گا، لیکن اسے صرف نارمل امیونائزیشن ڈائرکٹری سے چھپائے گا۔ -confirmationArchiveTask = کیا آپ واقعی تمام %d منتخب کاموں کو آرکائیو کرنا چاہتے ہیں؟ -confirmationArchiveTasks = کیا آپ واقعی اس کام کو آرکائیو کرنا چاہتے ہیں؟ یہ اس کو سسٹم یا کسی بھی اعداد و شمار سے نہیں ہٹائے گا، لیکن اسے صرف نارمل کام کی ڈائرکٹری سے چھپائے گا۔ +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = کیا آپ واقعی اس سفر کے اندراج کو آرکائیو کرنا چاہتے ہیں؟ یہ اس کو سسٹم یا کسی بھی اعداد و شمار سے نہیں ہٹائے گا، لیکن اسے صرف نارمل سفر کے اندراج کی ڈائرکٹری سے چھپائے گا۔ confirmationArchiveEventGroup = کیا آپ واقعی اس تقریبی گروہ کو آرکائیو کرنا چاہتے ہیں؟ یہ اس کو سسٹم یا کسی بھی اعداد و شمار سے نہیں ہٹائے گا، لیکن اسے صرف نارمل تقریبی گروہ کی ڈائرکٹری سے چھپائے گا۔ confirmationCancelFollowUp = کیا آپ واقعی تمام %d منتخب رابطوں کا فالو اپ منسوخ کرنا چاہتے ہیں؟ @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = براہ کرم اس قطار کی خصوصیت ک messageSymptomsHint = براہ کرم تمام علامات کے جواب پر نشان لگائیں جو اس بات کی نشاندہی کریں کہ آیا وہ اس بیماری کے دوران کسی بھی وقت واقع ہوئی ہیں\: messageSymptomsVisitHint = براہ کرم تمام علامات کے جواب پر نشان لگائیں جو یہ بتاتا ہے کہ آیا وہ اس دورے کے وقت موجود تھے\: messageTasksArchived = تمام منتخب کاموں کو آرکائیو کر دیا گیا ہے +messageTaskArchived = The task has been archived messageTasksEdited = تمام کاموں میں ترمیم کی گئی ہے messageTasksDearchived = تمام منتخب کاموں کو ڈی آرکائیو کر دیا گیا ہے +messageTaskDearchived = The task has been de-archived messageTasksDeleted = تمام منتخب کاموں کو مٹا دیا گیا ہے messageTemplateNotAvailable = ٹیمپلیٹ فائل دستیاب نہیں ہے۔ براہ کرم کسی ایڈمن سے رابطہ کریں اور انہیں اس مسئلے کے بارے میں بتائیں۔ messageTravelEntrySaved = سفر کے اندراج کا ڈیٹا محفوظ ہو گیا diff --git a/sormas-api/src/main/resources/strings_zh-CN.properties b/sormas-api/src/main/resources/strings_zh-CN.properties index 37dd413665a..66eff31cf89 100644 --- a/sormas-api/src/main/resources/strings_zh-CN.properties +++ b/sormas-api/src/main/resources/strings_zh-CN.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Are you sure you want to archive this event? This wil confirmationArchiveEvents = Are you sure you want to archive all %d selected events? confirmationArchiveEventParticipant = Are you sure you want to archive this event participant? This will not remove it from the system or any statistics, but only hide it from the list of event participants. confirmationArchiveImmunization = Are you sure you want to archive this immunization? This will not remove it from the system or any statistics, but only hide it from the normal immunization directory. -confirmationArchiveTask = Are you sure you want to archive all %d selected tasks? -confirmationArchiveTasks = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. +confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? confirmationArchiveTravelEntry = Are you sure you want to archive this travel entry? This will not remove it from the system or any statistics, but only hide it from the normal travel entry directory. confirmationArchiveEventGroup = Are you sure you want to archive this event group? This will not remove it from the system or any statistics, but only hide it from the normal event group directory. confirmationCancelFollowUp = Are you sure you want to cancel the follow-up of all %d selected contacts? @@ -1128,8 +1128,10 @@ messageSpecifyRowAttribute = Please specify the row attribute you have chosen fo messageSymptomsHint = Please tick an answer for ALL symptoms indicating if they occurred at any point in time during this illness\: messageSymptomsVisitHint = Please tick an answer for ALL symptoms indicating if they were present at the time of this visit\: messageTasksArchived = All selected tasks have been archived +messageTaskArchived = The task has been archived messageTasksEdited = All tasks have been edited messageTasksDearchived = All selected tasks have been de-archived +messageTaskDearchived = The task has been de-archived messageTasksDeleted = All selected tasks have been deleted messageTemplateNotAvailable = The template file is not available. Please contact an admin and tell them about this issue. messageTravelEntrySaved = Travel entry data saved From 01cd8db41f1c56ebbe796be371a40d6a9baa8735 Mon Sep 17 00:00:00 2001 From: Stefan Kock Date: Tue, 13 Dec 2022 11:23:25 +0100 Subject: [PATCH 068/147] #10958 Use new setDataProvider on Views for Campaigns - no dataSize displayed, so no refactoring to getDataSize --- .../campaigndata/CampaignDataGrid.java | 25 ++----------------- .../ui/campaign/campaigns/CampaignGrid.java | 25 ++----------------- .../CampaignStatisticsGrid.java | 7 ++---- 3 files changed, 6 insertions(+), 51 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/CampaignDataGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/CampaignDataGrid.java index 9f92f27cd5f..72ebcb9fa28 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/CampaignDataGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigndata/CampaignDataGrid.java @@ -16,10 +16,7 @@ package de.symeda.sormas.ui.campaign.campaigndata; import java.util.Date; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.renderers.DateRenderer; import de.symeda.sormas.api.FacadeProvider; @@ -27,7 +24,6 @@ import de.symeda.sormas.api.campaign.data.CampaignFormDataIndexDto; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.FilteredGrid; @@ -37,12 +33,12 @@ public class CampaignDataGrid extends FilteredGrid dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getCampaignFormDataFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getCampaignFormDataFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); - } - public void addCustomColumn(String property, String caption) { Column newColumn = addColumn(e -> e.getFormValues().stream().filter(v -> v.getId().equals(property)).findFirst().orElse(null)); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigns/CampaignGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigns/CampaignGrid.java index 539753ba01a..87c6fd2832d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigns/CampaignGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaigns/CampaignGrid.java @@ -16,12 +16,8 @@ package de.symeda.sormas.ui.campaign.campaigns; import java.util.Date; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; import com.vaadin.icons.VaadinIcons; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.renderers.DateRenderer; import com.vaadin.ui.renderers.HtmlRenderer; @@ -32,7 +28,6 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; @@ -90,28 +85,12 @@ public CampaignGrid(CampaignCriteria criteria) { public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getCampaignFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getCampaignFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(FacadeProvider.getCampaignFacade()::getIndexList, FacadeProvider.getCampaignFacade()::count); } public void setEagerDataProvider() { - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getCampaignFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); + setEagerDataProvider(FacadeProvider.getCampaignFacade()::getIndexList); } public void reload() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaignstatistics/CampaignStatisticsGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaignstatistics/CampaignStatisticsGrid.java index 490b973d046..b2af6cc165e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaignstatistics/CampaignStatisticsGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/campaign/campaignstatistics/CampaignStatisticsGrid.java @@ -2,9 +2,6 @@ import java.util.List; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; - import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.campaign.CampaignJurisdictionLevel; import de.symeda.sormas.api.campaign.statistics.CampaignStatisticsCriteria; @@ -46,8 +43,8 @@ public void reload() { } public void setDataProvider() { - ListDataProvider dataProvider = DataProvider.fromStream(getGridData().stream()); - setDataProvider(dataProvider); + + setDataProvider(getGridData().stream()); setSelectionMode(SelectionMode.NONE); } From 3cf4157d874d59ed273da13003825eaaa9be8195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Tue, 13 Dec 2022 11:34:07 +0100 Subject: [PATCH 069/147] #4060 - Don't close popup when dismissing archive prompt --- .../src/main/java/de/symeda/sormas/ui/task/TaskController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java index b19558c8ba3..a9a610b3e95 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskController.java @@ -260,8 +260,6 @@ private void archiveOrDearchive(TaskDto task, boolean archive, Runnable callback archive ? I18nProperties.getString(Strings.messageTaskArchived) : I18nProperties.getString(Strings.messageTaskDearchived), Type.ASSISTIVE_NOTIFICATION); } - - callback.run(); }); } From ab79ac5335f1adae1accd2d3724a546e99e7ea14 Mon Sep 17 00:00:00 2001 From: Stefan Kock Date: Tue, 13 Dec 2022 11:44:15 +0100 Subject: [PATCH 070/147] #10958 Use getDataSize/new DataProvider on Views for Contacts and Visits - No dataSize shown for visits --- .../sormas/ui/caze/CaseContactsView.java | 4 +-- .../ui/contact/AbstractContactGrid.java | 31 ++----------------- .../ui/contact/ContactFollowUpGrid.java | 20 +++--------- .../sormas/ui/contact/ContactsView.java | 5 ++- .../de/symeda/sormas/ui/visit/VisitGrid.java | 9 ++---- 5 files changed, 13 insertions(+), 56 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseContactsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseContactsView.java index e71e16b6d12..d4a5a172f87 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseContactsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseContactsView.java @@ -382,7 +382,7 @@ protected void initView(String params) { grid.setEagerDataProvider(); } - grid.getDataProvider().addDataProviderListener(e -> updateStatusButtons()); + grid.addDataSizeChangeListener(e -> updateStatusButtons()); setSubComponent(gridLayout); } @@ -434,7 +434,7 @@ private void updateStatusButtons() { CssStyles.removeStyles(activeStatusButton, CssStyles.BUTTON_FILTER_LIGHT); if (activeStatusButton != null) { activeStatusButton - .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getItemCount()))); + .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getDataSize()))); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java index f527c117372..086e11d49ef 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/AbstractContactGrid.java @@ -20,14 +20,9 @@ import java.text.DecimalFormat; import java.util.Date; import java.util.List; -import java.util.stream.Collectors; import java.util.stream.Stream; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.DataProviderListener; -import com.vaadin.data.provider.ListDataProvider; import com.vaadin.navigator.View; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.Label; import com.vaadin.ui.renderers.DateRenderer; @@ -65,8 +60,6 @@ public abstract class AbstractContactGrid exte public static final String DISEASE_SHORT = Captions.columnDiseaseShort; public static final String COLUMN_COMPLETENESS = "completenessValue"; - private DataProviderListener dataProviderListener; - private final Class viewClass; private final Class viewConfigurationClass; @@ -251,32 +244,12 @@ public void reload() { public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> getGridData( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())).stream(), - query -> (int) FacadeProvider.getContactFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(this::getGridData, FacadeProvider.getContactFacade()::count); } public void setEagerDataProvider() { - ListDataProvider dataProvider = DataProvider.fromStream(getGridData(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); - - if (dataProviderListener != null) { - dataProvider.addDataProviderListener(dataProviderListener); - } - } - public void setDataProviderListener(DataProviderListener dataProviderListener) { - this.dataProviderListener = dataProviderListener; + setEagerDataProvider(this::getGridData); } protected abstract List getGridData(ContactCriteria contactCriteria, Integer first, Integer max, List sortProperties); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactFollowUpGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactFollowUpGrid.java index bf0c602dcb6..441ebdb3eb8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactFollowUpGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactFollowUpGrid.java @@ -124,22 +124,10 @@ public void reload() { public void setDataProvider(Date referenceDate, int interval) { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getContactFacade() - .getContactFollowUpList( - query.getFilter().orElse(null), - referenceDate, - interval, - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getContactFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider( + (criteria, first, max, sortProperties) -> FacadeProvider.getContactFacade() + .getContactFollowUpList(criteria, referenceDate, interval, first, max, sortProperties), + FacadeProvider.getContactFacade()::count); } private void setDates(Date referenceDate, int interval) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java index 683984b1caa..a8c6e63e2bb 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java @@ -150,7 +150,6 @@ public ContactsView() { grid = ContactsViewType.DETAILED_OVERVIEW.equals(viewConfiguration.getViewType()) ? new ContactGridDetailed(criteria, getClass(), ContactsViewConfiguration.class) : new ContactGrid(criteria, getClass(), ContactsViewConfiguration.class); - ((AbstractContactGrid) grid).setDataProviderListener(e -> updateStatusButtons()); } final VerticalLayout gridLayout = new VerticalLayout(); gridLayout.addComponent(createFilterBar()); @@ -164,7 +163,7 @@ public ContactsView() { gridLayout.setSizeFull(); gridLayout.setExpandRatio(grid, 1); gridLayout.setStyleName("crud-main-layout"); - grid.getDataProvider().addDataProviderListener(e -> updateStatusButtons()); + grid.addDataSizeChangeListener(e -> updateStatusButtons()); OptionGroup contactsViewSwitcher = new OptionGroup(); contactsViewSwitcher.setId("contactsViewSwitcher"); @@ -674,7 +673,7 @@ private void updateStatusButtons() { CssStyles.removeStyles(activeStatusButton, CssStyles.BUTTON_FILTER_LIGHT); if (activeStatusButton != null) { activeStatusButton - .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getItemCount()))); + .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getDataSize()))); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/visit/VisitGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/visit/VisitGrid.java index 41147491f78..85d00d7193d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/visit/VisitGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/visit/VisitGrid.java @@ -20,8 +20,6 @@ import java.util.Date; import java.util.function.Consumer; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; import com.vaadin.ui.Label; import com.vaadin.ui.renderers.DateRenderer; @@ -104,9 +102,8 @@ public VisitGrid(VisitCriteria criteria, boolean isEditAllowed) { } public void setEagerDataProvider() { - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getVisitFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); + + setDataProvider(FacadeProvider.getVisitFacade().getIndexList(getCriteria(), null, null, null).stream()); } public void reload() { @@ -114,7 +111,7 @@ public void reload() { deselectAll(); } - //getDataProvider().refreshAll(); // does not work for eager data providers + // getDataProvider().refreshAll() does not work for eager data providers setEagerDataProvider(); } } From 2a34cf5db0df041c8e65f7e081618f19f954dce8 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Tue, 13 Dec 2022 12:05:24 +0100 Subject: [PATCH 071/147] fix sorqa-709 --- .../e2etests/steps/web/application/events/EditEventSteps.java | 4 ++-- .../src/test/resources/features/sanity/web/Event.feature | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index 7db948e7213..99701a137e4 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -149,7 +149,6 @@ import static org.sormas.e2etests.pages.application.events.EventParticipantsPage.CONFIRM_ACTION; import static org.sormas.e2etests.pages.application.events.EventParticipantsPage.CONFIRM_BUTTON_FOR_SELECT_PERSON_FROM_ADD_PARTICIPANTS_WINDOW; import static org.sormas.e2etests.pages.application.events.EventParticipantsPage.CONFIRM_DEARCHIVE_BUTTON; -import static org.sormas.e2etests.pages.application.events.EventParticipantsPage.CONFIRM_DELETION_OF_EVENT_PARTICIPANT; import static org.sormas.e2etests.pages.application.events.EventParticipantsPage.CONFIRM_NAVIGATION_POPUP; import static org.sormas.e2etests.pages.application.events.EventParticipantsPage.CREATE_NEW_PERSON_RADIO_BUTTON; import static org.sormas.e2etests.pages.application.events.EventParticipantsPage.DEARCHIVE_REASON_TEXT_AREA; @@ -1434,7 +1433,8 @@ public EditEventSteps( webDriverHelpers.selectFromCombobox( DELETE_SAMPLE_REASON_POPUP, "Entity created without legal reason"); webDriverHelpers.clickOnWebElementBySelector(DELETE_POPUP_YES_BUTTON); - webDriverHelpers.clickOnWebElementBySelector(CONFIRM_DELETION_OF_EVENT_PARTICIPANT); + // + // webDriverHelpers.clickOnWebElementBySelector(CONFIRM_DELETION_OF_EVENT_PARTICIPANT); // if (webDriverHelpers.isElementVisibleWithTimeout(POPUP_DISCARD_CHANGES_BUTTON, // 30)) { // webDriverHelpers.clickOnWebElementBySelector(POPUP_DISCARD_CHANGES_BUTTON); diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature index 8e267787599..17b4f9fc80d 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature @@ -573,7 +573,7 @@ Feature: Create events And I open the last created Person via API And I check that SEE EVENTS FOR THIS PERSON button appears on Edit Person page - @env_main @#8555 + @env_main @#8555 @testIt Scenario: Add back a person to an event who was previously deleted as event participant Given API: I create a new person And API: I check that POST call body is "OK" From 3649a04311e840bc984c87aa1e731c8736aa0043 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Tue, 13 Dec 2022 12:06:22 +0100 Subject: [PATCH 072/147] fix sorqa-709 --- .../src/test/resources/features/sanity/web/Event.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature index 17b4f9fc80d..8e267787599 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature @@ -573,7 +573,7 @@ Feature: Create events And I open the last created Person via API And I check that SEE EVENTS FOR THIS PERSON button appears on Edit Person page - @env_main @#8555 @testIt + @env_main @#8555 Scenario: Add back a person to an event who was previously deleted as event participant Given API: I create a new person And API: I check that POST call body is "OK" From 705e80a762c61d14b8b38a38a3ea8d146c27ca9a Mon Sep 17 00:00:00 2001 From: sormas-vitagroup Date: Tue, 13 Dec 2022 11:08:07 +0000 Subject: [PATCH 073/147] [GitHub Actions] Update external visits API spec files --- openapi/external_visits_API.json | 1054 +---------------------- openapi/external_visits_API.yaml | 1339 ------------------------------ 2 files changed, 1 insertion(+), 2392 deletions(-) diff --git a/openapi/external_visits_API.json b/openapi/external_visits_API.json index 594c05e1461..495488dd1a5 100644 --- a/openapi/external_visits_API.json +++ b/openapi/external_visits_API.json @@ -7,1057 +7,5 @@ }, "servers" : [ { "url" : "/sormas-rest" - } ], - "paths" : { - "/visits-external/followUpEndDates/{since}" : { - "get" : { - "summary" : "Get follow up end dates", - "description" : "Get latest follow up end date assigned to the specified person. Note: Only returns values for persons who have their symptom journal status set to ACCEPTED! Only returns values changed after {since}, which is interpreted as a UNIX timestamp.", - "operationId" : "getLatestFollowUpEndDates", - "parameters" : [ { - "name" : "since", - "in" : "path", - "required" : true, - "schema" : { - "type" : "integer", - "format" : "int64" - } - } ], - "responses" : { - "default" : { - "description" : "List of personUuids and their latest follow up end dates as UNIX timestamps.", - "content" : { - "application/json; charset=UTF-8" : { - "schema" : { - "type" : "string", - "example" : [ { - "personUuid" : "Q56VFD-G3TXKT-R2DBIW-FTWIKAMI", - "latestFollowUpEndDate" : 1599602400000 - }, { - "personUuid" : "TEYCIW-BHWHMH-MH2QIW-KBP72JMU", - "latestFollowUpEndDate" : 1593727200000 - } ] - } - } - } - } - } - } - }, - "/visits-external/person/{personUuid}" : { - "get" : { - "summary" : "Get person information", - "description" : "Get some personal data for a specific person", - "operationId" : "getPersonByUuid", - "parameters" : [ { - "name" : "personUuid", - "in" : "path", - "required" : true, - "schema" : { - "type" : "string" - } - } ], - "responses" : { - "default" : { - "description" : "A selection of personal data, including first and last name, e-mail, phone number and birth date if available for that person. Regarding the e-mail and phone number: in SORMAS it is possible to store several e-mail addresses and phone numbers for a person. It is tried to provide one e-mail address and/or phone number via the external visits API in any feasible way.
if there is just one e-mail and/or phone number for a person, this is transmitted.
If there are several e-mail addresses and or phone numbers, SORMAS will transmit the ones marked as primary.
If there are several e-mail addresses or phone numbers without any marked as primary, SORMAS will request the user to mark one before registration.
Regarding the latestFollowUpEndDate: this is the latest follow up end date of any contact (or case, if the case follow up feature is enabled) related to the person. The contacts (and cases) considered are not filtered by disease.
Note that Null value fields may not be returned. If you get an unexpected result, it might help to verify if the personUuid is existing in your system via the isValid controller.
If you get \"pseudonymized\": true, the user the request was authorized with probably lacks the user role REST_EXTERNAL_VISITS_USER.", - "content" : { - "application/json; charset=UTF-8" : { - "schema" : { - "$ref" : "#/components/schemas/JournalPersonDto" - } - } - } - } - } - } - }, - "/visits-external/version" : { - "get" : { - "summary" : "Get API version", - "operationId" : "getVersion", - "responses" : { - "default" : { - "description" : "The minimal version needed for compatibility with the external ReST API of SORMAS.", - "content" : { - "application/json; charset=UTF-8" : { - "schema" : { - "type" : "string", - "example" : "1.37.0" - } - } - } - } - } - } - }, - "/visits-external/person/{personUuid}/isValid" : { - "get" : { - "summary" : "Check person validity", - "description" : "Check if a the Uuid given as parameter exists in SORMAS.", - "operationId" : "isValidPersonUuid", - "parameters" : [ { - "name" : "personUuid", - "in" : "path", - "required" : true, - "schema" : { - "type" : "string" - } - } ], - "responses" : { - "default" : { - "description" : "true a person with the given Uuid exists in SORMAS, false otherwise.", - "content" : { - "application/json; charset=UTF-8" : { - "schema" : { - "type" : "string", - "example" : true - } - } - } - } - } - } - }, - "/visits-external" : { - "post" : { - "summary" : "Save visits", - "description" : "Upload visits with all symptom and disease related data to SORMAS.", - "operationId" : "postExternalVisits", - "requestBody" : { - "content" : { - "application/json; charset=UTF-8" : { - "schema" : { - "type" : "array", - "items" : { - "$ref" : "#/components/schemas/ExternalVisitDto" - } - } - } - } - }, - "responses" : { - "default" : { - "description" : "default response", - "content" : { - "application/json; charset=UTF-8" : { - "schema" : { - "type" : "array", - "items" : { - "type" : "string", - "enum" : [ "OK", "TOO_OLD", "ERROR", "VALIDATION_EXCEPTION", "TRANSACTION_ROLLED_BACK_EXCEPTION" ] - } - } - } - } - } - } - } - }, - "/visits-external/person/{personUuid}/status" : { - "post" : { - "summary" : "Save symptom journal status", - "operationId" : "postSymptomJournalStatus", - "parameters" : [ { - "name" : "personUuid", - "in" : "path", - "required" : true, - "schema" : { - "type" : "string" - } - } ], - "requestBody" : { - "description" : "status may be one of the following:
UNREGISTERED: User has not yet sent any state
REGISTERED: After successful registration in SymptomJournal
ACCEPTED: User has accepted a confirmation
REJECTED: User has rejected (declined) a confirmation
DELETED: User was deleted", - "content" : { - "application/json; charset=UTF-8" : { - "schema" : { - "type" : "string", - "example" : "[\n {\n \"status\": \"REGISTERED\",\n \"statusDateTime\": \"2020-04-15T12:55:00.000+02:00\" // datetime format yyyy-MM-dd'T'HH:mm:ss.SSSZ\n }\n]" - } - } - } - }, - "responses" : { - "default" : { - "description" : "true if the status was set successfully, false otherwise.", - "content" : { - "application/json; charset=UTF-8" : { - "schema" : { - "type" : "string", - "example" : true - } - } - } - } - } - } - } - }, - "components" : { - "schemas" : { - "PersonFollowUpEndDto" : { - "type" : "object", - "properties" : { - "personUuid" : { - "type" : "string" - }, - "latestFollowUpEndDate" : { - "type" : "string", - "format" : "date-time" - } - } - }, - "JournalPersonDto" : { - "type" : "object", - "properties" : { - "uuid" : { - "maxLength" : 36, - "minLength" : 20, - "pattern" : "^[0-9a-zA-Z-]*$", - "type" : "string" - }, - "pseudonymized" : { - "type" : "boolean" - }, - "firstName" : { - "type" : "string" - }, - "lastName" : { - "type" : "string" - }, - "emailAddress" : { - "type" : "string" - }, - "phone" : { - "type" : "string" - }, - "birthdateDD" : { - "type" : "integer", - "format" : "int32" - }, - "birthdateMM" : { - "type" : "integer", - "format" : "int32" - }, - "birthdateYYYY" : { - "type" : "integer", - "format" : "int32" - }, - "sex" : { - "type" : "string", - "enum" : [ "Male", "Female", "Other", "Unknown" ] - }, - "latestFollowUpEndDate" : { - "type" : "string", - "format" : "date-time" - }, - "followUpStatus" : { - "type" : "string", - "enum" : [ "Under follow-up", "Completed follow-up", "Canceled follow-up", "Lost follow-up", "No follow-up" ] - } - } - }, - "ExternalVisitDto" : { - "type" : "object", - "properties" : { - "personUuid" : { - "maxLength" : 36, - "minLength" : 20, - "pattern" : "^[0-9a-zA-Z-]*$", - "type" : "string" - }, - "disease" : { - "type" : "string", - "enum" : [ "Acute Flaccid Paralysis", "Cholera", "Congenital Rubella", "Meningitis (CSM)", "Dengue Fever", "Ebola Virus Disease", "Guinea Worm", "Lassa", "Measles", "Monkeypox", "Influenza (New subtype)", "Plague", "Poliomyelitis", "Unspecified VHF", "West Nile Fever", "Yellow Fever", "Human Rabies", "Anthrax", "COVID-19", "Pneumonia", "Malaria", "Typhoid Fever", "Acute Viral Hepatitis", "Non-Neonatal Tetanus", "HIV", "Schistosomiasis", "Soil-Transmitted Helminths", "Trypanosomiasis", "Diarrhea w/ Dehydration (< 5)", "Diarrhea w/ Blood (Shigella)", "Snake Bite", "Rubella", "Tuberculosis", "Leprosy", "Lymphatic Filariasis", "Buruli Ulcer", "Pertussis", "Neonatal Tetanus", "Onchocerciasis", "Diphteria", "Trachoma", "Yaws and Endemic Syphilis", "Maternal Deaths", "Perinatal Deaths", "Influenza A", "Influenza B", "H.metapneumovirus", "Respiratory syncytial virus (RSV)", "Parainfluenza (1-4)", "Adenovirus", "Rhinovirus", "Enterovirus", "M.pneumoniae", "C.pneumoniae", "ARI (Acute Respiratory Infections)", "Chikungunya", "Post-immunization adverse events mild", "Post-immunization adverse events severe", "FHA (Functional Hypothalamic Amenorrhea)", "Other Epidemic Disease", "Not Yet Defined" ] - }, - "visitDateTime" : { - "type" : "string", - "format" : "date-time" - }, - "visitStatus" : { - "type" : "string", - "enum" : [ "Unavailable", "Available, but uncooperative", "Available and cooperative" ] - }, - "visitRemarks" : { - "maxLength" : 512, - "minLength" : 0, - "type" : "string" - }, - "symptoms" : { - "$ref" : "#/components/schemas/SymptomsDto" - }, - "reportLat" : { - "maximum" : 90, - "minimum" : -90, - "type" : "number", - "format" : "double" - }, - "reportLon" : { - "maximum" : 180, - "minimum" : -180, - "type" : "number", - "format" : "double" - }, - "reportLatLonAccuracy" : { - "type" : "number", - "format" : "float" - } - } - }, - "SymptomsDto" : { - "type" : "object", - "properties" : { - "creationDate" : { - "type" : "string", - "format" : "date-time" - }, - "changeDate" : { - "type" : "string", - "format" : "date-time" - }, - "uuid" : { - "maxLength" : 36, - "minLength" : 20, - "pattern" : "^[0-9a-zA-Z-]*$", - "type" : "string" - }, - "pseudonymized" : { - "type" : "boolean" - }, - "inJurisdiction" : { - "type" : "boolean" - }, - "abdominalPain" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "anorexiaAppetiteLoss" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "backache" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "bedridden" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "blackeningDeathOfTissue" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "bleedingVagina" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "bloodInStool" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "bloodPressureDiastolic" : { - "type" : "integer", - "format" : "int32" - }, - "bloodPressureSystolic" : { - "type" : "integer", - "format" : "int32" - }, - "bloodUrine" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "bloodyBlackStool" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "buboesGroinArmpitNeck" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "bulgingFontanelle" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "chestPain" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "chillsSweats" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "conjunctivitis" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "cough" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "coughWithSputum" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "coughWithHeamoptysis" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "coughingBlood" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "darkUrine" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "dehydration" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "diarrhea" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "difficultyBreathing" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "digestedBloodVomit" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "eyePainLightSensitive" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "eyesBleeding" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "fatigueWeakness" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "fever" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "fluidInLungCavity" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "glasgowComaScale" : { - "type" : "integer", - "format" : "int32" - }, - "gumsBleeding" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "headache" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "hearingloss" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "heartRate" : { - "type" : "integer", - "format" : "int32" - }, - "height" : { - "type" : "integer", - "format" : "int32" - }, - "hiccups" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "injectionSiteBleeding" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "jaundice" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "jaundiceWithin24HoursOfBirth" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "jointPain" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "kopliksSpots" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lesions" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lesionsAllOverBody" : { - "type" : "boolean" - }, - "lesionsArms" : { - "type" : "boolean" - }, - "lesionsDeepProfound" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lesionsFace" : { - "type" : "boolean" - }, - "lesionsGenitals" : { - "type" : "boolean" - }, - "lesionsLegs" : { - "type" : "boolean" - }, - "lesionsOnsetDate" : { - "type" : "string", - "format" : "date-time" - }, - "lesionsPalmsHands" : { - "type" : "boolean" - }, - "lesionsResembleImg1" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lesionsResembleImg2" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lesionsResembleImg3" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lesionsResembleImg4" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lesionsSameSize" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lesionsSameState" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lesionsSolesFeet" : { - "type" : "boolean" - }, - "lesionsThatItch" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lesionsThorax" : { - "type" : "boolean" - }, - "lossSkinTurgor" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lymphadenopathy" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lymphadenopathyAxillary" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lymphadenopathyCervical" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lymphadenopathyInguinal" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "malaise" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "midUpperArmCircumference" : { - "type" : "integer", - "format" : "int32" - }, - "musclePain" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "nausea" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "neckStiffness" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "noseBleeding" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "oedemaFaceNeck" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "oedemaLowerExtremity" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "onsetDate" : { - "type" : "string", - "format" : "date-time" - }, - "onsetSymptom" : { - "maxLength" : 512, - "minLength" : 0, - "type" : "string" - }, - "oralUlcers" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "otherHemorrhagicSymptoms" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "otherHemorrhagicSymptomsText" : { - "maxLength" : 512, - "minLength" : 0, - "type" : "string" - }, - "otherNonHemorrhagicSymptoms" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "otherNonHemorrhagicSymptomsText" : { - "maxLength" : 512, - "minLength" : 0, - "type" : "string" - }, - "otitisMedia" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "painfulLymphadenitis" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "palpableLiver" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "palpableSpleen" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "patientIllLocation" : { - "maxLength" : 512, - "minLength" : 0, - "type" : "string" - }, - "pharyngealErythema" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "pharyngealExudate" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "rapidBreathing" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "redBloodVomit" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "refusalFeedorDrink" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "respiratoryRate" : { - "type" : "integer", - "format" : "int32" - }, - "runnyNose" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "sidePain" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "skinBruising" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "skinRash" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "soreThroat" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "stomachBleeding" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "sunkenEyesFontanelle" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "swollenGlands" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "symptomatic" : { - "type" : "boolean" - }, - "symptomsComments" : { - "maxLength" : 512, - "minLength" : 0, - "type" : "string" - }, - "temperature" : { - "type" : "number", - "format" : "float" - }, - "temperatureSource" : { - "type" : "string", - "enum" : [ "axillary", "oral", "rectal", "Non-contact (infrared)" ] - }, - "throbocytopenia" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "tremor" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "bilateralCataracts" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "unilateralCataracts" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "congenitalGlaucoma" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "pigmentaryRetinopathy" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "purpuricRash" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "microcephaly" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "developmentalDelay" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "splenomegaly" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "meningoencephalitis" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "radiolucentBoneDisease" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "congenitalHeartDisease" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "congenitalHeartDiseaseType" : { - "type" : "string", - "enum" : [ "Patent ductus arteriosus (PDA)", "Peripheral pulmonary stenosis (PPS)", "Ventricular septal defect (VSD)", "Other heart defect" ] - }, - "congenitalHeartDiseaseDetails" : { - "maxLength" : 512, - "minLength" : 0, - "type" : "string" - }, - "unexplainedBleeding" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "vomiting" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "hydrophobia" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "opisthotonus" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "anxietyStates" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "delirium" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "uproariousness" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "paresthesiaAroundWound" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "excessSalivation" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "insomnia" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "paralysis" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "excitation" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "dysphagia" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "aerophobia" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "hyperactivity" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "paresis" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "agitation" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "ascendingFlaccidParalysis" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "erraticBehaviour" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "coma" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "convulsion" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "fluidInLungCavityAuscultation" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "fluidInLungCavityXray" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "abnormalLungXrayFindings" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "conjunctivalInjection" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "acuteRespiratoryDistressSyndrome" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "pneumoniaClinicalOrRadiologic" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lossOfTaste" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "lossOfSmell" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "wheezing" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "skinUlcers" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "inabilityToWalk" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "inDrawingOfChestWall" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "respiratoryDiseaseVentilation" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "feelingIll" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "fastHeartRate" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "oxygenSaturationLower94" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "weight" : { - "type" : "integer", - "format" : "int32" - }, - "alteredConsciousness" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "confusedDisoriented" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "hemorrhagicSyndrome" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "hyperglycemia" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "hypoglycemia" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "meningealSigns" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "otherComplications" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "otherComplicationsText" : { - "maxLength" : 512, - "minLength" : 0, - "type" : "string" - }, - "seizures" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "sepsis" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "shock" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "feverishFeeling" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "weakness" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "fatigue" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "coughWithoutSputum" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "breathlessness" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "chestPressure" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "blueLips" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "bloodCirculationProblems" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "palpitations" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "dizzinessStandingUp" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "highOrLowBloodPressure" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "urinaryRetention" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - }, - "shivering" : { - "type" : "string", - "enum" : [ "Yes", "No", "Unknown" ] - } - } - }, - "PersonSymptomJournalStatusDto" : { - "type" : "object", - "properties" : { - "status" : { - "type" : "string", - "enum" : [ "Unregistered", "Registered", "Accepted", "Rejected", "Deleted" ] - }, - "statusDateTime" : { - "type" : "string" - } - } - } - } - } + } ] } \ No newline at end of file diff --git a/openapi/external_visits_API.yaml b/openapi/external_visits_API.yaml index ba02a257bfd..1b677af8910 100644 --- a/openapi/external_visits_API.yaml +++ b/openapi/external_visits_API.yaml @@ -187,1342 +187,3 @@ info: version: 1.41.1 servers: - url: /sormas-rest -paths: - /visits-external/followUpEndDates/{since}: - get: - summary: Get follow up end dates - description: "Get latest follow up end date assigned to the specified person.\ - \ Note: Only returns values for persons who have their symptom journal status\ - \ set to ACCEPTED! Only returns values changed after {since}, which is interpreted\ - \ as a UNIX timestamp." - operationId: getLatestFollowUpEndDates - parameters: - - name: since - in: path - required: true - schema: - type: integer - format: int64 - responses: - default: - description: List of personUuids and their latest follow up end dates as - UNIX timestamps. - content: - application/json; charset=UTF-8: - schema: - type: string - example: - - personUuid: Q56VFD-G3TXKT-R2DBIW-FTWIKAMI - latestFollowUpEndDate: 1599602400000 - - personUuid: TEYCIW-BHWHMH-MH2QIW-KBP72JMU - latestFollowUpEndDate: 1593727200000 - /visits-external/person/{personUuid}: - get: - summary: Get person information - description: Get some personal data for a specific person - operationId: getPersonByUuid - parameters: - - name: personUuid - in: path - required: true - schema: - type: string - responses: - default: - description: "A selection of personal data, including first and last name,\ - \ e-mail, phone number and birth date if available for that person. Regarding\ - \ the e-mail and phone number: in SORMAS it is possible to store several\ - \ e-mail addresses and phone numbers for a person. It is tried to provide\ - \ one e-mail address and/or phone number via the external visits API in\ - \ any feasible way.
if there is just one e-mail and/or phone number\ - \ for a person, this is transmitted.
If there are several e-mail addresses\ - \ and or phone numbers, SORMAS will transmit the ones marked as primary.
If\ - \ there are several e-mail addresses or phone numbers without any marked\ - \ as primary, SORMAS will request the user to mark one before registration.
Regarding\ - \ the latestFollowUpEndDate: this is the latest follow up end date of\ - \ any contact (or case, if the case follow up feature is enabled) related\ - \ to the person. The contacts (and cases) considered are not filtered\ - \ by disease.
Note that Null value fields may not be returned. If you\ - \ get an unexpected result, it might help to verify if the personUuid\ - \ is existing in your system via the isValid controller.
If you get\ - \ \"pseudonymized\": true, the user the request was authorized with probably\ - \ lacks the user role REST_EXTERNAL_VISITS_USER." - content: - application/json; charset=UTF-8: - schema: - $ref: '#/components/schemas/JournalPersonDto' - /visits-external/version: - get: - summary: Get API version - operationId: getVersion - responses: - default: - description: The minimal version needed for compatibility with the external - ReST API of SORMAS. - content: - application/json; charset=UTF-8: - schema: - type: string - example: 1.37.0 - /visits-external/person/{personUuid}/isValid: - get: - summary: Check person validity - description: Check if a the Uuid given as parameter exists in SORMAS. - operationId: isValidPersonUuid - parameters: - - name: personUuid - in: path - required: true - schema: - type: string - responses: - default: - description: "true a person with the given Uuid exists in SORMAS, false\ - \ otherwise." - content: - application/json; charset=UTF-8: - schema: - type: string - example: true - /visits-external: - post: - summary: Save visits - description: Upload visits with all symptom and disease related data to SORMAS. - operationId: postExternalVisits - requestBody: - content: - application/json; charset=UTF-8: - schema: - type: array - items: - $ref: '#/components/schemas/ExternalVisitDto' - responses: - default: - description: default response - content: - application/json; charset=UTF-8: - schema: - type: array - items: - type: string - enum: - - OK - - TOO_OLD - - ERROR - - VALIDATION_EXCEPTION - - TRANSACTION_ROLLED_BACK_EXCEPTION - /visits-external/person/{personUuid}/status: - post: - summary: Save symptom journal status - operationId: postSymptomJournalStatus - parameters: - - name: personUuid - in: path - required: true - schema: - type: string - requestBody: - description: "status may be one of the following:
UNREGISTERED: User has\ - \ not yet sent any state
REGISTERED: After successful registration in\ - \ SymptomJournal
ACCEPTED: User has accepted a confirmation
REJECTED:\ - \ User has rejected (declined) a confirmation
DELETED: User was deleted" - content: - application/json; charset=UTF-8: - schema: - type: string - example: "[\n {\n \"status\": \"REGISTERED\",\n \"statusDateTime\"\ - : \"2020-04-15T12:55:00.000+02:00\" // datetime format yyyy-MM-dd'T'HH:mm:ss.SSSZ\n\ - \ }\n]" - responses: - default: - description: "true if the status was set successfully, false otherwise." - content: - application/json; charset=UTF-8: - schema: - type: string - example: true -components: - schemas: - PersonFollowUpEndDto: - type: object - properties: - personUuid: - type: string - latestFollowUpEndDate: - type: string - format: date-time - JournalPersonDto: - type: object - properties: - uuid: - maxLength: 36 - minLength: 20 - pattern: "^[0-9a-zA-Z-]*$" - type: string - pseudonymized: - type: boolean - firstName: - type: string - lastName: - type: string - emailAddress: - type: string - phone: - type: string - birthdateDD: - type: integer - format: int32 - birthdateMM: - type: integer - format: int32 - birthdateYYYY: - type: integer - format: int32 - sex: - type: string - enum: - - Male - - Female - - Other - - Unknown - latestFollowUpEndDate: - type: string - format: date-time - followUpStatus: - type: string - enum: - - Under follow-up - - Completed follow-up - - Canceled follow-up - - Lost follow-up - - No follow-up - ExternalVisitDto: - type: object - properties: - personUuid: - maxLength: 36 - minLength: 20 - pattern: "^[0-9a-zA-Z-]*$" - type: string - disease: - type: string - enum: - - Acute Flaccid Paralysis - - Cholera - - Congenital Rubella - - Meningitis (CSM) - - Dengue Fever - - Ebola Virus Disease - - Guinea Worm - - Lassa - - Measles - - Monkeypox - - Influenza (New subtype) - - Plague - - Poliomyelitis - - Unspecified VHF - - West Nile Fever - - Yellow Fever - - Human Rabies - - Anthrax - - COVID-19 - - Pneumonia - - Malaria - - Typhoid Fever - - Acute Viral Hepatitis - - Non-Neonatal Tetanus - - HIV - - Schistosomiasis - - Soil-Transmitted Helminths - - Trypanosomiasis - - Diarrhea w/ Dehydration (< 5) - - Diarrhea w/ Blood (Shigella) - - Snake Bite - - Rubella - - Tuberculosis - - Leprosy - - Lymphatic Filariasis - - Buruli Ulcer - - Pertussis - - Neonatal Tetanus - - Onchocerciasis - - Diphteria - - Trachoma - - Yaws and Endemic Syphilis - - Maternal Deaths - - Perinatal Deaths - - Influenza A - - Influenza B - - H.metapneumovirus - - Respiratory syncytial virus (RSV) - - Parainfluenza (1-4) - - Adenovirus - - Rhinovirus - - Enterovirus - - M.pneumoniae - - C.pneumoniae - - ARI (Acute Respiratory Infections) - - Chikungunya - - Post-immunization adverse events mild - - Post-immunization adverse events severe - - FHA (Functional Hypothalamic Amenorrhea) - - Other Epidemic Disease - - Not Yet Defined - visitDateTime: - type: string - format: date-time - visitStatus: - type: string - enum: - - Unavailable - - "Available, but uncooperative" - - Available and cooperative - visitRemarks: - maxLength: 512 - minLength: 0 - type: string - symptoms: - $ref: '#/components/schemas/SymptomsDto' - reportLat: - maximum: 90 - minimum: -90 - type: number - format: double - reportLon: - maximum: 180 - minimum: -180 - type: number - format: double - reportLatLonAccuracy: - type: number - format: float - SymptomsDto: - type: object - properties: - creationDate: - type: string - format: date-time - changeDate: - type: string - format: date-time - uuid: - maxLength: 36 - minLength: 20 - pattern: "^[0-9a-zA-Z-]*$" - type: string - pseudonymized: - type: boolean - inJurisdiction: - type: boolean - abdominalPain: - type: string - enum: - - "Yes" - - "No" - - Unknown - anorexiaAppetiteLoss: - type: string - enum: - - "Yes" - - "No" - - Unknown - backache: - type: string - enum: - - "Yes" - - "No" - - Unknown - bedridden: - type: string - enum: - - "Yes" - - "No" - - Unknown - blackeningDeathOfTissue: - type: string - enum: - - "Yes" - - "No" - - Unknown - bleedingVagina: - type: string - enum: - - "Yes" - - "No" - - Unknown - bloodInStool: - type: string - enum: - - "Yes" - - "No" - - Unknown - bloodPressureDiastolic: - type: integer - format: int32 - bloodPressureSystolic: - type: integer - format: int32 - bloodUrine: - type: string - enum: - - "Yes" - - "No" - - Unknown - bloodyBlackStool: - type: string - enum: - - "Yes" - - "No" - - Unknown - buboesGroinArmpitNeck: - type: string - enum: - - "Yes" - - "No" - - Unknown - bulgingFontanelle: - type: string - enum: - - "Yes" - - "No" - - Unknown - chestPain: - type: string - enum: - - "Yes" - - "No" - - Unknown - chillsSweats: - type: string - enum: - - "Yes" - - "No" - - Unknown - conjunctivitis: - type: string - enum: - - "Yes" - - "No" - - Unknown - cough: - type: string - enum: - - "Yes" - - "No" - - Unknown - coughWithSputum: - type: string - enum: - - "Yes" - - "No" - - Unknown - coughWithHeamoptysis: - type: string - enum: - - "Yes" - - "No" - - Unknown - coughingBlood: - type: string - enum: - - "Yes" - - "No" - - Unknown - darkUrine: - type: string - enum: - - "Yes" - - "No" - - Unknown - dehydration: - type: string - enum: - - "Yes" - - "No" - - Unknown - diarrhea: - type: string - enum: - - "Yes" - - "No" - - Unknown - difficultyBreathing: - type: string - enum: - - "Yes" - - "No" - - Unknown - digestedBloodVomit: - type: string - enum: - - "Yes" - - "No" - - Unknown - eyePainLightSensitive: - type: string - enum: - - "Yes" - - "No" - - Unknown - eyesBleeding: - type: string - enum: - - "Yes" - - "No" - - Unknown - fatigueWeakness: - type: string - enum: - - "Yes" - - "No" - - Unknown - fever: - type: string - enum: - - "Yes" - - "No" - - Unknown - fluidInLungCavity: - type: string - enum: - - "Yes" - - "No" - - Unknown - glasgowComaScale: - type: integer - format: int32 - gumsBleeding: - type: string - enum: - - "Yes" - - "No" - - Unknown - headache: - type: string - enum: - - "Yes" - - "No" - - Unknown - hearingloss: - type: string - enum: - - "Yes" - - "No" - - Unknown - heartRate: - type: integer - format: int32 - height: - type: integer - format: int32 - hiccups: - type: string - enum: - - "Yes" - - "No" - - Unknown - injectionSiteBleeding: - type: string - enum: - - "Yes" - - "No" - - Unknown - jaundice: - type: string - enum: - - "Yes" - - "No" - - Unknown - jaundiceWithin24HoursOfBirth: - type: string - enum: - - "Yes" - - "No" - - Unknown - jointPain: - type: string - enum: - - "Yes" - - "No" - - Unknown - kopliksSpots: - type: string - enum: - - "Yes" - - "No" - - Unknown - lesions: - type: string - enum: - - "Yes" - - "No" - - Unknown - lesionsAllOverBody: - type: boolean - lesionsArms: - type: boolean - lesionsDeepProfound: - type: string - enum: - - "Yes" - - "No" - - Unknown - lesionsFace: - type: boolean - lesionsGenitals: - type: boolean - lesionsLegs: - type: boolean - lesionsOnsetDate: - type: string - format: date-time - lesionsPalmsHands: - type: boolean - lesionsResembleImg1: - type: string - enum: - - "Yes" - - "No" - - Unknown - lesionsResembleImg2: - type: string - enum: - - "Yes" - - "No" - - Unknown - lesionsResembleImg3: - type: string - enum: - - "Yes" - - "No" - - Unknown - lesionsResembleImg4: - type: string - enum: - - "Yes" - - "No" - - Unknown - lesionsSameSize: - type: string - enum: - - "Yes" - - "No" - - Unknown - lesionsSameState: - type: string - enum: - - "Yes" - - "No" - - Unknown - lesionsSolesFeet: - type: boolean - lesionsThatItch: - type: string - enum: - - "Yes" - - "No" - - Unknown - lesionsThorax: - type: boolean - lossSkinTurgor: - type: string - enum: - - "Yes" - - "No" - - Unknown - lymphadenopathy: - type: string - enum: - - "Yes" - - "No" - - Unknown - lymphadenopathyAxillary: - type: string - enum: - - "Yes" - - "No" - - Unknown - lymphadenopathyCervical: - type: string - enum: - - "Yes" - - "No" - - Unknown - lymphadenopathyInguinal: - type: string - enum: - - "Yes" - - "No" - - Unknown - malaise: - type: string - enum: - - "Yes" - - "No" - - Unknown - midUpperArmCircumference: - type: integer - format: int32 - musclePain: - type: string - enum: - - "Yes" - - "No" - - Unknown - nausea: - type: string - enum: - - "Yes" - - "No" - - Unknown - neckStiffness: - type: string - enum: - - "Yes" - - "No" - - Unknown - noseBleeding: - type: string - enum: - - "Yes" - - "No" - - Unknown - oedemaFaceNeck: - type: string - enum: - - "Yes" - - "No" - - Unknown - oedemaLowerExtremity: - type: string - enum: - - "Yes" - - "No" - - Unknown - onsetDate: - type: string - format: date-time - onsetSymptom: - maxLength: 512 - minLength: 0 - type: string - oralUlcers: - type: string - enum: - - "Yes" - - "No" - - Unknown - otherHemorrhagicSymptoms: - type: string - enum: - - "Yes" - - "No" - - Unknown - otherHemorrhagicSymptomsText: - maxLength: 512 - minLength: 0 - type: string - otherNonHemorrhagicSymptoms: - type: string - enum: - - "Yes" - - "No" - - Unknown - otherNonHemorrhagicSymptomsText: - maxLength: 512 - minLength: 0 - type: string - otitisMedia: - type: string - enum: - - "Yes" - - "No" - - Unknown - painfulLymphadenitis: - type: string - enum: - - "Yes" - - "No" - - Unknown - palpableLiver: - type: string - enum: - - "Yes" - - "No" - - Unknown - palpableSpleen: - type: string - enum: - - "Yes" - - "No" - - Unknown - patientIllLocation: - maxLength: 512 - minLength: 0 - type: string - pharyngealErythema: - type: string - enum: - - "Yes" - - "No" - - Unknown - pharyngealExudate: - type: string - enum: - - "Yes" - - "No" - - Unknown - rapidBreathing: - type: string - enum: - - "Yes" - - "No" - - Unknown - redBloodVomit: - type: string - enum: - - "Yes" - - "No" - - Unknown - refusalFeedorDrink: - type: string - enum: - - "Yes" - - "No" - - Unknown - respiratoryRate: - type: integer - format: int32 - runnyNose: - type: string - enum: - - "Yes" - - "No" - - Unknown - sidePain: - type: string - enum: - - "Yes" - - "No" - - Unknown - skinBruising: - type: string - enum: - - "Yes" - - "No" - - Unknown - skinRash: - type: string - enum: - - "Yes" - - "No" - - Unknown - soreThroat: - type: string - enum: - - "Yes" - - "No" - - Unknown - stomachBleeding: - type: string - enum: - - "Yes" - - "No" - - Unknown - sunkenEyesFontanelle: - type: string - enum: - - "Yes" - - "No" - - Unknown - swollenGlands: - type: string - enum: - - "Yes" - - "No" - - Unknown - symptomatic: - type: boolean - symptomsComments: - maxLength: 512 - minLength: 0 - type: string - temperature: - type: number - format: float - temperatureSource: - type: string - enum: - - axillary - - oral - - rectal - - Non-contact (infrared) - throbocytopenia: - type: string - enum: - - "Yes" - - "No" - - Unknown - tremor: - type: string - enum: - - "Yes" - - "No" - - Unknown - bilateralCataracts: - type: string - enum: - - "Yes" - - "No" - - Unknown - unilateralCataracts: - type: string - enum: - - "Yes" - - "No" - - Unknown - congenitalGlaucoma: - type: string - enum: - - "Yes" - - "No" - - Unknown - pigmentaryRetinopathy: - type: string - enum: - - "Yes" - - "No" - - Unknown - purpuricRash: - type: string - enum: - - "Yes" - - "No" - - Unknown - microcephaly: - type: string - enum: - - "Yes" - - "No" - - Unknown - developmentalDelay: - type: string - enum: - - "Yes" - - "No" - - Unknown - splenomegaly: - type: string - enum: - - "Yes" - - "No" - - Unknown - meningoencephalitis: - type: string - enum: - - "Yes" - - "No" - - Unknown - radiolucentBoneDisease: - type: string - enum: - - "Yes" - - "No" - - Unknown - congenitalHeartDisease: - type: string - enum: - - "Yes" - - "No" - - Unknown - congenitalHeartDiseaseType: - type: string - enum: - - Patent ductus arteriosus (PDA) - - Peripheral pulmonary stenosis (PPS) - - Ventricular septal defect (VSD) - - Other heart defect - congenitalHeartDiseaseDetails: - maxLength: 512 - minLength: 0 - type: string - unexplainedBleeding: - type: string - enum: - - "Yes" - - "No" - - Unknown - vomiting: - type: string - enum: - - "Yes" - - "No" - - Unknown - hydrophobia: - type: string - enum: - - "Yes" - - "No" - - Unknown - opisthotonus: - type: string - enum: - - "Yes" - - "No" - - Unknown - anxietyStates: - type: string - enum: - - "Yes" - - "No" - - Unknown - delirium: - type: string - enum: - - "Yes" - - "No" - - Unknown - uproariousness: - type: string - enum: - - "Yes" - - "No" - - Unknown - paresthesiaAroundWound: - type: string - enum: - - "Yes" - - "No" - - Unknown - excessSalivation: - type: string - enum: - - "Yes" - - "No" - - Unknown - insomnia: - type: string - enum: - - "Yes" - - "No" - - Unknown - paralysis: - type: string - enum: - - "Yes" - - "No" - - Unknown - excitation: - type: string - enum: - - "Yes" - - "No" - - Unknown - dysphagia: - type: string - enum: - - "Yes" - - "No" - - Unknown - aerophobia: - type: string - enum: - - "Yes" - - "No" - - Unknown - hyperactivity: - type: string - enum: - - "Yes" - - "No" - - Unknown - paresis: - type: string - enum: - - "Yes" - - "No" - - Unknown - agitation: - type: string - enum: - - "Yes" - - "No" - - Unknown - ascendingFlaccidParalysis: - type: string - enum: - - "Yes" - - "No" - - Unknown - erraticBehaviour: - type: string - enum: - - "Yes" - - "No" - - Unknown - coma: - type: string - enum: - - "Yes" - - "No" - - Unknown - convulsion: - type: string - enum: - - "Yes" - - "No" - - Unknown - fluidInLungCavityAuscultation: - type: string - enum: - - "Yes" - - "No" - - Unknown - fluidInLungCavityXray: - type: string - enum: - - "Yes" - - "No" - - Unknown - abnormalLungXrayFindings: - type: string - enum: - - "Yes" - - "No" - - Unknown - conjunctivalInjection: - type: string - enum: - - "Yes" - - "No" - - Unknown - acuteRespiratoryDistressSyndrome: - type: string - enum: - - "Yes" - - "No" - - Unknown - pneumoniaClinicalOrRadiologic: - type: string - enum: - - "Yes" - - "No" - - Unknown - lossOfTaste: - type: string - enum: - - "Yes" - - "No" - - Unknown - lossOfSmell: - type: string - enum: - - "Yes" - - "No" - - Unknown - wheezing: - type: string - enum: - - "Yes" - - "No" - - Unknown - skinUlcers: - type: string - enum: - - "Yes" - - "No" - - Unknown - inabilityToWalk: - type: string - enum: - - "Yes" - - "No" - - Unknown - inDrawingOfChestWall: - type: string - enum: - - "Yes" - - "No" - - Unknown - respiratoryDiseaseVentilation: - type: string - enum: - - "Yes" - - "No" - - Unknown - feelingIll: - type: string - enum: - - "Yes" - - "No" - - Unknown - fastHeartRate: - type: string - enum: - - "Yes" - - "No" - - Unknown - oxygenSaturationLower94: - type: string - enum: - - "Yes" - - "No" - - Unknown - weight: - type: integer - format: int32 - alteredConsciousness: - type: string - enum: - - "Yes" - - "No" - - Unknown - confusedDisoriented: - type: string - enum: - - "Yes" - - "No" - - Unknown - hemorrhagicSyndrome: - type: string - enum: - - "Yes" - - "No" - - Unknown - hyperglycemia: - type: string - enum: - - "Yes" - - "No" - - Unknown - hypoglycemia: - type: string - enum: - - "Yes" - - "No" - - Unknown - meningealSigns: - type: string - enum: - - "Yes" - - "No" - - Unknown - otherComplications: - type: string - enum: - - "Yes" - - "No" - - Unknown - otherComplicationsText: - maxLength: 512 - minLength: 0 - type: string - seizures: - type: string - enum: - - "Yes" - - "No" - - Unknown - sepsis: - type: string - enum: - - "Yes" - - "No" - - Unknown - shock: - type: string - enum: - - "Yes" - - "No" - - Unknown - feverishFeeling: - type: string - enum: - - "Yes" - - "No" - - Unknown - weakness: - type: string - enum: - - "Yes" - - "No" - - Unknown - fatigue: - type: string - enum: - - "Yes" - - "No" - - Unknown - coughWithoutSputum: - type: string - enum: - - "Yes" - - "No" - - Unknown - breathlessness: - type: string - enum: - - "Yes" - - "No" - - Unknown - chestPressure: - type: string - enum: - - "Yes" - - "No" - - Unknown - blueLips: - type: string - enum: - - "Yes" - - "No" - - Unknown - bloodCirculationProblems: - type: string - enum: - - "Yes" - - "No" - - Unknown - palpitations: - type: string - enum: - - "Yes" - - "No" - - Unknown - dizzinessStandingUp: - type: string - enum: - - "Yes" - - "No" - - Unknown - highOrLowBloodPressure: - type: string - enum: - - "Yes" - - "No" - - Unknown - urinaryRetention: - type: string - enum: - - "Yes" - - "No" - - Unknown - shivering: - type: string - enum: - - "Yes" - - "No" - - Unknown - PersonSymptomJournalStatusDto: - type: object - properties: - status: - type: string - enum: - - Unregistered - - Registered - - Accepted - - Rejected - - Deleted - statusDateTime: - type: string From 19db8d1d27a398e8902e553dd7f07dc501347ee7 Mon Sep 17 00:00:00 2001 From: Stefan Kock Date: Tue, 13 Dec 2022 11:50:02 +0100 Subject: [PATCH 074/147] #10958 Use getDataSize/new DataProvider on Views for Users and UserRoles - No dataSize shown for UserRoles --- .../de/symeda/sormas/ui/user/UserGrid.java | 27 +++---------------- .../symeda/sormas/ui/user/UserRoleGrid.java | 22 ++------------- .../de/symeda/sormas/ui/user/UsersView.java | 4 +-- 3 files changed, 8 insertions(+), 45 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserGrid.java index ba70b3adffc..ec3636f625e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserGrid.java @@ -20,12 +20,8 @@ import java.util.Collection; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; import com.vaadin.icons.VaadinIcons; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.renderers.HtmlRenderer; import com.vaadin.ui.renderers.TextRenderer; @@ -37,7 +33,6 @@ import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.user.UserRoleDto; import de.symeda.sormas.api.user.UserRoleReferenceDto; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; @@ -92,27 +87,13 @@ public UserGrid() { } public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getUserFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getUserFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + + setLazyDataProvider(FacadeProvider.getUserFacade()::getIndexList, FacadeProvider.getUserFacade()::count); } public void setEagerDataProvider() { - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getUserFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); + + setEagerDataProvider(FacadeProvider.getUserFacade()::getIndexList); } public void reload() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserRoleGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserRoleGrid.java index 81e8072e05d..6af1d2af2d3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserRoleGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserRoleGrid.java @@ -1,16 +1,10 @@ package de.symeda.sormas.ui.user; -import java.util.stream.Collectors; - -import com.vaadin.data.provider.DataProvider; -import com.vaadin.shared.data.sort.SortDirection; - import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.user.UserRoleCriteria; import de.symeda.sormas.api.user.UserRoleDto; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.utils.FilteredGrid; import de.symeda.sormas.ui.utils.ShowDetailsListener; @@ -41,20 +35,8 @@ public UserRoleGrid() { } public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getUserRoleFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getUserRoleFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + + setLazyDataProvider(FacadeProvider.getUserRoleFacade()::getIndexList, FacadeProvider.getUserRoleFacade()::count); } public void reload() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UsersView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UsersView.java index 22421b435f2..2f3f24511c0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UsersView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UsersView.java @@ -98,7 +98,7 @@ public UsersView() { gridLayout.addComponent(createFilterBar()); gridLayout.addComponent(createActionsBar()); - rowsCount = new RowCount(Strings.labelNumberOfUsers, grid.getItemCount()); + rowsCount = new RowCount(Strings.labelNumberOfUsers, grid.getDataSize()); gridLayout.addComponent(rowsCount); gridLayout.addComponent(grid); @@ -230,7 +230,7 @@ public HorizontalLayout createFilterBar() { searchField.addTextChangeListener(e -> { criteria.freeText(e.getText()); grid.reload(); - rowsCount.update(grid.getItemCount()); + rowsCount.update(grid.getDataSize()); }); filterLayout.addComponent(searchField); From b4dfa5965afa8eb15af530eff7ab99eaa1b198ab Mon Sep 17 00:00:00 2001 From: Stefan Kock Date: Tue, 13 Dec 2022 12:09:13 +0100 Subject: [PATCH 075/147] #10958 Use new DataProvider on Views for more Entities - Changed: Immunizations, TravelEntrys, ShareRequests, AggregateReports - No dataSize shown --- .../components/grid/ImmunizationGrid.java | 20 +-------- .../aggregate/AggregateReportsGrid.java | 19 ++++----- .../ui/reports/aggregate/ReportDataGrid.java | 23 ++++------ .../ui/sormastosormas/ShareRequestGrid.java | 42 +++++-------------- .../ui/travelentry/TravelEntryGrid.java | 28 ++----------- 5 files changed, 32 insertions(+), 100 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/grid/ImmunizationGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/grid/ImmunizationGrid.java index 9e9e01f05f4..46b01418d5d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/grid/ImmunizationGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/immunization/components/grid/ImmunizationGrid.java @@ -1,10 +1,7 @@ package de.symeda.sormas.ui.immunization.components.grid; import java.util.Date; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.renderers.DateRenderer; import com.vaadin.ui.renderers.TextRenderer; @@ -16,7 +13,6 @@ import de.symeda.sormas.api.immunization.ImmunizationIndexDto; import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.person.PersonHelper; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.immunization.ImmunizationPersonView; import de.symeda.sormas.ui.utils.DateFormatHelper; @@ -98,19 +94,7 @@ private void initColumns() { } private void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getImmunizationFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getImmunizationFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + + setLazyDataProvider(FacadeProvider.getImmunizationFacade()::getIndexList, FacadeProvider.getImmunizationFacade()::count); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/reports/aggregate/AggregateReportsGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/reports/aggregate/AggregateReportsGrid.java index 0da2da3120d..6828b5b5e4b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/reports/aggregate/AggregateReportsGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/reports/aggregate/AggregateReportsGrid.java @@ -1,8 +1,5 @@ package de.symeda.sormas.ui.reports.aggregate; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; - import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.report.AggregateCaseCountDto; @@ -82,14 +79,12 @@ private void setPointOfEntryColumnVisible(boolean visible) { public void reload() { - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getAggregateReportFacade().getIndexList(getCriteria()).stream().map(aggregatedCaseCountDto -> { - if (aggregatedCaseCountDto.getAgeGroup() != null) { - aggregatedCaseCountDto.setAgeGroup(AgeGroupUtils.createCaption(aggregatedCaseCountDto.getAgeGroup())); - } - return aggregatedCaseCountDto; - })); - setDataProvider(dataProvider); - dataProvider.refreshAll(); + setDataProvider(FacadeProvider.getAggregateReportFacade().getIndexList(getCriteria()).stream().map(aggregatedCaseCountDto -> { + if (aggregatedCaseCountDto.getAgeGroup() != null) { + aggregatedCaseCountDto.setAgeGroup(AgeGroupUtils.createCaption(aggregatedCaseCountDto.getAgeGroup())); + } + return aggregatedCaseCountDto; + })); + getDataProvider().refreshAll(); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/reports/aggregate/ReportDataGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/reports/aggregate/ReportDataGrid.java index cd32c6d737b..2b512c8c7d0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/reports/aggregate/ReportDataGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/reports/aggregate/ReportDataGrid.java @@ -1,9 +1,6 @@ package de.symeda.sormas.ui.reports.aggregate; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; import com.vaadin.icons.VaadinIcons; -import com.vaadin.navigator.Navigator; import com.vaadin.ui.Button; import com.vaadin.ui.themes.ValoTheme; @@ -12,10 +9,7 @@ import de.symeda.sormas.api.report.AggregateReportCriteria; import de.symeda.sormas.api.report.AggregateReportDto; import de.symeda.sormas.api.utils.AgeGroupUtils; -import de.symeda.sormas.api.utils.DataHelper; -import de.symeda.sormas.api.utils.criteria.BaseCriteria; import de.symeda.sormas.ui.ControllerProvider; -import de.symeda.sormas.ui.SormasUI; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.FilteredGrid; @@ -108,14 +102,13 @@ private Button createDeleteButton(AggregateReportDto aggregateReport) { } public void reload() { - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getAggregateReportFacade().getAggregateReports(getCriteria()).stream().map(aggregatedReportDto -> { - if (aggregatedReportDto.getAgeGroup() != null) { - aggregatedReportDto.setAgeGroup(AgeGroupUtils.createCaption(aggregatedReportDto.getAgeGroup())); - } - return aggregatedReportDto; - })); - setDataProvider(dataProvider); - dataProvider.refreshAll(); + + setDataProvider(FacadeProvider.getAggregateReportFacade().getAggregateReports(getCriteria()).stream().map(aggregatedReportDto -> { + if (aggregatedReportDto.getAgeGroup() != null) { + aggregatedReportDto.setAgeGroup(AgeGroupUtils.createCaption(aggregatedReportDto.getAgeGroup())); + } + return aggregatedReportDto; + })); + getDataProvider().refreshAll(); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/ShareRequestGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/ShareRequestGrid.java index 089b0741928..9eb448e0131 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/ShareRequestGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/ShareRequestGrid.java @@ -19,11 +19,8 @@ import java.util.Date; import java.util.List; import java.util.function.Consumer; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; import com.vaadin.data.provider.GridSortOrder; -import com.vaadin.data.provider.ListDataProvider; import com.vaadin.icons.VaadinIcons; import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.Component; @@ -33,11 +30,7 @@ import com.vaadin.ui.renderers.HtmlRenderer; import com.vaadin.ui.themes.ValoTheme; -import com.vaadin.v7.ui.Label; -import com.vaadin.v7.ui.Table; import de.symeda.sormas.api.FacadeProvider; -import de.symeda.sormas.api.activityascase.ActivityAsCaseDto; -import de.symeda.sormas.api.caze.CaseFollowUpDto; import de.symeda.sormas.api.externalmessage.ExternalMessageIndexDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -48,7 +41,6 @@ import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.SortProperty; -import de.symeda.sormas.api.visit.VisitResultDto; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.utils.BooleanRenderer; @@ -56,9 +48,6 @@ import de.symeda.sormas.ui.utils.FilteredGrid; import de.symeda.sormas.ui.utils.ShowDetailsListener; import de.symeda.sormas.ui.utils.UuidRenderer; -import org.apache.commons.lang3.StringUtils; - -import static de.symeda.sormas.ui.utils.FollowUpUtils.getVisitResultDescription; public class ShareRequestGrid extends FilteredGrid { @@ -163,19 +152,17 @@ public void reload() { } public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks(query -> { - List sortProperties = query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList()); - - return loadShareRequests(query.getFilter().orElse(null), query.getOffset(), query.getLimit(), sortProperties).stream(); - }, - query -> (int) (viewType == ShareRequestViewType.INCOMING - ? FacadeProvider.getSormasToSormasShareRequestFacade().count(query.getFilter().orElse(null)) - : FacadeProvider.getShareRequestInfoFacade().count(query.getFilter().orElse(null)))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + + setLazyDataProvider( + this::loadShareRequests, + viewType == ShareRequestViewType.INCOMING + ? FacadeProvider.getSormasToSormasShareRequestFacade()::count + : FacadeProvider.getShareRequestInfoFacade()::count); + } + + public void setEagerDataProvider() { + + setEagerDataProvider(this::loadShareRequests); } private List loadShareRequests( @@ -187,11 +174,4 @@ private List loadShareRequests( ? FacadeProvider.getSormasToSormasShareRequestFacade().getIndexList(criteria, offset, size, sortProperties) : FacadeProvider.getShareRequestInfoFacade().getIndexList(criteria, offset, size, sortProperties); } - - public void setEagerDataProvider() { - List indexList = loadShareRequests(getCriteria(), null, null, null); - ListDataProvider dataProvider = DataProvider.fromStream(indexList.stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); - } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryGrid.java index 82a34fa5e93..81aab8ee370 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryGrid.java @@ -1,11 +1,7 @@ package de.symeda.sormas.ui.travelentry; import java.util.Date; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.renderers.DateRenderer; import de.symeda.sormas.api.FacadeProvider; @@ -13,7 +9,6 @@ import de.symeda.sormas.api.person.PersonDto; import de.symeda.sormas.api.travelentry.TravelEntryCriteria; import de.symeda.sormas.api.travelentry.TravelEntryIndexDto; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.ViewModelProviders; import de.symeda.sormas.ui.campaign.campaigns.CampaignsView; @@ -79,28 +74,13 @@ private void initColumns() { } public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getTravelEntryFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getTravelEntryFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); - } + setLazyDataProvider(FacadeProvider.getTravelEntryFacade()::getIndexList, FacadeProvider.getTravelEntryFacade()::count); + } public void setEagerDataProvider() { - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getTravelEntryFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); + + setEagerDataProvider(FacadeProvider.getTravelEntryFacade()::getIndexList); } public void reload() { From ada4166d1b797bea7a9c9d02e22f01a1627f1301 Mon Sep 17 00:00:00 2001 From: Stefan Kock Date: Tue, 13 Dec 2022 13:57:45 +0100 Subject: [PATCH 076/147] #10958 Use getDataSize/new DataProvider on Views for Events etc. - Changed: Events, EventParticipants, EventGroups, Actions for Events - Extracted GridHeightResizer --- .../sormas/ui/events/EventActionsGrid.java | 15 +----- .../de/symeda/sormas/ui/events/EventGrid.java | 32 +------------ .../sormas/ui/events/EventGroupsGrid.java | 22 ++------- .../ui/events/EventParticipantsGrid.java | 28 ++--------- .../ui/events/EventParticipantsView.java | 2 +- .../symeda/sormas/ui/events/EventsView.java | 7 ++- .../events/eventLink/EventSelectionGrid.java | 38 ++------------- .../groups/EventGroupSelectionGrid.java | 44 +++--------------- .../sormas/ui/utils/GridHeightResizer.java | 46 +++++++++++++++++++ 9 files changed, 72 insertions(+), 162 deletions(-) create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/utils/GridHeightResizer.java diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventActionsGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventActionsGrid.java index e9f25c030b0..a1c994ba1d1 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventActionsGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventActionsGrid.java @@ -159,19 +159,6 @@ public void reload() { public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getActionFacade() - .getEventActionList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getActionFacade().countEventActions(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(FacadeProvider.getActionFacade()::getEventActionList, FacadeProvider.getActionFacade()::countEventActions); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGrid.java index b4c33030e18..d46c98b5ab8 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGrid.java @@ -21,13 +21,9 @@ import java.util.Arrays; import java.util.Date; import java.util.List; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; import com.vaadin.data.provider.DataProviderListener; -import com.vaadin.data.provider.ListDataProvider; import com.vaadin.navigator.View; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.renderers.DateRenderer; import com.vaadin.ui.renderers.HtmlRenderer; @@ -46,7 +42,6 @@ import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; @@ -300,34 +295,11 @@ public void reload() { public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getEventFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getEventFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(FacadeProvider.getEventFacade()::getIndexList, FacadeProvider.getEventFacade()::count); } public void setEagerDataProvider() { - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getEventFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); - if (dataProviderListener != null) { - dataProvider.addDataProviderListener(dataProviderListener); - } - } - - public void setDataProviderListener(DataProviderListener dataProviderListener) { - this.dataProviderListener = dataProviderListener; + setEagerDataProvider(FacadeProvider.getEventFacade()::getIndexList); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupsGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupsGrid.java index e615d4c657e..0e5e6ff6b5e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupsGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventGroupsGrid.java @@ -93,26 +93,12 @@ public void reload() { } public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getEventGroupFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getEventGroupFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + + setLazyDataProvider(FacadeProvider.getEventGroupFacade()::getIndexList, FacadeProvider.getEventGroupFacade()::count); } public void setEagerDataProvider() { - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getEventGroupFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); + + setEagerDataProvider(FacadeProvider.getEventGroupFacade()::getIndexList); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsGrid.java index 9d9b10e437e..7e4225d7697 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsGrid.java @@ -16,11 +16,7 @@ package de.symeda.sormas.ui.events; import java.util.Date; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.renderers.DateRenderer; import de.symeda.sormas.api.FacadeProvider; @@ -35,7 +31,6 @@ import de.symeda.sormas.api.sample.SampleIndexDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; @@ -145,28 +140,13 @@ public EventParticipantsGrid(EventParticipantCriteria criteria) { } public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getEventParticipantFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getEventParticipantFacade().count(query.getFilter().orElse(null))); - - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + + setLazyDataProvider(FacadeProvider.getEventParticipantFacade()::getIndexList, FacadeProvider.getEventParticipantFacade()::count); } public void setEagerDataProvider() { - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getEventParticipantFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); + + setEagerDataProvider(FacadeProvider.getEventParticipantFacade()::getIndexList); } public void reload() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java index 486d7a9593a..eb6bcce7baa 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java @@ -448,7 +448,7 @@ private void updateStatusButtons() { if (activeStatusButton != null) { activeStatusButton - .setCaption(I18nProperties.getCaption(Captions.all) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getItemCount()))); + .setCaption(I18nProperties.getCaption(Captions.all) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getDataSize()))); } } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java index e738e4fcea0..5ad14ee1d8c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java @@ -148,16 +148,15 @@ public EventsView() { if (isDefaultViewType()) { grid = new EventGrid(eventCriteria, getClass()); - ((EventGrid) grid).setDataProviderListener(e -> updateStatusButtons()); - grid.getDataProvider().addDataProviderListener(e -> updateStatusButtons()); } else if (isActionViewType()) { grid = new EventActionsGrid(eventCriteria, getClass()); - grid.getDataProvider().addDataProviderListener(e -> updateStatusButtons()); getViewTitleLabel().setValue(I18nProperties.getCaption(Captions.View_actions)); } else { grid = new EventGroupsGrid(eventGroupCriteria, getClass()); getViewTitleLabel().setValue(I18nProperties.getCaption(Captions.View_groups)); } + grid.addDataSizeChangeListener(e -> updateStatusButtons()); + gridLayout = new VerticalLayout(); gridLayout.addComponent(createFilterBar()); gridLayout.addComponent(createStatusFilterBar()); @@ -717,7 +716,7 @@ private void updateStatusButtons() { CssStyles.removeStyles(activeStatusButton, CssStyles.BUTTON_FILTER_LIGHT); if (activeStatusButton != null) { activeStatusButton - .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getItemCount()))); + .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getDataSize()))); } } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventLink/EventSelectionGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventLink/EventSelectionGrid.java index 1d8ce55b9dd..49521dd7f58 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventLink/EventSelectionGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/eventLink/EventSelectionGrid.java @@ -21,12 +21,8 @@ package de.symeda.sormas.ui.events.eventLink; import java.util.Date; -import java.util.stream.Collectors; import com.vaadin.data.provider.ConfigurableFilterDataProvider; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.DataProviderListener; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.shared.ui.grid.HeightMode; import com.vaadin.ui.renderers.DateRenderer; @@ -36,18 +32,21 @@ import de.symeda.sormas.api.event.EventIndexDto; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.events.EventGrid; import de.symeda.sormas.ui.utils.FieldAccessColumnStyleGenerator; import de.symeda.sormas.ui.utils.FilteredGrid; +import de.symeda.sormas.ui.utils.GridHeightResizer; @SuppressWarnings("serial") public class EventSelectionGrid extends FilteredGrid { public EventSelectionGrid(EventCriteria criteria) { + super(EventIndexDto.class); - setLazyDataProvider(); + setLazyDataProvider(FacadeProvider.getEventFacade()::getIndexList, FacadeProvider.getEventFacade()::count); + addDataSizeChangeListener(new GridHeightResizer()); + setCriteria(criteria); buildGrid(); } @@ -77,33 +76,6 @@ private void buildGrid() { .setRenderer(new DateRenderer(DateHelper.getLocalDateTimeFormat(userLanguage))); } - public void setLazyDataProvider() { - - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getEventFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getEventFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(com.vaadin.ui.Grid.SelectionMode.NONE); - - EventSelectionGrid tempGrid = this; - dataProvider.addDataProviderListener((DataProviderListener) dataChangeEvent -> { - if (tempGrid.getItemCount() > 0) { - tempGrid.setHeightByRows(Math.min(tempGrid.getItemCount(), 5)); - } else { - tempGrid.setHeightByRows(1); - } - }); - } - @Override public void setCriteria(EventCriteria criteria) { getFilteredDataProvider().setFilter(criteria); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/groups/EventGroupSelectionGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/groups/EventGroupSelectionGrid.java index 79291b55e47..1e53566a169 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/groups/EventGroupSelectionGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/groups/EventGroupSelectionGrid.java @@ -20,28 +20,26 @@ package de.symeda.sormas.ui.events.groups; -import java.util.stream.Collectors; - import com.vaadin.data.provider.ConfigurableFilterDataProvider; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.DataProviderListener; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.shared.ui.grid.HeightMode; import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.event.EventGroupCriteria; import de.symeda.sormas.api.event.EventGroupIndexDto; import de.symeda.sormas.api.i18n.I18nProperties; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.utils.FilteredGrid; +import de.symeda.sormas.ui.utils.GridHeightResizer; @SuppressWarnings("serial") public class EventGroupSelectionGrid extends FilteredGrid { public EventGroupSelectionGrid(EventGroupCriteria criteria) { + super(EventGroupIndexDto.class); - setLazyDataProvider(); + setLazyDataProvider(FacadeProvider.getEventGroupFacade()::getIndexList, FacadeProvider.getEventGroupFacade()::count); + addDataSizeChangeListener(new GridHeightResizer()); + setCriteria(criteria); buildGrid(); } @@ -51,10 +49,7 @@ private void buildGrid() { setSelectionMode(SelectionMode.SINGLE); setHeightMode(HeightMode.ROW); - setColumns( - EventGroupIndexDto.UUID, - EventGroupIndexDto.NAME, - EventGroupIndexDto.EVENT_COUNT); + setColumns(EventGroupIndexDto.UUID, EventGroupIndexDto.NAME, EventGroupIndexDto.EVENT_COUNT); for (Column column : getColumns()) { column.setCaption(I18nProperties.getPrefixCaption(EventGroupIndexDto.I18N_PREFIX, column.getId(), column.getCaption())); @@ -64,33 +59,6 @@ private void buildGrid() { getColumn(EventGroupIndexDto.NAME).setMaximumWidth(300); } - public void setLazyDataProvider() { - - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getEventGroupFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getEventGroupFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); - - EventGroupSelectionGrid tempGrid = this; - dataProvider.addDataProviderListener((DataProviderListener) dataChangeEvent -> { - if (tempGrid.getItemCount() > 0) { - tempGrid.setHeightByRows(Math.min(tempGrid.getItemCount(), 5)); - } else { - tempGrid.setHeightByRows(1); - } - }); - } - @Override public void setCriteria(EventGroupCriteria criteria) { getFilteredDataProvider().setFilter(criteria); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/GridHeightResizer.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/GridHeightResizer.java new file mode 100644 index 00000000000..015b0cda66a --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/GridHeightResizer.java @@ -0,0 +1,46 @@ +/* + * 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.utils; + +import com.vaadin.ui.Grid; + +public class GridHeightResizer implements DataSizeChangeListener { + + private static final long serialVersionUID = 1951617224990265972L; + + public static final int DEFAULT_MAX_HEIGHT = 5; + + private final int maxHeight; + + public GridHeightResizer() { + this(DEFAULT_MAX_HEIGHT); + } + + public GridHeightResizer(int maxHeight) { + this.maxHeight = maxHeight; + } + + @Override + public void dataSizeChange(DataSizeChangeEvent event) { + + Grid grid = (Grid) event.getSource(); + if (event.getSize() > 0) { + grid.setHeightByRows(Math.min(event.getSize(), maxHeight)); + } else { + grid.setHeightByRows(1); + } + } +} From f7d7d07daf30525f0cc3102389e23070231d720b Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Tue, 13 Dec 2022 14:53:34 +0100 Subject: [PATCH 077/147] ignore test --- .../src/test/resources/features/sanity/web/About.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature index a13e8c61bdd..fde3a1e099c 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature @@ -63,7 +63,7 @@ Feature: About Directory end to end tests And I check if Data Dictionary contains entries name in English And I delete Data Dictionary downloaded file from About Directory - @env_main @tmsLink=SORDEV-10238 @LanguageRisk @ExcludedFromRelease + @env_main @tmsLink=SORDEV-10238 @LanguageRisk @ExcludedFromRelease @ignore Scenario: Check if data dictionary is in German when service language is set to German Given I log in as a National Language User And I click on the About button from navbar From 812a1fe74ba856ed3465ae0a983135cfc0612e2a Mon Sep 17 00:00:00 2001 From: popadriangeo Date: Tue, 13 Dec 2022 18:24:40 +0200 Subject: [PATCH 078/147] #10422 added Scenario: Validate newly created user role is present in filtering options --- .../features/sanity/web/User.feature | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature index f345d61aa20..4ea979a018c 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature @@ -333,4 +333,21 @@ Feature: Create user And I double click on "TestNatUser" from user role list And I click on delete user role button And I confirm user role deletion - And I click on User Management tab from User Roles Page \ No newline at end of file + And I click on User Management tab from User Roles Page + + @#10422 @env_main + Scenario: Validate newly created user role is present in filtering options + Given I log in as a Admin User + And I click on the Users from navbar + And I check if there is any user with the "TestNatUser" role and change his role + And I click on User roles tab from User Management Page + And I check if the "TestNatUser" user role exist and delete it + And I click on New user role button on User Roles Page + And I choose "National User" as the user role template + And I fill caption input as "TestNatUser" on Create New User Role form + And I click SAVE button on User Role Page + And I back to the User role list + And I click on User Management tab from User Roles Page + Then I verify "TestNatUser" User Role is present in the User Role Combo box located in User management page + And I click on User roles tab from User Management Page + And I check if the "TestNatUser" user role exist and delete it From 65170bf66407879bce579822d21e6868d7b82cd2 Mon Sep 17 00:00:00 2001 From: popadriangeo Date: Tue, 13 Dec 2022 18:42:18 +0200 Subject: [PATCH 079/147] #10422 added proper method towards test --- .../src/test/resources/features/sanity/web/User.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature index 4ea979a018c..098b98de7de 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature @@ -348,6 +348,6 @@ Feature: Create user And I click SAVE button on User Role Page And I back to the User role list And I click on User Management tab from User Roles Page - Then I verify "TestNatUser" User Role is present in the User Role Combo box located in User management page + Then I check that "TestNatUser" is available in the user role filter And I click on User roles tab from User Management Page And I check if the "TestNatUser" user role exist and delete it From 06f64878a4a3ffce7c49e7cfe869bffc3909bfac Mon Sep 17 00:00:00 2001 From: Bartha Barna Date: Wed, 14 Dec 2022 09:44:52 +0200 Subject: [PATCH 080/147] #10480 - small corrections in setup documentation --- README.md | 2 +- docs/DEVELOPMENT_ENVIRONMENT.md | 9 ++++++--- docs/SERVER_SETUP.md | 2 +- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b00e8360378..f4579ea1ec4 100644 --- a/README.md +++ b/README.md @@ -64,8 +64,8 @@ If you want to learn more about the development and contribution process, settin If you want to set up a SORMAS instance for production, testing or development purposes, please refer to the following guides: * [Installing a SORMAS Server](docs/SERVER_SETUP.md) -* [Installing a SORMAS Server for Development](docs/SERVER_DOCKER_SETUP.md) * [Updating a SORMAS Server](docs/SERVER_UPDATE.md) +* [Setup Development environment](docs/DEVELOPMENT_ENVIRONMENT.md) * [Creating a Demo Android App](docs/DEMO_APP.md) ## Project Structure diff --git a/docs/DEVELOPMENT_ENVIRONMENT.md b/docs/DEVELOPMENT_ENVIRONMENT.md index 8c5eea91af0..16ecea36d28 100644 --- a/docs/DEVELOPMENT_ENVIRONMENT.md +++ b/docs/DEVELOPMENT_ENVIRONMENT.md @@ -23,7 +23,7 @@ Download and install Maven for your operating system, see [binaries](https://dlc Download and install Ant, it can be done from [Ant site](https://ant.apache.org/bindownload.cgi) or with packages from your Linux distribution. ## Step 4: Install a Local SORMAS Server -Please follow the [Server Installation Instructions](https://github.com/hzi-braunschweig/SORMAS-Project/blob/development/docs/SERVER_SETUP.md#sormas-installation) to set up a local SORMAS instance that you will use to test your code. Alternatively, you can also use [Maven Cargo](../sormas-cargoserver/README.md), or a [Docker installation](SERVER_DOCKER_SETUP.md) (not recommended at this time). +Please follow the [Server Installation Instructions](docs/SERVER_SETUP.md#sormas-installation) to set up a local SORMAS instance that you will use to test your code. Alternatively, you can also use [Maven Cargo](../sormas-cargoserver/README.md), or a [Docker installation](SERVER_DOCKER_SETUP.md) (not recommended at this time). ## Step 5: Install and Configure Your IDE @@ -134,8 +134,11 @@ Optional, but strongly recommended: 7. For eclipse formatted plugin, there is an issue for Idea: - `cannot save settings Path to custom eclipse folder is not valid` - it works only when settings were saved from down to up. And not vice versa. -If something is still not working, try to clean up (delete all from domains/sormas/autodeploy, domains/sormas/applications, domains/sormas/generated, and domains/sormas/osgi-cache) try to build again by executing `mvn clean install -DskipTests` on the `sormas-base` module - +If something is still not working: + -> Stop the payara domain, run Ant deploy-serverlibs to update libs + -> clean up (delete all from domains/sormas/autodeploy, domains/sormas/applications, domains/sormas/generated, and domains/sormas/osgi-cache) try to build again by executing `mvn clean install -DskipTests` on the `sormas-base` module + -> start the domain and deploy again + ## Avoid redeployment problems **Problem**: Due to currently a not mitigated problem, it is only possible to deploy the `sormas-ear.ear` (contains `sormas-backend`) once without problems. If you undeploy it and deploy `sormas-ear.ear` again, the other artifacts `sormas-ui`and `sormas-rest` cannot successfully call the backend. diff --git a/docs/SERVER_SETUP.md b/docs/SERVER_SETUP.md index f82b4fbc59e..93699ceaa44 100644 --- a/docs/SERVER_SETUP.md +++ b/docs/SERVER_SETUP.md @@ -65,7 +65,7 @@ You can check your Java version from the shell/command line using: ``java -versi * Install the "temporal tables" extension for Postgres () * **Windows**: Download the latest version for your Postgres version: , then copy the DLL from the project into the PostgreSQL's lib directory and the .sql and .control files into the directory share\extension. * **Linux** (see -* Add the PostgreSQL path (/etc/PostgreSQL/10/bin) to Environment Variables + * Add the PostgreSQL path (/etc/PostgreSQL/10/bin) to Environment Variables ```bash sudo apt-get install libpq-dev sudo apt-get install postgresql-server-dev-all From 5e282ab063b0a78d7cb0034a53a44ef2f2478a18 Mon Sep 17 00:00:00 2001 From: Bartha Barna Date: Wed, 14 Dec 2022 09:48:27 +0200 Subject: [PATCH 081/147] #10480 - fix link --- docs/DEVELOPMENT_ENVIRONMENT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DEVELOPMENT_ENVIRONMENT.md b/docs/DEVELOPMENT_ENVIRONMENT.md index 16ecea36d28..ad2e58e273e 100644 --- a/docs/DEVELOPMENT_ENVIRONMENT.md +++ b/docs/DEVELOPMENT_ENVIRONMENT.md @@ -23,7 +23,7 @@ Download and install Maven for your operating system, see [binaries](https://dlc Download and install Ant, it can be done from [Ant site](https://ant.apache.org/bindownload.cgi) or with packages from your Linux distribution. ## Step 4: Install a Local SORMAS Server -Please follow the [Server Installation Instructions](docs/SERVER_SETUP.md#sormas-installation) to set up a local SORMAS instance that you will use to test your code. Alternatively, you can also use [Maven Cargo](../sormas-cargoserver/README.md), or a [Docker installation](SERVER_DOCKER_SETUP.md) (not recommended at this time). +Please follow the [Server Installation Instructions](../docs/SERVER_SETUP.md#sormas-installation) to set up a local SORMAS instance that you will use to test your code. Alternatively, you can also use [Maven Cargo](../sormas-cargoserver/README.md), or a [Docker installation](SERVER_DOCKER_SETUP.md) (not recommended at this time). ## Step 5: Install and Configure Your IDE From 2abb74a1714e9005b0341064dd16c1de301b74df Mon Sep 17 00:00:00 2001 From: Bal Andrei Date: Wed, 14 Dec 2022 10:29:26 +0200 Subject: [PATCH 082/147] #3429 Improve readability of long captions for buttons (#11142) * #3429 Improve readability of long captions for buttons * #3429 Use caption overflow as default for buttons - also set the description * Revert obsolete changes for Event --- .../java/de/symeda/sormas/ui/contact/ContactsView.java | 10 ++++------ .../java/de/symeda/sormas/ui/events/EventsView.java | 2 -- .../java/de/symeda/sormas/ui/utils/ButtonHelper.java | 2 ++ .../main/java/de/symeda/sormas/ui/utils/CssStyles.java | 1 + .../webapp/VAADIN/themes/sormas/components/button.scss | 5 +++++ 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java index 683984b1caa..a4a4aa78470 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/contact/ContactsView.java @@ -286,21 +286,19 @@ public ContactsView() { } if (isBulkEditAllowed()) { - Button btnEnterBulkEditMode = ButtonHelper.createIconButton(Captions.actionEnterBulkEditMode, VaadinIcons.CHECK_SQUARE_O, null); + Button btnEnterBulkEditMode = ButtonHelper.createIconButton( + Captions.actionEnterBulkEditMode, VaadinIcons.CHECK_SQUARE_O, null, ValoTheme.BUTTON_PRIMARY); { btnEnterBulkEditMode.setVisible(!viewConfiguration.isInEagerMode()); - btnEnterBulkEditMode.addStyleName(ValoTheme.BUTTON_PRIMARY); - btnEnterBulkEditMode.setWidth(100, Unit.PERCENTAGE); moreButton.addMenuEntry(btnEnterBulkEditMode); } - Button btnLeaveBulkEditMode = - ButtonHelper.createIconButton(Captions.actionLeaveBulkEditMode, VaadinIcons.CLOSE, null, ValoTheme.BUTTON_PRIMARY); + Button btnLeaveBulkEditMode = ButtonHelper.createIconButton( + Captions.actionLeaveBulkEditMode, VaadinIcons.CLOSE, null, ValoTheme.BUTTON_PRIMARY); { btnLeaveBulkEditMode.setVisible(viewConfiguration.isInEagerMode()); btnLeaveBulkEditMode.setWidth(100, Unit.PERCENTAGE); - moreButton.addMenuEntry(btnLeaveBulkEditMode); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java index e738e4fcea0..099716778f3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java @@ -288,7 +288,6 @@ public EventsView() { { btnEnterBulkEditMode.setVisible(!viewConfiguration.isInEagerMode()); btnEnterBulkEditMode.addStyleName(ValoTheme.BUTTON_PRIMARY); - btnEnterBulkEditMode.setWidth(100, Unit.PERCENTAGE); moreButton.addMenuEntry(btnEnterBulkEditMode); } @@ -298,7 +297,6 @@ public EventsView() { { btnLeaveBulkEditMode.setVisible(viewConfiguration.isInEagerMode()); btnLeaveBulkEditMode.setWidth(100, Unit.PERCENTAGE); - moreButton.addMenuEntry(btnLeaveBulkEditMode); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ButtonHelper.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ButtonHelper.java index 2bb32eabd97..a1018bcd3a2 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ButtonHelper.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/ButtonHelper.java @@ -263,6 +263,8 @@ public static T createButton( if (!enableDoubleClick) { preventDoubleClick(button); } + CssStyles.style(button, CssStyles.BUTTON_CAPTION_OVERFLOW); + button.setDescription(I18nProperties.getCaption(caption)); return button; } 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 00e2569c19a..0cab73ffb7a 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 @@ -160,6 +160,7 @@ private CssStyles() { public static final String BUTTON_FILTER_ENABLED = "filter-enabled"; public static final String BUTTON_FILTER_DISABLED = "filter-disabled"; public static final String BUTTON_FONT_SIZE_LARGE = "font-size-large"; + public static final String BUTTON_CAPTION_OVERFLOW = "caption-overflow-label"; public static final String GEOCODE_BUTTON_HIGHLIGHT = "geocode-button-highlight"; // Link styles diff --git a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/components/button.scss b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/components/button.scss index aa5235e1d7a..79bde226a5a 100644 --- a/sormas-ui/src/main/webapp/VAADIN/themes/sormas/components/button.scss +++ b/sormas-ui/src/main/webapp/VAADIN/themes/sormas/components/button.scss @@ -9,6 +9,11 @@ &.v-button-link { text-transform: none; } + + &.v-button-caption-overflow-label { + text-overflow: ellipsis; + overflow: hidden; + } &.v-button-font-size-large { font-size: 1.5em; From 76382c6c8702a394fe2a716e8498d57fe2ee928c Mon Sep 17 00:00:00 2001 From: Stefan Kock Date: Wed, 14 Dec 2022 09:58:28 +0100 Subject: [PATCH 083/147] #10958 Fix: Remove unused imports --- .../java/de/symeda/sormas/ui/events/EventActionsGrid.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventActionsGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventActionsGrid.java index a1c994ba1d1..85aa0c9cbb0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventActionsGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventActionsGrid.java @@ -18,11 +18,8 @@ package de.symeda.sormas.ui.events; import java.util.Date; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; import com.vaadin.navigator.View; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.renderers.DateRenderer; import de.symeda.sormas.api.DiseaseHelper; @@ -34,7 +31,6 @@ import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.ViewModelProviders; import de.symeda.sormas.ui.utils.DateFormatHelper; From 897acd6dcf410e6671fcaefb4bf5da53dc17e183 Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Wed, 14 Dec 2022 12:56:26 +0200 Subject: [PATCH 084/147] #10958 - Avoid directories calling count method several times - Tasks and ExternalMessages --- .../externalmessage/ExternalMessageGrid.java | 36 ++----------------- .../externalmessage/ExternalMessagesView.java | 4 +-- .../de/symeda/sormas/ui/task/TaskGrid.java | 24 ++----------- .../sormas/ui/task/TaskGridComponent.java | 5 ++- 4 files changed, 8 insertions(+), 61 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageGrid.java index 5bd656de3cd..715cbda2344 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageGrid.java @@ -19,15 +19,11 @@ import java.util.Collections; import java.util.Date; import java.util.function.Consumer; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; import com.vaadin.data.provider.DataProviderListener; -import com.vaadin.data.provider.ListDataProvider; import com.vaadin.icons.VaadinIcons; import com.vaadin.server.FileDownloader; import com.vaadin.server.StreamResource; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.shared.ui.ContentMode; import com.vaadin.ui.Button; import com.vaadin.ui.Component; @@ -49,7 +45,6 @@ import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; @@ -142,38 +137,11 @@ protected void addShowColumn(Consumer handler) { } public void setEagerDataProvider() { - - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getExternalMessageFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - - setSelectionMode(SelectionMode.MULTI); - - if (dataProviderListener != null) { - dataProvider.addDataProviderListener(dataProviderListener); - } + setEagerDataProvider(FacadeProvider.getExternalMessageFacade()::getIndexList); } public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getExternalMessageFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getExternalMessageFacade().count(query.getFilter().orElse(null))); - - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); - - if (dataProviderListener != null) { - dataProvider.addDataProviderListener(dataProviderListener); - } + setLazyDataProvider(FacadeProvider.getExternalMessageFacade()::getIndexList, FacadeProvider.getExternalMessageFacade()::count); } public void reload() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessagesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessagesView.java index 4fe93c282e3..2e33c0adea0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessagesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessagesView.java @@ -104,7 +104,7 @@ public ExternalMessagesView() { grid = new ExternalMessageGrid(criteria); grid.setDataProviderListener(e -> updateStatusButtons()); - grid.getDataProvider().addDataProviderListener(e -> updateStatusButtons()); + grid.addDataSizeChangeListener(e -> updateStatusButtons()); gridLayout.addComponent(grid); @@ -227,7 +227,7 @@ private void updateStatusButtons() { if (activeStatusButton != null) { CssStyles.removeStyles(activeStatusButton, CssStyles.BUTTON_FILTER_LIGHT); activeStatusButton - .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getItemCount()))); + .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getDataSize()))); activeStatus = (ExternalMessageStatus) activeStatusButton.getData(); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGrid.java index 1619d64cb31..71f04569cfc 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGrid.java @@ -206,31 +206,11 @@ private void navigateToData(TaskIndexDto task) { } public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getTaskFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getTaskFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(FacadeProvider.getTaskFacade()::getIndexList, FacadeProvider.getTaskFacade()::count); } public void setEagerDataProvider() { - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getTaskFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); - - if (dataProviderListener != null) { - dataProvider.addDataProviderListener(dataProviderListener); - } + setEagerDataProvider(FacadeProvider.getTaskFacade()::getIndexList); } public void setDataProviderListener(DataProviderListener dataProviderListener) { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGridComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGridComponent.java index 36234d9972b..c5025072cfe 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGridComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGridComponent.java @@ -90,8 +90,7 @@ public TaskGridComponent(Label viewTitleLabel, TasksView tasksView) { gridLayout.addComponent(createFilterBar()); gridLayout.addComponent(createAssigneeFilterBar()); gridLayout.addComponent(grid); - grid.getDataProvider().addDataProviderListener(e -> updateAssigneeFilterButtons()); - grid.setDataProviderListener(e -> updateAssigneeFilterButtons()); + grid.addDataSizeChangeListener(e -> updateAssigneeFilterButtons()); gridLayout.setMargin(true); styleGridLayout(gridLayout); @@ -278,7 +277,7 @@ private void updateAssigneeFilterButtons() { if (activeStatusButton != null) { CssStyles.removeStyles(activeStatusButton, CssStyles.BUTTON_FILTER_LIGHT); activeStatusButton - .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getItemCount()))); + .setCaption(statusButtons.get(activeStatusButton) + LayoutUtil.spanCss(CssStyles.BADGE, String.valueOf(grid.getDataSize()))); } } From 169aef81da507dcac0819b3938b537736d57aeae Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Wed, 14 Dec 2022 12:46:44 +0100 Subject: [PATCH 085/147] fixes --- .../steps/web/application/events/EditEventSteps.java | 6 ++++++ .../resources/features/sanity/web/Immunization.feature | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index 99701a137e4..7dbaf93d680 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -1007,6 +1007,12 @@ public EditEventSteps( webDriverHelpers.clickOnWebElementBySelector(EDIT_EVENT_GROUP_BUTTON); }); + When( + "I click on first Edit event button for in Events section", + () -> { + webDriverHelpers.clickOnWebElementBySelector(EDIT_FIRST_TASK); + }); + When( "I click on the Navigate to event directory filtered on this event group", () -> { diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature index fc0df84a724..8f762c27495 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature @@ -284,7 +284,10 @@ Feature: Immunization end to end tests And I set event Date filed on Create New Event form to current date for DE And I click SAVE button on Create New Event form And I click SAVE in Add Event Participant form on Edit Case Page for DE - And I click on Edit event button for the first event in Events section +# And I click on Edit event button for the first event in Events section + And I click on first Edit event button for in Events section + And I click SAVE button on Create New Event form + And I click on first Edit event button for in Events section And I click on the Event participant tab And I click on the first row from event participant And I check if Vaccination Status is set to "Geimpft" on Edit Case page @@ -331,7 +334,8 @@ Feature: Immunization end to end tests And I click on the Edit Vaccination icon on vaccination card on Edit Case page And I set the vaccination date to 7 days before the current day for DE And I click SAVE button in new Vaccination form - And I click on Edit event button for the first event in Events section + And I click on first Edit event button for in Events section +# And I click on Edit event button for the first event in Events section And I click on the Event participant tab And I click Create Case for Event Participant And I pick a new case in pick or create a case popup From b77afaf7c1c4bdc8d18102c4d42f1aa3b439c6b4 Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Wed, 14 Dec 2022 13:47:22 +0200 Subject: [PATCH 086/147] #10958 - Avoid directories calling count method several times - Tasks and ExternalMessages --- .../symeda/sormas/ui/externalmessage/ExternalMessageGrid.java | 4 ---- .../sormas/ui/externalmessage/ExternalMessagesView.java | 1 - 2 files changed, 5 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageGrid.java index 715cbda2344..83c10e1272e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessageGrid.java @@ -218,8 +218,4 @@ private Button buildDownloadButton(ExternalMessageIndexDto labMessage) { return downloadButton; } - - public void setDataProviderListener(DataProviderListener dataProviderListener) { - this.dataProviderListener = dataProviderListener; - } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessagesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessagesView.java index 2e33c0adea0..931b73ec56e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessagesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/externalmessage/ExternalMessagesView.java @@ -103,7 +103,6 @@ public ExternalMessagesView() { gridLayout.addComponent(createStatusFilterBar()); grid = new ExternalMessageGrid(criteria); - grid.setDataProviderListener(e -> updateStatusButtons()); grid.addDataSizeChangeListener(e -> updateStatusButtons()); gridLayout.addComponent(grid); From b542ba11bfeee7b68dae2d512c464a62ddfd793c Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Wed, 14 Dec 2022 16:42:41 +0100 Subject: [PATCH 087/147] fixes --- .../pages/application/cases/EditCasePage.java | 3 ++- .../cases/EpidemiologicalDataCasePage.java | 2 +- .../application/contacts/EditContactPage.java | 4 +++- .../api/commonSteps/ResponseChecksSteps.java | 6 ++++-- .../contacts/EditContactSteps.java | 4 ++++ .../application/events/EditEventSteps.java | 3 ++- .../users/UserManagementSteps.java | 20 +++++++++++-------- .../features/sanity/web/Immunization.feature | 8 ++------ 8 files changed, 30 insertions(+), 20 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java index ddafefb66e2..8ee28000f33 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java @@ -44,6 +44,7 @@ public class EditCasePage { public static final By CASE_PERSON_TAB = By.cssSelector("div#tab-cases-person"); public static final By NEW_TASK_BUTTON = By.cssSelector("[id='New task']"); public static final By EDIT_TASK_BUTTON = By.cssSelector("div[id*='edit0']"); + public static final By EDIT_FIRST_TASK_BUTTON = By.cssSelector("[location='events'] #edit0"); public static final By NEW_SAMPLE_BUTTON = By.cssSelector("[id='New sample']"); public static final By NEW_SAMPLE_BUTTON_DE = By.cssSelector("[id='Neue Probe']"); public static final By EDIT_SAMPLE_BUTTON = @@ -342,7 +343,7 @@ public static By getByImmunizationUuid(String immunizationUuid) { "//div[@location='vaccinations']//div[@class='v-slot v-slot-bold v-slot-uppercase v-align-right v-align-middle']/div"); public static final By EDIT_VACCINATION_BUTTON = By.xpath( - "//div[@location='vaccinations']//div[@class='v-button v-widget link v-button-link compact v-button-compact']"); + "//div[@location='vaccinations']//div[@class='v-button v-widget link v-button-link compact v-button-compact caption-overflow-label v-button-caption-overflow-label']"); public static final By VACCINATION_CARD_INFO_ICON = By.xpath( "//div[@location = 'vaccinations']//span[contains(@class, 'v-icon v-icon-info_circle')]"); diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java index 4eb65620f11..fd33b4c0420 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java @@ -143,5 +143,5 @@ public static By getExposureTableData(Integer tdNr) { } public static final By EDIT_SOURCE_CONTACTS_BUTTON = - By.cssSelector("[location='sourceContacts'] #edit-task-0"); + By.cssSelector("[location='sourceContacts'] #edit0"); } diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/contacts/EditContactPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/contacts/EditContactPage.java index 92227a5fe86..463b002dd90 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/contacts/EditContactPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/contacts/EditContactPage.java @@ -115,6 +115,8 @@ public class EditContactPage { public static final By CHANGE_CASE_BUTTON = By.id("contactChangeCase"); public static final By CASE_ID_LABEL = By.id("caseIdLabel"); public static final By CONTACT_CLASSIFICATION_RADIO_BUTTON = By.cssSelector(".v-radiobutton"); + public static final By CONFIRMED_CONTACT_DE_BUTTON = + By.xpath("//label[contains(text(),'Best\u00E4tigter Kontakt')]"); public static final By CASE_PERSON_LABEL = By.xpath( "//span[contains(text(), 'Case person')]/ancestor::div[@class='v-caption']/following-sibling::div"); @@ -189,7 +191,7 @@ public static By getContactIDPathByIndex(int index) { public static final By NOTIFICATION_MESSAGE_POPUP = By.cssSelector(".v-Notification-description"); public static final By EDIT_VACCINATION_BUTTON = By.xpath( - "//div[@location='vaccinations']//div[@class='v-button v-widget link v-button-link compact v-button-compact']"); + "//div[@location='vaccinations']//div[@class='v-button v-widget link v-button-link compact v-button-compact caption-overflow-label v-button-caption-overflow-label']"); public static final By OPEN_CASE_OF_THIS_CONTACT_PERSON_LINK = By.cssSelector("[location='toCaseBtnLoc'] div"); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/commonSteps/ResponseChecksSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/commonSteps/ResponseChecksSteps.java index 91ebe8bd36a..884b4cb5131 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/commonSteps/ResponseChecksSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/commonSteps/ResponseChecksSteps.java @@ -36,7 +36,8 @@ public ResponseChecksSteps(ApiState apiState, RestAssuredClient restAssuredClien Assert.fail("Response body call is empty!"); } if (responseBody.contains("TRANSACTIONROLLEDBACKEXCEPTION")) { - Assert.fail("API call failed due to wrong data used in sent json! [TRANSACTIONROLLEDBACKEXCEPTION]"); + Assert.fail( + "API call failed due to wrong data used in sent json! [TRANSACTIONROLLEDBACKEXCEPTION]"); } String regexUpdatedResponseBody = responseBody.replaceAll("[^a-zA-Z0-9]", ""); Assert.assertEquals( @@ -51,7 +52,8 @@ public ResponseChecksSteps(ApiState apiState, RestAssuredClient restAssuredClien Assert.fail("Response body call is empty!"); } if (responseBody.contains("TRANSACTIONROLLEDBACKEXCEPTION")) { - Assert.fail("API call failed due to wrong data used in sent json! [TRANSACTIONROLLEDBACKEXCEPTION]"); + Assert.fail( + "API call failed due to wrong data used in sent json! [TRANSACTIONROLLEDBACKEXCEPTION]"); } String regexUpdatedResponseBody = responseBody.replaceAll("[^a-zA-Z0-9]", ""); Assert.assertEquals( diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/contacts/EditContactSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/contacts/EditContactSteps.java index 95ad47ed202..3dc53ced2cc 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/contacts/EditContactSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/contacts/EditContactSteps.java @@ -783,6 +783,10 @@ public EditContactSteps( webDriverHelpers.clickWebElementByText( CONTACT_CLASSIFICATION_RADIO_BUTTON, "BEST\u00C4TIGTER KONTAKT")); + When( + "I select CONFIRMED CONTACT radio button on Contact Data tab for DE version", + () -> webDriverHelpers.clickOnWebElementBySelector(CONFIRMED_CONTACT_DE_BUTTON)); + When( "^I click on CONFIRMED CONTACT radio button Contact Data tab$", () -> diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index 7dbaf93d680..03392c9643d 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -26,6 +26,7 @@ import static org.sormas.e2etests.pages.application.cases.EditCasePage.BUTTONS_IN_VACCINATIONS_LOCATION; import static org.sormas.e2etests.pages.application.cases.EditCasePage.DELETE_BUTTON; import static org.sormas.e2etests.pages.application.cases.EditCasePage.DELETE_POPUP_YES_BUTTON; +import static org.sormas.e2etests.pages.application.cases.EditCasePage.EDIT_FIRST_TASK_BUTTON; import static org.sormas.e2etests.pages.application.cases.EditCasePage.GENERATED_DOCUMENT_NAME_DE; import static org.sormas.e2etests.pages.application.cases.EditCasePage.NEW_SAMPLE_BUTTON; import static org.sormas.e2etests.pages.application.cases.EditCasePage.QUARANTINE_ORDER_COMBOBOX; @@ -1010,7 +1011,7 @@ public EditEventSteps( When( "I click on first Edit event button for in Events section", () -> { - webDriverHelpers.clickOnWebElementBySelector(EDIT_FIRST_TASK); + webDriverHelpers.clickOnWebElementBySelector(EDIT_FIRST_TASK_BUTTON); }); When( diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java index 89e21202214..2f6389317c0 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java @@ -135,14 +135,16 @@ public UserManagementSteps( Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(ACTIVE_INACTIVE_COMBOBOX, "Active"); -// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); -// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); + // + // webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); + // webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfActiveUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(ACTIVE_INACTIVE_COMBOBOX, "Inactive"); -// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); -// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); + // + // webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); + // webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfInactiveUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); @@ -163,8 +165,9 @@ public UserManagementSteps( Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(USER_ROLES_COMBOBOX, "National User"); -// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); -// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); + // + // webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); + // webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfSpecificUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); @@ -186,8 +189,9 @@ public UserManagementSteps( Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(REGION_COMBOBOX_USER_MANAGEMENT, "Bayern"); -// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); -// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); + // + // webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); + // webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfSpecificUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature index 8f762c27495..8da03085413 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature @@ -284,9 +284,6 @@ Feature: Immunization end to end tests And I set event Date filed on Create New Event form to current date for DE And I click SAVE button on Create New Event form And I click SAVE in Add Event Participant form on Edit Case Page for DE -# And I click on Edit event button for the first event in Events section - And I click on first Edit event button for in Events section - And I click SAVE button on Create New Event form And I click on first Edit event button for in Events section And I click on the Event participant tab And I click on the first row from event participant @@ -335,7 +332,6 @@ Feature: Immunization end to end tests And I set the vaccination date to 7 days before the current day for DE And I click SAVE button in new Vaccination form And I click on first Edit event button for in Events section -# And I click on Edit event button for the first event in Events section And I click on the Event participant tab And I click Create Case for Event Participant And I pick a new case in pick or create a case popup @@ -349,7 +345,7 @@ Feature: Immunization end to end tests And I fill a mandatory fields for a new contact form for DE And I change a Report Date to the current date for DE And I click on SAVE button in create contact form - And I click on CONFIRMED CONTACT radio button Contact Data tab for DE version + And I select CONFIRMED CONTACT radio button on Contact Data tab for DE version And I click SAVE button on Edit Contact Page And I click NEW VACCINATION button for DE And I fill new vaccination data in new Vaccination form with vaccination date 7 days before the current day for DE @@ -363,8 +359,8 @@ Feature: Immunization end to end tests And I click on the NEW CASE button And I create a new case with specific mandatory fields with saved person details from contact for DE And I click on SAVE new contact button and choose same person in duplicate detection - And I check that vaccination entry is greyed out in the vaccination card And I check if Vaccination Status is set to "" on Edit Case page + And I check that vaccination entry is greyed out in the vaccination card @tmsLink=SORQA-668 @env_de @oldfake Scenario: Check automatic deletion of IMMUNIZATION created 3651 days ago From 1a7543cabb3e482cd3311da20dfa4b663a8cbf16 Mon Sep 17 00:00:00 2001 From: Carina Paul <47103965+carina29@users.noreply.github.com> Date: Thu, 15 Dec 2022 13:00:22 +0200 Subject: [PATCH 088/147] #10185 add missing database tables to the database export view (#11149) * #10185 - Add missing tables to database export view --- .../api/importexport/DatabaseTable.java | 8 +- sormas-api/src/main/resources/enum.properties | 6 ++ .../importexport/DatabaseExportService.java | 6 ++ .../DatabaseExportServiceTest.java | 28 ++++-- .../importexport/DatabaseTableTest.java | 87 +++++++++++++------ 5 files changed, 103 insertions(+), 32 deletions(-) diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTable.java b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTable.java index 0e687454b82..a53ea70bf85 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTable.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/importexport/DatabaseTable.java @@ -50,12 +50,14 @@ public enum DatabaseTable { CONTACTS(DatabaseTableType.SORMAS, "contacts", dependingOnFeature(FeatureType.CONTACT_TRACING)), VISITS(DatabaseTableType.SORMAS, "visits", dependingOnFeature(FeatureType.CONTACT_TRACING, FeatureType.CASE_FOLLOWUP)), + CONTACTS_VISITS(DatabaseTableType.SORMAS, VISITS, "contacts_visits"), SYMPTOMS(DatabaseTableType.SORMAS, "symptoms", dependingOnFeature(FeatureType.CASE_SURVEILANCE, FeatureType.CONTACT_TRACING, FeatureType.CLINICAL_MANAGEMENT)), EVENTS(DatabaseTableType.SORMAS, "events", dependingOnFeature(FeatureType.EVENT_SURVEILLANCE)), + EVENTS_EVENTGROUPS(DatabaseTableType.SORMAS, EVENTS, "events_eventgroups"), EVENTGROUPS(DatabaseTableType.SORMAS, EVENTS, "eventgroups", dependingOnFeature(FeatureType.EVENT_GROUPS)), EVENTPARTICIPANTS(DatabaseTableType.SORMAS, EVENTS, "event_persons_involved"), ACTIONS(DatabaseTableType.SORMAS, EVENTS, "actions"), @@ -70,11 +72,13 @@ public enum DatabaseTable { ADDITIONAL_TESTS(DatabaseTableType.SORMAS, SAMPLES, "additional_tests", dependingOnFeature(FeatureType.ADDITIONAL_TESTS)), TASKS(DatabaseTableType.SORMAS, "tasks", dependingOnFeature(FeatureType.TASK_MANAGEMENT)), + TASK_OBSERVER(DatabaseTableType.SORMAS, TASKS, "task_observer"), PERSONS(DatabaseTableType.SORMAS, "persons", dependingOnFeature(FeatureType.CASE_SURVEILANCE, FeatureType.CONTACT_TRACING, FeatureType.EVENT_SURVEILLANCE)), PERSON_CONTACT_DETAILS(DatabaseTableType.SORMAS, PERSONS, "person_contact_details"), + PERSON_LOCATIONS(DatabaseTableType.SORMAS, PERSONS, "person_locations"), LOCATIONS(DatabaseTableType.SORMAS, "locations", null), @@ -91,8 +95,9 @@ public enum DatabaseTable { CUSTOMIZABLE_ENUM_VALUES(DatabaseTableType.CONFIGURATION, "customizable_enum_values", null), CAMPAIGNS(DatabaseTableType.SORMAS, "campaigns", dependingOnFeature(FeatureType.CAMPAIGNS)), + CAMPAIGN_CAMPAIGNFORMMETA(DatabaseTableType.SORMAS, CAMPAIGNS, "campaign_campaignformmeta"), CAMPAIGN_FORM_META(DatabaseTableType.SORMAS, CAMPAIGNS, "campaign_from_meta"), - CAMPAIGN_FORM_DATA(DatabaseTableType.SORMAS, CAMPAIGNS, "campaign_from_data"), + CAMPAIGN_FORM_DATA(DatabaseTableType.SORMAS, CAMPAIGNS, "campaign_form_data"), CAMPAIGN_DIAGRAM_DEFINITIONS(DatabaseTableType.SORMAS, CAMPAIGNS, "campaign_diagram_definitions"), EXTERNAL_MESSAGES(DatabaseTableType.EXTERNAL, "external_messages", dependingOnFeature(FeatureType.EXTERNAL_MESSAGES)), @@ -103,6 +108,7 @@ public enum DatabaseTable { SORMAS_TO_SORMAS_SHARE_INFO(DatabaseTableType.EXTERNAL, null, "sormas_to_sormas_share_info", dependingOnS2S()), SORMAS_TO_SORMAS_SHARE_REQUESTS(DatabaseTableType.EXTERNAL, null, "sormas_to_sormas_share_requests", dependingOnS2S()), SHARE_REQUEST_INFO(DatabaseTableType.EXTERNAL, null, "share_request_info", dependingOnS2S()), + SHARE_REQUEST_INFO_SHARE_INFO(DatabaseTableType.EXTERNAL, SHARE_REQUEST_INFO, "sharerequestinfo_shareinfo"), EXTERNAL_SHARE_INFO(DatabaseTableType.EXTERNAL, null, diff --git a/sormas-api/src/main/resources/enum.properties b/sormas-api/src/main/resources/enum.properties index 5f3a98cefa9..dd15328be05 100644 --- a/sormas-api/src/main/resources/enum.properties +++ b/sormas-api/src/main/resources/enum.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/DatabaseExportService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/DatabaseExportService.java index a13040e9f07..371456a00d8 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/DatabaseExportService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/importexport/DatabaseExportService.java @@ -141,7 +141,9 @@ public class DatabaseExportService { EXPORT_CONFIGS.put(DatabaseTable.MATERNAL_HISTORIES, MaternalHistory.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.CONTACTS, Contact.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.VISITS, Visit.TABLE_NAME); + EXPORT_CONFIGS.put(DatabaseTable.CONTACTS_VISITS, Visit.CONTACTS_VISITS_TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.EVENTS, Event.TABLE_NAME); + EXPORT_CONFIGS.put(DatabaseTable.EVENTS_EVENTGROUPS, Event.EVENTS_EVENT_GROUPS_TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.EVENTGROUPS, EventGroup.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.EVENTPARTICIPANTS, EventParticipant.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.ACTIONS, Action.TABLE_NAME); @@ -152,8 +154,10 @@ public class DatabaseExportService { EXPORT_CONFIGS.put(DatabaseTable.PATHOGEN_TESTS, PathogenTest.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.ADDITIONAL_TESTS, AdditionalTest.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.TASKS, Task.TABLE_NAME); + EXPORT_CONFIGS.put(DatabaseTable.TASK_OBSERVER, Task.TASK_OBSERVER_TABLE); EXPORT_CONFIGS.put(DatabaseTable.PERSONS, Person.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.PERSON_CONTACT_DETAILS, PersonContactDetail.TABLE_NAME); + EXPORT_CONFIGS.put(DatabaseTable.PERSON_LOCATIONS, Person.PERSON_LOCATIONS_TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.LOCATIONS, Location.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.CONTINENTS, Continent.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.SUBCONTINENTS, Subcontinent.TABLE_NAME); @@ -168,6 +172,7 @@ public class DatabaseExportService { EXPORT_CONFIGS.put(DatabaseTable.CUSTOMIZABLE_ENUM_VALUES, CustomizableEnumValue.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.SYMPTOMS, Symptoms.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.CAMPAIGNS, Campaign.TABLE_NAME); + EXPORT_CONFIGS.put(DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA, Campaign.CAMPAIGN_CAMPAIGNFORMMETA_TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.CAMPAIGN_FORM_META, CampaignFormMeta.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.CAMPAIGN_FORM_DATA, CampaignFormData.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS, CampaignDiagramDefinition.TABLE_NAME); @@ -178,6 +183,7 @@ public class DatabaseExportService { EXPORT_CONFIGS.put(DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO, SormasToSormasShareInfo.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS, SormasToSormasShareRequest.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.SHARE_REQUEST_INFO, ShareRequestInfo.TABLE_NAME); + EXPORT_CONFIGS.put(DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO, ShareRequestInfo.SHARE_REQUEST_INFO_SHARE_INFO_TABLE); EXPORT_CONFIGS.put(DatabaseTable.EXTERNAL_SHARE_INFO, ExternalShareInfo.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.USERS, User.TABLE_NAME); EXPORT_CONFIGS.put(DatabaseTable.USER_ROLES, User.TABLE_NAME_USERROLES); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/importexport/DatabaseExportServiceTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/importexport/DatabaseExportServiceTest.java index 0732580ce98..00933d05c34 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/importexport/DatabaseExportServiceTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/importexport/DatabaseExportServiceTest.java @@ -2,6 +2,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import java.util.Arrays; @@ -11,12 +12,14 @@ import java.util.Set; import javax.persistence.Entity; +import javax.persistence.JoinTable; -import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Test; +import org.junit.platform.commons.util.StringUtils; import com.tngtech.archunit.core.domain.JavaClass; import com.tngtech.archunit.core.domain.JavaClasses; +import com.tngtech.archunit.core.domain.JavaMethod; import com.tngtech.archunit.core.importer.ClassFileImporter; import de.symeda.sormas.api.importexport.DatabaseTable; @@ -62,8 +65,10 @@ public void testGetConfigFullyDefined() { @Test public void test_all_entities_have_export_configuration() { Collection exportableTables = DatabaseExportService.EXPORT_CONFIGS.values(); + Set missingEntities = new HashSet<>(); - Set exportedButNotWanted = new HashSet<>(); + Set missingJoinTables = new HashSet<>(); + Set exportedButNotWantedEntity = new HashSet<>(); JavaClasses classes = new ClassFileImporter().importPackages("de.symeda.sormas.backend"); @@ -78,7 +83,19 @@ public void test_all_entities_have_export_configuration() { if (!exportableTables.contains(tableName)) { missingEntities.add(clazz.getSimpleName()); } else if (NOT_EXPORTED_ENTITIES.contains(clazz.reflect())) { - exportedButNotWanted.add(clazz.getSimpleName()); + exportedButNotWantedEntity.add(clazz.getSimpleName()); + } + + for (JavaMethod method : clazz.getMethods()) { + if (method.isAnnotatedWith(JoinTable.class)) { + JoinTable joinTableAnnotation = method.getAnnotationOfType(JoinTable.class); + String joinTableName = joinTableAnnotation.name(); + assertFalse(StringUtils.isBlank(joinTableName)); + + if (!exportableTables.contains(joinTableName)) { + missingJoinTables.add(joinTableName); + } + } } } } @@ -88,8 +105,9 @@ public void test_all_entities_have_export_configuration() { assertThat("Missing export configuration for entities [" + String.join(", ", missingEntities) + "]", missingEntities, hasSize(0)); assertThat( - "Export configuration not wanted for entities [" + String.join(", ", exportedButNotWanted) + "]", - exportedButNotWanted, + "Export configuration not wanted for entities [" + String.join(", ", exportedButNotWantedEntity) + "]", + exportedButNotWantedEntity, hasSize(0)); + assertThat("Missing export configuration for join tables [" + String.join(", ", missingJoinTables) + "]", missingJoinTables, hasSize(0)); } } diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/importexport/DatabaseTableTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/importexport/DatabaseTableTest.java index 50b8e87ba45..e9c7aef24a7 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/importexport/DatabaseTableTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/importexport/DatabaseTableTest.java @@ -36,32 +36,59 @@ public class DatabaseTableTest { @Test public void testCasesAndVisitsEnabled() { - FeatureConfigurationDto caseSurveillanceFeatureConfiguration = new FeatureConfigurationDto(); - caseSurveillanceFeatureConfiguration.setFeatureType(FeatureType.CASE_SURVEILANCE); - caseSurveillanceFeatureConfiguration.setEnabled(true); - - FeatureConfigurationDto caseFollowupFeatureConfiguration = new FeatureConfigurationDto(); - caseFollowupFeatureConfiguration.setFeatureType(FeatureType.CASE_FOLLOWUP); - caseFollowupFeatureConfiguration.setEnabled(true); - - List caseFeatureCOnfigurations = - Arrays.asList(caseSurveillanceFeatureConfiguration, caseFollowupFeatureConfiguration); - - assertThat(DatabaseTable.CASES.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(true)); - assertThat(DatabaseTable.HOSPITALIZATIONS.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(true)); - assertThat(DatabaseTable.PREVIOUSHOSPITALIZATIONS.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(true)); - assertThat(DatabaseTable.PORT_HEALTH_INFO.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(true)); - assertThat(DatabaseTable.MATERNAL_HISTORIES.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(true)); - assertThat(DatabaseTable.EPIDATA.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(true)); - assertThat(DatabaseTable.EXPOSURES.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(true)); - assertThat(DatabaseTable.ACTIVITIES_AS_CASE.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(true)); - assertThat(DatabaseTable.HEALTH_CONDITIONS.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(true)); - assertThat(DatabaseTable.SYMPTOMS.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(true)); - assertThat(DatabaseTable.VISITS.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(true)); - - assertThat(DatabaseTable.CONTACTS.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(false)); - assertThat(DatabaseTable.IMMUNIZATIONS.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(false)); - assertThat(DatabaseTable.SAMPLES.isEnabled(caseFeatureCOnfigurations, new ConfigFacadeEjb()), is(false)); + List caseFeatureConfigurations = + Arrays.asList(getFeatureConfiguration(FeatureType.CASE_SURVEILANCE, true), getFeatureConfiguration(FeatureType.CASE_FOLLOWUP, true)); + + assertThat(DatabaseTable.CASES.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.HOSPITALIZATIONS.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.PREVIOUSHOSPITALIZATIONS.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.PORT_HEALTH_INFO.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.MATERNAL_HISTORIES.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.EPIDATA.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.EXPOSURES.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.ACTIVITIES_AS_CASE.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.HEALTH_CONDITIONS.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.SYMPTOMS.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.VISITS.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + + assertThat(DatabaseTable.CONTACTS.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(false)); + assertThat(DatabaseTable.IMMUNIZATIONS.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(false)); + assertThat(DatabaseTable.SAMPLES.isEnabled(caseFeatureConfigurations, new ConfigFacadeEjb()), is(false)); + } + + @Test + public void testPersonsEnabled() { + + List personFeatureConfigurations = Arrays.asList( + getFeatureConfiguration(FeatureType.CASE_SURVEILANCE, true), + getFeatureConfiguration(FeatureType.EVENT_SURVEILLANCE, true), + getFeatureConfiguration(FeatureType.CONTACT_TRACING, true)); + + assertThat(DatabaseTable.PERSONS.isEnabled(personFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.PERSON_CONTACT_DETAILS.isEnabled(personFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.PERSON_LOCATIONS.isEnabled(personFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + } + + @Test + public void testCampaignsEnabled() { + + List campaignFeatureConfigurations = Collections.singletonList(getFeatureConfiguration(FeatureType.CAMPAIGNS, true)); + + assertThat(DatabaseTable.CAMPAIGNS.isEnabled(campaignFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.CAMPAIGN_FORM_META.isEnabled(campaignFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.CAMPAIGN_FORM_DATA.isEnabled(campaignFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS.isEnabled(campaignFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + + } + + @Test + public void testTasksEnabled() { + + List taskFeatureConfigurations = + Collections.singletonList(getFeatureConfiguration(FeatureType.TASK_MANAGEMENT, true)); + + assertThat(DatabaseTable.TASKS.isEnabled(taskFeatureConfigurations, new ConfigFacadeEjb()), is(true)); + assertThat(DatabaseTable.TASK_OBSERVER.isEnabled(taskFeatureConfigurations, new ConfigFacadeEjb()), is(true)); } @Test @@ -95,4 +122,12 @@ public void testS2sTablesEnabled() { assertThat(DatabaseTable.SHARE_REQUEST_INFO.isEnabled(Collections.emptyList(), configFacadeMock), is(true)); assertThat(DatabaseTable.EXTERNAL_SHARE_INFO.isEnabled(Collections.emptyList(), configFacadeMock), is(false)); } + + private FeatureConfigurationDto getFeatureConfiguration(FeatureType featureType, boolean enabled) { + FeatureConfigurationDto featureConfiguration = new FeatureConfigurationDto(); + featureConfiguration.setFeatureType(featureType); + featureConfiguration.setEnabled(enabled); + + return featureConfiguration; + } } From 114deae1d29228b7f779eba0afcb5524e68c0bd4 Mon Sep 17 00:00:00 2001 From: syntakker Date: Thu, 15 Dec 2022 12:15:52 +0100 Subject: [PATCH 089/147] #6053 show warning message if person is already participating in an event --- .../src/main/java/de/symeda/sormas/api/i18n/Strings.java | 1 + sormas-api/src/main/resources/strings.properties | 1 + .../java/de/symeda/sormas/ui/events/EventController.java | 6 ++++++ 3 files changed, 8 insertions(+) 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 a8808611374..41b41b28121 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 @@ -1183,6 +1183,7 @@ public interface Strings { String messagePersonAddedAsEventParticipant = "messagePersonAddedAsEventParticipant"; String messagePersonAlreadyCaseInEvent = "messagePersonAlreadyCaseInEvent"; String messagePersonAlreadyEventParticipant = "messagePersonAlreadyEventParticipant"; + String messageThisPersonAlreadyEventParticipant = "messageThisPersonAlreadyEventParticipant"; String messagePersonContactDetailsPrimaryDuplicate = "messagePersonContactDetailsPrimaryDuplicate"; String messagePersonExternalTokenWarning = "messagePersonExternalTokenWarning"; String messagePersonSaved = "messagePersonSaved"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 0013c413d63..c7357cd4f4c 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java index 5dc3837bbac..71ab8fdf9ea 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventController.java @@ -439,6 +439,12 @@ public void selectOrCreateEvent(PersonReferenceDto personReference) { EventReferenceDto eventReferenceDto = new EventReferenceDto(selectedEvent.getUuid()); if (!eventIndexDto.contains(selectedEvent)) { createEventParticipantWithPerson(eventReferenceDto, personReference); + } else { + SormasUI.refreshView(); + Notification notification = + new Notification(I18nProperties.getString(Strings.messageThisPersonAlreadyEventParticipant), "", Type.HUMANIZED_MESSAGE); + notification.setDelayMsec(10000); + notification.show(Page.getCurrent()); } } else { create(personReference); From 3e5eef690e319d6d9f64b0525481da245040dcc7 Mon Sep 17 00:00:00 2001 From: syntakker Date: Thu, 15 Dec 2022 12:16:28 +0100 Subject: [PATCH 090/147] #6053 do not show select case dialog twice --- .../main/java/de/symeda/sormas/ui/caze/CaseController.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java index 379c7bb2674..a8cbeafbb77 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java @@ -816,8 +816,13 @@ public CommitDiscardWrapperComponent getCaseCreateComponent( dto.getSymptoms().setOnsetDate(createForm.getOnsetDate()); saveCase(dto); } + } else if (convertedPerson != null) { + PersonDto dbPerson = FacadeProvider.getPersonFacade().getByUuid(dto.getPerson().getUuid()); + transferDataToPerson(createForm, dbPerson); + FacadeProvider.getPersonFacade().save(dbPerson); + dto.getSymptoms().setOnsetDate(createForm.getOnsetDate()); + saveCase(dto); } else { - PersonDto searchedPerson = createForm.getSearchedPerson(); if (searchedPerson != null) { dto.setPerson(searchedPerson.toReference()); From 3e76f6de630ea27b18aa77de2d06b2362d86cd03 Mon Sep 17 00:00:00 2001 From: syntakker Date: Thu, 15 Dec 2022 12:25:58 +0100 Subject: [PATCH 091/147] #6053 fix I18Constants --- sormas-api/src/main/java/de/symeda/sormas/api/i18n/Strings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 41b41b28121..70957644b9f 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 @@ -1183,7 +1183,6 @@ public interface Strings { String messagePersonAddedAsEventParticipant = "messagePersonAddedAsEventParticipant"; String messagePersonAlreadyCaseInEvent = "messagePersonAlreadyCaseInEvent"; String messagePersonAlreadyEventParticipant = "messagePersonAlreadyEventParticipant"; - String messageThisPersonAlreadyEventParticipant = "messageThisPersonAlreadyEventParticipant"; String messagePersonContactDetailsPrimaryDuplicate = "messagePersonContactDetailsPrimaryDuplicate"; String messagePersonExternalTokenWarning = "messagePersonExternalTokenWarning"; String messagePersonSaved = "messagePersonSaved"; @@ -1242,6 +1241,7 @@ public interface Strings { String messageTasksDeleted = "messageTasksDeleted"; String messageTasksEdited = "messageTasksEdited"; String messageTemplateNotAvailable = "messageTemplateNotAvailable"; + String messageThisPersonAlreadyEventParticipant = "messageThisPersonAlreadyEventParticipant"; String messageTravelEntriesDeleted = "messageTravelEntriesDeleted"; String messageTravelEntryArchived = "messageTravelEntryArchived"; String messageTravelEntryDearchived = "messageTravelEntryDearchived"; From 8e0210ea6adbcc0b43cf0f2baaa9da80bf74580f Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 15 Dec 2022 14:27:47 +0100 Subject: [PATCH 092/147] multiple fixes --- .../e2etests/pages/application/cases/EditCasePage.java | 5 ++--- .../pages/application/samples/SamplesDirectoryPage.java | 3 ++- .../src/test/resources/features/sanity/web/Case.feature | 4 ++-- .../src/test/resources/features/sanity/web/Event.feature | 2 +- .../test/resources/features/sanity/web/Pathogen.feature | 2 +- .../src/test/resources/features/sanity/web/Sample.feature | 8 ++++---- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java index ddafefb66e2..67d88d928c4 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java @@ -46,9 +46,8 @@ public class EditCasePage { public static final By EDIT_TASK_BUTTON = By.cssSelector("div[id*='edit0']"); public static final By NEW_SAMPLE_BUTTON = By.cssSelector("[id='New sample']"); public static final By NEW_SAMPLE_BUTTON_DE = By.cssSelector("[id='Neue Probe']"); - public static final By EDIT_SAMPLE_BUTTON = - By.cssSelector( - "[location='samples'] [class='v-button v-widget link v-button-link compact v-button-compact']"); + public static final By EDIT_SAMPLE_BUTTON = By.xpath("//div[contains(@id, 'edit-sample')]"); + public static final By REPORT_DATE_INPUT = By.cssSelector("#reportDate input"); public static final By CASE_CLASSIFICATION_COMBOBOX = By.cssSelector("#caseClassification div"); public static final By CASE_CLASSIFICATION_SPAN = diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/samples/SamplesDirectoryPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/samples/SamplesDirectoryPage.java index 9863b90f2c9..970637db528 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/samples/SamplesDirectoryPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/samples/SamplesDirectoryPage.java @@ -61,7 +61,8 @@ public class SamplesDirectoryPage { By.cssSelector(".popupContent [class='v-window-header']"); public static final By CONFIRM_BUTTON = By.cssSelector(".popupContent [id='actionConfirm']"); public static final By EDIT_PATHOGEN_TEST_BUTTON = - By.xpath("//div[@class='v-button v-widget link v-button-link compact v-button-compact']"); + By.xpath( + "//div[@class='v-button v-widget link v-button-link compact v-button-compact caption-overflow-label v-button-caption-overflow-label']"); public static final By EXPORT_SAMPLE_BUTTON = By.id("export"); public static final By BASIC_EXPORT_SAMPLE_BUTTON = By.id("exportBasic"); public static final By DETAILED_EXPORT_SAMPLE_BUTTON = By.id("exportDetailed"); diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index 643709c17f9..a04c26dbafd 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1167,7 +1167,7 @@ Feature: Case end to end tests And I click on SAVE new contact case button Then I check if National Health Id, Nickname and Passport number appear in Pick or create person popup - @tmsLink=SORDEV-8413 @env_main + @tmsLink=SORDEV-8413 @env_main @testIt Scenario: Test Hide specific enum values based on the related disease Given I log in as a National User When I click on the Cases button from navbar @@ -1290,7 +1290,7 @@ Feature: Case end to end tests Then I click on edit button for the last searched facility And I archive facility - @env_main @#8556 + @env_main @#8556 @testIt Scenario: Add two positive Pathogen Test Result of different diseases to a Sample of a Case Given API: I create a new person And API: I check that POST call body is "OK" diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature index 8e267787599..f5d92b282c2 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature @@ -861,7 +861,7 @@ Feature: Create events Then I click on edit button for the last searched facility And I archive facility - @env_main @#8556 + @env_main @#8556 @testIt Scenario: Add two positive Pathogen Test Result of different diseases to a Sample of an Event Participant Given API: I create a new event Then API: I check that POST call body is "OK" diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Pathogen.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Pathogen.feature index d163b4f4f83..d965eea817a 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Pathogen.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Pathogen.feature @@ -142,7 +142,7 @@ Feature: Pathogen Functionalities And I check that if Other field is correctly displayed And I delete the Pathogen test - @tmsLink=SORDEV-8058 @env_main + @tmsLink=SORDEV-8058 @env_main @testIt Scenario: Unify pathogen test saving logic between cases and contacts When API: I create a new person Then API: I check that POST call body is "OK" diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature index fd0224b5c96..2f0393a39ca 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature @@ -171,7 +171,7 @@ Feature: Sample Functionalities And I complete all fields from Additional test result popup and save And I check that the created Additional test is correctly displayed - @#8556 @env_main + @#8556 @env_main @testIt Scenario: Add two positive Pathogen Test Result of different diseases to a Sample of a Contact Given API: I create a new person Then API: I check that POST call body is "OK" @@ -229,7 +229,7 @@ Feature: Sample Functionalities Then I set PCR RT PCR Test specification to "N501Y mutation detection" option And I save the created sample - @tmsLink=SORDEV-5669 @env_main + @tmsLink=SORDEV-5669 @env_main @testIt Scenario: Add variant specific Nucleic acid detection methods after creating sample Given I log in as a National User And I click on the Cases button from navbar @@ -246,7 +246,7 @@ Feature: Sample Functionalities Then I set PCR RT PCR Test specification to "N501Y mutation detection" option And I save the created sample - @tmsLink=SORDEV-5669 @env_main + @tmsLink=SORDEV-5669 @env_main @testIt Scenario: Add variant specific Nucleic acid detection methods Given I log in as a National User And I click on the Cases button from navbar @@ -407,7 +407,7 @@ Feature: Sample Functionalities And I check if Specimen condition combobox is not mandatory And I click on Save Button in Sample Edit page - @tmsLink=SORDEV-10588 @env_main + @tmsLink=SORDEV-10588 @env_main @testIt Scenario: Test "Specimen condition" should not be mandatory for sample added to case import Given I log in as a Admin User Then I click on the Cases button from navbar From 356d83e26ad0b313a1f2b43aab9bc081a1d0a90b Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Thu, 15 Dec 2022 14:30:20 +0100 Subject: [PATCH 093/147] fixes --- .../application/cases/CreateNewCaseSteps.java | 22 +++++++++++++------ .../features/sanity/web/Immunization.feature | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java index 619b2a10c80..9dc1b2c690a 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java @@ -112,6 +112,7 @@ import static org.sormas.e2etests.pages.application.entries.TravelEntryPage.PICK_OR_CREATE_PERSON_HEADER_DE; import static org.sormas.e2etests.pages.application.persons.PersonDirectoryPage.SEARCH_PERSON_BY_FREE_TEXT; import static org.sormas.e2etests.steps.web.application.cases.EditCaseSteps.aCase; +import static org.sormas.e2etests.steps.web.application.contacts.CreateNewContactSteps.contact; import static org.sormas.e2etests.steps.web.application.persons.PersonDirectorySteps.personSharedForAllEntities; import static org.sormas.e2etests.steps.web.application.shares.EditSharesPage.ACCEPT_BUTTON; import static org.sormas.e2etests.steps.web.application.shares.EditSharesPage.SHARE_UUID_CASE_TITLE; @@ -146,7 +147,6 @@ import org.sormas.e2etests.pages.application.cases.EditCasePage; import org.sormas.e2etests.state.ApiState; import org.sormas.e2etests.steps.BaseSteps; -import org.sormas.e2etests.steps.web.application.contacts.CreateNewContactSteps; import org.testng.asserts.SoftAssert; public class CreateNewCaseSteps implements En { @@ -1154,6 +1154,15 @@ public CreateNewCaseSteps( fillDateOfReport(caze.getDateOfReport(), Locale.GERMAN); }); + And( + "I fill only mandatory fields to convert a contact into a case for DE", + () -> { + fillDateOfReport(LocalDate.now(), Locale.GERMAN); + selectPlaceOfStay("ZUHAUSE"); + selectResponsibleRegion(contact.getResponsibleRegion()); + selectResponsibleDistrict(contact.getResponsibleDistrict()); + }); + And( "^I click SAVE button on Create New Case form$", () -> { @@ -1170,13 +1179,12 @@ public CreateNewCaseSteps( And( "^I create a new case with specific mandatory fields with saved person details from contact for DE$", () -> { - selectResponsibleRegion(CreateNewContactSteps.contact.getResponsibleRegion()); - selectResponsibleDistrict(CreateNewContactSteps.contact.getResponsibleDistrict()); + selectResponsibleRegion(contact.getResponsibleRegion()); + selectResponsibleDistrict(contact.getResponsibleDistrict()); selectPlaceOfStay("ZUHAUSE"); - fillFirstName(CreateNewContactSteps.contact.getFirstName()); - fillLastName(CreateNewContactSteps.contact.getLastName()); - fillDateOfBirth(caze.getDateOfBirth(), Locale.GERMAN); - selectSex(CreateNewContactSteps.contact.getSex()); + fillFirstName(contact.getFirstName()); + fillLastName(contact.getLastName()); + selectSex(contact.getSex()); fillDateOfReport(LocalDate.now().minusDays(189), Locale.GERMAN); webDriverHelpers.clickOnWebElementBySelector(SAVE_BUTTON); webDriverHelpers.waitForPageLoadingSpinnerToDisappear(20); diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature index 8da03085413..249bd3b0ed1 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Immunization.feature @@ -351,7 +351,7 @@ Feature: Immunization end to end tests And I fill new vaccination data in new Vaccination form with vaccination date 7 days before the current day for DE And I click SAVE button in new Vaccination form And I click Create Case from Contact button - And I fill only mandatory fields for a new case form for DE + And I fill only mandatory fields to convert a contact into a case for DE And I click SAVE button on Create New Case form And I check that displayed vaccination card has correct vaccination date and name And I check if Vaccination Status is set to "Geimpft" on Edit Case page From 10cd3788a07052c6bc9753b07a83a08d0f867413 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 15 Dec 2022 14:38:15 +0100 Subject: [PATCH 094/147] [GITFLOW]Updating development poms to hotfix version to avoid merge conflicts --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index ec8a91fd49e..7df9de1de00 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.4 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 6a49b253781..aadfeb954a7 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.4 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 5a7625052ac..402049fd3b0 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.4 ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index 91db21e5987..8b7ee2b4589 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.4 ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 8f1cf55d2b9..b7a5190a972 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.78.0-SNAPSHOT + 1.77.4 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 935d51a2397..760059422b4 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.4 ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 05d2cab9ca1..257b9aa660e 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.4 ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 6c507e70a4e..add417eeaec 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.4 ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 2798d0cc469..bc81b3dd39e 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.4 ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 04695198254..6cdcf8e51ec 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.4 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 7ceea1349a7..adcebac7ef8 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.4 ../sormas-base 4.0.0 From 290c4b895aa6133d021850789f03cf2ed435e8a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 15 Dec 2022 14:38:27 +0100 Subject: [PATCH 095/147] [GITFLOW]Updating develop poms back to pre merge state --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index 7df9de1de00..ec8a91fd49e 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.77.4 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index aadfeb954a7..6a49b253781 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.4 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 402049fd3b0..5a7625052ac 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.4 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index 8b7ee2b4589..91db21e5987 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.77.4 + 1.78.0-SNAPSHOT ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index b7a5190a972..8f1cf55d2b9 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.77.4 + 1.78.0-SNAPSHOT 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 760059422b4..935d51a2397 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.4 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 257b9aa660e..05d2cab9ca1 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.4 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index add417eeaec..6c507e70a4e 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.4 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index bc81b3dd39e..2798d0cc469 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.4 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 6cdcf8e51ec..04695198254 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.4 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index adcebac7ef8..7ceea1349a7 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.4 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 From 9c931642bf2656f32820f85ab3a4e9005c9bb937 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 15 Dec 2022 14:40:12 +0100 Subject: [PATCH 096/147] fixes --- .../src/test/resources/features/sanity/web/Case.feature | 4 ++-- .../src/test/resources/features/sanity/web/Event.feature | 2 +- .../test/resources/features/sanity/web/Pathogen.feature | 2 +- .../src/test/resources/features/sanity/web/Sample.feature | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index a04c26dbafd..643709c17f9 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1167,7 +1167,7 @@ Feature: Case end to end tests And I click on SAVE new contact case button Then I check if National Health Id, Nickname and Passport number appear in Pick or create person popup - @tmsLink=SORDEV-8413 @env_main @testIt + @tmsLink=SORDEV-8413 @env_main Scenario: Test Hide specific enum values based on the related disease Given I log in as a National User When I click on the Cases button from navbar @@ -1290,7 +1290,7 @@ Feature: Case end to end tests Then I click on edit button for the last searched facility And I archive facility - @env_main @#8556 @testIt + @env_main @#8556 Scenario: Add two positive Pathogen Test Result of different diseases to a Sample of a Case Given API: I create a new person And API: I check that POST call body is "OK" diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature index f5d92b282c2..8e267787599 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature @@ -861,7 +861,7 @@ Feature: Create events Then I click on edit button for the last searched facility And I archive facility - @env_main @#8556 @testIt + @env_main @#8556 Scenario: Add two positive Pathogen Test Result of different diseases to a Sample of an Event Participant Given API: I create a new event Then API: I check that POST call body is "OK" diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Pathogen.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Pathogen.feature index d965eea817a..d163b4f4f83 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Pathogen.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Pathogen.feature @@ -142,7 +142,7 @@ Feature: Pathogen Functionalities And I check that if Other field is correctly displayed And I delete the Pathogen test - @tmsLink=SORDEV-8058 @env_main @testIt + @tmsLink=SORDEV-8058 @env_main Scenario: Unify pathogen test saving logic between cases and contacts When API: I create a new person Then API: I check that POST call body is "OK" diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature index 2f0393a39ca..fd0224b5c96 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Sample.feature @@ -171,7 +171,7 @@ Feature: Sample Functionalities And I complete all fields from Additional test result popup and save And I check that the created Additional test is correctly displayed - @#8556 @env_main @testIt + @#8556 @env_main Scenario: Add two positive Pathogen Test Result of different diseases to a Sample of a Contact Given API: I create a new person Then API: I check that POST call body is "OK" @@ -229,7 +229,7 @@ Feature: Sample Functionalities Then I set PCR RT PCR Test specification to "N501Y mutation detection" option And I save the created sample - @tmsLink=SORDEV-5669 @env_main @testIt + @tmsLink=SORDEV-5669 @env_main Scenario: Add variant specific Nucleic acid detection methods after creating sample Given I log in as a National User And I click on the Cases button from navbar @@ -246,7 +246,7 @@ Feature: Sample Functionalities Then I set PCR RT PCR Test specification to "N501Y mutation detection" option And I save the created sample - @tmsLink=SORDEV-5669 @env_main @testIt + @tmsLink=SORDEV-5669 @env_main Scenario: Add variant specific Nucleic acid detection methods Given I log in as a National User And I click on the Cases button from navbar @@ -407,7 +407,7 @@ Feature: Sample Functionalities And I check if Specimen condition combobox is not mandatory And I click on Save Button in Sample Edit page - @tmsLink=SORDEV-10588 @env_main @testIt + @tmsLink=SORDEV-10588 @env_main Scenario: Test "Specimen condition" should not be mandatory for sample added to case import Given I log in as a Admin User Then I click on the Cases button from navbar From 427ae3523271ea4eaec31c3ee1d41b3a664051fa Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 15 Dec 2022 15:11:43 +0100 Subject: [PATCH 097/147] fix --- .../pages/application/cases/ClinicalCourseTabCasePage.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/ClinicalCourseTabCasePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/ClinicalCourseTabCasePage.java index 3a97c2961f9..c9644fc92a5 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/ClinicalCourseTabCasePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/ClinicalCourseTabCasePage.java @@ -27,5 +27,6 @@ public class ClinicalCourseTabCasePage { public static final By EDIT_BUTTON = By.cssSelector("[class='v-icon v-icon-edit']"); public static final By CLEAR_ALL_OPTION = By.cssSelector("[id='actionClearAll']"); public static final By SET_OPTIONS = - By.cssSelector("[class='v-button v-widget link v-button-link']"); + By.cssSelector( + "[class='v-button v-widget link v-button-link caption-overflow-label v-button-caption-overflow-label']"); } From c30fdf1c0db1a900d178c487a13dc9674739b872 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 15 Dec 2022 15:38:06 +0100 Subject: [PATCH 098/147] fix --- .../e2etests/pages/application/cases/FollowUpTabPage.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/FollowUpTabPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/FollowUpTabPage.java index 9e129fbe750..ed8ee6491ec 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/FollowUpTabPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/FollowUpTabPage.java @@ -44,7 +44,8 @@ public class FollowUpTabPage { public static final By ACTION_CONFIRM = By.cssSelector("[id='actionConfirm']"); public static final By SET_CLEARED_TO_NO_BUTTON = By.cssSelector("[id='symptomsSetClearedToNo']"); public static final By OPTION_FOR_SET_BUTTONS = - By.cssSelector("[class='v-button v-widget link v-button-link']"); + By.cssSelector( + "[class='v-button v-widget link v-button-link caption-overflow-label v-button-caption-overflow-label']"); public static final By CHILLS_SWEATS_OPTIONS = By.cssSelector("[id='chillsSweats'] [class='v-checkbox v-select-option']"); public static final By CHILLS_SWEATS_YES_BUTTON = From a82955445a0889352c154b2ec7e4f3faf6d1f8eb Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Thu, 15 Dec 2022 16:53:41 +0200 Subject: [PATCH 099/147] #10958 - Avoid directories calling count method several times - Infrastructure --- .../continent/ContinentService.java | 5 ++- .../subcontinent/SubcontinentService.java | 5 ++- .../infrastructure/AreasGrid.java | 30 +------------ .../infrastructure/AreasView.java | 42 +++++++++++-------- .../infrastructure/CommunitiesGrid.java | 35 +++------------- .../infrastructure/CommunitiesView.java | 10 ++++- .../infrastructure/ContinentsGrid.java | 28 +++++++------ .../infrastructure/ContinentsView.java | 13 ++++-- .../infrastructure/CountriesGrid.java | 28 ++++++++----- .../infrastructure/CountriesView.java | 12 ++++-- .../infrastructure/DistrictsGrid.java | 37 +++------------- .../infrastructure/DistrictsView.java | 10 ++++- .../infrastructure/FacilitiesGrid.java | 32 +++----------- .../infrastructure/FacilitiesView.java | 22 ++++++---- .../infrastructure/PointsOfEntryGrid.java | 34 +++------------ .../infrastructure/PointsOfEntryView.java | 21 +++++++--- .../infrastructure/RegionsGrid.java | 37 +++------------- .../infrastructure/RegionsView.java | 10 ++++- .../infrastructure/SubcontinentsGrid.java | 28 +++++++------ .../infrastructure/SubcontinentsView.java | 15 ++++--- .../symeda/sormas/ui/utils/FilteredGrid.java | 8 ++-- 21 files changed, 196 insertions(+), 266 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/continent/ContinentService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/continent/ContinentService.java index dd278e1c5ed..30e60b4b633 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/continent/ContinentService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/continent/ContinentService.java @@ -53,7 +53,10 @@ public Predicate buildCriteriaFilter(ContinentCriteria criteria, CriteriaBuilder Predicate filter = null; if (criteria != null) { if (criteria.getNameLike() != null) { - filter = CriteriaBuilderHelper.and(cb, cb.like(cb.lower(from.get(Continent.DEFAULT_NAME)), criteria.getNameLike().toLowerCase())); + filter = CriteriaBuilderHelper.and( + cb, + filter, + CriteriaBuilderHelper.unaccentedIlike(cb, from.get(Continent.DEFAULT_NAME), criteria.getNameLike().toLowerCase())); } filter = addRelevancePredicate(cb, from, filter, criteria.getRelevanceStatus()); } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/subcontinent/SubcontinentService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/subcontinent/SubcontinentService.java index a1ac2d324fe..7761f8949ba 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/subcontinent/SubcontinentService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/infrastructure/subcontinent/SubcontinentService.java @@ -39,7 +39,10 @@ public Predicate buildCriteriaFilter(SubcontinentCriteria criteria, CriteriaBuil .and(cb, filter, cb.equal(from.join(Subcontinent.CONTINENT, JoinType.LEFT).get(Continent.UUID), criteria.getContinent().getUuid())); } if (criteria.getNameLike() != null) { - filter = CriteriaBuilderHelper.and(cb, cb.like(cb.lower(from.get(Subcontinent.DEFAULT_NAME)), criteria.getNameLike().toLowerCase())); + filter = CriteriaBuilderHelper.and( + cb, + filter, + CriteriaBuilderHelper.unaccentedIlike(cb, from.get(Subcontinent.DEFAULT_NAME), criteria.getNameLike().toLowerCase())); } filter = addRelevancePredicate(cb, from, filter, criteria.getRelevanceStatus()); return filter; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasGrid.java index f0b5572f6f4..9332c0ac070 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasGrid.java @@ -1,17 +1,10 @@ package de.symeda.sormas.ui.configuration.infrastructure; -import java.util.stream.Collectors; - -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; -import com.vaadin.shared.data.sort.SortDirection; - import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.infrastructure.area.AreaCriteria; import de.symeda.sormas.api.infrastructure.area.AreaDto; import de.symeda.sormas.api.user.UserRight; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; @@ -52,29 +45,10 @@ public void reload() { } public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getAreaFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> { - return (int) FacadeProvider.getAreaFacade().count(query.getFilter().orElse(null)); - }); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(FacadeProvider.getAreaFacade()::getIndexList, FacadeProvider.getAreaFacade()::count); } public void setEagerDataProvider() { - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getAreaFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); + setEagerDataProvider(FacadeProvider.getAreaFacade()::getIndexList); } - } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasView.java index 782f17b5f12..342f1afc083 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasView.java @@ -65,7 +65,7 @@ public AreasView() { grid = new AreasGrid(criteria); VerticalLayout gridLayout = new VerticalLayout(); gridLayout.addComponent(createFilterBar()); - gridLayout.addComponent(new RowCount(Strings.labelNumberOfAreas, grid.getItemCount())); + gridLayout.addComponent(new RowCount(Strings.labelNumberOfAreas, grid.getDataSize())); gridLayout.addComponent(grid); gridLayout.setMargin(true); gridLayout.setSpacing(false); @@ -187,22 +187,30 @@ private HorizontalLayout createFilterBar() { if (UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { dropdownBulkOperations = MenuBarHelper.createDropDown( Captions.bulkActions, - new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.actionArchiveInfrastructure), VaadinIcons.ARCHIVE, selectedItem -> { - ControllerProvider.getInfrastructureController() - .archiveOrDearchiveAllSelectedItems( - true, - grid.asMultiSelect().getSelectedItems(), - InfrastructureType.AREA, - () -> navigateTo(criteria)); - }, EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), - new MenuBarHelper.MenuBarItem(I18nProperties.getCaption(Captions.actionDearchiveInfrastructure), VaadinIcons.ARCHIVE, selectedItem -> { - ControllerProvider.getInfrastructureController() - .archiveOrDearchiveAllSelectedItems( - false, - grid.asMultiSelect().getSelectedItems(), - InfrastructureType.AREA, - () -> navigateTo(criteria)); - }, EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.actionArchiveInfrastructure), + VaadinIcons.ARCHIVE, + selectedItem -> { + ControllerProvider.getInfrastructureController() + .archiveOrDearchiveAllSelectedItems( + true, + grid.asMultiSelect().getSelectedItems(), + InfrastructureType.AREA, + () -> navigateTo(criteria)); + }, + EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus())), + new MenuBarHelper.MenuBarItem( + I18nProperties.getCaption(Captions.actionDearchiveInfrastructure), + VaadinIcons.ARCHIVE, + selectedItem -> { + ControllerProvider.getInfrastructureController() + .archiveOrDearchiveAllSelectedItems( + false, + grid.asMultiSelect().getSelectedItems(), + InfrastructureType.AREA, + () -> navigateTo(criteria)); + }, + EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); dropdownBulkOperations .setVisible(viewConfiguration.isInEagerMode() && !EntityRelevanceStatus.ALL.equals(criteria.getRelevanceStatus())); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesGrid.java index 2309b45f164..9fb6c1a4e90 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesGrid.java @@ -1,35 +1,25 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System * Copyright © 2016-2021 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.configuration.infrastructure; -import java.util.stream.Collectors; - -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; -import com.vaadin.shared.data.sort.SortDirection; - 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.infrastructure.community.CommunityCriteria; import de.symeda.sormas.api.infrastructure.community.CommunityDto; import de.symeda.sormas.api.user.UserRight; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; @@ -69,32 +59,17 @@ public CommunitiesGrid(CommunityCriteria criteria) { } public void reload() { + if (ViewModelProviders.of(CommunitiesView.class).get(ViewConfiguration.class).isInEagerMode()) { + setEagerDataProvider(); + } getDataProvider().refreshAll(); } public void setLazyDataProvider() { - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getCommunityFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> { - return (int) FacadeProvider.getCommunityFacade().count(query.getFilter().orElse(null)); - }); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(FacadeProvider.getCommunityFacade()::getIndexList, FacadeProvider.getCommunityFacade()::count); } public void setEagerDataProvider() { - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getCommunityFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); + setEagerDataProvider(FacadeProvider.getCommunityFacade()::getIndexList); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesView.java index 57b4bfe9a2b..e3597deb736 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesView.java @@ -18,6 +18,8 @@ import java.util.Collections; import java.util.Set; +import org.apache.commons.lang3.StringUtils; + import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.StreamResource; @@ -82,6 +84,7 @@ public class CommunitiesView extends AbstractConfigurationView { private VerticalLayout gridLayout; private CommunitiesGrid grid; private MenuBar bulkOperationsDropdown; + private RowCount rowCount; public CommunitiesView() { @@ -97,7 +100,9 @@ public CommunitiesView() { grid = new CommunitiesGrid(criteria); gridLayout = new VerticalLayout(); gridLayout.addComponent(createFilterBar()); - gridLayout.addComponent(new RowCount(Strings.labelNumberOfCommunities, grid.getItemCount())); + rowCount = new RowCount(Strings.labelNumberOfCommunities, grid.getDataSize()); + grid.addDataSizeChangeListener(e -> rowCount.update(grid.getDataSize())); + gridLayout.addComponent(rowCount); gridLayout.addComponent(grid); gridLayout.setMargin(true); gridLayout.setSpacing(false); @@ -160,6 +165,8 @@ public CommunitiesView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); + searchField.clear(); + criteria.nameLike(StringUtils.EMPTY); grid.setEagerDataProvider(); grid.reload(); }); @@ -302,6 +309,7 @@ public void run() { EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); + searchField.setEnabled(!isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsGrid.java index 6645d81db51..a0e68f7c327 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsGrid.java @@ -19,11 +19,11 @@ import java.util.function.Predicate; import java.util.stream.Stream; -import de.symeda.sormas.api.feature.FeatureType; import org.apache.commons.lang3.StringUtils; import de.symeda.sormas.api.EntityRelevanceStatus; 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.infrastructure.continent.ContinentCriteria; import de.symeda.sormas.api.infrastructure.continent.ContinentIndexDto; @@ -48,9 +48,11 @@ public ContinentsGrid(ContinentCriteria criteria) { super.setCriteria(criteria, true); if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { - setSelectionMode(SelectionMode.MULTI); + setCriteria(criteria); + setEagerDataProvider(); } else { - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(); + setCriteria(criteria); } setColumns(ContinentIndexDto.DISPLAY_NAME, ContinentIndexDto.EXTERNAL_ID, ContinentIndexDto.DEFAULT_NAME); @@ -64,20 +66,22 @@ public ContinentsGrid(ContinentCriteria criteria) { for (Column column : getColumns()) { column.setCaption(I18nProperties.getPrefixCaption(ContinentIndexDto.I18N_PREFIX, column.getId(), column.getCaption())); } - - reload(true); } - public void reload(boolean forceFetch) { - if (forceFetch || allContinents == null) { - allContinents = FacadeProvider.getContinentFacade().getIndexList(null, null, null, null); + public void reload() { + setSelectionMode(isInEagerMode() ? SelectionMode.MULTI : SelectionMode.NONE); + if (ViewModelProviders.of(ContinentsView.class).get(ViewConfiguration.class).isInEagerMode()) { + setEagerDataProvider(); } - reload(); + getDataProvider().refreshAll(); } - public void reload() { - this.setItems(createFilteredStream()); - setSelectionMode(isInEagerMode() ? SelectionMode.MULTI : SelectionMode.NONE); + public void setLazyDataProvider() { + setLazyDataProvider(FacadeProvider.getContinentFacade()::getIndexList, FacadeProvider.getContinentFacade()::count); + } + + public void setEagerDataProvider() { + setEagerDataProvider(FacadeProvider.getContinentFacade()::getIndexList); } private Stream createFilteredStream() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsView.java index a95d3b65a03..398b1345d58 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsView.java @@ -18,6 +18,8 @@ import java.util.Collections; import java.util.Set; +import org.apache.commons.lang3.StringUtils; + import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.server.FileDownloader; @@ -87,7 +89,8 @@ public ContinentsView() { grid = new ContinentsGrid(criteria); gridLayout = new VerticalLayout(); gridLayout.addComponent(createFilterBar()); - rowCount = new RowCount(Strings.labelNumberOfContinents, grid.getItemCount()); + rowCount = new RowCount(Strings.labelNumberOfContinents, grid.getDataSize()); + grid.addDataSizeChangeListener(e -> rowCount.update(grid.getDataSize())); gridLayout.addComponent(rowCount); gridLayout.addComponent(grid); gridLayout.setMargin(true); @@ -102,14 +105,14 @@ public ContinentsView() { importButton = ButtonHelper.createIconButton(Captions.actionImport, VaadinIcons.UPLOAD, e -> { Window window = VaadinUiUtil.showPopupWindow(new InfrastructureImportLayout(InfrastructureType.CONTINENT)); window.setCaption(I18nProperties.getString(Strings.headingImportContinents)); - window.addCloseListener(c -> grid.reload(true)); + window.addCloseListener(c -> grid.reload()); }, ValoTheme.BUTTON_PRIMARY); addHeaderComponent(importButton); importDefaultContinentsButton = ButtonHelper.createIconButton(Captions.actionImportAllContinents, VaadinIcons.UPLOAD, e -> { Window window = VaadinUiUtil.showPopupWindow(new ImportDefaultContinentsLayout()); window.setCaption(I18nProperties.getString(Strings.headingImportAllContinents)); - window.addCloseListener(c -> grid.reload(true)); + window.addCloseListener(c -> grid.reload()); }, ValoTheme.BUTTON_PRIMARY); addHeaderComponent(importDefaultContinentsButton); } else if (!infrastructureDataEditable) { @@ -161,6 +164,8 @@ public ContinentsView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); + searchField.clear(); + criteria.nameLike(StringUtils.EMPTY); grid.setInEagerMode(true); grid.reload(); }); @@ -252,6 +257,7 @@ private HorizontalLayout createFilterBar() { EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); + searchField.setEnabled(!isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } @@ -274,7 +280,6 @@ public void enter(ViewChangeListener.ViewChangeEvent event) { } updateFilterComponents(); grid.reload(); - rowCount.update(grid.getItemCount()); } public void updateFilterComponents() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesGrid.java index d2d394acb9b..23664c50a64 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesGrid.java @@ -19,11 +19,11 @@ import java.util.function.Predicate; import java.util.stream.Stream; -import de.symeda.sormas.api.feature.FeatureType; import org.apache.commons.lang3.StringUtils; import de.symeda.sormas.api.EntityRelevanceStatus; 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.infrastructure.country.CountryCriteria; import de.symeda.sormas.api.infrastructure.country.CountryDto; @@ -51,9 +51,11 @@ public CountriesGrid(CountryCriteria criteria) { super.setCriteria(criteria, true); if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { - setSelectionMode(SelectionMode.MULTI); + setCriteria(criteria); + setEagerDataProvider(); } else { - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(); + setCriteria(criteria); } setColumns( @@ -74,19 +76,15 @@ public CountriesGrid(CountryCriteria criteria) { column.setCaption(I18nProperties.getPrefixCaption(CountryDto.I18N_PREFIX, column.getId(), column.getCaption())); } - reload(true); - } - - public void reload(boolean forceFetch) { - if (forceFetch || allCountries == null) { - allCountries = FacadeProvider.getCountryFacade().getIndexList(null, null, null, null); - } reload(); } public void reload() { - this.setItems(createFilteredStream()); setSelectionMode(isInEagerMode() ? SelectionMode.MULTI : SelectionMode.NONE); + if (ViewModelProviders.of(CountriesView.class).get(ViewConfiguration.class).isInEagerMode()) { + setEagerDataProvider(); + } + getDataProvider().refreshAll(); } private Stream createFilteredStream() { @@ -127,4 +125,12 @@ private Stream createFilteredStream() { } + public void setLazyDataProvider() { + setLazyDataProvider(FacadeProvider.getCountryFacade()::getIndexList, FacadeProvider.getCountryFacade()::count); + } + + public void setEagerDataProvider() { + setEagerDataProvider(FacadeProvider.getCountryFacade()::getIndexList); + } + } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesView.java index 25951178790..08ce80b1ceb 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesView.java @@ -18,6 +18,8 @@ import java.util.Collections; import java.util.Set; +import org.apache.commons.lang3.StringUtils; + import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.server.FileDownloader; @@ -96,6 +98,7 @@ public CountriesView() { gridLayout = new VerticalLayout(); gridLayout.addComponent(createFilterBar()); rowCount = new RowCount(Strings.labelNumberOfCountries, 0); + grid.addDataSizeChangeListener(e -> rowCount.update(grid.getDataSize())); gridLayout.addComponent(rowCount); gridLayout.addComponent(grid); gridLayout.setMargin(true); @@ -110,14 +113,14 @@ public CountriesView() { importButton = ButtonHelper.createIconButton(Captions.actionImport, VaadinIcons.UPLOAD, e -> { Window window = VaadinUiUtil.showPopupWindow(new InfrastructureImportLayout(InfrastructureType.COUNTRY)); window.setCaption(I18nProperties.getString(Strings.headingImportCountries)); - window.addCloseListener(c -> grid.reload(true)); + window.addCloseListener(c -> grid.reload()); }, ValoTheme.BUTTON_PRIMARY); addHeaderComponent(importButton); importDefaultCountriesButton = ButtonHelper.createIconButton(Captions.actionImportAllCountries, VaadinIcons.UPLOAD, e -> { Window window = VaadinUiUtil.showPopupWindow(new ImportDefaultCountriesLayout()); window.setCaption(I18nProperties.getString(Strings.headingImportAllCountries)); - window.addCloseListener(c -> grid.reload(true)); + window.addCloseListener(c -> grid.reload()); }, ValoTheme.BUTTON_PRIMARY); addHeaderComponent(importDefaultCountriesButton); } else if (!infrastructureDataEditable) { @@ -169,6 +172,8 @@ public CountriesView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); + searchField.clear(); + criteria.nameCodeLike(StringUtils.EMPTY); grid.setInEagerMode(true); grid.reload(); }); @@ -211,7 +216,7 @@ private HorizontalLayout createFilterBar() { subcontinentFilter.addItems(FacadeProvider.getSubcontinentFacade().getAllActiveAsReference()); subcontinentFilter.addValueChangeListener(e -> { criteria.subcontinent((SubcontinentReferenceDto) e.getProperty().getValue()); - navigateTo(criteria); + grid.reload(); }); filterLayout.addComponent(subcontinentFilter); @@ -294,7 +299,6 @@ public void enter(ViewChangeListener.ViewChangeEvent event) { } updateFilterComponents(); grid.reload(); - rowCount.update(grid.getItemCount()); } public void updateFilterComponents() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsGrid.java index ffa9d9c3a35..8cba5a703fe 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsGrid.java @@ -1,35 +1,25 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System * Copyright © 2016-2021 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.configuration.infrastructure; -import java.util.stream.Collectors; - -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; -import com.vaadin.shared.data.sort.SortDirection; - 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.infrastructure.district.DistrictCriteria; import de.symeda.sormas.api.infrastructure.district.DistrictIndexDto; import de.symeda.sormas.api.user.UserRight; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; @@ -77,34 +67,17 @@ public DistrictsGrid(DistrictCriteria criteria) { } public void reload() { + if (ViewModelProviders.of(DistrictsView.class).get(ViewConfiguration.class).isInEagerMode()) { + setEagerDataProvider(); + } getDataProvider().refreshAll(); } public void setLazyDataProvider() { - - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getDistrictFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> { - return (int) FacadeProvider.getDistrictFacade().count(query.getFilter().orElse(null)); - }); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(FacadeProvider.getDistrictFacade()::getIndexList, FacadeProvider.getDistrictFacade()::count); } public void setEagerDataProvider() { - - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getDistrictFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); + setEagerDataProvider(FacadeProvider.getDistrictFacade()::getIndexList); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsView.java index 511a3a3fe2e..0f19c221e97 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsView.java @@ -18,6 +18,8 @@ import java.util.Collections; import java.util.Set; +import org.apache.commons.lang3.StringUtils; + import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.FileDownloader; @@ -80,6 +82,7 @@ public class DistrictsView extends AbstractConfigurationView { private VerticalLayout gridLayout; private DistrictsGrid grid; private MenuBar bulkOperationsDropdown; + private RowCount rowCount; public DistrictsView() { @@ -95,7 +98,9 @@ public DistrictsView() { grid = new DistrictsGrid(criteria); gridLayout = new VerticalLayout(); gridLayout.addComponent(createFilterBar()); - gridLayout.addComponent(new RowCount(Strings.labelNumberOfDistricts, grid.getItemCount())); + rowCount = new RowCount(Strings.labelNumberOfDistricts, grid.getDataSize()); + grid.addDataSizeChangeListener(e -> rowCount.update(grid.getDataSize())); + gridLayout.addComponent(rowCount); gridLayout.addComponent(grid); gridLayout.setMargin(true); gridLayout.setSpacing(false); @@ -161,6 +166,8 @@ public DistrictsView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); + searchField.clear(); + criteria.nameEpidLike(StringUtils.EMPTY); grid.setEagerDataProvider(); grid.reload(); }); @@ -288,6 +295,7 @@ public void run() { EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); + searchField.setEnabled(!isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesGrid.java index 4a73ff79793..ce14c74349b 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesGrid.java @@ -17,18 +17,11 @@ *******************************************************************************/ package de.symeda.sormas.ui.configuration.infrastructure; -import java.util.stream.Collectors; - -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; -import com.vaadin.shared.data.sort.SortDirection; - import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.infrastructure.facility.FacilityCriteria; import de.symeda.sormas.api.infrastructure.facility.FacilityIndexDto; import de.symeda.sormas.api.user.UserRight; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; @@ -80,32 +73,17 @@ public FacilitiesGrid(FacilityCriteria criteria) { } public void reload() { + if (ViewModelProviders.of(FacilitiesView.class).get(ViewConfiguration.class).isInEagerMode()) { + setEagerDataProvider(); + } getDataProvider().refreshAll(); } public void setLazyDataProvider() { - - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getFacilityFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> (int) FacadeProvider.getFacilityFacade().count(query.getFilter().orElse(null))); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(FacadeProvider.getFacilityFacade()::getIndexList, FacadeProvider.getFacilityFacade()::count); } public void setEagerDataProvider() { - - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getFacilityFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); + setEagerDataProvider(FacadeProvider.getFacilityFacade()::getIndexList); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java index 16dba3ac32b..12ce0b7c015 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java @@ -20,6 +20,7 @@ import java.util.Set; import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; import org.vaadin.hene.popupbutton.PopupButton; import com.vaadin.icons.VaadinIcons; @@ -108,9 +109,9 @@ public FacilitiesView() { grid = new FacilitiesGrid(criteria); gridLayout = new VerticalLayout(); - // gridLayout.addComponent(createHeaderBar()); gridLayout.addComponent(createFilterBar()); - rowCount = new RowCount(Strings.labelNumberOfFacilities, grid.getItemCount()); + rowCount = new RowCount(Strings.labelNumberOfFacilities, grid.getDataSize()); + grid.addDataSizeChangeListener(e -> rowCount.update(grid.getDataSize())); gridLayout.addComponent(rowCount); gridLayout.addComponent(grid); gridLayout.setMargin(true); @@ -125,7 +126,7 @@ public FacilitiesView() { window.setCaption(I18nProperties.getString(Strings.headingImportFacilities)); window.addCloseListener(c -> { grid.reload(); - rowCount.update(grid.getItemCount()); + rowCount.update(grid.getDataSize()); }); }, ValoTheme.BUTTON_PRIMARY); @@ -209,9 +210,11 @@ public FacilitiesView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); + searchField.clear(); + criteria.nameAddressLike(StringUtils.EMPTY); grid.setEagerDataProvider(); grid.reload(); - rowCount.update(grid.getItemCount()); + rowCount.update(grid.getDataSize()); }); btnLeaveBulkEditMode.addClickListener(e -> { bulkOperationsDropdown.setVisible(false); @@ -251,7 +254,7 @@ private HorizontalLayout createFilterBar() { searchField.addTextChangeListener(e -> { criteria.nameAddressLike(e.getText()); grid.reload(); - rowCount.update(grid.getItemCount()); + rowCount.update(grid.getDataSize()); }); filterLayout.addComponent(searchField); @@ -279,7 +282,7 @@ private HorizontalLayout createFilterBar() { countryFilter = addCountryFilter(filterLayout, country -> { criteria.country(country); grid.reload(); - rowCount.update(grid.getItemCount()); + rowCount.update(grid.getDataSize()); }, regionFilter); countryFilter.addValueChangeListener(country -> { CountryReferenceDto countryReferenceDto = (CountryReferenceDto) country.getProperty().getValue(); @@ -398,8 +401,9 @@ public void run() { }, EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); - bulkOperationsDropdown - .setVisible(viewConfiguration.isInEagerMode() && !EntityRelevanceStatus.ALL.equals(criteria.getRelevanceStatus())); + boolean visible = viewConfiguration.isInEagerMode() && !EntityRelevanceStatus.ALL.equals(criteria.getRelevanceStatus()); + bulkOperationsDropdown.setVisible(visible); + searchField.setEnabled(!visible); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } @@ -421,7 +425,7 @@ public void enter(ViewChangeEvent event) { } updateFilterComponents(); grid.reload(); - rowCount.update(grid.getItemCount()); + rowCount.update(grid.getDataSize()); } public void updateFilterComponents() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryGrid.java index aed735ad05b..0715718ff25 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryGrid.java @@ -1,17 +1,10 @@ package de.symeda.sormas.ui.configuration.infrastructure; -import java.util.stream.Collectors; - -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; -import com.vaadin.shared.data.sort.SortDirection; - import de.symeda.sormas.api.FacadeProvider; import de.symeda.sormas.api.i18n.I18nProperties; import de.symeda.sormas.api.infrastructure.pointofentry.PointOfEntryCriteria; import de.symeda.sormas.api.infrastructure.pointofentry.PointOfEntryDto; import de.symeda.sormas.api.user.UserRight; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; @@ -60,34 +53,17 @@ public PointsOfEntryGrid(PointOfEntryCriteria criteria) { } public void reload() { + if (ViewModelProviders.of(PointsOfEntryView.class).get(ViewConfiguration.class).isInEagerMode()) { + setEagerDataProvider(); + } getDataProvider().refreshAll(); } public void setLazyDataProvider() { - - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getPointOfEntryFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> { - return (int) FacadeProvider.getPointOfEntryFacade().count(query.getFilter().orElse(null)); - }); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(FacadeProvider.getPointOfEntryFacade()::getIndexList, FacadeProvider.getPointOfEntryFacade()::count); } public void setEagerDataProvider() { - - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getPointOfEntryFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); + setEagerDataProvider(FacadeProvider.getPointOfEntryFacade()::getIndexList); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java index 895534bd90b..f19013f4b11 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java @@ -18,6 +18,8 @@ import java.util.Collections; import java.util.Set; +import org.apache.commons.lang3.StringUtils; + import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.FileDownloader; @@ -83,6 +85,7 @@ public class PointsOfEntryView extends AbstractConfigurationView { private HorizontalLayout filterLayout; private VerticalLayout gridLayout; private MenuBar bulkOperationsDropdown; + private RowCount rowCount; public PointsOfEntryView() { @@ -98,7 +101,9 @@ public PointsOfEntryView() { grid = new PointsOfEntryGrid(criteria); gridLayout = new VerticalLayout(); gridLayout.addComponent(createFilterBar()); - gridLayout.addComponent(new RowCount(Strings.labelNumberOfPointofEntry, grid.getItemCount())); + rowCount = new RowCount(Strings.labelNumberOfPointofEntry, grid.getDataSize()); + grid.addDataSizeChangeListener(e -> rowCount.update(grid.getDataSize())); + gridLayout.addComponent(rowCount); gridLayout.addComponent(grid); gridLayout.setMargin(true); gridLayout.setSpacing(false); @@ -123,8 +128,11 @@ public PointsOfEntryView() { exportButton.setDescription(I18nProperties.getDescription(Descriptions.descExportButton)); addHeaderComponent(exportButton); - StreamResource streamResource = GridExportStreamResource - .createStreamResourceWithSelectedItems(grid, this::getSelectedRows, ExportEntityName.POINTS_OF_ENTRY, PointsOfEntryGrid.ACTION_BTN_ID); + StreamResource streamResource = GridExportStreamResource.createStreamResourceWithSelectedItems( + grid, + this::getSelectedRows, + ExportEntityName.POINTS_OF_ENTRY, + PointsOfEntryGrid.ACTION_BTN_ID); FileDownloader fileDownloader = new FileDownloader(streamResource); fileDownloader.extend(exportButton); } @@ -155,6 +163,8 @@ public PointsOfEntryView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); + searchField.clear(); + criteria.nameLike(StringUtils.EMPTY); grid.setEagerDataProvider(); grid.reload(); }); @@ -312,8 +322,9 @@ private HorizontalLayout createFilterBar() { }, EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); - bulkOperationsDropdown - .setVisible(viewConfiguration.isInEagerMode() && !EntityRelevanceStatus.ALL.equals(criteria.getRelevanceStatus())); + boolean visible = viewConfiguration.isInEagerMode() && !EntityRelevanceStatus.ALL.equals(criteria.getRelevanceStatus()); + bulkOperationsDropdown.setVisible(visible); + searchField.setEnabled(!visible); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsGrid.java index 30d339e76e6..98ff84e3112 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsGrid.java @@ -1,37 +1,27 @@ /* * SORMAS® - Surveillance Outbreak Response Management & Analysis System * Copyright © 2016-2021 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.configuration.infrastructure; -import java.util.stream.Collectors; - import org.apache.commons.lang3.ArrayUtils; -import com.vaadin.data.provider.DataProvider; -import com.vaadin.data.provider.ListDataProvider; -import com.vaadin.shared.data.sort.SortDirection; - 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.infrastructure.region.RegionCriteria; import de.symeda.sormas.api.infrastructure.region.RegionIndexDto; import de.symeda.sormas.api.user.UserRight; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; import de.symeda.sormas.ui.ViewModelProviders; @@ -89,34 +79,17 @@ public RegionsGrid(RegionCriteria criteria) { } public void reload() { + if (ViewModelProviders.of(RegionsView.class).get(ViewConfiguration.class).isInEagerMode()) { + setEagerDataProvider(); + } getDataProvider().refreshAll(); } public void setLazyDataProvider() { - - DataProvider dataProvider = DataProvider.fromFilteringCallbacks( - query -> FacadeProvider.getRegionFacade() - .getIndexList( - query.getFilter().orElse(null), - query.getOffset(), - query.getLimit(), - query.getSortOrders() - .stream() - .map(sortOrder -> new SortProperty(sortOrder.getSorted(), sortOrder.getDirection() == SortDirection.ASCENDING)) - .collect(Collectors.toList())) - .stream(), - query -> { - return (int) FacadeProvider.getRegionFacade().count(query.getFilter().orElse(null)); - }); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(FacadeProvider.getRegionFacade()::getIndexList, FacadeProvider.getRegionFacade()::count); } public void setEagerDataProvider() { - - ListDataProvider dataProvider = - DataProvider.fromStream(FacadeProvider.getRegionFacade().getIndexList(getCriteria(), null, null, null).stream()); - setDataProvider(dataProvider); - setSelectionMode(SelectionMode.MULTI); + setEagerDataProvider(FacadeProvider.getRegionFacade()::getIndexList); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsView.java index 1a7ee86d4bc..5463802fc9f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsView.java @@ -18,6 +18,8 @@ import java.util.Collections; import java.util.Set; +import org.apache.commons.lang3.StringUtils; + import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.FileDownloader; @@ -79,6 +81,7 @@ public class RegionsView extends AbstractConfigurationView { protected Button createButton; protected Button importButton; private MenuBar bulkOperationsDropdown; + private RowCount rowCount; public RegionsView() { @@ -93,7 +96,9 @@ public RegionsView() { grid = new RegionsGrid(criteria); gridLayout = new VerticalLayout(); gridLayout.addComponent(createFilterBar()); - gridLayout.addComponent(new RowCount(Strings.labelNumberOfRegions, grid.getItemCount())); + rowCount = new RowCount(Strings.labelNumberOfRegions, grid.getDataSize()); + grid.addDataSizeChangeListener(e -> rowCount.update(grid.getDataSize())); + gridLayout.addComponent(rowCount); gridLayout.addComponent(grid); gridLayout.setMargin(true); gridLayout.setSpacing(false); @@ -158,6 +163,8 @@ public RegionsView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); + searchField.clear(); + criteria.nameEpidLike(StringUtils.EMPTY); grid.setEagerDataProvider(); grid.reload(); }); @@ -255,6 +262,7 @@ private HorizontalLayout createFilterBar() { EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); + searchField.setEnabled(!isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsGrid.java index 3ffaeb33040..3334bad4c61 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsGrid.java @@ -19,11 +19,11 @@ import java.util.function.Predicate; import java.util.stream.Stream; -import de.symeda.sormas.api.feature.FeatureType; import org.apache.commons.lang3.StringUtils; import de.symeda.sormas.api.EntityRelevanceStatus; 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.infrastructure.subcontinent.SubcontinentCriteria; import de.symeda.sormas.api.infrastructure.subcontinent.SubcontinentIndexDto; @@ -48,9 +48,11 @@ public SubcontinentsGrid(SubcontinentCriteria criteria) { super.setCriteria(criteria, true); if (isInEagerMode() && UserProvider.getCurrent().hasUserRight(UserRight.PERFORM_BULK_OPERATIONS)) { - setSelectionMode(SelectionMode.MULTI); + setCriteria(criteria); + setEagerDataProvider(); } else { - setSelectionMode(SelectionMode.NONE); + setLazyDataProvider(); + setCriteria(criteria); } setColumns( @@ -68,20 +70,22 @@ public SubcontinentsGrid(SubcontinentCriteria criteria) { for (Column column : getColumns()) { column.setCaption(I18nProperties.getPrefixCaption(SubcontinentIndexDto.I18N_PREFIX, column.getId(), column.getCaption())); } - - reload(true); } - public void reload(boolean forceFetch) { - if (forceFetch || allSubcontinents == null) { - allSubcontinents = FacadeProvider.getSubcontinentFacade().getIndexList(null, null, null, null); + public void reload() { + setSelectionMode(isInEagerMode() ? SelectionMode.MULTI : SelectionMode.NONE); + if (ViewModelProviders.of(SubcontinentsView.class).get(ViewConfiguration.class).isInEagerMode()) { + setEagerDataProvider(); } - reload(); + getDataProvider().refreshAll(); } - public void reload() { - this.setItems(createFilteredStream()); - setSelectionMode(isInEagerMode() ? SelectionMode.MULTI : SelectionMode.NONE); + public void setLazyDataProvider() { + setLazyDataProvider(FacadeProvider.getSubcontinentFacade()::getIndexList, FacadeProvider.getSubcontinentFacade()::count); + } + + public void setEagerDataProvider() { + setEagerDataProvider(FacadeProvider.getSubcontinentFacade()::getIndexList); } private Stream createFilteredStream() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsView.java index f46769a9ac3..562abc63d5e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsView.java @@ -18,6 +18,8 @@ import java.util.Collections; import java.util.Set; +import org.apache.commons.lang3.StringUtils; + import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.server.FileDownloader; @@ -90,7 +92,8 @@ public SubcontinentsView() { grid = new SubcontinentsGrid(criteria); gridLayout = new VerticalLayout(); gridLayout.addComponent(createFilterBar()); - rowCount = new RowCount(Strings.labelNumberOfSubcontinents, grid.getItemCount()); + rowCount = new RowCount(Strings.labelNumberOfSubcontinents, grid.getDataSize()); + grid.addDataSizeChangeListener(e -> rowCount.update(grid.getDataSize())); gridLayout.addComponent(rowCount); gridLayout.addComponent(grid); gridLayout.setMargin(true); @@ -105,14 +108,14 @@ public SubcontinentsView() { importButton = ButtonHelper.createIconButton(Captions.actionImport, VaadinIcons.UPLOAD, e -> { Window window = VaadinUiUtil.showPopupWindow(new InfrastructureImportLayout(InfrastructureType.SUBCONTINENT)); window.setCaption(I18nProperties.getString(Strings.headingImportSubcontinents)); - window.addCloseListener(c -> grid.reload(true)); + window.addCloseListener(c -> grid.reload()); }, ValoTheme.BUTTON_PRIMARY); addHeaderComponent(importButton); importDefaultSubcontinentsButton = ButtonHelper.createIconButton(Captions.actionImportAllSubcontinents, VaadinIcons.UPLOAD, e -> { Window window = VaadinUiUtil.showPopupWindow(new ImportDefaultSubcontinentsLayout()); window.setCaption(I18nProperties.getString(Strings.headingImportAllSubcontinents)); - window.addCloseListener(c -> grid.reload(true)); + window.addCloseListener(c -> grid.reload()); }, ValoTheme.BUTTON_PRIMARY); addHeaderComponent(importDefaultSubcontinentsButton); } else if (!infrastructureDataEditable) { @@ -164,6 +167,8 @@ public SubcontinentsView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); + searchField.clear(); + criteria.nameLike(StringUtils.EMPTY); grid.setInEagerMode(true); grid.reload(); }); @@ -205,7 +210,7 @@ private HorizontalLayout createFilterBar() { continentFilter.addItems(FacadeProvider.getContinentFacade().getAllActiveAsReference()); continentFilter.addValueChangeListener(e -> { criteria.continent((ContinentReferenceDto) e.getProperty().getValue()); - navigateTo(criteria); + grid.reload(); }); filterLayout.addComponent(continentFilter); @@ -268,6 +273,7 @@ private HorizontalLayout createFilterBar() { EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); + searchField.setEnabled(!isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } @@ -290,7 +296,6 @@ public void enter(ViewChangeListener.ViewChangeEvent event) { } updateFilterComponents(); grid.reload(); - rowCount.update(grid.getItemCount()); } public void updateFilterComponents() { diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FilteredGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FilteredGrid.java index 77280dc7a55..ea363f8823d 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FilteredGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FilteredGrid.java @@ -256,10 +256,10 @@ public void bulkActionHandler(Consumer callback, boolean allowAdminOverride /** * @deprecated Use {@link #getDataSize()}, because this call triggers another count query for lazy {@link DataProvider}s. */ - @Deprecated - public int getItemCount() { - return getDataProvider().size(new Query<>()); - } +// @Deprecated +// public int getItemCount() { +// return getDataProvider().size(new Query<>()); +// } /** * Add's a column to the left hand side of the grid complete with an edit-logo From ce42f6eb5d83072a3e64837930884692f504442e Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Thu, 15 Dec 2022 17:07:52 +0100 Subject: [PATCH 100/147] fix --- .../pages/application/cases/EpidemiologicalDataCasePage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java index fd33b4c0420..1658256dc3a 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EpidemiologicalDataCasePage.java @@ -39,7 +39,7 @@ public class EpidemiologicalDataCasePage { public static final By ACTIVITY_AS_CASE_NEW_ENTRY_BUTTON_DE = By.id("Neue Einreise"); public static final By EDIT_TRAVEL_ENTRY_BUTTON = By.xpath( - "//div[@location='travelEntries']//div[@class='v-button v-widget link v-button-link compact v-button-compact']"); + "//div[@location='travelEntries']//div[@class='v-button v-widget link v-button-link compact v-button-compact caption-overflow-label v-button-caption-overflow-label']"); public static final By RISK_AREA_OPTIONS = By.cssSelector(".v-window #riskArea .v-select-option"); public static final By INDOORS_OPTIONS = By.cssSelector(".v-window #indoors .v-select-option"); public static final By OUTDOORS_OPTIONS = By.cssSelector(".v-window #outdoors .v-select-option"); From 71a8ee9d6c4e9e39bbc82e1ec5daa76ae89dc837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 15 Dec 2022 17:12:32 +0100 Subject: [PATCH 101/147] [GITFLOW]Updating development poms to hotfix version to avoid merge conflicts --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index ec8a91fd49e..2162b222ed5 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.5 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 6a49b253781..5e7e204d0b5 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.5 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 5a7625052ac..fa5453d9e04 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.5 ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index 91db21e5987..5187c5cb78d 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.5 ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 8f1cf55d2b9..4ede00adbc5 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.78.0-SNAPSHOT + 1.77.5 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 935d51a2397..36771f0cd27 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.5 ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 05d2cab9ca1..7d7065ea01e 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.5 ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 6c507e70a4e..9404b1a0868 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.5 ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 2798d0cc469..52edd2ea36d 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.77.5 ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 04695198254..7671e0edb7e 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.5 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 7ceea1349a7..6228e84df16 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.77.5 ../sormas-base 4.0.0 From 88786d2b07b7fbe754b014dbe47a2f6fcff0f877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Thu, 15 Dec 2022 17:12:45 +0100 Subject: [PATCH 102/147] [GITFLOW]Updating develop poms back to pre merge state --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index 2162b222ed5..ec8a91fd49e 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.77.5 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 5e7e204d0b5..6a49b253781 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.5 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index fa5453d9e04..5a7625052ac 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.5 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index 5187c5cb78d..91db21e5987 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.77.5 + 1.78.0-SNAPSHOT ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 4ede00adbc5..8f1cf55d2b9 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.77.5 + 1.78.0-SNAPSHOT 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 36771f0cd27..935d51a2397 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.5 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 7d7065ea01e..05d2cab9ca1 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.5 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 9404b1a0868..6c507e70a4e 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.5 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 52edd2ea36d..2798d0cc469 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.77.5 + 1.78.0-SNAPSHOT ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 7671e0edb7e..04695198254 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.5 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 6228e84df16..7ceea1349a7 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.77.5 + 1.78.0-SNAPSHOT ../sormas-base 4.0.0 From 4bdace4eb7d56227a689caf4ab1939d9cb0113d9 Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Thu, 15 Dec 2022 18:23:18 +0200 Subject: [PATCH 103/147] #10958 - Avoid directories calling count method several times --- .../java/de/symeda/sormas/ui/utils/FilteredGrid.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FilteredGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FilteredGrid.java index ea363f8823d..15c7a25f115 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FilteredGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/utils/FilteredGrid.java @@ -252,15 +252,6 @@ public void bulkActionHandler(Consumer callback, boolean allowAdminOverride } - // TODO #10958 Remove getItemCount(), move everything to getDataSize() - /** - * @deprecated Use {@link #getDataSize()}, because this call triggers another count query for lazy {@link DataProvider}s. - */ -// @Deprecated -// public int getItemCount() { -// return getDataProvider().size(new Query<>()); -// } - /** * Add's a column to the left hand side of the grid complete with an edit-logo * From 6b4fe51fe74a36385859cc56cf8e1b1babd8e817 Mon Sep 17 00:00:00 2001 From: Levente Gal <62599627+leventegal-she@users.noreply.github.com> Date: Fri, 16 Dec 2022 09:37:18 +0200 Subject: [PATCH 104/147] #8471 S2S_automatic update in the share-box - force new transaction on tha backend share method (#11198) Co-authored-by: Levente Gal --- .../AbstractSormasToSormasInterface.java | 5 +-- .../caze/SormasToSormasCaseFacadeEjb.java | 4 +++ .../SormasToSormasContactFacadeEjb.java | 4 +++ .../event/SormasToSormasEventFacadeEjb.java | 4 +++ .../SormasToSormasController.java | 31 +++++++++---------- .../SormasToSormasListComponent.java | 6 ++-- 6 files changed, 32 insertions(+), 22 deletions(-) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java index 59242b35879..b1a378a0a8b 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/AbstractSormasToSormasInterface.java @@ -206,8 +206,9 @@ protected AbstractSormasToSormasInterface( } @Override - @Transactional(rollbackOn = { - Exception.class }) + @Transactional(value = Transactional.TxType.REQUIRES_NEW, + rollbackOn = { + Exception.class }) @DenyAll public void share(List entityUuids, @Valid SormasToSormasOptionsDto options) throws SormasToSormasException { if (featureConfigurationFacade.isFeatureEnabled(FeatureType.SORMAS_TO_SORMAS_ACCEPT_REJECT)) { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java index 0f60ae31c84..be3eaf28410 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/caze/SormasToSormasCaseFacadeEjb.java @@ -31,6 +31,7 @@ import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; +import javax.transaction.Transactional; import javax.validation.Valid; import de.symeda.sormas.api.caze.CaseDataDto; @@ -106,6 +107,9 @@ public SormasToSormasCaseFacadeEjb() { } @Override + @Transactional(value = Transactional.TxType.REQUIRES_NEW, + rollbackOn = { + Exception.class }) @RightsAllowed(UserRight._SORMAS_TO_SORMAS_SHARE) public void share(List entityUuids, @Valid SormasToSormasOptionsDto options) throws SormasToSormasException { if (!userService.hasRight(UserRight.CASE_EDIT) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/SormasToSormasContactFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/SormasToSormasContactFacadeEjb.java index 875640200a2..fd07723acbe 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/SormasToSormasContactFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/contact/SormasToSormasContactFacadeEjb.java @@ -30,6 +30,7 @@ import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; +import javax.transaction.Transactional; import de.symeda.sormas.api.contact.ContactDto; import de.symeda.sormas.api.i18n.Captions; @@ -104,6 +105,9 @@ public SormasToSormasContactFacadeEjb() { } @Override + @Transactional(value = Transactional.TxType.REQUIRES_NEW, + rollbackOn = { + Exception.class }) @RightsAllowed(UserRight._SORMAS_TO_SORMAS_SHARE) public void share(List entityUuids, SormasToSormasOptionsDto options) throws SormasToSormasException { if (!userService.hasRight(UserRight.CONTACT_EDIT) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java index 9a924e005e9..fb8572fa262 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sormastosormas/entities/event/SormasToSormasEventFacadeEjb.java @@ -30,6 +30,7 @@ import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; +import javax.transaction.Transactional; import javax.validation.Valid; import de.symeda.sormas.api.event.EventDto; @@ -98,6 +99,9 @@ public SormasToSormasEventFacadeEjb() { } @Override + @Transactional(value = Transactional.TxType.REQUIRES_NEW, + rollbackOn = { + Exception.class }) @RightsAllowed(UserRight._SORMAS_TO_SORMAS_SHARE) public void share(List entityUuids, @Valid SormasToSormasOptionsDto options) throws SormasToSormasException { if (!userService.hasRight(UserRight.EVENT_EDIT) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasController.java index bf566e9dc3d..392e79aab75 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasController.java @@ -57,6 +57,7 @@ import de.symeda.sormas.api.sormastosormas.validation.ValidationErrors; import de.symeda.sormas.api.utils.DataHelper; import de.symeda.sormas.ui.ControllerProvider; +import de.symeda.sormas.ui.SormasUI; import de.symeda.sormas.ui.utils.CommitDiscardWrapperComponent; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.VaadinUiUtil; @@ -70,14 +71,13 @@ public void registerViews(Navigator navigator) { navigator.addView(ShareRequestsView.VIEW_NAME, ShareRequestsView.class); } - public void shareCaseFromDetailsPage(CaseDataDto caze, Runnable callback) { + public void shareCaseFromDetailsPage(CaseDataDto caze) { List currentShares = FacadeProvider.getSormasToSormasShareInfoFacade() .getIndexList(new SormasToSormasShareInfoCriteria().caze(caze.toReference()), null, null); - shareToSormasFromDetailPage(options -> { - FacadeProvider.getSormasToSormasCaseFacade().share(Collections.singletonList(caze.getUuid()), options); - callback.run(); - }, SormasToSormasOptionsForm.forCase(caze, currentShares)); + shareToSormasFromDetailPage( + options -> FacadeProvider.getSormasToSormasCaseFacade().share(Collections.singletonList(caze.getUuid()), options), + SormasToSormasOptionsForm.forCase(caze, currentShares)); } public void shareSelectedCases(Collection selectedRows, Runnable callback) { @@ -89,7 +89,7 @@ public void shareSelectedCases(Collection selectedRows, new SormasToSormasOptionsDto()); } - public void shareContactFromDetailsPage(ContactDto contact, Runnable callback) { + public void shareContactFromDetailsPage(ContactDto contact) { if (contact.getCaze() == null) { VaadinUiUtil.showSimplePopupWindow( I18nProperties.getString(Strings.headingSormasToSormasCantShareContactWithoutCase), @@ -99,10 +99,9 @@ public void shareContactFromDetailsPage(ContactDto contact, Runnable callback) { List currentShares = FacadeProvider.getSormasToSormasShareInfoFacade() .getIndexList(new SormasToSormasShareInfoCriteria().contact(contact.toReference()), null, null); - shareToSormasFromDetailPage(options -> { - FacadeProvider.getSormasToSormasContactFacade().share(Collections.singletonList(contact.getUuid()), options); - callback.run(); - }, SormasToSormasOptionsForm.forContact(contact, currentShares)); + shareToSormasFromDetailPage( + options -> FacadeProvider.getSormasToSormasContactFacade().share(Collections.singletonList(contact.getUuid()), options), + SormasToSormasOptionsForm.forContact(contact, currentShares)); } public void shareSelectedContacts(Collection selectedRows, Runnable callback) { @@ -114,14 +113,13 @@ public void shareSelectedContacts(Collection selected new SormasToSormasOptionsDto()); } - public void shareEventFromDetailsPage(EventDto event, Runnable callback) { + public void shareEventFromDetailsPage(EventDto event) { List currentShares = FacadeProvider.getSormasToSormasShareInfoFacade() .getIndexList(new SormasToSormasShareInfoCriteria().event(event.toReference()), null, null); - shareToSormasFromDetailPage(options -> { - FacadeProvider.getSormasToSormasEventFacade().share(Collections.singletonList(event.getUuid()), options); - callback.run(); - }, SormasToSormasOptionsForm.forEvent(event, currentShares)); + shareToSormasFromDetailPage( + options -> FacadeProvider.getSormasToSormasEventFacade().share(Collections.singletonList(event.getUuid()), options), + SormasToSormasOptionsForm.forEvent(event, currentShares)); } public void shareLabMessage(ExternalMessageDto labMessage, Runnable callback) { @@ -328,8 +326,7 @@ public void revokeShareRequest(String requestUuid, Runnable callback) { } private void shareToSormasFromDetailPage(HandleShareWithOptions handleShareWithOptions, SormasToSormasOptionsForm optionsForm) { - handleShareWithOptions(handleShareWithOptions, () -> { - }, optionsForm, new SormasToSormasOptionsDto()); + handleShareWithOptions(handleShareWithOptions, SormasUI::refreshView, optionsForm, new SormasToSormasOptionsDto()); } private void handleShareWithOptions( diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasListComponent.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasListComponent.java index a73a2866b54..4ec9d147c90 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasListComponent.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/sormastosormas/SormasToSormasListComponent.java @@ -82,7 +82,7 @@ public SormasToSormasListComponent(CaseDataDto caze, boolean isEditAllowed) { initLayout( caze.getSormasToSormasOriginInfo(), () -> FacadeProvider.getSormasToSormasCaseFacade().getAllShares(caze.getUuid()), - e -> ControllerProvider.getSormasToSormasController().shareCaseFromDetailsPage(caze, this::reloadList)); + e -> ControllerProvider.getSormasToSormasController().shareCaseFromDetailsPage(caze)); } public SormasToSormasListComponent(ContactDto contact, boolean isEditAllowed) { @@ -93,7 +93,7 @@ public SormasToSormasListComponent(ContactDto contact, boolean isEditAllowed) { initLayout( contact.getSormasToSormasOriginInfo(), () -> FacadeProvider.getSormasToSormasContactFacade().getAllShares(contact.getUuid()), - e -> ControllerProvider.getSormasToSormasController().shareContactFromDetailsPage(contact, this::reloadList)); + e -> ControllerProvider.getSormasToSormasController().shareContactFromDetailsPage(contact)); } public SormasToSormasListComponent(SampleDto sample) { @@ -117,7 +117,7 @@ public SormasToSormasListComponent(EventDto event) { initLayout( event.getSormasToSormasOriginInfo(), () -> FacadeProvider.getSormasToSormasEventFacade().getAllShares(event.getUuid()), - e -> ControllerProvider.getSormasToSormasController().shareEventFromDetailsPage(event, this::reloadList)); + e -> ControllerProvider.getSormasToSormasController().shareEventFromDetailsPage(event)); } public SormasToSormasListComponent(EventParticipantDto eventParticipant) { From 09ddd57e7305da07e642c95a530fd1f3bf478657 Mon Sep 17 00:00:00 2001 From: Razvan Date: Fri, 16 Dec 2022 10:31:06 +0200 Subject: [PATCH 105/147] #5762LinkEventToCaseTest : created test --- .../pages/application/cases/EditCasePage.java | 4 +++ .../application/events/EditEventPage.java | 2 +- .../api/commonSteps/ResponseChecksSteps.java | 6 +++-- .../web/application/cases/EditCaseSteps.java | 26 +++++++++++++------ .../application/events/EditEventSteps.java | 12 ++++++--- .../events/EventDirectorySteps.java | 6 ++++- .../users/UserManagementSteps.java | 20 ++++++++------ .../features/sanity/web/Event.feature | 21 +++++++++++++++ 8 files changed, 74 insertions(+), 23 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java index ddafefb66e2..03f8d86ebf0 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/cases/EditCasePage.java @@ -349,6 +349,10 @@ public static By getByImmunizationUuid(String immunizationUuid) { public static final By VACCINATION_CARD_INFO_POPUP_TEXT = By.xpath("//div[@class='v-tooltip-text']"); public static final By LINK_EVENT_BUTTON_DE = By.id("Ereignis verkn\u00FCpfen"); + public static final By LINK_EVENT_BUTTON = By.xpath("//div[@id='Link event']"); + public static final By LINKED_EVENT_TITLE = + By.xpath( + "//div[@location='events']//div[@class='v-label v-widget bold v-label-bold uppercase v-label-uppercase v-has-width']"); public static final By ADD_A_PARTICIPANT_HEADER_DE = By.xpath("//*[contains(text(),'Neuen Ereignisteilnehmer hinzuf\u00FCgen')]"); public static final By CHANGE_DISEASE_CONFIRMATION_POPUP = diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java index 7cecca2bde6..916e4a705f3 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java @@ -32,7 +32,7 @@ public class EditEventPage { public static final By EVENT_ACTIONS_TAB = By.cssSelector("#tab-events-eventactions span"); public static final By UUID_INPUT = By.id("uuid"); public static final By TITLE_INPUT = By.cssSelector("#eventTitle"); - public static final By SAVE_BUTTON = By.id("commit"); + public static final By SAVE_BUTTON = By.cssSelector(".popupContent #commit"); public static final By SAVE_BUTTON_FOR_POPUP_WINDOWS = By.cssSelector(".popupContent #commit"); public static final By EVENT_STATUS_OPTIONS = By.cssSelector("#eventStatus .v-select-option label"); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/commonSteps/ResponseChecksSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/commonSteps/ResponseChecksSteps.java index 91ebe8bd36a..884b4cb5131 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/commonSteps/ResponseChecksSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/api/commonSteps/ResponseChecksSteps.java @@ -36,7 +36,8 @@ public ResponseChecksSteps(ApiState apiState, RestAssuredClient restAssuredClien Assert.fail("Response body call is empty!"); } if (responseBody.contains("TRANSACTIONROLLEDBACKEXCEPTION")) { - Assert.fail("API call failed due to wrong data used in sent json! [TRANSACTIONROLLEDBACKEXCEPTION]"); + Assert.fail( + "API call failed due to wrong data used in sent json! [TRANSACTIONROLLEDBACKEXCEPTION]"); } String regexUpdatedResponseBody = responseBody.replaceAll("[^a-zA-Z0-9]", ""); Assert.assertEquals( @@ -51,7 +52,8 @@ public ResponseChecksSteps(ApiState apiState, RestAssuredClient restAssuredClien Assert.fail("Response body call is empty!"); } if (responseBody.contains("TRANSACTIONROLLEDBACKEXCEPTION")) { - Assert.fail("API call failed due to wrong data used in sent json! [TRANSACTIONROLLEDBACKEXCEPTION]"); + Assert.fail( + "API call failed due to wrong data used in sent json! [TRANSACTIONROLLEDBACKEXCEPTION]"); } String regexUpdatedResponseBody = responseBody.replaceAll("[^a-zA-Z0-9]", ""); Assert.assertEquals( diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index 881e5b6b4aa..bca2e2664b7 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java @@ -198,7 +198,6 @@ import static org.sormas.e2etests.pages.application.contacts.EditContactPage.ACTION_CANCEL_POPUP; import static org.sormas.e2etests.pages.application.contacts.EditContactPage.END_OF_PROCESSING_DATE_POPUP_INPUT; import static org.sormas.e2etests.pages.application.contacts.EditContactPage.FOLLOW_UP_UNTIL_DATE; -import static org.sormas.e2etests.pages.application.contacts.EditContactPage.LINK_EVENT_BUTTON; import static org.sormas.e2etests.pages.application.contacts.EditContactPage.SOURCE_CASE_WINDOW_FIRST_RESULT_OPTION; import static org.sormas.e2etests.pages.application.contacts.EditContactPage.SOURCE_CASE_WINDOW_SEARCH_CASE_BUTTON; import static org.sormas.e2etests.pages.application.contacts.EditContactPage.UUID_INPUT; @@ -2334,6 +2333,14 @@ public EditCaseSteps( webDriverHelpers.clickOnWebElementBySelector(LINK_EVENT_BUTTON_DE); }); + Then( + "^I click Link Event button on Edit Case Page$", + () -> { + webDriverHelpers.waitForPageLoadingSpinnerToDisappear(20); + webDriverHelpers.waitUntilElementIsVisibleAndClickable(LINK_EVENT_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(LINK_EVENT_BUTTON); + }); + And( "^I click SAVE in Add Event Participant form on Edit Case Page for DE$", () -> { @@ -2351,13 +2358,6 @@ public EditCaseSteps( webDriverHelpers.waitForPageLoadingSpinnerToDisappear(30); }); - When( - "^I click Link Event button on Edit Case Page$", - () -> { - webDriverHelpers.scrollToElement(LINK_EVENT_BUTTON); - webDriverHelpers.clickOnWebElementBySelector(LINK_EVENT_BUTTON); - }); - When( "I check if disease is set for {string} in Case Edit Directory", (String disease) -> { @@ -2620,6 +2620,16 @@ public EditCaseSteps( (String text) -> { Assert.assertTrue(webDriverHelpers.isElementPresent(checkIfTextExists(text))); }); + And( + "I validate last created via API Event data is displayed under Linked Events section", + () -> { + webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LINKED_EVENT_TITLE); + softly.assertEquals( + webDriverHelpers.getTextFromWebElement(LINKED_EVENT_TITLE), + apiState.getCreatedEvent().getEventTitle(), + "Event title is not correct"); + softly.assertAll(); + }); } private Vaccination collectVaccinationData() { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index 7db948e7213..5fcac7cd207 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -219,6 +219,7 @@ import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.openqa.selenium.By; import org.sormas.e2etests.entities.pojo.helpers.ComparisonHelper; import org.sormas.e2etests.entities.pojo.web.Event; import org.sormas.e2etests.entities.pojo.web.EventGroup; @@ -745,9 +746,14 @@ public EditEventSteps( When( "I click on save button in Add Participant form", () -> { - webDriverHelpers.clickOnWebElementBySelector(SAVE_BUTTON); - TimeUnit.SECONDS.sleep(1); // wait for reaction - webDriverHelpers.waitForPageLoaded(); + webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(SAVE_BUTTON); + TimeUnit.SECONDS.sleep(2); // needed for button to be available + int attempts = 0; + do { + webDriverHelpers.clickOnWebElementBySelector(SAVE_BUTTON); + attempts++; + } while (attempts < 5 + && webDriverHelpers.isElementPresent(By.cssSelector(".v-window-wrap"))); }); When( "I add a participant to the event", diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java index 6e12309403c..1e2c85a081a 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EventDirectorySteps.java @@ -434,7 +434,11 @@ public EventDirectorySteps( When( "^I click on SAVE button in Link Event to group form$", - () -> webDriverHelpers.clickOnWebElementBySelector(SAVE_BUTTON_IN_LINK_FORM)); + () -> { + webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable( + SAVE_BUTTON_IN_LINK_FORM); + webDriverHelpers.clickOnWebElementBySelector(SAVE_BUTTON_IN_LINK_FORM); + }); When( "^I click on Linked Group Id on Edit Event Page$", () -> webDriverHelpers.clickOnWebElementBySelector(LINKED_EVENT_GROUP_ID)); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java index 89e21202214..2f6389317c0 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java @@ -135,14 +135,16 @@ public UserManagementSteps( Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(ACTIVE_INACTIVE_COMBOBOX, "Active"); -// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); -// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); + // + // webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); + // webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfActiveUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(ACTIVE_INACTIVE_COMBOBOX, "Inactive"); -// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); -// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); + // + // webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); + // webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfInactiveUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); @@ -163,8 +165,9 @@ public UserManagementSteps( Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(USER_ROLES_COMBOBOX, "National User"); -// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); -// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); + // + // webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); + // webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfSpecificUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); @@ -186,8 +189,9 @@ public UserManagementSteps( Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(REGION_COMBOBOX_USER_MANAGEMENT, "Bayern"); -// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); -// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); + // + // webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); + // webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfSpecificUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature index 8e267787599..6dde7ec4813 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature @@ -1428,3 +1428,24 @@ Feature: Create events And I click on Bulk Actions combobox in Event Parcitipant Tab And I click on Create quarantine order documents from bulk actions menu in Event Participant Tab Then I verify the warning message 'No event participants selected' is displayed + + @#5762 @env_main + Scenario: Link Event to a Case + Given API: I create a new person + Then API: I check that POST call body is "OK" + And API: I check that POST call status code is 200 + Then API: I create a new case + Then API: I check that POST call body is "OK" + And API: I check that POST call status code is 200 + Given API: I create a new event + Then API: I check that POST call body is "OK" + And API: I check that POST call status code is 200 + Given I log in as a National User + And I click on the Cases button from navbar + And I open the last created Case via API + Then I click Link Event button on Edit Case Page + And I fill Event Id filter in Link to Event form with last created via API Event uuid + And I click first result in grid on Link to Event form + And I click on SAVE button in Link Event to group form + Then I click on save button in Add Participant form + And I validate last created via API Event data is displayed under Linked Events section \ No newline at end of file From 4f5cf66fca6e4bbcfc8ad10ab02860914e994733 Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Fri, 16 Dec 2022 12:52:37 +0100 Subject: [PATCH 106/147] fixes --- .../java/org/sormas/e2etests/pages/application/AboutPage.java | 2 +- .../src/test/resources/features/sanity/web/About.feature | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/AboutPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/AboutPage.java index 7590f847251..f9eab4dc6d0 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/AboutPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/AboutPage.java @@ -4,7 +4,7 @@ public class AboutPage { public static final By DATA_DICTIONARY_BUTTON = By.id("aboutDataDictionary"); - public static final By DATA_PROTECTION_DICTIONARY_BUTTON = By.id("aboutDataDictionary"); + public static final By DATA_PROTECTION_DICTIONARY_BUTTON = By.id("aboutDataProtectionDictionary"); public static final By CASE_CLASSIFICATION_RULES_HYPERLINK = By.id("aboutCaseClassificationRules"); public static final By SORMAS_VERSION_LINK = diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature index fde3a1e099c..a91b9f353a6 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature @@ -29,11 +29,12 @@ Feature: About Directory end to end tests Then I click on Case Classification Rules hyperlink and download HTML file in About directory Then I delete Case Classification Html downloaded file from About Directory +#Change "Data Protection Dictonary" to "Data Dictionary" @env_main @#9768 @ExcludedFromRelease Scenario: Check Data Protection Dictionary existence and download Given I log in as a Admin User And I click on the About button from navbar - And I click on Data Protection Dictionary hyperlink and download XLSX file from About directory + And I click on Data Dictionary hyperlink and download XLSX file from About directory And I validate data from downloaded XLSX Data Protection Dictionary file And I delete Data Protection Dictionary downloaded file from About Directory From 414e5fc21c7f490b067d3ab5a480f9107853734c Mon Sep 17 00:00:00 2001 From: Adrian Dinu Date: Fri, 16 Dec 2022 13:58:27 +0200 Subject: [PATCH 107/147] Bug/10525 multiple cases created from same sample (#11168) * #10525 find duplicated case with pathogen tests * #10525 dont show modal view if are duplicated cases * #10525 refactor code after code review --- .../de/symeda/sormas/api/caze/CaseFacade.java | 3 ++ .../sormas/backend/caze/CaseFacadeEjb.java | 24 +++++++++++++ .../sormas/backend/sample/SampleJoins.java | 9 +++++ .../sormas/backend/sample/SampleService.java | 16 +++++++++ .../backend/caze/CaseFacadeEjbTest.java | 35 +++++++++++++++++++ .../ui/samples/PathogenTestController.java | 15 ++++---- 6 files changed, 96 insertions(+), 6 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 b4fd9cddd0a..46e2321d799 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 @@ -48,6 +48,7 @@ import de.symeda.sormas.api.messaging.ManualMessageLogDto; import de.symeda.sormas.api.messaging.MessageType; import de.symeda.sormas.api.person.PersonReferenceDto; +import de.symeda.sormas.api.sample.PathogenTestDto; import de.symeda.sormas.api.utils.DataHelper.Pair; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.ValidationRuntimeException; @@ -204,6 +205,8 @@ void saveBulkEditWithFacilities( List getDuplicates(@Valid CasePersonDto casePerson); + List getDuplicatesWithPathogenTest(@Valid CaseDataDto caseDataDto, PathogenTestDto pathogenTestDto); + List getByPersonUuids(List personUuids); List getByExternalId(String externalId); 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 6a33247b3d7..b28f9068fb2 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 @@ -4185,6 +4185,30 @@ public List getDuplicates(@Valid CasePersonDto casePerson, int re .collect(Collectors.toList()); } + @Override + public List getDuplicatesWithPathogenTest(@Valid CaseDataDto caseDataDto, PathogenTestDto pathogenTestDto) { + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Case.class); + Root caseRoot = cq.from(Case.class); + + CaseJoins caseCaseJoins = new CaseJoins(caseRoot); + Join personJoin = caseCaseJoins.getPerson(); + Join samplesJoin = caseCaseJoins.getSamples(); + Join pathogenTestJoin = caseCaseJoins.getSampleJoins().getPathogenTest(); + + cq.select(caseRoot); + Predicate filter = cb.and( + cb.equal(caseRoot.get(Case.DISEASE), pathogenTestDto.getTestedDisease()), + cb.equal(personJoin.get(Person.UUID), caseDataDto.getPerson().getUuid()), + cb.equal(caseRoot.get(Case.DISEASE), pathogenTestJoin.get(PathogenTest.TESTED_DISEASE)), + cb.exists(sampleService.exists(cb, cq, samplesJoin, pathogenTestDto.getSample().getUuid()))); + + cq.where(filter); + + List duplicateCases = em.createQuery(cq).getResultList(); + return toDtos(duplicateCases.stream()); + } + @Override public List getDuplicates(@Valid CasePersonDto casePerson) { return getDuplicates(casePerson, 0); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleJoins.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleJoins.java index 38d2eb3f8ef..d1623dc1f0e 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleJoins.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/sample/SampleJoins.java @@ -46,6 +46,7 @@ public class SampleJoins extends QueryJoins { private Join caze; private Join eventParticipant; private Join contact; + private Join pathogenTest; private CaseJoins caseJoins; private ContactJoins contactJoins; @@ -167,6 +168,14 @@ public void setEventParticipantJoins(EventParticipantJoins eventParticipantJoins this.eventParticipantJoins = eventParticipantJoins; } + public Join getPathogenTest() { + return getOrCreate(pathogenTest, Sample.PATHOGENTESTS, JoinType.LEFT, this::setPathogenTest); + } + + private void setPathogenTest(Join pathogenTest) { + this.pathogenTest = pathogenTest; + } + public Join getEventParticipantPerson() { return getEventParticipantJoins().getPerson(); } 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 bcfe53b7c74..194b4886597 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 @@ -672,6 +672,22 @@ public Predicate createUserFilterWithoutAssociations(CriteriaBuilder cb, SampleJ return filter; } + public Subquery exists(CriteriaBuilder cb, CriteriaQuery cq, Join samplesJoin, String sampleUuid) { + Subquery sampleSq = cq.subquery(Boolean.class); + Root sampleRoot = sampleSq.from(Sample.class); + + sampleSq.select(sampleRoot.get(Sample.ID)); + + Predicate predicate = cb.and( + cb.equal(sampleRoot.get(Sample.UUID), sampleUuid), + cb.equal(samplesJoin.get(Sample.SAMPLE_DATE_TIME), sampleRoot.get(Sample.SAMPLE_DATE_TIME)), + cb.equal(samplesJoin.get(Sample.SAMPLE_MATERIAL), sampleRoot.get(Sample.SAMPLE_MATERIAL))); + + sampleSq.where(predicate); + + return sampleSq; + } + @Override public SampleJurisdictionFlagsDto getJurisdictionFlags(Sample entity) { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java index 3bf46f0696a..88191e350fc 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java @@ -3116,6 +3116,41 @@ public void testGetCaseSelectionListWithArchivedCases() { assertTrue(caseUuids.contains(case2.getUuid())); } + @Test + public void testDuplicatesWithPathogenTest() { + TestDataCreator.RDCFEntities rdcf = creator.createRDCFEntities(); + UserDto user = creator.createUser(rdcf, creator.getUserRoleReference(DefaultUserRole.NATIONAL_USER)); + PersonDto personDto = creator.createPerson(); + + CaseDataDto covidCase = creator.createCase( + user.toReference(), + personDto.toReference(), + Disease.CORONAVIRUS, + CaseClassification.CONFIRMED, + InvestigationStatus.DONE, + new Date(), + rdcf); + SampleDto sampleDto = + creator.createSample(covidCase.toReference(), new Date(), new Date(), user.toReference(), SampleMaterial.BLOOD, rdcf.facility); + PathogenTestDto pathogenTestDto = creator.createPathogenTest( + sampleDto.toReference(), + PathogenTestType.PCR_RT_PCR, + Disease.ANTHRAX, + new Date(), + rdcf.facility, + user.toReference(), + PathogenTestResultType.POSITIVE, + "", + true); + + covidCase.setDisease(Disease.ANTHRAX); + CaseDataDto anthraxCase = getCaseFacade().cloneCase(covidCase); + + List duplicatedCases = getCaseFacade().getDuplicatesWithPathogenTest(covidCase, pathogenTestDto); + assertEquals(1, duplicatedCases.size()); + assertEquals(anthraxCase.getUuid(), duplicatedCases.get(0).getUuid()); + } + private static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz "; private static final SecureRandom rnd = new SecureRandom(); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java index b3ba05dcf04..cb0c07bb041 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java @@ -258,12 +258,15 @@ private void handleAssociatedCase( } }); } else { - showCaseCloningWithNewDiseaseDialog( - caze, - dto.getTestedDisease(), - dto.getTestedDiseaseDetails(), - dto.getTestedDiseaseVariant(), - dto.getTestedDiseaseVariantDetails()); + List duplicatedCases = FacadeProvider.getCaseFacade().getDuplicatesWithPathogenTest(caze, dto); + if (duplicatedCases == null || duplicatedCases.size() == 0) { + showCaseCloningWithNewDiseaseDialog( + caze, + dto.getTestedDisease(), + dto.getTestedDiseaseDetails(), + dto.getTestedDiseaseVariant(), + dto.getTestedDiseaseVariantDetails()); + } } } }; From 2ff3f309499f5eccc95747f05f9e51ca9ce43033 Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Fri, 16 Dec 2022 13:00:10 +0100 Subject: [PATCH 108/147] fixes --- .../src/test/resources/features/sanity/web/About.feature | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature index a91b9f353a6..fde3a1e099c 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/About.feature @@ -29,12 +29,11 @@ Feature: About Directory end to end tests Then I click on Case Classification Rules hyperlink and download HTML file in About directory Then I delete Case Classification Html downloaded file from About Directory -#Change "Data Protection Dictonary" to "Data Dictionary" @env_main @#9768 @ExcludedFromRelease Scenario: Check Data Protection Dictionary existence and download Given I log in as a Admin User And I click on the About button from navbar - And I click on Data Dictionary hyperlink and download XLSX file from About directory + And I click on Data Protection Dictionary hyperlink and download XLSX file from About directory And I validate data from downloaded XLSX Data Protection Dictionary file And I delete Data Protection Dictionary downloaded file from About Directory From d5ac9add6b7792f4800c40da29a93aed7ea02325 Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Fri, 16 Dec 2022 14:03:28 +0200 Subject: [PATCH 109/147] #10958 - Avoid directories calling count method several times --- .../ui/configuration/infrastructure/CommunitiesView.java | 5 ----- .../ui/configuration/infrastructure/ContinentsView.java | 5 ----- .../ui/configuration/infrastructure/CountriesView.java | 4 ---- .../ui/configuration/infrastructure/DistrictsView.java | 5 ----- .../ui/configuration/infrastructure/FacilitiesView.java | 8 ++------ .../configuration/infrastructure/PointsOfEntryView.java | 9 ++------- .../ui/configuration/infrastructure/RegionsView.java | 5 ----- .../configuration/infrastructure/SubcontinentsView.java | 5 ----- 8 files changed, 4 insertions(+), 42 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesView.java index e3597deb736..6a16f5768b3 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CommunitiesView.java @@ -18,8 +18,6 @@ import java.util.Collections; import java.util.Set; -import org.apache.commons.lang3.StringUtils; - import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.StreamResource; @@ -165,8 +163,6 @@ public CommunitiesView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); - searchField.clear(); - criteria.nameLike(StringUtils.EMPTY); grid.setEagerDataProvider(); grid.reload(); }); @@ -309,7 +305,6 @@ public void run() { EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); - searchField.setEnabled(!isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsView.java index 398b1345d58..510dd7de113 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/ContinentsView.java @@ -18,8 +18,6 @@ import java.util.Collections; import java.util.Set; -import org.apache.commons.lang3.StringUtils; - import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.server.FileDownloader; @@ -164,8 +162,6 @@ public ContinentsView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); - searchField.clear(); - criteria.nameLike(StringUtils.EMPTY); grid.setInEagerMode(true); grid.reload(); }); @@ -257,7 +253,6 @@ private HorizontalLayout createFilterBar() { EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); - searchField.setEnabled(!isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesView.java index 08ce80b1ceb..52edfa10887 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesView.java @@ -18,8 +18,6 @@ import java.util.Collections; import java.util.Set; -import org.apache.commons.lang3.StringUtils; - import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.server.FileDownloader; @@ -172,8 +170,6 @@ public CountriesView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); - searchField.clear(); - criteria.nameCodeLike(StringUtils.EMPTY); grid.setInEagerMode(true); grid.reload(); }); diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsView.java index 0f19c221e97..863da9e0e09 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/DistrictsView.java @@ -18,8 +18,6 @@ import java.util.Collections; import java.util.Set; -import org.apache.commons.lang3.StringUtils; - import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.FileDownloader; @@ -166,8 +164,6 @@ public DistrictsView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); - searchField.clear(); - criteria.nameEpidLike(StringUtils.EMPTY); grid.setEagerDataProvider(); grid.reload(); }); @@ -295,7 +291,6 @@ public void run() { EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); - searchField.setEnabled(!isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java index 12ce0b7c015..7cf3073a419 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java @@ -20,7 +20,6 @@ import java.util.Set; import java.util.stream.Collectors; -import org.apache.commons.lang3.StringUtils; import org.vaadin.hene.popupbutton.PopupButton; import com.vaadin.icons.VaadinIcons; @@ -210,8 +209,6 @@ public FacilitiesView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); - searchField.clear(); - criteria.nameAddressLike(StringUtils.EMPTY); grid.setEagerDataProvider(); grid.reload(); rowCount.update(grid.getDataSize()); @@ -401,9 +398,8 @@ public void run() { }, EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); - boolean visible = viewConfiguration.isInEagerMode() && !EntityRelevanceStatus.ALL.equals(criteria.getRelevanceStatus()); - bulkOperationsDropdown.setVisible(visible); - searchField.setEnabled(!visible); + bulkOperationsDropdown + .setVisible(viewConfiguration.isInEagerMode() && !EntityRelevanceStatus.ALL.equals(criteria.getRelevanceStatus())); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java index f19013f4b11..c8d1c8d4061 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java @@ -18,8 +18,6 @@ import java.util.Collections; import java.util.Set; -import org.apache.commons.lang3.StringUtils; - import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.FileDownloader; @@ -163,8 +161,6 @@ public PointsOfEntryView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); - searchField.clear(); - criteria.nameLike(StringUtils.EMPTY); grid.setEagerDataProvider(); grid.reload(); }); @@ -322,9 +318,8 @@ private HorizontalLayout createFilterBar() { }, EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); - boolean visible = viewConfiguration.isInEagerMode() && !EntityRelevanceStatus.ALL.equals(criteria.getRelevanceStatus()); - bulkOperationsDropdown.setVisible(visible); - searchField.setEnabled(!visible); + bulkOperationsDropdown + .setVisible(viewConfiguration.isInEagerMode() && !EntityRelevanceStatus.ALL.equals(criteria.getRelevanceStatus())); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsView.java index 5463802fc9f..42de55e4fc0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/RegionsView.java @@ -18,8 +18,6 @@ import java.util.Collections; import java.util.Set; -import org.apache.commons.lang3.StringUtils; - import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.server.FileDownloader; @@ -163,8 +161,6 @@ public RegionsView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); - searchField.clear(); - criteria.nameEpidLike(StringUtils.EMPTY); grid.setEagerDataProvider(); grid.reload(); }); @@ -262,7 +258,6 @@ private HorizontalLayout createFilterBar() { EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); - searchField.setEnabled(!isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsView.java index 562abc63d5e..4360fd41ca0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/SubcontinentsView.java @@ -18,8 +18,6 @@ import java.util.Collections; import java.util.Set; -import org.apache.commons.lang3.StringUtils; - import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener; import com.vaadin.server.FileDownloader; @@ -167,8 +165,6 @@ public SubcontinentsView() { btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); - searchField.clear(); - criteria.nameLike(StringUtils.EMPTY); grid.setInEagerMode(true); grid.reload(); }); @@ -273,7 +269,6 @@ private HorizontalLayout createFilterBar() { EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); - searchField.setEnabled(!isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } From c41a7b5c626b7044fd8a86122807a98d99c19cb5 Mon Sep 17 00:00:00 2001 From: popadriangeo Date: Fri, 16 Dec 2022 14:58:23 +0200 Subject: [PATCH 110/147] #10420 added Scenario: Validate newly created user role is present in filtering options --- .../application/users/UserRolesPage.java | 1 + .../users/UserManagementSteps.java | 29 ++++++++++++++----- .../web/application/users/UserRolesSteps.java | 14 +++++++++ .../features/sanity/web/User.feature | 9 +++++- 4 files changed, 44 insertions(+), 9 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/users/UserRolesPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/users/UserRolesPage.java index 553ac303f2a..c37756bcc51 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/users/UserRolesPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/users/UserRolesPage.java @@ -46,5 +46,6 @@ public static By getUserRoleCaptionByText(String caption) { public static By DELETE_CONFIRMATION_BUTTON = By.cssSelector(".popupContent #actionConfirm"); public static By CANNOT_DELETE_USER_ROLE_POPUP = By.xpath("//div[contains(text(), 'Cannot delete user role')]"); + public static By EXPORT_USER_ROLES_BUTTON = By.id("exportUserRoles"); public static By CANNOT_DELETE_USER_ROLE_POPUP_OKAY_BUTTON = By.cssSelector("#actionOkay"); } diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java index 89e21202214..a2c8e2dad09 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserManagementSteps.java @@ -135,14 +135,16 @@ public UserManagementSteps( Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(ACTIVE_INACTIVE_COMBOBOX, "Active"); -// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); -// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); + // + // webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); + // webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfActiveUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(ACTIVE_INACTIVE_COMBOBOX, "Inactive"); -// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); -// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); + // + // webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); + // webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfInactiveUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); @@ -163,8 +165,9 @@ public UserManagementSteps( Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(USER_ROLES_COMBOBOX, "National User"); -// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); -// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); + // + // webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); + // webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfSpecificUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); @@ -186,8 +189,9 @@ public UserManagementSteps( Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); webDriverHelpers.selectFromCombobox(REGION_COMBOBOX_USER_MANAGEMENT, "Bayern"); -// webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); -// webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); + // + // webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOADING_INDICATOR); + // webDriverHelpers.waitUntilIdentifiedElementDisappear(LOADING_INDICATOR); Integer numberOfSpecificUsers = Integer.parseInt( webDriverHelpers.getTextFromWebElement(USERS_COUNTER_USER_MANAGEMENT)); @@ -217,6 +221,15 @@ public UserManagementSteps( softly.assertAll(); }); + And( + "^I check that \"([^\"]*)\" is available in the user role filter in User management Page$", + (String userRole) -> { + softly.assertTrue( + webDriverHelpers.checkIfElementExistsInCombobox(USER_ROLES_COMBOBOX, userRole), + "Provided user role is not available in the user role template dropdown menu!"); + softly.assertAll(); + }); + And( "^I filter users by \"([^\"]*)\" user role$", (String userRole) -> { diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java index 72c97ccdc75..5a92ae91914 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java @@ -27,6 +27,7 @@ import static org.sormas.e2etests.pages.application.users.UserRolesPage.DELETE_CONFIRMATION_BUTTON; import static org.sormas.e2etests.pages.application.users.UserRolesPage.DELETE_USER_ROLE_BUTTON; import static org.sormas.e2etests.pages.application.users.UserRolesPage.ENABLED_DISABLED_SEARCH_COMBOBOX; +import static org.sormas.e2etests.pages.application.users.UserRolesPage.EXPORT_USER_ROLES_BUTTON; import static org.sormas.e2etests.pages.application.users.UserRolesPage.NEW_USER_ROLE_BUTTON; import static org.sormas.e2etests.pages.application.users.UserRolesPage.POPUP_DISCARD_BUTTON; import static org.sormas.e2etests.pages.application.users.UserRolesPage.POPUP_SAVE_BUTTON; @@ -41,11 +42,15 @@ import static org.sormas.e2etests.pages.application.users.UserRolesPage.getUserRoleCaptionByText; import cucumber.api.java8.En; +import java.time.LocalDate; import javax.inject.Inject; import org.sormas.e2etests.helpers.WebDriverHelpers; +import org.sormas.e2etests.helpers.files.FilesHelper; import org.testng.asserts.SoftAssert; public class UserRolesSteps implements En { + public static final String USER_ROLES_FILE_PATH = + String.format("sormas_user_roles_%s_.xlsx", LocalDate.now()); protected WebDriverHelpers webDriverHelpers; @Inject @@ -222,5 +227,14 @@ public UserRolesSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { webDriverHelpers.clickOnWebElementBySelector(DELETE_CONFIRMATION_BUTTON); } }); + + And( + "I click on the Export User Roles Button and verify User role file is downloaded and contains data in the User Role Page", + () -> { + webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable( + EXPORT_USER_ROLES_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(EXPORT_USER_ROLES_BUTTON); + FilesHelper.waitForFileToDownload(USER_ROLES_FILE_PATH, 30); + }); } } diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature index 098b98de7de..6ef747774d9 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature @@ -348,6 +348,13 @@ Feature: Create user And I click SAVE button on User Role Page And I back to the User role list And I click on User Management tab from User Roles Page - Then I check that "TestNatUser" is available in the user role filter + And I check that "TestNatUser" is available in the user role filter in User management Page And I click on User roles tab from User Management Page And I check if the "TestNatUser" user role exist and delete it + + @#10420 @env_main + Scenario: Validate newly created user role is present in filtering options + Given I log in as a Admin User + And I click on the Users from navbar + And I click on User roles tab from User Management Page + And I click on the Export User Roles Button and verify User role file is downloaded and contains data in the User Role Page From a30b9517e053a1fa4f819f85b9f68552c116e6f4 Mon Sep 17 00:00:00 2001 From: popadriangeo Date: Fri, 16 Dec 2022 15:48:26 +0200 Subject: [PATCH 111/147] #10420 - added Scenario: Validate Export User Role file download functionality --- .../e2etests/steps/web/application/users/UserRolesSteps.java | 1 + .../src/test/resources/features/sanity/web/User.feature | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java index 5a92ae91914..d3d9650f6cf 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/users/UserRolesSteps.java @@ -235,6 +235,7 @@ public UserRolesSteps(WebDriverHelpers webDriverHelpers, SoftAssert softly) { EXPORT_USER_ROLES_BUTTON); webDriverHelpers.clickOnWebElementBySelector(EXPORT_USER_ROLES_BUTTON); FilesHelper.waitForFileToDownload(USER_ROLES_FILE_PATH, 30); + FilesHelper.validateFileIsNotEmpty(USER_ROLES_FILE_PATH); }); } } diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature index 6ef747774d9..9a62b8da3e4 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/User.feature @@ -353,7 +353,7 @@ Feature: Create user And I check if the "TestNatUser" user role exist and delete it @#10420 @env_main - Scenario: Validate newly created user role is present in filtering options + Scenario: Validate Export User Role file download functionality Given I log in as a Admin User And I click on the Users from navbar And I click on User roles tab from User Management Page From 0d0a6bdff3c6e05a612ce1e7fb8550d7c1200e43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=A9=20Strysewske?= Date: Fri, 16 Dec 2022 15:04:16 +0100 Subject: [PATCH 112/147] #11187 - Don't sync visits if user has no contact view right --- .../sormas/app/backend/common/AdoDtoHelper.java | 4 ++++ .../de/symeda/sormas/backend/visit/VisitService.java | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AdoDtoHelper.java b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AdoDtoHelper.java index f47f06b7872..8e20df60417 100644 --- a/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AdoDtoHelper.java +++ b/sormas-app/app/src/main/java/de/symeda/sormas/app/backend/common/AdoDtoHelper.java @@ -395,6 +395,10 @@ public void pullMissing(List uuids) throws ServerCommunicationException, public void pullMissing(List uuids, Optional syncCallbacks) throws ServerCommunicationException, ServerConnectionException, DaoException, NoConnectionException { + if (!isViewAllowed()) { + return; + } + final AbstractAdoDao dao = DatabaseHelper.getAdoDao(getAdoClass()); uuids = dao.filterMissing(uuids); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitService.java index 145d605f59d..dc2bdc0cac2 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/visit/VisitService.java @@ -19,6 +19,7 @@ import java.sql.Timestamp; import java.util.ArrayList; +import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.LinkedList; @@ -41,9 +42,11 @@ import javax.persistence.criteria.Subquery; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.RequestContextHolder; import de.symeda.sormas.api.caze.CaseLogic; import de.symeda.sormas.api.contact.ContactLogic; import de.symeda.sormas.api.followup.FollowUpLogic; +import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.visit.VisitCriteria; import de.symeda.sormas.backend.caze.Case; @@ -103,6 +106,11 @@ public Predicate inJurisdictionOrOwned(VisitQueryContext queryContext) { } public List getAllActiveUuids(User user) { + + if (RequestContextHolder.isMobileSync() && !user.hasUserRight(UserRight.CONTACT_VIEW)) { + return Collections.emptyList(); + } + Set resultSet = new HashSet<>(); resultSet.addAll(getAllActiveInContactsUuids()); resultSet.addAll(getAllActiveInCasesUuids()); @@ -169,6 +177,10 @@ private List getAllActiveInCasesUuids() { */ public List getAllAfter(Date since, Integer batchSize, String lastSynchronizedUuid) { + if (!getCurrentUser().hasUserRight(UserRight.CONTACT_VIEW)) { + return Collections.emptyList(); + } + return getList((cb, cq, from) -> { Predicate filter = createRelevantDataFilter(cb, cq, from); From 14e01747b1f11208746f8957a3f49954fd5c89fc Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Fri, 16 Dec 2022 16:47:27 +0200 Subject: [PATCH 113/147] #11193 - Uploaded documents in events cannot be deleted as the button is missing --- .../src/main/java/de/symeda/sormas/ui/events/EventDataView.java | 2 +- .../de/symeda/sormas/ui/travelentry/TravelEntryDataView.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataView.java index cbb8f72e428..952170d546a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataView.java @@ -136,7 +136,7 @@ protected void initView(String params) { UserRight.EVENT_EDIT, event.isPseudonymized(), isEditAllowed, - EditPermissionType.DOCUMENTS_ONLY.equals(eventEditAllowed)); + UserProvider.getCurrent().hasUserRight(UserRight.DOCUMENT_DELETE)); layout.addSidePanelComponent(new SideComponentLayout(documentList), DOCUMENTS_LOC); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java index 233355400f3..15b69c2731c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java @@ -88,7 +88,7 @@ protected void initView(String params) { UserRight.TRAVEL_ENTRY_EDIT, travelEntryDto.isPseudonymized(), isEditAllowed(), - EditPermissionType.DOCUMENTS_ONLY.equals(travelEntryEditAllowed)); + UserProvider.getCurrent().hasUserRight(UserRight.DOCUMENT_DELETE)); layout.addSidePanelComponent(new SideComponentLayout(documentList), DOCUMENTS_LOC); } From ed0a5b4ee4fa0e06c9e031ab89d4387c6552d59b Mon Sep 17 00:00:00 2001 From: valentinmikleuvg <112615459+valentinmikleuvg@users.noreply.github.com> Date: Fri, 16 Dec 2022 17:02:58 +0200 Subject: [PATCH 114/147] #10034-User right Sormas UI and Rest should be included automatically when selecting a right (#11189) * #10034-User right Sormas UI and Rest should be included automatically when selecting a right when you create a new User Role, the rights are selected by default, and you cannot save an User Role without one of those rights * #10034 User right Sormas UI and Rest should be included automatically when selecting a right when you save a User Role without the Access Sormas UI and Access Sormas Rest rights, a custom warning message is displayed ("the user will be unusable for login") * #10034 -> renamed the string to messageUserRoleUnusableForLogin and updated the message --- .../main/java/de/symeda/sormas/api/i18n/Strings.java | 1 + sormas-api/src/main/resources/strings.properties | 1 + .../de/symeda/sormas/ui/user/UserRoleController.java | 11 +++++++++-- 3 files changed, 11 insertions(+), 2 deletions(-) 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 a8808611374..f6ffc6ca8c4 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 @@ -1256,6 +1256,7 @@ public interface Strings { String messageUserRightsExportFailed = "messageUserRightsExportFailed"; String messageUserRoleCombination = "messageUserRoleCombination"; String messageUserRoleSaved = "messageUserRoleSaved"; + String messageUserRoleUnusableForLogin = "messageUserRoleUnusableForLogin"; String messageUsersDisabled = "messageUsersDisabled"; String messageUsersEnabled = "messageUsersEnabled"; String messageUserSyncCanceled = "messageUserSyncCanceled"; diff --git a/sormas-api/src/main/resources/strings.properties b/sormas-api/src/main/resources/strings.properties index 0013c413d63..f5f93f269bc 100644 --- a/sormas-api/src/main/resources/strings.properties +++ b/sormas-api/src/main/resources/strings.properties @@ -1284,6 +1284,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserRoleController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserRoleController.java index f230d8b92da..0df3457bec0 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserRoleController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/user/UserRoleController.java @@ -117,10 +117,17 @@ public CommitDiscardWrapperComponent getUserRoleEditComponent( return; } } - FacadeProvider.getUserRoleFacade().saveUserRole(dto); - Notification.show(I18nProperties.getString(Strings.messageUserRoleSaved), Notification.Type.WARNING_MESSAGE); + if (!(dto.getUserRights().contains(UserRight.SORMAS_UI) && dto.getUserRights().contains(UserRight.SORMAS_REST))) { + Notification.show( + I18nProperties.getString(Strings.messageUserRoleSaved), + I18nProperties.getString(Strings.messageUserRoleUnusableForLogin), + Notification.Type.WARNING_MESSAGE); + + } else { + Notification.show(I18nProperties.getString(Strings.messageUserRoleSaved), Notification.Type.WARNING_MESSAGE); + } SormasUI.refreshView(); } }); From b3aad9a95476795496e535f30f855e4e49bdb1b9 Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Fri, 16 Dec 2022 17:13:46 +0200 Subject: [PATCH 115/147] #11193 - Uploaded documents in events cannot be deleted as the button is missing --- .../java/de/symeda/sormas/ui/events/EventDataView.java | 5 ++++- .../symeda/sormas/ui/travelentry/TravelEntryDataView.java | 8 +++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataView.java index 952170d546a..1b42a02f9fd 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventDataView.java @@ -130,13 +130,16 @@ protected void initView(String params) { DocumentListComponent documentList = null; if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.DOCUMENTS) && UserProvider.getCurrent().hasUserRight(UserRight.DOCUMENT_VIEW)) { + + boolean isDocumentDeleteAllowed = + EditPermissionType.ALLOWED.equals(eventEditAllowed) || EditPermissionType.DOCUMENTS_ONLY.equals(eventEditAllowed); documentList = new DocumentListComponent( DocumentRelatedEntityType.EVENT, getEventRef(), UserRight.EVENT_EDIT, event.isPseudonymized(), isEditAllowed, - UserProvider.getCurrent().hasUserRight(UserRight.DOCUMENT_DELETE)); + isDocumentDeleteAllowed); layout.addSidePanelComponent(new SideComponentLayout(documentList), DOCUMENTS_LOC); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java index 15b69c2731c..fc8db6d3a74 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java @@ -79,7 +79,9 @@ protected void initView(String params) { final String uuid = travelEntryDto.getUuid(); final EditPermissionType travelEntryEditAllowed = FacadeProvider.getTravelEntryFacade().getEditPermissionType(uuid); + boolean editAllowed = isEditAllowed(); DocumentListComponent documentList = null; + if (FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.DOCUMENTS) && UserProvider.getCurrent().hasUserRight(UserRight.DOCUMENT_VIEW)) { documentList = new DocumentListComponent( @@ -87,8 +89,8 @@ protected void initView(String params) { getReference(), UserRight.TRAVEL_ENTRY_EDIT, travelEntryDto.isPseudonymized(), - isEditAllowed(), - UserProvider.getCurrent().hasUserRight(UserRight.DOCUMENT_DELETE)); + editAllowed, + editAllowed); layout.addSidePanelComponent(new SideComponentLayout(documentList), DOCUMENTS_LOC); } @@ -101,7 +103,7 @@ protected void initView(String params) { getTravelEntryRef(), travelEntryDto.getDisease(), this::showUnsavedChangesPopup, - isEditAllowed()); + editAllowed); taskList.addStyleName(CssStyles.SIDE_COMPONENT); layout.addSidePanelComponent(taskList, TASKS_LOC); } From c2655e4a4ece3b34162953dde88d88b2bd30ee47 Mon Sep 17 00:00:00 2001 From: syntakker Date: Fri, 16 Dec 2022 20:45:12 +0100 Subject: [PATCH 116/147] #6053 show case selection dialog after creation form only --- .../symeda/sormas/ui/caze/CaseController.java | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java index a8cbeafbb77..0f9e4e4598e 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/caze/CaseController.java @@ -325,15 +325,9 @@ public void createFromPersonReference(PersonReferenceDto personReference) { dto.setReportingUser(UserProvider.getCurrent().getUserReference()); - selectOrCreateCase(dto, person, uuid -> { - if (uuid == null) { - CommitDiscardWrapperComponent caseCreateComponent = getCaseCreateComponent(null, null, null, person, null, false); - caseCreateComponent.getWrappedComponent().setSearchedPerson(person); - VaadinUiUtil.showModalPopupWindow(caseCreateComponent, I18nProperties.getString(Strings.headingCreateNewCase)); - } else { - navigateToView(CaseDataView.VIEW_NAME, uuid, null); - } - }); + CommitDiscardWrapperComponent caseCreateComponent = getCaseCreateComponent(null, null, null, person, null, false); + caseCreateComponent.getWrappedComponent().setSearchedPerson(person); + VaadinUiUtil.showModalPopupWindow(caseCreateComponent, I18nProperties.getString(Strings.headingCreateNewCase)); } public void convertSamePersonContactsAndEventParticipants(CaseDataDto caze, Runnable callback) { @@ -816,12 +810,6 @@ public CommitDiscardWrapperComponent getCaseCreateComponent( dto.getSymptoms().setOnsetDate(createForm.getOnsetDate()); saveCase(dto); } - } else if (convertedPerson != null) { - PersonDto dbPerson = FacadeProvider.getPersonFacade().getByUuid(dto.getPerson().getUuid()); - transferDataToPerson(createForm, dbPerson); - FacadeProvider.getPersonFacade().save(dbPerson); - dto.getSymptoms().setOnsetDate(createForm.getOnsetDate()); - saveCase(dto); } else { PersonDto searchedPerson = createForm.getSearchedPerson(); if (searchedPerson != null) { From 7a65a2e9404cd12966cf142a2f84652d07f4459b Mon Sep 17 00:00:00 2001 From: Frank Hautpmann Date: Mon, 19 Dec 2022 09:59:45 +0100 Subject: [PATCH 117/147] New Crowdin updates (#11166) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * New translations captions.properties (Chinese Simplified) * New translations captions.properties (Urdu (Pakistan)) * New translations captions.properties (Spanish, Ecuador) * New translations captions.properties (Croatian) * New translations captions.properties (Hindi) * New translations captions.properties (Filipino) * New translations captions.properties (Fijian) * New translations captions.properties (Swahili) * New translations captions.properties (German, Switzerland) * New translations captions.properties (Nepali) * New translations captions.properties (French, Switzerland) * New translations captions.properties (Italian, Switzerland) * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Spanish, Ecuador) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations enum.properties (German, Switzerland) * New translations descriptions.properties (German, Switzerland) * New translations validations.properties (German, Switzerland) * New translations captions.properties (German) * New translations captions.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (German, Switzerland) * New translations captions.properties (German, Switzerland) * New translations strings.properties (German, Switzerland) * New translations enum.properties (French) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Spanish, Ecuador) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations enum.properties (Romanian) * New translations enum.properties (Spanish) * New translations enum.properties (Arabic) * New translations enum.properties (Czech) * New translations enum.properties (German) * New translations enum.properties (Finnish) * New translations enum.properties (Italian) * New translations enum.properties (Japanese) * New translations enum.properties (Dutch) * New translations enum.properties (Norwegian) * New translations enum.properties (Polish) * New translations enum.properties (Portuguese) * New translations enum.properties (Russian) * New translations enum.properties (Swedish) * New translations enum.properties (Turkish) * New translations enum.properties (Ukrainian) * New translations enum.properties (Chinese Simplified) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Spanish, Ecuador) * New translations enum.properties (Croatian) * New translations enum.properties (Hindi) * New translations enum.properties (Filipino) * New translations enum.properties (Fijian) * New translations enum.properties (Swahili) * New translations enum.properties (German, Switzerland) * New translations enum.properties (Nepali) * New translations enum.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations enum.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations enum.properties (English, Ghana) * New translations enum.properties (French) * New translations captions.properties (French) * New translations strings.properties (Spanish, Cuba) * New translations enum.properties (Spanish, Cuba) * New translations captions.properties (Urdu (Pakistan)) * New translations strings.properties (Czech) * New translations strings.properties (Urdu (Pakistan)) * New translations enum.properties (Czech) * New translations enum.properties (Urdu (Pakistan)) * New translations descriptions.properties (Urdu (Pakistan)) * New translations validations.properties (Urdu (Pakistan)) * New translations enum.properties (French) * New translations enum.properties (Romanian) * New translations enum.properties (Spanish) * New translations enum.properties (Arabic) * New translations enum.properties (Czech) * New translations enum.properties (German) * New translations enum.properties (Finnish) * New translations enum.properties (Italian) * New translations enum.properties (Japanese) * New translations enum.properties (Dutch) * New translations enum.properties (Norwegian) * New translations enum.properties (Polish) * New translations enum.properties (Portuguese) * New translations enum.properties (Russian) * New translations enum.properties (Swedish) * New translations enum.properties (Turkish) * New translations enum.properties (Ukrainian) * New translations enum.properties (Chinese Simplified) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Spanish, Ecuador) * New translations enum.properties (Croatian) * New translations enum.properties (Hindi) * New translations enum.properties (Filipino) * New translations enum.properties (Fijian) * New translations enum.properties (Swahili) * New translations enum.properties (German, Switzerland) * New translations enum.properties (Nepali) * New translations enum.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations enum.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations enum.properties (English, Ghana) * New translations enum.properties (Spanish, Cuba) * New translations strings.properties (German, Switzerland) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Spanish, Ecuador) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations strings.properties (German, Switzerland) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Spanish, Ecuador) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) Co-authored-by: Maté Strysewske --- .../main/resources/captions_fr-FR.properties | 4 ++-- .../main/resources/captions_ur-PK.properties | 6 +++--- .../resources/descriptions_ur-PK.properties | 2 +- .../src/main/resources/enum_ar-SA.properties | 6 ++++++ .../src/main/resources/enum_cs-CZ.properties | 10 ++++++++-- .../src/main/resources/enum_de-CH.properties | 6 ++++++ .../src/main/resources/enum_de-DE.properties | 6 ++++++ .../src/main/resources/enum_en-AF.properties | 6 ++++++ .../src/main/resources/enum_en-GH.properties | 6 ++++++ .../src/main/resources/enum_en-NG.properties | 6 ++++++ .../src/main/resources/enum_es-CU.properties | 10 ++++++++-- .../src/main/resources/enum_es-EC.properties | 6 ++++++ .../src/main/resources/enum_es-ES.properties | 6 ++++++ .../src/main/resources/enum_fa-AF.properties | 6 ++++++ .../src/main/resources/enum_fi-FI.properties | 6 ++++++ .../src/main/resources/enum_fil-PH.properties | 6 ++++++ .../src/main/resources/enum_fj-FJ.properties | 6 ++++++ .../src/main/resources/enum_fr-CH.properties | 6 ++++++ .../src/main/resources/enum_fr-FR.properties | 16 +++++++++++----- .../src/main/resources/enum_hi-IN.properties | 6 ++++++ .../src/main/resources/enum_hr-HR.properties | 6 ++++++ .../src/main/resources/enum_it-CH.properties | 6 ++++++ .../src/main/resources/enum_it-IT.properties | 6 ++++++ .../src/main/resources/enum_ja-JP.properties | 6 ++++++ .../src/main/resources/enum_ne-NP.properties | 6 ++++++ .../src/main/resources/enum_nl-NL.properties | 6 ++++++ .../src/main/resources/enum_no-NO.properties | 6 ++++++ .../src/main/resources/enum_pl-PL.properties | 6 ++++++ .../src/main/resources/enum_ps-AF.properties | 6 ++++++ .../src/main/resources/enum_pt-PT.properties | 6 ++++++ .../src/main/resources/enum_ro-RO.properties | 6 ++++++ .../src/main/resources/enum_ru-RU.properties | 6 ++++++ .../src/main/resources/enum_sv-SE.properties | 6 ++++++ .../src/main/resources/enum_sw-KE.properties | 6 ++++++ .../src/main/resources/enum_tr-TR.properties | 6 ++++++ .../src/main/resources/enum_uk-UA.properties | 6 ++++++ .../src/main/resources/enum_ur-PK.properties | 16 +++++++++++----- .../src/main/resources/enum_zh-CN.properties | 6 ++++++ .../main/resources/strings_ar-SA.properties | 2 ++ .../main/resources/strings_cs-CZ.properties | 10 ++++++---- .../main/resources/strings_de-CH.properties | 2 ++ .../main/resources/strings_de-DE.properties | 2 ++ .../main/resources/strings_en-AF.properties | 2 ++ .../main/resources/strings_en-GH.properties | 2 ++ .../main/resources/strings_en-NG.properties | 2 ++ .../main/resources/strings_es-CU.properties | 10 ++++++---- .../main/resources/strings_es-EC.properties | 2 ++ .../main/resources/strings_es-ES.properties | 2 ++ .../main/resources/strings_fa-AF.properties | 2 ++ .../main/resources/strings_fi-FI.properties | 2 ++ .../main/resources/strings_fil-PH.properties | 2 ++ .../main/resources/strings_fj-FJ.properties | 2 ++ .../main/resources/strings_fr-CH.properties | 2 ++ .../main/resources/strings_fr-FR.properties | 2 ++ .../main/resources/strings_hi-IN.properties | 2 ++ .../main/resources/strings_hr-HR.properties | 2 ++ .../main/resources/strings_it-CH.properties | 2 ++ .../main/resources/strings_it-IT.properties | 2 ++ .../main/resources/strings_ja-JP.properties | 2 ++ .../main/resources/strings_ne-NP.properties | 2 ++ .../main/resources/strings_nl-NL.properties | 2 ++ .../main/resources/strings_no-NO.properties | 2 ++ .../main/resources/strings_pl-PL.properties | 2 ++ .../main/resources/strings_ps-AF.properties | 2 ++ .../main/resources/strings_pt-PT.properties | 2 ++ .../main/resources/strings_ro-RO.properties | 2 ++ .../main/resources/strings_ru-RU.properties | 2 ++ .../main/resources/strings_sv-SE.properties | 2 ++ .../main/resources/strings_sw-KE.properties | 2 ++ .../main/resources/strings_tr-TR.properties | 2 ++ .../main/resources/strings_uk-UA.properties | 2 ++ .../main/resources/strings_ur-PK.properties | 18 ++++++++++-------- .../main/resources/strings_zh-CN.properties | 2 ++ .../resources/validations_ur-PK.properties | 2 +- 74 files changed, 317 insertions(+), 37 deletions(-) diff --git a/sormas-api/src/main/resources/captions_fr-FR.properties b/sormas-api/src/main/resources/captions_fr-FR.properties index 9e520512595..81df42c7820 100644 --- a/sormas-api/src/main/resources/captions_fr-FR.properties +++ b/sormas-api/src/main/resources/captions_fr-FR.properties @@ -26,7 +26,7 @@ description=Description disease=Maladie districtName=Département edit=Editer -view=View +view=Afficher epiWeekFrom=De la Semaine epiWeekTo=À la Semaine facilityType=Type d'établissement @@ -69,7 +69,7 @@ requiredUserRights=Droits de l'utilisateur requis adoptHomeAddressOfCasePerson=Adopt home address of case person adoptHomeAddressOfCasePersonIfRelationMatches=Adopt home address of the case person if they live in the same household casePersonAddress=Address of the case person -viewMessage=View message +viewMessage=Afficher le message # About about=À propos de aboutAdditionalInfo=Information additionnelle diff --git a/sormas-api/src/main/resources/captions_ur-PK.properties b/sormas-api/src/main/resources/captions_ur-PK.properties index 773e9a38094..dae0f379c5f 100644 --- a/sormas-api/src/main/resources/captions_ur-PK.properties +++ b/sormas-api/src/main/resources/captions_ur-PK.properties @@ -69,7 +69,7 @@ requiredUserRights=صارف کے حقوق کی ضرورت adoptHomeAddressOfCasePerson=کیس والے کے گھر کا پتہ اپنائیں adoptHomeAddressOfCasePersonIfRelationMatches=اگر وہ ایک ہی گھر میں رہتے ہیں تو کیس والے کے گھر کا پتہ اپنا لیں casePersonAddress=کیس والے کا پتہ -viewMessage=View message +viewMessage=پیغام دیکھیں # About about=متعلق aboutAdditionalInfo=اضافی معلومات @@ -1470,11 +1470,11 @@ externalMessage.deleteNewlyCreatedCase=نیا کیس مٹا دیں جو آپ ن externalMessage.deleteNewlyCreatedContact=نیا رابطہ مٹا دیں جو آپ نے ابھی بنایا ہے externalMessage.deleteNewlyCreatedEventParticipant=نئی تقریب کے شریک کو مٹا دیں جسے آپ نے ابھی بنایا ہے ExternalMessage.reportId=رپورٹ کی شناخت -ExternalMessage.reportMessageId=Report Message ID +ExternalMessage.reportMessageId=رپورٹ میسج آئی ڈی ExternalMessage.sampleOverallTestResult=مجموعی طور پر ٹیسٹ کا نتیجہ ExternalMessage.assignee=مقرر کردہ ExternalMessage.type=قسم -ExternalMessage.surveillanceReport=Linked Report +ExternalMessage.surveillanceReport=منسلک رپورٹ externalMessageFetch=پیغامات حاصل کریں externalMessageProcess=پروسیس externalMessageNoDisease=کوئی بیماری نہیں ملی diff --git a/sormas-api/src/main/resources/descriptions_ur-PK.properties b/sormas-api/src/main/resources/descriptions_ur-PK.properties index d1e9879e8ef..86b334aa728 100644 --- a/sormas-api/src/main/resources/descriptions_ur-PK.properties +++ b/sormas-api/src/main/resources/descriptions_ur-PK.properties @@ -176,7 +176,7 @@ Sample.sampleDateTime = نمونہ کب لیا گیا (تاریخ درج کری Sample.associatedLabMessages = متعلقہ لیب کے پیغامات عیاں کریں # Surveillance Report -SurveillanceReport.associatedMessage = Display associated external message +SurveillanceReport.associatedMessage = متعلقہ بیرونی پیغام ڈسپلے کریں # Symptoms Symptoms.alteredConsciousness = شعور کی تبدیل شدہ سطح، جیسے سستی، احمقانہ، کوما diff --git a/sormas-api/src/main/resources/enum_ar-SA.properties b/sormas-api/src/main/resources/enum_ar-SA.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_ar-SA.properties +++ b/sormas-api/src/main/resources/enum_ar-SA.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_cs-CZ.properties b/sormas-api/src/main/resources/enum_cs-CZ.properties index 397c24829c7..795beeb1037 100644 --- a/sormas-api/src/main/resources/enum_cs-CZ.properties +++ b/sormas-api/src/main/resources/enum_cs-CZ.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Klinické kurzy DatabaseTable.CLINICAL_VISITS = Klinické návštěvy DatabaseTable.COMMUNITIES = Komunity DatabaseTable.CONTACTS = Kontakty +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Kontinenty DatabaseTable.SUBCONTINENTS = Subkontinenty DatabaseTable.AREAS = Oblasti @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Upravitelné hodnoty enum DatabaseTable.DISTRICTS = Okresy DatabaseTable.EPIDATA = Epidemiologická data DatabaseTable.EVENTS = Události +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Skupiny událostí DatabaseTable.EVENTPARTICIPANTS = Dotčené osoby DatabaseTable.EXPOSURES = Vystavení @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Místa DatabaseTable.OUTBREAKS = Ohniska DatabaseTable.PERSONS = Osoby DatabaseTable.PERSON_CONTACT_DETAILS = Detaily kontaktu osoby +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Předpisy DatabaseTable.PREVIOUSHOSPITALIZATIONS = Předchozí hospitalizace DatabaseTable.REGIONS = Regiony @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Vzorky DatabaseTable.PATHOGEN_TESTS = Testy patogenů DatabaseTable.ADDITIONAL_TESTS = Doplňkové testy DatabaseTable.TASKS = Úkoly +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Léky DatabaseTable.TRAVEL_ENTRIES = Cestovní vstupy DatabaseTable.TREATMENTS = Léčby @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS Informace o původu DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS sdílet informace DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS sdílet žádosti DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS sdílet informace o žádosti +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = Externí sdílené informace DatabaseTable.CAMPAIGNS = Kampaně +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Meta formulář kampaně DatabaseTable.CAMPAIGN_FORM_DATA = Data formuláře kampaně DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Definice schématu kampaně @@ -1433,7 +1439,7 @@ UserRight.VISIT_DELETE = Odstranit návštěvy ze systému UserRight.VISIT_EXPORT = Exportovat návštěvy ze SORMAS UserRight.TASK_DELETE = Odstranit úkoly ze systému UserRight.TASK_EXPORT = Exportovat úkoly ze SORMAS -UserRight.TASK_ARCHIVE = Archive tasks +UserRight.TASK_ARCHIVE = Archivovat úkoly UserRight.ACTION_CREATE = Vytvořit nové akce UserRight.ACTION_DELETE = Odstranit akce ze systému UserRight.ACTION_EDIT = Upravit existující akce @@ -1583,7 +1589,7 @@ UserRight.Desc.TASK_ASSIGN = Může přiřadit úkoly uživatelům UserRight.Desc.TASK_CREATE = Může vytvářet nové úkoly UserRight.Desc.TASK_EDIT = Může upravit existující úkoly UserRight.Desc.TASK_VIEW = Může zobrazit existující úkoly -UserRight.Desc.TASK_ARCHIVE = Able to archive tasks +UserRight.Desc.TASK_ARCHIVE = Může archivovat úkoly UserRight.Desc.USER_CREATE = Může vytvářet nové uživatele UserRight.Desc.USER_EDIT = Může upravit existující uživatele UserRight.Desc.USER_VIEW = Může zobrazit stávající uživatele diff --git a/sormas-api/src/main/resources/enum_de-CH.properties b/sormas-api/src/main/resources/enum_de-CH.properties index 55754cc90be..a872464935e 100644 --- a/sormas-api/src/main/resources/enum_de-CH.properties +++ b/sormas-api/src/main/resources/enum_de-CH.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Klinische Verläufe DatabaseTable.CLINICAL_VISITS = Klinische Besuche DatabaseTable.COMMUNITIES = Gemeinden DatabaseTable.CONTACTS = Kontakte +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Kontinente DatabaseTable.SUBCONTINENTS = Subkontinente DatabaseTable.AREAS = Gebiete @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Benutzerdefinierbare Enumwerte DatabaseTable.DISTRICTS = Bezirke DatabaseTable.EPIDATA = Epidemiologische Daten DatabaseTable.EVENTS = Ereignisse +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Ereignisgruppen DatabaseTable.EVENTPARTICIPANTS = Beteiligte Personen DatabaseTable.EXPOSURES = Expositionen @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Orte DatabaseTable.OUTBREAKS = Ausbrüche DatabaseTable.PERSONS = Personen DatabaseTable.PERSON_CONTACT_DETAILS = Personen-Kontaktdetails +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Rezepte DatabaseTable.PREVIOUSHOSPITALIZATIONS = Vorherige Krankenhausaufenthalte DatabaseTable.REGIONS = Kantone @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Proben DatabaseTable.PATHOGEN_TESTS = Erregertests DatabaseTable.ADDITIONAL_TESTS = Zusätzliche Tests DatabaseTable.TASKS = Aufgaben +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapien DatabaseTable.TRAVEL_ENTRIES = Einreisen DatabaseTable.TREATMENTS = Behandlungen @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS Ursprungs-Informati DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS Übergabe-Informationen DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS Anfragen zur Übergabe DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS Anfrage zur Übergabe Informationen +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = Externe Teilungs-Information DatabaseTable.CAMPAIGNS = Kampagnen +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Kampagnen-Formular Meta DatabaseTable.CAMPAIGN_FORM_DATA = Kampagnen-Formular Daten DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Kampagnendiagramm-Definitionen diff --git a/sormas-api/src/main/resources/enum_de-DE.properties b/sormas-api/src/main/resources/enum_de-DE.properties index baa12a1550c..4fee6db37c7 100644 --- a/sormas-api/src/main/resources/enum_de-DE.properties +++ b/sormas-api/src/main/resources/enum_de-DE.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Klinische Verläufe DatabaseTable.CLINICAL_VISITS = Klinische Besuche DatabaseTable.COMMUNITIES = Gemeinden DatabaseTable.CONTACTS = Kontakte +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Kontinente DatabaseTable.SUBCONTINENTS = Subkontinente DatabaseTable.AREAS = Gebiete @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Benutzerdefinierbare Enumwerte DatabaseTable.DISTRICTS = Landkreise / Kreisfreie Städte DatabaseTable.EPIDATA = Epidemiologische Daten DatabaseTable.EVENTS = Ereignisse +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Ereignisgruppen DatabaseTable.EVENTPARTICIPANTS = Beteiligte Personen DatabaseTable.EXPOSURES = Expositionen @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Orte DatabaseTable.OUTBREAKS = Ausbrüche DatabaseTable.PERSONS = Personen DatabaseTable.PERSON_CONTACT_DETAILS = Personen-Kontaktdetails +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Verschreibungen DatabaseTable.PREVIOUSHOSPITALIZATIONS = Vorherige Krankenhausaufenthalte DatabaseTable.REGIONS = Bundesländer @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Proben DatabaseTable.PATHOGEN_TESTS = Erregertests DatabaseTable.ADDITIONAL_TESTS = Zusätzliche Tests DatabaseTable.TASKS = Aufgaben +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapien DatabaseTable.TRAVEL_ENTRIES = Einreisen DatabaseTable.TREATMENTS = Behandlungen @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS Ursprungs-Informati DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS Übergabe-Informationen DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS Anfragen zur Übergabe DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS Anfrage zur Übergabe Informationen +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = Externe Teilungs-Information DatabaseTable.CAMPAIGNS = Kampagnen +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Kampagnen-Formular Meta DatabaseTable.CAMPAIGN_FORM_DATA = Kampagnen-Formular Daten DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Kampagnendiagramm-Definitionen diff --git a/sormas-api/src/main/resources/enum_en-AF.properties b/sormas-api/src/main/resources/enum_en-AF.properties index b5ecd6cc416..f7e9f490b2b 100644 --- a/sormas-api/src/main/resources/enum_en-AF.properties +++ b/sormas-api/src/main/resources/enum_en-AF.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Provinces @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_en-GH.properties b/sormas-api/src/main/resources/enum_en-GH.properties index c23fa77d20c..504dbd13755 100644 --- a/sormas-api/src/main/resources/enum_en-GH.properties +++ b/sormas-api/src/main/resources/enum_en-GH.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_en-NG.properties b/sormas-api/src/main/resources/enum_en-NG.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_en-NG.properties +++ b/sormas-api/src/main/resources/enum_en-NG.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_es-CU.properties b/sormas-api/src/main/resources/enum_es-CU.properties index d0dee58f26d..5dffbdd6eac 100644 --- a/sormas-api/src/main/resources/enum_es-CU.properties +++ b/sormas-api/src/main/resources/enum_es-CU.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Cursos clínicos DatabaseTable.CLINICAL_VISITS = Visitas clínicas DatabaseTable.COMMUNITIES = Áreas de salud DatabaseTable.CONTACTS = Contactos +DatabaseTable.CONTACTS_VISITS = Contactos → Visitas DatabaseTable.CONTINENTS = Continentes DatabaseTable.SUBCONTINENTS = Subcontinentes DatabaseTable.AREAS = Zonas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Valores de enum personalizables DatabaseTable.DISTRICTS = Municipios DatabaseTable.EPIDATA = Datos epidemiológicos DatabaseTable.EVENTS = Eventos +DatabaseTable.EVENTS_EVENTGROUPS = Eventos → Grupos de eventos DatabaseTable.EVENTGROUPS = Grupos de eventos DatabaseTable.EVENTPARTICIPANTS = Personas involucradas DatabaseTable.EXPOSURES = Exposiciones @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Ubicaciones DatabaseTable.OUTBREAKS = Brotes DatabaseTable.PERSONS = Personas DatabaseTable.PERSON_CONTACT_DETAILS = Datos de contacto de la persona +DatabaseTable.PERSON_LOCATIONS = Ubicaciones de personas DatabaseTable.PRESCRIPTIONS = Prescripciones DatabaseTable.PREVIOUSHOSPITALIZATIONS = Hospitalizaciones anteriores DatabaseTable.REGIONS = Provincias @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Muestras DatabaseTable.PATHOGEN_TESTS = Pruebas de patógeno DatabaseTable.ADDITIONAL_TESTS = Pruebas adicionales DatabaseTable.TASKS = Tareas +DatabaseTable.TASK_OBSERVER = Observador de tareas DatabaseTable.THERAPIES = Terapias DatabaseTable.TRAVEL_ENTRIES = Entradas de viaje DatabaseTable.TREATMENTS = Tratamientos @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = Información de origen de SORMAS 2 DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = Información de compartición de SORMAS 2 SORMAS DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = Peticiones de compartición de SORMAS 2 SORMAS DatabaseTable.SHARE_REQUEST_INFO = Información de peticiones de compartición de SORMAS 2 SORMAS +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = Información de peticiones de compartición de SORMAS 2 SORMAS → Información de compartición DatabaseTable.EXTERNAL_SHARE_INFO = Información de compartición externa DatabaseTable.CAMPAIGNS = Campañas +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campañas → Metadatos de formulario de campaña DatabaseTable.CAMPAIGN_FORM_META = Metadatos de formulario de campaña DatabaseTable.CAMPAIGN_FORM_DATA = Datos de formulario de campaña DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Definiciones de diagrama de campaña @@ -1433,7 +1439,7 @@ UserRight.VISIT_DELETE = Eliminar visitas del sistema UserRight.VISIT_EXPORT = Exportar visitas de SORMAS UserRight.TASK_DELETE = Eliminar tareas del sistema UserRight.TASK_EXPORT = Exportar tareas de SORMAS -UserRight.TASK_ARCHIVE = Archive tasks +UserRight.TASK_ARCHIVE = Archivar tareas UserRight.ACTION_CREATE = Crear nuevas acciones UserRight.ACTION_DELETE = Eliminar acciones del sistema UserRight.ACTION_EDIT = Editar acciones existentes @@ -1583,7 +1589,7 @@ UserRight.Desc.TASK_ASSIGN = Puede asignar tareas a usuarios UserRight.Desc.TASK_CREATE = Puede crear nuevas tareas UserRight.Desc.TASK_EDIT = Puede editar tareas existentes UserRight.Desc.TASK_VIEW = Puede ver tareas existentes -UserRight.Desc.TASK_ARCHIVE = Able to archive tasks +UserRight.Desc.TASK_ARCHIVE = Puede archivar tareas UserRight.Desc.USER_CREATE = Puede crear nuevos usuarios UserRight.Desc.USER_EDIT = Puede editar usuarios existentes UserRight.Desc.USER_VIEW = Puede ver usuarios existentes diff --git a/sormas-api/src/main/resources/enum_es-EC.properties b/sormas-api/src/main/resources/enum_es-EC.properties index 8fe6d787aff..3fc63ebd206 100644 --- a/sormas-api/src/main/resources/enum_es-EC.properties +++ b/sormas-api/src/main/resources/enum_es-EC.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Cursos clínicos DatabaseTable.CLINICAL_VISITS = Visitas clínicas DatabaseTable.COMMUNITIES = Comunidades DatabaseTable.CONTACTS = Contactos +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Distritos DatabaseTable.EPIDATA = Datos epidemiológicos DatabaseTable.EVENTS = Evetos +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Personas involucradas DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Ubicacione DatabaseTable.OUTBREAKS = Brotes DatabaseTable.PERSONS = Personas DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescripciones DatabaseTable.PREVIOUSHOSPITALIZATIONS = Hospitalizaciones previas DatabaseTable.REGIONS = Regiones @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Muestras DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tareas +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Terapias DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Tratamientos @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_es-ES.properties b/sormas-api/src/main/resources/enum_es-ES.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_es-ES.properties +++ b/sormas-api/src/main/resources/enum_es-ES.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_fa-AF.properties b/sormas-api/src/main/resources/enum_fa-AF.properties index 467e987cb5f..334c73c60d1 100644 --- a/sormas-api/src/main/resources/enum_fa-AF.properties +++ b/sormas-api/src/main/resources/enum_fa-AF.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_fi-FI.properties b/sormas-api/src/main/resources/enum_fi-FI.properties index ca7ba64b024..d88f72c0a5c 100644 --- a/sormas-api/src/main/resources/enum_fi-FI.properties +++ b/sormas-api/src/main/resources/enum_fi-FI.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Sairauksien kliiniset kulut DatabaseTable.CLINICAL_VISITS = Kliiniset käynnit DatabaseTable.COMMUNITIES = Kunnat DatabaseTable.CONTACTS = Kontaktit +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Sairaanhoitopiirit DatabaseTable.EPIDATA = Epidemiologiset tiedot DatabaseTable.EVENTS = Tapahtumat +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Osalliset henkilöt DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Sijainnit DatabaseTable.OUTBREAKS = Epidemiat DatabaseTable.PERSONS = Henkilöt DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Lääkemääräykset DatabaseTable.PREVIOUSHOSPITALIZATIONS = Aikaisemmat sairaalahoidot DatabaseTable.REGIONS = Erva-alueet @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Näytteet DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tehtävät +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Lääkehoidot DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Hoidot @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_fil-PH.properties b/sormas-api/src/main/resources/enum_fil-PH.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_fil-PH.properties +++ b/sormas-api/src/main/resources/enum_fil-PH.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_fj-FJ.properties b/sormas-api/src/main/resources/enum_fj-FJ.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_fj-FJ.properties +++ b/sormas-api/src/main/resources/enum_fj-FJ.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_fr-CH.properties b/sormas-api/src/main/resources/enum_fr-CH.properties index c43e83059b6..7cfc952ac0b 100644 --- a/sormas-api/src/main/resources/enum_fr-CH.properties +++ b/sormas-api/src/main/resources/enum_fr-CH.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Cours clinique DatabaseTable.CLINICAL_VISITS = Visites cliniques DatabaseTable.COMMUNITIES = communes DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Departement DatabaseTable.EPIDATA = Données épidémiologiques DatabaseTable.EVENTS = Événements +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Personnes impliquées DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Lieux DatabaseTable.OUTBREAKS = Epidémie DatabaseTable.PERSONS = Personnes DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Ordonnances DatabaseTable.PREVIOUSHOSPITALIZATIONS = Hospitalisations précédentes DatabaseTable.REGIONS = Régions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Échantillons DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tâches +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Thérapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Traitements @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_fr-FR.properties b/sormas-api/src/main/resources/enum_fr-FR.properties index aeaedf57742..322f28bf157 100644 --- a/sormas-api/src/main/resources/enum_fr-FR.properties +++ b/sormas-api/src/main/resources/enum_fr-FR.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Suivi médical DatabaseTable.CLINICAL_VISITS = Visites médicales DatabaseTable.COMMUNITIES = Communautés DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Sous-continents DatabaseTable.AREAS = Zones @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Valeurs de l'énumération personnalisa DatabaseTable.DISTRICTS = Départements DatabaseTable.EPIDATA = Données épidémiologiques DatabaseTable.EVENTS = Événements +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Groupes d'événements DatabaseTable.EVENTPARTICIPANTS = Participants DatabaseTable.EXPOSURES = Expositions @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Lieux DatabaseTable.OUTBREAKS = Epidémies DatabaseTable.PERSONS = Personnes DatabaseTable.PERSON_CONTACT_DETAILS = Coordonnées de la personne +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Ordonnances DatabaseTable.PREVIOUSHOSPITALIZATIONS = Hospitalisations précédentes DatabaseTable.REGIONS = Régions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Échantillons DatabaseTable.PATHOGEN_TESTS = Tests pathogènes DatabaseTable.ADDITIONAL_TESTS = Tests supplémentaires DatabaseTable.TASKS = Tâches +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Thérapies DatabaseTable.TRAVEL_ENTRIES = Entrées de voyage DatabaseTable.TREATMENTS = Traitements @@ -339,14 +343,16 @@ DatabaseTable.WEEKLYREPORTENTRIES = Entrées du rapport hebdomadaire DatabaseTable.PORT_HEALTH_INFO = Informations sur la santé des ports DatabaseTable.MATERNAL_HISTORIES = Antécédents maternels DatabaseTable.EXTERNAL_MESSAGES = Messages -DatabaseTable.SAMPLE_REPORTS = Sample reports -DatabaseTable.TEST_REPORTS = Test reports -DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information -DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information -DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests +DatabaseTable.SAMPLE_REPORTS = Exemples de rapports +DatabaseTable.TEST_REPORTS = Rapports d'essai +DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = Informations sur l'origine SORMAS 2 SORMAS +DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS partager des informations +DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = Demandes de partage SORMAS 2 SORMAS DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_hi-IN.properties b/sormas-api/src/main/resources/enum_hi-IN.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_hi-IN.properties +++ b/sormas-api/src/main/resources/enum_hi-IN.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_hr-HR.properties b/sormas-api/src/main/resources/enum_hr-HR.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_hr-HR.properties +++ b/sormas-api/src/main/resources/enum_hr-HR.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_it-CH.properties b/sormas-api/src/main/resources/enum_it-CH.properties index 291f2abc857..7266e543cf0 100644 --- a/sormas-api/src/main/resources/enum_it-CH.properties +++ b/sormas-api/src/main/resources/enum_it-CH.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Decorsi clinici DatabaseTable.CLINICAL_VISITS = Visite cliniche DatabaseTable.COMMUNITIES = Comuni DatabaseTable.CONTACTS = Contatti +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Distretti DatabaseTable.EPIDATA = Dati epidemiologici DatabaseTable.EVENTS = Eventi +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persone coinvolte DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Luoghi DatabaseTable.OUTBREAKS = Focolai DatabaseTable.PERSONS = Persone DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescrizioni DatabaseTable.PREVIOUSHOSPITALIZATIONS = Ricoveri precedenti DatabaseTable.REGIONS = Cantoni @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Campioni DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Compiti +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Terapie DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Trattamenti @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_it-IT.properties b/sormas-api/src/main/resources/enum_it-IT.properties index 5509caad91f..aac94589571 100644 --- a/sormas-api/src/main/resources/enum_it-IT.properties +++ b/sormas-api/src/main/resources/enum_it-IT.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Decorsi clinici DatabaseTable.CLINICAL_VISITS = Visite cliniche DatabaseTable.COMMUNITIES = Comuni DatabaseTable.CONTACTS = Contatti +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Distretti DatabaseTable.EPIDATA = Dati epidemiologici DatabaseTable.EVENTS = Eventi +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persone coinvolte DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Luoghi DatabaseTable.OUTBREAKS = Focolai DatabaseTable.PERSONS = Persone DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescrizioni DatabaseTable.PREVIOUSHOSPITALIZATIONS = Ricoveri precedenti DatabaseTable.REGIONS = Cantoni @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Campioni DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Compiti +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Terapie DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Trattamenti @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_ja-JP.properties b/sormas-api/src/main/resources/enum_ja-JP.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_ja-JP.properties +++ b/sormas-api/src/main/resources/enum_ja-JP.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_ne-NP.properties b/sormas-api/src/main/resources/enum_ne-NP.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_ne-NP.properties +++ b/sormas-api/src/main/resources/enum_ne-NP.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_nl-NL.properties b/sormas-api/src/main/resources/enum_nl-NL.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_nl-NL.properties +++ b/sormas-api/src/main/resources/enum_nl-NL.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_no-NO.properties b/sormas-api/src/main/resources/enum_no-NO.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_no-NO.properties +++ b/sormas-api/src/main/resources/enum_no-NO.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_pl-PL.properties b/sormas-api/src/main/resources/enum_pl-PL.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_pl-PL.properties +++ b/sormas-api/src/main/resources/enum_pl-PL.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_ps-AF.properties b/sormas-api/src/main/resources/enum_ps-AF.properties index 467e987cb5f..334c73c60d1 100644 --- a/sormas-api/src/main/resources/enum_ps-AF.properties +++ b/sormas-api/src/main/resources/enum_ps-AF.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_pt-PT.properties b/sormas-api/src/main/resources/enum_pt-PT.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_pt-PT.properties +++ b/sormas-api/src/main/resources/enum_pt-PT.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_ro-RO.properties b/sormas-api/src/main/resources/enum_ro-RO.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_ro-RO.properties +++ b/sormas-api/src/main/resources/enum_ro-RO.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_ru-RU.properties b/sormas-api/src/main/resources/enum_ru-RU.properties index 1b61c2f87f5..5caef52b61f 100644 --- a/sormas-api/src/main/resources/enum_ru-RU.properties +++ b/sormas-api/src/main/resources/enum_ru-RU.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_sv-SE.properties b/sormas-api/src/main/resources/enum_sv-SE.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_sv-SE.properties +++ b/sormas-api/src/main/resources/enum_sv-SE.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_sw-KE.properties b/sormas-api/src/main/resources/enum_sw-KE.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_sw-KE.properties +++ b/sormas-api/src/main/resources/enum_sw-KE.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_tr-TR.properties b/sormas-api/src/main/resources/enum_tr-TR.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_tr-TR.properties +++ b/sormas-api/src/main/resources/enum_tr-TR.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_uk-UA.properties b/sormas-api/src/main/resources/enum_uk-UA.properties index decaf478a53..ce359860f74 100644 --- a/sormas-api/src/main/resources/enum_uk-UA.properties +++ b/sormas-api/src/main/resources/enum_uk-UA.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = Travel entries DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/enum_ur-PK.properties b/sormas-api/src/main/resources/enum_ur-PK.properties index 7cfbd942596..0a4b8ee205f 100644 --- a/sormas-api/src/main/resources/enum_ur-PK.properties +++ b/sormas-api/src/main/resources/enum_ur-PK.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = طبی کورسز DatabaseTable.CLINICAL_VISITS = طبی دورے DatabaseTable.COMMUNITIES = کمیونیٹیز DatabaseTable.CONTACTS = روابط +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = براعظم DatabaseTable.SUBCONTINENTS = برصغیر DatabaseTable.AREAS = خطے @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = حسب ضرورت اینوم ويليو DatabaseTable.DISTRICTS = اضلاع DatabaseTable.EPIDATA = وبائی امراض کا ڈیٹا DatabaseTable.EVENTS = تقریبات +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = تقریب کے گروہ DatabaseTable.EVENTPARTICIPANTS = ملوث شخص DatabaseTable.EXPOSURES = ایکسپوژر/سامنا @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = پتے DatabaseTable.OUTBREAKS = پھیلاؤ DatabaseTable.PERSONS = اشخاص DatabaseTable.PERSON_CONTACT_DETAILS = شخص کے رابطے کی تفصیلات +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = نسخے DatabaseTable.PREVIOUSHOSPITALIZATIONS = گزشتہ ہسپتال میں داخلہ DatabaseTable.REGIONS = علاقے @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = نمونے DatabaseTable.PATHOGEN_TESTS = پیتھوجین ٹیسٹس DatabaseTable.ADDITIONAL_TESTS = اضافی ٹیسٹس DatabaseTable.TASKS = کام +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = علاج DatabaseTable.TRAVEL_ENTRIES = سفری اندراج DatabaseTable.TREATMENTS = علاج @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS کی اصل معل DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS معلومات کا اشتراک DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS اشتراک کی درخواستیں DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS درخواست کی معلومات کا اشتراک +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = بیرونی اشتراک کی معلومات DatabaseTable.CAMPAIGNS = مہمات +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = مہم کا فارم میٹا DatabaseTable.CAMPAIGN_FORM_DATA = مہم کے فارم کا ڈیٹا DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = مہم کے خاکے کی تعریفیں @@ -1433,7 +1439,7 @@ UserRight.VISIT_DELETE = سسٹم سے دوروں کو مٹا ديں UserRight.VISIT_EXPORT = سورماس سے دورے ايکسپورٹ کریں UserRight.TASK_DELETE = سسٹم سے کام مٹا دیں UserRight.TASK_EXPORT = سورماس سے کام ايکسپورٹ کریں -UserRight.TASK_ARCHIVE = Archive tasks +UserRight.TASK_ARCHIVE = آرکائیوڈ کام UserRight.ACTION_CREATE = نئی کارروائیاں بنائیں UserRight.ACTION_DELETE = سسٹم سے کارروائیوں کو مٹا دیں UserRight.ACTION_EDIT = موجودہ کارروائیوں میں ترمیم کریں @@ -1444,7 +1450,7 @@ UserRight.EVENTPARTICIPANT_IMPORT = تقریب کے شرکاء کو امپورٹ UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = دستی بیرونی پیغامات بھیجیں UserRight.STATISTICS_ACCESS = اعدادوشمار تک رسائی UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = عوامی ايکسپورٹ کنفیگریشنز مینج کریں -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples +UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = کیسز اور نمونوں پر بڑی تعداد میں آپریشن کریں UserRight.INFRASTRUCTURE_EXPORT = سورماس سے انفراسٹرکچر ڈیٹا ايکسپورٹ کریں UserRight.INFRASTRUCTURE_IMPORT = انفراسٹرکچر ڈیٹا امپورٹ کریں UserRight.INFRASTRUCTURE_ARCHIVE = انفراسٹرکچر ڈیٹا آرکائیو کریں @@ -1525,7 +1531,7 @@ UserRight.DEV_MODE = ڈویلپر کے اختیارات تک رسائی UserRight.DOCUMENT_VIEW = موجودہ دستاویزات دیکھیں UserRight.DOCUMENT_UPLOAD = دستاویزات اپ لوڈ کریں UserRight.DOCUMENT_DELETE = سسٹم سے دستاویزات مٹا دیں -UserRight.PERSON_MERGE = Merge persons +UserRight.PERSON_MERGE = افراد کو ضم کریں # UserRight descriptions UserRight.Desc.CASE_ARCHIVE = کیسز کو آرکائیو کرنے کے قابل @@ -1583,7 +1589,7 @@ UserRight.Desc.TASK_ASSIGN = صارفین کےليے کام مختص کرنے ک UserRight.Desc.TASK_CREATE = نئے کام بنانے کے قابل UserRight.Desc.TASK_EDIT = موجودہ کاموں میں ترمیم کرنے کے قابل UserRight.Desc.TASK_VIEW = موجودہ کاموں کو دیکھنے کے قابل -UserRight.Desc.TASK_ARCHIVE = Able to archive tasks +UserRight.Desc.TASK_ARCHIVE = کاموں کو آرکائیو کرنے کے قابل UserRight.Desc.USER_CREATE = نئے صارفین بنانے کے قابل UserRight.Desc.USER_EDIT = موجودہ صارفین میں ترمیم کرنے کے قابل UserRight.Desc.USER_VIEW = موجودہ صارفین کو دیکھنے کے قابل @@ -1701,7 +1707,7 @@ UserRight.Desc.DEV_MODE = کنفیگریشن ڈائرکٹری میں ڈویلپ UserRight.Desc.DOCUMENT_VIEW = موجودہ دستاویزات دیکھنے کے قابل UserRight.Desc.DOCUMENT_UPLOAD = موجودہ دستاویزات اپ لوڈ کرنےکے قابل UserRight.Desc.DOCUMENT_DELETE = سسٹم سے دستاویزات مٹانے کے قابل -UserRight.Desc.PERSON_MERGE = Able to merge persons +UserRight.Desc.PERSON_MERGE = افراد کو ضم کرنے کے قابل # UserRightGroup UserRightGroup.GENERAL = جنرل diff --git a/sormas-api/src/main/resources/enum_zh-CN.properties b/sormas-api/src/main/resources/enum_zh-CN.properties index 34e8aaa299d..72b09e11c45 100644 --- a/sormas-api/src/main/resources/enum_zh-CN.properties +++ b/sormas-api/src/main/resources/enum_zh-CN.properties @@ -295,6 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Clinical courses DatabaseTable.CLINICAL_VISITS = Clinical visits DatabaseTable.COMMUNITIES = Communities DatabaseTable.CONTACTS = Contacts +DatabaseTable.CONTACTS_VISITS = Contacts → Visits DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Subcontinents DatabaseTable.AREAS = Areas @@ -303,6 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Customizable enum values DatabaseTable.DISTRICTS = Districts DatabaseTable.EPIDATA = Epidemiological data DatabaseTable.EVENTS = Events +DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups DatabaseTable.EVENTGROUPS = Event groups DatabaseTable.EVENTPARTICIPANTS = Persons involved DatabaseTable.EXPOSURES = Exposures @@ -316,6 +318,7 @@ DatabaseTable.LOCATIONS = Locations DatabaseTable.OUTBREAKS = Outbreaks DatabaseTable.PERSONS = Persons DatabaseTable.PERSON_CONTACT_DETAILS = Person contact details +DatabaseTable.PERSON_LOCATIONS = Person locations DatabaseTable.PRESCRIPTIONS = Prescriptions DatabaseTable.PREVIOUSHOSPITALIZATIONS = Previous hospitalizations DatabaseTable.REGIONS = Regions @@ -323,6 +326,7 @@ DatabaseTable.SAMPLES = Samples DatabaseTable.PATHOGEN_TESTS = Pathogen tests DatabaseTable.ADDITIONAL_TESTS = Additional tests DatabaseTable.TASKS = Tasks +DatabaseTable.TASK_OBSERVER = Task observer DatabaseTable.THERAPIES = Therapies DatabaseTable.TRAVEL_ENTRIES = 旅行记录 DatabaseTable.TREATMENTS = Treatments @@ -345,8 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS origin information DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS share information DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS share requests DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info DatabaseTable.EXTERNAL_SHARE_INFO = External share information DatabaseTable.CAMPAIGNS = Campaigns +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions diff --git a/sormas-api/src/main/resources/strings_ar-SA.properties b/sormas-api/src/main/resources/strings_ar-SA.properties index ff3e81055d5..7717fec1c94 100644 --- a/sormas-api/src/main/resources/strings_ar-SA.properties +++ b/sormas-api/src/main/resources/strings_ar-SA.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_cs-CZ.properties b/sormas-api/src/main/resources/strings_cs-CZ.properties index 96765e3dc15..0c96372bb50 100644 --- a/sormas-api/src/main/resources/strings_cs-CZ.properties +++ b/sormas-api/src/main/resources/strings_cs-CZ.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Opravdu chcete archivovat tuto událost? To ji neodst confirmationArchiveEvents = Jste si jisti, že chcete archivovat všech %d vybraných událostí? confirmationArchiveEventParticipant = Opravdu chcete archivovat tohoto účastníka události? Toto jej neodstraní ze systému ani ze statistik, ale skryje ho pouze ze seznamu účastníků událostí. confirmationArchiveImmunization = Opravdu chcete archivovat tuto imunizaci? Toto neodstraní ze systému ani ze statistik, ale skryje pouze z normální adresáře imunizace. -confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. -confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? +confirmationArchiveTask = Opravdu chcete archivovat tento úkol? To jej neodstraní ze systému ani ze statistik, ale skryje pouze před běžným řízením úkolů. +confirmationArchiveTasks = Opravdu chcete archivovat všech %d vybraných úkolů? confirmationArchiveTravelEntry = Opravdu chcete archivovat tento cestovní vstup? To ho neodstraní ze systému ani ze statistik, ale skryje pouze z běžného adresáře cestovních vstupů. confirmationArchiveEventGroup = Opravdu chcete archivovat tuto skupinu událostí? Toto neodstraní ze systému ani ze statistik, ale skryje pouze z adresáře skupin událostí. confirmationCancelFollowUp = Opravdu chcete zrušit sledování všech %d vybraných kontaktů? @@ -1128,10 +1128,10 @@ messageSpecifyRowAttribute = Zadejte atribut řádku, který jste vybrali pro vi messageSymptomsHint = Zaškrtněte prosím odpověď pro VŠECHNY příznaky, které naznačují, zda se vyskytly kdykoli během této nemoci\: messageSymptomsVisitHint = Zaškrtněte prosím odpověď pro VŠECHNY příznaky, které naznačují, zda byly přítomny v době této návštěvy\: messageTasksArchived = Všechny vybrané úkoly byly archivovány -messageTaskArchived = The task has been archived +messageTaskArchived = Úkol byl archivován messageTasksEdited = Všechny úkoly byly upraveny messageTasksDearchived = Všechny vybrané úkoly byly dearchivovány -messageTaskDearchived = The task has been de-archived +messageTaskDearchived = Úkol byl dearchivován messageTasksDeleted = Všechny vybrané úkoly byly odstraněny messageTemplateNotAvailable = Soubor šablony není k dispozici. Kontaktujte prosím administrátora a řekněte mu o tomto problému. messageTravelEntrySaved = Zadané údaje o cestování uloženy @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = Všechny formuláře kampaně byly úspěšně ov messageEnterSms = Prosím zadejte vaši SMS zprávu\: messageSelectedPeriodTooLong = Vybrali jste časové období, které překračuje maximální počet dní. Ujistěte se, že zvolená lhůta nepřesáhne %d dní. messagePersonAlreadyEventParticipant = Osoba případu je již účastníkem vybrané události. Tento případ byl propojen s vybranou událostí. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = Nový účastník události byl vytvořen. messagePersonAlreadyCaseInEvent = Tento případ je již propojen s vybranou událostí. messagePersonContactDetailsPrimaryDuplicate = Hlavní kontaktní údaje tohoto typu jsou již zaznamenány pro tuto osobu. Chcete místo toho nastavit tyto kontaktní údaje jako hlavní kontaktní údaje? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = Ve vašem systému je alespoň jedna p messageDeleteWithPendingShareRequest = Existuje čekající požadavek na sdílení. S odstraněním bude žádost o sdílení zrušena a odstraněna. messageCannotMergeMoreThanTwoPersons = Pro sloučení musíte vybrat dvě osoby\! messageAutomaticDeletionStarted = Automatické smazání bylo zahájeno a bude provedeno na pozadí. Vezměte prosím na vědomí, že v závislosti na množství dat, která jsou odstraněna, může tento proces nějakou dobu trvat. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = Klasifikace případu %s se změnila na %s. diff --git a/sormas-api/src/main/resources/strings_de-CH.properties b/sormas-api/src/main/resources/strings_de-CH.properties index ab725101a46..d4a076e60d9 100644 --- a/sormas-api/src/main/resources/strings_de-CH.properties +++ b/sormas-api/src/main/resources/strings_de-CH.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = Alle Kampagnenformulare wurden erfolgreich validi messageEnterSms = Bitte geben Sie hier Ihre SMS Nachricht ein\: messageSelectedPeriodTooLong = Sie haben einen Zeitraum ausgewählt, der die maximale Anzahl von Tagen überschreitet. Bitte stellen Sie sicher, dass der gewählte Zeitraum %d Tage nicht überschreitet. messagePersonAlreadyEventParticipant = Die Fall-Person ist bereits ein Ereignisteilnehmer in dem ausgewählten Ereignis. Dieser Fall wurde mit dem ausgewählten Ereignis verknüpft. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = Der neue Ereignisteilnehmer wurde erstellt. messagePersonAlreadyCaseInEvent = Dieser Fall ist bereits mit dem ausgewählten Ereignis verknüpft. messagePersonContactDetailsPrimaryDuplicate = Es gibt bereits primäre Kontaktdaten dieser Art für diese Person. Möchten Sie diese Kontaktdaten stattdessen als primäre Kontaktdaten festlegen? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = Es gibt mindestens eine ähnliche Pers messageDeleteWithPendingShareRequest = Es gibt eine ausstehende Freigabeanfrage. Mit einer Löschung wird die Freigabeanfrage widerrufen und gelöscht. messageCannotMergeMoreThanTwoPersons = Sie müssen zwei Personen zum Zusammenführen auswählen\! messageAutomaticDeletionStarted = Automatisches Löschen wurde gestartet und wird im Hintergrund ausgeführt. Bitte beachten Sie, dass dieser Prozess je nach Anzahl der zu löschenden Daten einige Zeit in Anspruch nehmen kann. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = Die Falldefinitionskategorie des Falls %s wurde auf %s geändert. diff --git a/sormas-api/src/main/resources/strings_de-DE.properties b/sormas-api/src/main/resources/strings_de-DE.properties index 73de0d3f58e..bd153bdb6f0 100644 --- a/sormas-api/src/main/resources/strings_de-DE.properties +++ b/sormas-api/src/main/resources/strings_de-DE.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = Alle Kampagnenformulare wurden erfolgreich validi messageEnterSms = Bitte geben Sie hier Ihre SMS Nachricht ein\: messageSelectedPeriodTooLong = Sie haben einen Zeitraum ausgewählt, der die maximale Anzahl von Tagen überschreitet. Bitte stellen Sie sicher, dass der gewählte Zeitraum %d Tage nicht überschreitet. messagePersonAlreadyEventParticipant = Die Fall-Person ist bereits ein Ereignisteilnehmer in dem ausgewählten Ereignis. Dieser Fall wurde mit dem ausgewählten Ereignis verknüpft. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = Der neue Ereignisteilnehmer wurde erstellt. messagePersonAlreadyCaseInEvent = Dieser Fall ist bereits mit dem ausgewählten Ereignis verknüpft. messagePersonContactDetailsPrimaryDuplicate = Es gibt bereits primäre Kontaktdaten dieser Art für diese Person. Möchten Sie diese Kontaktdaten stattdessen als primäre Kontaktdaten festlegen? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = Es gibt mindestens eine ähnliche Pers messageDeleteWithPendingShareRequest = Es gibt eine ausstehende Anfrage zur Übernahme. Mit einer Löschung wird die Anfrage widerrufen und gelöscht. messageCannotMergeMoreThanTwoPersons = Sie müssen zwei Personen zum Zusammenführen auswählen\! messageAutomaticDeletionStarted = Automatisches Löschen wurde gestartet und wird im Hintergrund ausgeführt. Bitte beachten Sie, dass dieser Prozess je nach Anzahl der zu löschenden Daten einige Zeit in Anspruch nehmen kann. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = Die Falldefinitionskategorie des Falls %s wurde auf %s geändert. diff --git a/sormas-api/src/main/resources/strings_en-AF.properties b/sormas-api/src/main/resources/strings_en-AF.properties index a1341b41170..9b694090d9e 100644 --- a/sormas-api/src/main/resources/strings_en-AF.properties +++ b/sormas-api/src/main/resources/strings_en-AF.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_en-GH.properties b/sormas-api/src/main/resources/strings_en-GH.properties index cb3c1ef2faf..fa9858b8c20 100644 --- a/sormas-api/src/main/resources/strings_en-GH.properties +++ b/sormas-api/src/main/resources/strings_en-GH.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_en-NG.properties b/sormas-api/src/main/resources/strings_en-NG.properties index be54e12ac6b..8a1ca571153 100644 --- a/sormas-api/src/main/resources/strings_en-NG.properties +++ b/sormas-api/src/main/resources/strings_en-NG.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_es-CU.properties b/sormas-api/src/main/resources/strings_es-CU.properties index 5642a79abba..957ebff77fd 100644 --- a/sormas-api/src/main/resources/strings_es-CU.properties +++ b/sormas-api/src/main/resources/strings_es-CU.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = ¿Está seguro de que desea archivar este evento? Est confirmationArchiveEvents = ¿Está seguro de que desea archivar todos los %d eventos seleccionados? confirmationArchiveEventParticipant = ¿Está seguro de que desea archivar este participante de evento? Esto no lo eliminará del sistema ni de ninguna estadística; sólo lo ocultará de la lista de participantes de evento. confirmationArchiveImmunization = ¿Está seguro de que desea archivar esta inmunización? Esto no la eliminará del sistema ni de ninguna estadística; sólo la ocultará del directorio normal de inmunización. -confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. -confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? +confirmationArchiveTask = ¿Está seguro de que desea archivar esta tarea? Esto no la eliminará del sistema ni de ninguna estadística; sólo la ocultará de la administración normal de tareas. +confirmationArchiveTasks = ¿Está seguro de que desea archivar todas las %d tareas seleccionadas? confirmationArchiveTravelEntry = ¿Está seguro de que desea archivar esta entrada de viaje? Esto no la eliminará del sistema ni de ninguna estadística; sólo lo ocultará del directorio normal de entradas de viaje. confirmationArchiveEventGroup = ¿Está seguro de que desea archivar este grupo de eventos? Esto no lo eliminará del sistema ni de ninguna estadística; sólo lo ocultará del directorio normal de grupos de eventos. confirmationCancelFollowUp = ¿Está seguro de que desea cancelar el seguimiento de todos los %d contactos seleccionados? @@ -1128,10 +1128,10 @@ messageSpecifyRowAttribute = Por favor especifique el atributo de fila que eligi messageSymptomsHint = Por favor, marque una respuesta para TODOS los síntomas indicando si ocurrieron en algún momento durante esta enfermedad\: messageSymptomsVisitHint = Por favor, marque una respuesta para TODOS los síntomas indicando si estaban presentes en el momento de esta visita\: messageTasksArchived = Todas las tareas seleccionadas fueron archivadas -messageTaskArchived = The task has been archived +messageTaskArchived = La tarea fue archivada messageTasksEdited = Todas las tareas fueron editadas messageTasksDearchived = Todas las tareas seleccionadas fueron desarchivadas -messageTaskDearchived = The task has been de-archived +messageTaskDearchived = La tarea fue desarchivada messageTasksDeleted = Todas las tareas seleccionadas fueron eliminadas messageTemplateNotAvailable = El archivo de plantilla no está disponible. Por favor, contacte a un administrador e infórmele sobre este problema. messageTravelEntrySaved = Datos de entrada de viaje guardados @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = Todos los formularios de campaña se validaron ex messageEnterSms = Por favor escriba su mensaje SMS aquí\: messageSelectedPeriodTooLong = Ha seleccionado un período de tiempo que excede el número máximo de días. Por favor, asegure que el período de tiempo seleccionado no exceda los %d días. messagePersonAlreadyEventParticipant = La persona del caso ya es un participante de evento del evento seleccionado. Este caso ha sido vinculado al evento seleccionado. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = Se creó el nuevo participante de evento. messagePersonAlreadyCaseInEvent = Este caso ya está vinculado al evento seleccionado. messagePersonContactDetailsPrimaryDuplicate = Ya hay datos de contacto principales de este tipo registrados para esta persona. ¿Desea establecer estos datos de contacto como los datos de contacto principales? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = Hay al menos una persona similar en su messageDeleteWithPendingShareRequest = Hay una solicitud de compartición pendiente. Con una eliminación, la solicitud de compartición será revocada y eliminada. messageCannotMergeMoreThanTwoPersons = ¡Debe seleccionar dos personas para combinar\! messageAutomaticDeletionStarted = La eliminación automática se ha iniciado y se ejecutará en segundo plano. Tenga en cuenta que, dependiendo de la cantidad de datos que se eliminen, este proceso puede tardar algún tiempo. +messageUserRoleUnusableForLogin = Los usuarios que sólo tengan este rol no podrán iniciar sesión porque el rol no tiene derecho de Acceso a Sormas UI ni derecho de Acceso a Sormas REST # Notifications notificationCaseClassificationChanged = La clasificación del caso %s se cambió a %s. diff --git a/sormas-api/src/main/resources/strings_es-EC.properties b/sormas-api/src/main/resources/strings_es-EC.properties index 5c038d20d20..7d891d3a5bc 100644 --- a/sormas-api/src/main/resources/strings_es-EC.properties +++ b/sormas-api/src/main/resources/strings_es-EC.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = La clasificación del caso %s ha sido cambiado a %s. diff --git a/sormas-api/src/main/resources/strings_es-ES.properties b/sormas-api/src/main/resources/strings_es-ES.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_es-ES.properties +++ b/sormas-api/src/main/resources/strings_es-ES.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_fa-AF.properties b/sormas-api/src/main/resources/strings_fa-AF.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_fa-AF.properties +++ b/sormas-api/src/main/resources/strings_fa-AF.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_fi-FI.properties b/sormas-api/src/main/resources/strings_fi-FI.properties index 49e13e82db7..1e3e665034d 100644 --- a/sormas-api/src/main/resources/strings_fi-FI.properties +++ b/sormas-api/src/main/resources/strings_fi-FI.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = Potilaan %s luokitus on muuttunut luokkaan %s. diff --git a/sormas-api/src/main/resources/strings_fil-PH.properties b/sormas-api/src/main/resources/strings_fil-PH.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_fil-PH.properties +++ b/sormas-api/src/main/resources/strings_fil-PH.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_fj-FJ.properties b/sormas-api/src/main/resources/strings_fj-FJ.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_fj-FJ.properties +++ b/sormas-api/src/main/resources/strings_fj-FJ.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_fr-CH.properties b/sormas-api/src/main/resources/strings_fr-CH.properties index e4efdba0ac7..a6111ec0f7d 100644 --- a/sormas-api/src/main/resources/strings_fr-CH.properties +++ b/sormas-api/src/main/resources/strings_fr-CH.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = Tous les formulaires de campagne ont été valid messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = La classification du cas %s a changé en %s. diff --git a/sormas-api/src/main/resources/strings_fr-FR.properties b/sormas-api/src/main/resources/strings_fr-FR.properties index 8666e945a4e..9d0d8836b20 100644 --- a/sormas-api/src/main/resources/strings_fr-FR.properties +++ b/sormas-api/src/main/resources/strings_fr-FR.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = Tous les formulaires de campagne ont été valid messageEnterSms = Veuillez entrer votre message ici. messageSelectedPeriodTooLong = Vous avez sélectionné une période de temps qui dépasse le nombre maximum de jours. Veuillez vous assurer que la période sélectionnée ne dépasse pas %d jours. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = Le nouveau participant a été créé. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = La classification du cas %s a changé en %s. diff --git a/sormas-api/src/main/resources/strings_hi-IN.properties b/sormas-api/src/main/resources/strings_hi-IN.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_hi-IN.properties +++ b/sormas-api/src/main/resources/strings_hi-IN.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_hr-HR.properties b/sormas-api/src/main/resources/strings_hr-HR.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_hr-HR.properties +++ b/sormas-api/src/main/resources/strings_hr-HR.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_it-CH.properties b/sormas-api/src/main/resources/strings_it-CH.properties index c159c94de12..57538458b8a 100644 --- a/sormas-api/src/main/resources/strings_it-CH.properties +++ b/sormas-api/src/main/resources/strings_it-CH.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = Tutti i moduli della campagna sono stati convalid messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = La classificazione del caso %s è cambiata in %s. diff --git a/sormas-api/src/main/resources/strings_it-IT.properties b/sormas-api/src/main/resources/strings_it-IT.properties index 80e2e318e86..67ac96f486f 100644 --- a/sormas-api/src/main/resources/strings_it-IT.properties +++ b/sormas-api/src/main/resources/strings_it-IT.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = La classificazione del caso %s è cambiata in %s. diff --git a/sormas-api/src/main/resources/strings_ja-JP.properties b/sormas-api/src/main/resources/strings_ja-JP.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_ja-JP.properties +++ b/sormas-api/src/main/resources/strings_ja-JP.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_ne-NP.properties b/sormas-api/src/main/resources/strings_ne-NP.properties index ff3e81055d5..7717fec1c94 100644 --- a/sormas-api/src/main/resources/strings_ne-NP.properties +++ b/sormas-api/src/main/resources/strings_ne-NP.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_nl-NL.properties b/sormas-api/src/main/resources/strings_nl-NL.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_nl-NL.properties +++ b/sormas-api/src/main/resources/strings_nl-NL.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_no-NO.properties b/sormas-api/src/main/resources/strings_no-NO.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_no-NO.properties +++ b/sormas-api/src/main/resources/strings_no-NO.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_pl-PL.properties b/sormas-api/src/main/resources/strings_pl-PL.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_pl-PL.properties +++ b/sormas-api/src/main/resources/strings_pl-PL.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_ps-AF.properties b/sormas-api/src/main/resources/strings_ps-AF.properties index 38d91a3eda0..fb0107da1ba 100644 --- a/sormas-api/src/main/resources/strings_ps-AF.properties +++ b/sormas-api/src/main/resources/strings_ps-AF.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_pt-PT.properties b/sormas-api/src/main/resources/strings_pt-PT.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_pt-PT.properties +++ b/sormas-api/src/main/resources/strings_pt-PT.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_ro-RO.properties b/sormas-api/src/main/resources/strings_ro-RO.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_ro-RO.properties +++ b/sormas-api/src/main/resources/strings_ro-RO.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_ru-RU.properties b/sormas-api/src/main/resources/strings_ru-RU.properties index 78b560159a5..11a7ed70331 100644 --- a/sormas-api/src/main/resources/strings_ru-RU.properties +++ b/sormas-api/src/main/resources/strings_ru-RU.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_sv-SE.properties b/sormas-api/src/main/resources/strings_sv-SE.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_sv-SE.properties +++ b/sormas-api/src/main/resources/strings_sv-SE.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_sw-KE.properties b/sormas-api/src/main/resources/strings_sw-KE.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_sw-KE.properties +++ b/sormas-api/src/main/resources/strings_sw-KE.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_tr-TR.properties b/sormas-api/src/main/resources/strings_tr-TR.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_tr-TR.properties +++ b/sormas-api/src/main/resources/strings_tr-TR.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_uk-UA.properties b/sormas-api/src/main/resources/strings_uk-UA.properties index 93c82e7ce00..f9dac827068 100644 --- a/sormas-api/src/main/resources/strings_uk-UA.properties +++ b/sormas-api/src/main/resources/strings_uk-UA.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/strings_ur-PK.properties b/sormas-api/src/main/resources/strings_ur-PK.properties index 04bbea54648..8e0469b9de9 100644 --- a/sormas-api/src/main/resources/strings_ur-PK.properties +++ b/sormas-api/src/main/resources/strings_ur-PK.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = کیا آپ واقعی اس تقریب کو آرکا confirmationArchiveEvents = کیا آپ واقعی تمام %d منتخب تقریبات کو آرکائیو کرنا چاہتے ہیں؟ confirmationArchiveEventParticipant = کیا آپ واقعی اس تقریب کے شرکت کنندہ کو آرکائیو کرنا چاہتے ہیں؟ یہ اسے سسٹم یا کسی بھی اعداد و شمار سے نہیں ہٹائے گا، بلکہ اسے صرف تقریب کے شرکاء کی فہرست سے چھپائے گا۔ confirmationArchiveImmunization = کیا آپ واقعی اس امیونائزیشن کو آرکائیو کرنا چاہتے ہیں؟ یہ اس کو سسٹم یا کسی بھی اعداد و شمار سے نہیں ہٹائے گا، لیکن اسے صرف نارمل امیونائزیشن ڈائرکٹری سے چھپائے گا۔ -confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. -confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? +confirmationArchiveTask = کیا آپ واقعی اس کام کو آرکائیو کرنا چاہتے ہیں؟ یہ اس کو سسٹم یا کسی بھی اعداد و شمار سے نہیں ہٹائے گا، لیکن اسے صرف نارمل کام کی ڈائرکٹری سے چھپائے گا۔ +confirmationArchiveTasks = کیا آپ واقعی تمام %d منتخب کاموں کو آرکائیو کرنا چاہتے ہیں؟ confirmationArchiveTravelEntry = کیا آپ واقعی اس سفر کے اندراج کو آرکائیو کرنا چاہتے ہیں؟ یہ اس کو سسٹم یا کسی بھی اعداد و شمار سے نہیں ہٹائے گا، لیکن اسے صرف نارمل سفر کے اندراج کی ڈائرکٹری سے چھپائے گا۔ confirmationArchiveEventGroup = کیا آپ واقعی اس تقریبی گروہ کو آرکائیو کرنا چاہتے ہیں؟ یہ اس کو سسٹم یا کسی بھی اعداد و شمار سے نہیں ہٹائے گا، لیکن اسے صرف نارمل تقریبی گروہ کی ڈائرکٹری سے چھپائے گا۔ confirmationCancelFollowUp = کیا آپ واقعی تمام %d منتخب رابطوں کا فالو اپ منسوخ کرنا چاہتے ہیں؟ @@ -798,7 +798,7 @@ infoCaseManagementExport = ان قطاروں کو ایکسپورٹ کریں جو infoDisplayNetworkDiagram = براہ کرم بیماری کی منتقلی کی جوڑ دیکھنے کے لیے زیادہ سے زیادہ استعمال کریں۔ infoDocumentAlreadyExists = فائل نام "%s" کے ساتھ ایک دستاویز پہلے سے موجود ہے۔ کیا آپ واقعی اپ لوڈ کرنا چاہتے ہیں؟ infoDocumentOverride = فائل نام "%s" کے ساتھ ایک دستاویز پہلے سے موجود ہے۔ اوور رائٹ؟ -infoDontShareCheckboxAlreadyShared = Case was already shared. It can not be set to don't share with external reporting tool. +infoDontShareCheckboxAlreadyShared = کیس پہلے ہی شیئر کیا گیا تھا۔ اسے بیرونی رپورٹنگ ٹول کے ساتھ اشتراک نہ کرنے پر سیٹ نہیں کیا جا سکتا۔ infoDownloadDocumentTemplateImportGuide = اگر آپ پہلی بار سورماس پر دستاویز کے ٹیمپلیٹس کو اپ لوڈ کر رہے ہیں، تو ہم پرزور مشورہ دیتے ہیں کہ پہلے دستاویز کے ٹیمپلیٹ گائیڈ کو پڑھیں۔ infoDownloadExport = ایکسپورٹ کی تیاری کی جا رہی ہے۔ اس میں کچھ وقت لگ سکتا ہے۔
ڈاؤن لوڈ مکمل ہونے کے بعد آپ اس ڈائیلاگ کو بند کر سکتے ہیں۔ infoDownloadCaseImportTemplate = آپ اپنے ڈیٹا کو اس فارمیٹ میں لانے کے لیے اس ٹیمپلیٹ .csv فائل کا استعمال کر سکتے ہیں جو سورماس پڑھ سکتا ہے۔ براہ کرم ہر بار جب آپ ڈیٹا امپورٹ کرتے ہیں تو یہ کریں، کبھی بھی ایسی فائل استعمال نہ کریں جو آپ نے پہلے ڈاؤن لوڈ کی ہیں۔ @@ -859,8 +859,8 @@ infoMergingHideDescription = اس اختیار کا انتخاب کریں اگر infoContactMergingHideDescription = اس اختیار کو منتخب کریں اگر آپ کو یقین نہیں ہے کہ آیا دونوں رابطے ایک جیسے ہیں یا اگر آپ جانتے ہیں کہ وہ نہیں ہیں۔ یہ فہرست سے رابطے کے جوڑے کو چھپا دے گا۔ براہ کرم نوٹ کریں کہ، جب آپ منظر کو ریفریش کرتے ہیں یا بعد میں اس پر واپس آتے ہیں، تو یہ دوبارہ ظاہر ہو جائے گا جب تک کہ آپ تخلیق کی تاریخ کے فلٹر میں مختلف وقت کا انتخاب نہیں کرتے ہیں۔ infoPersonMergeDescription = براہ کرم نیچے دیے گئے افراد میں سے کسی ایک کو سرکردہ شخص کے طور پر منتخب کریں۔ جاری رکھنے کے لیے آپ کے پاس درج ذیل اختیارات ہیں۔
ضم کریں\: مسترد شدہ شخص کا ڈیٹا منسلک اور/یا باقی شخص سے جوڑا جائے گا لیکن اوور رائٹ نہیں کیا جائے گا۔ آپ اس کارروائی کو کالعدم نہیں کر سکیں گے۔
چنیں\: باقی شخص کا ڈیٹا تبدیل نہیں کیا جائے گا اور دوسرے شخص کا ڈیٹا ضائع کر دیا جائے گا۔ تاہم، مسترد شدہ شخص سے منسلک اداروں کو باقی شخص سے منسلک کیا جائے گا. آپ اس کارروائی کو کالعدم نہیں کر سکیں گے۔ infoPersonMergeConfirmation = کیا آپ کو یقین ہے کہ آپ یہ کرنا چاہتے ہیں، عمل الٹنے والا نہیں ہے۔ -infoPersonMergeConfirmationBothShared = The persons you want to merge both have shared entities via S2S. If you merge these persons, the synchronization will be broken for the person who is not the leading one and the associated entities. Please discuss with your administrator if you would like to do this and verify which of the two persons you would like to have as the leading person.
Are you certain you want to do this? The action is not reversible. -infoPersonMergeSharedMustLead = Please note, you cannot choose this person as a leading person because then the synchronization of S2S would break.\nPlease select the other person as leading person +infoPersonMergeConfirmationBothShared = جن افراد کو آپ دونوں کو ضم کرنا چاہتے ہیں ان کے پاس S2S کے ذریعے مشترکہ ہیں۔ اگر آپ ان افراد کو ضم کرتے ہیں، تو ہم آہنگی اس شخص کے لیے ٹوٹ جائے گی جو سرکردہ نہیں ہے اور اس سے وابستہ اداروں کے لیے۔ اگر آپ یہ کرنا چاہتے ہیں تو براہ کرم اپنے منتظم سے بات کریں اور تصدیق کریں کہ آپ دونوں میں سے کس کو سرکردہ شخص کے طور پر رکھنا چاہتے ہیں۔
کیا آپ کو یقین ہے کہ آپ یہ کرنا چاہتے ہیں؟ عمل الٹنے والا نہیں ہے۔ +infoPersonMergeSharedMustLead = براہ کرم نوٹ کریں، آپ اس شخص کو ایک سرکردہ شخص کے طور پر منتخب نہیں کر سکتے کیونکہ اس کے بعد S2S کی ہم آہنگی ٹوٹ جائے گی۔\nبراہ کرم دوسرے شخص کو سرکردہ شخص کے طور پر منتخب کریں۔ infoPersonMergeConfirmationForNonSimilarPersons = دو منتخب افراد ڈپلیکیٹ افراد کا پتہ لگانے کے لیے SORMAS کے استعمال کردہ مماثلت کے تقاضوں سے میل نہیں کھاتے ہیں۔ براہ کرم یقینی بنائیں کہ منتخب افراد واقعی ایک جیسے ہیں اور آگے بڑھنے سے پہلے انہیں ضم کیا جانا چاہئے۔ infoHowToMergeCases = ممکنہ طور پر ڈپلیکیٹ کیسز کا جائزہ لیتے وقت آپ دو اختیارات میں سے انتخاب کر سکتے ہیں\: infoHowToMergeContacts = ممکنہ طور پر ڈپلیکیٹ روابط کا جائزہ لیتے وقت آپ دو اختیارات میں سے انتخاب کر سکتے ہیں\: @@ -1128,10 +1128,10 @@ messageSpecifyRowAttribute = براہ کرم اس قطار کی خصوصیت ک messageSymptomsHint = براہ کرم تمام علامات کے جواب پر نشان لگائیں جو اس بات کی نشاندہی کریں کہ آیا وہ اس بیماری کے دوران کسی بھی وقت واقع ہوئی ہیں\: messageSymptomsVisitHint = براہ کرم تمام علامات کے جواب پر نشان لگائیں جو یہ بتاتا ہے کہ آیا وہ اس دورے کے وقت موجود تھے\: messageTasksArchived = تمام منتخب کاموں کو آرکائیو کر دیا گیا ہے -messageTaskArchived = The task has been archived +messageTaskArchived = کام کو آرکائیو کر دیا گیا ہے messageTasksEdited = تمام کاموں میں ترمیم کی گئی ہے messageTasksDearchived = تمام منتخب کاموں کو ڈی آرکائیو کر دیا گیا ہے -messageTaskDearchived = The task has been de-archived +messageTaskDearchived = کام ڈی آرکائیو کردیا گیا ہے messageTasksDeleted = تمام منتخب کاموں کو مٹا دیا گیا ہے messageTemplateNotAvailable = ٹیمپلیٹ فائل دستیاب نہیں ہے۔ براہ کرم کسی ایڈمن سے رابطہ کریں اور انہیں اس مسئلے کے بارے میں بتائیں۔ messageTravelEntrySaved = سفر کے اندراج کا ڈیٹا محفوظ ہو گیا @@ -1144,7 +1144,7 @@ messageTreatmentSaved = علاج محفوظ کر لیا messageTreatmentsDeleted = تمام منتخب تقریبات کو مٹا دیا گیا ہے messageUnknownFilterAttributeForPopulationData = نامعلوم جنس یا عمر گروپ کے لیے کیس کے واقعات کا تناسب ظاہر کرنا ممکن نہیں ہے۔ براہ کرم اپنے فلٹرز سے متعلقہ ویلیوز کو ہٹا دیں۔ messageDeletionUnsupportedByExternalJournalWarning = بیرونی جریدے نے ابھی تک سورماس کے اندر سے غیر رجسٹرڈ افراد کو کوئی فنکشن فراہم نہیں کیا ہے۔ براہ کرم دستی طور پر اس شخص کو بیرونی جریدے سے مٹا دیں۔ -messageExternalJournalDidNotProvideMessage = The external journal did not provide a message. +messageExternalJournalDidNotProvideMessage = بیرونی جریدے نے کوئی پیغام نہیں دیا۔ messageDiseaseNotSpecifiedInLabMessage = خارجی پیغام کی بیماری کا خود بخود تعین نہیں ہو سکا۔ براہ کرم دستی طور پر تصدیق کریں کہ یہ پیغام SORMAS میں نمٹنے والی بیماری کے بارے میں ہے۔ messageUserRoleCombination = کے ساتھ مل کر نہیں کیا جا سکتا messageUserRoleSaved = صارف کا کردار محفوظ ہو گیا @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = مہم کے تمام فارمز کی کامیاب messageEnterSms = براہ کرم اپنا SMS پیغام یہاں درج کریں\: messageSelectedPeriodTooLong = آپ نے ایک مدت کا انتخاب کیا ہے جو دنوں کی زیادہ سے زیادہ تعداد سے زیادہ ہے۔ براہ کرم یقینی بنائیں کہ منتخب کردہ مدت %d دنوں سے زیادہ نہ ہو۔ messagePersonAlreadyEventParticipant = کیس پرسن پہلے سے ہی منتخب تقریب میں تقریب کا شریک ہے۔ اس کیس کو منتخب تقریب سے جوڑ دیا گیا ہے۔ +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = تقریب کا نیا شرکت کنندہ بنا دیا گیا۔ messagePersonAlreadyCaseInEvent = یہ کیس پہلے ہی منتخب تقریب سے منسلک ہے۔ messagePersonContactDetailsPrimaryDuplicate = اس شخص کے لیے اس قسم کی ابتدائی رابطے کی تفصیلات پہلے سے ہی ریکارڈ کی گئی ہیں۔ کیا آپ اس کے بجائے رابطے کی ان تفصیلات کو بنیادی رابطے کی تفصیلات کے طور پر سیٹ کرنا چاہتے ہیں؟ @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = آپ کے سسٹم میں کم از ک messageDeleteWithPendingShareRequest = شیئر کی درخواست زیر التوا ہے۔ مٹانے کے ساتھ، اشتراک کی درخواست کو منسوخ اور مٹا دیا جائے گا۔ messageCannotMergeMoreThanTwoPersons = آپ کو انضمام کے لیے دو افراد کو منتخب کرنے کی ضرورت ہے\! messageAutomaticDeletionStarted = خودکار مٹانا شروع کر دیا گیا ہے اور اسے پس منظر میں عمل میں لایا جائے گا۔ براہ کرم نوٹ کریں کہ مٹنے والے ڈیٹا کی مقدار پر منحصر ہے، اس عمل میں کچھ وقت لگ سکتا ہے۔ +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = کیس %s کی درجہ بندی %s میں تبدیل ہو گئی ہے۔ diff --git a/sormas-api/src/main/resources/strings_zh-CN.properties b/sormas-api/src/main/resources/strings_zh-CN.properties index 66eff31cf89..4ab3a8f756f 100644 --- a/sormas-api/src/main/resources/strings_zh-CN.properties +++ b/sormas-api/src/main/resources/strings_zh-CN.properties @@ -1240,6 +1240,7 @@ messageAllCampaignFormsValid = All campaign forms have been successfully validat messageEnterSms = Please enter your SMS message here\: messageSelectedPeriodTooLong = You have selected a time period that exceeds the maximum number of days. Please make sure that the selected time period does not exceed %d days. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. +messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. messagePersonAddedAsEventParticipant = The new event participant was created. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? @@ -1284,6 +1285,7 @@ messageSormasToSormasSimilarPersonFound = There is at least one similar person i messageDeleteWithPendingShareRequest = There is a pending share request. With a deletion, the share request will be revoked and deleted. messageCannotMergeMoreThanTwoPersons = You need to select two persons for merge\! messageAutomaticDeletionStarted = Automatic deletion has been started and will be executed in the background. Please note that, depending on the amount of data that is deleted, this process can take some time. +messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right # Notifications notificationCaseClassificationChanged = The classification of case %s has changed to %s. diff --git a/sormas-api/src/main/resources/validations_ur-PK.properties b/sormas-api/src/main/resources/validations_ur-PK.properties index 445b1e98a7d..6d860671eab 100644 --- a/sormas-api/src/main/resources/validations_ur-PK.properties +++ b/sormas-api/src/main/resources/validations_ur-PK.properties @@ -265,4 +265,4 @@ removeRolesWithEditUserFromOwnUser = فی الحال لاگ ان صارف کے removeRolesWithEditRightFromOwnUser = فی الحال لاگ ان صارف کے حقوقصارف کے حق میں ترمیم کریں کے ساتھ تمام صارف کے کردار نہیں مٹا سکتے removeUserRightEditRightFromOwnUser = فی الحال لاگ ان صارف کے حقوقصارف میں ترمیم کریں کو مٹایا نہیں جا سکتا removeUserEditRightFromOwnUser = فی الحال لاگ ان صارف کے حقوقصارف کے حق میں ترمیم کریں کو مٹایا نہیں جا سکتا -externalMessageRefersToMultipleEntities = The external message refers to multiple entities (Either at least two cases or a case and a contact or an event participant) +externalMessageRefersToMultipleEntities = بیرونی پیغام سے مراد متعدد اداروں (یا تو کم از کم دو کیسز یا کیس اور ایک رابطہ یا ایونٹ میں شریک) From 97387b46276ebeba9d4ff364934b14e270b94251 Mon Sep 17 00:00:00 2001 From: sergiupacurariu <62688603+sergiupacurariu@users.noreply.github.com> Date: Mon, 19 Dec 2022 12:10:24 +0200 Subject: [PATCH 118/147] #10958 - Avoid directories calling count method several times --- .../ui/configuration/infrastructure/CountriesGrid.java | 2 +- .../src/main/java/de/symeda/sormas/ui/task/TaskGrid.java | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesGrid.java index 23664c50a64..3bb247a9e88 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/CountriesGrid.java @@ -19,11 +19,11 @@ import java.util.function.Predicate; import java.util.stream.Stream; +import de.symeda.sormas.api.feature.FeatureType; import org.apache.commons.lang3.StringUtils; import de.symeda.sormas.api.EntityRelevanceStatus; 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.infrastructure.country.CountryCriteria; import de.symeda.sormas.api.infrastructure.country.CountryDto; diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGrid.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGrid.java index 71f04569cfc..def3be4171a 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGrid.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/task/TaskGrid.java @@ -18,12 +18,8 @@ package de.symeda.sormas.ui.task; import java.util.Date; -import java.util.stream.Collectors; -import com.vaadin.data.provider.DataProvider; import com.vaadin.data.provider.DataProviderListener; -import com.vaadin.data.provider.ListDataProvider; -import com.vaadin.shared.data.sort.SortDirection; import com.vaadin.ui.renderers.DateRenderer; import com.vaadin.ui.renderers.HtmlRenderer; import com.vaadin.ui.renderers.TextRenderer; @@ -38,7 +34,6 @@ import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.api.utils.DateHelper; -import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.fieldaccess.UiFieldAccessCheckers; import de.symeda.sormas.ui.ControllerProvider; import de.symeda.sormas.ui.UserProvider; From 57839ceee52746d25cd32749b882fa1b6c416f36 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 19 Dec 2022 11:26:54 +0100 Subject: [PATCH 119/147] fix --- .../src/test/resources/features/sanity/web/Case.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index 643709c17f9..7ad69f6aa98 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1907,7 +1907,7 @@ Feature: Case end to end tests And I select first created case for person from Cases list Then I check if editable fields are read only for an archived case - @tmsLink=SORDEV-12087 @env_s2s_1 + @tmsLink=SORDEV-12087 @env_s2s_1 @testIt Scenario: Delete a case in target system with handing ownership Given API: I create a new person with "Baden-Württemberg" region and "LK Alb-Donau-Kreis" district And API: I check that POST call body is "OK" From 5a43790eb18199396de95d4fb7e63bfcce430696 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 19 Dec 2022 11:47:07 +0100 Subject: [PATCH 120/147] fix --- .../e2etests/steps/web/application/cases/CreateNewCaseSteps.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java index 9dc1b2c690a..e59fbb23fff 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java @@ -304,6 +304,7 @@ public CreateNewCaseSteps( if (option.equals("first")) { webDriverHelpers.fillInWebElement( CASE_DIRECTORY_DETAILED_PAGE_FILTER_INPUT, casesUUID.get(0)); + TimeUnit.SECONDS.sleep(3); webDriverHelpers.clickOnWebElementBySelector(CASE_APPLY_FILTERS_BUTTON); webDriverHelpers.waitForPageLoadingSpinnerToDisappear(40); } From f0a7b55c34516e1c57a8902043d30735c5da7c10 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 19 Dec 2022 12:12:43 +0100 Subject: [PATCH 121/147] fix --- .../steps/web/application/cases/EditCaseSteps.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index bca2e2664b7..466133fa2e8 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java @@ -1992,10 +1992,10 @@ public EditCaseSteps( webDriverHelpers.isElementEnabled(FACILITY_TYPE_COMBOBOX), true, "Facility type combobox is not editable state but it should be since archived entities default value is true!"); - softly.assertEquals( - webDriverHelpers.isElementEnabled(EditEventPage.SAVE_BUTTON), - true, - "Save button is not editable state but it should be since archived entities default value is true!"); +// softly.assertEquals( +// webDriverHelpers.isElementEnabled(EditEventPage.SAVE_BUTTON), +// true, +// "Save button is not editable state but it should be since archived entities default value is true!"); softly.assertEquals( webDriverHelpers.isElementEnabled(DISCARD_BUTTON), true, From 0d56d3b92145034366000f4f85c667bf2bf1a27c Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Mon, 19 Dec 2022 12:52:09 +0100 Subject: [PATCH 122/147] fixes --- .../e2etests/pages/application/events/EditEventPage.java | 1 + .../steps/web/application/events/EditEventSteps.java | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java index 916e4a705f3..47dbf1f8288 100644 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/events/EditEventPage.java @@ -34,6 +34,7 @@ public class EditEventPage { public static final By TITLE_INPUT = By.cssSelector("#eventTitle"); public static final By SAVE_BUTTON = By.cssSelector(".popupContent #commit"); public static final By SAVE_BUTTON_FOR_POPUP_WINDOWS = By.cssSelector(".popupContent #commit"); + public static final By EDIT_EVENT_PAGE_SAVE_BUTTON = By.cssSelector("#commit"); public static final By EVENT_STATUS_OPTIONS = By.cssSelector("#eventStatus .v-select-option label"); public static final By RISK_LEVEL_INPUT = By.cssSelector(" #riskLevel input"); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index 8ad2e42dd26..2b70ed3a658 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -62,6 +62,7 @@ import static org.sormas.e2etests.pages.application.events.EditEventPage.DISEASE_COMBOBOX; import static org.sormas.e2etests.pages.application.events.EditEventPage.DISEASE_INPUT; import static org.sormas.e2etests.pages.application.events.EditEventPage.EDIT_EVENT_GROUP_BUTTON; +import static org.sormas.e2etests.pages.application.events.EditEventPage.EDIT_EVENT_PAGE_SAVE_BUTTON; import static org.sormas.e2etests.pages.application.events.EditEventPage.EDIT_FIRST_TASK; import static org.sormas.e2etests.pages.application.events.EditEventPage.EPIDEMIOLOGICAL_EVIDENCE_OPTIONS; import static org.sormas.e2etests.pages.application.events.EditEventPage.EVENT_ACTIONS_TAB; @@ -1403,8 +1404,8 @@ public EditEventSteps( When( "I click on Save Button in Edit Event directory", () -> { - webDriverHelpers.scrollToElement(SAVE_BUTTON); - webDriverHelpers.clickOnWebElementBySelector(SAVE_BUTTON); + webDriverHelpers.scrollToElement(EDIT_EVENT_PAGE_SAVE_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(EDIT_EVENT_PAGE_SAVE_BUTTON); TimeUnit.SECONDS.sleep(1); // wait for reaction webDriverHelpers.waitForPageLoadingSpinnerToDisappear(40); webDriverHelpers.waitUntilElementIsVisibleAndClickable(EVENT_DATA_SAVED_MESSAGE); From 9452a4c9e1a4d375f42c378cf39f1fe0c152f3c1 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 19 Dec 2022 13:23:37 +0100 Subject: [PATCH 123/147] fix --- .../src/test/resources/features/sanity/web/Case.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature index 7ad69f6aa98..643709c17f9 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Case.feature @@ -1907,7 +1907,7 @@ Feature: Case end to end tests And I select first created case for person from Cases list Then I check if editable fields are read only for an archived case - @tmsLink=SORDEV-12087 @env_s2s_1 @testIt + @tmsLink=SORDEV-12087 @env_s2s_1 Scenario: Delete a case in target system with handing ownership Given API: I create a new person with "Baden-Württemberg" region and "LK Alb-Donau-Kreis" district And API: I check that POST call body is "OK" From 3b8483cb847036e3e704f727c32d927f35a0dfe3 Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Mon, 19 Dec 2022 13:26:43 +0100 Subject: [PATCH 124/147] fixes --- .../e2etests/steps/web/application/events/EditEventSteps.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index 2b70ed3a658..4e844462c89 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -1404,6 +1404,7 @@ public EditEventSteps( When( "I click on Save Button in Edit Event directory", () -> { + webDriverHelpers.scrollToElement(EDIT_EVENT_PAGE_SAVE_BUTTON); webDriverHelpers.clickOnWebElementBySelector(EDIT_EVENT_PAGE_SAVE_BUTTON); TimeUnit.SECONDS.sleep(1); // wait for reaction From 59e735cc55c6118ec5cce8a66357b6a1efa343b5 Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Mon, 19 Dec 2022 13:27:36 +0100 Subject: [PATCH 125/147] fixes --- .../e2etests/steps/web/application/events/EditEventSteps.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index 4e844462c89..2b70ed3a658 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -1404,7 +1404,6 @@ public EditEventSteps( When( "I click on Save Button in Edit Event directory", () -> { - webDriverHelpers.scrollToElement(EDIT_EVENT_PAGE_SAVE_BUTTON); webDriverHelpers.clickOnWebElementBySelector(EDIT_EVENT_PAGE_SAVE_BUTTON); TimeUnit.SECONDS.sleep(1); // wait for reaction From f9df2b240f82adc2bf4a205b0decce8fd9ab0954 Mon Sep 17 00:00:00 2001 From: Bartha Barna Date: Mon, 19 Dec 2022 14:39:51 +0200 Subject: [PATCH 126/147] Task 7760 entity dto field matching check (#11211) * #7760 - add test that checks if fields in dto match to the corresponding entity and vice-versa * #7760 - extend test for all entities - add annotations where it is clear why there is no corresponding field * #7760 - extend results to contain different type fields from both comparison directions - ignore test for now --- .../symeda/sormas/api/MappingException.java | 31 ++ .../symeda/sormas/api/contact/ContactDto.java | 2 + .../community/CommunityDto.java | 2 + .../api/messaging/ManualMessageLogDto.java | 4 +- .../SormasToSormasShareableDto.java | 6 +- .../pseudonymization/PseudonymizableDto.java | 3 + .../campaign/data/CampaignFormData.java | 2 + .../backend/common/AbstractDomainObject.java | 2 + .../symeda/sormas/backend/common/CoreAdo.java | 3 + .../backend/common/NotExposedToApi.java | 26 ++ .../sormas/backend/epidata/EpiData.java | 2 + .../sormas/backend/event/EventGroup.java | 2 + .../de/symeda/sormas/backend/task/Task.java | 2 + .../de/symeda/sormas/backend/user/User.java | 3 + .../java/de/symeda/EntityMappingTest.java | 360 ++++++++++++++++++ 15 files changed, 446 insertions(+), 4 deletions(-) create mode 100644 sormas-api/src/main/java/de/symeda/sormas/api/MappingException.java create mode 100644 sormas-backend/src/main/java/de/symeda/sormas/backend/common/NotExposedToApi.java create mode 100644 sormas-backend/src/test/java/de/symeda/EntityMappingTest.java diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/MappingException.java b/sormas-api/src/main/java/de/symeda/sormas/api/MappingException.java new file mode 100644 index 00000000000..ec7ce1099d5 --- /dev/null +++ b/sormas-api/src/main/java/de/symeda/sormas/api/MappingException.java @@ -0,0 +1,31 @@ +/* + * 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.api; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface MappingException { + + String COMPUTED_FOR_API = "Computed for API"; + String FILLED_FROM_OTHER_ENTITY = "Filled from other entity"; + + String reason() default ""; +} diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactDto.java index 05e1c0a66c6..e4b97b43300 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/contact/ContactDto.java @@ -26,6 +26,7 @@ import javax.validation.constraints.Size; import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.MappingException; import de.symeda.sormas.api.caze.CaseDataDto; import de.symeda.sormas.api.caze.CaseReferenceDto; import de.symeda.sormas.api.caze.VaccinationStatus; @@ -158,6 +159,7 @@ public class ContactDto extends SormasToSormasShareableDto { private Disease disease; @Size(max = FieldConstraints.CHARACTER_LIMIT_DEFAULT, message = Validations.textTooLong) private String diseaseDetails; + @MappingException(reason = MappingException.FILLED_FROM_OTHER_ENTITY) private DiseaseVariant diseaseVariant; @Required diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/community/CommunityDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/community/CommunityDto.java index 74dd6b8dd14..f8b08425b57 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/community/CommunityDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/infrastructure/community/CommunityDto.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; +import de.symeda.sormas.api.MappingException; import de.symeda.sormas.api.i18n.Validations; import de.symeda.sormas.api.infrastructure.InfrastructureDto; import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; @@ -44,6 +45,7 @@ public class CommunityDto extends InfrastructureDto { @Size(max = FieldConstraints.CHARACTER_LIMIT_SMALL, message = Validations.textTooLong) private String name; private Float growthRate; + @MappingException(reason = MappingException.FILLED_FROM_OTHER_ENTITY) private RegionReferenceDto region; private DistrictReferenceDto district; private boolean archived; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/messaging/ManualMessageLogDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/messaging/ManualMessageLogDto.java index 44200172315..20baede4873 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/messaging/ManualMessageLogDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/messaging/ManualMessageLogDto.java @@ -1,12 +1,12 @@ package de.symeda.sormas.api.messaging; -import java.io.Serializable; import java.util.Date; +import de.symeda.sormas.api.EntityDto; import de.symeda.sormas.api.person.PersonReferenceDto; import de.symeda.sormas.api.user.UserReferenceDto; -public class ManualMessageLogDto implements Serializable { +public class ManualMessageLogDto extends EntityDto { private MessageType messageType; private Date sentDate; diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasShareableDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasShareableDto.java index 4c388b5842f..238263d4f36 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasShareableDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/sormastosormas/SormasToSormasShareableDto.java @@ -15,18 +15,20 @@ package de.symeda.sormas.api.sormastosormas; +import javax.validation.Valid; + import de.symeda.sormas.api.ImportIgnore; +import de.symeda.sormas.api.MappingException; import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.utils.pseudonymization.PseudonymizableDto; -import javax.validation.Valid; - public abstract class SormasToSormasShareableDto extends PseudonymizableDto { public static final String SORMAS_TO_SORMAS_ORIGIN_INFO = "sormasToSormasOriginInfo"; public static final String OWNERSHIP_HANDED_OVER = "ownershipHandedOver"; @Valid protected SormasToSormasOriginInfoDto sormasToSormasOriginInfo; + @MappingException(reason = MappingException.COMPUTED_FOR_API) protected boolean ownershipHandedOver; public abstract UserReferenceDto getReportingUser(); diff --git a/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/PseudonymizableDto.java b/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/PseudonymizableDto.java index a9fe0904d66..2e10ff4899a 100644 --- a/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/PseudonymizableDto.java +++ b/sormas-api/src/main/java/de/symeda/sormas/api/utils/pseudonymization/PseudonymizableDto.java @@ -15,6 +15,7 @@ package de.symeda.sormas.api.utils.pseudonymization; import de.symeda.sormas.api.EntityDto; +import de.symeda.sormas.api.MappingException; public abstract class PseudonymizableDto extends EntityDto implements Pseudonymizable { @@ -26,12 +27,14 @@ public abstract class PseudonymizableDto extends EntityDto implements Pseudonymi /** * Whether sensitive and/or personal data of this DTO is pseudonymized. */ + @MappingException(reason = MappingException.COMPUTED_FOR_API) private boolean pseudonymized; /** * Whether the DTO is in the user's jurisdiction. Used to determine which user right needs to be considered * to decide whether sensitive and/or personal data is supposed to be shown. */ + @MappingException(reason = MappingException.COMPUTED_FOR_API) private boolean inJurisdiction; public boolean isPseudonymized() { diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/data/CampaignFormData.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/data/CampaignFormData.java index 854f332f1ea..9b3f7d269ed 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/data/CampaignFormData.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/campaign/data/CampaignFormData.java @@ -40,6 +40,7 @@ import de.symeda.sormas.backend.campaign.Campaign; import de.symeda.sormas.backend.campaign.form.CampaignFormMeta; import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.common.NotExposedToApi; import de.symeda.sormas.backend.infrastructure.community.Community; import de.symeda.sormas.backend.infrastructure.district.District; import de.symeda.sormas.backend.infrastructure.region.Region; @@ -71,6 +72,7 @@ public class CampaignFormData extends AbstractDomainObject { private District district; private Community community; private User creatingUser; + @NotExposedToApi private boolean archived; @AuditedIgnore diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractDomainObject.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractDomainObject.java index eb45d1ab64e..761e279577d 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractDomainObject.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/AbstractDomainObject.java @@ -75,10 +75,12 @@ public abstract class AbstractDomainObject implements Serializable, Cloneable, H public static final String CREATION_DATE = "creationDate"; public static final String CHANGE_DATE = "changeDate"; + @NotExposedToApi private Long id; private String uuid; private Timestamp creationDate; private Timestamp changeDate; + @NotExposedToApi private User changeUser; @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CoreAdo.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CoreAdo.java index 8ca1257a0c0..1d3bf56e8c3 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CoreAdo.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/CoreAdo.java @@ -37,8 +37,11 @@ public class CoreAdo extends DeletableAdo { public static final String END_OF_PROCESSING_DATE = "endOfProcessingDate"; public static final String ARCHIVE_UNDONE_REASON = "archiveUndoneReason"; + @NotExposedToApi private boolean archived; + @NotExposedToApi private Timestamp endOfProcessingDate; + @NotExposedToApi private String archiveUndoneReason; @Column(nullable = false) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/common/NotExposedToApi.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/NotExposedToApi.java new file mode 100644 index 00000000000..46445b0ceed --- /dev/null +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/common/NotExposedToApi.java @@ -0,0 +1,26 @@ +/* + * 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.backend.common; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface NotExposedToApi { +} diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiData.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiData.java index 096b0576848..a99e32a9a27 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiData.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/epidata/EpiData.java @@ -31,6 +31,7 @@ import de.symeda.sormas.api.utils.YesNoUnknown; import de.symeda.sormas.backend.activityascase.ActivityAsCase; import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.common.NotExposedToApi; import de.symeda.sormas.backend.exposure.Exposure; @Entity @@ -54,6 +55,7 @@ public class EpiData extends AbstractDomainObject { private List exposures = new ArrayList<>(); private List activitiesAsCase = new ArrayList<>(); + @NotExposedToApi private Date changeDateOfEmbeddedLists; @Enumerated(EnumType.STRING) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroup.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroup.java index a09e258bb39..735bec20b6d 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroup.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventGroup.java @@ -28,6 +28,7 @@ import de.symeda.auditlog.api.Audited; import de.symeda.auditlog.api.AuditedIgnore; import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.common.NotExposedToApi; @Entity(name = "eventgroups") @Audited @@ -44,6 +45,7 @@ public class EventGroup extends AbstractDomainObject { private String name; private List events; + @NotExposedToApi private boolean archived; @Column(columnDefinition = "text", nullable = false) diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/Task.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/Task.java index e9e699d1583..35656176980 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/task/Task.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/task/Task.java @@ -42,6 +42,7 @@ import de.symeda.sormas.api.task.TaskType; import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.common.NotExposedToApi; import de.symeda.sormas.backend.contact.Contact; import de.symeda.sormas.backend.event.Event; import de.symeda.sormas.backend.travelentry.TravelEntry; @@ -106,6 +107,7 @@ public class Task extends AbstractDomainObject { private Double closedLon; private Float closedLatLonAccuracy; + @NotExposedToApi private boolean archived; @Enumerated(EnumType.STRING) 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 b5cb3ab95b9..e4df6376081 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 @@ -56,6 +56,7 @@ import de.symeda.sormas.api.user.UserReferenceDto; import de.symeda.sormas.api.user.UserRight; import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.common.NotExposedToApi; import de.symeda.sormas.backend.infrastructure.community.Community; import de.symeda.sormas.backend.infrastructure.district.District; import de.symeda.sormas.backend.infrastructure.facility.Facility; @@ -102,7 +103,9 @@ public class User extends AbstractDomainObject { public static final String LIMITED_DISEASE = "limitedDisease"; private String userName; + @NotExposedToApi private String password; + @NotExposedToApi private String seed; private boolean active = true; diff --git a/sormas-backend/src/test/java/de/symeda/EntityMappingTest.java b/sormas-backend/src/test/java/de/symeda/EntityMappingTest.java new file mode 100644 index 00000000000..9dee88598e8 --- /dev/null +++ b/sormas-backend/src/test/java/de/symeda/EntityMappingTest.java @@ -0,0 +1,360 @@ +/* + * 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; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.reflect.FieldUtils; +import org.apache.commons.lang3.reflect.MethodUtils; +import org.hibernate.annotations.Type; +import org.junit.Ignore; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import de.symeda.sormas.api.EntityDto; +import de.symeda.sormas.api.MappingException; +import de.symeda.sormas.api.action.ActionDto; +import de.symeda.sormas.api.activityascase.ActivityAsCaseDto; +import de.symeda.sormas.api.campaign.CampaignDto; +import de.symeda.sormas.api.campaign.data.CampaignFormDataDto; +import de.symeda.sormas.api.campaign.diagram.CampaignDiagramDefinitionDto; +import de.symeda.sormas.api.campaign.form.CampaignFormMetaDto; +import de.symeda.sormas.api.caze.CaseDataDto; +import de.symeda.sormas.api.caze.maternalhistory.MaternalHistoryDto; +import de.symeda.sormas.api.caze.porthealthinfo.PortHealthInfoDto; +import de.symeda.sormas.api.caze.surveillancereport.SurveillanceReportDto; +import de.symeda.sormas.api.clinicalcourse.ClinicalCourseDto; +import de.symeda.sormas.api.clinicalcourse.ClinicalVisitDto; +import de.symeda.sormas.api.clinicalcourse.HealthConditionsDto; +import de.symeda.sormas.api.contact.ContactDto; +import de.symeda.sormas.api.customizableenum.CustomizableEnumValueDto; +import de.symeda.sormas.api.disease.DiseaseConfigurationDto; +import de.symeda.sormas.api.document.DocumentDto; +import de.symeda.sormas.api.epidata.EpiDataDto; +import de.symeda.sormas.api.event.EventDto; +import de.symeda.sormas.api.event.EventGroupDto; +import de.symeda.sormas.api.event.EventParticipantDto; +import de.symeda.sormas.api.exposure.ExposureDto; +import de.symeda.sormas.api.externalmessage.ExternalMessageDto; +import de.symeda.sormas.api.externalmessage.labmessage.SampleReportDto; +import de.symeda.sormas.api.externalmessage.labmessage.TestReportDto; +import de.symeda.sormas.api.feature.FeatureConfigurationDto; +import de.symeda.sormas.api.hospitalization.HospitalizationDto; +import de.symeda.sormas.api.hospitalization.PreviousHospitalizationDto; +import de.symeda.sormas.api.immunization.ImmunizationDto; +import de.symeda.sormas.api.importexport.ExportConfigurationDto; +import de.symeda.sormas.api.infrastructure.PopulationDataDto; +import de.symeda.sormas.api.infrastructure.area.AreaDto; +import de.symeda.sormas.api.infrastructure.community.CommunityDto; +import de.symeda.sormas.api.infrastructure.continent.ContinentDto; +import de.symeda.sormas.api.infrastructure.country.CountryDto; +import de.symeda.sormas.api.infrastructure.district.DistrictDto; +import de.symeda.sormas.api.infrastructure.facility.FacilityDto; +import de.symeda.sormas.api.infrastructure.pointofentry.PointOfEntryDto; +import de.symeda.sormas.api.infrastructure.region.RegionDto; +import de.symeda.sormas.api.infrastructure.subcontinent.SubcontinentDto; +import de.symeda.sormas.api.location.LocationDto; +import de.symeda.sormas.api.messaging.ManualMessageLogDto; +import de.symeda.sormas.api.outbreak.OutbreakDto; +import de.symeda.sormas.api.person.PersonContactDetailDto; +import de.symeda.sormas.api.person.PersonDto; +import de.symeda.sormas.api.report.AggregateReportDto; +import de.symeda.sormas.api.report.WeeklyReportDto; +import de.symeda.sormas.api.report.WeeklyReportEntryDto; +import de.symeda.sormas.api.sample.AdditionalTestDto; +import de.symeda.sormas.api.sample.PathogenTestDto; +import de.symeda.sormas.api.sample.SampleDto; +import de.symeda.sormas.api.share.ExternalShareInfoDto; +import de.symeda.sormas.api.sormastosormas.SormasToSormasOriginInfoDto; +import de.symeda.sormas.api.sormastosormas.share.ShareRequestDetailsDto; +import de.symeda.sormas.api.sormastosormas.share.incoming.SormasToSormasShareRequestDto; +import de.symeda.sormas.api.sormastosormas.share.outgoing.SormasToSormasShareInfoDto; +import de.symeda.sormas.api.symptoms.SymptomsDto; +import de.symeda.sormas.api.systemevents.SystemEventDto; +import de.symeda.sormas.api.task.TaskDto; +import de.symeda.sormas.api.therapy.PrescriptionDto; +import de.symeda.sormas.api.therapy.TherapyDto; +import de.symeda.sormas.api.therapy.TreatmentDto; +import de.symeda.sormas.api.travelentry.TravelEntryDto; +import de.symeda.sormas.api.user.UserDto; +import de.symeda.sormas.api.user.UserRoleDto; +import de.symeda.sormas.api.vaccination.VaccinationDto; +import de.symeda.sormas.api.visit.VisitDto; +import de.symeda.sormas.backend.action.Action; +import de.symeda.sormas.backend.activityascase.ActivityAsCase; +import de.symeda.sormas.backend.campaign.Campaign; +import de.symeda.sormas.backend.campaign.data.CampaignFormData; +import de.symeda.sormas.backend.campaign.diagram.CampaignDiagramDefinition; +import de.symeda.sormas.backend.campaign.form.CampaignFormMeta; +import de.symeda.sormas.backend.caze.Case; +import de.symeda.sormas.backend.caze.maternalhistory.MaternalHistory; +import de.symeda.sormas.backend.caze.porthealthinfo.PortHealthInfo; +import de.symeda.sormas.backend.caze.surveillancereport.SurveillanceReport; +import de.symeda.sormas.backend.clinicalcourse.ClinicalCourse; +import de.symeda.sormas.backend.clinicalcourse.ClinicalVisit; +import de.symeda.sormas.backend.clinicalcourse.HealthConditions; +import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.common.NotExposedToApi; +import de.symeda.sormas.backend.common.messaging.ManualMessageLog; +import de.symeda.sormas.backend.contact.Contact; +import de.symeda.sormas.backend.customizableenum.CustomizableEnumValue; +import de.symeda.sormas.backend.disease.DiseaseConfiguration; +import de.symeda.sormas.backend.document.Document; +import de.symeda.sormas.backend.epidata.EpiData; +import de.symeda.sormas.backend.event.Event; +import de.symeda.sormas.backend.event.EventGroup; +import de.symeda.sormas.backend.event.EventParticipant; +import de.symeda.sormas.backend.exposure.Exposure; +import de.symeda.sormas.backend.externalmessage.ExternalMessage; +import de.symeda.sormas.backend.externalmessage.labmessage.SampleReport; +import de.symeda.sormas.backend.externalmessage.labmessage.TestReport; +import de.symeda.sormas.backend.feature.FeatureConfiguration; +import de.symeda.sormas.backend.hospitalization.Hospitalization; +import de.symeda.sormas.backend.hospitalization.PreviousHospitalization; +import de.symeda.sormas.backend.immunization.entity.Immunization; +import de.symeda.sormas.backend.importexport.ExportConfiguration; +import de.symeda.sormas.backend.infrastructure.PopulationData; +import de.symeda.sormas.backend.infrastructure.area.Area; +import de.symeda.sormas.backend.infrastructure.community.Community; +import de.symeda.sormas.backend.infrastructure.continent.Continent; +import de.symeda.sormas.backend.infrastructure.country.Country; +import de.symeda.sormas.backend.infrastructure.district.District; +import de.symeda.sormas.backend.infrastructure.facility.Facility; +import de.symeda.sormas.backend.infrastructure.pointofentry.PointOfEntry; +import de.symeda.sormas.backend.infrastructure.region.Region; +import de.symeda.sormas.backend.infrastructure.subcontinent.Subcontinent; +import de.symeda.sormas.backend.location.Location; +import de.symeda.sormas.backend.outbreak.Outbreak; +import de.symeda.sormas.backend.person.Person; +import de.symeda.sormas.backend.person.PersonContactDetail; +import de.symeda.sormas.backend.report.AggregateReport; +import de.symeda.sormas.backend.report.WeeklyReport; +import de.symeda.sormas.backend.report.WeeklyReportEntry; +import de.symeda.sormas.backend.sample.AdditionalTest; +import de.symeda.sormas.backend.sample.PathogenTest; +import de.symeda.sormas.backend.sample.Sample; +import de.symeda.sormas.backend.share.ExternalShareInfo; +import de.symeda.sormas.backend.sormastosormas.origin.SormasToSormasOriginInfo; +import de.symeda.sormas.backend.sormastosormas.share.incoming.SormasToSormasShareRequest; +import de.symeda.sormas.backend.sormastosormas.share.outgoing.ShareRequestInfo; +import de.symeda.sormas.backend.sormastosormas.share.outgoing.SormasToSormasShareInfo; +import de.symeda.sormas.backend.symptoms.Symptoms; +import de.symeda.sormas.backend.systemevent.SystemEvent; +import de.symeda.sormas.backend.task.Task; +import de.symeda.sormas.backend.therapy.Prescription; +import de.symeda.sormas.backend.therapy.Therapy; +import de.symeda.sormas.backend.therapy.Treatment; +import de.symeda.sormas.backend.travelentry.TravelEntry; +import de.symeda.sormas.backend.user.User; +import de.symeda.sormas.backend.user.UserRole; +import de.symeda.sormas.backend.vaccination.Vaccination; +import de.symeda.sormas.backend.visit.Visit; + +public class EntityMappingTest { + + private static final Map, Class> mappings = new HashMap<>(); + private static final List> mustMatchTypes = Arrays.asList(String.class, Integer.class, Long.class); + + static { + mappings.put(Action.class, ActionDto.class); + mappings.put(ActivityAsCase.class, ActivityAsCaseDto.class); + mappings.put(AdditionalTest.class, AdditionalTestDto.class); + mappings.put(AggregateReport.class, AggregateReportDto.class); + mappings.put(Area.class, AreaDto.class); + mappings.put(Campaign.class, CampaignDto.class); + mappings.put(CampaignDiagramDefinition.class, CampaignDiagramDefinitionDto.class); + mappings.put(CampaignFormData.class, CampaignFormDataDto.class); + mappings.put(CampaignFormMeta.class, CampaignFormMetaDto.class); + mappings.put(Case.class, CaseDataDto.class); + mappings.put(ClinicalCourse.class, ClinicalCourseDto.class); + mappings.put(ClinicalVisit.class, ClinicalVisitDto.class); + mappings.put(Community.class, CommunityDto.class); + mappings.put(Contact.class, ContactDto.class); + mappings.put(Continent.class, ContinentDto.class); + mappings.put(Country.class, CountryDto.class); + mappings.put(CustomizableEnumValue.class, CustomizableEnumValueDto.class); + mappings.put(DiseaseConfiguration.class, DiseaseConfigurationDto.class); + mappings.put(District.class, DistrictDto.class); + mappings.put(Document.class, DocumentDto.class); + mappings.put(EpiData.class, EpiDataDto.class); + mappings.put(Event.class, EventDto.class); + mappings.put(EventGroup.class, EventGroupDto.class); + mappings.put(EventParticipant.class, EventParticipantDto.class); + mappings.put(ExportConfiguration.class, ExportConfigurationDto.class); + mappings.put(Exposure.class, ExposureDto.class); + mappings.put(ExternalMessage.class, ExternalMessageDto.class); + mappings.put(ExternalShareInfo.class, ExternalShareInfoDto.class); + mappings.put(Facility.class, FacilityDto.class); + mappings.put(FeatureConfiguration.class, FeatureConfigurationDto.class); + mappings.put(HealthConditions.class, HealthConditionsDto.class); + mappings.put(Hospitalization.class, HospitalizationDto.class); + mappings.put(Immunization.class, ImmunizationDto.class); + mappings.put(Location.class, LocationDto.class); + mappings.put(ManualMessageLog.class, ManualMessageLogDto.class); + mappings.put(MaternalHistory.class, MaternalHistoryDto.class); + mappings.put(Outbreak.class, OutbreakDto.class); + mappings.put(PathogenTest.class, PathogenTestDto.class); + mappings.put(Person.class, PersonDto.class); + mappings.put(PersonContactDetail.class, PersonContactDetailDto.class); + mappings.put(PointOfEntry.class, PointOfEntryDto.class); + mappings.put(PopulationData.class, PopulationDataDto.class); + mappings.put(PortHealthInfo.class, PortHealthInfoDto.class); + mappings.put(Prescription.class, PrescriptionDto.class); + mappings.put(PreviousHospitalization.class, PreviousHospitalizationDto.class); + mappings.put(Region.class, RegionDto.class); + mappings.put(Sample.class, SampleDto.class); + mappings.put(SampleReport.class, SampleReportDto.class); + mappings.put(ShareRequestInfo.class, ShareRequestDetailsDto.class); + mappings.put(SormasToSormasOriginInfo.class, SormasToSormasOriginInfoDto.class); + mappings.put(SormasToSormasShareInfo.class, SormasToSormasShareInfoDto.class); + mappings.put(SormasToSormasShareRequest.class, SormasToSormasShareRequestDto.class); + mappings.put(Subcontinent.class, SubcontinentDto.class); + mappings.put(SurveillanceReport.class, SurveillanceReportDto.class); + mappings.put(Symptoms.class, SymptomsDto.class); + mappings.put(SystemEvent.class, SystemEventDto.class); + mappings.put(Task.class, TaskDto.class); + mappings.put(TestReport.class, TestReportDto.class); + mappings.put(Therapy.class, TherapyDto.class); + mappings.put(TravelEntry.class, TravelEntryDto.class); + mappings.put(Treatment.class, TreatmentDto.class); + mappings.put(User.class, UserDto.class); + mappings.put(UserRole.class, UserRoleDto.class); + mappings.put(Vaccination.class, VaccinationDto.class); + mappings.put(Visit.class, VisitDto.class); + mappings.put(WeeklyReport.class, WeeklyReportDto.class); + mappings.put(WeeklyReportEntry.class, WeeklyReportEntryDto.class); + + } + + @Test + @Ignore("Ignored until all fields have been fixed or marked with exception annotation!") + public void testDtoEntityFieldMatching() { + + final StringBuilder stringBuilder = new StringBuilder("\n"); + AtomicBoolean differencesFound = new AtomicBoolean(false); + + mappings.forEach((entityClass, dtoClass) -> { + final String entityName = entityClass.getSimpleName(); + final String dtoName = dtoClass.getSimpleName(); + + final ClassComparisonResult entityVsDto = compareClassFields(entityClass, dtoClass); + final ClassComparisonResult dtoVsEntity = compareClassFields(dtoClass, entityClass); + + if (entityVsDto.differencesFound() || dtoVsEntity.differencesFound()) { + stringBuilder.append("\n" + entityName + " <-> " + dtoName + "\n"); + } + + final List missingFieldsInDto = entityVsDto.getMissingFields(); + if (!missingFieldsInDto.isEmpty()) { + stringBuilder.append("\tMissing fields in DTO:\n"); + missingFieldsInDto.forEach(s -> stringBuilder.append("\t - " + s + "\n")); + differencesFound.set(true); + } + + final List missingFieldsInEntity = dtoVsEntity.getMissingFields(); + if (!missingFieldsInEntity.isEmpty()) { + stringBuilder.append("\tMissing fields in entity:\n"); + missingFieldsInEntity.forEach(s -> stringBuilder.append("\t - " + s + "\n")); + differencesFound.set(true); + } + + final List fieldsHavingDifferentTypes = dtoVsEntity.getFieldsHavingDifferentTypes(); + final List fieldsHavingDifferentTypesFromEntity = entityVsDto.getFieldsHavingDifferentTypes(); + if (!fieldsHavingDifferentTypes.isEmpty() || !fieldsHavingDifferentTypesFromEntity.isEmpty()) { + stringBuilder.append("\tFields having different types:\n"); + fieldsHavingDifferentTypes.forEach(s -> stringBuilder.append("\t - " + s + "\n")); + fieldsHavingDifferentTypesFromEntity.stream() + .filter(s -> !fieldsHavingDifferentTypes.contains(s)) + .forEach(s -> stringBuilder.append("\t - " + s + "\n")); + differencesFound.set(true); + } + }); + + if (differencesFound.get()) { + Assertions.fail(stringBuilder.toString()); + } + } + + private ClassComparisonResult compareClassFields(Class leadClass, Class comparisonClass) { + + final ClassComparisonResult classComparisonResult = new ClassComparisonResult(); + + final Predicate excludeConstantFields = field -> !(Modifier.isFinal(field.getModifiers()) && Modifier.isStatic(field.getModifiers())); + final Predicate excludeFieldsNotExposedToApi = field -> !(field.isAnnotationPresent(NotExposedToApi.class)); + final Predicate excludeFieldsFromApi = field -> !(field.isAnnotationPresent(MappingException.class)); + final List leadClassDeclaredFields = FieldUtils.getAllFieldsList(leadClass) + .stream() + .filter(excludeConstantFields.and(excludeFieldsFromApi).and(excludeFieldsNotExposedToApi)) + .collect(Collectors.toList()); + for (final Field field : leadClassDeclaredFields) { + final String fieldName = field.getName(); + final Class fieldType = field.getType(); + + Field comparisonField = FieldUtils.getField(comparisonClass, fieldName, true); + if (comparisonField == null) { + if (!Collection.class.isAssignableFrom(fieldType)) { + classComparisonResult.addMissingField(fieldName); + } + } else { + final Class comparisonFieldType = comparisonField.getType(); + final Method getter = MethodUtils.getAccessibleMethod(leadClass, "get" + fieldName); + if (((mustMatchTypes.contains(fieldType) && (getter != null && !getter.isAnnotationPresent(Type.class))) || fieldType.isEnum()) + && !fieldType.equals(comparisonFieldType)) { + classComparisonResult.addDifferentTypeField(fieldName); + } + } + } + return classComparisonResult; + } + + public static class ClassComparisonResult { + + final List missingFields = new ArrayList<>(); + final List fieldsHavingDifferentTypes = new ArrayList<>(); + + public void addMissingField(String fieldName) { + missingFields.add(fieldName); + } + + public void addDifferentTypeField(String fieldName) { + fieldsHavingDifferentTypes.add(fieldName); + } + + public List getMissingFields() { + return missingFields; + } + + public List getFieldsHavingDifferentTypes() { + return fieldsHavingDifferentTypes; + } + + public boolean differencesFound() { + return !missingFields.isEmpty() || !fieldsHavingDifferentTypes.isEmpty(); + } + } + +} From a9e7b8811f23a4d32ddec8de1dc08c305faf1d00 Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Mon, 19 Dec 2022 13:47:49 +0100 Subject: [PATCH 127/147] fixes --- .../e2etests/steps/web/application/events/EditEventSteps.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index 2b70ed3a658..00c1db0709e 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -821,7 +821,7 @@ public EditEventSteps( "I set participant vaccination status to ([^\"]*)", (String vaccinationStatus) -> { webDriverHelpers.selectFromCombobox(VACCINATION_STATUS_COMBOBOX, vaccinationStatus); - webDriverHelpers.clickOnWebElementBySelector(SAVE_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(EDIT_EVENT_PAGE_SAVE_BUTTON); webDriverHelpers.clickOnWebElementBySelector(EVENT_PARTICIPANTS_TAB); }); From d520a78d22731d9546fce31668c9ee39651fcc11 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 19 Dec 2022 14:35:50 +0100 Subject: [PATCH 128/147] fix --- .../steps/web/application/cases/EditCaseSteps.java | 10 +++++----- .../steps/web/application/events/EditEventSteps.java | 4 ++-- .../test/resources/features/sanity/web/Event.feature | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index 466133fa2e8..5a2f90943fb 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java @@ -251,7 +251,6 @@ import org.sormas.e2etests.pages.application.NavBarPage; import org.sormas.e2etests.pages.application.cases.EditCasePage; import org.sormas.e2etests.pages.application.contacts.EditContactPage; -import org.sormas.e2etests.pages.application.events.EditEventPage; import org.sormas.e2etests.pages.application.immunizations.EditImmunizationPage; import org.sormas.e2etests.state.ApiState; import org.sormas.e2etests.steps.web.application.contacts.EditContactSteps; @@ -1992,10 +1991,11 @@ public EditCaseSteps( webDriverHelpers.isElementEnabled(FACILITY_TYPE_COMBOBOX), true, "Facility type combobox is not editable state but it should be since archived entities default value is true!"); -// softly.assertEquals( -// webDriverHelpers.isElementEnabled(EditEventPage.SAVE_BUTTON), -// true, -// "Save button is not editable state but it should be since archived entities default value is true!"); + // softly.assertEquals( + // webDriverHelpers.isElementEnabled(EditEventPage.SAVE_BUTTON), + // true, + // "Save button is not editable state but it should be since archived + // entities default value is true!"); softly.assertEquals( webDriverHelpers.isElementEnabled(DISCARD_BUTTON), true, diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index 00c1db0709e..9442e42a0df 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -291,8 +291,8 @@ public EditEventSteps( "^I change the event status to ([^\"]*)", (String eventStatus) -> { selectEventStatus(eventStatus); - webDriverHelpers.scrollToElement(SAVE_BUTTON); - webDriverHelpers.clickOnWebElementBySelector(SAVE_BUTTON); + webDriverHelpers.scrollToElement(EDIT_EVENT_PAGE_SAVE_BUTTON); + webDriverHelpers.clickOnWebElementBySelector(EDIT_EVENT_PAGE_SAVE_BUTTON); webDriverHelpers.waitUntilElementIsVisibleAndClickable(EVENT_DATA_SAVED_MESSAGE); }); diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature index 6dde7ec4813..43afb774b1c 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature @@ -8,7 +8,7 @@ Feature: Create events And I click on the NEW EVENT button And I create a new event with status CLUSTER - @env_main + @env_main @testIt Scenario: Create a new event and change its status multiple times Given I log in as a National User And I click on the Events button from navbar From a410c81f09ea7ce2f58f9ac21ceb7daef38184c1 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 19 Dec 2022 14:42:32 +0100 Subject: [PATCH 129/147] sorqa-737 fix --- .../src/test/resources/features/sanity/web/Event.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature index 43afb774b1c..6dde7ec4813 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature @@ -8,7 +8,7 @@ Feature: Create events And I click on the NEW EVENT button And I create a new event with status CLUSTER - @env_main @testIt + @env_main Scenario: Create a new event and change its status multiple times Given I log in as a National User And I click on the Events button from navbar From b845ad74ab07e821be8dc25aefd502d6fe274240 Mon Sep 17 00:00:00 2001 From: Halima Mohamed-Seghir Date: Mon, 19 Dec 2022 15:02:43 +0100 Subject: [PATCH 130/147] fixes --- .../src/test/resources/features/sanity/web/Event.feature | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature index 6dde7ec4813..34773080f6a 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Event.feature @@ -1447,5 +1447,6 @@ Feature: Create events And I fill Event Id filter in Link to Event form with last created via API Event uuid And I click first result in grid on Link to Event form And I click on SAVE button in Link Event to group form - Then I click on save button in Add Participant form +# Then I click on save button in Add Participant form + Then I click Save in Add Event Participant form on Edit Contact Page And I validate last created via API Event data is displayed under Linked Events section \ No newline at end of file From 09e03180dd236b44d5f87b726b4e519ff8c5ce07 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Mon, 19 Dec 2022 15:45:00 +0100 Subject: [PATCH 131/147] fix --- .../steps/web/application/cases/EditCaseSteps.java | 10 +++++----- .../steps/web/application/events/EditEventSteps.java | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java index 5a2f90943fb..ca9a308ee54 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/EditCaseSteps.java @@ -251,6 +251,7 @@ import org.sormas.e2etests.pages.application.NavBarPage; import org.sormas.e2etests.pages.application.cases.EditCasePage; import org.sormas.e2etests.pages.application.contacts.EditContactPage; +import org.sormas.e2etests.pages.application.events.EditEventPage; import org.sormas.e2etests.pages.application.immunizations.EditImmunizationPage; import org.sormas.e2etests.state.ApiState; import org.sormas.e2etests.steps.web.application.contacts.EditContactSteps; @@ -1991,11 +1992,10 @@ public EditCaseSteps( webDriverHelpers.isElementEnabled(FACILITY_TYPE_COMBOBOX), true, "Facility type combobox is not editable state but it should be since archived entities default value is true!"); - // softly.assertEquals( - // webDriverHelpers.isElementEnabled(EditEventPage.SAVE_BUTTON), - // true, - // "Save button is not editable state but it should be since archived - // entities default value is true!"); + softly.assertEquals( + webDriverHelpers.isElementEnabled(EditEventPage.EDIT_EVENT_PAGE_SAVE_BUTTON), + true, + "Save button is not editable state but it should be since archived entities default value is true!"); softly.assertEquals( webDriverHelpers.isElementEnabled(DISCARD_BUTTON), true, diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java index 9442e42a0df..9598538cff8 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/events/EditEventSteps.java @@ -1687,7 +1687,7 @@ public EditEventSteps( true, "Event status options is not editable state but it should be since archived entities default value is true!"); softly.assertEquals( - webDriverHelpers.isElementEnabled(SAVE_BUTTON), + webDriverHelpers.isElementEnabled(EDIT_EVENT_PAGE_SAVE_BUTTON), true, "Save button is not editable state but it should be since archived entities default value is true!"); softly.assertEquals( From ac33c7f4e3c3ca7d7071add560c1c6da5341a1c4 Mon Sep 17 00:00:00 2001 From: Frank T Date: Mon, 19 Dec 2022 16:04:28 +0100 Subject: [PATCH 132/147] Change 11013 two step get index list (#11182) * #11013 fix PerformanceLogAnalysisGenerator * #11013 two step getIndexList for cases * #11013 two step getIndexList for contacts * #11013 two step getIndexList for immunizations * #11013 two step getIndexList for events * #11013 two step getIndexList for event participants * #11013 two step getIndexList for travel entries --- .../sormas/backend/caze/CaseFacadeEjb.java | 27 +- .../backend/caze/CaseListCriteriaBuilder.java | 144 ++++--- .../backend/contact/ContactFacadeEjb.java | 30 +- .../contact/ContactListCriteriaBuilder.java | 82 ++-- .../sormas/backend/event/EventFacadeEjb.java | 357 +++++++++++------- .../event/EventParticipantFacadeEjb.java | 216 +++++++---- .../event/EventParticipantQueryContext.java | 19 + .../DirectoryImmunizationService.java | 149 +++++--- .../services/TravelEntryService.java | 123 ++++-- .../PerformanceLogAnalysisGenerator.java | 2 +- 10 files changed, 760 insertions(+), 389 deletions(-) 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 b28f9068fb2..480d1847d04 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 @@ -54,6 +54,7 @@ import javax.ejb.TransactionAttributeType; import javax.enterprise.concurrent.ManagedScheduledExecutorService; import javax.inject.Inject; +import javax.persistence.Tuple; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; @@ -70,8 +71,6 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; -import de.symeda.sormas.api.disease.DiseaseConfigurationFacade; -import de.symeda.sormas.api.followup.FollowUpLogic; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -145,6 +144,7 @@ import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; import de.symeda.sormas.api.followup.FollowUpDto; +import de.symeda.sormas.api.followup.FollowUpLogic; import de.symeda.sormas.api.followup.FollowUpPeriodDto; import de.symeda.sormas.api.hospitalization.PreviousHospitalizationDto; import de.symeda.sormas.api.i18n.Captions; @@ -576,9 +576,16 @@ public Page getIndexDetailedPage( @Override public List getIndexList(CaseCriteria caseCriteria, Integer first, Integer max, List sortProperties) { - CriteriaQuery cq = listQueryBuilder.buildIndexCriteria(caseCriteria, sortProperties); + CriteriaQuery cqIds = listQueryBuilder.buildIndexCriteriaPrefetchIds(caseCriteria, sortProperties); + List indexListIds = + QueryHelper.getResultList(em, cqIds, first, max).stream().map(t -> t.get(0, Long.class)).collect(Collectors.toList()); + + List cases = new ArrayList<>(); + IterableHelper.executeBatched(indexListIds, ModelConstants.PARAMETER_LIMIT, batchedIds -> { + CriteriaQuery cq = listQueryBuilder.buildIndexCriteria(caseCriteria, sortProperties, batchedIds); + cases.addAll(QueryHelper.getResultList(em, cq, null, null)); + }); - List cases = QueryHelper.getResultList(em, cq, first, max); List caseIds = cases.stream().map(CaseIndexDto::getId).collect(Collectors.toList()); Map survToolShareCountAndDates = null; @@ -623,9 +630,15 @@ public List getIndexList(CaseCriteria caseCriteria, Integer first, @Override public List getIndexDetailedList(CaseCriteria caseCriteria, Integer first, Integer max, List sortProperties) { - CriteriaQuery cq = listQueryBuilder.buildIndexDetailedCriteria(caseCriteria, sortProperties); + CriteriaQuery cqIds = listQueryBuilder.buildIndexDetailedCriteriaPrefetchIds(caseCriteria, sortProperties); + List indexListIds = + QueryHelper.getResultList(em, cqIds, first, max).stream().map(t -> t.get(0, Long.class)).collect(Collectors.toList()); - List cases = QueryHelper.getResultList(em, cq, first, max); + List cases = new ArrayList<>(); + IterableHelper.executeBatched(indexListIds, ModelConstants.PARAMETER_LIMIT, batchedIds -> { + CriteriaQuery cq = listQueryBuilder.buildIndexDetailedCriteria(caseCriteria, sortProperties, batchedIds); + cases.addAll(QueryHelper.getResultList(em, cq, null, null)); + }); // Load latest events info // Adding a second query here is not perfect, but selecting the last event with a criteria query @@ -673,7 +686,7 @@ public List getIndexDetailedList(CaseCriteria caseCriteria if (diseaseConfigurationFacade.hasFollowUp(caze.getDisease())) { int numberOfMissedVisits = - FollowUpLogic.getNumberOfRequiredVisitsSoFar(caze.getReportDate(), caze.getFollowUpUntil()) - caze.getVisitCount(); + FollowUpLogic.getNumberOfRequiredVisitsSoFar(caze.getReportDate(), caze.getFollowUpUntil()) - caze.getVisitCount(); if (numberOfMissedVisits < 0) { numberOfMissedVisits = 0; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseListCriteriaBuilder.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseListCriteriaBuilder.java index 35ea62883a3..bbb9ba56a37 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseListCriteriaBuilder.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/caze/CaseListCriteriaBuilder.java @@ -15,6 +15,7 @@ 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; @@ -70,11 +71,14 @@ public class CaseListCriteriaBuilder { @Inject private CurrentUserService currentUserService; - public CriteriaQuery buildIndexCriteria(CaseCriteria caseCriteria, List sortProperties) { - return buildIndexCriteria(CaseIndexDto.class, this::getCaseIndexSelections, caseCriteria, this::getIndexOrders, sortProperties, false); + public CriteriaQuery buildIndexCriteria(CaseCriteria caseCriteria, List sortProperties, List ids) { + return buildIndexCriteria(CaseIndexDto.class, this::getCaseIndexSelections, caseCriteria, this::getIndexOrders, sortProperties, false, ids); } - public CriteriaQuery buildIndexDetailedCriteria(CaseCriteria caseCriteria, List sortProperties) { + public CriteriaQuery buildIndexDetailedCriteria( + CaseCriteria caseCriteria, + List sortProperties, + List ids) { return buildIndexCriteria( CaseIndexDetailedDto.class, @@ -82,7 +86,24 @@ public CriteriaQuery buildIndexDetailedCriteria(CaseCriter caseCriteria, this::getIndexDetailOrders, sortProperties, - true); + true, + ids); + } + + public CriteriaQuery buildIndexCriteriaPrefetchIds(CaseCriteria caseCriteria, List sortProperties) { + return buildIndexCriteria(Tuple.class, this::getCaseIndexSelections, caseCriteria, this::getIndexOrders, sortProperties, false, null); + } + + public CriteriaQuery buildIndexDetailedCriteriaPrefetchIds(CaseCriteria caseCriteria, List sortProperties) { + + return buildIndexCriteria( + Tuple.class, + this::getCaseIndexDetailedSelections, + caseCriteria, + this::getIndexDetailOrders, + sortProperties, + true, + null); } private CriteriaQuery buildIndexCriteria( @@ -91,7 +112,10 @@ private CriteriaQuery buildIndexCriteria( CaseCriteria caseCriteria, OrderExpressionProvider orderExpressionProvider, List sortProperties, - boolean detailed) { + boolean detailed, + List ids) { + + boolean prefetchIds = ids == null; CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(type); @@ -99,78 +123,92 @@ private CriteriaQuery buildIndexCriteria( final CaseQueryContext caseQueryContext = new CaseQueryContext(cb, cq, caze); final CaseJoins joins = caseQueryContext.getJoins(); - List> selectionList = new ArrayList<>(selectionProvider.apply(caze, caseQueryContext)); - Subquery visitCountSq = cq.subquery(Integer.class); Root visitCountRoot = visitCountSq.from(Case.class); visitCountSq.where(cb.equal(visitCountRoot.get(AbstractDomainObject.ID), caze.get(AbstractDomainObject.ID))); visitCountSq.select(cb.size(visitCountRoot.get(Case.VISITS))); - selectionList.add(visitCountSq); - - if (detailed) { - // Events count subquery - if (currentUserService.hasUserRight(UserRight.EVENT_VIEW)) { - Subquery eventCountSq = cq.subquery(Long.class); - Root eventCountRoot = eventCountSq.from(EventParticipant.class); - Join event = eventCountRoot.join(EventParticipant.EVENT, JoinType.INNER); - Join resultingCase = eventCountRoot.join(EventParticipant.RESULTING_CASE, JoinType.INNER); - eventCountSq.where( - cb.and( - cb.equal(resultingCase.get(Case.ID), caze.get(Case.ID)), - cb.isFalse(event.get(Event.DELETED)), - cb.isFalse(eventCountRoot.get(EventParticipant.DELETED)))); - eventCountSq.select(cb.countDistinct(event.get(Event.ID))); - selectionList.add(eventCountSq); - } - // Latest sampleDateTime subquery - Subquery latestSampleDateTimeSq = cq.subquery(Timestamp.class); - Root sample = latestSampleDateTimeSq.from(Sample.class); - Path sampleDateTime = sample.get(Sample.SAMPLE_DATE_TIME); - latestSampleDateTimeSq.where( - cb.equal(sample.join(Sample.ASSOCIATED_CASE, JoinType.LEFT).get(AbstractDomainObject.ID), caze.get(AbstractDomainObject.ID)), - cb.isFalse(sample.get(Sample.DELETED))); - latestSampleDateTimeSq.select(cb.greatest(sampleDateTime)); - selectionList.add(latestSampleDateTimeSq); - - // Samples count subquery - Subquery sampleCountSq = cq.subquery(Long.class); - Root sampleCountRoot = sampleCountSq.from(Sample.class); - sampleCountSq.where( - cb.equal(sampleCountRoot.join(Sample.ASSOCIATED_CASE, JoinType.LEFT).get(AbstractDomainObject.ID), caze.get(AbstractDomainObject.ID)), - cb.isFalse(sampleCountRoot.get(Sample.DELETED))); - sampleCountSq.select(cb.countDistinct(sampleCountRoot.get(AbstractDomainObject.ID))); - selectionList.add(sampleCountSq); - } + List> selectionList = new ArrayList<>(); - // This is needed in selection because of the combination of distinct and orderBy clauses - every operator in the orderBy has to be part of the select IF distinct is used Expression latestChangedDateFunction = cb.function(ExtendedPostgreSQL94Dialect.GREATEST, Date.class, caze.get(Contact.CHANGE_DATE), joins.getPerson().get(Person.CHANGE_DATE)); - selectionList.add(latestChangedDateFunction); - - cq.multiselect(selectionList); - cq.distinct(true); + List> selectionListPrefetchIds = new ArrayList<>(); if (!CollectionUtils.isEmpty(sortProperties)) { List order = new ArrayList<>(sortProperties.size()); for (SortProperty sortProperty : sortProperties) { - order.addAll( - orderExpressionProvider.forProperty(sortProperty, caze, joins, cb) - .stream() - .map(e -> sortProperty.ascending ? cb.asc(e) : cb.desc(e)) - .collect(Collectors.toList())); + List> expressions = orderExpressionProvider.forProperty(sortProperty, caze, joins, cb); + selectionListPrefetchIds.addAll(expressions); + order.addAll(expressions.stream().map(e -> sortProperty.ascending ? cb.asc(e) : cb.desc(e)).collect(Collectors.toList())); } cq.orderBy(order); } else { + selectionListPrefetchIds.add(latestChangedDateFunction); cq.orderBy(cb.desc(latestChangedDateFunction)); } + if (prefetchIds) { + selectionList.add(caze.get(AbstractDomainObject.ID)); + selectionList.addAll(selectionListPrefetchIds); + } else { + selectionList.addAll(selectionProvider.apply(caze, caseQueryContext)); + selectionList.add(visitCountSq); + + if (detailed) { + // Events count subquery + if (currentUserService.hasUserRight(UserRight.EVENT_VIEW)) { + Subquery eventCountSq = cq.subquery(Long.class); + Root eventCountRoot = eventCountSq.from(EventParticipant.class); + Join event = eventCountRoot.join(EventParticipant.EVENT, JoinType.INNER); + Join resultingCase = eventCountRoot.join(EventParticipant.RESULTING_CASE, JoinType.INNER); + eventCountSq.where( + cb.and( + cb.equal(resultingCase.get(Case.ID), caze.get(Case.ID)), + cb.isFalse(event.get(Event.DELETED)), + cb.isFalse(eventCountRoot.get(EventParticipant.DELETED)))); + eventCountSq.select(cb.countDistinct(event.get(Event.ID))); + selectionList.add(eventCountSq); + } + + // Latest sampleDateTime subquery + Subquery latestSampleDateTimeSq = cq.subquery(Timestamp.class); + Root sample = latestSampleDateTimeSq.from(Sample.class); + Path sampleDateTime = sample.get(Sample.SAMPLE_DATE_TIME); + latestSampleDateTimeSq.where( + cb.equal(sample.join(Sample.ASSOCIATED_CASE, JoinType.LEFT).get(AbstractDomainObject.ID), caze.get(AbstractDomainObject.ID)), + cb.isFalse(sample.get(Sample.DELETED))); + latestSampleDateTimeSq.select(cb.greatest(sampleDateTime)); + selectionList.add(latestSampleDateTimeSq); + + // Samples count subquery + Subquery sampleCountSq = cq.subquery(Long.class); + Root sampleCountRoot = sampleCountSq.from(Sample.class); + sampleCountSq.where( + cb.equal( + sampleCountRoot.join(Sample.ASSOCIATED_CASE, JoinType.LEFT).get(AbstractDomainObject.ID), + caze.get(AbstractDomainObject.ID)), + cb.isFalse(sampleCountRoot.get(Sample.DELETED))); + sampleCountSq.select(cb.countDistinct(sampleCountRoot.get(AbstractDomainObject.ID))); + selectionList.add(sampleCountSq); + } + + // This is needed in selection because of the combination of distinct and orderBy clauses - every operator in the orderBy has to be part of the select IF distinct is used + selectionList.add(latestChangedDateFunction); + } + + cq.multiselect(selectionList); + cq.distinct(true); + CaseUserFilterCriteria caseUserFilterCriteria = new CaseUserFilterCriteria(); if (caseCriteria != null) { caseUserFilterCriteria.setIncludeCasesFromOtherJurisdictions(caseCriteria.getIncludeCasesFromOtherJurisdictions()); } Predicate filter = caseService.createUserFilter(caseQueryContext, caseUserFilterCriteria); + if (!prefetchIds) { + filter = CriteriaBuilderHelper.and(cb, filter, caze.get(AbstractDomainObject.ID).in(ids)); + } + if (caseCriteria != null) { Predicate criteriaFilter = caseService.createCriteriaFilter(caseCriteria, caseQueryContext); filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); 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 03d778c9d37..b535085859d 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 @@ -52,6 +52,7 @@ import javax.enterprise.concurrent.ManagedScheduledExecutorService; import javax.inject.Inject; import javax.persistence.Query; +import javax.persistence.Tuple; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; @@ -64,7 +65,6 @@ import javax.validation.Valid; import javax.validation.constraints.NotNull; -import de.symeda.sormas.api.followup.FollowUpLogic; import org.apache.commons.collections.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -108,6 +108,7 @@ import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.feature.FeatureTypeProperty; import de.symeda.sormas.api.followup.FollowUpDto; +import de.symeda.sormas.api.followup.FollowUpLogic; import de.symeda.sormas.api.followup.FollowUpPeriodDto; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -1222,8 +1223,15 @@ public FollowUpPeriodDto getCalculatedFollowUpUntilDate(ContactDto contactDto, b @Override public List getIndexList(ContactCriteria contactCriteria, Integer first, Integer max, List sortProperties) { - CriteriaQuery query = listCriteriaBuilder.buildIndexCriteria(contactCriteria, sortProperties); - List dtos = QueryHelper.getResultList(em, query, first, max); + CriteriaQuery cqIds = listCriteriaBuilder.buildIndexCriteriaPrefetchIds(contactCriteria, sortProperties); + List indexListIds = + QueryHelper.getResultList(em, cqIds, first, max).stream().map(t -> t.get(0, Long.class)).collect(Collectors.toList()); + + List dtos = new ArrayList<>(); + IterableHelper.executeBatched(indexListIds, ModelConstants.PARAMETER_LIMIT, batchedIds -> { + CriteriaQuery query = listCriteriaBuilder.buildIndexCriteria(contactCriteria, sortProperties, batchedIds); + dtos.addAll(QueryHelper.getResultList(em, query, null, null)); + }); Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); pseudonymizer.pseudonymizeDtoCollection(ContactIndexDto.class, dtos, ContactIndexDto::getInJurisdiction, (c, isInJurisdiction) -> { @@ -1234,7 +1242,7 @@ public List getIndexList(ContactCriteria contactCriteria, Integ dtos.forEach(contact -> { if (diseaseConfigurationFacade.hasFollowUp(contact.getDisease())) { int numberOfMissedVisits = - FollowUpLogic.getNumberOfRequiredVisitsSoFar(contact.getReportDateTime(), contact.getFollowUpUntil()) - contact.getVisitCount(); + FollowUpLogic.getNumberOfRequiredVisitsSoFar(contact.getReportDateTime(), contact.getFollowUpUntil()) - contact.getVisitCount(); if (numberOfMissedVisits < 0) { numberOfMissedVisits = 0; } @@ -1264,8 +1272,16 @@ public List getIndexDetailedList( Integer max, List sortProperties) { - CriteriaQuery query = listCriteriaBuilder.buildIndexDetailedCriteria(contactCriteria, sortProperties); - List dtos = QueryHelper.getResultList(em, query, first, max); + CriteriaQuery cqIds = listCriteriaBuilder.buildIndexDetailedCriteriaPrefetchIds(contactCriteria, sortProperties); + List indexListIds = + QueryHelper.getResultList(em, cqIds, first, max).stream().map(t -> t.get(0, Long.class)).collect(Collectors.toList()); + + List dtos = new ArrayList<>(); + IterableHelper.executeBatched(indexListIds, ModelConstants.PARAMETER_LIMIT, batchedIds -> { + CriteriaQuery query = + listCriteriaBuilder.buildIndexDetailedCriteria(contactCriteria, sortProperties, batchedIds); + dtos.addAll(QueryHelper.getResultList(em, query, null, null)); + }); if (userService.hasRight(UserRight.EVENT_VIEW)) { // Load event count and latest events info per contact @@ -1297,7 +1313,7 @@ public List getIndexDetailedList( dtos.forEach(contact -> { if (diseaseConfigurationFacade.hasFollowUp(contact.getDisease())) { int numberOfMissedVisits = - FollowUpLogic.getNumberOfRequiredVisitsSoFar(contact.getReportDateTime(), contact.getFollowUpUntil()) - contact.getVisitCount(); + FollowUpLogic.getNumberOfRequiredVisitsSoFar(contact.getReportDateTime(), contact.getFollowUpUntil()) - contact.getVisitCount(); if (numberOfMissedVisits < 0) { numberOfMissedVisits = 0; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactListCriteriaBuilder.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactListCriteriaBuilder.java index fba57518da9..aad791a347f 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactListCriteriaBuilder.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/contact/ContactListCriteriaBuilder.java @@ -13,6 +13,7 @@ import javax.ejb.Stateless; 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; @@ -33,6 +34,7 @@ import de.symeda.sormas.backend.caze.Case; import de.symeda.sormas.backend.caze.CaseQueryContext; import de.symeda.sormas.backend.caze.CaseService; +import de.symeda.sormas.backend.common.AbstractDomainObject; import de.symeda.sormas.backend.common.CriteriaBuilderHelper; import de.symeda.sormas.backend.infrastructure.district.District; import de.symeda.sormas.backend.infrastructure.region.Region; @@ -56,18 +58,37 @@ public class ContactListCriteriaBuilder { @EJB private ContactService contactService; - public CriteriaQuery buildIndexCriteria(ContactCriteria contactCriteria, List sortProperties) { - return buildIndexCriteria(ContactIndexDto.class, this::getContactIndexSelections, contactCriteria, this::getIndexOrders, sortProperties); + public CriteriaQuery buildIndexCriteria(ContactCriteria contactCriteria, List sortProperties, List ids) { + return buildIndexCriteria(ContactIndexDto.class, this::getContactIndexSelections, contactCriteria, this::getIndexOrders, sortProperties, ids); } - public CriteriaQuery buildIndexDetailedCriteria(ContactCriteria contactCriteria, List sortProperties) { + public CriteriaQuery buildIndexDetailedCriteria( + ContactCriteria contactCriteria, + List sortProperties, + List ids) { return buildIndexCriteria( ContactIndexDetailedDto.class, this::getContactIndexDetailedSelections, contactCriteria, this::getIndexDetailOrders, - sortProperties); + sortProperties, + ids); + } + + public CriteriaQuery buildIndexCriteriaPrefetchIds(ContactCriteria contactCriteria, List sortProperties) { + return buildIndexCriteria(Tuple.class, this::getContactIndexSelections, contactCriteria, this::getIndexOrders, sortProperties, null); + } + + public CriteriaQuery buildIndexDetailedCriteriaPrefetchIds(ContactCriteria contactCriteria, List sortProperties) { + + return buildIndexCriteria( + Tuple.class, + this::getContactIndexDetailedSelections, + contactCriteria, + this::getIndexDetailOrders, + sortProperties, + null); } public List> getContactIndexSelections(Root contact, ContactQueryContext contactQueryContext) { @@ -252,7 +273,10 @@ private CriteriaQuery buildIndexCriteria( BiFunction, ContactQueryContext, List>> selectionProvider, ContactCriteria contactCriteria, OrderExpressionProvider orderExpressionProvider, - List sortProperties) { + List sortProperties, + List ids) { + + boolean prefetchIds = ids == null; final CriteriaBuilder cb = em.getCriteriaBuilder(); final CriteriaQuery cq = cb.createQuery(type); @@ -260,36 +284,48 @@ private CriteriaQuery buildIndexCriteria( final ContactQueryContext contactQueryContext = new ContactQueryContext(cb, cq, contact); final ContactJoins joins = contactQueryContext.getJoins(); - List> selections = new ArrayList<>(selectionProvider.apply(contact, contactQueryContext)); - selections.add(cb.size(contact.get(Contact.VISITS))); - // This is needed in selection because of the combination of distinct and orderBy clauses - every operator in the orderBy has to be part of the select IF distinct is used + List> selections = new ArrayList<>(); + Expression latestChangedDateFunction = cb .function(ExtendedPostgreSQL94Dialect.GREATEST, Date.class, contact.get(Contact.CHANGE_DATE), joins.getPerson().get(Person.CHANGE_DATE)); - selections.add(latestChangedDateFunction); - - Predicate filter = buildContactFilter(contactCriteria, contactQueryContext); - - if (filter != null) { - cq.where(filter); - } - - cq.multiselect(selections); - cq.distinct(true); + List> selectionListPrefetchIds = new ArrayList<>(); if (CollectionUtils.isEmpty(sortProperties)) { + selectionListPrefetchIds.add(latestChangedDateFunction); cq.orderBy(cb.desc(latestChangedDateFunction)); } else { List order = new ArrayList<>(sortProperties.size()); for (SortProperty sortProperty : sortProperties) { - order.addAll( - orderExpressionProvider.forProperty(sortProperty, contact, joins, cb) - .stream() - .map(e -> sortProperty.ascending ? cb.asc(e) : cb.desc(e)) - .collect(Collectors.toList())); + List> expressions = orderExpressionProvider.forProperty(sortProperty, contact, joins, cb); + selectionListPrefetchIds.addAll(expressions); + order.addAll(expressions.stream().map(e -> sortProperty.ascending ? cb.asc(e) : cb.desc(e)).collect(Collectors.toList())); } cq.orderBy(order); } + if (prefetchIds) { + selections.add(contact.get(AbstractDomainObject.ID)); + selections.addAll(selectionListPrefetchIds); + } else { + selections.addAll(selectionProvider.apply(contact, contactQueryContext)); + selections.add(cb.size(contact.get(Contact.VISITS))); + // This is needed in selection because of the combination of distinct and orderBy clauses - every operator in the orderBy has to be part of the select IF distinct is used + selections.add(latestChangedDateFunction); + } + + Predicate filter = buildContactFilter(contactCriteria, contactQueryContext); + + if (!prefetchIds) { + filter = CriteriaBuilderHelper.and(cb, filter, contact.get(AbstractDomainObject.ID).in(ids)); + } + + if (filter != null) { + cq.where(filter); + } + + cq.multiselect(selections); + cq.distinct(true); + return cq; } diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java index 19551b5f147..cc6f07926dc 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventFacadeEjb.java @@ -41,14 +41,17 @@ import javax.ejb.TransactionAttributeType; import javax.enterprise.concurrent.ManagedScheduledExecutorService; import javax.inject.Inject; +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.persistence.criteria.Subquery; import javax.validation.Valid; import javax.validation.constraints.NotNull; @@ -110,6 +113,7 @@ import de.symeda.sormas.backend.location.Location; import de.symeda.sormas.backend.location.LocationFacadeEjb; import de.symeda.sormas.backend.location.LocationFacadeEjb.LocationFacadeEjbLocal; +import de.symeda.sormas.backend.person.Person; import de.symeda.sormas.backend.share.ExternalShareInfoCountAndLatestDate; import de.symeda.sormas.backend.share.ExternalShareInfoService; import de.symeda.sormas.backend.sormastosormas.SormasToSormasFacadeEjb.SormasToSormasFacadeEjbLocal; @@ -403,159 +407,94 @@ public long count(EventCriteria eventCriteria) { @Override public List getIndexList(EventCriteria eventCriteria, Integer first, Integer max, List sortProperties) { - CriteriaBuilder cb = em.getCriteriaBuilder(); - CriteriaQuery cq = cb.createQuery(EventIndexDto.class); - Root event = cq.from(Event.class); - - EventQueryContext eventQueryContext = new EventQueryContext(cb, cq, event); - - EventJoins eventJoins = eventQueryContext.getJoins(); - - Join location = eventJoins.getLocation(); - Join region = eventJoins.getRegion(); - Join district = eventJoins.getDistrict(); - Join community = eventJoins.getCommunity(); - Join reportingUser = eventJoins.getReportingUser(); - Join responsibleUser = eventJoins.getResponsibleUser(); + List indexListIds = getIndexListIds(eventCriteria, first, max, sortProperties); + List indexList = new ArrayList<>(); - cq.multiselect( - event.get(Event.ID), - event.get(Event.UUID), - event.get(Event.EXTERNAL_ID), - event.get(Event.EXTERNAL_TOKEN), - event.get(Event.INTERNAL_TOKEN), - event.get(Event.EVENT_STATUS), - event.get(Event.RISK_LEVEL), - event.get(Event.SPECIFIC_RISK), - event.get(Event.EVENT_INVESTIGATION_STATUS), - event.get(Event.EVENT_MANAGEMENT_STATUS), - event.get(Event.DISEASE), - event.get(Event.DISEASE_VARIANT), - event.get(Event.DISEASE_DETAILS), - event.get(Event.START_DATE), - event.get(Event.END_DATE), - event.get(Event.EVOLUTION_DATE), - event.get(Event.EVENT_TITLE), - region.get(Region.UUID), - region.get(Region.NAME), - district.get(District.UUID), - district.get(District.NAME), - community.get(Community.UUID), - community.get(Community.NAME), - location.get(Location.CITY), - location.get(Location.STREET), - location.get(Location.HOUSE_NUMBER), - location.get(Location.ADDITIONAL_INFORMATION), - event.get(Event.SRC_TYPE), - event.get(Event.SRC_FIRST_NAME), - event.get(Event.SRC_LAST_NAME), - event.get(Event.SRC_TEL_NO), - event.get(Event.SRC_MEDIA_WEBSITE), - event.get(Event.SRC_MEDIA_NAME), - event.get(Event.REPORT_DATE_TIME), - reportingUser.get(User.UUID), - reportingUser.get(User.FIRST_NAME), - reportingUser.get(User.LAST_NAME), - responsibleUser.get(User.UUID), - responsibleUser.get(User.FIRST_NAME), - responsibleUser.get(User.LAST_NAME), - JurisdictionHelper.booleanSelector(cb, service.inJurisdictionOrOwned(eventQueryContext)), - event.get(Event.CHANGE_DATE), - event.get(Event.EVENT_IDENTIFICATION_SOURCE)); + CriteriaBuilder cb = em.getCriteriaBuilder(); - Predicate filter = null; + IterableHelper.executeBatched(indexListIds, ModelConstants.PARAMETER_LIMIT, batchedIds -> { + + CriteriaQuery cq = cb.createQuery(EventIndexDto.class); + Root event = cq.from(Event.class); + + EventQueryContext eventQueryContext = new EventQueryContext(cb, cq, event); + + EventJoins eventJoins = eventQueryContext.getJoins(); + + Join location = eventJoins.getLocation(); + Join region = eventJoins.getRegion(); + Join district = eventJoins.getDistrict(); + Join community = eventJoins.getCommunity(); + Join reportingUser = eventJoins.getReportingUser(); + Join responsibleUser = eventJoins.getResponsibleUser(); + + cq.multiselect( + event.get(Event.ID), + event.get(Event.UUID), + event.get(Event.EXTERNAL_ID), + event.get(Event.EXTERNAL_TOKEN), + event.get(Event.INTERNAL_TOKEN), + event.get(Event.EVENT_STATUS), + event.get(Event.RISK_LEVEL), + event.get(Event.SPECIFIC_RISK), + event.get(Event.EVENT_INVESTIGATION_STATUS), + event.get(Event.EVENT_MANAGEMENT_STATUS), + event.get(Event.DISEASE), + event.get(Event.DISEASE_VARIANT), + event.get(Event.DISEASE_DETAILS), + event.get(Event.START_DATE), + event.get(Event.END_DATE), + event.get(Event.EVOLUTION_DATE), + event.get(Event.EVENT_TITLE), + region.get(Region.UUID), + region.get(Region.NAME), + district.get(District.UUID), + district.get(District.NAME), + community.get(Community.UUID), + community.get(Community.NAME), + location.get(Location.CITY), + location.get(Location.STREET), + location.get(Location.HOUSE_NUMBER), + location.get(Location.ADDITIONAL_INFORMATION), + event.get(Event.SRC_TYPE), + event.get(Event.SRC_FIRST_NAME), + event.get(Event.SRC_LAST_NAME), + event.get(Event.SRC_TEL_NO), + event.get(Event.SRC_MEDIA_WEBSITE), + event.get(Event.SRC_MEDIA_NAME), + event.get(Event.REPORT_DATE_TIME), + reportingUser.get(User.UUID), + reportingUser.get(User.FIRST_NAME), + reportingUser.get(User.LAST_NAME), + responsibleUser.get(User.UUID), + responsibleUser.get(User.FIRST_NAME), + responsibleUser.get(User.LAST_NAME), + JurisdictionHelper.booleanSelector(cb, service.inJurisdictionOrOwned(eventQueryContext)), + event.get(Event.CHANGE_DATE), + event.get(Event.EVENT_IDENTIFICATION_SOURCE)); + + Predicate filter = event.get(Event.ID).in(batchedIds); + + if (eventCriteria != null) { + if (eventCriteria.getUserFilterIncluded()) { + EventUserFilterCriteria eventUserFilterCriteria = new EventUserFilterCriteria(); + eventUserFilterCriteria.includeUserCaseAndEventParticipantFilter(true); + filter = service.createUserFilter(eventQueryContext, eventUserFilterCriteria); + } - if (eventCriteria != null) { - if (eventCriteria.getUserFilterIncluded()) { - EventUserFilterCriteria eventUserFilterCriteria = new EventUserFilterCriteria(); - eventUserFilterCriteria.includeUserCaseAndEventParticipantFilter(true); - filter = service.createUserFilter(eventQueryContext, eventUserFilterCriteria); + Predicate criteriaFilter = service.buildCriteriaFilter(eventCriteria, eventQueryContext); + filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); } - Predicate criteriaFilter = service.buildCriteriaFilter(eventCriteria, eventQueryContext); - filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); - } - - if (filter != null) { - cq.where(filter); - } - - if (sortProperties != null && !sortProperties.isEmpty()) { - List order = new ArrayList<>(sortProperties.size()); - for (SortProperty sortProperty : sortProperties) { - Expression expression; - switch (sortProperty.propertyName) { - case EventIndexDto.UUID: - case EventIndexDto.EXTERNAL_ID: - case EventIndexDto.EXTERNAL_TOKEN: - case EventIndexDto.INTERNAL_TOKEN: - case EventIndexDto.EVENT_STATUS: - case EventIndexDto.RISK_LEVEL: - case EventIndexDto.SPECIFIC_RISK: - case EventIndexDto.EVENT_INVESTIGATION_STATUS: - case EventIndexDto.EVENT_MANAGEMENT_STATUS: - case EventIndexDto.DISEASE: - case EventIndexDto.DISEASE_VARIANT: - case EventIndexDto.DISEASE_DETAILS: - case EventIndexDto.START_DATE: - case EventIndexDto.EVOLUTION_DATE: - case EventIndexDto.EVENT_TITLE: - case EventIndexDto.SRC_FIRST_NAME: - case EventIndexDto.SRC_LAST_NAME: - case EventIndexDto.SRC_TEL_NO: - case EventIndexDto.SRC_TYPE: - case EventIndexDto.REPORT_DATE_TIME: - case EventIndexDto.EVENT_IDENTIFICATION_SOURCE: - expression = event.get(sortProperty.propertyName); - break; - case EventIndexDto.EVENT_LOCATION: - expression = region.get(Region.NAME); - order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); - expression = district.get(District.NAME); - order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); - expression = community.get(Community.NAME); - break; - case EventIndexDto.REGION: - expression = region.get(Region.NAME); - break; - case EventIndexDto.DISTRICT: - expression = district.get(District.NAME); - break; - case EventIndexDto.COMMUNITY: - expression = community.get(Community.NAME); - break; - case EventIndexDto.ADDRESS: - expression = location.get(Location.CITY); - order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); - expression = location.get(Location.STREET); - order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); - expression = location.get(Location.HOUSE_NUMBER); - order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); - expression = location.get(Location.ADDITIONAL_INFORMATION); - break; - case EventIndexDto.REPORTING_USER: - expression = reportingUser.get(User.FIRST_NAME); - order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); - expression = reportingUser.get(User.LAST_NAME); - break; - case EventIndexDto.RESPONSIBLE_USER: - expression = responsibleUser.get(User.FIRST_NAME); - order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); - expression = responsibleUser.get(User.LAST_NAME); - break; - default: - throw new IllegalArgumentException(sortProperty.propertyName); - } - order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); + if (filter != null) { + cq.where(filter); } - cq.orderBy(order); - } else { - cq.orderBy(cb.desc(event.get(Event.CHANGE_DATE))); - } - cq.distinct(true); + sortBy(sortProperties, eventQueryContext); + cq.distinct(true); - List indexList = QueryHelper.getResultList(em, cq, first, max); + indexList.addAll(QueryHelper.getResultList(em, cq, null, null)); + }); Map participantCounts = new HashMap<>(); Map caseCounts = new HashMap<>(); @@ -689,6 +628,134 @@ public List getIndexList(EventCriteria eventCriteria, Integer fir return indexList; } + private List getIndexListIds(EventCriteria eventCriteria, Integer first, Integer max, List sortProperties) { + + CriteriaBuilder cb = em.getCriteriaBuilder(); + CriteriaQuery cq = cb.createTupleQuery(); + Root event = cq.from(Event.class); + + EventQueryContext eventQueryContext = new EventQueryContext(cb, cq, event); + + List> selections = new ArrayList<>(); + selections.add(event.get(Person.ID)); + selections.addAll(sortBy(sortProperties, eventQueryContext)); + + cq.multiselect(selections); + + Predicate filter = null; + + if (eventCriteria != null) { + if (eventCriteria.getUserFilterIncluded()) { + EventUserFilterCriteria eventUserFilterCriteria = new EventUserFilterCriteria(); + eventUserFilterCriteria.includeUserCaseAndEventParticipantFilter(true); + filter = service.createUserFilter(eventQueryContext, eventUserFilterCriteria); + } + + Predicate criteriaFilter = service.buildCriteriaFilter(eventCriteria, eventQueryContext); + filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); + } + + if (filter != null) { + cq.where(filter); + } + + List events = QueryHelper.getResultList(em, cq, first, max); + return events.stream().map(t -> t.get(0, Long.class)).collect(Collectors.toList()); + } + + private List> sortBy(List sortProperties, EventQueryContext eventQueryContext) { + + List> selections = new ArrayList<>(); + CriteriaBuilder cb = eventQueryContext.getCriteriaBuilder(); + CriteriaQuery cq = eventQueryContext.getQuery(); + + if (sortProperties != null && !sortProperties.isEmpty()) { + EventJoins eventJoins = eventQueryContext.getJoins(); + Join location = eventJoins.getLocation(); + Join region = eventJoins.getRegion(); + Join district = eventJoins.getDistrict(); + Join community = eventJoins.getCommunity(); + Join reportingUser = eventJoins.getReportingUser(); + Join responsibleUser = eventJoins.getResponsibleUser(); + + List order = new ArrayList<>(sortProperties.size()); + for (SortProperty sortProperty : sortProperties) { + Expression expression; + switch (sortProperty.propertyName) { + case EventIndexDto.UUID: + case EventIndexDto.EXTERNAL_ID: + case EventIndexDto.EXTERNAL_TOKEN: + case EventIndexDto.INTERNAL_TOKEN: + case EventIndexDto.EVENT_STATUS: + case EventIndexDto.RISK_LEVEL: + case EventIndexDto.SPECIFIC_RISK: + case EventIndexDto.EVENT_INVESTIGATION_STATUS: + case EventIndexDto.EVENT_MANAGEMENT_STATUS: + case EventIndexDto.DISEASE: + case EventIndexDto.DISEASE_VARIANT: + case EventIndexDto.DISEASE_DETAILS: + case EventIndexDto.START_DATE: + case EventIndexDto.EVOLUTION_DATE: + case EventIndexDto.EVENT_TITLE: + case EventIndexDto.SRC_FIRST_NAME: + case EventIndexDto.SRC_LAST_NAME: + case EventIndexDto.SRC_TEL_NO: + case EventIndexDto.SRC_TYPE: + case EventIndexDto.REPORT_DATE_TIME: + case EventIndexDto.EVENT_IDENTIFICATION_SOURCE: + expression = eventQueryContext.getRoot().get(sortProperty.propertyName); + break; + case EventIndexDto.EVENT_LOCATION: + expression = region.get(Region.NAME); + order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); + expression = district.get(District.NAME); + order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); + expression = community.get(Community.NAME); + break; + case EventIndexDto.REGION: + expression = region.get(Region.NAME); + break; + case EventIndexDto.DISTRICT: + expression = district.get(District.NAME); + break; + case EventIndexDto.COMMUNITY: + expression = community.get(Community.NAME); + break; + case EventIndexDto.ADDRESS: + expression = location.get(Location.CITY); + order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); + expression = location.get(Location.STREET); + order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); + expression = location.get(Location.HOUSE_NUMBER); + order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); + expression = location.get(Location.ADDITIONAL_INFORMATION); + break; + case EventIndexDto.REPORTING_USER: + expression = reportingUser.get(User.FIRST_NAME); + order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); + expression = reportingUser.get(User.LAST_NAME); + break; + case EventIndexDto.RESPONSIBLE_USER: + expression = responsibleUser.get(User.FIRST_NAME); + order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); + expression = responsibleUser.get(User.LAST_NAME); + break; + default: + throw new IllegalArgumentException(sortProperty.propertyName); + } + order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); + selections.add(expression); + } + cq.orderBy(order); + } else { + Path changeDate = eventQueryContext.getRoot().get(Event.CHANGE_DATE); + cq.orderBy(cb.desc(changeDate)); + selections.add(changeDate); + } + + return selections; + } + @Override public Page getIndexPage(EventCriteria eventCriteria, Integer offset, Integer size, List sortProperties) { List eventIndexList = getIndexList(eventCriteria, offset, size, sortProperties); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java index db28b4b996b..c952dee8654 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantFacadeEjb.java @@ -38,6 +38,7 @@ import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.inject.Inject; +import javax.persistence.Tuple; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; @@ -46,6 +47,7 @@ import javax.persistence.criteria.Order; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import javax.persistence.criteria.Selection; import javax.persistence.criteria.Subquery; import javax.validation.Valid; import javax.validation.constraints.NotNull; @@ -101,7 +103,6 @@ import de.symeda.sormas.backend.common.AbstractCoreFacadeEjb; import de.symeda.sormas.backend.common.AbstractDomainObject; import de.symeda.sormas.backend.common.CriteriaBuilderHelper; -import de.symeda.sormas.backend.common.DeletableAdo; import de.symeda.sormas.backend.common.NotificationService; import de.symeda.sormas.backend.common.messaging.MessageContents; import de.symeda.sormas.backend.common.messaging.MessageSubject; @@ -456,64 +457,127 @@ public List getIndexList( return new ArrayList<>(); } + List indexListIds = getIndexListIds(eventParticipantCriteria, first, max, sortProperties); + + List indexList = new ArrayList<>(); + + IterableHelper.executeBatched(indexListIds, ModelConstants.PARAMETER_LIMIT, batchedIds -> { + final CriteriaBuilder cb = em.getCriteriaBuilder(); + final CriteriaQuery cq = cb.createQuery(EventParticipantIndexDto.class); + final Root eventParticipant = cq.from(EventParticipant.class); + final EventParticipantQueryContext queryContext = new EventParticipantQueryContext(cb, cq, eventParticipant); + EventParticipantJoins joins = queryContext.getJoins(); + + Join person = joins.getPerson(); + Join resultingCase = joins.getResultingCase(); + Join event = joins.getEvent(); + final Join samples = queryContext.getSamplesJoin(); + + Expression inJurisdictionSelector = JurisdictionHelper.booleanSelector(cb, service.inJurisdiction(queryContext)); + Expression inJurisdictionOrOwnedSelector = JurisdictionHelper.booleanSelector(cb, service.inJurisdictionOrOwned(queryContext)); + cq.multiselect( + eventParticipant.get(EventParticipant.UUID), + person.get(Person.UUID), + resultingCase.get(Case.UUID), + event.get(Event.UUID), + person.get(Person.FIRST_NAME), + person.get(Person.LAST_NAME), + person.get(Person.SEX), + person.get(Person.APPROXIMATE_AGE), + person.get(Person.APPROXIMATE_AGE_TYPE), + eventParticipant.get(EventParticipant.INVOLVEMENT_DESCRIPTION), + // POSITIVE is the max value of available results + cb.max(samples.get(Sample.PATHOGEN_TEST_RESULT)), + // all samples have the same date, but have to be aggregated + cb.max(samples.get(Sample.SAMPLE_DATE_TIME)), + eventParticipant.get(EventParticipant.VACCINATION_STATUS), + joins.getEventParticipantReportingUser().get(User.UUID), + inJurisdictionSelector, + inJurisdictionOrOwnedSelector); + cq.groupBy( + eventParticipant.get(EventParticipant.ID), + eventParticipant.get(EventParticipant.UUID), + person.get(Person.UUID), + resultingCase.get(Case.UUID), + event.get(Event.UUID), + person.get(Person.FIRST_NAME), + person.get(Person.LAST_NAME), + person.get(Person.SEX), + person.get(Person.APPROXIMATE_AGE), + person.get(Person.APPROXIMATE_AGE_TYPE), + eventParticipant.get(EventParticipant.INVOLVEMENT_DESCRIPTION), + joins.getSamples().get(Sample.PATHOGEN_TEST_RESULT), + joins.getSamples().get(Sample.SAMPLE_DATE_TIME), + eventParticipant.get(EventParticipant.VACCINATION_STATUS), + joins.getEventParticipantReportingUser().get(User.ID), + joins.getEventParticipantReportingUser().get(User.UUID), + inJurisdictionSelector, + inJurisdictionOrOwnedSelector); + + Predicate filter = service.buildCriteriaFilter(eventParticipantCriteria, queryContext); + + if (eventParticipantCriteria.getPathogenTestResult() != null) { + filter = CriteriaBuilderHelper + .and(cb, filter, cb.equal(samples.get(Sample.PATHOGEN_TEST_RESULT), eventParticipantCriteria.getPathogenTestResult())); + } + + Subquery latestSampleSubquery = sampleService.createSubqueryLatestSample(cq, cb, eventParticipant); + Predicate latestSamplePredicate = + cb.or(cb.isNull(samples.get(Sample.SAMPLE_DATE_TIME)), cb.equal(samples.get(Sample.SAMPLE_DATE_TIME), latestSampleSubquery)); + filter = CriteriaBuilderHelper.and(cb, filter, latestSamplePredicate, eventParticipant.get(EventParticipant.ID).in(batchedIds)); + + if (filter != null) { + cq.where(filter); + } + + sortBy(sortProperties, queryContext); + + indexList.addAll(QueryHelper.getResultList(em, cq, null, null)); + }); + + if (!indexList.isEmpty()) { + Map eventParticipantContactCount = getContactCountPerEventParticipant( + indexList.stream().map(EventParticipantIndexDto::getUuid).collect(Collectors.toList()), + eventParticipantCriteria); + + for (EventParticipantIndexDto eventParticipantIndexDto : indexList) { + Optional.ofNullable(eventParticipantContactCount.get(eventParticipantIndexDto.getUuid())) + .ifPresent(eventParticipantIndexDto::setContactCount); + } + } + + Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); + pseudonymizer.pseudonymizeDtoCollection(EventParticipantIndexDto.class, indexList, p -> p.getInJurisdictionOrOwned(), null); + + return indexList; + } + + private List getIndexListIds( + EventParticipantCriteria eventParticipantCriteria, + Integer first, + Integer max, + List sortProperties) { + + if ((eventParticipantCriteria == null) || (eventParticipantCriteria.getEvent() == null && eventParticipantCriteria.getPerson() == null)) { + // Retrieving an index list independent of an event is not possible + return new ArrayList<>(); + } + final CriteriaBuilder cb = em.getCriteriaBuilder(); - final CriteriaQuery cq = cb.createQuery(EventParticipantIndexDto.class); + final CriteriaQuery cq = cb.createTupleQuery(); final Root eventParticipant = cq.from(EventParticipant.class); final EventParticipantQueryContext queryContext = new EventParticipantQueryContext(cb, cq, eventParticipant); - EventParticipantJoins joins = queryContext.getJoins(); - Join person = joins.getPerson(); - Join resultingCase = joins.getResultingCase(); - Join event = joins.getEvent(); - final Join samples = joins.getSamples(); - samples.on( - cb.and( - cb.isFalse(samples.get(DeletableAdo.DELETED)), - cb.equal(samples.get(Sample.ASSOCIATED_EVENT_PARTICIPANT), eventParticipant.get(AbstractDomainObject.ID)))); - - Expression inJurisdictionSelector = JurisdictionHelper.booleanSelector(cb, service.inJurisdiction(queryContext)); - Expression inJurisdictionOrOwnedSelector = JurisdictionHelper.booleanSelector(cb, service.inJurisdictionOrOwned(queryContext)); - cq.multiselect( - eventParticipant.get(EventParticipant.UUID), - person.get(Person.UUID), - resultingCase.get(Case.UUID), - event.get(Event.UUID), - person.get(Person.FIRST_NAME), - person.get(Person.LAST_NAME), - person.get(Person.SEX), - person.get(Person.APPROXIMATE_AGE), - person.get(Person.APPROXIMATE_AGE_TYPE), - eventParticipant.get(EventParticipant.INVOLVEMENT_DESCRIPTION), - // POSITIVE is the max value of available results - cb.max(samples.get(Sample.PATHOGEN_TEST_RESULT)), - // all samples have the same date, but have to be aggregated - cb.max(samples.get(Sample.SAMPLE_DATE_TIME)), - eventParticipant.get(EventParticipant.VACCINATION_STATUS), - joins.getEventParticipantReportingUser().get(User.UUID), - inJurisdictionSelector, - inJurisdictionOrOwnedSelector); - cq.groupBy( - eventParticipant.get(EventParticipant.ID), - eventParticipant.get(EventParticipant.UUID), - person.get(Person.UUID), - resultingCase.get(Case.UUID), - event.get(Event.UUID), - person.get(Person.FIRST_NAME), - person.get(Person.LAST_NAME), - person.get(Person.SEX), - person.get(Person.APPROXIMATE_AGE), - person.get(Person.APPROXIMATE_AGE_TYPE), - eventParticipant.get(EventParticipant.INVOLVEMENT_DESCRIPTION), - joins.getSamples().get(Sample.PATHOGEN_TEST_RESULT), - joins.getSamples().get(Sample.SAMPLE_DATE_TIME), - eventParticipant.get(EventParticipant.VACCINATION_STATUS), - joins.getEventParticipantReportingUser().get(User.ID), - joins.getEventParticipantReportingUser().get(User.UUID), - inJurisdictionSelector, - inJurisdictionOrOwnedSelector); + List> selections = new ArrayList<>(); + selections.add(eventParticipant.get(Person.ID)); + selections.addAll(sortBy(sortProperties, queryContext)); + + cq.multiselect(selections); Predicate filter = service.buildCriteriaFilter(eventParticipantCriteria, queryContext); + Join samples = queryContext.getSamplesJoin(); + if (eventParticipantCriteria.getPathogenTestResult() != null) { filter = CriteriaBuilderHelper .and(cb, filter, cb.equal(samples.get(Sample.PATHOGEN_TEST_RESULT), eventParticipantCriteria.getPathogenTestResult())); @@ -528,6 +592,19 @@ public List getIndexList( cq.where(filter); } + cq.distinct(true); + + List persons = QueryHelper.getResultList(em, cq, first, max); + return persons.stream().map(t -> t.get(0, Long.class)).collect(Collectors.toList()); + } + + private List> sortBy(List sortProperties, EventParticipantQueryContext eventParticipantQueryContext) { + + List> selections = new ArrayList<>(); + CriteriaBuilder cb = eventParticipantQueryContext.getCriteriaBuilder(); + CriteriaQuery cq = eventParticipantQueryContext.getQuery(); + EventParticipantJoins joins = eventParticipantQueryContext.getJoins(); + if (sortProperties != null && sortProperties.size() > 0) { List order = new ArrayList<>(sortProperties.size()); for (SortProperty sortProperty : sortProperties) { @@ -536,53 +613,40 @@ public List getIndexList( case EventParticipantIndexDto.UUID: case EventParticipantIndexDto.INVOLVEMENT_DESCRIPTION: case EventParticipantIndexDto.VACCINATION_STATUS: - expression = eventParticipant.get(sortProperty.propertyName); + expression = eventParticipantQueryContext.getRoot().get(sortProperty.propertyName); break; case EventParticipantIndexDto.PERSON_UUID: - expression = person.get(Person.UUID); + expression = joins.getPerson().get(Person.UUID); break; case EventParticipantIndexDto.APPROXIMATE_AGE: case EventParticipantIndexDto.SEX: case EventParticipantIndexDto.LAST_NAME: + case EventParticipantIndexDto.FIRST_NAME: + expression = joins.getPerson().get(sortProperty.propertyName); + break; case SampleIndexDto.PATHOGEN_TEST_RESULT: expression = joins.getSamples().get(SampleIndexDto.PATHOGEN_TEST_RESULT); break; case SampleIndexDto.SAMPLE_DATE_TIME: expression = joins.getSamples().get(SampleIndexDto.SAMPLE_DATE_TIME); break; - case EventParticipantIndexDto.FIRST_NAME: - expression = person.get(sortProperty.propertyName); - break; case EventParticipantIndexDto.CASE_UUID: - expression = resultingCase.get(Case.UUID); + expression = joins.getResultingCase().get(Case.UUID); break; default: throw new IllegalArgumentException(sortProperty.propertyName); } order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); + selections.add(expression); } cq.orderBy(order); } else { - cq.orderBy(cb.desc(person.get(Person.LAST_NAME))); - } - - List indexList = QueryHelper.getResultList(em, cq, first, max); - - if (!indexList.isEmpty()) { - Map eventParticipantContactCount = getContactCountPerEventParticipant( - indexList.stream().map(EventParticipantIndexDto::getUuid).collect(Collectors.toList()), - eventParticipantCriteria); - - for (EventParticipantIndexDto eventParticipantIndexDto : indexList) { - Optional.ofNullable(eventParticipantContactCount.get(eventParticipantIndexDto.getUuid())) - .ifPresent(eventParticipantIndexDto::setContactCount); - } + Expression lastName = joins.getPerson().get(Person.LAST_NAME); + cq.orderBy(cb.desc(lastName)); + selections.add(lastName); } - Pseudonymizer pseudonymizer = Pseudonymizer.getDefault(userService::hasRight, I18nProperties.getCaption(Captions.inaccessibleValue)); - pseudonymizer.pseudonymizeDtoCollection(EventParticipantIndexDto.class, indexList, p -> p.getInJurisdictionOrOwned(), null); - - return indexList; + return selections; } @Override diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantQueryContext.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantQueryContext.java index e05f38f5e76..d36ad81b5c0 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantQueryContext.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/event/EventParticipantQueryContext.java @@ -4,11 +4,17 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; import javax.persistence.criteria.From; +import javax.persistence.criteria.Join; +import de.symeda.sormas.backend.common.AbstractDomainObject; +import de.symeda.sormas.backend.common.DeletableAdo; import de.symeda.sormas.backend.common.QueryContext; +import de.symeda.sormas.backend.sample.Sample; public class EventParticipantQueryContext extends QueryContext { + private Join samples; + protected EventParticipantQueryContext(CriteriaBuilder cb, CriteriaQuery query, From root) { this(cb, query, new EventParticipantJoins(root)); } @@ -17,6 +23,19 @@ public EventParticipantQueryContext(CriteriaBuilder cb, CriteriaQuery query, super(cb, query, joins.getRoot(), joins); } + public Join getSamplesJoin() { + CriteriaBuilder cb = getCriteriaBuilder(); + if (samples == null) { + samples = getJoins().getSamples(); + From eventParticipant = getJoins().getRoot(); + samples.on( + cb.and( + cb.isFalse(samples.get(DeletableAdo.DELETED)), + cb.equal(samples.get(Sample.ASSOCIATED_EVENT_PARTICIPANT), eventParticipant.get(AbstractDomainObject.ID)))); + } + return samples; + } + @Override protected Expression createExpression(String name) { return null; diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/DirectoryImmunizationService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/DirectoryImmunizationService.java index 178a39dedce..48182bc3f29 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/DirectoryImmunizationService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/immunization/DirectoryImmunizationService.java @@ -5,10 +5,12 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; +import javax.persistence.Tuple; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; @@ -18,6 +20,7 @@ import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; +import javax.persistence.criteria.Selection; import org.apache.commons.collections4.CollectionUtils; @@ -47,7 +50,10 @@ import de.symeda.sormas.backend.person.PersonService; import de.symeda.sormas.backend.user.User; import de.symeda.sormas.backend.user.UserService; +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.QueryHelper; import de.symeda.sormas.backend.vaccination.FirstVaccinationDate; import de.symeda.sormas.backend.vaccination.LastVaccinationDate; import de.symeda.sormas.backend.vaccination.LastVaccineType; @@ -73,43 +79,89 @@ public Predicate createUserFilter(CriteriaBuilder cb, CriteriaQuery cq, From getIndexList(ImmunizationCriteria criteria, Integer first, Integer max, List sortProperties) { + + List indexListIds = getIndexListIds(criteria, first, max, sortProperties); + List immunizations = new ArrayList<>(); + + IterableHelper.executeBatched(indexListIds, ModelConstants.PARAMETER_LIMIT, batchedIds -> { + + final CriteriaBuilder cb = em.getCriteriaBuilder(); + final CriteriaQuery cq = cb.createQuery(Object[].class); + final Root immunization = cq.from(DirectoryImmunization.class); + + DirectoryImmunizationQueryContext directoryImmunizationQueryContext = new DirectoryImmunizationQueryContext(cb, cq, immunization); + DirectoryImmunizationJoins joins = directoryImmunizationQueryContext.getJoins(); + + final Join person = joins.getPerson(); + + final Join district = joins.getPersonJoins().getAddressJoins().getDistrict(); + + final Join lastVaccineType = joins.getLastVaccineType(); + + cq.multiselect( + immunization.get(Immunization.UUID), + person.get(Person.UUID), + person.get(Person.FIRST_NAME), + person.get(Person.LAST_NAME), + immunization.get(Immunization.DISEASE), + person.get(Person.APPROXIMATE_AGE), + person.get(Person.APPROXIMATE_AGE_TYPE), + person.get(Person.BIRTHDATE_DD), + person.get(Person.BIRTHDATE_MM), + person.get(Person.BIRTHDATE_YYYY), + person.get(Person.SEX), + district.get(District.NAME), + immunization.get(Immunization.MEANS_OF_IMMUNIZATION), + immunization.get(Immunization.IMMUNIZATION_MANAGEMENT_STATUS), + immunization.get(Immunization.IMMUNIZATION_STATUS), + immunization.get(Immunization.START_DATE), + immunization.get(Immunization.END_DATE), + lastVaccineType.get(LastVaccineType.VACCINE_TYPE), + immunization.get(Immunization.RECOVERY_DATE), + JurisdictionHelper.booleanSelector(cb, isInJurisdictionOrOwned(directoryImmunizationQueryContext)), + immunization.get(Immunization.CHANGE_DATE)); + + Predicate filter = immunization.get(Immunization.ID).in(batchedIds); + buildWhereCondition(criteria, cb, cq, directoryImmunizationQueryContext, filter); + + sortBy(sortProperties, directoryImmunizationQueryContext); + cq.distinct(true); + + immunizations.addAll( + createQuery(cq, null, null).unwrap(org.hibernate.query.Query.class) + .setResultTransformer(new ImmunizationIndexDtoResultTransformer()) + .getResultList()); + }); + + return immunizations; + } + + private List getIndexListIds(ImmunizationCriteria criteria, Integer first, Integer max, List sortProperties) { + final CriteriaBuilder cb = em.getCriteriaBuilder(); - final CriteriaQuery cq = cb.createQuery(Object[].class); + final CriteriaQuery cq = cb.createTupleQuery();; final Root immunization = cq.from(DirectoryImmunization.class); DirectoryImmunizationQueryContext directoryImmunizationQueryContext = new DirectoryImmunizationQueryContext(cb, cq, immunization); - DirectoryImmunizationJoins joins = directoryImmunizationQueryContext.getJoins(); - final Join person = joins.getPerson(); + List> selections = new ArrayList<>(); + selections.add(immunization.get(Person.ID)); + selections.addAll(sortBy(sortProperties, directoryImmunizationQueryContext)); - final Join district = joins.getPersonJoins().getAddressJoins().getDistrict(); + cq.multiselect(selections); - final Join lastVaccineType = joins.getLastVaccineType(); + buildWhereCondition(criteria, cb, cq, directoryImmunizationQueryContext, null); + cq.distinct(true); + + List immunizations = QueryHelper.getResultList(em, cq, first, max); + return immunizations.stream().map(t -> t.get(0, Long.class)).collect(Collectors.toList()); + } + + private List> sortBy(List sortProperties, DirectoryImmunizationQueryContext immunizationQueryContext) { - cq.multiselect( - immunization.get(Immunization.UUID), - person.get(Person.UUID), - person.get(Person.FIRST_NAME), - person.get(Person.LAST_NAME), - immunization.get(Immunization.DISEASE), - person.get(Person.APPROXIMATE_AGE), - person.get(Person.APPROXIMATE_AGE_TYPE), - person.get(Person.BIRTHDATE_DD), - person.get(Person.BIRTHDATE_MM), - person.get(Person.BIRTHDATE_YYYY), - person.get(Person.SEX), - district.get(District.NAME), - immunization.get(Immunization.MEANS_OF_IMMUNIZATION), - immunization.get(Immunization.IMMUNIZATION_MANAGEMENT_STATUS), - immunization.get(Immunization.IMMUNIZATION_STATUS), - immunization.get(Immunization.START_DATE), - immunization.get(Immunization.END_DATE), - lastVaccineType.get(LastVaccineType.VACCINE_TYPE), - immunization.get(Immunization.RECOVERY_DATE), - JurisdictionHelper.booleanSelector(cb, isInJurisdictionOrOwned(directoryImmunizationQueryContext)), - immunization.get(Immunization.CHANGE_DATE)); - - buildWhereCondition(criteria, cb, cq, directoryImmunizationQueryContext); + List> selections = new ArrayList<>(); + CriteriaBuilder cb = immunizationQueryContext.getCriteriaBuilder(); + CriteriaQuery cq = immunizationQueryContext.getQuery(); if (CollectionUtils.isNotEmpty(sortProperties)) { List order = new ArrayList<>(sortProperties.size()); @@ -123,47 +175,46 @@ public List getIndexList(ImmunizationCriteria criteria, In case ImmunizationIndexDto.START_DATE: case ImmunizationIndexDto.END_DATE: case ImmunizationIndexDto.RECOVERY_DATE: - expression = immunization.get(sortProperty.propertyName); + expression = immunizationQueryContext.getRoot().get(sortProperty.propertyName); break; case ImmunizationIndexDto.MANAGEMENT_STATUS: - expression = immunization.get(Immunization.IMMUNIZATION_MANAGEMENT_STATUS); + expression = immunizationQueryContext.getRoot().get(Immunization.IMMUNIZATION_MANAGEMENT_STATUS); break; case ImmunizationIndexDto.PERSON_UUID: - expression = person.get(Person.UUID); + expression = immunizationQueryContext.getJoins().getPerson().get(Person.UUID); break; case ImmunizationIndexDto.PERSON_FIRST_NAME: - expression = person.get(Person.FIRST_NAME); + expression = immunizationQueryContext.getJoins().getPerson().get(Person.FIRST_NAME); break; case ImmunizationIndexDto.PERSON_LAST_NAME: - expression = person.get(Person.LAST_NAME); + expression = immunizationQueryContext.getJoins().getPerson().get(Person.LAST_NAME); break; case ImmunizationIndexDto.AGE_AND_BIRTH_DATE: - expression = person.get(Person.APPROXIMATE_AGE); + expression = immunizationQueryContext.getJoins().getPerson().get(Person.APPROXIMATE_AGE); break; case ImmunizationIndexDto.SEX: - expression = person.get(Person.SEX); + expression = immunizationQueryContext.getJoins().getPerson().get(Person.SEX); break; case ImmunizationIndexDto.DISTRICT: - expression = district.get(District.NAME); + expression = immunizationQueryContext.getJoins().getPersonJoins().getAddressJoins().getDistrict().get(District.NAME); break; case ImmunizationIndexDto.LAST_VACCINE_TYPE: - expression = lastVaccineType.get(LastVaccineType.VACCINE_TYPE); + expression = immunizationQueryContext.getJoins().getLastVaccineType().get(LastVaccineType.VACCINE_TYPE); break; default: throw new IllegalArgumentException(sortProperty.propertyName); } order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); + selections.add(expression); } cq.orderBy(order); } else { - cq.orderBy(cb.desc(immunization.get(Immunization.CHANGE_DATE))); + Path changeDate = immunizationQueryContext.getRoot().get(Immunization.CHANGE_DATE); + cq.orderBy(cb.desc(changeDate)); + selections.add(changeDate); } - cq.distinct(true); - - return createQuery(cq, first, max).unwrap(org.hibernate.query.Query.class) - .setResultTransformer(new ImmunizationIndexDtoResultTransformer()) - .getResultList(); + return selections; } public long count(ImmunizationCriteria criteria) { @@ -173,7 +224,7 @@ public long count(ImmunizationCriteria criteria) { DirectoryImmunizationQueryContext immunizationQueryContext = new DirectoryImmunizationQueryContext(cb, cq, immunization); - buildWhereCondition(criteria, cb, cq, immunizationQueryContext); + buildWhereCondition(criteria, cb, cq, immunizationQueryContext, null); cq.select(cb.countDistinct(immunization)); return em.createQuery(cq).getSingleResult(); @@ -183,8 +234,14 @@ private void buildWhereCondition( ImmunizationCriteria criteria, CriteriaBuilder cb, CriteriaQuery cq, - DirectoryImmunizationQueryContext directoryImmunizationQueryContext) { + DirectoryImmunizationQueryContext directoryImmunizationQueryContext, + Predicate additionalFilter) { + Predicate filter = createUserFilter(directoryImmunizationQueryContext); + if (additionalFilter != null) { + filter = CriteriaBuilderHelper.and(cb, additionalFilter, filter); + } + if (criteria != null) { final Predicate criteriaFilter = buildCriteriaFilter(criteria, directoryImmunizationQueryContext); filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); diff --git a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryService.java b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryService.java index 171a8c6f09a..e487587a306 100644 --- a/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryService.java +++ b/sormas-backend/src/main/java/de/symeda/sormas/backend/travelentry/services/TravelEntryService.java @@ -4,10 +4,12 @@ import java.util.Date; import java.util.LinkedList; import java.util.List; +import java.util.stream.Collectors; import javax.ejb.EJB; import javax.ejb.LocalBean; import javax.ejb.Stateless; +import javax.persistence.Tuple; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; @@ -15,8 +17,10 @@ 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 org.apache.commons.collections4.CollectionUtils; @@ -58,7 +62,6 @@ public class TravelEntryService extends BaseTravelEntryService { @EJB private DocumentService documentService; - public List getByPersonUuids(List personUuids) { List travelEntries = new LinkedList<>(); @@ -77,33 +80,78 @@ public List getByPersonUuids(List personUuids) { } public List getIndexList(TravelEntryCriteria criteria, Integer first, Integer max, List sortProperties) { + + List indexListIds = getIndexListIds(criteria, first, max, sortProperties); + + List travelEntries = new ArrayList<>(); + + IterableHelper.executeBatched(indexListIds, ModelConstants.PARAMETER_LIMIT, batchedIds -> { + final CriteriaBuilder cb = em.getCriteriaBuilder(); + final CriteriaQuery cq = cb.createQuery(Object[].class); + final Root travelEntry = cq.from(TravelEntry.class); + + TravelEntryQueryContext travelEntryQueryContext = new TravelEntryQueryContext(cb, cq, travelEntry); + TravelEntryJoins joins = travelEntryQueryContext.getJoins(); + + final Join person = joins.getPerson(); + final Join pointOfEntry = joins.getPointOfEntry(); + + final Join location = person.join(Person.ADDRESS, JoinType.LEFT); + final Join district = location.join(Location.DISTRICT, JoinType.LEFT); + + cq.multiselect( + travelEntry.get(TravelEntry.UUID), + travelEntry.get(TravelEntry.EXTERNAL_ID), + person.get(Person.FIRST_NAME), + person.get(Person.LAST_NAME), + district.get(District.NAME), + pointOfEntry.get(PointOfEntry.NAME), + travelEntry.get(TravelEntry.POINT_OF_ENTRY_DETAILS), + travelEntry.get(TravelEntry.RECOVERED), + travelEntry.get(TravelEntry.VACCINATED), + travelEntry.get(TravelEntry.TESTED_NEGATIVE), + travelEntry.get(TravelEntry.QUARANTINE_TO), + JurisdictionHelper.booleanSelector(cb, inJurisdictionOrOwned(travelEntryQueryContext)), + travelEntry.get(TravelEntry.CHANGE_DATE)); + + Predicate filter = travelEntry.get(TravelEntry.ID).in(batchedIds); + + filter = CriteriaBuilderHelper.and(cb, filter, createUserFilter(travelEntryQueryContext)); + if (criteria != null) { + final Predicate criteriaFilter = buildCriteriaFilter(criteria, travelEntryQueryContext); + filter = CriteriaBuilderHelper.and(cb, filter, criteriaFilter); + } + + if (filter != null) { + cq.where(filter); + } + + sortBy(sortProperties, travelEntryQueryContext); + cq.distinct(true); + + travelEntries.addAll( + createQuery(cq, null, null).unwrap(org.hibernate.query.Query.class) + .setResultTransformer(new TravelEntryIndexDtoResultTransformer()) + .getResultList()); + }); + + return travelEntries; + } + + private List getIndexListIds(TravelEntryCriteria criteria, Integer first, Integer max, List sortProperties) { + final CriteriaBuilder cb = em.getCriteriaBuilder(); - final CriteriaQuery cq = cb.createQuery(Object[].class); + final CriteriaQuery cq = cb.createTupleQuery(); final Root travelEntry = cq.from(TravelEntry.class); TravelEntryQueryContext travelEntryQueryContext = new TravelEntryQueryContext(cb, cq, travelEntry); TravelEntryJoins joins = travelEntryQueryContext.getJoins(); - final Join person = joins.getPerson(); - final Join pointOfEntry = joins.getPointOfEntry(); + List> selections = new ArrayList<>(); + selections.add(travelEntry.get(Person.ID)); + selections.addAll(sortBy(sortProperties, travelEntryQueryContext)); - final Join location = person.join(Person.ADDRESS, JoinType.LEFT); - final Join district = location.join(Location.DISTRICT, JoinType.LEFT); - - cq.multiselect( - travelEntry.get(TravelEntry.UUID), - travelEntry.get(TravelEntry.EXTERNAL_ID), - person.get(Person.FIRST_NAME), - person.get(Person.LAST_NAME), - district.get(District.NAME), - pointOfEntry.get(PointOfEntry.NAME), - travelEntry.get(TravelEntry.POINT_OF_ENTRY_DETAILS), - travelEntry.get(TravelEntry.RECOVERED), - travelEntry.get(TravelEntry.VACCINATED), - travelEntry.get(TravelEntry.TESTED_NEGATIVE), - travelEntry.get(TravelEntry.QUARANTINE_TO), - JurisdictionHelper.booleanSelector(cb, inJurisdictionOrOwned(travelEntryQueryContext)), - travelEntry.get(TravelEntry.CHANGE_DATE)); + cq.multiselect(selections); Predicate filter = createUserFilter(travelEntryQueryContext); if (criteria != null) { @@ -114,6 +162,21 @@ public List getIndexList(TravelEntryCriteria criteria, Inte if (filter != null) { cq.where(filter); } + cq.distinct(true); + + List travelEntries = QueryHelper.getResultList(em, cq, first, max); + return travelEntries.stream().map(t -> t.get(0, Long.class)).collect(Collectors.toList()); + } + + private List> sortBy(List sortProperties, TravelEntryQueryContext travelEntryQueryContext) { + + List> selections = new ArrayList<>(); + CriteriaBuilder cb = travelEntryQueryContext.getCriteriaBuilder(); + CriteriaQuery cq = travelEntryQueryContext.getQuery(); + + Join person = travelEntryQueryContext.getJoins().getPerson(); + final Join location = person.join(Person.ADDRESS, JoinType.LEFT); + final Join district = location.join(Location.DISTRICT, JoinType.LEFT); if (CollectionUtils.isNotEmpty(sortProperties)) { List order = new ArrayList<>(sortProperties.size()); @@ -126,7 +189,7 @@ public List getIndexList(TravelEntryCriteria criteria, Inte case TravelEntryIndexDto.VACCINATED: case TravelEntryIndexDto.TESTED_NEGATIVE: case TravelEntryIndexDto.QUARANTINE_TO: - expression = travelEntry.get(sortProperty.propertyName); + expression = travelEntryQueryContext.getJoins().getRoot().get(sortProperty.propertyName); break; case TravelEntryIndexDto.PERSON_FIRST_NAME: expression = person.get(Person.FIRST_NAME); @@ -135,26 +198,24 @@ public List getIndexList(TravelEntryCriteria criteria, Inte expression = person.get(Person.LAST_NAME); break; case TravelEntryIndexDto.HOME_DISTRICT_NAME: - expression = district.get(District.NAME); + expression = location.get(District.NAME); break; case TravelEntryIndexDto.POINT_OF_ENTRY_NAME: - expression = pointOfEntry.get(PointOfEntry.NAME); + expression = travelEntryQueryContext.getJoins().getPointOfEntry().get(PointOfEntry.NAME); break; default: throw new IllegalArgumentException(sortProperty.propertyName); } order.add(sortProperty.ascending ? cb.asc(expression) : cb.desc(expression)); + selections.add(expression); } cq.orderBy(order); } else { - cq.orderBy(cb.desc(travelEntry.get(TravelEntry.CHANGE_DATE))); + Path changeDate = travelEntryQueryContext.getJoins().getRoot().get(TravelEntry.CHANGE_DATE); + cq.orderBy(cb.desc(changeDate)); + selections.add(changeDate); } - - cq.distinct(true); - - return createQuery(cq, first, max).unwrap(org.hibernate.query.Query.class) - .setResultTransformer(new TravelEntryIndexDtoResultTransformer()) - .getResultList(); + return selections; } public long count(TravelEntryCriteria criteria, boolean ignoreUserFilter) { diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/performance/PerformanceLogAnalysisGenerator.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/performance/PerformanceLogAnalysisGenerator.java index 3417c1321ea..8b0d27c3bd0 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/performance/PerformanceLogAnalysisGenerator.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/performance/PerformanceLogAnalysisGenerator.java @@ -148,7 +148,7 @@ public void analyzePerformanceLog(File logFile) throws IOException { String finishTime = matcherFinish.group(3); Stack finishCallstack = callstacks.get(finishThread); - if (finishCallstack != null && finishMethod.equals(finishCallstack.peek())) { + if (finishCallstack != null && !finishCallstack.isEmpty() && finishMethod.equals(finishCallstack.peek())) { finishCallstack.pop(); } From 467f28d359b37dd8e1009b2893f8c1a33dcc0bb3 Mon Sep 17 00:00:00 2001 From: Bartha Barna Date: Tue, 20 Dec 2022 09:25:30 +0200 Subject: [PATCH 133/147] #7760 - disable junit 5 test --- sormas-backend/src/test/java/de/symeda/EntityMappingTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-backend/src/test/java/de/symeda/EntityMappingTest.java b/sormas-backend/src/test/java/de/symeda/EntityMappingTest.java index 9dee88598e8..642db72d668 100644 --- a/sormas-backend/src/test/java/de/symeda/EntityMappingTest.java +++ b/sormas-backend/src/test/java/de/symeda/EntityMappingTest.java @@ -31,8 +31,8 @@ import org.apache.commons.lang3.reflect.FieldUtils; import org.apache.commons.lang3.reflect.MethodUtils; import org.hibernate.annotations.Type; -import org.junit.Ignore; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import de.symeda.sormas.api.EntityDto; @@ -251,7 +251,7 @@ public class EntityMappingTest { } @Test - @Ignore("Ignored until all fields have been fixed or marked with exception annotation!") + @Disabled("Ignored until all fields have been fixed or marked with exception annotation!") public void testDtoEntityFieldMatching() { final StringBuilder stringBuilder = new StringBuilder("\n"); From 8a2d40c55781cb8c739b8af84d3a3925ba42dbdb Mon Sep 17 00:00:00 2001 From: Bartha Barna Date: Tue, 20 Dec 2022 09:46:14 +0200 Subject: [PATCH 134/147] #10480 - move postgres env variable to windows temporal tables installation topic --- docs/SERVER_SETUP.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/SERVER_SETUP.md b/docs/SERVER_SETUP.md index 93699ceaa44..95cdbc066fb 100644 --- a/docs/SERVER_SETUP.md +++ b/docs/SERVER_SETUP.md @@ -63,19 +63,19 @@ You can check your Java version from the shell/command line using: ``java -versi * Install PostgreSQL (currently 9.5, 9.6 or 10) on your system (manuals for all OS can be found here: ) * Set **max_connections = 288** and **max_prepared_transactions = 256** (at least, sum of all connection pools) in ``postgresql.conf`` (e.g. ``/etc/postgresql/10.0/main/postgresql.conf``; ``C:/Program Files/PostgreSQL/10.0/data``) - make sure the property is uncommented and restart the service to apply the changes. * Install the "temporal tables" extension for Postgres () - * **Windows**: Download the latest version for your Postgres version: , then copy the DLL from the project into the PostgreSQL's lib directory and the .sql and .control files into the directory share\extension. + * **Windows**: Download the latest version for your Postgres version: + * , then copy the DLL from the project into the PostgreSQL's lib directory and the .sql and .control files into the directory share\extension. + * Add the PostgreSQL path (/etc/PostgreSQL/10/bin) to Environment Variables * **Linux** (see - * Add the PostgreSQL path (/etc/PostgreSQL/10/bin) to Environment Variables -```bash -sudo apt-get install libpq-dev -sudo apt-get install postgresql-server-dev-all -sudo apt install pgxnclient -#Check for GCC: -gcc --version # and install if missing -sudo pgxn install temporal_tables -# The packages can be removed afterward -``` - + ```bash + sudo apt-get install libpq-dev + sudo apt-get install postgresql-server-dev-all + sudo apt install pgxnclient + #Check for GCC: + gcc --version # and install if missing + sudo pgxn install temporal_tables + # The packages can be removed afterward + ``` ## SORMAS Server From 6ae3d89b5dd180ad5f4256c632ccbfb548ede0a1 Mon Sep 17 00:00:00 2001 From: Bartha Barna Date: Tue, 20 Dec 2022 09:46:56 +0200 Subject: [PATCH 135/147] #10480 - move postgres env variable to linux temporal tables installation topic --- docs/SERVER_SETUP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/SERVER_SETUP.md b/docs/SERVER_SETUP.md index 95cdbc066fb..65ebc9e93ab 100644 --- a/docs/SERVER_SETUP.md +++ b/docs/SERVER_SETUP.md @@ -65,7 +65,6 @@ You can check your Java version from the shell/command line using: ``java -versi * Install the "temporal tables" extension for Postgres () * **Windows**: Download the latest version for your Postgres version: * , then copy the DLL from the project into the PostgreSQL's lib directory and the .sql and .control files into the directory share\extension. - * Add the PostgreSQL path (/etc/PostgreSQL/10/bin) to Environment Variables * **Linux** (see ```bash sudo apt-get install libpq-dev @@ -76,6 +75,7 @@ You can check your Java version from the shell/command line using: ``java -versi sudo pgxn install temporal_tables # The packages can be removed afterward ``` + * Add the PostgreSQL path (/etc/PostgreSQL/10/bin) to Environment Variables ## SORMAS Server From acdf6bfd5a1af40911a1769e17eb4f8ffaf15eba Mon Sep 17 00:00:00 2001 From: Razvan Date: Tue, 20 Dec 2022 10:20:34 +0200 Subject: [PATCH 136/147] #10635CreateLoginLanguageCheckTest : added checks --- .../sormas/e2etests/pages/application/LoginPage.java | 3 +++ .../e2etests/steps/web/application/LoginSteps.java | 12 +++++++++--- .../test/resources/features/sanity/web/Login.feature | 2 ++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/LoginPage.java b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/LoginPage.java index 46d98a57c4c..87b0864e3b1 100755 --- a/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/LoginPage.java +++ b/sormas-e2e-tests/src/main/java/org/sormas/e2etests/pages/application/LoginPage.java @@ -24,6 +24,9 @@ public class LoginPage { public static final By USER_NAME_INPUT = By.id("username"); public static final By USER_PASSWORD_INPUT = By.id("password"); public static final By LOGIN_BUTTON = By.xpath("//*[@id='kc-login' or @id='Login.doLogIn']"); + public static final By APPLICATION_DESCRIPTION_TEXT = + By.xpath( + "//div[@class='v-label v-widget h2 v-label-h2 vspace-top-none v-label-vspace-top-none align-center v-label-align-center v-has-width']"); public static final By FAILED_LOGIN_ERROR_MESSAGE = By.xpath("//div[contains(@class, 'v-Notification-warning')]"); public static final By PASSWORD_CONFIRM_INPUT = By.id("password-confirm"); diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/LoginSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/LoginSteps.java index b62f720cb2e..fb9bd7efeff 100755 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/LoginSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/LoginSteps.java @@ -18,9 +18,7 @@ package org.sormas.e2etests.steps.web.application; -import static org.sormas.e2etests.pages.application.LoginPage.ERROR_MESSAGE; -import static org.sormas.e2etests.pages.application.LoginPage.FAILED_LOGIN_ERROR_MESSAGE; -import static org.sormas.e2etests.pages.application.LoginPage.LOGIN_BUTTON; +import static org.sormas.e2etests.pages.application.LoginPage.*; import static org.sormas.e2etests.pages.application.NavBarPage.*; import static org.sormas.e2etests.pages.application.dashboard.Surveillance.SurveillanceDashboardPage.LOGOUT_BUTTON; import static org.sormas.e2etests.steps.BaseSteps.locale; @@ -208,5 +206,13 @@ public LoginSteps( webDriverHelpers.isElementVisibleWithTimeout(LOGIN_BUTTON, 5), "Login page is not displayed")); }); + + Then( + "^I check that Login page is correctly displayed in ([^\"]*) language$", + (String language) -> { + webDriverHelpers.waitUntilIdentifiedElementIsVisibleAndClickable(LOGIN_BUTTON, 30); + LanguageDetectorHelper.checkLanguage( + webDriverHelpers.getTextFromWebElement(APPLICATION_DESCRIPTION_TEXT), language); + }); } } diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature index f92260de4da..9ee75345df2 100755 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Login.feature @@ -4,6 +4,7 @@ Feature: Login with different type of users @env_main @LoginMain Scenario Outline: Login with user on Main Environment Given I navigate to SORMAS login page + And I check that Login page is correctly displayed in English language Then I log in as a Then I am logged in And I check that Surveillance Dashboard header is correctly displayed in English language @@ -31,6 +32,7 @@ Feature: Login with different type of users @env_de @LoginDe Scenario Outline: Login with user on German Environment Given I navigate to SORMAS login page + And I check that Login page is correctly displayed in German language Then I log in as a Then I am logged in Then I click on the User Settings button from navbar From 6df0c6278feb599ba88f2154b2c1426574373b0e Mon Sep 17 00:00:00 2001 From: Carina Paul <47103965+carina29@users.noreply.github.com> Date: Tue, 20 Dec 2022 16:26:19 +0200 Subject: [PATCH 137/147] =?UTF-8?q?#10376=20-=20fix=20Bulk=20actions'=20bu?= =?UTF-8?q?tton=20visibility=20and=20add=20missing=20infrastr=E2=80=A6=20(?= =?UTF-8?q?#11215)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * #10376 - fix Bulk actions' button visibility and add missing infrastructure locked heading for Areas, Points of Entry and Facilities --- .../infrastructure/AreasView.java | 29 ++++++++++++++---- .../infrastructure/FacilitiesView.java | 30 +++++++++++++++---- .../infrastructure/PointsOfEntryView.java | 28 +++++++++++++---- 3 files changed, 71 insertions(+), 16 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasView.java index 342f1afc083..99da225f13f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/AreasView.java @@ -9,12 +9,15 @@ import com.vaadin.ui.Button; import com.vaadin.ui.ComboBox; import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; import com.vaadin.ui.MenuBar; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; import com.vaadin.ui.themes.ValoTheme; import de.symeda.sormas.api.EntityRelevanceStatus; +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.Descriptions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -73,7 +76,9 @@ public AreasView() { gridLayout.setSizeFull(); gridLayout.setStyleName("crud-main-layout"); - if (UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_IMPORT)) { + boolean infrastructureDataEditable = FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.EDIT_INFRASTRUCTURE_DATA); + + if (infrastructureDataEditable && UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_IMPORT)) { btnImport = ButtonHelper.createIconButton(Captions.actionImport, VaadinIcons.UPLOAD, e -> { Window window = VaadinUiUtil.showPopupWindow(new InfrastructureImportLayout(InfrastructureType.AREA)); window.setCaption(I18nProperties.getString(Strings.headingImportAreas)); @@ -83,6 +88,12 @@ public AreasView() { }, ValoTheme.BUTTON_PRIMARY); addHeaderComponent(btnImport); + } else if (!infrastructureDataEditable) { + Label infrastructureDataLocked = new Label(); + infrastructureDataLocked.setCaption(I18nProperties.getString(Strings.headingInfrastructureLocked)); + infrastructureDataLocked.setValue(I18nProperties.getString(Strings.messageInfrastructureLocked)); + infrastructureDataLocked.setIcon(VaadinIcons.WARNING); + addHeaderComponent(infrastructureDataLocked); } if (UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_EXPORT)) { @@ -95,7 +106,7 @@ public AreasView() { fileDownloader.extend(btnExport); } - if (UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_CREATE)) { + if (infrastructureDataEditable && UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_CREATE)) { btnCreate = ButtonHelper.createIconButton( Captions.actionNewEntry, VaadinIcons.PLUS_CIRCLE, @@ -116,8 +127,8 @@ public AreasView() { addHeaderComponent(btnLeaveBulkEditMode); btnEnterBulkEditMode.addClickListener(e -> { - dropdownBulkOperations.setVisible(true); viewConfiguration.setInEagerMode(true); + dropdownBulkOperations.setVisible(isBulkOperationsDropdownVisible()); btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); @@ -125,8 +136,8 @@ public AreasView() { grid.reload(); }); btnLeaveBulkEditMode.addClickListener(e -> { - dropdownBulkOperations.setVisible(false); viewConfiguration.setInEagerMode(false); + dropdownBulkOperations.setVisible(false); btnLeaveBulkEditMode.setVisible(false); btnEnterBulkEditMode.setVisible(true); searchField.setEnabled(true); @@ -213,7 +224,7 @@ private HorizontalLayout createFilterBar() { EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); dropdownBulkOperations - .setVisible(viewConfiguration.isInEagerMode() && !EntityRelevanceStatus.ALL.equals(criteria.getRelevanceStatus())); + .setVisible(isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(dropdownBulkOperations); } } @@ -250,4 +261,12 @@ public void updateFilterComponents() { applyingCriteria = false; } + private boolean isBulkOperationsDropdownVisible() { + boolean infrastructureDataEditable = FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.EDIT_INFRASTRUCTURE_DATA); + + return viewConfiguration.isInEagerMode() + && (EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus()) + || (infrastructureDataEditable && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + } + } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java index 7cf3073a419..a3b0228d2ea 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/FacilitiesView.java @@ -28,6 +28,7 @@ import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; import com.vaadin.ui.MenuBar; import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.Window; @@ -36,6 +37,7 @@ import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.FacadeProvider; +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.i18n.Strings; @@ -119,7 +121,9 @@ public FacilitiesView() { gridLayout.setSizeFull(); gridLayout.setStyleName("crud-main-layout"); - if (UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_IMPORT)) { + boolean infrastructureDataEditable = FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.EDIT_INFRASTRUCTURE_DATA); + + if (infrastructureDataEditable && UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_IMPORT)) { importButton = ButtonHelper.createIconButton(Captions.actionImport, VaadinIcons.UPLOAD, e -> { Window window = VaadinUiUtil.showPopupWindow(new InfrastructureImportLayout(InfrastructureType.FACILITY)); window.setCaption(I18nProperties.getString(Strings.headingImportFacilities)); @@ -130,6 +134,12 @@ public FacilitiesView() { }, ValoTheme.BUTTON_PRIMARY); addHeaderComponent(importButton); + } else if (!infrastructureDataEditable) { + Label infrastructureDataLocked = new Label(); + infrastructureDataLocked.setCaption(I18nProperties.getString(Strings.headingInfrastructureLocked)); + infrastructureDataLocked.setValue(I18nProperties.getString(Strings.messageInfrastructureLocked)); + infrastructureDataLocked.setIcon(VaadinIcons.WARNING); + addHeaderComponent(infrastructureDataLocked); } if (UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_EXPORT)) { @@ -183,7 +193,7 @@ public FacilitiesView() { Strings.infoDetailedExport); } - if (UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_CREATE)) { + if (infrastructureDataEditable && UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_CREATE)) { createButton = ButtonHelper.createIconButtonWithCaption( "create", I18nProperties.getCaption(Captions.actionNewEntry), @@ -204,8 +214,8 @@ public FacilitiesView() { addHeaderComponent(btnLeaveBulkEditMode); btnEnterBulkEditMode.addClickListener(e -> { - bulkOperationsDropdown.setVisible(true); viewConfiguration.setInEagerMode(true); + bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); @@ -214,8 +224,8 @@ public FacilitiesView() { rowCount.update(grid.getDataSize()); }); btnLeaveBulkEditMode.addClickListener(e -> { - bulkOperationsDropdown.setVisible(false); viewConfiguration.setInEagerMode(false); + bulkOperationsDropdown.setVisible(false); btnLeaveBulkEditMode.setVisible(false); btnEnterBulkEditMode.setVisible(true); searchField.setEnabled(true); @@ -398,8 +408,7 @@ public void run() { }, EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); - bulkOperationsDropdown - .setVisible(viewConfiguration.isInEagerMode() && !EntityRelevanceStatus.ALL.equals(criteria.getRelevanceStatus())); + bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } @@ -443,4 +452,13 @@ public void updateFilterComponents() { applyingCriteria = false; } + + private boolean isBulkOperationsDropdownVisible() { + boolean infrastructureDataEditable = FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.EDIT_INFRASTRUCTURE_DATA); + + return viewConfiguration.isInEagerMode() + && (EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus()) + || (infrastructureDataEditable && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + } + } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java index c8d1c8d4061..7554a7b7b29 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/infrastructure/PointsOfEntryView.java @@ -24,6 +24,7 @@ import com.vaadin.server.StreamResource; import com.vaadin.ui.Alignment; import com.vaadin.ui.Button; +import com.vaadin.ui.Label; import com.vaadin.ui.MenuBar; import com.vaadin.ui.Window; import com.vaadin.ui.themes.ValoTheme; @@ -33,6 +34,7 @@ import de.symeda.sormas.api.EntityRelevanceStatus; import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.feature.FeatureType; import de.symeda.sormas.api.i18n.Captions; import de.symeda.sormas.api.i18n.Descriptions; import de.symeda.sormas.api.i18n.I18nProperties; @@ -109,7 +111,9 @@ public PointsOfEntryView() { gridLayout.setSizeFull(); gridLayout.setStyleName("crud-main-layout"); - if (UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_IMPORT)) { + boolean infrastructureDataEditable = FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.EDIT_INFRASTRUCTURE_DATA); + + if (infrastructureDataEditable && UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_IMPORT)) { Button importButton = ButtonHelper.createIconButton(Captions.actionImport, VaadinIcons.UPLOAD, e -> { Window window = VaadinUiUtil.showPopupWindow(new InfrastructureImportLayout(InfrastructureType.POINT_OF_ENTRY)); window.setCaption(I18nProperties.getString(Strings.headingImportPointsOfEntry)); @@ -119,6 +123,12 @@ public PointsOfEntryView() { }, ValoTheme.BUTTON_PRIMARY); addHeaderComponent(importButton); + } else if (!infrastructureDataEditable) { + Label infrastructureDataLocked = new Label(); + infrastructureDataLocked.setCaption(I18nProperties.getString(Strings.headingInfrastructureLocked)); + infrastructureDataLocked.setValue(I18nProperties.getString(Strings.messageInfrastructureLocked)); + infrastructureDataLocked.setIcon(VaadinIcons.WARNING); + addHeaderComponent(infrastructureDataLocked); } if (UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_EXPORT)) { @@ -135,7 +145,7 @@ public PointsOfEntryView() { fileDownloader.extend(exportButton); } - if (UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_CREATE)) { + if (infrastructureDataEditable && UserProvider.getCurrent().hasUserRight(UserRight.INFRASTRUCTURE_CREATE)) { createButton = ButtonHelper.createIconButton( Captions.actionNewEntry, VaadinIcons.PLUS_CIRCLE, @@ -156,8 +166,8 @@ public PointsOfEntryView() { addHeaderComponent(btnLeaveBulkEditMode); btnEnterBulkEditMode.addClickListener(e -> { - bulkOperationsDropdown.setVisible(true); viewConfiguration.setInEagerMode(true); + bulkOperationsDropdown.setVisible(isBulkOperationsDropdownVisible()); btnEnterBulkEditMode.setVisible(false); btnLeaveBulkEditMode.setVisible(true); searchField.setEnabled(false); @@ -165,8 +175,8 @@ public PointsOfEntryView() { grid.reload(); }); btnLeaveBulkEditMode.addClickListener(e -> { - bulkOperationsDropdown.setVisible(false); viewConfiguration.setInEagerMode(false); + bulkOperationsDropdown.setVisible(false); btnLeaveBulkEditMode.setVisible(false); btnEnterBulkEditMode.setVisible(true); searchField.setEnabled(true); @@ -319,7 +329,7 @@ private HorizontalLayout createFilterBar() { EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); bulkOperationsDropdown - .setVisible(viewConfiguration.isInEagerMode() && !EntityRelevanceStatus.ALL.equals(criteria.getRelevanceStatus())); + .setVisible(isBulkOperationsDropdownVisible()); actionButtonsLayout.addComponent(bulkOperationsDropdown); } } @@ -363,4 +373,12 @@ public void updateFilterComponents() { applyingCriteria = false; } + + private boolean isBulkOperationsDropdownVisible() { + boolean infrastructureDataEditable = FacadeProvider.getFeatureConfigurationFacade().isFeatureEnabled(FeatureType.EDIT_INFRASTRUCTURE_DATA); + + return viewConfiguration.isInEagerMode() + && (EntityRelevanceStatus.ACTIVE.equals(criteria.getRelevanceStatus()) + || (infrastructureDataEditable && EntityRelevanceStatus.ARCHIVED.equals(criteria.getRelevanceStatus()))); + } } From 85978d43c8d4aa5760f42dd970c75c5cbc231331 Mon Sep 17 00:00:00 2001 From: razvancornita Date: Tue, 20 Dec 2022 17:25:35 +0200 Subject: [PATCH 138/147] Added user right check for create case button (#11203) --- .../symeda/sormas/ui/travelentry/TravelEntryDataView.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java index fc8db6d3a74..5447de4a22c 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntryDataView.java @@ -65,15 +65,18 @@ protected void initView(String params) { container.addComponent(layout); + UserProvider currentUser = UserProvider.getCurrent(); + boolean caseButtonVisible = currentUser != null && currentUser.hasUserRight(UserRight.CASE_CREATE); + CaseReferenceDto resultingCase = travelEntryDto.getResultingCase(); - if (resultingCase == null) { + if (resultingCase == null && caseButtonVisible) { Button createCaseButton = ButtonHelper.createButton( Captions.travelEntryCreateCase, e -> showUnsavedChangesPopup(() -> ControllerProvider.getCaseController().createFromTravelEntry(travelEntryDto)), ValoTheme.BUTTON_PRIMARY, CssStyles.VSPACE_2); layout.addSidePanelComponent(createCaseButton, CASE_LOC); - } else { + } else if (resultingCase != null) { layout.addSidePanelComponent(createCaseInfoLayout(resultingCase.getUuid()), CASE_LOC); } From fe71891c46dddb15794f29892e48706364f92e6e Mon Sep 17 00:00:00 2001 From: Adrian Dinu Date: Wed, 21 Dec 2022 07:50:53 +0200 Subject: [PATCH 139/147] Bug/10922 developer tab npe error (#11210) * #10922 show error for cases * #10922 show error for contacts * #10922 show error for events * #10922 show error for sample * #10922 refactor code * #10922 refactor code * #10922 refactor code --- .../sormas/ui/configuration/DevModeView.java | 835 +++++------------- .../generate/config/BaseGenerationConfig.java | 75 ++ .../generate/config/CaseGenerationConfig.java | 29 + .../config/ContactGenerationConfig.java | 64 ++ .../config/EventGenerationConfig.java | 86 ++ .../config/SampleGenerationConfig.java | 133 +++ .../validator/StringToNumberValidator.java | 82 ++ 7 files changed, 698 insertions(+), 606 deletions(-) create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/BaseGenerationConfig.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/CaseGenerationConfig.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/ContactGenerationConfig.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/EventGenerationConfig.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/SampleGenerationConfig.java create mode 100644 sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/validator/StringToNumberValidator.java diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/DevModeView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/DevModeView.java index 38640b32063..0e371b190fb 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/DevModeView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/DevModeView.java @@ -41,7 +41,6 @@ import org.slf4j.LoggerFactory; import com.vaadin.data.Binder; -import com.vaadin.data.converter.StringToIntegerConverter; import com.vaadin.icons.VaadinIcons; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.shared.ui.ContentMode; @@ -98,10 +97,16 @@ import de.symeda.sormas.api.utils.DateHelper; import de.symeda.sormas.api.utils.SortProperty; import de.symeda.sormas.api.utils.UtilDate; +import de.symeda.sormas.api.utils.ValidationRuntimeException; import de.symeda.sormas.api.utils.fieldvisibility.FieldVisibilityCheckers; import de.symeda.sormas.api.visit.VisitDto; import de.symeda.sormas.api.visit.VisitStatus; import de.symeda.sormas.ui.UserProvider; +import de.symeda.sormas.ui.configuration.generate.config.CaseGenerationConfig; +import de.symeda.sormas.ui.configuration.generate.config.ContactGenerationConfig; +import de.symeda.sormas.ui.configuration.generate.config.EventGenerationConfig; +import de.symeda.sormas.ui.configuration.generate.config.SampleGenerationConfig; +import de.symeda.sormas.ui.configuration.validator.StringToNumberValidator; import de.symeda.sormas.ui.utils.ButtonHelper; import de.symeda.sormas.ui.utils.CssStyles; import de.symeda.sormas.ui.utils.DateFormatHelper; @@ -289,8 +294,8 @@ private VerticalLayout createCaseGeneratorLayout() { TextField caseCountField = new TextField(); caseCountField.setCaption(I18nProperties.getCaption(Captions.devModeCaseCount)); caseGeneratorConfigBinder.forField(caseCountField) - .withConverter(new StringToIntegerConverter("Must be a number")) - .bind(CaseGenerationConfig::getCaseCount, CaseGenerationConfig::setCaseCount); + .withValidator(new StringToNumberValidator("Must be a positive number", true)) + .bind(CaseGenerationConfig::getEntityCount, CaseGenerationConfig::setEntityCount); caseOptionsLayout.addComponent(caseCountField); DateField startDateField = new DateField(); @@ -360,8 +365,8 @@ private VerticalLayout createContactGeneratorLayout() { TextField contactCountField = new TextField(); contactCountField.setCaption(I18nProperties.getCaption(Captions.devModeContactCount)); contactGeneratorConfigBinder.forField(contactCountField) - .withConverter(new StringToIntegerConverter("Must be a number")) - .bind(ContactGenerationConfig::getContactCount, ContactGenerationConfig::setContactCount); + .withValidator(new StringToNumberValidator("Must be a positive number", true)) + .bind(ContactGenerationConfig::getEntityCount, ContactGenerationConfig::setEntityCount); contactOptionsFirstLineLayout.addComponent(contactCountField); DateField startDateField = new DateField(); @@ -454,8 +459,8 @@ private VerticalLayout createEventsGeneratorLayout() { TextField eventCountField = new TextField(); eventCountField.setCaption(I18nProperties.getCaption(Captions.devModeEventCount)); eventGeneratorConfigBinder.forField(eventCountField) - .withConverter(new StringToIntegerConverter("Must be a number")) - .bind(EventGenerationConfig::getEventCount, EventGenerationConfig::setEventCount); + .withValidator(new StringToNumberValidator("Must be a positive number", true)) + .bind(EventGenerationConfig::getEntityCount, EventGenerationConfig::setEntityCount); eventOptionsFirstLineLayout.addComponent(eventCountField); DateField startDateField = new DateField(); @@ -508,35 +513,35 @@ private VerticalLayout createEventsGeneratorLayout() { TextField minParticipantsPerEventField = new TextField(); minParticipantsPerEventField.setCaption(I18nProperties.getCaption(Captions.devModeEventMinParticipants)); eventGeneratorConfigBinder.forField(minParticipantsPerEventField) - .withConverter(new StringToIntegerConverter("Must be a number")) + .withValidator(new StringToNumberValidator("Must be a positive number", true)) .bind(EventGenerationConfig::getMinParticipantsPerEvent, EventGenerationConfig::setMinParticipantsPerEvent); eventOptionsSecondLineLayout.addComponent(minParticipantsPerEventField); TextField maxParticipantsPerEventField = new TextField(); maxParticipantsPerEventField.setCaption(I18nProperties.getCaption(Captions.devModeEventMaxParticipants)); eventGeneratorConfigBinder.forField(maxParticipantsPerEventField) - .withConverter(new StringToIntegerConverter("Must be a number")) + .withValidator(new StringToNumberValidator("Must be a positive number", true)) .bind(EventGenerationConfig::getMaxParticipantsPerEvent, EventGenerationConfig::setMaxParticipantsPerEvent); eventOptionsSecondLineLayout.addComponent(maxParticipantsPerEventField); TextField minContactsPerParticipantField = new TextField(); minContactsPerParticipantField.setCaption(I18nProperties.getCaption(Captions.devModeEventMinContacts)); eventGeneratorConfigBinder.forField(minContactsPerParticipantField) - .withConverter(new StringToIntegerConverter("Must be a number")) + .withValidator(new StringToNumberValidator("Must be a positive number", true)) .bind(EventGenerationConfig::getMinContactsPerParticipant, EventGenerationConfig::setMinContactsPerParticipant); eventOptionsSecondLineLayout.addComponent(minContactsPerParticipantField); TextField maxContactsPerParticipantField = new TextField(); maxContactsPerParticipantField.setCaption(I18nProperties.getCaption(Captions.devModeEventMaxContacts)); eventGeneratorConfigBinder.forField(maxContactsPerParticipantField) - .withConverter(new StringToIntegerConverter("Must be a number")) + .withValidator(new StringToNumberValidator("Must be a positive number", true)) .bind(EventGenerationConfig::getMaxContactsPerParticipant, EventGenerationConfig::setMaxContactsPerParticipant); eventOptionsSecondLineLayout.addComponent(maxContactsPerParticipantField); TextField percentageOfCasesField = new TextField(); percentageOfCasesField.setCaption(I18nProperties.getCaption(Captions.devModeEventCasePercentage)); eventGeneratorConfigBinder.forField(percentageOfCasesField) - .withConverter(new StringToIntegerConverter("Must be a number")) + .withValidator(new StringToNumberValidator("Must be a positive number", true)) .bind(EventGenerationConfig::getPercentageOfCases, EventGenerationConfig::setPercentageOfCases); eventOptionsSecondLineLayout.addComponent(percentageOfCasesField); @@ -566,8 +571,8 @@ private VerticalLayout createSamplesGeneratorLayout() { TextField sampleCountField = new TextField(); sampleCountField.setCaption(I18nProperties.getCaption(Captions.devModeSampleCount)); sampleGeneratorConfigBinder.forField(sampleCountField) - .withConverter(new StringToIntegerConverter("Must be a number")) - .bind(SampleGenerationConfig::getSampleCount, SampleGenerationConfig::setSampleCount); + .withValidator(new StringToNumberValidator("Must be a positive number", true)) + .bind(SampleGenerationConfig::getEntityCount, SampleGenerationConfig::setEntityCount); sampleOptionsFirstLineLayout.addComponent(sampleCountField); DateField startDateField = new DateField(); @@ -901,13 +906,41 @@ private Optional getter(Method setter) throws NoSuchMethodException { } private void generateCases() { - initializeRandomGenerator(); - CaseGenerationConfig config = caseGeneratorConfigBinder.getBean(); + StringBuilder errorMessage = new StringBuilder(); + boolean valid = true; + if (config.getEntityCountAsNumber() <= 0) { + errorMessage.append("You must set a valid value for field 'Number of generated cases' in 'Generate Cases'").append("
"); + valid = false; + } + if (config.getStartDate() == null) { + errorMessage.append("You must set a valid value for field 'Earliest Case start date' in 'Generate Cases'").append("
"); + valid = false; + } + + if (config.getEndDate() == null) { + errorMessage.append("You must set a valid value for field 'Latest Case start date' in 'Generate Cases'").append("
"); + valid = false; + } + + if (config.getDistrict() == null) { + errorMessage.append("You must set a valid value for field 'District of the cases' in 'Generate Cases'").append("
"); + valid = false; + } + + if (valid) { + generateCases(config); + } else { + throw new ValidationRuntimeException(errorMessage.toString()); + } + } + + private void generateCases(CaseGenerationConfig config) { + initializeRandomGenerator(); List diseases = FacadeProvider.getDiseaseConfigurationFacade().getAllDiseases(true, true, true); float baseOffset = random().nextFloat(); - int daysBetween = (int) ChronoUnit.DAYS.between(config.startDate, config.endDate); + int daysBetween = (int) ChronoUnit.DAYS.between(config.getStartDate(), config.getEndDate()); FacilityCriteria facilityCriteria = new FacilityCriteria(); facilityCriteria.region(config.getRegion()); @@ -915,14 +948,14 @@ private void generateCases() { // just load some health facilities. Alphabetical order is not random, but the best we can get List healthFacilities = FacadeProvider.getFacilityFacade() - .getIndexList(facilityCriteria, 0, Math.min(config.getCaseCount() * 2, 300), Arrays.asList(new SortProperty(FacilityDto.NAME))); + .getIndexList(facilityCriteria, 0, Math.min(config.getEntityCountAsNumber() * 2, 300), Arrays.asList(new SortProperty(FacilityDto.NAME))); // Filter list, so that only health facilities meant for accomodation are selected healthFacilities.removeIf(el -> (!el.getType().isAccommodation())); long dt = System.nanoTime(); - for (int i = 0; i < config.getCaseCount(); i++) { + for (int i = 0; i < config.getEntityCountAsNumber(); i++) { Disease disease = config.getDisease(); if (disease == null) { disease = random(diseases); @@ -931,7 +964,8 @@ private void generateCases() { fieldVisibilityCheckers = FieldVisibilityCheckers.withDisease(disease).andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale()); - LocalDateTime referenceDateTime = getReferenceDateTime(i, config.getCaseCount(), baseOffset, disease, config.getStartDate(), daysBetween); + LocalDateTime referenceDateTime = + getReferenceDateTime(i, config.getEntityCountAsNumber(), baseOffset, disease, config.getStartDate(), daysBetween); // person PersonDto person = PersonDto.build(); @@ -986,23 +1020,53 @@ private void generateCases() { } dt = System.nanoTime() - dt; - long perCase = dt / config.getCaseCount(); - String msg = String.format("Generating %,d cases took %,d ms (%,d ms per case)", config.getCaseCount(), dt / 1_000_000, perCase / 1_000_000); + long perCase = dt / config.getEntityCountAsNumber(); + String msg = String + .format("Generating %,d cases took %,d ms (%,d ms per case)", config.getEntityCountAsNumber(), dt / 1_000_000, perCase / 1_000_000); logger.info(msg); Notification.show("", msg, Notification.Type.TRAY_NOTIFICATION); } private void generateSamples() { - initializeRandomGenerator(); + SampleGenerationConfig sampleGenerationConfig = sampleGeneratorConfigBinder.getBean(); + boolean valid = true; + StringBuilder errorMessage = new StringBuilder(); - SampleGenerationConfig config = sampleGeneratorConfigBinder.getBean(); + if (sampleGenerationConfig.getEntityCountAsNumber() <= 0) { + errorMessage.append("You must set a valid value for field 'Number of generated samples' in 'Generate Samples'").append("
"); + valid = false; + } + if (sampleGenerationConfig.getStartDate() == null) { + errorMessage.append("You must set a valid value for field 'Sample collected start date' in 'Generate Samples'").append("
"); + valid = false; + } + + if (sampleGenerationConfig.getEndDate() == null) { + errorMessage.append("You must set a valid value for field 'Sample collected end date' in 'Generate Samples'").append("
"); + valid = false; + } + + if (sampleGenerationConfig.getSampleMaterial() == null) { + errorMessage.append("You must set a valid value for field 'Type of the Sample' in 'Generate Samples'").append("
"); + valid = false; + } + + if (valid) { + generateSamples(sampleGenerationConfig); + } else { + throw new ValidationRuntimeException(errorMessage.toString()); + } + } + + private void generateSamples(SampleGenerationConfig sampleGenerationConfig) { + initializeRandomGenerator(); float baseOffset = random().nextFloat(); - int daysBetween = (int) ChronoUnit.DAYS.between(config.startDate, config.endDate); + int daysBetween = (int) ChronoUnit.DAYS.between(sampleGenerationConfig.getStartDate(), sampleGenerationConfig.getEndDate()); FacilityCriteria facilityCriteria = new FacilityCriteria(); - facilityCriteria.region(config.getRegion()); - facilityCriteria.district(config.getDistrict()); + facilityCriteria.region(sampleGenerationConfig.getRegion()); + facilityCriteria.district(sampleGenerationConfig.getDistrict()); long dt = System.nanoTime(); @@ -1010,41 +1074,48 @@ private void generateSamples() { List cases = FacadeProvider.getCaseFacade() .getRandomCaseReferences( - new CaseCriteria().region(config.getRegion()).district(config.getDistrict()).disease(config.getDisease()), - config.getSampleCount() * 2, + new CaseCriteria().region(sampleGenerationConfig.getRegion()) + .district(sampleGenerationConfig.getDistrict()) + .disease(sampleGenerationConfig.getDisease()), + sampleGenerationConfig.getEntityCountAsNumber() * 2, random()); if (nonNull(cases)) { - for (int i = 0; i < config.getSampleCount(); i++) { + for (int i = 0; i < sampleGenerationConfig.getEntityCountAsNumber(); i++) { CaseReferenceDto caseReference = random(cases); List diseases = FacadeProvider.getDiseaseConfigurationFacade().getAllDiseases(true, true, true); - Disease disease = config.getDisease(); + Disease disease = sampleGenerationConfig.getDisease(); if (disease == null) { disease = random(diseases); - config.setDisease(disease); + sampleGenerationConfig.setDisease(disease); } - LocalDateTime referenceDateTime = - getReferenceDateTime(i, config.getSampleCount(), baseOffset, config.getDisease(), config.getStartDate(), daysBetween); + LocalDateTime referenceDateTime = getReferenceDateTime( + i, + sampleGenerationConfig.getEntityCountAsNumber(), + baseOffset, + sampleGenerationConfig.getDisease(), + sampleGenerationConfig.getStartDate(), + daysBetween); SampleDto sample = SampleDto.build(user, caseReference); - sample.setSamplePurpose(config.getSamplePurpose()); + sample.setSamplePurpose(sampleGenerationConfig.getSamplePurpose()); Date date = Date.from(referenceDateTime.toLocalDate().atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()); sample.setSampleDateTime(date); - sample.setSampleMaterial(config.getSampleMaterial()); + sample.setSampleMaterial(sampleGenerationConfig.getSampleMaterial()); sample.setFieldSampleID(UUID.randomUUID().toString()); sample.setComment(random(sampleComments)); - sample.setLab(config.getLaboratory()); + sample.setLab(sampleGenerationConfig.getLaboratory()); - if (config.isRequestPathogenTestsToBePerformed()) { + if (sampleGenerationConfig.isRequestPathogenTestsToBePerformed()) { Set pathogenTestTypes = new HashSet(); int until = randomInt(1, PathogenTestType.values().length); for (int j = 0; j < until; j++) { @@ -1054,7 +1125,7 @@ private void generateSamples() { sample.setRequestedPathogenTests(pathogenTestTypes); } - if (config.isRequestAdditionalTestsToBePerformed()) { + if (sampleGenerationConfig.isRequestAdditionalTestsToBePerformed()) { Set additionalTestTypes = new HashSet(); int until = randomInt(1, AdditionalTestType.values().length); for (int j = 0; j < until; j++) { @@ -1064,13 +1135,13 @@ private void generateSamples() { sample.setRequestedAdditionalTests(additionalTestTypes); } - if (config.isSendDispatch()) { + if (sampleGenerationConfig.isSendDispatch()) { sample.setShipped(true); sample.setShipmentDate(date); sample.setShipmentDetails(random(sampleShipmentDetails)); } - if (config.isReceived()) { + if (sampleGenerationConfig.isReceived()) { sample.setReceived(true); sample.setReceivedDate(date); @@ -1079,17 +1150,17 @@ private void generateSamples() { SampleDto sampleDto = FacadeProvider.getSampleFacade().saveSample(sample); - if (config.isRequestAdditionalTestsToBePerformed()) { + if (sampleGenerationConfig.isRequestAdditionalTestsToBePerformed()) { createAdditionalTest(sampleDto, date); } } dt = System.nanoTime() - dt; - long perSample = dt / config.getSampleCount(); + long perSample = dt / sampleGenerationConfig.getEntityCountAsNumber(); String msg = String.format( "Generating %d samples took %.2f s (%.1f ms per sample)", - config.getSampleCount(), + sampleGenerationConfig.getEntityCountAsNumber(), (double) dt / 1_000_000_000, (double) perSample / 1_000_000); logger.info(msg); @@ -1136,11 +1207,34 @@ private void createAdditionalTest(SampleDto sample, Date date) { } private void generateContacts() { - initializeRandomGenerator(); + ContactGenerationConfig contactGenerationConfig = contactGeneratorConfigBinder.getBean(); + boolean valid = true; + StringBuilder errorMessage = new StringBuilder(); - ContactGenerationConfig config = contactGeneratorConfigBinder.getBean(); + if (contactGenerationConfig.getEntityCountAsNumber() <= 0) { + errorMessage.append("You must set a valid value for field 'Number of generated contacts' in 'Generate Contacts'").append("
"); + valid = false; + } + if (contactGenerationConfig.getStartDate() == null) { + errorMessage.append("You must set a valid value for field 'Earliest Contact start date' in 'Generate Contacts'").append("
"); + valid = false; + } - Disease disease = config.getDisease(); + if (contactGenerationConfig.getEndDate() == null) { + errorMessage.append("You must set a valid value for field 'Latest Contact start date' in 'Generate Contacts'").append("
"); + valid = false; + } + + if (valid) { + generateContacts(contactGenerationConfig); + } else { + throw new ValidationRuntimeException(errorMessage.toString()); + } + } + private void generateContacts(ContactGenerationConfig contactGenerationConfig) { + initializeRandomGenerator(); + + Disease disease = contactGenerationConfig.getDisease(); List diseases = disease == null ? FacadeProvider.getDiseaseConfigurationFacade().getAllDiseases(true, true, true) : null; if (disease == null) { @@ -1149,19 +1243,19 @@ private void generateContacts() { } List personUuids = new ArrayList<>(); List cases = null; - List districts = config.getDistrict() == null + List districts = contactGenerationConfig.getDistrict() == null ? FacadeProvider.getDistrictFacade() .getIndexList( - new DistrictCriteria().region(config.getRegion()), + new DistrictCriteria().region(contactGenerationConfig.getRegion()), 0, - Math.min(config.getContactCount() * 2, 50), + Math.min(contactGenerationConfig.getEntityCountAsNumber() * 2, 50), Arrays.asList(new SortProperty(DistrictDto.NAME))) : null; - if (!config.isCreateWithoutSourceCases()) { + if (!contactGenerationConfig.isCreateWithoutSourceCases()) { cases = FacadeProvider.getCaseFacade() .getRandomCaseReferences( - new CaseCriteria().region(config.getRegion()).district(config.getDistrict()).disease(disease), - config.getContactCount() * 2, + new CaseCriteria().region(contactGenerationConfig.getRegion()).district(contactGenerationConfig.getDistrict()).disease(disease), + contactGenerationConfig.getEntityCountAsNumber() * 2, random()); if (cases == null) { Notification.show("Error", I18nProperties.getString(Strings.messageMissingCases), Notification.Type.ERROR_MESSAGE); @@ -1170,19 +1264,24 @@ private void generateContacts() { } float baseOffset = random().nextFloat(); - int daysBetween = (int) ChronoUnit.DAYS.between(config.startDate, config.endDate); + int daysBetween = (int) ChronoUnit.DAYS.between(contactGenerationConfig.getStartDate(), contactGenerationConfig.getEndDate()); long dt = System.nanoTime(); - for (int i = 0; i < config.getContactCount(); i++) { + for (int i = 0; i < contactGenerationConfig.getEntityCountAsNumber(); i++) { fieldVisibilityCheckers = - FieldVisibilityCheckers.withDisease(disease).andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale()); + FieldVisibilityCheckers.withDisease(disease).andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale()); - LocalDateTime referenceDateTime = - getReferenceDateTime(i, config.getContactCount(), baseOffset, disease, config.getStartDate(), daysBetween); + LocalDateTime referenceDateTime = getReferenceDateTime( + i, + contactGenerationConfig.getEntityCountAsNumber(), + baseOffset, + disease, + contactGenerationConfig.getStartDate(), + daysBetween); PersonDto person; - if (config.isCreateMultipleContactsPerPerson() && !personUuids.isEmpty() && randomPercent(25)) { + if (contactGenerationConfig.isCreateMultipleContactsPerPerson() && !personUuids.isEmpty() && randomPercent(25)) { String personUuid = random(personUuids); person = FacadeProvider.getPersonFacade().getByUuid(personUuid); } else { @@ -1191,13 +1290,13 @@ private void generateContacts() { person.setSymptomJournalStatus(null); setPersonName(person); - if (config.isCreateMultipleContactsPerPerson()) { + if (contactGenerationConfig.isCreateMultipleContactsPerPerson()) { personUuids.add(person.getUuid()); } } CaseReferenceDto contactCase = null; - if (!config.isCreateWithoutSourceCases()) { + if (!contactGenerationConfig.isCreateWithoutSourceCases()) { contactCase = random(cases); } @@ -1221,8 +1320,8 @@ private void generateContacts() { contact.setRegion(district.getRegion()); contact.setDistrict(district.toReference()); } else { - contact.setRegion(config.getRegion()); - contact.setDistrict(config.getDistrict()); + contact.setRegion(contactGenerationConfig.getRegion()); + contact.setDistrict(contactGenerationConfig.getDistrict()); } if (contact.getLastContactDate() != null && contact.getLastContactDate().after(contact.getReportDateTime())) { @@ -1246,9 +1345,9 @@ private void generateContacts() { contact.setFollowUpUntil(contact.getFollowUpStatus() == FollowUpStatus.NO_FOLLOW_UP ? null : randomDate(referenceDateTime)); // Create visits - if (config.isCreateWithVisits() - && FacadeProvider.getDiseaseConfigurationFacade().hasFollowUp(contact.getDisease()) - && FollowUpStatus.NO_FOLLOW_UP != contact.getFollowUpStatus()) { + if (contactGenerationConfig.isCreateWithVisits() + && FacadeProvider.getDiseaseConfigurationFacade().hasFollowUp(contact.getDisease()) + && FollowUpStatus.NO_FOLLOW_UP != contact.getFollowUpStatus()) { Date latestFollowUpDate = contact.getFollowUpUntil().before(new Date()) ? contact.getFollowUpUntil() : new Date(); Date contactStartDate = ContactLogic.getStartDate(contact); int followUpCount = random().nextInt(DateHelper.getDaysBetween(contactStartDate, latestFollowUpDate) + 1); @@ -1257,7 +1356,7 @@ private void generateContacts() { List followUpDates = new ArrayList<>(); for (int day : followUpDays) { followUpDates - .add(UtilDate.toLocalDate(contactStartDate).atStartOfDay().plusDays(day - 1).plusMinutes(random().nextInt(60 * 24 + 1))); + .add(UtilDate.toLocalDate(contactStartDate).atStartOfDay().plusDays(day - 1).plusMinutes(random().nextInt(60 * 24 + 1))); } for (LocalDateTime date : followUpDates) { @@ -1276,40 +1375,77 @@ private void generateContacts() { } dt = System.nanoTime() - dt; - long perContact = dt / config.getContactCount(); - String msg = String - .format("Generating %,d contacts took %,d ms (%,d ms per contact)", config.getContactCount(), dt / 1_000_000, perContact / 1_000_000); + long perContact = dt / contactGenerationConfig.getEntityCountAsNumber(); + String msg = String.format( + "Generating %,d contacts took %,d ms (%,d ms per contact)", + contactGenerationConfig.getEntityCountAsNumber(), + dt / 1_000_000, + perContact / 1_000_000); logger.info(msg); Notification.show("", msg, Notification.Type.TRAY_NOTIFICATION); } private void generateEvents() { + EventGenerationConfig eventGenerationConfig = eventGeneratorConfigBinder.getBean(); + boolean valid = true; + StringBuilder errorMessage = new StringBuilder(); + + if (eventGenerationConfig.getEntityCountAsNumber() <= 0) { + errorMessage.append("You must set a valid value for field 'Number of generated events' in 'Generate Events'").append("
"); + valid = false; + } + if (eventGenerationConfig.getStartDate() == null) { + errorMessage.append("You must set a valid value for field 'Earliest Event start date' in 'Generate Events'").append("
"); + valid = false; + } + + if (eventGenerationConfig.getEndDate() == null) { + errorMessage.append("You must set a valid value for field 'Latest Event start date' in 'Generate Events'").append("
"); + valid = false; + } + + if (eventGenerationConfig.getDistrict() == null) { + errorMessage.append("You must set a valid value for field 'District of the events' in 'Generate Events'").append("
"); + valid = false; + } + + if (valid) { + generateEvents(eventGenerationConfig); + } else { + throw new ValidationRuntimeException(errorMessage.toString()); + } + } + private void generateEvents(EventGenerationConfig eventGenerationConfig) { initializeRandomGenerator(); - EventGenerationConfig config = eventGeneratorConfigBinder.getBean(); + int minParticipantsPerEvent = eventGenerationConfig.convetToNumber(eventGenerationConfig.getMinParticipantsPerEvent()); + int maxParticipantsPerEvent = eventGenerationConfig.convetToNumber(eventGenerationConfig.getMaxParticipantsPerEvent()); + int percentageOfCases = eventGenerationConfig.convetToNumber(eventGenerationConfig.getPercentageOfCases()); + int minContactsPerParticipant = eventGenerationConfig.convetToNumber(eventGenerationConfig.getMinContactsPerParticipant()); + int maxContactsPerParticipant = eventGenerationConfig.convetToNumber(eventGenerationConfig.getMaxContactsPerParticipant()); int generatedParticipants = 0; int generatedCases = 0; int generatedContacts = 0; - Disease disease = config.getDisease(); + Disease disease = eventGenerationConfig.getDisease(); float baseOffset = random().nextFloat(); - int daysBetween = (int) ChronoUnit.DAYS.between(config.startDate, config.endDate); + int daysBetween = (int) ChronoUnit.DAYS.between(eventGenerationConfig.getStartDate(), eventGenerationConfig.getEndDate()); // this should be adjusted to be much more complex FacilityCriteria facilityCriteria = new FacilityCriteria(); - facilityCriteria.region(config.getRegion()); - facilityCriteria.district(config.getDistrict()); + facilityCriteria.region(eventGenerationConfig.getRegion()); + facilityCriteria.district(eventGenerationConfig.getDistrict()); List healthFacilities = FacadeProvider.getFacilityFacade() - .getIndexList(facilityCriteria, 0, (int) (config.getMaxParticipantsPerEvent() * config.getPercentageOfCases() / 100), null); + .getIndexList(facilityCriteria, 0, (int) (maxContactsPerParticipant * percentageOfCases / 100), null); // Filter list, so that only health facilities meant for accomodation are selected healthFacilities.removeIf(el -> (!el.getType().isAccommodation())); long dt = System.nanoTime(); - for (int i = 0; i < config.getEventCount(); i++) { + for (int i = 0; i < eventGenerationConfig.getEntityCountAsNumber(); i++) { LocalDateTime referenceDateTime; EventDto event = EventDto.build(); @@ -1320,13 +1456,13 @@ private void generateEvents() { if (event.getDisease() == Disease.OTHER) { event.setDiseaseDetails("RD " + (random().nextInt(20) + 1)); } - referenceDateTime = getReferenceDateTime(i, config.getEventCount(), baseOffset, disease, config.getStartDate(), daysBetween); + referenceDateTime = getReferenceDateTime(i, eventGenerationConfig.getEntityCountAsNumber(), baseOffset, disease, eventGenerationConfig.getStartDate(), daysBetween); fieldVisibilityCheckers = - FieldVisibilityCheckers.withDisease(disease).andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale()); + FieldVisibilityCheckers.withDisease(disease).andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale()); } else { - referenceDateTime = getReferenceDateTime(i, config.getEventCount(), baseOffset, Disease.OTHER, config.getStartDate(), daysBetween); + referenceDateTime = getReferenceDateTime(i, eventGenerationConfig.getEntityCountAsNumber(), baseOffset, Disease.OTHER, eventGenerationConfig.getStartDate(), daysBetween); fieldVisibilityCheckers = - FieldVisibilityCheckers.withDisease(Disease.OTHER).andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale()); + FieldVisibilityCheckers.withDisease(Disease.OTHER).andWithCountry(FacadeProvider.getConfigFacade().getCountryLocale()); } // title @@ -1341,8 +1477,8 @@ private void generateEvents() { event.setReportDateTime(Date.from(referenceDateTime.atZone(ZoneId.systemDefault()).toInstant())); // region & district - event.getEventLocation().setRegion(config.getRegion()); - event.getEventLocation().setDistrict(config.getDistrict()); + event.getEventLocation().setRegion(eventGenerationConfig.getRegion()); + event.getEventLocation().setDistrict(eventGenerationConfig.getDistrict()); // status event.setEventStatus(EventStatus.EVENT); @@ -1350,7 +1486,7 @@ private void generateEvents() { FacadeProvider.getEventFacade().save(event); // EventParticipants - int numParticipants = randomInt(config.getMinParticipantsPerEvent(), config.getMaxParticipantsPerEvent()); + int numParticipants = randomInt(minParticipantsPerEvent, maxParticipantsPerEvent); for (int j = 0; j < numParticipants; j++) { EventParticipantDto eventParticipant = EventParticipantDto.build(event.toReference(), UserProvider.getCurrent().getUserReference()); // person @@ -1365,15 +1501,15 @@ private void generateEvents() { if (disease != null) { // generate cases for some participants - if (randomPercent(config.getPercentageOfCases()) && !healthFacilities.isEmpty()) { + if (randomPercent(percentageOfCases) && !healthFacilities.isEmpty()) { CaseDataDto caze = CaseDataDto.buildFromEventParticipant(eventParticipant, person, event.getDisease()); fillEntity(caze, referenceDateTime); caze.setDisease(event.getDisease()); caze.setReportingUser(UserProvider.getCurrent().getUserReference()); caze.setReportDate(Date.from(referenceDateTime.atZone(ZoneId.systemDefault()).toInstant())); caze.setCaseOrigin(CaseOrigin.IN_COUNTRY); - caze.setResponsibleRegion(config.getRegion()); - caze.setResponsibleDistrict(config.getDistrict()); + caze.setResponsibleRegion(eventGenerationConfig.getRegion()); + caze.setResponsibleDistrict(eventGenerationConfig.getDistrict()); FacilityIndexDto facility = random(healthFacilities); caze.setHealthFacility(facility.toReference()); caze.setFacilityType(facility.getType()); @@ -1386,10 +1522,12 @@ private void generateEvents() { // generate contacts for some participants List cases = FacadeProvider.getCaseFacade() .getRandomCaseReferences( - new CaseCriteria().region(config.getRegion()).district(config.getDistrict()).disease(event.getDisease()), + new CaseCriteria().region(eventGenerationConfig.getRegion()) + .district(eventGenerationConfig.getDistrict()) + .disease(event.getDisease()), numParticipants * 2, random()); - int numContacts = randomInt(config.getMinContactsPerParticipant(), config.getMaxContactsPerParticipant()); + int numContacts = randomInt(minContactsPerParticipant, maxContactsPerParticipant); for (int k = 0; (k < numContacts && (cases != null)); k++) { ContactDto contact = ContactDto.build(eventParticipant); contact.setDisease(event.getDisease()); @@ -1408,10 +1546,10 @@ private void generateEvents() { } dt = System.nanoTime() - dt; - long perCase = dt / config.getEventCount(); + long perCase = dt / eventGenerationConfig.getEntityCountAsNumber(); String msg = String.format( "Generating %d events with a total of %d participants (%d contacts, %d cases) took %.2f s (%.1f ms per event)", - config.getEventCount(), + eventGenerationConfig.getEntityCountAsNumber(), generatedParticipants, generatedContacts, generatedCases, @@ -1449,519 +1587,4 @@ private void setPersonName(PersonDto person) { public void enter(ViewChangeEvent event) { super.enter(event); } - - private static class CaseGenerationConfig { - - private int caseCount; - private LocalDate startDate; - private LocalDate endDate; - private Disease disease; - private RegionReferenceDto region; - private DistrictReferenceDto district; - - CaseGenerationConfig() { - loadDefaultConfig(); - } - - public void loadDefaultConfig() { - caseCount = 10; - startDate = LocalDate.now().minusDays(90); - endDate = LocalDate.now(); - disease = null; - region = null; - district = null; - } - - public void loadPerformanceTestConfig() { - caseCount = 50; - startDate = LocalDate.now().minusDays(90); - endDate = LocalDate.now(); - disease = Disease.CORONAVIRUS; - region = null; - district = null; - } - - public int getCaseCount() { - return caseCount; - } - - public void setCaseCount(int caseCount) { - this.caseCount = caseCount; - } - - public LocalDate getStartDate() { - return startDate; - } - - public void setStartDate(LocalDate startDate) { - this.startDate = startDate; - } - - public LocalDate getEndDate() { - return endDate; - } - - public void setEndDate(LocalDate endDate) { - this.endDate = endDate; - } - - public Disease getDisease() { - return disease; - } - - public void setDisease(Disease disease) { - this.disease = disease; - } - - public RegionReferenceDto getRegion() { - return region; - } - - public void setRegion(RegionReferenceDto region) { - this.region = region; - } - - public DistrictReferenceDto getDistrict() { - return district; - } - - public void setDistrict(DistrictReferenceDto district) { - this.district = district; - } - } - - private static class ContactGenerationConfig { - - private int contactCount; - private LocalDate startDate; - private LocalDate endDate; - private Disease disease; - private RegionReferenceDto region; - private DistrictReferenceDto district; - private boolean createWithoutSourceCases; - private boolean createMultipleContactsPerPerson; - private boolean createWithVisits; - - ContactGenerationConfig() { - loadDefaultConfig(); - } - - public void loadDefaultConfig() { - contactCount = 10; - startDate = LocalDate.now().minusDays(90); - endDate = LocalDate.now(); - disease = null; - region = null; - district = null; - createWithoutSourceCases = false; - createMultipleContactsPerPerson = false; - createWithVisits = false; - } - - public void loadPerformanceTestConfig() { - contactCount = 50; - startDate = LocalDate.now().minusDays(90); - endDate = LocalDate.now(); - disease = Disease.CORONAVIRUS; - region = null; - district = null; - createWithoutSourceCases = false; - createMultipleContactsPerPerson = false; - createWithVisits = false; - } - - public int getContactCount() { - return contactCount; - } - - public void setContactCount(int contactCount) { - this.contactCount = contactCount; - } - - public LocalDate getStartDate() { - return startDate; - } - - public void setStartDate(LocalDate startDate) { - this.startDate = startDate; - } - - public LocalDate getEndDate() { - return endDate; - } - - public void setEndDate(LocalDate endDate) { - this.endDate = endDate; - } - - public Disease getDisease() { - return disease; - } - - public void setDisease(Disease disease) { - this.disease = disease; - } - - public RegionReferenceDto getRegion() { - return region; - } - - public void setRegion(RegionReferenceDto region) { - this.region = region; - } - - public DistrictReferenceDto getDistrict() { - return district; - } - - public void setDistrict(DistrictReferenceDto district) { - this.district = district; - } - - public boolean isCreateWithoutSourceCases() { - return createWithoutSourceCases; - } - - public void setCreateWithoutSourceCases(boolean createWithoutSourceCases) { - this.createWithoutSourceCases = createWithoutSourceCases; - } - - public boolean isCreateMultipleContactsPerPerson() { - return createMultipleContactsPerPerson; - } - - public void setCreateMultipleContactsPerPerson(boolean createMultipleContactsPerPerson) { - this.createMultipleContactsPerPerson = createMultipleContactsPerPerson; - } - - public boolean isCreateWithVisits() { - return createWithVisits; - } - - public void setCreateWithVisits(boolean createWithVisits) { - this.createWithVisits = createWithVisits; - } - } - - private static class EventGenerationConfig { - - private int eventCount; - private LocalDate startDate; - private LocalDate endDate; - private Disease disease; - private RegionReferenceDto region; - private DistrictReferenceDto district; - private int minParticipantsPerEvent; - private int maxParticipantsPerEvent; - private int minContactsPerParticipant; - private int maxContactsPerParticipant; - private int percentageOfCases; - - EventGenerationConfig() { - loadDefaultConfig(); - } - - public void loadDefaultConfig() { - eventCount = 10; - startDate = LocalDate.now().minusDays(90); - endDate = LocalDate.now(); - disease = null; - region = null; - district = null; - minParticipantsPerEvent = 3; - maxParticipantsPerEvent = 10; - minContactsPerParticipant = 0; - maxContactsPerParticipant = 3; - percentageOfCases = 20; - } - - public void loadPerformanceTestConfig() { - eventCount = 30; - startDate = LocalDate.now().minusDays(90); - endDate = LocalDate.now(); - disease = Disease.CORONAVIRUS; - // region? - // district? - minParticipantsPerEvent = 3; - maxParticipantsPerEvent = 8; - minContactsPerParticipant = 0; - maxContactsPerParticipant = 2; - percentageOfCases = 15; - } - - public int getEventCount() { - return eventCount; - } - - public void setEventCount(int eventCount) { - this.eventCount = eventCount; - } - - public LocalDate getStartDate() { - return startDate; - } - - public void setStartDate(LocalDate startDate) { - this.startDate = startDate; - } - - public LocalDate getEndDate() { - return endDate; - } - - public void setEndDate(LocalDate endDate) { - this.endDate = endDate; - } - - public Disease getDisease() { - return disease; - } - - public void setDisease(Disease disease) { - this.disease = disease; - } - - public RegionReferenceDto getRegion() { - return region; - } - - public void setRegion(RegionReferenceDto region) { - this.region = region; - } - - public DistrictReferenceDto getDistrict() { - return district; - } - - public void setDistrict(DistrictReferenceDto district) { - this.district = district; - } - - public int getMinParticipantsPerEvent() { - return minParticipantsPerEvent; - } - - public void setMinParticipantsPerEvent(int minParticipantsPerEvent) { - this.minParticipantsPerEvent = minParticipantsPerEvent; - } - - public int getMaxParticipantsPerEvent() { - return maxParticipantsPerEvent; - } - - public void setMaxParticipantsPerEvent(int maxParticipantsPerEvent) { - this.maxParticipantsPerEvent = maxParticipantsPerEvent; - } - - public int getMinContactsPerParticipant() { - return minContactsPerParticipant; - } - - public void setMinContactsPerParticipant(int minContactsPerParticipant) { - this.minContactsPerParticipant = minContactsPerParticipant; - } - - public int getMaxContactsPerParticipant() { - return maxContactsPerParticipant; - } - - public void setMaxContactsPerParticipant(int maxContactsPerParticipant) { - this.maxContactsPerParticipant = maxContactsPerParticipant; - } - - public int getPercentageOfCases() { - return percentageOfCases; - } - - public void setPercentageOfCases(int percentageOfCases) { - this.percentageOfCases = percentageOfCases; - if (this.percentageOfCases >= 100) { - this.percentageOfCases = 100; - } else if (this.percentageOfCases <= 0) { - this.percentageOfCases = 0; - } - } - - } - - private static class SampleGenerationConfig { - - private int sampleCount; - private SamplePurpose samplePurpose; - private LocalDate startDate; - private LocalDate endDate; - private SampleMaterial sampleMaterial; - private String sampleMaterialText; - private FacilityReferenceDto laboratory; - - private boolean externalLabOrInternalInHouseTesting = false; - private boolean requestPathogenTestsToBePerformed = false; - private boolean requestAdditionalTestsToBePerformed = false; - private boolean sendDispatch = false; - private boolean received = false; - private String comment; - - private Disease disease; - private RegionReferenceDto region; - private DistrictReferenceDto district; - - private SampleGenerationConfig() { - } - - public static SampleGenerationConfig getDefaultConfig() { - SampleGenerationConfig sampleGenerationConfig = new SampleGenerationConfig(); - sampleGenerationConfig.sampleCount = 10; - sampleGenerationConfig.startDate = LocalDate.now().minusDays(90); - sampleGenerationConfig.endDate = LocalDate.now(); - sampleGenerationConfig.disease = null; - sampleGenerationConfig.region = null; - sampleGenerationConfig.district = null; - sampleGenerationConfig.samplePurpose = SamplePurpose.INTERNAL; - sampleGenerationConfig.sampleMaterial = SampleMaterial.BLOOD; - return sampleGenerationConfig; - } - - public static SampleGenerationConfig getPerformanceTestConfig() { - SampleGenerationConfig sampleGenerationConfig = new SampleGenerationConfig(); - sampleGenerationConfig.sampleCount = 50; - sampleGenerationConfig.startDate = LocalDate.now().minusDays(90); - sampleGenerationConfig.endDate = LocalDate.now(); - sampleGenerationConfig.disease = Disease.CORONAVIRUS; - sampleGenerationConfig.region = null; - sampleGenerationConfig.district = null; - sampleGenerationConfig.samplePurpose = SamplePurpose.EXTERNAL; - sampleGenerationConfig.sampleMaterial = SampleMaterial.BLOOD; - sampleGenerationConfig.laboratory = FacadeProvider.getFacilityFacade().getAllActiveLaboratories(false).get(0); - return sampleGenerationConfig; - } - - public SamplePurpose getSamplePurpose() { - return samplePurpose; - } - - public void setSamplePurpose(SamplePurpose samplePurpose) { - this.samplePurpose = samplePurpose; - } - - public SampleMaterial getSampleMaterial() { - return sampleMaterial; - } - - public void setSampleMaterial(SampleMaterial sampleMaterial) { - this.sampleMaterial = sampleMaterial; - } - - public String getSampleMaterialText() { - return sampleMaterialText; - } - - public void setSampleMaterialText(String sampleMaterialText) { - this.sampleMaterialText = sampleMaterialText; - } - - public FacilityReferenceDto getLaboratory() { - return laboratory; - } - - public void setLaboratory(FacilityReferenceDto laboratory) { - this.laboratory = laboratory; - } - - public int getSampleCount() { - return sampleCount; - } - - public void setSampleCount(int contactCount) { - this.sampleCount = contactCount; - } - - public LocalDate getStartDate() { - return startDate; - } - - public void setStartDate(LocalDate startDate) { - this.startDate = startDate; - } - - public LocalDate getEndDate() { - return endDate; - } - - public void setEndDate(LocalDate endDate) { - this.endDate = endDate; - } - - public boolean isRequestPathogenTestsToBePerformed() { - return requestPathogenTestsToBePerformed; - } - - public void setRequestPathogenTestsToBePerformed(boolean requestPathogenTestsToBePerformed) { - this.requestPathogenTestsToBePerformed = requestPathogenTestsToBePerformed; - } - - public boolean isExternalLabOrInternalInHouseTesting() { - return externalLabOrInternalInHouseTesting; - } - - public boolean isRequestAdditionalTestsToBePerformed() { - return requestAdditionalTestsToBePerformed; - } - - public void setRequestAdditionalTestsToBePerformed(boolean requestAdditionalTestsToBePerformed) { - this.requestAdditionalTestsToBePerformed = requestAdditionalTestsToBePerformed; - } - - public void setExternalLabOrInternalInHouseTesting(boolean externalLabOrInternalInHouseTesting) { - this.externalLabOrInternalInHouseTesting = externalLabOrInternalInHouseTesting; - } - - public boolean isSendDispatch() { - return sendDispatch; - } - - public void setSendDispatch(boolean sendDispatch) { - this.sendDispatch = sendDispatch; - } - - public boolean isReceived() { - return received; - } - - public void setReceived(boolean received) { - this.received = received; - } - - public String getComment() { - return comment; - } - - public void setComment(String comment) { - this.comment = comment; - } - - public Disease getDisease() { - return disease; - } - - public void setDisease(Disease disease) { - this.disease = disease; - } - - public RegionReferenceDto getRegion() { - return region; - } - - public void setRegion(RegionReferenceDto region) { - this.region = region; - } - - public DistrictReferenceDto getDistrict() { - return district; - } - - public void setDistrict(DistrictReferenceDto district) { - this.district = district; - } - - } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/BaseGenerationConfig.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/BaseGenerationConfig.java new file mode 100644 index 00000000000..ae038bd38b0 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/BaseGenerationConfig.java @@ -0,0 +1,75 @@ +package de.symeda.sormas.ui.configuration.generate.config; + +import java.time.LocalDate; + +import org.apache.commons.lang3.StringUtils; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.infrastructure.district.DistrictReferenceDto; +import de.symeda.sormas.api.infrastructure.region.RegionReferenceDto; + +public class BaseGenerationConfig { + + protected String entityCount; + protected LocalDate startDate; + protected LocalDate endDate; + protected Disease disease; + protected RegionReferenceDto region; + protected DistrictReferenceDto district; + + public int getEntityCountAsNumber() { + return StringUtils.isBlank(getEntityCount()) ? 0 : Integer.parseInt(getEntityCount()); + } + + public int convetToNumber(String value){ + return StringUtils.isBlank(value) ? 0 : Integer.parseInt(value); + } + + public String getEntityCount() { + return entityCount; + } + + public void setEntityCount(String entityCount) { + this.entityCount = entityCount; + } + + public LocalDate getStartDate() { + return startDate; + } + + public void setStartDate(LocalDate startDate) { + this.startDate = startDate; + } + + public LocalDate getEndDate() { + return endDate; + } + + public void setEndDate(LocalDate endDate) { + this.endDate = endDate; + } + + public Disease getDisease() { + return disease; + } + + public void setDisease(Disease disease) { + this.disease = disease; + } + + public RegionReferenceDto getRegion() { + return region; + } + + public void setRegion(RegionReferenceDto region) { + this.region = region; + } + + public DistrictReferenceDto getDistrict() { + return district; + } + + public void setDistrict(DistrictReferenceDto district) { + this.district = district; + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/CaseGenerationConfig.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/CaseGenerationConfig.java new file mode 100644 index 00000000000..17eb394a270 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/CaseGenerationConfig.java @@ -0,0 +1,29 @@ +package de.symeda.sormas.ui.configuration.generate.config; + +import de.symeda.sormas.api.Disease; +import java.time.LocalDate; + +public class CaseGenerationConfig extends BaseGenerationConfig{ + + public CaseGenerationConfig() { + loadDefaultConfig(); + } + + public void loadDefaultConfig() { + entityCount = "10"; + startDate = LocalDate.now().minusDays(90); + endDate = LocalDate.now(); + disease = null; + region = null; + district = null; + } + + public void loadPerformanceTestConfig() { + entityCount = "50"; + startDate = LocalDate.now().minusDays(90); + endDate = LocalDate.now(); + disease = Disease.CORONAVIRUS; + region = null; + district = null; + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/ContactGenerationConfig.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/ContactGenerationConfig.java new file mode 100644 index 00000000000..0ed16b8e7af --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/ContactGenerationConfig.java @@ -0,0 +1,64 @@ +package de.symeda.sormas.ui.configuration.generate.config; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.ui.configuration.generate.config.BaseGenerationConfig; +import java.time.LocalDate; + +public class ContactGenerationConfig extends BaseGenerationConfig { + + private boolean createWithoutSourceCases; + private boolean createMultipleContactsPerPerson; + private boolean createWithVisits; + + public ContactGenerationConfig() { + loadDefaultConfig(); + } + + public void loadDefaultConfig() { + entityCount = "10"; + startDate = LocalDate.now().minusDays(90); + endDate = LocalDate.now(); + disease = null; + region = null; + district = null; + createWithoutSourceCases = false; + createMultipleContactsPerPerson = false; + createWithVisits = false; + } + + public void loadPerformanceTestConfig() { + entityCount = "50"; + startDate = LocalDate.now().minusDays(90); + endDate = LocalDate.now(); + disease = Disease.CORONAVIRUS; + region = null; + district = null; + createWithoutSourceCases = false; + createMultipleContactsPerPerson = false; + createWithVisits = false; + } + + public boolean isCreateWithoutSourceCases() { + return createWithoutSourceCases; + } + + public void setCreateWithoutSourceCases(boolean createWithoutSourceCases) { + this.createWithoutSourceCases = createWithoutSourceCases; + } + + public boolean isCreateMultipleContactsPerPerson() { + return createMultipleContactsPerPerson; + } + + public void setCreateMultipleContactsPerPerson(boolean createMultipleContactsPerPerson) { + this.createMultipleContactsPerPerson = createMultipleContactsPerPerson; + } + + public boolean isCreateWithVisits() { + return createWithVisits; + } + + public void setCreateWithVisits(boolean createWithVisits) { + this.createWithVisits = createWithVisits; + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/EventGenerationConfig.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/EventGenerationConfig.java new file mode 100644 index 00000000000..dd01e1ab927 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/EventGenerationConfig.java @@ -0,0 +1,86 @@ +package de.symeda.sormas.ui.configuration.generate.config; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.ui.configuration.generate.config.BaseGenerationConfig; +import java.time.LocalDate; + +public class EventGenerationConfig extends BaseGenerationConfig { + + private String minParticipantsPerEvent; + private String maxParticipantsPerEvent; + private String minContactsPerParticipant; + private String maxContactsPerParticipant; + private String percentageOfCases; + + public EventGenerationConfig() { + loadDefaultConfig(); + } + + public void loadDefaultConfig() { + entityCount = "10"; + startDate = LocalDate.now().minusDays(90); + endDate = LocalDate.now(); + disease = null; + region = null; + district = null; + minParticipantsPerEvent = "3"; + maxParticipantsPerEvent = "10"; + minContactsPerParticipant = "0"; + maxContactsPerParticipant = "3"; + percentageOfCases = "20"; + } + + public void loadPerformanceTestConfig() { + entityCount = "30"; + startDate = LocalDate.now().minusDays(90); + endDate = LocalDate.now(); + disease = Disease.CORONAVIRUS; + // region? + // district? + minParticipantsPerEvent = "3"; + maxParticipantsPerEvent = "8"; + minContactsPerParticipant = "0"; + maxContactsPerParticipant = "2"; + percentageOfCases = "15"; + } + + public String getMinParticipantsPerEvent() { + return minParticipantsPerEvent; + } + + public void setMinParticipantsPerEvent(String minParticipantsPerEvent) { + this.minParticipantsPerEvent = minParticipantsPerEvent; + } + + public String getMaxParticipantsPerEvent() { + return maxParticipantsPerEvent; + } + + public void setMaxParticipantsPerEvent(String maxParticipantsPerEvent) { + this.maxParticipantsPerEvent = maxParticipantsPerEvent; + } + + public String getMinContactsPerParticipant() { + return minContactsPerParticipant; + } + + public void setMinContactsPerParticipant(String minContactsPerParticipant) { + this.minContactsPerParticipant = minContactsPerParticipant; + } + + public String getMaxContactsPerParticipant() { + return maxContactsPerParticipant; + } + + public void setMaxContactsPerParticipant(String maxContactsPerParticipant) { + this.maxContactsPerParticipant = maxContactsPerParticipant; + } + + public String getPercentageOfCases() { + return percentageOfCases; + } + + public void setPercentageOfCases(String percentageOfCases) { + this.percentageOfCases = percentageOfCases; + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/SampleGenerationConfig.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/SampleGenerationConfig.java new file mode 100644 index 00000000000..d294ec3ce51 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/generate/config/SampleGenerationConfig.java @@ -0,0 +1,133 @@ +package de.symeda.sormas.ui.configuration.generate.config; + +import de.symeda.sormas.api.Disease; +import de.symeda.sormas.api.FacadeProvider; +import de.symeda.sormas.api.infrastructure.facility.FacilityReferenceDto; +import de.symeda.sormas.api.sample.SampleMaterial; +import de.symeda.sormas.api.sample.SamplePurpose; +import java.time.LocalDate; + +public class SampleGenerationConfig extends BaseGenerationConfig { + private SamplePurpose samplePurpose; + private SampleMaterial sampleMaterial; + private String sampleMaterialText; + private FacilityReferenceDto laboratory; + + private boolean externalLabOrInternalInHouseTesting = false; + private boolean requestPathogenTestsToBePerformed = false; + private boolean requestAdditionalTestsToBePerformed = false; + private boolean sendDispatch = false; + private boolean received = false; + private String comment; + + private SampleGenerationConfig() { + } + + public static SampleGenerationConfig getDefaultConfig() { + SampleGenerationConfig sampleGenerationConfig = new SampleGenerationConfig(); + sampleGenerationConfig.entityCount = "10"; + sampleGenerationConfig.startDate = LocalDate.now().minusDays(90); + sampleGenerationConfig.endDate = LocalDate.now(); + sampleGenerationConfig.disease = null; + sampleGenerationConfig.region = null; + sampleGenerationConfig.district = null; + sampleGenerationConfig.samplePurpose = SamplePurpose.INTERNAL; + sampleGenerationConfig.sampleMaterial = SampleMaterial.BLOOD; + return sampleGenerationConfig; + } + + public static SampleGenerationConfig getPerformanceTestConfig() { + SampleGenerationConfig sampleGenerationConfig = new SampleGenerationConfig(); + sampleGenerationConfig.entityCount = "50"; + sampleGenerationConfig.startDate = LocalDate.now().minusDays(90); + sampleGenerationConfig.endDate = LocalDate.now(); + sampleGenerationConfig.disease = Disease.CORONAVIRUS; + sampleGenerationConfig.region = null; + sampleGenerationConfig.district = null; + sampleGenerationConfig.samplePurpose = SamplePurpose.EXTERNAL; + sampleGenerationConfig.sampleMaterial = SampleMaterial.BLOOD; + sampleGenerationConfig.laboratory = FacadeProvider.getFacilityFacade().getAllActiveLaboratories(false).get(0); + return sampleGenerationConfig; + } + + + public SamplePurpose getSamplePurpose() { + return samplePurpose; + } + + public void setSamplePurpose(SamplePurpose samplePurpose) { + this.samplePurpose = samplePurpose; + } + + public SampleMaterial getSampleMaterial() { + return sampleMaterial; + } + + public void setSampleMaterial(SampleMaterial sampleMaterial) { + this.sampleMaterial = sampleMaterial; + } + + public String getSampleMaterialText() { + return sampleMaterialText; + } + + public void setSampleMaterialText(String sampleMaterialText) { + this.sampleMaterialText = sampleMaterialText; + } + + public FacilityReferenceDto getLaboratory() { + return laboratory; + } + + public void setLaboratory(FacilityReferenceDto laboratory) { + this.laboratory = laboratory; + } + + public boolean isExternalLabOrInternalInHouseTesting() { + return externalLabOrInternalInHouseTesting; + } + + public void setExternalLabOrInternalInHouseTesting(boolean externalLabOrInternalInHouseTesting) { + this.externalLabOrInternalInHouseTesting = externalLabOrInternalInHouseTesting; + } + + public boolean isRequestPathogenTestsToBePerformed() { + return requestPathogenTestsToBePerformed; + } + + public void setRequestPathogenTestsToBePerformed(boolean requestPathogenTestsToBePerformed) { + this.requestPathogenTestsToBePerformed = requestPathogenTestsToBePerformed; + } + + public boolean isRequestAdditionalTestsToBePerformed() { + return requestAdditionalTestsToBePerformed; + } + + public void setRequestAdditionalTestsToBePerformed(boolean requestAdditionalTestsToBePerformed) { + this.requestAdditionalTestsToBePerformed = requestAdditionalTestsToBePerformed; + } + + public boolean isSendDispatch() { + return sendDispatch; + } + + public void setSendDispatch(boolean sendDispatch) { + this.sendDispatch = sendDispatch; + } + + public boolean isReceived() { + return received; + } + + public void setReceived(boolean received) { + this.received = received; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } +} diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/validator/StringToNumberValidator.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/validator/StringToNumberValidator.java new file mode 100644 index 00000000000..b60cd8d8783 --- /dev/null +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/configuration/validator/StringToNumberValidator.java @@ -0,0 +1,82 @@ +package de.symeda.sormas.ui.configuration.validator; + +import org.apache.commons.lang3.StringUtils; + +import com.vaadin.data.ValidationResult; +import com.vaadin.data.Validator; +import com.vaadin.data.ValueContext; + +public class StringToNumberValidator implements Validator { + + private final String errorMessage; + private boolean decimalAllowed; + private boolean positive; + + public StringToNumberValidator() { + this("Invalid value"); + } + + public StringToNumberValidator(String errorMessage) { + this(errorMessage, true); + } + + public StringToNumberValidator(String errorMessage, boolean positive) { + this(errorMessage, true, positive); + } + + public StringToNumberValidator(String errorMessage, boolean decimalAllowed, boolean positive) { + this.errorMessage = errorMessage; + this.decimalAllowed = decimalAllowed; + this.positive = positive; + } + + @Override + public ValidationResult apply(String value, ValueContext context) { + if (isValidValue(value)) { + return ValidationResult.ok(); + } else { + return ValidationResult.error(errorMessage); + } + } + + private boolean isValidValue(String number) { + if (StringUtils.isBlank(number)) { + return true; + } + + Number parsedNumber; + try { + parsedNumber = Integer.valueOf(number); + if (positive && parsedNumber.intValue() < 0) { + return false; + } + } catch (NumberFormatException ie) { + try { + parsedNumber = Long.valueOf(number); + if (positive && parsedNumber.longValue() < 0) { + return false; + } + } catch (NumberFormatException le) { + if (!decimalAllowed) { + return false; + } + try { + parsedNumber = Float.valueOf(number); + if (positive && parsedNumber.floatValue() < 0) { + return false; + } + } catch (NumberFormatException fe) { + try { + parsedNumber = Double.valueOf(number); + if (positive && parsedNumber.doubleValue() < 0) { + return false; + } + } catch (NumberFormatException de) { + return false; + } + } + } + } + return true; + } +} From 62028734e949f4d313c8565418fe90e6f00cfc9e Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Wed, 21 Dec 2022 09:42:06 +0100 Subject: [PATCH 140/147] fix --- .../steps/web/application/cases/CreateNewCaseSteps.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java index e59fbb23fff..b2b4f68d410 100644 --- a/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java +++ b/sormas-e2e-tests/src/test/java/org/sormas/e2etests/steps/web/application/cases/CreateNewCaseSteps.java @@ -736,7 +736,7 @@ public CreateNewCaseSteps( "^I click on Save button in Case form$", () -> { webDriverHelpers.clickOnWebElementBySelector(SAVE_BUTTON); - if (webDriverHelpers.isElementVisibleWithTimeout(PICK_OR_CREATE_PERSON_POPUP_HEADER, 1)) { + if (webDriverHelpers.isElementVisibleWithTimeout(PICK_OR_CREATE_PERSON_POPUP_HEADER, 3)) { webDriverHelpers.clickOnWebElementBySelector(CREATE_NEW_PERSON_CHECKBOX); webDriverHelpers.clickOnWebElementBySelector(SAVE_POPUP_CONTENT); } From c7375e1a707ec93e9e214fd75460e5640569e8e0 Mon Sep 17 00:00:00 2001 From: Adrian Dinu Date: Wed, 21 Dec 2022 11:21:16 +0200 Subject: [PATCH 141/147] #8628 fix text allignment (#11025) --- .../src/main/java/de/symeda/sormas/ui/events/EventsView.java | 4 ++-- .../de/symeda/sormas/ui/travelentry/TravelEntriesView.java | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java index e0421c14a5c..cf8a2a7034f 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventsView.java @@ -506,9 +506,9 @@ public HorizontalLayout createStatusFilterBar() { + String.format(I18nProperties.getString(Strings.infoArchivedEvents), daysAfterEventGetsArchived), ContentMode.HTML); relevanceStatusInfoLabel.setVisible(false); - relevanceStatusInfoLabel.addStyleName(CssStyles.LABEL_VERTICAL_ALIGN_SUPER); + relevanceStatusInfoLabel.addStyleName(CssStyles.LABEL_VERTICAL_ALIGN_TOP); actionButtonsLayout.addComponent(relevanceStatusInfoLabel); - actionButtonsLayout.setComponentAlignment(relevanceStatusInfoLabel, Alignment.MIDDLE_RIGHT); + actionButtonsLayout.setComponentAlignment(relevanceStatusInfoLabel, new Alignment(38)); } } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntriesView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntriesView.java index e3c89801194..403ed4ed202 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntriesView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/travelentry/TravelEntriesView.java @@ -222,7 +222,6 @@ public HorizontalLayout createStatusFilterBar() { relevanceStatusFilter .setItemCaption(EntityRelevanceStatus.ARCHIVED, I18nProperties.getCaption(Captions.travelEntryArchivedTravelEntries)); relevanceStatusFilter.setItemCaption(EntityRelevanceStatus.ALL, I18nProperties.getCaption(Captions.travelEntryAllTravelEntries)); - relevanceStatusFilter.setCaption(""); relevanceStatusFilter.addValueChangeListener(e -> { if (relevanceStatusInfoLabel != null) { relevanceStatusInfoLabel.setVisible(EntityRelevanceStatus.ARCHIVED.equals(e.getProperty().getValue())); From b6c5149739165531a080e6459aaba7a064e859d7 Mon Sep 17 00:00:00 2001 From: Pawel Kujawa Date: Wed, 21 Dec 2022 10:30:14 +0100 Subject: [PATCH 142/147] fix --- .../src/test/resources/features/sanity/web/Keycloak.feature | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sormas-e2e-tests/src/test/resources/features/sanity/web/Keycloak.feature b/sormas-e2e-tests/src/test/resources/features/sanity/web/Keycloak.feature index e3f430a5777..67b41d7b653 100644 --- a/sormas-e2e-tests/src/test/resources/features/sanity/web/Keycloak.feature +++ b/sormas-e2e-tests/src/test/resources/features/sanity/web/Keycloak.feature @@ -1,7 +1,7 @@ @UI @Sanity @Keycloak Feature: Keycloak tests - @tmsLink=SORQA-458 @env_keycloak @precon + @tmsLink=SORQA-458 @env_keycloak Scenario:SORMAS - Keycloak Synchronisation (manual sync) Given I log in as a Admin User Then I click on the Users from navbar @@ -16,7 +16,7 @@ Feature: Keycloak tests Then I count the number of users displayed in Users tab in Keycloak Administrator Console And I check that number of users from SORMAS is equal to number of users in Keycloak Administrator Console - @tmsLink=SORQA-459 @env_keycloak @precon + @tmsLink=SORQA-459 @env_keycloak Scenario:SORMAS - Keycloak Synchronisation (automatic sync) Given I log in as a Admin User Then I click on the Users from navbar From bc0a7242684005cd95117a040c15102c8f1b8687 Mon Sep 17 00:00:00 2001 From: Frank Hautpmann Date: Wed, 21 Dec 2022 10:59:55 +0100 Subject: [PATCH 143/147] New Crowdin updates (#11224) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * New translations captions.properties (Dari) * New translations captions.properties (Pashto) * New translations captions.properties (Spanish, Cuba) * New translations captions.properties (English, Afghanistan) * New translations captions.properties (English, Nigeria) * New translations captions.properties (English, Ghana) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Spanish, Ecuador) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations enum.properties (German, Switzerland) * New translations descriptions.properties (German, Switzerland) * New translations validations.properties (German, Switzerland) * New translations captions.properties (German) * New translations captions.properties (Spanish, Cuba) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (German, Switzerland) * New translations captions.properties (German, Switzerland) * New translations strings.properties (German, Switzerland) * New translations enum.properties (French) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Spanish, Ecuador) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations enum.properties (Romanian) * New translations enum.properties (Spanish) * New translations enum.properties (Arabic) * New translations enum.properties (Czech) * New translations enum.properties (German) * New translations enum.properties (Finnish) * New translations enum.properties (Italian) * New translations enum.properties (Japanese) * New translations enum.properties (Dutch) * New translations enum.properties (Norwegian) * New translations enum.properties (Polish) * New translations enum.properties (Portuguese) * New translations enum.properties (Russian) * New translations enum.properties (Swedish) * New translations enum.properties (Turkish) * New translations enum.properties (Ukrainian) * New translations enum.properties (Chinese Simplified) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Spanish, Ecuador) * New translations enum.properties (Croatian) * New translations enum.properties (Hindi) * New translations enum.properties (Filipino) * New translations enum.properties (Fijian) * New translations enum.properties (Swahili) * New translations enum.properties (German, Switzerland) * New translations enum.properties (Nepali) * New translations enum.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations enum.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations enum.properties (English, Ghana) * New translations enum.properties (French) * New translations captions.properties (French) * New translations strings.properties (Spanish, Cuba) * New translations enum.properties (Spanish, Cuba) * New translations captions.properties (Urdu (Pakistan)) * New translations strings.properties (Czech) * New translations strings.properties (Urdu (Pakistan)) * New translations enum.properties (Czech) * New translations enum.properties (Urdu (Pakistan)) * New translations descriptions.properties (Urdu (Pakistan)) * New translations validations.properties (Urdu (Pakistan)) * New translations enum.properties (French) * New translations enum.properties (Romanian) * New translations enum.properties (Spanish) * New translations enum.properties (Arabic) * New translations enum.properties (Czech) * New translations enum.properties (German) * New translations enum.properties (Finnish) * New translations enum.properties (Italian) * New translations enum.properties (Japanese) * New translations enum.properties (Dutch) * New translations enum.properties (Norwegian) * New translations enum.properties (Polish) * New translations enum.properties (Portuguese) * New translations enum.properties (Russian) * New translations enum.properties (Swedish) * New translations enum.properties (Turkish) * New translations enum.properties (Ukrainian) * New translations enum.properties (Chinese Simplified) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (Spanish, Ecuador) * New translations enum.properties (Croatian) * New translations enum.properties (Hindi) * New translations enum.properties (Filipino) * New translations enum.properties (Fijian) * New translations enum.properties (Swahili) * New translations enum.properties (German, Switzerland) * New translations enum.properties (Nepali) * New translations enum.properties (French, Switzerland) * New translations enum.properties (Italian, Switzerland) * New translations enum.properties (Dari) * New translations enum.properties (Pashto) * New translations enum.properties (Spanish, Cuba) * New translations enum.properties (English, Afghanistan) * New translations enum.properties (English, Nigeria) * New translations enum.properties (English, Ghana) * New translations enum.properties (Spanish, Cuba) * New translations strings.properties (German, Switzerland) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Spanish, Ecuador) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations strings.properties (German, Switzerland) * New translations strings.properties (Romanian) * New translations strings.properties (French) * New translations strings.properties (Spanish) * New translations strings.properties (Arabic) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Finnish) * New translations strings.properties (Italian) * New translations strings.properties (Japanese) * New translations strings.properties (Dutch) * New translations strings.properties (Norwegian) * New translations strings.properties (Polish) * New translations strings.properties (Portuguese) * New translations strings.properties (Russian) * New translations strings.properties (Swedish) * New translations strings.properties (Turkish) * New translations strings.properties (Ukrainian) * New translations strings.properties (Chinese Simplified) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Spanish, Ecuador) * New translations strings.properties (Croatian) * New translations strings.properties (Hindi) * New translations strings.properties (Filipino) * New translations strings.properties (Fijian) * New translations strings.properties (Swahili) * New translations strings.properties (Nepali) * New translations strings.properties (French, Switzerland) * New translations strings.properties (Italian, Switzerland) * New translations strings.properties (Dari) * New translations strings.properties (Pashto) * New translations strings.properties (Spanish, Cuba) * New translations strings.properties (English, Afghanistan) * New translations strings.properties (English, Nigeria) * New translations strings.properties (English, Ghana) * New translations strings.properties (German, Switzerland) * New translations enum.properties (French) * New translations strings.properties (Czech) * New translations strings.properties (German) * New translations strings.properties (Urdu (Pakistan)) * New translations strings.properties (Spanish, Cuba) * New translations enum.properties (German) * New translations enum.properties (Urdu (Pakistan)) * New translations enum.properties (German, Switzerland) * New translations enum.properties (French) * New translations strings.properties (French) Co-authored-by: Maté Strysewske Co-authored-by: StefanKock --- .../src/main/resources/enum_de-CH.properties | 16 +- .../src/main/resources/enum_de-DE.properties | 16 +- .../src/main/resources/enum_fr-FR.properties | 604 +++++++++--------- .../src/main/resources/enum_ur-PK.properties | 12 +- .../main/resources/strings_cs-CZ.properties | 2 +- .../main/resources/strings_de-CH.properties | 12 +- .../main/resources/strings_de-DE.properties | 12 +- .../main/resources/strings_es-CU.properties | 2 +- .../main/resources/strings_fr-FR.properties | 2 +- .../main/resources/strings_ur-PK.properties | 4 +- 10 files changed, 341 insertions(+), 341 deletions(-) diff --git a/sormas-api/src/main/resources/enum_de-CH.properties b/sormas-api/src/main/resources/enum_de-CH.properties index a872464935e..6cc637c1666 100644 --- a/sormas-api/src/main/resources/enum_de-CH.properties +++ b/sormas-api/src/main/resources/enum_de-CH.properties @@ -295,7 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Klinische Verläufe DatabaseTable.CLINICAL_VISITS = Klinische Besuche DatabaseTable.COMMUNITIES = Gemeinden DatabaseTable.CONTACTS = Kontakte -DatabaseTable.CONTACTS_VISITS = Contacts → Visits +DatabaseTable.CONTACTS_VISITS = Kontakte → Anrufe DatabaseTable.CONTINENTS = Kontinente DatabaseTable.SUBCONTINENTS = Subkontinente DatabaseTable.AREAS = Gebiete @@ -304,7 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Benutzerdefinierbare Enumwerte DatabaseTable.DISTRICTS = Bezirke DatabaseTable.EPIDATA = Epidemiologische Daten DatabaseTable.EVENTS = Ereignisse -DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups +DatabaseTable.EVENTS_EVENTGROUPS = Ereignisse → Ereignisgruppen DatabaseTable.EVENTGROUPS = Ereignisgruppen DatabaseTable.EVENTPARTICIPANTS = Beteiligte Personen DatabaseTable.EXPOSURES = Expositionen @@ -318,7 +318,7 @@ DatabaseTable.LOCATIONS = Orte DatabaseTable.OUTBREAKS = Ausbrüche DatabaseTable.PERSONS = Personen DatabaseTable.PERSON_CONTACT_DETAILS = Personen-Kontaktdetails -DatabaseTable.PERSON_LOCATIONS = Person locations +DatabaseTable.PERSON_LOCATIONS = Person Standorte DatabaseTable.PRESCRIPTIONS = Rezepte DatabaseTable.PREVIOUSHOSPITALIZATIONS = Vorherige Krankenhausaufenthalte DatabaseTable.REGIONS = Kantone @@ -326,7 +326,7 @@ DatabaseTable.SAMPLES = Proben DatabaseTable.PATHOGEN_TESTS = Erregertests DatabaseTable.ADDITIONAL_TESTS = Zusätzliche Tests DatabaseTable.TASKS = Aufgaben -DatabaseTable.TASK_OBSERVER = Task observer +DatabaseTable.TASK_OBSERVER = Aufgabenbeobachter DatabaseTable.THERAPIES = Therapien DatabaseTable.TRAVEL_ENTRIES = Einreisen DatabaseTable.TREATMENTS = Behandlungen @@ -349,10 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS Ursprungs-Informati DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS Übergabe-Informationen DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS Anfragen zur Übergabe DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS Anfrage zur Übergabe Informationen -DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS Anfragen zur Übergabe Informationen → Übergabe Informationen DatabaseTable.EXTERNAL_SHARE_INFO = Externe Teilungs-Information DatabaseTable.CAMPAIGNS = Kampagnen -DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Kampagnen → Kampagnen-Formular Meta DatabaseTable.CAMPAIGN_FORM_META = Kampagnen-Formular Meta DatabaseTable.CAMPAIGN_FORM_DATA = Kampagnen-Formular Daten DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Kampagnendiagramm-Definitionen @@ -1439,7 +1439,7 @@ UserRight.VISIT_DELETE = Anrufe aus dem System löschen UserRight.VISIT_EXPORT = Anrufe von SORMAS exportieren UserRight.TASK_DELETE = Aufgaben aus dem System löschen UserRight.TASK_EXPORT = Aufgaben von SORMAS exportieren -UserRight.TASK_ARCHIVE = Archive tasks +UserRight.TASK_ARCHIVE = Aufgaben archivieren UserRight.ACTION_CREATE = Neue Aktionen erstellen UserRight.ACTION_DELETE = Aktionen aus dem System löschen UserRight.ACTION_EDIT = Vorhandene Aktionen bearbeiten @@ -1589,7 +1589,7 @@ UserRight.Desc.TASK_ASSIGN = Kann Benutzern Aufgaben zuweisen UserRight.Desc.TASK_CREATE = Kann neue Aufgaben erstellen UserRight.Desc.TASK_EDIT = Kann bestehende Aufgaben bearbeiten UserRight.Desc.TASK_VIEW = Kann bestehende Aufgaben einsehen -UserRight.Desc.TASK_ARCHIVE = Able to archive tasks +UserRight.Desc.TASK_ARCHIVE = Kann Aufgaben archivieren UserRight.Desc.USER_CREATE = Kann neue Benutzer erstellen UserRight.Desc.USER_EDIT = Kann bestehende Benutzer bearbeiten UserRight.Desc.USER_VIEW = Kann bestehende Benutzer einsehen diff --git a/sormas-api/src/main/resources/enum_de-DE.properties b/sormas-api/src/main/resources/enum_de-DE.properties index 4fee6db37c7..992b1198ea5 100644 --- a/sormas-api/src/main/resources/enum_de-DE.properties +++ b/sormas-api/src/main/resources/enum_de-DE.properties @@ -295,7 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Klinische Verläufe DatabaseTable.CLINICAL_VISITS = Klinische Besuche DatabaseTable.COMMUNITIES = Gemeinden DatabaseTable.CONTACTS = Kontakte -DatabaseTable.CONTACTS_VISITS = Contacts → Visits +DatabaseTable.CONTACTS_VISITS = Kontakte → Anrufe DatabaseTable.CONTINENTS = Kontinente DatabaseTable.SUBCONTINENTS = Subkontinente DatabaseTable.AREAS = Gebiete @@ -304,7 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Benutzerdefinierbare Enumwerte DatabaseTable.DISTRICTS = Landkreise / Kreisfreie Städte DatabaseTable.EPIDATA = Epidemiologische Daten DatabaseTable.EVENTS = Ereignisse -DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups +DatabaseTable.EVENTS_EVENTGROUPS = Ereignisse → Ereignisgruppen DatabaseTable.EVENTGROUPS = Ereignisgruppen DatabaseTable.EVENTPARTICIPANTS = Beteiligte Personen DatabaseTable.EXPOSURES = Expositionen @@ -318,7 +318,7 @@ DatabaseTable.LOCATIONS = Orte DatabaseTable.OUTBREAKS = Ausbrüche DatabaseTable.PERSONS = Personen DatabaseTable.PERSON_CONTACT_DETAILS = Personen-Kontaktdetails -DatabaseTable.PERSON_LOCATIONS = Person locations +DatabaseTable.PERSON_LOCATIONS = Person Standorte DatabaseTable.PRESCRIPTIONS = Verschreibungen DatabaseTable.PREVIOUSHOSPITALIZATIONS = Vorherige Krankenhausaufenthalte DatabaseTable.REGIONS = Bundesländer @@ -326,7 +326,7 @@ DatabaseTable.SAMPLES = Proben DatabaseTable.PATHOGEN_TESTS = Erregertests DatabaseTable.ADDITIONAL_TESTS = Zusätzliche Tests DatabaseTable.TASKS = Aufgaben -DatabaseTable.TASK_OBSERVER = Task observer +DatabaseTable.TASK_OBSERVER = Aufgabenbeobachter DatabaseTable.THERAPIES = Therapien DatabaseTable.TRAVEL_ENTRIES = Einreisen DatabaseTable.TREATMENTS = Behandlungen @@ -349,10 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS Ursprungs-Informati DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS Übergabe-Informationen DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS Anfragen zur Übergabe DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS Anfrage zur Übergabe Informationen -DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS Anfragen zur Übergabe Informationen → Übergabe Informationen DatabaseTable.EXTERNAL_SHARE_INFO = Externe Teilungs-Information DatabaseTable.CAMPAIGNS = Kampagnen -DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Kampagnen → Kampagnen-Formular Meta DatabaseTable.CAMPAIGN_FORM_META = Kampagnen-Formular Meta DatabaseTable.CAMPAIGN_FORM_DATA = Kampagnen-Formular Daten DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Kampagnendiagramm-Definitionen @@ -1439,7 +1439,7 @@ UserRight.VISIT_DELETE = Anrufe aus dem System löschen UserRight.VISIT_EXPORT = Anrufe von SORMAS exportieren UserRight.TASK_DELETE = Aufgaben aus dem System löschen UserRight.TASK_EXPORT = Aufgaben von SORMAS exportieren -UserRight.TASK_ARCHIVE = Archive tasks +UserRight.TASK_ARCHIVE = Aufgaben archivieren UserRight.ACTION_CREATE = Neue Aktionen erstellen UserRight.ACTION_DELETE = Aktionen aus dem System löschen UserRight.ACTION_EDIT = Vorhandene Aktionen bearbeiten @@ -1589,7 +1589,7 @@ UserRight.Desc.TASK_ASSIGN = Kann Benutzern Aufgaben zuweisen UserRight.Desc.TASK_CREATE = Kann neue Aufgaben erstellen UserRight.Desc.TASK_EDIT = Kann bestehende Aufgaben bearbeiten UserRight.Desc.TASK_VIEW = Kann bestehende Aufgaben einsehen -UserRight.Desc.TASK_ARCHIVE = Able to archive tasks +UserRight.Desc.TASK_ARCHIVE = Kann Aufgaben archivieren UserRight.Desc.USER_CREATE = Kann neue Benutzer erstellen UserRight.Desc.USER_EDIT = Kann bestehende Benutzer bearbeiten UserRight.Desc.USER_VIEW = Kann bestehende Benutzer einsehen diff --git a/sormas-api/src/main/resources/enum_fr-FR.properties b/sormas-api/src/main/resources/enum_fr-FR.properties index 322f28bf157..563c20f3e06 100644 --- a/sormas-api/src/main/resources/enum_fr-FR.properties +++ b/sormas-api/src/main/resources/enum_fr-FR.properties @@ -71,7 +71,7 @@ AdditionalTestType.POTASSIUM = Potassium AdditionalTestType.UREA = Urée AdditionalTestType.HAEMOGLOBIN = Hémoglobine AdditionalTestType.TOTAL_BILIRUBIN = Bilirubine totale -AdditionalTestType.CONJ_BILIRUBIN = Conj. bilirubine +AdditionalTestType.CONJ_BILIRUBIN = Conj.bilirubine AdditionalTestType.WBC_COUNT = Nombre WBC AdditionalTestType.PLATELETS = Plaquettes AdditionalTestType.PROTHROMBIN_TIME = Heure Prothrombine @@ -202,8 +202,8 @@ CaseOutcome.RECOVERED = Guéri CaseOutcome.UNKNOWN = Inconnu # CaseReferenceDefinition -CaseReferenceDefinition.FULFILLED = Rempli -CaseReferenceDefinition.NOT_FULFILLED = Non rempli +CaseReferenceDefinition.FULFILLED = Réalisées +CaseReferenceDefinition.NOT_FULFILLED = Non réalisé # CauseOfDeath CauseOfDeath.EPIDEMIC_DISEASE = Maladie épidémique @@ -295,7 +295,7 @@ DatabaseTable.CLINICAL_COURSES = Suivi médical DatabaseTable.CLINICAL_VISITS = Visites médicales DatabaseTable.COMMUNITIES = Communautés DatabaseTable.CONTACTS = Contacts -DatabaseTable.CONTACTS_VISITS = Contacts → Visits +DatabaseTable.CONTACTS_VISITS = Contacts → Visites DatabaseTable.CONTINENTS = Continents DatabaseTable.SUBCONTINENTS = Sous-continents DatabaseTable.AREAS = Zones @@ -304,7 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = Valeurs de l'énumération personnalisa DatabaseTable.DISTRICTS = Départements DatabaseTable.EPIDATA = Données épidémiologiques DatabaseTable.EVENTS = Événements -DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups +DatabaseTable.EVENTS_EVENTGROUPS = Événements → Groupes d'événements DatabaseTable.EVENTGROUPS = Groupes d'événements DatabaseTable.EVENTPARTICIPANTS = Participants DatabaseTable.EXPOSURES = Expositions @@ -318,7 +318,7 @@ DatabaseTable.LOCATIONS = Lieux DatabaseTable.OUTBREAKS = Epidémies DatabaseTable.PERSONS = Personnes DatabaseTable.PERSON_CONTACT_DETAILS = Coordonnées de la personne -DatabaseTable.PERSON_LOCATIONS = Person locations +DatabaseTable.PERSON_LOCATIONS = Emplacements des personnes DatabaseTable.PRESCRIPTIONS = Ordonnances DatabaseTable.PREVIOUSHOSPITALIZATIONS = Hospitalisations précédentes DatabaseTable.REGIONS = Régions @@ -326,7 +326,7 @@ DatabaseTable.SAMPLES = Échantillons DatabaseTable.PATHOGEN_TESTS = Tests pathogènes DatabaseTable.ADDITIONAL_TESTS = Tests supplémentaires DatabaseTable.TASKS = Tâches -DatabaseTable.TASK_OBSERVER = Task observer +DatabaseTable.TASK_OBSERVER = Observateur de tâche DatabaseTable.THERAPIES = Thérapies DatabaseTable.TRAVEL_ENTRIES = Entrées de voyage DatabaseTable.TREATMENTS = Traitements @@ -348,24 +348,24 @@ DatabaseTable.TEST_REPORTS = Rapports d'essai DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = Informations sur l'origine SORMAS 2 SORMAS DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS partager des informations DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = Demandes de partage SORMAS 2 SORMAS -DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS share request information -DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info -DatabaseTable.EXTERNAL_SHARE_INFO = External share information -DatabaseTable.CAMPAIGNS = Campaigns -DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta -DatabaseTable.CAMPAIGN_FORM_META = Campaign form meta -DatabaseTable.CAMPAIGN_FORM_DATA = Campaign form data -DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Campaign diagram definitions -DatabaseTable.POPULATION_DATA = Population data -DatabaseTable.SURVEILLANCE_REPORTS = Surveillance reports -DatabaseTable.AGGREGATE_REPORTS = Aggregate reports -DatabaseTable.WEEKLY_REPORTS = Weekly reports -DatabaseTable.WEEKLY_REPORT_ENTRIES = Weekly report entries +DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS partager les informations de la demande +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS partager les informations de demande → Partager les informations +DatabaseTable.EXTERNAL_SHARE_INFO = Informations sur le partage externe +DatabaseTable.CAMPAIGNS = Campagnes +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campagnes → Méta formulaire de campagne +DatabaseTable.CAMPAIGN_FORM_META = Méta formulaire de campagne +DatabaseTable.CAMPAIGN_FORM_DATA = Données du formulaire de campagne +DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = Définitions des diagrammes de campagne +DatabaseTable.POPULATION_DATA = Données de la population +DatabaseTable.SURVEILLANCE_REPORTS = Rapports de surveillance +DatabaseTable.AGGREGATE_REPORTS = Rapports agrégés +DatabaseTable.WEEKLY_REPORTS = Rapports hebdomadaires +DatabaseTable.WEEKLY_REPORT_ENTRIES = Entrées du rapport hebdomadaire DatabaseTable.DOCUMENTS = Documents -DatabaseTable.EXPORT_CONFIGURATIONS = Export configurations -DatabaseTable.FEATURE_CONFIGURATIONS = Feature configurations -DatabaseTable.DISEASE_CONFIGURATIONS = Disease configurations -DatabaseTable.DELETION_CONFIGURATIONS = Deletion configurations +DatabaseTable.EXPORT_CONFIGURATIONS = Configurations d'exportation +DatabaseTable.FEATURE_CONFIGURATIONS = Configurations de fonctionnalité +DatabaseTable.DISEASE_CONFIGURATIONS = Configurations de la maladie +DatabaseTable.DELETION_CONFIGURATIONS = Configurations de suppression # DateFilterOption DateFilterOption.DATE = Par date @@ -378,42 +378,42 @@ DeathPlaceType.OTHER = Autres # DefaultUserRole DefaultUserRole.ADMIN = Admin -DefaultUserRole.CASE_OFFICER = Case Officer -DefaultUserRole.CASE_SUPERVISOR = Clinician -DefaultUserRole.COMMUNITY_INFORMANT = Community Informant -DefaultUserRole.COMMUNITY_OFFICER = Community Officer -DefaultUserRole.CONTACT_OFFICER = Contact Officer -DefaultUserRole.CONTACT_SUPERVISOR = Contact Supervisor -DefaultUserRole.DISTRICT_OBSERVER = District Observer -DefaultUserRole.EVENT_OFFICER = Event Officer -DefaultUserRole.EXTERNAL_LAB_USER = External Lab Officer -DefaultUserRole.HOSPITAL_INFORMANT = Hospital Informant -DefaultUserRole.IMPORT_USER = Import User -DefaultUserRole.LAB_USER = Lab Officer -DefaultUserRole.NATIONAL_CLINICIAN = National Clinician -DefaultUserRole.NATIONAL_OBSERVER = National Observer -DefaultUserRole.NATIONAL_USER = National User -DefaultUserRole.POE_INFORMANT = POE Informant -DefaultUserRole.POE_NATIONAL_USER = POE National User -DefaultUserRole.POE_SUPERVISOR = POE Supervisor -DefaultUserRole.STATE_OBSERVER = Region Observer -DefaultUserRole.SURVEILLANCE_OFFICER = Surveillance Officer -DefaultUserRole.SURVEILLANCE_SUPERVISOR = Surveillance Supervisor -DefaultUserRole.REST_EXTERNAL_VISITS_USER = External Visits User -DefaultUserRole.SORMAS_TO_SORMAS_CLIENT = Sormas to Sormas Client -DefaultUserRole.ADMIN_SUPERVISOR = Admin Surveillance Supervisor -DefaultUserRole.BAG_USER = BAG User +DefaultUserRole.CASE_OFFICER = Agent de cas +DefaultUserRole.CASE_SUPERVISOR = Clinicien +DefaultUserRole.COMMUNITY_INFORMANT = Informateur communautaire +DefaultUserRole.COMMUNITY_OFFICER = Officier de la communauté +DefaultUserRole.CONTACT_OFFICER = Agent de contact +DefaultUserRole.CONTACT_SUPERVISOR = Superviseur de contact +DefaultUserRole.DISTRICT_OBSERVER = Observateur départemental +DefaultUserRole.EVENT_OFFICER = Agent d'événement +DefaultUserRole.EXTERNAL_LAB_USER = Agent de laboratoire externe +DefaultUserRole.HOSPITAL_INFORMANT = Informateur hospitalier +DefaultUserRole.IMPORT_USER = Importateur +DefaultUserRole.LAB_USER = Agent de laboratoire +DefaultUserRole.NATIONAL_CLINICIAN = Clinicien National +DefaultUserRole.NATIONAL_OBSERVER = Observateur National +DefaultUserRole.NATIONAL_USER = Utilisateur National +DefaultUserRole.POE_INFORMANT = Informateur PDE +DefaultUserRole.POE_NATIONAL_USER = Utilisateur National PDE +DefaultUserRole.POE_SUPERVISOR = Superviseur PDE +DefaultUserRole.STATE_OBSERVER = Observateur de région +DefaultUserRole.SURVEILLANCE_OFFICER = Agent de surveillance +DefaultUserRole.SURVEILLANCE_SUPERVISOR = Superviseur de surveillance +DefaultUserRole.REST_EXTERNAL_VISITS_USER = Utilisateur de visite externe +DefaultUserRole.SORMAS_TO_SORMAS_CLIENT = Client Sormas à Sormas +DefaultUserRole.ADMIN_SUPERVISOR = Admin superviseur de surveillance +DefaultUserRole.BAG_USER = Utilisateur BAG DefaultUserRole.Short.ADMIN = Admin -DefaultUserRole.Short.CASE_OFFICER = CaseOff -DefaultUserRole.Short.CASE_SUPERVISOR = Clinician +DefaultUserRole.Short.CASE_OFFICER = Caisse désactivée +DefaultUserRole.Short.CASE_SUPERVISOR = Clinicien DefaultUserRole.Short.CONTACT_OFFICER = ContOff DefaultUserRole.Short.CONTACT_SUPERVISOR = ContSup -DefaultUserRole.Short.COMMUNITY_INFORMANT = CommInf -DefaultUserRole.Short.DISTRICT_OBSERVER = DistObs -DefaultUserRole.Short.EVENT_OFFICER = EventOff +DefaultUserRole.Short.COMMUNITY_INFORMANT = Info comm +DefaultUserRole.Short.DISTRICT_OBSERVER = Obs. dept. +DefaultUserRole.Short.EVENT_OFFICER = Événement désactivé DefaultUserRole.Short.EXTERNAL_LAB_USER = ExtLabOff -DefaultUserRole.Short.HOSPITAL_INFORMANT = HospInf -DefaultUserRole.Short.IMPORT_USER = ImpUser +DefaultUserRole.Short.HOSPITAL_INFORMANT = Info. hosp. +DefaultUserRole.Short.IMPORT_USER = UtilisateurImportateur DefaultUserRole.Short.LAB_USER = LabOff DefaultUserRole.Short.NATIONAL_CLINICIAN = NatClin DefaultUserRole.Short.NATIONAL_OBSERVER = NatObs @@ -426,16 +426,16 @@ DefaultUserRole.Short.SURVEILLANCE_SUPERVISOR = SurvSup DefaultUserRole.Short.ADMIN_SUPERVISOR = AdminSup DefaultUserRole.Short.SURVEILLANCE_OFFICER = SurvOff DefaultUserRole.Short.REST_EXTERNAL_VISITS_USER = ExtVis -DefaultUserRole.Short.SORMAS_TO_SORMAS_CLIENT = SormasToSormas -DefaultUserRole.Short.BAG_USER = BAG +DefaultUserRole.Short.SORMAS_TO_SORMAS_CLIENT = Sormas vers Sormas +DefaultUserRole.Short.BAG_USER = PANIER #DeleteReason -DeletionReason.GDPR = Deletion request by affected person according to GDPR -DeletionReason.DELETION_REQUEST = Deletion request by another authority -DeletionReason.CREATED_WITH_NO_LEGAL_REASON = Entity created without legal reason -DeletionReason.TRANSFERRED_RESPONSIBILITY = Responsibility transferred to another authority -DeletionReason.DUPLICATE_ENTRIES = Deletion of duplicate entries -DeletionReason.OTHER_REASON = Other reason +DeletionReason.GDPR = Demande de suppression par la personne concernée conformément au RGPD +DeletionReason.DELETION_REQUEST = Demande de suppression par une autre autorité +DeletionReason.CREATED_WITH_NO_LEGAL_REASON = Entité créée sans motif légal +DeletionReason.TRANSFERRED_RESPONSIBILITY = Responsabilité transférée à une autre autorité +DeletionReason.DUPLICATE_ENTRIES = Suppression des entrées en double +DeletionReason.OTHER_REASON = Autre motif # DengueFeverType DengueFeverType.DENGUE_FEVER = Dengue @@ -503,11 +503,11 @@ Disease.RHINOVIRUS = Rhinovirus Disease.ENTEROVIRUS = Enterovirus Disease.M_PNEUMONIAE = M.pneumoniae Disease.C_PNEUMONIAE = C.pneumoniae -Disease.ARI = ARI (Acute Respiratory Infections) +Disease.ARI = IRA (Infections Respiratoires Aiguës) Disease.CHIKUNGUNYA = Chikungunya -Disease.POST_IMMUNIZATION_ADVERSE_EVENTS_MILD = Post-immunization adverse events mild -Disease.POST_IMMUNIZATION_ADVERSE_EVENTS_SEVERE = Post-immunization adverse events severe -Disease.FHA = FHA (Functional Hypothalamic Amenorrhea) +Disease.POST_IMMUNIZATION_ADVERSE_EVENTS_MILD = Effets indésirables post-immunisation légers +Disease.POST_IMMUNIZATION_ADVERSE_EVENTS_SEVERE = Effets indésirables post-immunisation graves +Disease.FHA = FHA (aménorrhée hypothalamique fonctionnelle) Disease.Short.AFP = PFA Disease.Short.CHOLERA = Choléra Disease.Short.CONGENITAL_RUBELLA = SRC @@ -566,8 +566,8 @@ Disease.Short.M_PNEUMONIAE = M.pneumoniae Disease.Short.C_PNEUMONIAE = C.pneumoniae Disease.Short.ARI = ARI Disease.Short.CHIKUNGUNYA = Chikungunya -Disease.Short.POST_IMMUNIZATION_ADVERSE_EVENTS_MILD = Post-immunization adverse events mild -Disease.Short.POST_IMMUNIZATION_ADVERSE_EVENTS_SEVERE = Post-immunization adverse events severe +Disease.Short.POST_IMMUNIZATION_ADVERSE_EVENTS_MILD = Effets indésirables post-immunisation légers +Disease.Short.POST_IMMUNIZATION_ADVERSE_EVENTS_SEVERE = Effets indésirables post-immunisation graves Disease.Short.FHA = FHA DiseaseTransmissionMode.HUMAN_TO_HUMAN = Principalement de l'homme vers l'homme @@ -582,13 +582,13 @@ DocumentRelatedEntityType.ACTION = Action DocumentRelatedEntityType.CASE = Cas DocumentRelatedEntityType.CONTACT = Contact DocumentRelatedEntityType.EVENT = Évènement -DocumentRelatedEntityType.TRAVEL_ENTRY = Travel Entry +DocumentRelatedEntityType.TRAVEL_ENTRY = Entrées de voyage # DocumentWorkflow DocumentWorkflow.QUARANTINE_ORDER_CASE = Modèles de document - Cas DocumentWorkflow.QUARANTINE_ORDER_CONTACT = Modèles de document pour les contacts -DocumentWorkflow.QUARANTINE_ORDER_EVENT_PARTICIPANT = Document Templates Event Participant -DocumentWorkflow.QUARANTINE_ORDER_TRAVEL_ENTRY = Document Templates Travel Entry +DocumentWorkflow.QUARANTINE_ORDER_EVENT_PARTICIPANT = Modèles de documents Participant à l'événement +DocumentWorkflow.QUARANTINE_ORDER_TRAVEL_ENTRY = Entrée de voyage des modèles de documents DocumentWorkflow.EVENT_HANDOUT = Modèles de Mémo d'événement EducationType.NONE = Pas d'éducation @@ -678,25 +678,25 @@ EventSourceType.NOT_APPLICABLE = Non applicable EventSourceType.MEDIA_NEWS = Médias/Nouvelles EventSourceType.HOTLINE_PERSON = Hotline/Personne EventSourceType.MATHEMATICAL_MODEL = Modèle mathématique -EventSourceType.INSTITUTIONAL_PARTNER = Institutional partner +EventSourceType.INSTITUTIONAL_PARTNER = Partenaire institutionnel -InstitutionalPartnerType.HEALTH_INSURANCE = Health insurance -InstitutionalPartnerType.TERRITORIAL_COMMUNITIES = Territorial communities -InstitutionalPartnerType.NATIONAL_EDUCATION = National education -InstitutionalPartnerType.HEALTH_ESTABLISHMENTS = Health establishments -InstitutionalPartnerType.MEDICO_SOCIAL_ESTABLISHMENTS = Medico-social establishments -InstitutionalPartnerType.OTHER = Other +InstitutionalPartnerType.HEALTH_INSURANCE = Assurance santé +InstitutionalPartnerType.TERRITORIAL_COMMUNITIES = Communautés territoriales +InstitutionalPartnerType.NATIONAL_EDUCATION = Éducation nationale +InstitutionalPartnerType.HEALTH_ESTABLISHMENTS = Établissements de santé +InstitutionalPartnerType.MEDICO_SOCIAL_ESTABLISHMENTS = Etablissements médico-sociaux +InstitutionalPartnerType.OTHER = Autre -ExposureType.WORK=Work -ExposureType.TRAVEL=Travel +ExposureType.WORK=Travail +ExposureType.TRAVEL=Voyage ExposureType.SPORT=Sport -ExposureType.VISIT=Visit -ExposureType.GATHERING=Gathering +ExposureType.VISIT=Visite +ExposureType.GATHERING=Regroupement ExposureType.HABITATION=Habitation -ExposureType.PERSONAL_SERVICES=Personal Services -ExposureType.BURIAL=Burial -ExposureType.ANIMAL_CONTACT=Animal Contact -ExposureType.OTHER=Other +ExposureType.PERSONAL_SERVICES=Services personnels +ExposureType.BURIAL=Enterrement +ExposureType.ANIMAL_CONTACT=Contacts avec les animaux +ExposureType.OTHER=Autre ExposureType.UNKNOWN=Inconnu # FacilityType @@ -795,21 +795,21 @@ FollowUpStatus.Desc.FOLLOW_UP=Le processus de suivi est en cours d'exécution FollowUpStatus.Desc.LOST=Le processus de suivi n'a pas pu être poursuivi car la personne n'était pas disponible FollowUpStatus.Desc.NO_FOLLOW_UP=Aucun suivi de contact n'est en cours -GatheringType.PARTY=Party -GatheringType.RELIGIOUS=Religious Gathering -GatheringType.MUSICAL=Choir/Singing Club/Orchestra +GatheringType.PARTY=Fête +GatheringType.RELIGIOUS=Collecte de Religieux +GatheringType.MUSICAL=Chœur/Club de chant/Orchestre GatheringType.CONCERT=Concert GatheringType.DEMONSTRATION=Manifestation GatheringType.CARNIVAL=Carnaval GatheringType.FAIR=Foire GatheringType.SPORTING_EVENT=Événement sportif -GatheringType.OTHER=Other +GatheringType.OTHER=Autre -HabitationType.MEDICAL=Stay in a Medical Institution -HabitationType.OTHER=Other +HabitationType.MEDICAL=Séjour dans un établissement médical +HabitationType.OTHER=Autre HospitalizationReasonType.REPORTED_DISEASE=Maladie signalée -HospitalizationReasonType.ISOLATION=Isolation +HospitalizationReasonType.ISOLATION=Isolement HospitalizationReasonType.OTHER=Autre motif HospitalizationReasonType.UNKNOWN=Inconnu @@ -824,12 +824,12 @@ HospitalWardType.CARDIOLOGY = Cardiologie HospitalWardType.OTHER = Autres # ImmunizationDateType -ImmunizationDateType.FIRST_VACCINATION_DATE=Date of first vaccination -ImmunizationDateType.IMMUNIZATION_END=End of immunization -ImmunizationDateType.LAST_VACCINATION_DATE=Date of last vaccination -ImmunizationDateType.RECOVERY_DATE=Date of recovery -ImmunizationDateType.REPORT_DATE=Date of report -ImmunizationDateType.VALID_UNTIL=Valid until +ImmunizationDateType.FIRST_VACCINATION_DATE=Date de la première vaccination +ImmunizationDateType.IMMUNIZATION_END=Fin de la vaccination +ImmunizationDateType.LAST_VACCINATION_DATE=Date de la dernière vaccination +ImmunizationDateType.RECOVERY_DATE=Date de récupération +ImmunizationDateType.REPORT_DATE=Date du rapport +ImmunizationDateType.VALID_UNTIL=Valable jusqu’au # InvestigationStatus InvestigationStatus.DISCARDED=Enquête abandonnée @@ -859,13 +859,13 @@ Language.IT_CH = Italiano (Svizzera) Language.FR_CH = Français (Suisse) Language.PS = Pachto Language.FA = Dari -Language.CZ = Čeština -Language.UR_PK = Urdu +Language.CZ = Tchèque +Language.UR_PK = Ourdou # MapCaseDisplayMode MapCaseDisplayMode.CASE_ADDRESS = ... par domicile MapCaseDisplayMode.FACILITY = ... par établissement -MapCaseDisplayMode.FACILITY_OR_CASE_ADDRESS = ... by facility or home address +MapCaseDisplayMode.FACILITY_OR_CASE_ADDRESS = ... par établissement ou par domicile MapCaseClassificationOption.ALL_CASES = Afficher tous les cas MapCaseClassificationOption.CONFIRMED_CASES_ONLY = Afficher uniquement les cas confirmés @@ -878,10 +878,10 @@ MapPeriodType.YEARLY = Annuel MeansOfTransport.LOCAL_PUBLIC_TRANSPORT=Transports en commun MeansOfTransport.BUS=Bus -MeansOfTransport.FERRY=Ship/Ferry -MeansOfTransport.PLANE=Plane +MeansOfTransport.FERRY=Navire/Traversier +MeansOfTransport.PLANE=Avion MeansOfTransport.TRAIN=Train -MeansOfTransport.OTHER=Other +MeansOfTransport.OTHER=Autres # MessageSubject MessageSubject.CASE_CLASSIFICATION_CHANGED = Classification de cas modifiée @@ -936,7 +936,7 @@ OccupationType.TRADITIONAL_SPIRITUAL_HEALER = Guérisseur traditionnel / spiritu OccupationType.TRANSPORTER = Transporteur OccupationType.WORKING_WITH_ANIMALS = Travaille avec des animaux OccupationType.LABORATORY_STAFF = Personnel de laboratoire -OccupationType.UNKNOWN = Unknown +OccupationType.UNKNOWN = Inconnu OccupationType.AGRICULTURE = A. Agriculture & foresterie, pêches OccupationType.MINING = B. Mines & carrières @@ -1000,14 +1000,14 @@ PathogenTestType.SEQUENCING = Séquençage PCRTestSpecification.VARIANT_SPECIFIC = Variante spécifique PCRTestSpecification.N501Y_MUTATION_DETECTION = Détection de mutation N501Y -PersonContactDetailType.PHONE = Phone +PersonContactDetailType.PHONE = Téléphone PersonContactDetailType.EMAIL = Email -PersonContactDetailType.OTHER = Other +PersonContactDetailType.OTHER = Autre -PhoneNumberType.LANDLINE = Landline -PhoneNumberType.MOBILE = Mobile -PhoneNumberType.WORK = Work -PhoneNumberType.OTHER = Other +PhoneNumberType.LANDLINE = Téléphone fixe +PhoneNumberType.MOBILE = Portable +PhoneNumberType.WORK = Travail +PhoneNumberType.OTHER = Autre ExposureRole.PASSENGER = Passager ExposureRole.STAFF = Personnel @@ -1016,7 +1016,7 @@ ExposureRole.MEDICAL_STAFF = Personnel Médical ExposureRole.VISITOR = Visiteur ExposureRole.GUEST = Visiteur ExposureRole.CUSTOMER = Client -ExposureRole.CONSERVATEE = Conservatee +ExposureRole.CONSERVATEE = Conservateur ExposureRole.PATIENT = Patient ExposureRole.EDUCATOR = Éducateur ExposureRole.TRAINEE_TEACHER = Enseignant du stagiaire @@ -1158,7 +1158,7 @@ StatisticsCaseAttribute.CLASSIFICATION = Classification StatisticsCaseAttribute.DISEASE = Maladie StatisticsCaseAttribute.ONSET_TIME = Début StatisticsCaseAttribute.OUTCOME = Issue -StatisticsCaseAttribute.OUTCOME_TIME = Outcome time +StatisticsCaseAttribute.OUTCOME_TIME = Heure du résultat StatisticsCaseAttribute.JURISDICTION = Région / District / Communauté / Établissement de santé StatisticsCaseAttribute.REPORT_TIME = Heure du rapport StatisticsCaseAttribute.REPORTING_USER_ROLE = Rôle du rapporteur @@ -1231,8 +1231,8 @@ TaskContext.GENERAL = Général TaskContext.TRAVEL_ENTRY = Entrée de voyage # TaskDateType -TaskDateType.SUGGESTED_START_DATE = Suggested start date -TaskDateType.DUE_DATE = Due date +TaskDateType.SUGGESTED_START_DATE = Date de début suggérée +TaskDateType.DUE_DATE = Date d’échéance # TaskPriority TaskPriority.HIGH = Élevée @@ -1243,7 +1243,7 @@ TaskPriority.NORMAL = Normale TaskStatus.DONE = terminé TaskStatus.NOT_EXECUTABLE = non exécutable TaskStatus.PENDING = en attente -TaskStatus.IN_PROGRESS = in progress +TaskStatus.IN_PROGRESS = En cours TaskStatus.REMOVED = supprimé # TaskType @@ -1314,21 +1314,21 @@ Trimester.SECOND = Seconde Trimester.THIRD = Troisième Trimester.UNKNOWN = Inconnu -TypeOfAnimal.BAT=Bat or its excreta -TypeOfAnimal.POULTRY=Poultry or wild bird -TypeOfAnimal.CAMEL=Camel -TypeOfAnimal.CANIDAE=Canidae -TypeOfAnimal.CAT=Cat -TypeOfAnimal.CATTLE=Cattle -TypeOfAnimal.DOG=Dog -TypeOfAnimal.PRIMATE=Primate (Monkey) -TypeOfAnimal.SNAKE=Snake -TypeOfAnimal.SWINE=Swine -TypeOfAnimal.RABBIT=Rabbit -TypeOfAnimal.RODENT=Rodent or its excreta -TypeOfAnimal.FLEA=Flea -TypeOfAnimal.TICK=Tick -TypeOfAnimal.OTHER=Other +TypeOfAnimal.BAT=Chauve-souris ou ses excréments +TypeOfAnimal.POULTRY=Volaille ou oiseau sauvage +TypeOfAnimal.CAMEL=Chameau +TypeOfAnimal.CANIDAE=Canidés +TypeOfAnimal.CAT=Chat +TypeOfAnimal.CATTLE=Bétail +TypeOfAnimal.DOG=Chien +TypeOfAnimal.PRIMATE=Primat (singe) +TypeOfAnimal.SNAKE=Serpent +TypeOfAnimal.SWINE=Porc +TypeOfAnimal.RABBIT=Lapin +TypeOfAnimal.RODENT=Rongeur ou ses excréments +TypeOfAnimal.FLEA=Puce +TypeOfAnimal.TICK=Cocher +TypeOfAnimal.OTHER=Autre # TypeOfDrug TypeOfDrug.ANTIMICROBIAL = Antimicrobien @@ -1363,7 +1363,7 @@ UserRight.CASE_INVESTIGATE = Modifier le statut de l'enquête de cas UserRight.CASE_SEE_ARCHIVED = Afficher les cas archivés UserRight.CASE_TRANSFER = Transférer des cas vers une autre région/département/établissement UserRight.CASE_REFER_FROM_POE = Référez le cas à partir du point d'entrée -UserRight.CASE_RESPONSIBLE = Can be responsible for a case +UserRight.CASE_RESPONSIBLE = Peut être responsable d'un cas UserRight.CASE_VIEW = Voir les cas existants UserRight.CONTACT_ASSIGN = Attribuer des contacts aux officiers UserRight.CONTACT_CLASSIFY = Modifier la classification des contacts @@ -1373,7 +1373,7 @@ UserRight.CONTACT_IMPORT = Importer des contacts UserRight.CONTACT_DELETE = Supprimer les contacts du système UserRight.CONTACT_EDIT = Modifier les contacts existants UserRight.CONTACT_EXPORT = Exporter les contacts de SORMAS -UserRight.CONTACT_RESPONSIBLE = Can be responsible for a contact +UserRight.CONTACT_RESPONSIBLE = Peut être responsable d'un contact UserRight.CONTACT_SEE_ARCHIVED = Voir les contacts archivés UserRight.CONTACT_VIEW = Voir les contacts existants UserRight.CONTACT_ARCHIVE = Archiver les contacts @@ -1384,13 +1384,13 @@ UserRight.EVENT_ARCHIVE = Archiver les événements UserRight.EVENT_CREATE = Créer un nouvel évènement UserRight.EVENT_EDIT = Modifier des événements existants UserRight.EVENT_EXPORT = Exporter les événements de SORMAS -UserRight.EVENT_RESPONSIBLE = Can be responsible for an event +UserRight.EVENT_RESPONSIBLE = Peut être responsable d'un événement UserRight.EVENT_SEE_ARCHIVED = Afficher les événements archivés UserRight.EVENT_VIEW = Modifier des événements existants UserRight.EVENTPARTICIPANT_CREATE = Créer de nouveaux participants à l'événement UserRight.EVENTPARTICIPANT_EDIT = Modifier les participants de l'événement existant -UserRight.EVENTPARTICIPANT_ARCHIVE = Event participant archive -UserRight.EVENTPARTICIPANT_VIEW = View existing event participants +UserRight.EVENTPARTICIPANT_ARCHIVE = Archives des participants à l'événement +UserRight.EVENTPARTICIPANT_VIEW = Afficher les participants à l'événement existant UserRight.INFRASTRUCTURE_CREATE = Créer de nouvelles régions/départements/communautés/établissements de santé UserRight.INFRASTRUCTURE_EDIT = Créer des régions/départements/communautés/établissements de santé UserRight.INFRASTRUCTURE_VIEW = Voir les régions/départements/communautés/établissements de santé du système @@ -1413,9 +1413,9 @@ UserRight.TASK_VIEW = Modifier les tâches existantes UserRight.USER_CREATE = Créer nouvel utilisateur UserRight.USER_EDIT = Modifier les utilisateurs existants UserRight.USER_VIEW = Afficher les utilisateurs existants -UserRight.USER_ROLE_EDIT = Edit existing user roles -UserRight.USER_ROLE_DELETE = Delete user roles from the system -UserRight.USER_ROLE_VIEW = View existing user roles +UserRight.USER_ROLE_EDIT = Modifier les rôles d'utilisateur existants +UserRight.USER_ROLE_DELETE = Supprimer les rôles d'utilisateur du système +UserRight.USER_ROLE_VIEW = Afficher les rôles d'utilisateur existants UserRight.VISIT_CREATE = Créer une nouvelle visite UserRight.VISIT_EDIT = Modifier les visites existantes UserRight.WEEKLYREPORT_CREATE = Créer des rapports hebdomadaires @@ -1439,7 +1439,7 @@ UserRight.VISIT_DELETE = Supprimer les visites du système UserRight.VISIT_EXPORT = Exporter les visites depuis SORMAS UserRight.TASK_DELETE = Supprimer les tâches du système UserRight.TASK_EXPORT = Exporter les tâches depuis SORMAS -UserRight.TASK_ARCHIVE = Archive tasks +UserRight.TASK_ARCHIVE = Tâches d'archivage UserRight.ACTION_CREATE = Créer de nouvelles actions UserRight.ACTION_DELETE = Supprimer les actions du système UserRight.ACTION_EDIT = Modifier les actions existantes @@ -1450,7 +1450,7 @@ UserRight.EVENTPARTICIPANT_IMPORT = Importer les participants à l'événement UserRight.SEND_MANUAL_EXTERNAL_MESSAGES = Envoyer des messages externes manuels UserRight.STATISTICS_ACCESS = Statistiques d'accès UserRight.MANAGE_PUBLIC_EXPORT_CONFIGURATION = Gérer les configurations d'exportation publiques -UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Perform bulk operations on cases and samples +UserRight.PERFORM_BULK_OPERATIONS_CASE_SAMPLES = Effectuer des opérations en masse sur des caisses et des échantillons UserRight.INFRASTRUCTURE_EXPORT = Exporter les données d'infrastructure depuis SORMAS UserRight.INFRASTRUCTURE_IMPORT = Importer des données d'infrastructure UserRight.INFRASTRUCTURE_ARCHIVE = Archiver les données d'infrastructure @@ -1493,9 +1493,9 @@ UserRight.CAMPAIGN_FORM_DATA_DELETE = Supprimer les données du formulaire de ca UserRight.CAMPAIGN_FORM_DATA_EXPORT = Exporter les données du formulaire de campagne depuis SORMAS UserRight.BAG_EXPORT = Effectuer l'exportation BAG UserRight.SORMAS_TO_SORMAS_SHARE = Partager des données d'une instance SORMAS à une autre -UserRight.SORMAS_TO_SORMAS_PROCESS = Process shares -UserRight.EXTERNAL_MESSAGE_VIEW = View and fetch messages -UserRight.EXTERNAL_MESSAGE_PROCESS = Work with messages +UserRight.SORMAS_TO_SORMAS_PROCESS = Partages de processus +UserRight.EXTERNAL_MESSAGE_VIEW = Afficher et récupérer des messages +UserRight.EXTERNAL_MESSAGE_PROCESS = Travailler avec les messages UserRight.EXTERNAL_MESSAGE_DELETE = Delete messages from the system UserRight.CASE_SHARE = Partagez des cas avec tout le pays UserRight.PERFORM_BULK_OPERATIONS_EXTERNAL_MESSAGES = Perform bulk operations in messages list @@ -1503,19 +1503,19 @@ UserRight.IMMUNIZATION_VIEW = View existing immunizations and vaccinations UserRight.IMMUNIZATION_CREATE = Create new immunizations and vaccinations UserRight.IMMUNIZATION_EDIT = Edit existing immunizations and vaccinations UserRight.IMMUNIZATION_DELETE = Delete immunizations and vaccinations from the system -UserRight.IMMUNIZATION_ARCHIVE = Archive immunizations -UserRight.PERSON_EXPORT = Export persons -UserRight.CONTACT_MERGE = Merge contacts -UserRight.EVENTGROUP_CREATE = Create new event groups -UserRight.EVENTGROUP_EDIT = Edit existing event groups -UserRight.EVENTGROUP_LINK = Link events to event groups -UserRight.EVENTGROUP_ARCHIVE = Archive event groups -UserRight.EVENTGROUP_DELETE = Delete event groups from the system +UserRight.IMMUNIZATION_ARCHIVE = Archiver les vaccinations +UserRight.PERSON_EXPORT = Exporter des personnes +UserRight.CONTACT_MERGE = Fusionner les contacts +UserRight.EVENTGROUP_CREATE = Créer de nouveaux groupes d'événements +UserRight.EVENTGROUP_EDIT = Modifier les groupes d'événements existants +UserRight.EVENTGROUP_LINK = Lier des événements à des groupes d'événements +UserRight.EVENTGROUP_ARCHIVE = Archiver des groupes d'événements +UserRight.EVENTGROUP_DELETE = Supprimer des groupes d'événements du système UserRight.PERFORM_BULK_OPERATIONS_EVENT = Perform bulk operations in the event directory UserRight.PERFORM_BULK_OPERATIONS_EVENTPARTICIPANT = Effectuer des opérations en masse dans l'annuaire des participants à l'événement -UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Access the travel entry directory -UserRight.TRAVEL_ENTRY_VIEW = View existing travel entries -UserRight.TRAVEL_ENTRY_CREATE = Create new travel entries +UserRight.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Accéder à l'annuaire des entrées de voyage +UserRight.TRAVEL_ENTRY_VIEW = Voir les entrées de voyage existantes +UserRight.TRAVEL_ENTRY_CREATE = Créer de nouvelles entrées de voyage UserRight.TRAVEL_ENTRY_EDIT = Edit existing travel entries UserRight.TRAVEL_ENTRY_DELETE = Delete travel entries from the system UserRight.TRAVEL_ENTRY_ARCHIVE = Archive travel entries @@ -1553,46 +1553,46 @@ UserRight.Desc.CONTACT_CLASSIFY = Permet de modifier la classification des conta UserRight.Desc.CONTACT_CONVERT = Able to create resulting cases from contacts UserRight.Desc.CONTACT_CREATE = Able to create new contacts UserRight.Desc.CONTACT_IMPORT = Able to import contacts -UserRight.Desc.CONTACT_DELETE = Able to delete contacts from the system -UserRight.Desc.CONTACT_EDIT = Able to edit existing contacts -UserRight.Desc.CONTACT_EXPORT = Able to export contacts from SORMAS -UserRight.Desc.CONTACT_RESPONSIBLE = Can be responsible for a contact -UserRight.Desc.CONTACT_VIEW = Able to view existing contacts -UserRight.Desc.CONTACT_ARCHIVE = Able to archive contacts -UserRight.Desc.DASHBOARD_CONTACT_VIEW = Able to access the contact supervisor dashboard +UserRight.Desc.CONTACT_DELETE = Capable de supprimer des contacts du système +UserRight.Desc.CONTACT_EDIT = Capable de modifier les contacts existants +UserRight.Desc.CONTACT_EXPORT = Capable d'exporter des contacts depuis SORMAS +UserRight.Desc.CONTACT_RESPONSIBLE = Peut-être responsable d'un contact +UserRight.Desc.CONTACT_VIEW = Capable de voir les contacts existants +UserRight.Desc.CONTACT_ARCHIVE = Capable d'archiver les contacts +UserRight.Desc.DASHBOARD_CONTACT_VIEW = Capable d'accéder au tableau de bord du superviseur de contact UserRight.Desc.DASHBOARD_SURVEILLANCE_VIEW = Able to access the surveillance supervisor dashboard -UserRight.Desc.DATABASE_EXPORT_ACCESS = Able to export the whole database -UserRight.Desc.EVENT_ARCHIVE = Able to archive events -UserRight.Desc.EVENT_CREATE = Able to create new events -UserRight.Desc.EVENT_EDIT = Able to edit existing events -UserRight.Desc.EVENT_EXPORT = Able to export events from SORMAS -UserRight.Desc.EVENT_RESPONSIBLE = Can be responsible for an event -UserRight.Desc.EVENT_VIEW = Able to view existing events -UserRight.Desc.EVENTPARTICIPANT_CREATE = Able to create new event participants -UserRight.Desc.EVENTPARTICIPANT_EDIT = Able to edit existing event participants -UserRight.Desc.EVENTPARTICIPANT_ARCHIVE = Able to archive event participants +UserRight.Desc.DATABASE_EXPORT_ACCESS = Capable d'exporter toute la base de données +UserRight.Desc.EVENT_ARCHIVE = Capable d'archiver des événements +UserRight.Desc.EVENT_CREATE = Capable de créer de nouveaux événements +UserRight.Desc.EVENT_EDIT = Capable de modifier des événements existants +UserRight.Desc.EVENT_EXPORT = Capable d'exporter des événements depuis SORMAS +UserRight.Desc.EVENT_RESPONSIBLE = Peut être responsable d'un événement +UserRight.Desc.EVENT_VIEW = Capable de voir les événements existants +UserRight.Desc.EVENTPARTICIPANT_CREATE = Capable de créer de nouveaux participants à l'événement +UserRight.Desc.EVENTPARTICIPANT_EDIT = Capable de modifier les participants à un événement existant +UserRight.Desc.EVENTPARTICIPANT_ARCHIVE = Capable d'archiver les participants à l'événement UserRight.Desc.EVENTPARTICIPANT_VIEW = Able to view existing event participants UserRight.Desc.INFRASTRUCTURE_CREATE = Able to create new regions/districts/communities/facilities UserRight.Desc.INFRASTRUCTURE_EDIT = Able to edit regions/districts/communities/facilities UserRight.Desc.INFRASTRUCTURE_VIEW = Able to view regions/districts/communities/facilities in the system -UserRight.Desc.PERFORM_BULK_OPERATIONS = Able to perform bulk operations in lists -UserRight.Desc.SAMPLE_CREATE = Able to create new samples -UserRight.Desc.SAMPLE_EDIT = Able to edit existing samples -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.PERFORM_BULK_OPERATIONS = Capable d'effectuer des opérations en bloc dans les listes +UserRight.Desc.SAMPLE_CREATE = Capable de créer de nouveaux échantillons +UserRight.Desc.SAMPLE_EDIT = Capable d'éditer des échantillons existants +UserRight.Desc.SAMPLE_EXPORT = Capable d'exporter des échantillons de SORMAS +UserRight.Desc.SAMPLE_DELETE = Capable de supprimer des échantillons du système +UserRight.Desc.SAMPLE_TRANSFER = Capable de transférer des échantillons vers un autre laboratoire UserRight.Desc.SAMPLE_VIEW = Able to view existing samples -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 -UserRight.Desc.TASK_ASSIGN = Able to assign tasks to users -UserRight.Desc.TASK_CREATE = Able to create new tasks -UserRight.Desc.TASK_EDIT = Able to edit existing tasks -UserRight.Desc.TASK_VIEW = Able to view existing tasks -UserRight.Desc.TASK_ARCHIVE = Able to archive tasks -UserRight.Desc.USER_CREATE = Able to create new users -UserRight.Desc.USER_EDIT = Able to edit existing users -UserRight.Desc.USER_VIEW = Able to view existing users +UserRight.Desc.SAMPLETEST_CREATE = Capable de créer de nouveaux exemples de tests +UserRight.Desc.SAMPLETEST_EDIT = Capable de modifier des exemples de tests existants +UserRight.Desc.STATISTICS_EXPORT = Capable d'exporter des statistiques détaillées depuis SORMAS +UserRight.Desc.TASK_ASSIGN = Capable d'attribuer des tâches aux utilisateurs +UserRight.Desc.TASK_CREATE = Capable de créer de nouvelles tâches +UserRight.Desc.TASK_EDIT = Capable de modifier des tâches existantes +UserRight.Desc.TASK_VIEW = Capable d'afficher les tâches existantes +UserRight.Desc.TASK_ARCHIVE = Capable d'archiver les tâches +UserRight.Desc.USER_CREATE = Capable de créer de nouveaux utilisateurs +UserRight.Desc.USER_EDIT = Capable de modifier les utilisateurs existants +UserRight.Desc.USER_VIEW = Capable de voir les utilisateurs existants UserRight.Desc.VISIT_CREATE = Able to create new visits UserRight.Desc.VISIT_EDIT = Able to edit existing visits UserRight.Desc.WEEKLYREPORT_CREATE = Able to create weekly reports @@ -1693,11 +1693,11 @@ UserRight.Desc.TRAVEL_ENTRY_MANAGEMENT_ACCESS = Able to access the travel entry UserRight.Desc.TRAVEL_ENTRY_VIEW = Able to view existing travel entries UserRight.Desc.TRAVEL_ENTRY_CREATE = Able to create new travel entries UserRight.Desc.TRAVEL_ENTRY_EDIT = Able to edit existing travel entries -UserRight.Desc.TRAVEL_ENTRY_DELETE = Able to delete travel entries from the system -UserRight.Desc.TRAVEL_ENTRY_ARCHIVE = Able to archive travel entries -UserRight.Desc.EXPORT_DATA_PROTECTION_DATA = Able to export data protection data -UserRight.Desc.OUTBREAK_VIEW = Able to view outbreaks -UserRight.Desc.OUTBREAK_EDIT = Able to edit outbreaks +UserRight.Desc.TRAVEL_ENTRY_DELETE = Capable de supprimer les entrées de voyage du système +UserRight.Desc.TRAVEL_ENTRY_ARCHIVE = Capable d'archiver les entrées de voyage +UserRight.Desc.EXPORT_DATA_PROTECTION_DATA = Capable d'exporter des données de protection des données +UserRight.Desc.OUTBREAK_VIEW = Capable de voir les épidémies +UserRight.Desc.OUTBREAK_EDIT = Capable de modifier les épidémies UserRight.Desc.PERFORM_BULK_OPERATIONS_PSEUDONYM = Able to perform bulk pseudonomization UserRight.Desc.SORMAS_TO_SORMAS_CLIENT = Techincal user right for the SORMAS to SORMAS interface UserRight.Desc.SORMAS_REST = Accès à l'interface REST SORMAS @@ -1710,26 +1710,26 @@ UserRight.Desc.DOCUMENT_DELETE = Able to delete documents from the system UserRight.Desc.PERSON_MERGE = Able to merge persons # UserRightGroup -UserRightGroup.GENERAL = General -UserRightGroup.DATA_PROTECTION = Data Protection -UserRightGroup.PERSON = Persons -UserRightGroup.CASE = Case Surveillance -UserRightGroup.CASE_MANAGEMENT = Case Management -UserRightGroup.PORT_HEALTH = Port Health -UserRightGroup.CONTACT = Contact Surveillance -UserRightGroup.VISIT = Follow-Up -UserRightGroup.SAMPLE = Sample Testing -UserRightGroup.IMMUNIZATION = Immunization -UserRightGroup.TRAVEL_ENTRY = Travel Entries -UserRightGroup.TASK = Tasks -UserRightGroup.EVENT = Events -UserRightGroup.AGGREGATED_REPORTING = Aggregated Reporting -UserRightGroup.CAMPAIGN = Campaigns -UserRightGroup.DASHBOARD = Dashboard -UserRightGroup.STATISTICS = Statistics -UserRightGroup.EXPORT = Export -UserRightGroup.EXTERNAL = External Systems -UserRightGroup.USER = Users +UserRightGroup.GENERAL = Général +UserRightGroup.DATA_PROTECTION = Protection des données +UserRightGroup.PERSON = Personnes +UserRightGroup.CASE = Surveillance des cas +UserRightGroup.CASE_MANAGEMENT = Gestion de cas +UserRightGroup.PORT_HEALTH = Santé portuaire +UserRightGroup.CONTACT = Surveillance des contacts +UserRightGroup.VISIT = Suivi +UserRightGroup.SAMPLE = Exemple de test +UserRightGroup.IMMUNIZATION = Immunisation +UserRightGroup.TRAVEL_ENTRY = Entrées de voyage +UserRightGroup.TASK = Tâches +UserRightGroup.EVENT = Évènements +UserRightGroup.AGGREGATED_REPORTING = Rapports agrégés +UserRightGroup.CAMPAIGN = Campagnes +UserRightGroup.DASHBOARD = Tableau de bord +UserRightGroup.STATISTICS = Statistiques  +UserRightGroup.EXPORT = Exporter +UserRightGroup.EXTERNAL = Système externe +UserRightGroup.USER = Utilisateurs UserRightGroup.INFRASTRUCTURE = Infrastructure UserRightGroup.CONFIGURATION = Configuration UserRightGroup.DOCUMENT = Documents @@ -1747,8 +1747,8 @@ VaccinationInfoSource.UNKNOWN = Inconnu # ValueSeparator ValueSeparator.DEFAULT = Par défaut (%s) -ValueSeparator.COMMA = Comma -ValueSeparator.SEMICOLON = Semicolon +ValueSeparator.COMMA = Virgule +ValueSeparator.SEMICOLON = Point-virgule ValueSeparator.TAB = Tab # ViewMode @@ -1806,7 +1806,7 @@ JurisdictionLevel.COMMUNITY = Commune JurisdictionLevel.HEALTH_FACILITY = Établissement JurisdictionLevel.LABORATORY = Laboratoire JurisdictionLevel.POINT_OF_ENTRY = Point d'entrée -JurisdictionLevel.EXTERNAL_LABORATORY = External laboratory +JurisdictionLevel.EXTERNAL_LABORATORY = Laboratoire externe #CampaignFormElementImportance CampaignFormElementImportance.ALL = Toutes les colonnes @@ -1845,24 +1845,24 @@ EndOfQuarantineReason.OTHER=Autres #InfectionSetting InfectionSetting.UNKNOWN=Inconnu -InfectionSetting.AMBULATORY=Ambulatory -InfectionSetting.MEDICAL_PRACTICE=Medical practice -InfectionSetting.OPERATIVE_1200=Operative -InfectionSetting.HOSPITAL_1300=Hospital -InfectionSetting.OTHER_OUTPATIENT_FACILITY=Other outpatient facility -InfectionSetting.STATIONARY=In-patient -InfectionSetting.HOSPITAL_2100=Hospital +InfectionSetting.AMBULATORY=Ambulatoire +InfectionSetting.MEDICAL_PRACTICE=Cabinet médical +InfectionSetting.OPERATIVE_1200=Opérateur +InfectionSetting.HOSPITAL_1300=Hôpital +InfectionSetting.OTHER_OUTPATIENT_FACILITY=Autre établissement ambulatoire +InfectionSetting.STATIONARY=Hospitalisé +InfectionSetting.HOSPITAL_2100=Hôpital InfectionSetting.NORMAL_WARD=Normal ward -InfectionSetting.OPERATIVE_2111=Operative -InfectionSetting.NOT_OPERATIVE=Non-operative -InfectionSetting.HEMATOLOGICAL_ONCOLOGY=Hematological oncology -InfectionSetting.CHILDREN_WARD=Children's ward -InfectionSetting.NEONATOLOGY=Neonatology -InfectionSetting.INTENSIVE_CARE_UNIT=Intensive care unit -InfectionSetting.OTHER_STATION=Other station -InfectionSetting.NURSING_HOME=Nursing home -InfectionSetting.REHAB_FACILITY=Rehab facility -InfectionSetting.OTHER_STATIONARY_FACILITY=Other in-patient facililty +InfectionSetting.OPERATIVE_2111=Opérateur +InfectionSetting.NOT_OPERATIVE=Non opératoire +InfectionSetting.HEMATOLOGICAL_ONCOLOGY=Oncologie hématologique +InfectionSetting.CHILDREN_WARD=Service des enfants +InfectionSetting.NEONATOLOGY=Néonatologie +InfectionSetting.INTENSIVE_CARE_UNIT=Unité de soins intensifs +InfectionSetting.OTHER_STATION=Autre station +InfectionSetting.NURSING_HOME=Clinique +InfectionSetting.REHAB_FACILITY=Etablissement de Rehabilitation +InfectionSetting.OTHER_STATIONARY_FACILITY=Autre établissement hospitalier SymptomGroup.GENERAL=Général SymptomGroup.RESPIRATORY=Respiratoire @@ -1874,12 +1874,12 @@ SymptomGroup.SKIN=Peau SymptomGroup.OTHER=Autres #Salutation -Salutation.MR=Dear Sir -Salutation.MRS=Dear Madame -Salutation.MR_AND_MRS=Dear Sir and Madame -Salutation.FAMILY=Dear family -Salutation.GUARDIAN_OF_MINOR=Dear guardian of the child -Salutation.OTHER=Other +Salutation.MR=Cher Monsieur +Salutation.MRS=Chère Madame +Salutation.MR_AND_MRS=Cher monsieur et Madame +Salutation.FAMILY=Chère famille +Salutation.GUARDIAN_OF_MINOR=Cher gardien d'enfant +Salutation.OTHER=Autre #PersonAssociation PersonAssociation.ALL=Tout @@ -1889,19 +1889,19 @@ PersonAssociation.EVENT_PARTICIPANT=Participant à l'événement PersonAssociation.IMMUNIZATION=Immunisation PersonAssociation.TRAVEL_ENTRY=Entrées de voyage -ReinfectionDetail.GENOME_SEQUENCE_PREVIOUS_INFECTION_KNOWN = Genome sequence of virus from previous SARS-CoV-2 infection is known -ReinfectionDetail.GENOME_SEQUENCE_CURRENT_INFECTION_KNOWN = Genome sequence of virus from current SARS-CoV-2 infection is known -ReinfectionDetail.GENOME_SEQUENCES_NOT_MATCHING = Genome sequences of viruses from previous and current SARS-CoV-2 infections do not match -ReinfectionDetail.GENOME_COPY_NUMBER_ABOVE_THRESHOLD = SARS-CoV-2 genome copy number within current PCR detection >\= 10^6/ml or Ct value < 30 -ReinfectionDetail.GENOME_COPY_NUMBER_BELOW_THRESHOLD = Individual tested positive for SARS-CoV-2 by PCR, but SARS-CoV-2 genome copy number within current PCR detection < 10^6/ml or Ct value >\= 30, or both not known -ReinfectionDetail.ACUTE_RESPIRATORY_ILLNESS_OVERCOME = Person has overcome acute respiratory illness following confirmed SARS-CoV-2 infection -ReinfectionDetail.PREVIOUS_ASYMPTOMATIC_INFECTION = Person had an asymptomatic SARS-CoV-2 infection -ReinfectionDetail.TESTED_NEGATIVE_AFTER_PREVIOUS_INFECTION = Person tested conclusively negative by PCR at least once after previous SARS-CoV-2 infection -ReinfectionDetail.LAST_PCR_DETECTION_NOT_RECENT = The last positive PCR detection of the preceding infection was more than 3 months ago +ReinfectionDetail.GENOME_SEQUENCE_PREVIOUS_INFECTION_KNOWN = La séquence de génome du virus provenant d'une infection antérieure du SARS-CoV-2 est connue +ReinfectionDetail.GENOME_SEQUENCE_CURRENT_INFECTION_KNOWN = La séquence du génome du virus de l'infection actuelle par le SRAS-CoV-2 est connue +ReinfectionDetail.GENOME_SEQUENCES_NOT_MATCHING = Les séquences génomiques des virus des infections SARS-CoV-2 précédentes et actuelles ne correspondent pas +ReinfectionDetail.GENOME_COPY_NUMBER_ABOVE_THRESHOLD = Numéro de copie du génome SARS-CoV-2 dans la détection actuelle de PCR >\= 10^6/ml ou Ct valeur < 30 +ReinfectionDetail.GENOME_COPY_NUMBER_BELOW_THRESHOLD = Individu testé positif pour le SARS-CoV-2 par PCR, mais nombre de copies du génome du SARS-CoV-2 dans la détection PCR actuelle < 10^6/ml ou valeur Ct >\= 30, ou les deux inconnus +ReinfectionDetail.ACUTE_RESPIRATORY_ILLNESS_OVERCOME = La personne a surmonté une maladie respiratoire aiguë suite à une infection confirmée par le SRAS-CoV-2 +ReinfectionDetail.PREVIOUS_ASYMPTOMATIC_INFECTION = Une personne avait une infection asymptomatique du SARS-CoV-2 +ReinfectionDetail.TESTED_NEGATIVE_AFTER_PREVIOUS_INFECTION = Une personne a testé de manière concluante négative par PCR au moins une fois après l'infection du SARS-CoV-2 +ReinfectionDetail.LAST_PCR_DETECTION_NOT_RECENT = La dernière détection PCR positive de l'infection précédente a été il y a plus de 3 mois ReinfectionDetailGroup.GENOME_SEQUENCE = -ReinfectionDetailGroup.PRECEDING_INFECTION = Information on the preceding infection -ReinfectionDetailGroup.REINFECTION_EVALUATION = More information on the evaluation of reinfection +ReinfectionDetailGroup.PRECEDING_INFECTION = Informations sur l'infection précédente +ReinfectionDetailGroup.REINFECTION_EVALUATION = Plus d'informations sur l'évaluation de la réinfection ReinfectionDetailGroup.PREVIOUS_INFECTION_COMPLETED = Previous infection completed ReinfectionStatus.CONFIRMED = Confirmed reinfection @@ -1983,8 +1983,8 @@ ExternalMessageStatus.FORWARDED=Forwarded ExternalMessageStatus.UNCLEAR=Unclear # ExternalMessageType -ExternalMessageType.LAB_MESSAGE=Lab message -ExternalMessageType.PHYSICIANS_REPORT=Physician's report +ExternalMessageType.LAB_MESSAGE=Message de laboratoire +ExternalMessageType.PHYSICIANS_REPORT=Rapport du médecin # ShareRequestDataType ShareRequestDataType.CASE = Cas @@ -1999,7 +1999,7 @@ ShareRequestStatus.REVOKED = Révoqué # EventCriteriaDateType EventCriteriaDateType.EVENT_DATE = Date de l'événement -EventCriteriaDateType.REPORT_DATE = Report date +EventCriteriaDateType.REPORT_DATE = Date du rapport #EpidemiologicalEvidenceDetail EpidemiologicalEvidenceDetail.STUDY=Étude @@ -2032,7 +2032,7 @@ ImmunizationStatus.NOT_ACQUIRED = Non acquis ImmunizationStatus.EXPIRED = Expiré #ImmunizationManagementStatus -ImmunizationManagementStatus.SCHEDULED = Scheduled +ImmunizationManagementStatus.SCHEDULED = Planifié ImmunizationManagementStatus.ONGOING = En cours ImmunizationManagementStatus.COMPLETED = Terminé ImmunizationManagementStatus.CANCELED = Annulé @@ -2040,7 +2040,7 @@ ImmunizationManagementStatus.CANCELED = Annulé #MeansOfImmunization MeansOfImmunization.VACCINATION = Vaccination MeansOfImmunization.RECOVERY = Récupération -MeansOfImmunization.VACCINATION_RECOVERY = Vaccination/Recovery +MeansOfImmunization.VACCINATION_RECOVERY = Vaccination/Récupération MeansOfImmunization.OTHER = Autres #EntityColumn @@ -2066,53 +2066,53 @@ EnumColumn.DESCRIPTION = Description EnumColumn.SHORT = Courte #NotificationType -NotificationType.CASE_CLASSIFICATION_CHANGED = Case classification changed -NotificationType.Desc.CASE_CLASSIFICATION_CHANGED = Sent to all users associated to the region or responsible region of a case. -NotificationType.CASE_INVESTIGATION_DONE = Case investigation done -NotificationType.Desc.CASE_INVESTIGATION_DONE = Sent to all users associated to the region or responsible region of a case. -NotificationType.EVENT_PARTICIPANT_CASE_CLASSIFICATION_CONFIRMED = Event participant case classification confirmed -NotificationType.Desc.EVENT_PARTICIPANT_CASE_CLASSIFICATION_CONFIRMED = When a case is set to a confirmed classification, this is sent to all responsible users of active events in which the case person participated and which took place no earlier than 30 days before the case was classified. -NotificationType.EVENT_PARTICIPANT_RELATED_TO_OTHER_EVENTS = Event participant related to other events -NotificationType.Desc.EVENT_PARTICIPANT_RELATED_TO_OTHER_EVENTS = When a new event participant is created, this is sent to all responsible users of active events in which the person also participated and which took place no earlier than 30 days before. -NotificationType.CASE_LAB_RESULT_ARRIVED = Case lab result arrived -NotificationType.Desc.CASE_LAB_RESULT_ARRIVED = Sent to all users associated to the region or responsible region of a case when a pathogen test result is entered or modified (non-pending). -NotificationType.CONTACT_LAB_RESULT_ARRIVED = Contact lab result arrived -NotificationType.Desc.CONTACT_LAB_RESULT_ARRIVED = Sent to all users associated to the region of a contact when a pathogen test result is entered or modified (non-pending). If the contact has no region the region of the source case is used. -NotificationType.EVENT_PARTICIPANT_LAB_RESULT_ARRIVED = Event participant lab result arrived -NotificationType.Desc.EVENT_PARTICIPANT_LAB_RESULT_ARRIVED = Sent to all users associated to the region of an event participant when a pathogen test result is entered or modified (non-pending). -NotificationType.LAB_SAMPLE_SHIPPED = Lab sample shipped -NotificationType.Desc.LAB_SAMPLE_SHIPPED = Sent to all users of a laboratory when a sample of that laboratory is shipped. -NotificationType.CONTACT_SYMPTOMATIC = Contact symptomatic -NotificationType.Desc.CONTACT_SYMPTOMATIC = Sent to all users associated to the region of a contact when a new symptomatic visit is created and the contact was previously asymptomatic. If the contact has no region the region of the source case is used. -NotificationType.TASK_START= Task start -NotificationType.Desc.TASK_START= Sent to the assignee of a task and all observer users when the task start date is within the last 10 minutes. -NotificationType.TASK_DUE = Task due -NotificationType.Desc.TASK_DUE = Sent to the assignee of a task and all observer users when the task due date is within the last 10 minutes. -NotificationType.TASK_UPDATED_ASSIGNEE = Task assignee updated -NotificationType.Desc.TASK_UPDATED_ASSIGNEE = Sent to the previous and new assignee of a task. -NotificationType.CONTACT_VISIT_COMPLETED = Contact visit completed -NotificationType.Desc.CONTACT_VISIT_COMPLETED = Sent to all users associated to the region of a contact and all observer users when a "Contact follow-up" task is completed. If the contact has no region the region of the source case is used. -NotificationType.CASE_DISEASE_CHANGED = Case disease changed -NotificationType.Desc.CASE_DISEASE_CHANGED = Sent to all users associated to the region or responsible region of a case when the disease was previously set to 'Unspecified VHF'. -NotificationType.EVENT_GROUP_CREATED = Event group created -NotificationType.Desc.EVENT_GROUP_CREATED = Sent to all responsible users of events that are part of a newly created event group. -NotificationType.EVENT_ADDED_TO_EVENT_GROUP = Event added to event group -NotificationType.Desc.EVENT_ADDED_TO_EVENT_GROUP = Sent to all responsible users of events that are part of the modified event group. -NotificationType.EVENT_REMOVED_FROM_EVENT_GROUP = Event removed from event group -NotificationType.Desc.EVENT_REMOVED_FROM_EVENT_GROUP = Sent to all responsible users of the removed event and events that are part of the modified event group. +NotificationType.CASE_CLASSIFICATION_CHANGED = Classification de cas modifiée +NotificationType.Desc.CASE_CLASSIFICATION_CHANGED = Envoyé à tous les utilisateurs associés à la région ou à la région responsable d'un cas. +NotificationType.CASE_INVESTIGATION_DONE = Enquête de cas effectuée +NotificationType.Desc.CASE_INVESTIGATION_DONE = Envoyé à tous les utilisateurs associés à la région ou à la région responsable d'un cas. +NotificationType.EVENT_PARTICIPANT_CASE_CLASSIFICATION_CONFIRMED = Confirmation de la classification des cas des participants à l'événement +NotificationType.Desc.EVENT_PARTICIPANT_CASE_CLASSIFICATION_CONFIRMED = Lorsqu'un dossier est défini sur une classification confirmée, celle-ci est envoyée à tous les utilisateurs responsables des événements actifs auxquels la personne du dossier a participé et qui ont eu lieu au plus tôt 30 jours avant la classification du dossier. +NotificationType.EVENT_PARTICIPANT_RELATED_TO_OTHER_EVENTS = Participant à l'événement lié à d'autres événements +NotificationType.Desc.EVENT_PARTICIPANT_RELATED_TO_OTHER_EVENTS = Lorsqu'un nouveau participant à un événement est créé, celui-ci est envoyé à tous les utilisateurs responsables des événements actifs auxquels la personne a également participé et qui ont eu lieu au plus tôt 30 jours auparavant. +NotificationType.CASE_LAB_RESULT_ARRIVED = Le résultat du laboratoire de cas est arrivé +NotificationType.Desc.CASE_LAB_RESULT_ARRIVED = Envoyé à tous les utilisateurs associés à la région ou à la région responsable d'un cas lorsqu'un résultat de test d'agent pathogène est entré ou modifié (non en attente). +NotificationType.CONTACT_LAB_RESULT_ARRIVED = Le résultat du laboratoire de contact est arrivé +NotificationType.Desc.CONTACT_LAB_RESULT_ARRIVED = Envoyé à tous les utilisateurs associés à la région d'un contact lorsqu'un résultat de test pathogène est saisi ou modifié (non en attente). Si le contact n'a pas de région, la région du cas source est utilisée. +NotificationType.EVENT_PARTICIPANT_LAB_RESULT_ARRIVED = Le résultat du laboratoire des participants à l'événement est arrivé +NotificationType.Desc.EVENT_PARTICIPANT_LAB_RESULT_ARRIVED = Envoyé à tous les utilisateurs associés à la région d'un participant à l'événement lorsqu'un résultat de test d'agent pathogène est saisi ou modifié (non en attente). +NotificationType.LAB_SAMPLE_SHIPPED = Échantillon de laboratoire expédié +NotificationType.Desc.LAB_SAMPLE_SHIPPED = Envoyé à tous les utilisateurs d'un laboratoire lorsqu'un échantillon de ce laboratoire est expédié. +NotificationType.CONTACT_SYMPTOMATIC = symptomatique du contact +NotificationType.Desc.CONTACT_SYMPTOMATIC = Envoyé à tous les utilisateurs associés à la région d'un contact lorsqu'une nouvelle visite symptomatique est créée et que le contact était auparavant asymptomatique. Si le contact n'a pas de région, la région du cas source est utilisée. +NotificationType.TASK_START= Démarrage de la tâche +NotificationType.Desc.TASK_START= Envoyé au destinataire d'une tâche et à tous les utilisateurs observateurs lorsque la date de début de la tâche se situe dans les 10 dernières minutes. +NotificationType.TASK_DUE = Tâche due +NotificationType.Desc.TASK_DUE = Envoyé au destinataire d'une tâche et à tous les utilisateurs observateurs lorsque la date d'échéance de la tâche se situe dans les 10 dernières minutes. +NotificationType.TASK_UPDATED_ASSIGNEE = Destinataire de la tâche mis à jour +NotificationType.Desc.TASK_UPDATED_ASSIGNEE = Envoyé à l'ancien et au nouveau destinataire d'une tâche. +NotificationType.CONTACT_VISIT_COMPLETED = Visite de contact terminée +NotificationType.Desc.CONTACT_VISIT_COMPLETED = Envoyé à tous les utilisateurs associés à la région d'un contact et à tous les utilisateurs observateurs lorsqu'une tâche "Suivi de contact" est terminée. Si le contact n'a pas de région, la région du cas source est utilisée. +NotificationType.CASE_DISEASE_CHANGED = Maladie de cas modifiée +NotificationType.Desc.CASE_DISEASE_CHANGED = Envoyé à tous les utilisateurs associés à la région ou à la région responsable d'un cas lorsque la maladie était précédemment définie sur "VHF non spécifiée". +NotificationType.EVENT_GROUP_CREATED = Groupe d'événements créé +NotificationType.Desc.EVENT_GROUP_CREATED = Envoyé à tous les utilisateurs responsables des événements qui font partie d'un groupe d'événements nouvellement créé. +NotificationType.EVENT_ADDED_TO_EVENT_GROUP = Événement ajouté au groupe d'événements +NotificationType.Desc.EVENT_ADDED_TO_EVENT_GROUP = Envoyé à tous les utilisateurs responsables des événements qui font partie du groupe d'événements modifié. +NotificationType.EVENT_REMOVED_FROM_EVENT_GROUP = Événement retiré du groupe d'événements +NotificationType.Desc.EVENT_REMOVED_FROM_EVENT_GROUP = Envoyé à tous les utilisateurs responsables de l'événement supprimé et des événements faisant partie du groupe d'événements modifié. #NotificationTypeGroup -NotificationTypeGroup.CASES = Cases +NotificationTypeGroup.CASES = Cas NotificationTypeGroup.CONTACTS = Contacts -NotificationTypeGroup.EVENTS = Events -NotificationTypeGroup.SAMPLES = Samples -NotificationTypeGroup.TASKS = Tasks +NotificationTypeGroup.EVENTS = Évènements +NotificationTypeGroup.SAMPLES = Échantillons +NotificationTypeGroup.TASKS = Tâches #S2SOwnershipStatusFilter -S2SOwnershipStatusFilter.OWNED=With ownership -S2SOwnershipStatusFilter.NOT_OWNED=To view -S2SOwnershipStatusFilter.ALL=All +S2SOwnershipStatusFilter.OWNED=Avec la propriété +S2SOwnershipStatusFilter.NOT_OWNED=Pour voir +S2SOwnershipStatusFilter.ALL=Tout #ShareRequestViewType -ShareRequestViewType.INCOMING=Incoming -ShareRequestViewType.OUTGOING=Outgoing +ShareRequestViewType.INCOMING=Entrant +ShareRequestViewType.OUTGOING=Sortant diff --git a/sormas-api/src/main/resources/enum_ur-PK.properties b/sormas-api/src/main/resources/enum_ur-PK.properties index 0a4b8ee205f..ac183e4217a 100644 --- a/sormas-api/src/main/resources/enum_ur-PK.properties +++ b/sormas-api/src/main/resources/enum_ur-PK.properties @@ -295,7 +295,7 @@ DatabaseTable.CLINICAL_COURSES = طبی کورسز DatabaseTable.CLINICAL_VISITS = طبی دورے DatabaseTable.COMMUNITIES = کمیونیٹیز DatabaseTable.CONTACTS = روابط -DatabaseTable.CONTACTS_VISITS = Contacts → Visits +DatabaseTable.CONTACTS_VISITS = رابطے← دورے DatabaseTable.CONTINENTS = براعظم DatabaseTable.SUBCONTINENTS = برصغیر DatabaseTable.AREAS = خطے @@ -304,7 +304,7 @@ DatabaseTable.CUSTOMIZABLE_ENUM_VALUES = حسب ضرورت اینوم ويليو DatabaseTable.DISTRICTS = اضلاع DatabaseTable.EPIDATA = وبائی امراض کا ڈیٹا DatabaseTable.EVENTS = تقریبات -DatabaseTable.EVENTS_EVENTGROUPS = Events → Event groups +DatabaseTable.EVENTS_EVENTGROUPS = تقریبات ← تقریب گروپس DatabaseTable.EVENTGROUPS = تقریب کے گروہ DatabaseTable.EVENTPARTICIPANTS = ملوث شخص DatabaseTable.EXPOSURES = ایکسپوژر/سامنا @@ -318,7 +318,7 @@ DatabaseTable.LOCATIONS = پتے DatabaseTable.OUTBREAKS = پھیلاؤ DatabaseTable.PERSONS = اشخاص DatabaseTable.PERSON_CONTACT_DETAILS = شخص کے رابطے کی تفصیلات -DatabaseTable.PERSON_LOCATIONS = Person locations +DatabaseTable.PERSON_LOCATIONS = شخص کے مقامات DatabaseTable.PRESCRIPTIONS = نسخے DatabaseTable.PREVIOUSHOSPITALIZATIONS = گزشتہ ہسپتال میں داخلہ DatabaseTable.REGIONS = علاقے @@ -326,7 +326,7 @@ DatabaseTable.SAMPLES = نمونے DatabaseTable.PATHOGEN_TESTS = پیتھوجین ٹیسٹس DatabaseTable.ADDITIONAL_TESTS = اضافی ٹیسٹس DatabaseTable.TASKS = کام -DatabaseTable.TASK_OBSERVER = Task observer +DatabaseTable.TASK_OBSERVER = کام دیکھنے والا DatabaseTable.THERAPIES = علاج DatabaseTable.TRAVEL_ENTRIES = سفری اندراج DatabaseTable.TREATMENTS = علاج @@ -349,10 +349,10 @@ DatabaseTable.SORMAS_TO_SORMAS_ORIGIN_INFO = SORMAS 2 SORMAS کی اصل معل DatabaseTable.SORMAS_TO_SORMAS_SHARE_INFO = SORMAS 2 SORMAS معلومات کا اشتراک DatabaseTable.SORMAS_TO_SORMAS_SHARE_REQUESTS = SORMAS 2 SORMAS اشتراک کی درخواستیں DatabaseTable.SHARE_REQUEST_INFO = SORMAS 2 SORMAS درخواست کی معلومات کا اشتراک -DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS share request information → Share Info +DatabaseTable.SHARE_REQUEST_INFO_SHARE_INFO = SORMAS 2 SORMAS درخواست کی معلومات کا اشتراک ← معلومات کا اشتراک DatabaseTable.EXTERNAL_SHARE_INFO = بیرونی اشتراک کی معلومات DatabaseTable.CAMPAIGNS = مہمات -DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = Campaigns → Campaign Form Meta +DatabaseTable.CAMPAIGN_CAMPAIGNFORMMETA = مہمات ← مہم کا فارم میٹا DatabaseTable.CAMPAIGN_FORM_META = مہم کا فارم میٹا DatabaseTable.CAMPAIGN_FORM_DATA = مہم کے فارم کا ڈیٹا DatabaseTable.CAMPAIGN_DIAGRAM_DEFINITIONS = مہم کے خاکے کی تعریفیں diff --git a/sormas-api/src/main/resources/strings_cs-CZ.properties b/sormas-api/src/main/resources/strings_cs-CZ.properties index 0c96372bb50..2c7bb2a9da5 100644 --- a/sormas-api/src/main/resources/strings_cs-CZ.properties +++ b/sormas-api/src/main/resources/strings_cs-CZ.properties @@ -1240,7 +1240,7 @@ messageAllCampaignFormsValid = Všechny formuláře kampaně byly úspěšně ov messageEnterSms = Prosím zadejte vaši SMS zprávu\: messageSelectedPeriodTooLong = Vybrali jste časové období, které překračuje maximální počet dní. Ujistěte se, že zvolená lhůta nepřesáhne %d dní. messagePersonAlreadyEventParticipant = Osoba případu je již účastníkem vybrané události. Tento případ byl propojen s vybranou událostí. -messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. +messageThisPersonAlreadyEventParticipant = Tato osoba je již účastníkem vybrané události. messagePersonAddedAsEventParticipant = Nový účastník události byl vytvořen. messagePersonAlreadyCaseInEvent = Tento případ je již propojen s vybranou událostí. messagePersonContactDetailsPrimaryDuplicate = Hlavní kontaktní údaje tohoto typu jsou již zaznamenány pro tuto osobu. Chcete místo toho nastavit tyto kontaktní údaje jako hlavní kontaktní údaje? diff --git a/sormas-api/src/main/resources/strings_de-CH.properties b/sormas-api/src/main/resources/strings_de-CH.properties index d4a076e60d9..04f09e53d4c 100644 --- a/sormas-api/src/main/resources/strings_de-CH.properties +++ b/sormas-api/src/main/resources/strings_de-CH.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Sind Sie sicher, dass Sie dieses Ereignis archivieren confirmationArchiveEvents = Sind Sie sicher, dass Sie alle %d ausgewählten Ereignisse archivieren möchten? confirmationArchiveEventParticipant = Sind Sie sicher, dass Sie diesen Ereignisteilnehmer archivieren möchten? Dies wird ihn nicht aus dem System oder irgendeiner Statistik entfernen, sondern nur aus der Liste der Ereignisteilnehmer ausblenden. confirmationArchiveImmunization = Sind Sie sicher, dass Sie diese Immunisierung archivieren möchten? Dies entfernt sie nicht aus dem System oder irgendeiner Statistik, sondern versteckt sie nur im normalen Immunisierungsverzeichnis. -confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. -confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? +confirmationArchiveTask = Sind Sie sicher, dass Sie diese Aufgabe archivieren möchten? Dies entfernt sie nicht aus dem System oder irgendwelchen Statistiken, sondern versteckt sie nur vor der normalen Aufgabenverwaltung. +confirmationArchiveTasks = Sind Sie sicher, dass Sie alle %d ausgewählten Aufgaben archivieren möchten? confirmationArchiveTravelEntry = Sind Sie sicher, dass Sie diese Einreise archivieren möchten? Dies entfernt sie nicht aus dem System oder irgendeiner Statistik, sondern versteckt sie nur im normalen Einreiseverzeichnis. confirmationArchiveEventGroup = Sind Sie sicher, dass Sie diese Ereignisgruppe archivieren möchten? Dies entfernt sie nicht aus dem System oder irgendeiner Statistik, sondern versteckt sie nur im normalen Ereignisgruppenverzeichnis. confirmationCancelFollowUp = Sind Sie sicher, dass Sie die Nachverfolgung aller %d ausgewählten Kontakte abbrechen möchten? @@ -1128,10 +1128,10 @@ messageSpecifyRowAttribute = Bitte geben Sie die Zeilenattribut an, die Sie für messageSymptomsHint = Bitte wählen Sie eine Antwort für ALLE Symptome, um anzeigen, ob sie während dieser Krankheit zu irgendeinem Zeitpunkt aufgetreten sind\: messageSymptomsVisitHint = Bitte wählen Sie eine Antwort für ALLE Symptome, um anzeigen, ob sie während des Anrufs präsent waren\: messageTasksArchived = Alle ausgewählten Aufgaben wurden archiviert -messageTaskArchived = The task has been archived +messageTaskArchived = Die Aufgabe wurde archiviert messageTasksEdited = Alle Aufgaben wurden bearbeitet messageTasksDearchived = Alle ausgewählten Aufgaben wurden de-archiviert -messageTaskDearchived = The task has been de-archived +messageTaskDearchived = Die Aufgabe wurde dearchiviert messageTasksDeleted = Alle ausgewählten Aufgaben wurden gelöscht messageTemplateNotAvailable = Die Vorlagen-Datei ist nicht verfügbar. Bitte kontaktieren Sie einen Administrator und teilen Sie ihm dieses Problem mit. messageTravelEntrySaved = Einreisedaten gespeichert @@ -1240,7 +1240,7 @@ messageAllCampaignFormsValid = Alle Kampagnenformulare wurden erfolgreich validi messageEnterSms = Bitte geben Sie hier Ihre SMS Nachricht ein\: messageSelectedPeriodTooLong = Sie haben einen Zeitraum ausgewählt, der die maximale Anzahl von Tagen überschreitet. Bitte stellen Sie sicher, dass der gewählte Zeitraum %d Tage nicht überschreitet. messagePersonAlreadyEventParticipant = Die Fall-Person ist bereits ein Ereignisteilnehmer in dem ausgewählten Ereignis. Dieser Fall wurde mit dem ausgewählten Ereignis verknüpft. -messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. +messageThisPersonAlreadyEventParticipant = Diese Person ist bereits ein Ereignisteilnehmer im ausgewählten Ereignis. messagePersonAddedAsEventParticipant = Der neue Ereignisteilnehmer wurde erstellt. messagePersonAlreadyCaseInEvent = Dieser Fall ist bereits mit dem ausgewählten Ereignis verknüpft. messagePersonContactDetailsPrimaryDuplicate = Es gibt bereits primäre Kontaktdaten dieser Art für diese Person. Möchten Sie diese Kontaktdaten stattdessen als primäre Kontaktdaten festlegen? @@ -1285,7 +1285,7 @@ messageSormasToSormasSimilarPersonFound = Es gibt mindestens eine ähnliche Pers messageDeleteWithPendingShareRequest = Es gibt eine ausstehende Freigabeanfrage. Mit einer Löschung wird die Freigabeanfrage widerrufen und gelöscht. messageCannotMergeMoreThanTwoPersons = Sie müssen zwei Personen zum Zusammenführen auswählen\! messageAutomaticDeletionStarted = Automatisches Löschen wurde gestartet und wird im Hintergrund ausgeführt. Bitte beachten Sie, dass dieser Prozess je nach Anzahl der zu löschenden Daten einige Zeit in Anspruch nehmen kann. -messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right +messageUserRoleUnusableForLogin = Benutzer mit nur dieser Rolle können sich nicht anmelden, da die Rolle weder Zugang Sormas UI noch Zugang Sormas REST Rechte hat # Notifications notificationCaseClassificationChanged = Die Falldefinitionskategorie des Falls %s wurde auf %s geändert. diff --git a/sormas-api/src/main/resources/strings_de-DE.properties b/sormas-api/src/main/resources/strings_de-DE.properties index bd153bdb6f0..e563edab1f8 100644 --- a/sormas-api/src/main/resources/strings_de-DE.properties +++ b/sormas-api/src/main/resources/strings_de-DE.properties @@ -130,8 +130,8 @@ confirmationArchiveEvent = Sind Sie sicher, dass Sie dieses Ereignis abschließe confirmationArchiveEvents = Sind Sie sicher, dass Sie alle %d ausgewählten Ereignisse abschließen möchten? confirmationArchiveEventParticipant = Sind Sie sicher, dass Sie diesen Ereignisteilnehmer abschließen möchten? Dies wird ihn nicht aus dem System oder irgendeiner Statistik entfernen, sondern nur aus der Liste der Ereignisteilnehmer ausblenden. confirmationArchiveImmunization = Sind Sie sicher, dass Sie diese Immunisierung abschließen möchten? Dies entfernt sie nicht aus dem System oder irgendeiner Statistik, sondern versteckt sie nur im normalen Immunisierungsverzeichnis. -confirmationArchiveTask = Are you sure you want to archive this task? This will not remove it from the system or any statistics, but only hide it from the normal task management. -confirmationArchiveTasks = Are you sure you want to archive all %d selected tasks? +confirmationArchiveTask = Sind Sie sicher, dass Sie diese Aufgabe archivieren möchten? Dies entfernt sie nicht aus dem System oder irgendwelchen Statistiken, sondern versteckt sie nur vor der normalen Aufgabenverwaltung. +confirmationArchiveTasks = Sind Sie sicher, dass Sie alle %d ausgewählten Aufgaben archivieren möchten? confirmationArchiveTravelEntry = Sind Sie sicher, dass Sie diese Einreise abschließen möchten? Dies entfernt sie nicht aus dem System oder irgendeiner Statistik, sondern versteckt sie nur im normalen Einreiseverzeichnis. confirmationArchiveEventGroup = Sind Sie sicher, dass Sie diese Ereignisgruppe archivieren möchten? Dies entfernt sie nicht aus dem System oder irgendeiner Statistik, sondern versteckt sie nur im normalen Ereignisgruppenverzeichnis. confirmationCancelFollowUp = Sind Sie sicher, dass Sie die Nachverfolgung aller %d ausgewählten Kontakte abbrechen möchten? @@ -1128,10 +1128,10 @@ messageSpecifyRowAttribute = Bitte geben Sie die Zeilenattribut an, die Sie für messageSymptomsHint = Bitte wählen Sie eine Antwort für ALLE Symptome, um anzuzeigen, ob sie während dieser Krankheit zu irgendeinem Zeitpunkt aufgetreten sind\: messageSymptomsVisitHint = Bitte wählen Sie eine Antwort für ALLE Symptome, um anzuzeigen, ob sie während des Anrufs präsent waren\: messageTasksArchived = Alle ausgewählten Aufgaben wurden archiviert -messageTaskArchived = The task has been archived +messageTaskArchived = Die Aufgabe wurde archiviert messageTasksEdited = Alle Aufgaben wurden bearbeitet messageTasksDearchived = Alle ausgewählten Aufgaben wurden de-archiviert -messageTaskDearchived = The task has been de-archived +messageTaskDearchived = Die Aufgabe wurde dearchiviert messageTasksDeleted = Alle ausgewählten Aufgaben wurden gelöscht messageTemplateNotAvailable = Die Vorlagen-Datei ist nicht verfügbar. Bitte kontaktieren Sie einen Administrator und teilen Sie ihm dieses Problem mit. messageTravelEntrySaved = Einreisedaten gespeichert @@ -1240,7 +1240,7 @@ messageAllCampaignFormsValid = Alle Kampagnenformulare wurden erfolgreich validi messageEnterSms = Bitte geben Sie hier Ihre SMS Nachricht ein\: messageSelectedPeriodTooLong = Sie haben einen Zeitraum ausgewählt, der die maximale Anzahl von Tagen überschreitet. Bitte stellen Sie sicher, dass der gewählte Zeitraum %d Tage nicht überschreitet. messagePersonAlreadyEventParticipant = Die Fall-Person ist bereits ein Ereignisteilnehmer in dem ausgewählten Ereignis. Dieser Fall wurde mit dem ausgewählten Ereignis verknüpft. -messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. +messageThisPersonAlreadyEventParticipant = Diese Person ist bereits ein Ereignisteilnehmer im ausgewählten Ereignis. messagePersonAddedAsEventParticipant = Der neue Ereignisteilnehmer wurde erstellt. messagePersonAlreadyCaseInEvent = Dieser Fall ist bereits mit dem ausgewählten Ereignis verknüpft. messagePersonContactDetailsPrimaryDuplicate = Es gibt bereits primäre Kontaktdaten dieser Art für diese Person. Möchten Sie diese Kontaktdaten stattdessen als primäre Kontaktdaten festlegen? @@ -1285,7 +1285,7 @@ messageSormasToSormasSimilarPersonFound = Es gibt mindestens eine ähnliche Pers messageDeleteWithPendingShareRequest = Es gibt eine ausstehende Anfrage zur Übernahme. Mit einer Löschung wird die Anfrage widerrufen und gelöscht. messageCannotMergeMoreThanTwoPersons = Sie müssen zwei Personen zum Zusammenführen auswählen\! messageAutomaticDeletionStarted = Automatisches Löschen wurde gestartet und wird im Hintergrund ausgeführt. Bitte beachten Sie, dass dieser Prozess je nach Anzahl der zu löschenden Daten einige Zeit in Anspruch nehmen kann. -messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right +messageUserRoleUnusableForLogin = Benutzer mit nur dieser Rolle können sich nicht anmelden, da die Rolle weder Zugang Sormas UI noch Zugang Sormas REST Rechte hat # Notifications notificationCaseClassificationChanged = Die Falldefinitionskategorie des Falls %s wurde auf %s geändert. diff --git a/sormas-api/src/main/resources/strings_es-CU.properties b/sormas-api/src/main/resources/strings_es-CU.properties index 957ebff77fd..5bc53239f0e 100644 --- a/sormas-api/src/main/resources/strings_es-CU.properties +++ b/sormas-api/src/main/resources/strings_es-CU.properties @@ -1240,7 +1240,7 @@ messageAllCampaignFormsValid = Todos los formularios de campaña se validaron ex messageEnterSms = Por favor escriba su mensaje SMS aquí\: messageSelectedPeriodTooLong = Ha seleccionado un período de tiempo que excede el número máximo de días. Por favor, asegure que el período de tiempo seleccionado no exceda los %d días. messagePersonAlreadyEventParticipant = La persona del caso ya es un participante de evento del evento seleccionado. Este caso ha sido vinculado al evento seleccionado. -messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. +messageThisPersonAlreadyEventParticipant = Esta persona ya es un participante de evento en el evento seleccionado. messagePersonAddedAsEventParticipant = Se creó el nuevo participante de evento. messagePersonAlreadyCaseInEvent = Este caso ya está vinculado al evento seleccionado. messagePersonContactDetailsPrimaryDuplicate = Ya hay datos de contacto principales de este tipo registrados para esta persona. ¿Desea establecer estos datos de contacto como los datos de contacto principales? diff --git a/sormas-api/src/main/resources/strings_fr-FR.properties b/sormas-api/src/main/resources/strings_fr-FR.properties index 9d0d8836b20..827ef059fc8 100644 --- a/sormas-api/src/main/resources/strings_fr-FR.properties +++ b/sormas-api/src/main/resources/strings_fr-FR.properties @@ -1240,7 +1240,7 @@ messageAllCampaignFormsValid = Tous les formulaires de campagne ont été valid messageEnterSms = Veuillez entrer votre message ici. messageSelectedPeriodTooLong = Vous avez sélectionné une période de temps qui dépasse le nombre maximum de jours. Veuillez vous assurer que la période sélectionnée ne dépasse pas %d jours. messagePersonAlreadyEventParticipant = The case person already is an event participant in the selected event. This case has been linked to the selected event. -messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. +messageThisPersonAlreadyEventParticipant = Cette personne est déjà un participant à l'événement sélectionné. messagePersonAddedAsEventParticipant = Le nouveau participant a été créé. messagePersonAlreadyCaseInEvent = This case is already linked to the selected event. messagePersonContactDetailsPrimaryDuplicate = There already are primary contact details of this type recorded for this person. Do you want to set these contact details as the primary contact details instead? diff --git a/sormas-api/src/main/resources/strings_ur-PK.properties b/sormas-api/src/main/resources/strings_ur-PK.properties index 8e0469b9de9..5a34f2a12b9 100644 --- a/sormas-api/src/main/resources/strings_ur-PK.properties +++ b/sormas-api/src/main/resources/strings_ur-PK.properties @@ -1240,7 +1240,7 @@ messageAllCampaignFormsValid = مہم کے تمام فارمز کی کامیاب messageEnterSms = براہ کرم اپنا SMS پیغام یہاں درج کریں\: messageSelectedPeriodTooLong = آپ نے ایک مدت کا انتخاب کیا ہے جو دنوں کی زیادہ سے زیادہ تعداد سے زیادہ ہے۔ براہ کرم یقینی بنائیں کہ منتخب کردہ مدت %d دنوں سے زیادہ نہ ہو۔ messagePersonAlreadyEventParticipant = کیس پرسن پہلے سے ہی منتخب تقریب میں تقریب کا شریک ہے۔ اس کیس کو منتخب تقریب سے جوڑ دیا گیا ہے۔ -messageThisPersonAlreadyEventParticipant = This person already is an event participant in the selected event. +messageThisPersonAlreadyEventParticipant = یہ شخص پہلے سے ہی منتخب کردہ تقریب میں شرکت کرنے والا ہے۔ messagePersonAddedAsEventParticipant = تقریب کا نیا شرکت کنندہ بنا دیا گیا۔ messagePersonAlreadyCaseInEvent = یہ کیس پہلے ہی منتخب تقریب سے منسلک ہے۔ messagePersonContactDetailsPrimaryDuplicate = اس شخص کے لیے اس قسم کی ابتدائی رابطے کی تفصیلات پہلے سے ہی ریکارڈ کی گئی ہیں۔ کیا آپ اس کے بجائے رابطے کی ان تفصیلات کو بنیادی رابطے کی تفصیلات کے طور پر سیٹ کرنا چاہتے ہیں؟ @@ -1285,7 +1285,7 @@ messageSormasToSormasSimilarPersonFound = آپ کے سسٹم میں کم از ک messageDeleteWithPendingShareRequest = شیئر کی درخواست زیر التوا ہے۔ مٹانے کے ساتھ، اشتراک کی درخواست کو منسوخ اور مٹا دیا جائے گا۔ messageCannotMergeMoreThanTwoPersons = آپ کو انضمام کے لیے دو افراد کو منتخب کرنے کی ضرورت ہے\! messageAutomaticDeletionStarted = خودکار مٹانا شروع کر دیا گیا ہے اور اسے پس منظر میں عمل میں لایا جائے گا۔ براہ کرم نوٹ کریں کہ مٹنے والے ڈیٹا کی مقدار پر منحصر ہے، اس عمل میں کچھ وقت لگ سکتا ہے۔ -messageUserRoleUnusableForLogin = Users with only this role will not be able to login because the role does not have Access Sormas UI nor Access Sormas REST right +messageUserRoleUnusableForLogin = صرف اس کردار کے حامل صارفین لاگ ان نہیں کر پائیں گے کیونکہ اس رول میں Access Sormas UI نہیں ہے اور نہ ہی Sormas REST تک رسائی حاصل ہے۔ # Notifications notificationCaseClassificationChanged = کیس %s کی درجہ بندی %s میں تبدیل ہو گئی ہے۔ From 406ebaef7442688238335f3ff61628f8fabe0051 Mon Sep 17 00:00:00 2001 From: Stefan Kock Date: Wed, 21 Dec 2022 11:21:51 +0100 Subject: [PATCH 144/147] #10958 Fix: update dataSize for event participants --- .../java/de/symeda/sormas/ui/events/EventParticipantsView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java index eb6bcce7baa..6c2884fcb08 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/events/EventParticipantsView.java @@ -323,7 +323,7 @@ protected void initView(String params) { gridLayout.addComponent(grid); gridLayout.setExpandRatio(grid, 1); gridLayout.setStyleName("crud-main-layout"); - grid.getDataProvider().addDataProviderListener(e -> updateStatusButtons()); + grid.addDataSizeChangeListener(e -> updateStatusButtons()); setSubComponent(gridLayout); gridLayout.setEnabled(!isEventDeleted() && isEditAllowed() && UserProvider.getCurrent().hasUserRight(UserRight.EVENTPARTICIPANT_EDIT)); } From 4651358e41c65ce5eca6e43a1d93b27467032af4 Mon Sep 17 00:00:00 2001 From: Adrian Dinu Date: Wed, 21 Dec 2022 13:07:50 +0200 Subject: [PATCH 145/147] Bug/10525 multiple cases from pathogen test in contacts and event partic (#11222) * #10525 refactor backend from case to casePersonUuid * #10525 show dialog only when no cases found * #10525 changes after reviw * #10525 rename parameter --- .../de/symeda/sormas/api/caze/CaseFacade.java | 2 +- .../sormas/backend/caze/CaseFacadeEjb.java | 4 ++-- .../backend/caze/CaseFacadeEjbTest.java | 2 +- .../ui/samples/PathogenTestController.java | 22 +++++++++++++------ 4 files changed, 19 insertions(+), 11 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 46e2321d799..9c6cf8723ab 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 @@ -205,7 +205,7 @@ void saveBulkEditWithFacilities( List getDuplicates(@Valid CasePersonDto casePerson); - List getDuplicatesWithPathogenTest(@Valid CaseDataDto caseDataDto, PathogenTestDto pathogenTestDto); + List getDuplicatesWithPathogenTest(@Valid PersonReferenceDto personReferenceDto, PathogenTestDto pathogenTestDto); List getByPersonUuids(List personUuids); 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 480d1847d04..7eb6f037411 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 @@ -4199,7 +4199,7 @@ public List getDuplicates(@Valid CasePersonDto casePerson, int re } @Override - public List getDuplicatesWithPathogenTest(@Valid CaseDataDto caseDataDto, PathogenTestDto pathogenTestDto) { + public List getDuplicatesWithPathogenTest(@Valid PersonReferenceDto personReferenceDto, PathogenTestDto pathogenTestDto) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Case.class); Root caseRoot = cq.from(Case.class); @@ -4212,7 +4212,7 @@ public List getDuplicatesWithPathogenTest(@Valid CaseDataDto caseDa cq.select(caseRoot); Predicate filter = cb.and( cb.equal(caseRoot.get(Case.DISEASE), pathogenTestDto.getTestedDisease()), - cb.equal(personJoin.get(Person.UUID), caseDataDto.getPerson().getUuid()), + cb.equal(personJoin.get(Person.UUID), personReferenceDto.getUuid()), cb.equal(caseRoot.get(Case.DISEASE), pathogenTestJoin.get(PathogenTest.TESTED_DISEASE)), cb.exists(sampleService.exists(cb, cq, samplesJoin, pathogenTestDto.getSample().getUuid()))); diff --git a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java index 88191e350fc..b67122463eb 100644 --- a/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java +++ b/sormas-backend/src/test/java/de/symeda/sormas/backend/caze/CaseFacadeEjbTest.java @@ -3146,7 +3146,7 @@ public void testDuplicatesWithPathogenTest() { covidCase.setDisease(Disease.ANTHRAX); CaseDataDto anthraxCase = getCaseFacade().cloneCase(covidCase); - List duplicatedCases = getCaseFacade().getDuplicatesWithPathogenTest(covidCase, pathogenTestDto); + List duplicatedCases = getCaseFacade().getDuplicatesWithPathogenTest(covidCase.getPerson(), pathogenTestDto); assertEquals(1, duplicatedCases.size()); assertEquals(anthraxCase.getUuid(), duplicatedCases.get(0).getUuid()); } diff --git a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java index cb0c07bb041..4d9eb278c66 100644 --- a/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java +++ b/sormas-ui/src/main/java/de/symeda/sormas/ui/samples/PathogenTestController.java @@ -258,7 +258,7 @@ private void handleAssociatedCase( } }); } else { - List duplicatedCases = FacadeProvider.getCaseFacade().getDuplicatesWithPathogenTest(caze, dto); + List duplicatedCases = FacadeProvider.getCaseFacade().getDuplicatesWithPathogenTest(caze.getPerson(), dto); if (duplicatedCases == null || duplicatedCases.size() == 0) { showCaseCloningWithNewDiseaseDialog( caze, @@ -319,7 +319,11 @@ private void handleAssociatedContact( showChangeAssociatedSampleResultDialog(dto, null); } } else { - showCreateContactCaseDialog(contact, dto.getTestedDisease()); + List duplicatedCases = + FacadeProvider.getCaseFacade().getDuplicatesWithPathogenTest(contact.getPerson(), dto); + if (duplicatedCases == null || duplicatedCases.size() == 0) { + showCreateContactCaseDialog(contact, dto.getTestedDisease()); + } } } }; @@ -374,11 +378,15 @@ private void handleAssociatedEventParticipant( showChangeAssociatedSampleResultDialog(dto, null); } } else { - showConvertEventParticipantToCaseDialog(eventParticipant, dto.getTestedDisease(), caseCreated -> { - if (eventDisease == null) { - handleCaseCreationFromContactOrEventParticipant(caseCreated, dto); - } - }); + List duplicatedCases = + FacadeProvider.getCaseFacade().getDuplicatesWithPathogenTest(eventParticipant.getPerson().toReference(), dto); + if (duplicatedCases == null || duplicatedCases.size() == 0) { + showConvertEventParticipantToCaseDialog(eventParticipant, dto.getTestedDisease(), caseCreated -> { + if (eventDisease == null) { + handleCaseCreationFromContactOrEventParticipant(caseCreated, dto); + } + }); + } } } }; From 592fda3333d106dd0aa3c6a62249740f54e25462 Mon Sep 17 00:00:00 2001 From: jen kins Date: Wed, 21 Dec 2022 16:05:14 +0100 Subject: [PATCH 146/147] Updated version number --- .../resources/doc/SORMAS_Data_Dictionary.xlsx | Bin 268050 -> 267477 bytes .../main/resources/doc/SORMAS_User_Roles.xlsx | Bin 31222 -> 31284 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/sormas-api/src/main/resources/doc/SORMAS_Data_Dictionary.xlsx b/sormas-api/src/main/resources/doc/SORMAS_Data_Dictionary.xlsx index 7ba6f5cdd807f990422b4472f9f69b25f7dc9a78..110060fdfbf76c3c69b6e8f8769267ff25ecc519 100644 GIT binary patch delta 207602 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 delta 208463 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
  • yGu&pN0w>%k4H-2+J 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 z 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%0AFYa5#ftOGUA|t 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 G*#7~nA7!Ng literal 31222 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

    nv^>l}v7< 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 Date: Wed, 21 Dec 2022 16:05:20 +0100 Subject: [PATCH 147/147] [GITFLOW]updating poms for branch'release-1.78.0' with non-snapshot versions --- sormas-api/pom.xml | 2 +- sormas-app/pom.xml | 2 +- sormas-backend/pom.xml | 2 +- sormas-base/dependencies/serverlibs.pom | 2 +- sormas-base/pom.xml | 2 +- sormas-cargoserver/pom.xml | 2 +- sormas-ear/pom.xml | 2 +- sormas-keycloak-service-provider/pom.xml | 2 +- sormas-rest/pom.xml | 2 +- sormas-ui/pom.xml | 2 +- sormas-widgetset/pom.xml | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/sormas-api/pom.xml b/sormas-api/pom.xml index ec8a91fd49e..3c5a91dd020 100644 --- a/sormas-api/pom.xml +++ b/sormas-api/pom.xml @@ -2,7 +2,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.78.0 ../sormas-base 4.0.0 diff --git a/sormas-app/pom.xml b/sormas-app/pom.xml index 6a49b253781..6431131ba7f 100644 --- a/sormas-app/pom.xml +++ b/sormas-app/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.78.0 ../sormas-base 4.0.0 diff --git a/sormas-backend/pom.xml b/sormas-backend/pom.xml index 5a7625052ac..aad008d2ea3 100644 --- a/sormas-backend/pom.xml +++ b/sormas-backend/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.78.0 ../sormas-base 4.0.0 diff --git a/sormas-base/dependencies/serverlibs.pom b/sormas-base/dependencies/serverlibs.pom index 91db21e5987..eb4d1c29c98 100644 --- a/sormas-base/dependencies/serverlibs.pom +++ b/sormas-base/dependencies/serverlibs.pom @@ -8,7 +8,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.78.0 ../ diff --git a/sormas-base/pom.xml b/sormas-base/pom.xml index 8f1cf55d2b9..6139d6b5cbb 100644 --- a/sormas-base/pom.xml +++ b/sormas-base/pom.xml @@ -5,7 +5,7 @@ de.symeda.sormas sormas-base pom - 1.78.0-SNAPSHOT + 1.78.0 1.8 diff --git a/sormas-cargoserver/pom.xml b/sormas-cargoserver/pom.xml index 935d51a2397..4d79eeb4d61 100644 --- a/sormas-cargoserver/pom.xml +++ b/sormas-cargoserver/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.78.0 ../sormas-base diff --git a/sormas-ear/pom.xml b/sormas-ear/pom.xml index 05d2cab9ca1..b989d3adbc5 100644 --- a/sormas-ear/pom.xml +++ b/sormas-ear/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.78.0 ../sormas-base diff --git a/sormas-keycloak-service-provider/pom.xml b/sormas-keycloak-service-provider/pom.xml index 6c507e70a4e..419d4cd175a 100644 --- a/sormas-keycloak-service-provider/pom.xml +++ b/sormas-keycloak-service-provider/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.78.0 ../sormas-base 4.0.0 diff --git a/sormas-rest/pom.xml b/sormas-rest/pom.xml index 2798d0cc469..9659eb897fb 100644 --- a/sormas-rest/pom.xml +++ b/sormas-rest/pom.xml @@ -3,7 +3,7 @@ de.symeda.sormas sormas-base - 1.78.0-SNAPSHOT + 1.78.0 ../sormas-base diff --git a/sormas-ui/pom.xml b/sormas-ui/pom.xml index 04695198254..86bb6c72e1f 100644 --- a/sormas-ui/pom.xml +++ b/sormas-ui/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.78.0 ../sormas-base 4.0.0 diff --git a/sormas-widgetset/pom.xml b/sormas-widgetset/pom.xml index 7ceea1349a7..0b45879e1ce 100644 --- a/sormas-widgetset/pom.xml +++ b/sormas-widgetset/pom.xml @@ -3,7 +3,7 @@ sormas-base de.symeda.sormas - 1.78.0-SNAPSHOT + 1.78.0 ../sormas-base 4.0.0