DHIS2 Version 40 & Android App 2.8 are released

Dear all,

DHIS2 version 40.0 and the Android App 2.8 are out with many new features, improvements and bug fixes.

You can log in and test them out on the demo server

Web admin / district
Android android / Android123

ANALYTICS FEATURES

On-the-fly custom calculations in Data Visualizer: Now it’s even easier to explore your data in DHIS2. With this feature, you can create your own custom calculations directly in the Data Visualizer application for pivot tables. This means you no longer need to have admin access or create new indicators to play around with your own personal data expressions. Plus, the custom calculation is automatically saved to the pivot table in which it was created without cluttering up your configuration with additional saved indicators. This feature is ideal for exploring coverage calculations with various population denominators and making quick and simple sums.
Jira | Docs

Single value charts with legend colors: Legend colors can be applied to the background of a single value chart, making the performance of the value more obvious and visually engaging. This feature helps users quickly understand the significance of the value and its relation to the legend colors.
Jira

Legend for stacked column charts: Spice up your data visualizations with a new feature that allows legends to be applied to column charts! This makes it easier to see how indicators are performing at a glance.
Jira

Indicator icons for single value charts: Want to add some personality to your data? Now, icons can be shown in single value charts to represent the indicator being used. For example, if you’re tracking total malaria cases, you can choose a mosquito icon to visually communicate what the value represents. This feature will also be added for data elements in the near future.
Jira

Line lists on dashboards: Keep track of all your data in one place with line lists now available on dashboards! This feature has also been added to versions 2.39 and 2.38.
Jira

Multiple event coordinate types in maps: Visualize geographical data in new ways with multiple event coordinate types now available for use in maps. Choose to view location by event coordinate, enrollment coordinate, tracked entity coordinate, program stage data elements of type coordinates, or program tracked entity attributes of type coordinate. For example, you can easily see the household location for women who delivered last week at the health facility for outreach services.
Jira

Display values in thematic layers: Make your maps even more informative with the option to show values directly on the map in thematic layers. This addition complements the legend and provides a more complete picture of the data being presented.
Jira

Improved maps download: Get all of the key information you need when you download a map. You can now show the map title, description, legend(s), north arrow, and overview map all in one easy to use image when you download a map.
Jira

Ownership analytics in program indicators: Now you can make program indicators which are based on organisation unit ownership. For example, you can count the number of patients that are receiving care at a facility even if they were not originally enrolled in care at that facility or officially transfered. Specifically, program indicators can define which organisation unit will be used in analytics. Choices include the organisation unit for the event, enrollment, registration, organisation unit data element and tracked entity instance ownership at the start or end of the reporting period.
Jira

TRACKER AND EVENT FEATURES

Breaking the glass: Programs with access level “protected” are now supported in the Capture app. For protected programs, when searching for a tracked entity instance that is found in another organisation unit, the user is asked to provide a reason for why they need access. This access level is useful when clinicians in one clinic should be able to access their own records, but only on exception accesses records from other clinics. This functionality was supported in the old Tracker Capture and have now been reimplemented and improved in Capture. Supported in DHIS version 2.38 or higher, with Capture version 100.27.0 or higher.
Screenshot | Jira

Saved program stage working lists for tracker programs: Program stage filters have been partially supported in the Capture app since 2.39, allowing filtering and ordering of lists based on event data in tracker programs. Now these filters can also be stored and shared as working lists. The program stage working lists can be utilized for many different purposes. Some examples are creating follow-up lists of specific tasks, following up defaulters or systematically reviewing data. Supported in DHIS2 version 40 or higher, with Capture version 100.31.0 or higher.
Jira

Header bar improvements: The header bar in Capture app has been updated to match other apps in the system. While the functionality remains the same, the header now takes up less space and popovers are used to avoid situations where the bar expands and pushes other content down from the user’s view. Supported in DHIS2 version 2.38 or higher with Capture version 100.26.0 or higher.
Screenshot | Jira

Ask user to create new event when stage is completed: Capture app now includes functionality for asking users to create a new event after completing a stage. If the flag for asking the user to create a new stage is checked, users will be prompted to create a new event immediately upon completing the stage. This feature can improve data entry efficiency and reduce human errors. It was previously supported in the old Tracker Capture app and has now been re-implemented in Capture in an improved form. Supported in DHIS2 version 2.38 or higher with Capture version 100.21.0 or higher.
Screenshot | Jira

