cht-core
cht-core copied to clipboard
Values of non-relevant fields should be maintained until submission
~As reported in https://github.com/medic/medic-webapp/issues/4111#issuecomment-360304644, clearing non-relevant fields while completing a form is problematic.~
My understanding of relevant
in the ODK specification is that the fields should only be removed when submitting the report, making their values accessible while still editing the form:
relevant
: Specifies whether the question or group is relevant. The question or group will only be presented to the user when the XPath expression evaluates to true(). When false() the data node (and its descendants) are removed from the primary instance on submission.
~Removing the non-relevant fields while editing a form seems to have appeared in the way we use Enketo between 2.13 and 2.14. Aside from improving the user experience, many active projects use forms that depend on this characteristic, likely making this a blocker for 2.14.~
Edit: This is not new, as earlier versions exhibit this problem as well.
cc @sglangevin
It looks like the only benefits of this are for UX and being ODK XForm compliant. Contrary to previously reported we are not already relying on this functionality.
Assigning a low priority on this issue since we do not rely on this functionality at the moment.
@jkuester Can you verify if this is fixed with the latest Enketo?
Short answer is yes, this is "fixed" by https://github.com/medic/cht-core/pull/7256 as was pointed out here. However, as was mentioned in that issue thread, the way this is "fixed" can cause additional weird logic problems in complex forms. So, https://github.com/medic/cht-core/issues/7674 has been logged to fix the fix.
But, I believe we should be able to close out this issue with https://github.com/medic/cht-core/pull/7256 since it will essentially be addressed.
@medic/quality-assurance This is going to be "fixed" by the Enketo uplift https://github.com/medic/cht-core/pull/7256, so it should be ready for AT.
@tatilepizs here is a sample form to use for testing the issue:
<?xml version="1.0"?>
<h:html xmlns="http://www.w3.org/2002/xforms" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jr="http://openrosa.org/javarosa" xmlns:orx="http://openrosa.org/xforms">
<h:head>
<h:title>Enketo Widgets</h:title>
<model>
<itext>
<translation lang="en">
<text id="/enketo_widgets/select_widgets/question_to_check/dk:label">
<value>Don't Know</value>
</text>
<text id="/enketo_widgets/select_widgets/question_to_check/na:label">
<value>Not Applicable</value>
</text>
<text id="/enketo_widgets/select_widgets/question_to_check/no:label">
<value>No</value>
</text>
<text id="/enketo_widgets/select_widgets/question_to_check/yes:label">
<value>Yes</value>
</text>
<text id="/enketo_widgets/select_widgets/question_to_check:label">
<value>Select an answer!</value>
</text>
<text id="/enketo_widgets/select_widgets/trigger/dk:label">
<value>Don't Know</value>
</text>
<text id="/enketo_widgets/select_widgets/trigger/na:label">
<value>Not Applicable</value>
</text>
<text id="/enketo_widgets/select_widgets/trigger/no:label">
<value>No</value>
</text>
<text id="/enketo_widgets/select_widgets/trigger/yes:label">
<value>Yes</value>
</text>
<text id="/enketo_widgets/select_widgets/trigger:label">
<value>Should the previous question be relevant?</value>
</text>
<text id="/enketo_widgets/select_widgets:label">
<value>Select widgets</value>
</text>
</translation>
</itext>
<instance>
<enketo_widgets id="enketo_widgets" prefix="J1!enketo_widgets!" delimiter="#" version="2022-08-11 00:00:00">
<select_widgets>
<question_to_check/>
<trigger>yes</trigger>
</select_widgets>
<meta tag="hidden">
<instanceID/>
</meta>
</enketo_widgets>
</instance>
<instance id="contact-summary"/>
<bind nodeset="/enketo_widgets/select_widgets/question_to_check" type="select1" relevant=" /enketo_widgets/select_widgets/trigger = 'yes'"/>
<bind nodeset="/enketo_widgets/select_widgets/trigger" type="select1"/>
<bind nodeset="/enketo_widgets/meta/instanceID" type="string" readonly="true()" calculate="concat('uuid:', uuid())"/>
</model>
</h:head>
<h:body class="pages">
<group appearance="field-list" ref="/enketo_widgets/select_widgets">
<label ref="jr:itext('/enketo_widgets/select_widgets:label')"/>
<select1 ref="/enketo_widgets/select_widgets/question_to_check">
<label ref="jr:itext('/enketo_widgets/select_widgets/question_to_check:label')"/>
<item>
<label ref="jr:itext('/enketo_widgets/select_widgets/question_to_check/yes:label')"/>
<value>yes</value>
</item>
<item>
<label ref="jr:itext('/enketo_widgets/select_widgets/question_to_check/no:label')"/>
<value>no</value>
</item>
<item>
<label ref="jr:itext('/enketo_widgets/select_widgets/question_to_check/dk:label')"/>
<value>dk</value>
</item>
<item>
<label ref="jr:itext('/enketo_widgets/select_widgets/question_to_check/na:label')"/>
<value>na</value>
</item>
</select1>
<select1 ref="/enketo_widgets/select_widgets/trigger">
<label ref="jr:itext('/enketo_widgets/select_widgets/trigger:label')"/>
<item>
<label ref="jr:itext('/enketo_widgets/select_widgets/trigger/yes:label')"/>
<value>yes</value>
</item>
<item>
<label ref="jr:itext('/enketo_widgets/select_widgets/trigger/no:label')"/>
<value>no</value>
</item>
<item>
<label ref="jr:itext('/enketo_widgets/select_widgets/trigger/dk:label')"/>
<value>dk</value>
</item>
<item>
<label ref="jr:itext('/enketo_widgets/select_widgets/trigger/na:label')"/>
<value>na</value>
</item>
</select1>
</group>
</h:body>
</h:html>
Basically just need to pay attention to what happens to the value for the first question (question_to_check
).
Config: Default Environment: Local with docker helper script Platform: WebApp Browser: Chrome
The file used to test was provided by @jkuester in this comment
Reproducible on Master
When the question question_to_check
was answered and becomes irrelevant, and then later becomes relevant again, it loses its data.
Test video
Fixed on 6345-enketo-uplift
When the question question_to_check
was answered and becomes irrelevant, and then later becomes relevant again, it keeps its previous data.