cht-core icon indicating copy to clipboard operation
cht-core copied to clipboard

Values of non-relevant fields should be maintained until submission

Open abbyad opened this issue 7 years ago • 7 comments

~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

abbyad avatar Jan 25 '18 22:01 abbyad

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.

abbyad avatar Jan 26 '18 23:01 abbyad

Assigning a low priority on this issue since we do not rely on this functionality at the moment.

vimemo avatar Feb 26 '18 15:02 vimemo

@jkuester Can you verify if this is fixed with the latest Enketo?

garethbowen avatar Jul 25 '22 05:07 garethbowen

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.

jkuester avatar Jul 25 '22 20:07 jkuester

@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.

jkuester avatar Jul 25 '22 20:07 jkuester

@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).

jkuester avatar Aug 11 '22 21:08 jkuester

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

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.

Test video

video

tatilepizs avatar Aug 11 '22 22:08 tatilepizs