How to conditionally display forms

@darius In Uganda we have an initiation encounter for ART used to collect baseline information for treatment. Once this happens then a patient will have other encounters for counseling and regular visits (monthly - to pick up drugs and get a checkup).

Limiting forms for counseling and other visits not to display until the initiation encounter has happened will reduce the incidences of missing data.

@darius
@ssmusoke @mksrom

i get this error from travis after pushing changes to my repo.

http://pastebin.com/r15PZDcU

and the detailed travis log is https://travis-ci.org/openmrs/openmrs-module-coreapps/builds/194749572

I have looked at the problems and they are

1:Could not find Symbol SimpleObject 2:Could not find Symbol ConversionUtil

was wondering how to get ConversionUtil into VisitTypeContextModel from webservices.rest module… Any way i can rectify this

@tendomart The SimpleObject class is not imported in the VisitContextModel class. Did you run an mvn clean install before pushing your commit?

Why are you using the SimpleObject and not a String for the name of the visit type?

@ssmusoke no i did not run mvn clean install,the directions or atleast the hint given earlier in this post seem to point in that direction.I had earlier used visit type but refactored because of what i read from this thread… Consider what darius said earlier in this post here is the link to github https://github.com/openmrs/openmrs-module-coreapps/pull/51

i refactored as at http://pastebin.com/kzpfF4c0

and running a mvn clean install before committing throws this http://pastebin.com/QgYKBDgB

i read through the lines but am stuck on what to do…a little help here

@tendomart your class does not import the external classes referred to. I do think that the visitType has to be a String - but I am not an expert on the context models.

@ssmusoke thanks i appreciate,that insight

Hi I did start working on this. I think that onversionUtil.convertToRepresentation() is in the artifact webservices.rest-omod-common.

However adding it as a dependency to coreapps pom causes my mvn tests to fail:

Running org.openmrs.module.coreapps.htmlformentry.EncounterDispositionTagHandlerComponentTest
ERROR - TestContextManager.prepareTestInstance(309) |2017-03-26 14:30:33,571| Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@33b92d63] to prepare test instance [org.openmrs.module.coreapps.htmlformentry.EncounterDispositionTagHandlerComponentTest@69339b3b]
java.lang.IllegalStateException: Failed to load ApplicationContext
	at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:99)
	at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:122)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:307)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:284)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)
	at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'mainResourceController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.openmrs.module.webservices.rest.web.api.RestService org.openmrs.module.webservices.rest.web.v1_0.controller.MainResourceController.restService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.openmrs.module.webservices.rest.web.api.RestService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1146)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:628)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
	at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:120)
	at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
	at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100)
	at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:248)
	at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64)
	at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91)
	... 26 more
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.openmrs.module.webservices.rest.web.api.RestService org.openmrs.module.webservices.rest.web.v1_0.controller.MainResourceController.restService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.openmrs.module.webservices.rest.web.api.RestService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:517)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286)
	... 42 more

I add these in the parent pom:

<properties>
    <webservicesRestVersion>2.8</webservicesRestVersion>
</properties>

<dependencyManagement>
  <dependency>
		<groupId>org.openmrs.module</groupId>
		<artifactId>webservices.rest-omod-common</artifactId>
		<version>${webservicesRestVersion}</version>
		<scope>provided</scope>
</dependency>
</dependencyManagement>

and in coreapps/api/pom.xml:

<dependency>
         <groupId>org.openmrs.module</groupId>
          <artifactId>webservices.rest-omod-common</artifactId>
</dependency>

Any insights on what I’m doing wrong?

I see two SimpleObject classes, org.openmrs.module.webservices.rest.SimpleObject and org.openmr.ui.framework.SimpleObject

And the one from the rest module does not include any constructors that accepts other object types, but one in the UI module does have a constructor that accepts OpenmrsMetadata for constructing a SimpleObject.

And visitType also implements OpenmrsMetada

So can’t we use:

this.visitType = new org.openmrs.ui.framework.SimpleObject(visitType);

instead of using ConversionUtil from the rest module. BTW rest.webservices module is not included as a dependency in the coreapps module.

PR: https://github.com/openmrs/openmrs-module-coreapps/pull/80

@darius Hi could you please spare a moment to look into my above post to check whether the followed approached is correct.

@dkayiwa and I were discussing about the issue on here.

@gayanw did you actually look at that constructor to see that it gets only the id and label but ignore the rest? Is this what you want to happen? :slight_smile:

Yes it is. See here in config.xml.

I guess that so far this dependency only used from JS code. So, to use it in Java code you’re going to need to add a maven dependency in pom.xml

And, you have to use the SimpleObject class from webservices.rest, with the convertToRepresentation method. (SimpleObject in uiframework is something completely different.)

@ssmusoke Did you get to implement this?

@aeze is this one of your other requirements?

@ssmusoke did you get to implement this? We currently have similar experience in Nigeria and looking to know if you or anyone have done this.

@caniekwe Please describe in more detail what you are trying to do

@ssmusoke @dkayiwa In Nigeria, we have forms we expect to be completed before documenting other forms. For example, We have an enrollment form that collects certain patients baseline information, we want to enforce these forms are completed on the initial encounter before any other encounter details or forms can be completed for the patient. we want to be able to do the following:

  1. Disable all other forms until this baseline form is completed and
  2. Ensure this form is not completed twice
  1. We have an ART Summary Encounter which is the enrollment encounter, which is only done once - so we use the code here to return the user to the dashboard if this encounter has not been completed
  1. For the ART Summary page, we check if this encounter has been entered and forward to the edit version of the page, only one version therefore can exist

These are gleamed from OpenMRS HTML Form Entry module Javascript reference

https://wiki.openmrs.org/display/docs/HTML+Form+Entry+JavaScript+Reference

Thank you @ssmusoke. we will try this and see if this works for our implementation. @nsanmi

@caniekwe remember to change the uuids to what you have and let me know if your run into any issues