Create a new TEI when no results match: After searching for a tracked entity instance in the Capture app and finding no results, users are now given the option to carry over the search criteria and create a new tracked entity instance. This feature was supported in the old Tracker Capture app and has now been re-implemented in Capture in an improved form. Supported in DHIS2 version 2.38 or higher with Capture version 100.20.0 or higher.
Jira

Hide due date: The Capture app now supports hiding the scheduled date for individual program stages. This feature allows program stages that do not require scheduling or a scheduled date to have those fields hidden, resulting in a cleaner and more streamlined user interface. Supported in DHIS2 version 2.38 or higher with Capture version 100.19.0 or higher.
Screenshot | Jira

Attribute option combination for tracker programs: Capture app now supports attribute action combination for tracker programs. This feature was already supported in the tracker capture app, but has now been redesigned and implemented in the Capture app. Supported in DHIS2 version 2.38 or above, with Capture version 100.30.0 or higher.
Jira

Usability improvements: Several non-functional usability updates have been introduced in the Capture app to provide a better user experience and a smoother look-and-feel. Supported in DHIS2 version 2.38 and above and Capture version 100.29.0 and above.
Jira 1 | Jira 2 | Jira 3 | Jira 4 | Jira 5 | Jira 6

API for downloading files uploaded as tracked entity attributes: A new API endpoint which allows accessing the file resources which are uploaded as tracked entity attribute values is now available. This feature enables users to use files as tracked entity attributes, such as uploading a birth certificate for a child.
Jira

API for downloading tracked entities as CSV: The /tracker API endpoint now supports the functionality to download a tracked entity instance directly as comma-separated values. This feature is useful for importing data in other systems that accept CSV.
Jira

PLATFORM FEATURES

Multi-select option sets for aggregate data entry: The aggregate data entry app now supports multi-select option sets for text values. A new value type MULTI_TEXT is introduced for data elements, which allows users to select multiple options for an option set. This is useful for instance in survey forms, where you can ask users to check multiple boxes for a single question.
Jira

Aggregate Data Exchange app: A new web app for aggregate data exchange is now available. This web app lets users select aggregate data exchanges, preview the data and finally submit the data to the target DHIS 2 instance. This allows for visually inspecting and verifying data which are to be submitted. A dialog will display the summery of the data submission after it has completed. As an example, this is useful in situations where national ministries or organizations need to submit data to international organizations or donors and would like to manually verify and be in complete control of the data which they are submitting.
Screenshot 1| 2 | 3 | Jira | User docs |API docs

Improvements to data integrity: The Data Integrity API is improved to handle the growing number of integrity checks. To avoid exceeding the maximum URL length, the following changes have been implemented:

  • POST endpoints now accept the list of checks as a request body.
  • Identifiers have been shortened.
  • Slow tests have been excluded from wildcard name expansion.
  • 25 new integrity checks
  • Integrity checks for organisation units with same name and parent.
  • Integrity checks for data elements belonging to data sets with different periods types.

Jira 1 | Jira 2 | Jira 3 | Jira 4

Job for refreshing materialized view SQL views: SQL views of type materialized view now has a new Job which can be scheduled to refresh the content of the SQL view. This ensures that the data remains fresh and removes the need for external cron jobs.
Jira (Backend) | Jira (Frontend) | Docs

Jobs can now be grouped to run in sequence: Scheduled jobs can now be grouped to run in sequence, making it easier to create dependencies between jobs and clarify which jobs can be run in parallel. The feature will also soon be available in the Scheduler app.
Jira | Docs

Minimum and maximum (sum in org unit hierarchy) aggregation: Two new aggregation types that allow the minimum or maximum value for a data element, where data is summarized in the organisation unit hierarchy dimension, are now available. The new aggregation types can be defined for data elements in the maintenance app, and affects how the data elements are aggregated in analytics and visualization apps.
Jira

New predictor functions for computing probability: In supply chain applications, knowing the probability of a stock out is crucial. With the new predictor functions for normDistCum and normDistDen, you can compute the probability of a stock-out for normally distributed stock consumption. These functions provide the equivalent of Excel NORM.DIST() and LibreOffice NORMDIST() and allow you to calculate the probability density function (PDF) and cumulative distribution function (CDF) for a given mean and standard deviation.
Jira | Docs

Efficiently create multiple predictors with data element groups: Streamline your work with predictors by applying them to data element groups. This time-saving feature allows you to make multiple predictors, based on the data elements in a group, from a single definition. For instance, if you are tracking data for multiple commodities in supply chain, you can simply apply the predictor to the data element group for each commodity to produce the necessary values.
Jira | Docs

Predictions by disaggregation: A single predictor can be used to independently predict every disaggregation of an output data element based on the same disaggregation of data in the predictor generator expression.
Jira | Docs

PLATFORM API FEATURES

Embedded OpenAPI 3 docs: Working with the API just got a whole lot easier. The server now provides comprehensive OpenAPI documentation that covers all endpoints, allowing users to quickly and easily understand the capabilities of the API. JSON and YAML formats are supported so that you can choose the one that works best for you. If you want to generate a document for a specific endpoint or a selection of root paths and tags, it’s as simple as making a request to the right endpoint. So whether you’re a developer, analyst, or data manager, the OpenAPI feature will help you get the most out of the DHIS2 API.
Docs

New dedicated ping endpoint: A new endpoint for pinging the server has been added. The new endpoint does not require authentication, extend the user session and uses a low amount of resources.
Jira

System info in data summary endpoint: The data summary endpoint now returns information about the current system, including version, revision, build time and system ID.
Jira

Data store now returns sharing information: Data store keys can be shared in the same way metadata is shared. With this change, sharing information is now available in the data store API.
Jira

Event hooks (preview) : The event hook API is a powerful tool that can help you automate your workflows and keep your systems in sync with each other by allowing users to subscribe to two types of events that occur within the DHIS2. Currently, metadata events and scheduled job events are supported. To use the event hook API, you will need to enable it in your DHIS2 configuration file. A web hook consists of a source and a target. The supported target protocols are web hooks, JMS and Kafka. The event hook will publish events immediately, allowing target systems to take action in real-time. For example, you could set up an event hook that listens for changes to data elements in your metadata and then sends a message to a third-party system to update their records accordingly.
Jira | Docs

API routes (preview): The route API enables DHIS2 API requests to be routed to custom or external API services. This feature allows developers to build and expose custom microservices as well as expose external, third-party APIs through the DHIS2 API. These API endpoints can in turn can be used by custom DHIS 2 web apps. This is helpful in order to extend DHIS 2 with functionality that fits best on the server-side, such as heavy data processing, integration jobs and consumption of external services. Users can create routes, execute them and pass query parameters and request bodies. The route API supports GET and POST requests and authentication methods such as Basic Auth and API tokens. Custom authorities for route execution are supported. This feature provides a simple and effective way to use custom and external services DHIS2 in web apps.
Jira | Docs

User impersonation (preview): Users with the appropriate authority can now impersonate other users. This is primarily used internally in DHIS2 for generating reports at the current time, and will be enhanced in the future to support more use cases. User impersonation is disabled by default.
Jira

ANDROID FEATURES

USER EXPERIENCE

Resized dataset tables: This feature allows users to resize the columns in datasets, making it easier to view and work with larger tables. Now it is possible to resize all columns by clicking on the header of the column. The resizing can be done through drag and drop. A maximum and minimum size limit is given for the columns that can be resized to ensure a good layout. Users can resize all columns at once by clicking on the top left of the table.
Jira | Screenshot

New sync error navigation: This version of the app improves the navigation of sync errors on the user interface. The app will display the sync errors in a simple and clean manner allowing the user to navigate from the home screen to the exact field that is causing the error inside the event or data set.
Jira | Screenshot

Collected handwritten signatures for image Data Elements: This feature allows users to collect handwritten signatures from the device. The signatures will be saved as an image data elements in the app.
Jira | Screenshot

Made phone number and email Data Elements actionable in the form and allowed external actions for phone number, email and URL value types: This feature enables users to take action on phone numbers, email addresses, and URLs directly from the app, such as dialing a phone number or opening a web page from the event or enrollment data entry form.
Jira | Screenshot

Improved visual configuration and rendering of option sets: This feature improves the way option sets are displayed and configured when configured visualy by enabling render option sets with any value type as Radio buttons or check box and supporting other value types for visual data entry.
Jira | Jira2 | Screenshot

Added loading banners when actions take a long time to improve user experience: This feature provides visual annimations to users when they perform actions that take longer than usual to complete, such loading maps or searching, so that they know that the system is processing their request.
Jira | Screenshot

Improved user experience for better functionality when offline: This feature enhances the functionality of the app when it is used offline, ensuring that menus are disabled when the online actions are not available.
Jira

Improved management of long texts: This feature enables users to view long text in fields that are limited in size, such as a stage names or datasets headers.
Jira | Jira

SUPPORT MOBILE IMPLEMENTATIONS

Provided support for Android app version control from DHIS2 user interface: This feature enables implementation administrators to manage and control the version of the Android app from the DHIS2 user web interface, making it easier to manage app updates and ensure compatibility with the DHIS2 system. Managers will be able to upload the desired version and users will get a prompt message to update when they are not in the last updated version. The management of versions is made through a new Web App.
Jira | Screenshot

Removed the maximum number of offline accounts: This feature removes the limitation on the number of offline accounts that users can create, allowing them to work with as many offline accounts as needed.
Jira

WEB PARITY

Supported file value type: This feature adds support for file value type in the Android app, allowing users to attach files to their data elements or attributes.
Jira | Screenshot

Supported new tracker working lists (filter by DE): This feature adds support for new tracker working lists that allow users to filter by data elements. The working lists need to be configured in web using the web Capture App. The Android app will download the working lists that are configured and saved on the server side.
Jira

LMIS

Integrated a new module for real stock monitoring use case: This feature adds a new module for real stock monitoring use case to the app, enabling users to manage and monitor their stock levels in real-time. Integrating a module implies that the app will open a completely new and different user interface and experience to respond to a different data entry flow. To use this modules the program will need to be configured using the new web app for program use case configuration.
Jira | Screenshot

MAINTENANCE

Bug fixing: You can find the list of bugs fixed here.

RELEASE INFO

Release Information Link
Download release and sample database Downloads - DHIS2
Upgrade notes Upgrade notes on GitHub
Full list of features and bugs Release Note
Source code on GitHub DHIS2 · GitHub
Docker image docker pull dhis2/core:2.40.0
Docker Hub images Docker
Android App in Google Play or Github Google Play - Github
Android App full list of features and bugs Android Release Notes
Android App Source code on Github DHIS2 Android App · GitHub
Android SDK Source code on Github DHIS2 Android SDK · GitHub
Documentation https://docs.dhis2.org
Demo instance DHIS2 Demo - Sierra Leone
Community forum https://community.dhis2.org/

Thank you!

DHIS2 Core and Android Release Teams

14 Likes

Good news! Need some time to digest this. I am implementing right away in my Dev environment. Can we ask question here for clarification?

2 Likes

Hi @jetisco4u

Yes, you can ask questions related to these releases in this thread.

Kind regards,
Phil

2 Likes

Thanks Guys for this new version.
I think there’s a bug bcause we can’t import a logo when we try to do it we get this error message(MSG1) from the web interface and this one (MSG2)from the log files.

MSG1
![image|626x500](upload://kB2IZRkvgRr1MyqKlwykYUNj5Oe.png)
MSG2 : 
* ERROR 2023-05-11T15:34:48,913 File upload failed:  (JCloudsFileResourceContentStore.java [http-nio-8080-exec-10])
java.lang.RuntimeException: java.io.FileNotFoundException: C:\DHIS2\CONF\files\document\logo_front-80208b99-e5b9-499f-acfd-6743be21d01c (Access is denied)
	at com.google.common.base.Throwables.propagate(Throwables.java:242) ~[guava-31.1-jre.jar:?]
	at org.jclouds.blobstore.config.LocalBlobStore.putBlob(LocalBlobStore.java:806) ~[jclouds-blobstore-2.5.0.jar:2.5.0]
	at org.jclouds.blobstore.config.LocalBlobStore.putBlob(LocalBlobStore.java:533) ~[jclouds-blobstore-2.5.0.jar:2.5.0]
	at jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:578) ~[?:?]
	at com.google.inject.internal.DelegatingInvocationHandler.invoke(DelegatingInvocationHandler.java:50) ~[guice-5.0.1.jar:?]
	at jdk.proxy4.$Proxy325.putBlob(Unknown Source) ~[?:?]
	at org.hisp.dhis.fileresource.JCloudsFileResourceContentStore.saveFileResourceContent(JCloudsFileResourceContentStore.java:235) ~[dhis-service-core-2.40.0.jar:?]
	at org.hisp.dhis.webapi.controller.StaticContentController.updateStaticContent(StaticContentController.java:263) ~[dhis-web-api-2.40.0.jar:?]
	at org.hisp.dhis.webapi.controller.StaticContentController$$FastClassBySpringCGLIB$$bc59b5e3.invoke(<generated>) ~[dhis-web-api-2.40.0.jar:?]
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.25.jar:5.3.25]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793) ~[spring-aop-5.3.25.jar:5.3.25]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.25.jar:5.3.25]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.25.jar:5.3.25]
	at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:67) ~[spring-security-core-5.8.2.jar:5.8.2]
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.25.jar:5.3.25]
	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) ~[spring-aop-5.3.25.jar:5.3.25]
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) ~[spring-aop-5.3.25.jar:5.3.25]
	at org.hisp.dhis.webapi.controller.StaticContentController$$EnhancerBySpringCGLIB$$4a30136c.updateStaticContent(<generated>) ~[dhis-web-api-2.40.0.jar:?]
	at jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[?:?]
	at java.lang.reflect.Method.invoke(Method.java:578) ~[?:?]
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.25.jar:5.3.25]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.25.jar:5.3.25]
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.25.jar:5.3.25]
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.25.jar:5.3.25]
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1071) ~[spring-webmvc-5.3.25.jar:5.3.25]
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:964) ~[spring-webmvc-5.3.25.jar:5.3.25]
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.25.jar:5.3.25]
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.25.jar:5.3.25]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:681) ~[servlet-api.jar:4.0.FR]
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.25.jar:5.3.25]
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764) ~[servlet-api.jar:4.0.FR]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[catalina.jar:9.0.56]
	at org.hisp.dhis.webapi.security.switchuser.DhisSwitchUserFilter.doFilter(DhisSwitchUserFilter.java:63) ~[dhis-web-api-2.40.0.jar:?]
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.25.jar:5.3.25]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[catalina.jar:9.0.56]
	at org.hisp.dhis.webapi.filter.AppOverrideFilter.doFilterInternal(AppOverrideFilter.java:105) ~[dhis-web-api-2.40.0.jar:?]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.25.jar:5.3.25]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[catalina.jar:9.0.56]
	at org.hisp.dhis.webapi.filter.RequestIdentifierFilter.doFilterInternal(RequestIdentifierFilter.java:95) ~[dhis-web-api-2.40.0.jar:?]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.25.jar:5.3.25]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[catalina.jar:9.0.56]
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-websocket.jar:9.0.56]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[catalina.jar:9.0.56]
	at org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(ShallowEtagHeaderFilter.java:106) ~[spring-web-5.3.25.jar:5.3.25]
	at org.hisp.dhis.webapi.filter.ExcludableShallowEtagHeaderFilter.doFilterInternal(ExcludableShallowEtagHeaderFilter.java:130) ~[dhis-web-api-2.40.0.jar:?]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[catalina.jar:9.0.56]
	at org.hisp.dhis.servlet.filter.HttpUrlPatternFilter.doFilter(HttpUrlPatternFilter.java:123) ~[dhis-web-commons-2.40.0.jar:?]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[catalina.jar:9.0.56]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:352) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:117) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:164) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationProcessingFilter.doFilter(OAuth2AuthenticationProcessingFilter.java:182) ~[spring-security-oauth2-2.5.2.RELEASE.jar:?]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:170) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.hisp.dhis.webapi.security.apikey.Dhis2ApiTokenFilter.doFilterInternal(Dhis2ApiTokenFilter.java:117) ~[dhis-web-api-2.40.0.jar:?]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.hisp.dhis.webapi.filter.CorsFilter.doFilter(CorsFilter.java:152) ~[dhis-web-api-2.40.0.jar:?]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:151) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:129) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.hisp.dhis.webapi.filter.CustomAuthenticationFilter.doFilter(CustomAuthenticationFilter.java:90) ~[dhis-web-api-2.40.0.jar:?]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.hisp.dhis.webapi.filter.CspFilter.doFilterInternal(CspFilter.java:105) ~[dhis-web-api-2.40.0.jar:?]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:62) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.session.ForceEagerSessionCreationFilter.doFilterInternal(ForceEagerSessionCreationFilter.java:45) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:361) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:225) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:190) ~[spring-security-web-5.8.2.jar:5.8.2]
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.25.jar:5.3.25]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[catalina.jar:9.0.56]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.25.jar:5.3.25]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[catalina.jar:9.0.56]
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[catalina.jar:9.0.56]
	at org.springframework.orm.hibernate5.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:156) ~[spring-orm-5.3.25.jar:5.3.25]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[catalina.jar:9.0.56]
	at org.hisp.dhis.webapi.security.config.WebMvcMetricsConfig$PassThroughWebMvcMetricsFilter.doFilterInternal(WebMvcMetricsConfig.java:99) ~[dhis-web-api-2.40.0.jar:?]
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.25.jar:5.3.25]
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.25.jar:5.3.25]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[catalina.jar:9.0.56]
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[catalina.jar:9.0.56]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[catalina.jar:9.0.56]
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687) ~[catalina.jar:9.0.56]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[catalina.jar:9.0.56]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[catalina.jar:9.0.56]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382) ~[tomcat-coyote.jar:9.0.56]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-coyote.jar:9.0.56]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895) ~[tomcat-coyote.jar:9.0.56]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732) ~[tomcat-coyote.jar:9.0.56]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-coyote.jar:9.0.56]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-util.jar:9.0.56]
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-util.jar:9.0.56]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-util.jar:9.0.56]
	at java.lang.Thread.run(Thread.java:1623) [?:?]
Caused by: java.io.FileNotFoundException: C:\DHIS2\CONF\files\document\logo_front-80208b99-e5b9-499f-acfd-6743be21d01c (Access is denied)
	at java.io.FileOutputStream.open0(Native Method) ~[?:?]
	at java.io.FileOutputStream.open(FileOutputStream.java:295) ~[?:?]
	at java.io.FileOutputStream.<init>(FileOutputStream.java:236) ~[?:?]
	at com.google.common.io.Files$FileByteSink.openStream(Files.java:195) ~[guava-31.1-jre.jar:?]
	at com.google.common.io.Files$FileByteSink.openStream(Files.java:183) ~[guava-31.1-jre.jar:?]
	at com.google.common.io.ByteSink.writeFrom(ByteSink.java:125) ~[guava-31.1-jre.jar:?]
	at org.jclouds.filesystem.strategy.internal.FilesystemStorageStrategyImpl.putBlob(FilesystemStorageStrategyImpl.java:559) ~[filesystem-2.5.0.jar:2.5.0]
	at org.jclouds.blobstore.config.LocalBlobStore.putBlob(LocalBlobStore.java:795) ~[jclouds-blobstore-2.5.0.jar:2.5.0]
	... 155 more```
2 Likes

It looks like it might be an access issue on your local file-system:

C:\DHIS2\CONF\files\document\logo_front-80208b99-e5b9-499f-acfd-6743be21d01c (Access is denied)

I thought Android 2.8 will address the issue of data element showing a few characters. I was expecting that the text will break into new line and show all the text.

I attached legend to a visualizer pivot table in this 2.40.0. When I expand the legend key instead of expanding out, it was shrinking. It used to be ok in 2.39

@marcos.campos

1 Like

Hi @jetisco4u , @jaime.bosque ,
Unfortunately we didn’t have time to complete this defect for v2.8, but it will be fixed in the next patch version that will be released soon.

1 Like

How does it work? I tried to create a data element with optionset and it shows only one selection.

Thanks for reporting this issue @jetisco4u. I created a JIRA issue for it: [DHIS2-15627] - Jira

1 Like