medic / cht-core

The CHT Core Framework makes it faster to build responsive, offline-first digital health apps that equip health workers to provide better care in their communities. It is a central resource of the Community Health Toolkit.
https://communityhealthtoolkit.org
GNU Affero General Public License v3.0
438 stars 209 forks source link

Fields to be populated by a `db-object` must have UI inputs, or `calculate="."` #4248

Closed abbyad closed 6 years ago

abbyad commented 6 years ago

Issue originally from https://github.com/medic/medic-projects/issues/3500

abbyad commented 6 years ago

Fields associated to a db-object must have an input in the XForm for their values to be set. This means that we can use the hidden appearance, but not the hidden type as instructed in https://github.com/medic/medic-webapp/issues/4134.

abbyad commented 6 years ago

Renamed to reflect the actual issue. The medic-project issue is now separate because it deals with updating the forms so that they work in 2.14.

abbyad commented 6 years ago

If we cannot easily correct this then we need to document this appropriately.

abbyad commented 6 years ago

Labelled as a bug because I would have expected to be able to use a hidden type for these fields, but we can still choose not to fix and document appropriately.

Screenshot

The name should appear in both notes, but only appears if there is a UI input in 2.14.0-beta.15, which is done using appearance hidden. image

Example form

<?xml version="1.0"?>
<h:html xmlns="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:jr="http://openrosa.org/javarosa" xmlns:orx="http://openrosa.org/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <h:head>
    <h:title>Test Issue 4248: db:person populating associated fields</h:title>
    <model>
      <instance>
        <issue_4248 delimiter="#" id="issue_4248" prefix="J1!issue_4248!" version="2018-02-28 12-20">
          <person1>
            <_id/>
            <name/>
            <name1/>
            <note/>
          </person1>
          <person2>
            <_id/>
            <name/>
            <name2/>
            <note/>
          </person2>
          <meta>
            <instanceID/>
          </meta>
        </issue_4248>
      </instance>
      <instance id="contact-summary"/>
      <bind nodeset="/issue_4248/person1/_id" required="true()" type="db:person"/>
      <bind nodeset="/issue_4248/person1/name" type="string"/>
      <bind calculate="../name" nodeset="/issue_4248/person1/name1" type="string"/>
      <bind nodeset="/issue_4248/person1/note" readonly="true()" type="string"/>
      <bind nodeset="/issue_4248/person2/_id" required="true()" type="db:person"/>
      <bind nodeset="/issue_4248/person2/name" type="string"/>
      <bind calculate="../name" nodeset="/issue_4248/person2/name2" type="string"/>
      <bind nodeset="/issue_4248/person2/note" readonly="true()" type="string"/>
      <bind calculate="concat('uuid:', uuid())" nodeset="/issue_4248/meta/instanceID" readonly="true()" type="string"/>
    </model>
  </h:head>
  <h:body>
    <group ref="/issue_4248/person1">
      <label>Test 1: hidden appearance</label>
      <input appearance="db-object" ref="/issue_4248/person1/_id">
        <label>What is the patient's name?</label>
        <hint>Select a person from list</hint>
      </input>
      <input appearance="hidden" ref="/issue_4248/person1/name">
        <label></label>
      </input>
      <input ref="/issue_4248/person1/note">
        <label>Person's name is '<output value=" /issue_4248/person1/name1 "/>'</label>
      </input>
    </group>
    <group ref="/issue_4248/person2">
      <label>Test 2: hidden type</label>
      <input appearance="db-object" ref="/issue_4248/person2/_id">
        <label>What is the patient's name?</label>
        <hint>Select a person from list</hint>
      </input>
      <input ref="/issue_4248/person2/note">
        <label>Person's name is '<output value=" /issue_4248/person2/name2 "/>'</label>
      </input>
    </group>
  </h:body>
</h:html>
abbyad commented 6 years ago

This appears to be because the HTML inputs are updated directly here: https://github.com/medic/medic-webapp/blob/4457404d43e66f5f98b8ae497338e14f8de33f84/static/js/enketo/widgets/db-object-widget.js#L104-L106

@alxndrsn, I am guessing that it isn't feasible to update the value in the data model directly?

abbyad commented 6 years ago

If there are no UI elements it can still get populated if there is a calculate="." which means that UI elements are not strictly required for fields to a db-object. We thought we shouldn't be doing this because of #4134 (but perhaps need to reevaluate that). Regardless, this needs more investigation to figure out what is and is not possible.

abbyad commented 6 years ago

Summarizing some info here for reference, and to help figure this out.

Field values can be set in the following ways:

Typical XForms

INPUT: Manually entered using UI input fields. CALCULATE: Any field type can be set using an XPath expression.

Medic Mobile specific

PRE-LOADED: The inputs group of an XForm can be pre-loaded with values from the task or contact that opens the form. For example, when accessing a form from a contact profile the contact's doc prepopulates matching inputs.contact.* fields. The pre-loading occurs regardless of field type, visibility, or calculations, even if the field is of hidden type DB-OBJECT LOADED: A db-object is a select2 which gets the doc for the selected _id, and binds values from the doc to adjacent fields with names matching the doc's keys. The db-object loading does not work if the type is hidden, unless they have calculate="."

Known Issue

Current situation: We have been using the inputs group for pre-loaded data. If accessing the same form from the History tab we don't know the context so cannot preload. In that case a db-object within the inputs group is visible to the user, and once selected populates the inputs.contact.* fields.

Problem: If fields are PRE-LOADED and have calculate="." they will lose their value on page turn (which forces a recalculation, and the pre-loaded values are lost -- #4134). Meanwhile, db-object loading needs the field to either be in the UI or have calculate="." -- cannot be of hidden type -- #4248. Given these contradictory requirements, we can't reliably use the same group for pre-loading and db-object loading.

Some possible solutions: 1) Don't complete forms from the Reports/History tab. We'd need to see how often forms are being used this way, but seems unlikely that we can remove this ability completely. 1) Use different forms depending on where it is accessed from. I'd foresee this being a mess to maintain. 1) Use separate input groups for pre-loading and db-object loading, then coalesce the values. This means tripling the number of inputs. The Standard pregnancy visit form has 8 input fields in 15 XLSForm rows (due to nested groups). 1) Figure out how to do db-object loading even if there is no UI element and no calculate for the field. Seems ideal, but may not be feasible. 1) Have the app manipulate the inputs section based on how the form is loaded. Seems messy

abbyad commented 6 years ago

A relatively simple short term solution until this is resolved is to make the associated fields strings with a hidden appearance. I'll test and confirm soon.

alxndrsn commented 6 years ago

make the associated fields strings with a hidden appearance

This sounds correct, but perhaps some example XML or XLS (current behaviour vs desired) would make it clearer why it's not...

abbyad commented 6 years ago

Here is an XLSForm example with three ways the fields associated to a db-object are structured: 1) hidden type: field is not populated by db-object, but this is the desired way since it ODK XForm standard compliant and cleanest 1) hidden appearance: works currently, and should continue to work, but bloats the form with unused inputs and labels, eg <input appearance="hidden" ref="/issue_4248_b/inputs/contact/sex"><label>Sex</label></input>. 1) calculate=".": a XLSForm hack used to prevent UI elements until the hidden type was discovered. Exists in contact forms in many projects. As of 2.14 value is cleared on page turn, but we can completely discontinue use of this method.

image

I think that relying on method 2 is acceptable for 2.14. Given that hidden types could be confusing for those completing forms since they will appear to work in some cases, we should consider making hidden types work with db-objects in future releases. In the meantime we will need to make sure this is incredibly evident in the documentation for db-objects.


Reference

From Reports tab: Method 1 hidden type never populated

image

From People tab: Method 3 calculate="." erases value on page turn

image

image

XForm

<?xml version="1.0"?>
<h:html xmlns="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:jr="http://openrosa.org/javarosa" xmlns:orx="http://openrosa.org/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <h:head>
    <h:title>Test Issue 4248 B: Populating fields associated to db-object</h:title>
    <model>
      <instance>
        <issue_4248_b delimiter="#" id="issue_4248_b" prefix="J1!issue_4248_b!" version="2018-03-05 9-07">
          <inputs>
            <meta>
              <location>
                <lat/>
                <long/>
                <error/>
                <message/>
              </location>
            </meta>
            <source>user</source>
            <source_id/>
            <contact>
              <_id/>
              <patient_id/>
              <name/>
              <date_of_birth>0</date_of_birth>
              <sex/>
              <phone/>
            </contact>
          </inputs>
          <page2>
            <page2_note/>
          </page2>
          <page3>
            <page3_note/>
          </page3>
          <meta>
            <instanceID/>
          </meta>
        </issue_4248_b>
      </instance>
      <instance id="contact-summary"/>
      <bind nodeset="/issue_4248_b/inputs" relevant="./source = 'user'"/>
      <bind nodeset="/issue_4248_b/inputs/source" type="string"/>
      <bind nodeset="/issue_4248_b/inputs/source_id" type="string"/>
      <bind nodeset="/issue_4248_b/inputs/contact/_id" required="true()" type="db:person"/>
      <bind nodeset="/issue_4248_b/inputs/contact/patient_id" type="string"/>
      <bind nodeset="/issue_4248_b/inputs/contact/name" type="string"/>
      <bind nodeset="/issue_4248_b/inputs/contact/date_of_birth" type="string"/>
      <bind nodeset="/issue_4248_b/inputs/contact/sex" type="string"/>
      <bind calculate="." nodeset="/issue_4248_b/inputs/contact/phone" type="string"/>
      <bind nodeset="/issue_4248_b/page2/page2_note" readonly="true()" type="string"/>
      <bind nodeset="/issue_4248_b/page3/page3_note" readonly="true()" type="string"/>
      <bind calculate="concat('uuid:', uuid())" nodeset="/issue_4248_b/meta/instanceID" readonly="true()" type="string"/>
    </model>
  </h:head>
  <h:body class="pages">
    <group appearance="field-list" ref="/issue_4248_b/inputs">
      <label>Patient</label>
      <group ref="/issue_4248_b/inputs/contact">
        <input appearance="db-object" ref="/issue_4248_b/inputs/contact/_id">
          <label>What is the patient's name?</label>
        </input>
        <input appearance="hidden" ref="/issue_4248_b/inputs/contact/sex">
          <label>Sex</label>
        </input>
      </group>
    </group>
    <group ref="/issue_4248_b/page2">
      <label>Page 2</label>
      <input ref="/issue_4248_b/page2/page2_note">
        <label>[db-object] id: <output value=" /issue_4248_b/inputs/contact/_id "/>
[hidden type] name: <output value=" /issue_4248_b/inputs/contact/name "/> 
[hidden appearance] sex: <output value=" /issue_4248_b/inputs/contact/sex "/>
[calculate=&quot;.&quot;] phone: <output value=" /issue_4248_b/inputs/contact/phone "/></label></input>
    </group>
    <group ref="/issue_4248_b/page3">
      <label>Page 3</label>
      <input ref="/issue_4248_b/page3/page3_note">
        <label>[db-object] id: <output value=" /issue_4248_b/inputs/contact/_id "/>
[hidden type] name: <output value=" /issue_4248_b/inputs/contact/name "/> 
[hidden appearance] sex: <output value=" /issue_4248_b/inputs/contact/sex "/>
[calculate=&quot;.&quot;] phone: <output value=" /issue_4248_b/inputs/contact/phone "/></label></input>
    </group>
  </h:body>
</h:html>
SCdF commented 6 years ago

This is happening because db-object is writing to the DOM instead of Enketo, and the DOM elements required to write to only exist if you either have an explicit hidden field, or one is generated implicitly due to a calculate bind.

SCdF commented 6 years ago

Two possible ways of solving this:

SCdF commented 6 years ago

This is also a useful link for finding the values at run-time, though I'm not sure it's helpful finding them inside the widget: http://medicmobile.cloud.answerhub.com/questions/209/how-can-i-debug-the-values-of-a-xform-in-progress.html

There are also lots of example widgets that might be helpful in enketo-core/src/widget, though I haven't found one that makes this clearer.

^ @garethbowen there is as much info as I managed today, if you get to it that's awesome, otherwise I'll try to work out how to interact with Enketo from inside the widget tomorow

SCdF commented 6 years ago

Brainwave: we can alter pyxform to always generate hidden fields if there are going to be no visible ones. This would mean we would always already have something to write into. I have no idea what else that would effect, I feel like it would be fine?

garethbowen commented 6 years ago

I've come up with a solution to update the model directly.

Firstly I modified the Enketo service to store the current form as a global so I can access it from the widget. Add this to the renderFromXmls function:

var form = new EnketoForm(wrapper.find('form').first(), options);
window.currentForm = form;

We'd have to find a better way to access the current form but this is merely a proof-of-concept for now.

Then modify the db object widget so instead of updating the DOM we do this...

currentForm.model.node('/pregnancy_visit/inputs/contact/patient_id').setVal('12345');

This is hardcoded to a test form I'm working with (below) - we'd need to iterate through the properties and bind where possible.

This works by binding into the inputs element which is the element that gets prepopulated when loading the form from the contact tab. This means loading from the reports tab and selecting a patient works just the same as going to the contacts tab and selecting a patient then filing the form.

My demo form:

<?xml version="1.0"?>
<h:html xmlns="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:jr="http://openrosa.org/javarosa" xmlns:orx="http://openrosa.org/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <h:head>
    <h:title>Pregnancy Visit</h:title>
    <model>
      <itext>
        <translation lang="hi">
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d8:label">
            <value>पेशाब में खून या दर्दनाक, जलता हुआ पेशाब</value>
          </text>
          <text id="/pregnancy_visit/patient_name:label">
            <value>मरीज़ का नाम</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs:label">
            <value>ख़तरे के संकेत</value>
          </text>
          <text id="/pregnancy_visit/group_note/default_chw_sms/highrisk:label">
            <value>शाबाश, <output value=" /pregnancy_visit/chw_name "/>! <output value=" /pregnancy_visit/patient_name "/> (<output value=" /pregnancy_visit/group_review/r_patient_id "/>) अपने गर्भावस्था जांच के लिए स्वास्थ्य केंद्र आ चुकी है | कृपया ध्यान दें के <output value=" /pregnancy_visit/patient_name "/> को एक या अधिक खतरे के संकेत है एक जोखिम वाला गर्भावस्था के लिए | उनकी अगली जांच से पहले हम आपको संदेश भेजेंगे | धन्यवाद!</value>
          </text>
          <text id="/pregnancy_visit/group_note/is_sms_edited:label">
            <value>क्या आप सन्देश में कुछ जोड़ना या बदलना चाहते है?</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign1:label">
            <value>पेट में दर्द, दबाव या ऐंठन</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_followup_note1:label">
            <value>** ये SMS के रूप में <output value=" /pregnancy_visit/chw_name "/> <output value=" /pregnancy_visit/chw_phone "/> को भेजा जायेगा **</value>
          </text>
          <text id="/pregnancy_visit/chw_phone:label">
            <value>सामुदायिक स्वास्थ्य कर्मी का फोन नंबर</value>
          </text>
          <text id="/pregnancy_visit/group_note/default_chw_sms:label">
            <value>-</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign9:label">
            <value>दस्त जो कम नहीं होता</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_followup:label">
            <value>सुनिश्चित करने के लिए सन्देश &lt;i class="fa fa-envelope"&gt;&lt;/i&gt;</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d4:label">
            <value>38 डिग्री या अधिक का बुखार</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs:hint">
            <value>सभी का चयन करें जो लागू होता हो</value>
          </text>
          <text id="/pregnancy_visit/group_chw_info/attended_anc:label">
            <value>क्या <output value=" /pregnancy_visit/patient_name "/> एएनसी जाँच पूरी हुई ?</value>
          </text>
          <text id="/pregnancy_visit/inputs/contact/_id:hint">
            <value>सूची से एक व्यक्ति का चयन करें</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_referral:label">
            <value>ख़तरे के संकेत &lt;i class="fa fa-warning"&gt;&lt;/i&gt;</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d9:label">
            <value>दस्त जो कम नहीं होता</value>
          </text>
          <text id="/pregnancy_visit/patient_age_in_years:label">
            <value>वर्षों</value>
          </text>
          <text id="/pregnancy_visit/inputs/contact/_id:label">
            <value>मरीज का नाम क्या है?</value>
          </text>
          <text id="/pregnancy_visit/chw_name:label">
            <value>सामुदायिक स्वास्थ्य कर्मी का नाम</value>
          </text>
          <text id="/pregnancy_visit/group_note/is_sms_edited/yes:label">
            <value>हाँ</value>
          </text>
          <text id="/pregnancy_visit/referral_follow_up_needed:label">
            <value>मरीज को स्वास्थ्य केंद्र भेजें।</value>
          </text>
          <text id="/pregnancy_visit/group_note/is_sms_edited/no:label">
            <value>नहीं</value>
          </text>
          <text id="/pregnancy_visit/danger_signs:label">
            <value>ख़तरे के संकेत</value>
          </text>
          <text id="/pregnancy_visit/group_chw_info/call_button:label">
            <value>**कृपया सुनिश्चित करें <output value=" /pregnancy_visit/chw_name "/> की <output value=" /pregnancy_visit/patient_name "/> एएनसी की जाँच पूरी की गयी.** कॉल: <output value=" /pregnancy_visit/chw_phone "/>&quot;</value>
          </text>
          <text id="/pregnancy_visit/group_note/g_chw_sms:label">
            <value>यह सन्देश ऐसे ही भेजा जा सकता है या आप इस को बदल कर भी भेज सकते है</value>
          </text>
          <text id="/pregnancy_visit/group_review/submit:label">
            <value>**सुनिश्चित करें के यह कार्रवाई पूरा करने के लिए आप सबमिट दबाये |**</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign8:label">
            <value>पेशाब में खून या दर्दनाक, जलता हुआ पेशाब</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign3:label">
            <value>गंभीर उबकाई या उल्टी</value>
          </text>
          <text id="/pregnancy_visit/patient_id:label">
            <value>मरीज़ का ID</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_pregnancy_details:label">
            <value>**<output value=" /pregnancy_visit/patient_name "/>**
ID: <output value=" /pregnancy_visit/group_review/r_patient_id "/></value></text>
          <text id="/pregnancy_visit/group_chw_info/attended_anc/yes:label">
            <value>हाँ</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d2:label">
            <value>योनि से खून या द्रव पदार्थ का बहाव, या खराब बू के साथ योनि से बहाव</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d7:label">
            <value>बच्चे का कम हिलना या लात मारना</value>
          </text>
          <text id="/pregnancy_visit/inputs:label">
            <value>मरीज़</value>
          </text>
          <text id="/pregnancy_visit/patient_phone:label">
            <value>मरीज़ का फोन नंबर</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_visit_no:label">
            <value>गर्भावस्था की जाँच पूरी नहीं हुई</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs:label">
            <value><output value=" /pregnancy_visit/chw_name "/> के साथ पुष्टि करें के क्या <output value=" /pregnancy_visit/patient_name "/> को इनमें से कोई खतरा है |</value>
          </text>
          <text id="/pregnancy_visit/group_note/default_chw_sms/default:label">
            <value>शाबाश, <output value=" /pregnancy_visit/chw_name "/>! <output value=" /pregnancy_visit/patient_name "/> (<output value=" /pregnancy_visit/group_review/r_patient_id "/>) अपने गर्भावस्था जांच के लिए स्वास्थ्य केंद्र आ चुकी है | कृपया उनकी देख भाल जारी रखें और खतरे के संकेत पे निगरानी रखें | उनकी अगली जांच से पहले हम आपको संदेश भेजेंगे | धन्यवाद!</value>
          </text>
          <text id="/pregnancy_visit/group_note:label">
            <value>सामुदायिक स्वास्थ्य कर्मी के लिए नोट</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d3:label">
            <value>गंभीर उबकाई या उल्टी</value>
          </text>
          <text id="/pregnancy_visit/chw_sms:label">
            <value>सामुदायिक स्वास्थ्य कर्मी का नोट</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d6:label">
            <value>अचानक वजन का बढ़ना या पैर, टखनों, चेहरे या हाथों में गंभीर सूजन</value>
          </text>
          <text id="/pregnancy_visit/group_chw_info/chw_information:label">
            <value>गर्भावस्था की जाँच <output value=" /pregnancy_visit/patient_name "/> के लिए दर्ज नहीं किया गया है</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_followup_note2:label">
            <value><output value=" /pregnancy_visit/group_note/g_chw_sms "/></value>
          </text>
          <text id="/pregnancy_visit/group_chw_info:label">
            <value>लापता जांच की रिपोर्टों</value>
          </text>
          <text id="/pregnancy_visit/patient_uuid:label">
            <value>मरीज़ UUID</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_summary:label">
            <value>मरीज़ की जानकारी,&lt;i class="fa fa-user"&gt;&lt;/i&gt;</value>
          </text>
          <text id="/pregnancy_visit/group_note/g_chw_sms:jr:constraintMsg">
            <value>आपका सन्देश 5 SMS से ऊपर नहीं हो सकता है | कृपया SMS का मूल्य को कम करने के लिए अपना सन्देश छोटा करें |</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d1:label">
            <value>पेट में दर्द, दबाव या ऐंठन</value>
          </text>
          <text id="/pregnancy_visit/group_note/g_chw_sms:hint">
            <value>संदेश <output value=" /pregnancy_visit/chw_name "/> (<output value=" /pregnancy_visit/chw_phone "/>) को भेजा जायेगा | संदेश की लंबाई सीमित है ताकी SMS का मूल्य उच्च ना हो|</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d5:label">
            <value>गंभीर सिरदर्द या नए, धुंधली दृष्टि की समस्याएं</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_visit_unknown:label">
            <value>गर्भावस्था की जांच की स्थिति पता नहीं</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign4:label">
            <value>38 डिग्री या अधिक का बुखार</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign6:label">
            <value>अचानक वजन का बढ़ना या पैर, टखनों, चेहरे या हाथों में गंभीर सूजन</value>
          </text>
          <text id="/pregnancy_visit/group_chw_info/attended_anc/no:label">
            <value>नहीं</value>
          </text>
          <text id="/pregnancy_visit/group_note/default_chw_sms/did_not_attend:label">
            <value>नमस्ते <output value=" /pregnancy_visit/chw_name "/>, <output value=" /pregnancy_visit/patient_name "/> (<output value=" /pregnancy_visit/group_review/r_patient_id "/>) अपने गर्भावस्था जांच के लिए स्वास्थ्य केंद्र नहीं आयी | कृपया उनकी देख भाल जारी रखें और खतरे के संकेत पे निगरानी रखें | उनकी अगली जांच से पहले हम आपको संदेश भेजेंगे | धन्यवाद!</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign2:label">
            <value>योनि से खून या द्रव पदार्थ का बहाव, या खराब बू के साथ योनि से बहाव</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_visit:label">
            <value>जाँच की जानकारी&lt;i class="fa fa-plus-square"&gt;&lt;/i&gt;</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign7:label">
            <value>बच्चे का कम हिलना या लात मारना</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_visit_yes:label">
            <value>गर्भावस्था की जाँच पूरी हुई</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign5:label">
            <value>गंभीर सिरदर्द या नए, धुंधली दृष्टि की समस्याएं</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_referral_note:label">
            <value>**खतरे की सूचना होने पर उसे स्वास्थ्य केंद्र भेजें.**</value>
          </text>
        </translation>
        <translation lang="en">
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d8:label">
            <value>Blood in the urine or painful, burning urination</value>
          </text>
          <text id="/pregnancy_visit/patient_name:label">
            <value>Patient Name</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs:label">
            <value>Danger Signs</value>
          </text>
          <text id="/pregnancy_visit/group_note/default_chw_sms/highrisk:label">
            <value>Nice work, <output value=" /pregnancy_visit/chw_name "/>! <output value=" /pregnancy_visit/patient_name "/> (<output value=" /pregnancy_visit/group_review/r_patient_id "/>) has attended ANC at the health facility. Please note that <output value=" /pregnancy_visit/patient_name "/> has one or more danger signs for a high risk pregnancy. We will send you a message when they are due for their next visit. Thank you!</value>
          </text>
          <text id="/pregnancy_visit/group_note/is_sms_edited:label">
            <value>Would you like to edit or add info to the message?</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign1:label">
            <value>Pain or cramping in abdomen</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_followup_note1:label">
            <value>**The following will be sent as a SMS to <output value=" /pregnancy_visit/chw_name "/> <output value=" /pregnancy_visit/chw_phone "/>**</value>
          </text>
          <text id="/pregnancy_visit/chw_phone:label">
            <value>CHW Phone</value>
          </text>
          <text id="/pregnancy_visit/group_note/default_chw_sms:label">
            <value>Default SMS to send to CHW</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign9:label">
            <value>Diarrhea that doesn't go away</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_followup:label">
            <value>Follow Up Message &lt;i class="fa fa-envelope"&gt;&lt;/i&gt;</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d4:label">
            <value>Fever of 38 degrees or higher</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs:hint">
            <value>Select all that apply</value>
          </text>
          <text id="/pregnancy_visit/group_chw_info/attended_anc:label">
            <value>Did <output value=" /pregnancy_visit/patient_name "/> attend her ANC visit?</value>
          </text>
          <text id="/pregnancy_visit/inputs/contact/_id:hint">
            <value>Select a person from list</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_referral:label">
            <value>Danger Signs&lt;i class="fa fa-warning"&gt;&lt;/i&gt;</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d9:label">
            <value>Diarrhea that doesn't go away</value>
          </text>
          <text id="/pregnancy_visit/patient_age_in_years:label">
            <value>Years</value>
          </text>
          <text id="/pregnancy_visit/inputs/contact/_id:label">
            <value>What is the patient's name?</value>
          </text>
          <text id="/pregnancy_visit/chw_name:label">
            <value>CHW Name</value>
          </text>
          <text id="/pregnancy_visit/group_note/is_sms_edited/yes:label">
            <value>Yes</value>
          </text>
          <text id="/pregnancy_visit/referral_follow_up_needed:label">
            <value>Refer Patient</value>
          </text>
          <text id="/pregnancy_visit/group_note/is_sms_edited/no:label">
            <value>No</value>
          </text>
          <text id="/pregnancy_visit/danger_signs:label">
            <value>Danger Signs</value>
          </text>
          <text id="/pregnancy_visit/group_chw_info/call_button:label">
            <value>**Please follow up with <output value=" /pregnancy_visit/chw_name "/> to see if <output value=" /pregnancy_visit/patient_name "/> attended her ANC visit.**
Call: <output value=" /pregnancy_visit/chw_phone "/></value></text>
          <text id="/pregnancy_visit/group_note/g_chw_sms:label">
            <value>The following message can be sent as is or modified to add a personal note</value>
          </text>
          <text id="/pregnancy_visit/group_review/submit:label">
            <value>**Be sure you Submit to complete this action.**</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign8:label">
            <value>Blood in the urine or painful, burning urination</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign3:label">
            <value>Severe nausea or vomiting</value>
          </text>
          <text id="/pregnancy_visit/patient_id:label">
            <value>Patient ID</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_pregnancy_details:label">
            <value>**<output value=" /pregnancy_visit/patient_name "/>**
ID: <output value=" /pregnancy_visit/group_review/r_patient_id "/></value></text>
          <text id="/pregnancy_visit/group_chw_info/attended_anc/yes:label">
            <value>Yes</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d2:label">
            <value>Bleeding or fluid leaking from vagina or vaginal discharge with bad odour</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d7:label">
            <value>Less movement and kicking from the baby</value>
          </text>
          <text id="/pregnancy_visit/inputs:label">
            <value>Patient</value>
          </text>
          <text id="/pregnancy_visit/patient_phone:label">
            <value>Patient Phone</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_visit_no:label">
            <value>Pregnancy visit not completed</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs:label">
            <value>Confirm with <output value=" /pregnancy_visit/chw_name "/> if <output value=" /pregnancy_visit/patient_name "/> has any of the following danger signs.</value>
          </text>
          <text id="/pregnancy_visit/group_note/default_chw_sms/default:label">
            <value>Nice work, <output value=" /pregnancy_visit/chw_name "/>! <output value=" /pregnancy_visit/patient_name "/> (<output value=" /pregnancy_visit/group_review/r_patient_id "/>) has attended ANC at the health facility. Please continue to monitor them for danger signs. We will send you a message when they are due for their next visit. Thank you!</value>
          </text>
          <text id="/pregnancy_visit/group_note:label">
            <value>Note to the CHW</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d3:label">
            <value>Severe nausea or vomiting</value>
          </text>
          <text id="/pregnancy_visit/chw_sms:label">
            <value>CHW's Note</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d6:label">
            <value>Sudden weight gain or severe swelling of feet, ankles, face, or hands</value>
          </text>
          <text id="/pregnancy_visit/group_chw_info/chw_information:label">
            <value>The pregnancy visit for <output value=" /pregnancy_visit/patient_name "/> has not been recorded.</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_followup_note2:label">
            <value><output value=" /pregnancy_visit/group_note/g_chw_sms "/></value>
          </text>
          <text id="/pregnancy_visit/group_chw_info:label">
            <value>Missing Visit Report</value>
          </text>
          <text id="/pregnancy_visit/patient_uuid:label">
            <value>Patient UUID</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_summary:label">
            <value>Patient Information&lt;i class="fa fa-user"&gt;&lt;/i&gt;</value>
          </text>
          <text id="/pregnancy_visit/group_note/g_chw_sms:jr:constraintMsg">
            <value>Your message cannot be longer than 5 SMS messages. Please shorten your message to reduce SMS costs.</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d1:label">
            <value>Pain, pressure or cramping in abdomen</value>
          </text>
          <text id="/pregnancy_visit/group_note/g_chw_sms:hint">
            <value>Message will be sent to <output value=" /pregnancy_visit/chw_name "/> (<output value=" /pregnancy_visit/chw_phone "/>). Messages are limited in length to avoid high SMS costs.</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d5:label">
            <value>Severe headache or new, blurry vision problems</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_visit_unknown:label">
            <value>Not sure if pregnancy visit was completed</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign4:label">
            <value>Fever of 38 degrees or higher</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign6:label">
            <value>Sudden weight gain or severe swelling of feet, ankles, face, or hands</value>
          </text>
          <text id="/pregnancy_visit/group_chw_info/attended_anc/no:label">
            <value>No</value>
          </text>
          <text id="/pregnancy_visit/group_note/default_chw_sms/did_not_attend:label">
            <value>Hi <output value=" /pregnancy_visit/chw_name "/>, <output value=" /pregnancy_visit/patient_name "/> (<output value=" /pregnancy_visit/group_review/r_patient_id "/>) did not attend ANC. Please continue to monitor them for danger signs. We will send you a message when they are due for their next visit. Thank you!</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign2:label">
            <value>Bleeding or fluid leaking from vagina or vaginal discharge with bad odour</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_visit:label">
            <value>Visit Information&lt;i class="fa fa-plus-square"&gt;&lt;/i&gt;</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign7:label">
            <value>Less movement and kicking from the baby</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_visit_yes:label">
            <value>Pregnancy visit completed</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign5:label">
            <value>Severe headache or new, blurry vision problems</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_referral_note:label">
            <value>**Refer to the health facility for danger signs.**</value>
          </text>
        </translation>
        <translation lang="id">
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d8:label">
            <value>Darah dalam urin atau nyeri sekali, rasa seperti terbakar saat buang air kecil</value>
          </text>
          <text id="/pregnancy_visit/patient_name:label">
            <value>Nama Pasien</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs:label">
            <value>Tanda-tanda bahaya</value>
          </text>
          <text id="/pregnancy_visit/group_note/default_chw_sms/highrisk:label">
            <value>Kerja sama yang baik, <output value=" /pregnancy_visit/chw_name "/>! <output value=" /pregnancy_visit/patient_name "/> (<output value=" /pregnancy_visit/group_review/r_patient_id "/>) telah melakukan kunjungan  ANC di fasilitas kesehatan. Harap dicatat bahwa Cai Kase memiliki satu atau lebih tanda-tanda bahaya k kehamilan berisiko tinggi. Kami akan mengirimkan pesan peringatan  untuk kunjungan berikutnya. Terima kasih!</value>
          </text>
          <text id="/pregnancy_visit/group_note/is_sms_edited:label">
            <value>Apakah Anda ingin mengedit atau menambahkan info untuk pesan?</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign1:label">
            <value>Nyeri, tekanan atau kram di perut</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_followup_note1:label">
            <value>**Berikut ini akan dikirim sebagai SMS ke <output value=" /pregnancy_visit/chw_name "/> <output value=" /pregnancy_visit/chw_phone "/>**</value>
          </text>
          <text id="/pregnancy_visit/chw_phone:label">
            <value>Nomor Telepon Kader</value>
          </text>
          <text id="/pregnancy_visit/group_note/default_chw_sms:label">
            <value>-</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign9:label">
            <value>Diare yang tidak kunjung sembuh</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_followup:label">
            <value>Follow Up Pesan &lt;i class="fa fa-envelope"&gt;&lt;/i&gt;</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d4:label">
            <value>Demam 38 derajat atau lebih tinggi</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs:hint">
            <value>Pilih semua yang berlaku</value>
          </text>
          <text id="/pregnancy_visit/group_chw_info/attended_anc:label">
            <value>Apakah <output value=" /pregnancy_visit/patient_name "/> menghadiri kunjungan ANC nya?</value>
          </text>
          <text id="/pregnancy_visit/inputs/contact/_id:hint">
            <value>Pilih orang dari daftar</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_referral:label">
            <value>Tanda-tanda bahaya&lt;i class="fa fa-warning"&gt;&lt;/i&gt;</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d9:label">
            <value>Diare yang tidak kunjung sembuh</value>
          </text>
          <text id="/pregnancy_visit/patient_age_in_years:label">
            <value>Umur</value>
          </text>
          <text id="/pregnancy_visit/inputs/contact/_id:label">
            <value>Apa nama pasien?</value>
          </text>
          <text id="/pregnancy_visit/chw_name:label">
            <value>Nama Kader</value>
          </text>
          <text id="/pregnancy_visit/group_note/is_sms_edited/yes:label">
            <value>Iya</value>
          </text>
          <text id="/pregnancy_visit/referral_follow_up_needed:label">
            <value>Merujuk pasien</value>
          </text>
          <text id="/pregnancy_visit/group_note/is_sms_edited/no:label">
            <value>Tidak</value>
          </text>
          <text id="/pregnancy_visit/danger_signs:label">
            <value>Tanda-tanda bahaya</value>
          </text>
          <text id="/pregnancy_visit/group_chw_info/call_button:label">
            <value>**Mohon dibicarakan dengan <output value=" /pregnancy_visit/chw_name "/> untuk melihat apakah <output value=" /pregnancy_visit/patient_name "/> menghadiri kunjungan ANC nya.** Sebut: <output value=" /pregnancy_visit/chw_phone "/></value></text>
          <text id="/pregnancy_visit/group_note/g_chw_sms:label">
            <value>Pesan berikut dapat dikirim sebagai adalah atau dimodifikasi untuk menambahkan catatan pribadi</value>
          </text>
          <text id="/pregnancy_visit/group_review/submit:label">
            <value>**Pastikan anda sudah mengirim untuk menyelesaikan tindakan ini.**</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign8:label">
            <value>Darah dalam urin atau nyeri sekali, rasa seperti terbakar saat buang air kecil</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign3:label">
            <value>Mual muntah berat</value>
          </text>
          <text id="/pregnancy_visit/patient_id:label">
            <value>Pasien ID</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_pregnancy_details:label">
            <value>&quot;**<output value=" /pregnancy_visit/patient_name "/>**
ID: <output value=" /pregnancy_visit/group_review/r_patient_id "/>&quot;</value>
          </text>
          <text id="/pregnancy_visit/group_chw_info/attended_anc/yes:label">
            <value>Iya</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d2:label">
            <value>Perdarahan atau cairan merembes dari vagina atau mengalir dari vagina dengan bau busuk</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d7:label">
            <value>Kurang gerak dan menendang dari bayi</value>
          </text>
          <text id="/pregnancy_visit/inputs:label">
            <value>Pasien</value>
          </text>
          <text id="/pregnancy_visit/patient_phone:label">
            <value>Nomor Telepon Pasien</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_visit_no:label">
            <value>Kunjungan kehamilan tidak lengkap</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs:label">
            <value>Konfirmasikan dengan <output value=" /pregnancy_visit/chw_name "/> jika <output value=" /pregnancy_visit/patient_name "/> memiliki tanda-tanda bahaya berikut.</value>
          </text>
          <text id="/pregnancy_visit/group_note/default_chw_sms/default:label">
            <value>Kerja bagus, <output value=" /pregnancy_visit/chw_name "/>! <output value=" /pregnancy_visit/patient_name "/> (<output value=" /pregnancy_visit/group_review/r_patient_id "/>) telah menghadiri ANC di fasilitas kesehatan. Silakan terus memantau mereka untuk tanda-tanda bahaya. Kami akan mengirimkan pesan ketika mereka disebabkan untuk kunjungan berikutnya mereka. Terima kasih!</value>
          </text>
          <text id="/pregnancy_visit/group_note:label">
            <value>Catatan ke kader</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d3:label">
            <value>Mual muntah berat</value>
          </text>
          <text id="/pregnancy_visit/chw_sms:label">
            <value>Catatan Kader</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d6:label">
            <value>Lonjakan berat badan atau berat pembengkakan kaki, pergelangan kaki, wajah, atau tangan</value>
          </text>
          <text id="/pregnancy_visit/group_chw_info/chw_information:label">
            <value>Kunjungan kehamilan untuk <output value=" /pregnancy_visit/patient_name "/> belum terdata.</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_followup_note2:label">
            <value><output value=" /pregnancy_visit/group_note/g_chw_sms "/></value>
          </text>
          <text id="/pregnancy_visit/group_chw_info:label">
            <value>Laporan Kunjungan Hilang</value>
          </text>
          <text id="/pregnancy_visit/patient_uuid:label">
            <value>Pasien UUID</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_summary:label">
            <value>Pasien informasi&lt;I class="fa fa-user"&gt;&lt;/i&gt;</value>
          </text>
          <text id="/pregnancy_visit/group_note/g_chw_sms:jr:constraintMsg">
            <value>Pesan Anda tidak boleh lebih dari 5 pesan SMS. Persingkat pesan Anda untuk mengurangi biaya SMS.</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d1:label">
            <value>Nyeri, tekanan atau kram di perut</value>
          </text>
          <text id="/pregnancy_visit/group_note/g_chw_sms:hint">
            <value>Pesan akan dikirim ke <output value=" /pregnancy_visit/chw_name "/> (<output value=" /pregnancy_visit/chw_phone "/>). Pesan dibatasi panjang untuk menghindari biaya SMS yang tinggi.</value>
          </text>
          <text id="/pregnancy_visit/group_danger_signs/g_danger_signs/d5:label">
            <value>Sakit kepala berat atau baru, penglihatan kabur</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_visit_unknown:label">
            <value>Tidak yakin jika kunjungan kehamilan lengkap</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign4:label">
            <value>Demam 38 derajat atau lebih tinggi</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign6:label">
            <value>Lonjakan berat badan atau berat pembengkakan kaki, pergelangan kaki, wajah, atau tangan</value>
          </text>
          <text id="/pregnancy_visit/group_chw_info/attended_anc/no:label">
            <value>Tidak</value>
          </text>
          <text id="/pregnancy_visit/group_note/default_chw_sms/did_not_attend:label">
            <value>Halo <output value=" /pregnancy_visit/chw_name "/>, <output value=" /pregnancy_visit/patient_name "/> (<output value=" /pregnancy_visit/group_review/r_patient_id "/>) tidak hadir ANC. Silakan terus memantau mereka untuk tanda-tanda bahaya. Kami akan mengirimkan pesan ketika mereka disebabkan untuk kunjungan berikutnya mereka. Terima kasih!</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign2:label">
            <value>Perdarahan atau cairan merembes dari vagina atau mengalir dari vagina dengan bau busuk</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_visit:label">
            <value>Mengunjungi informasi&lt;i class="fa fa-plus-square"&gt;&lt;/i&gt;</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign7:label">
            <value>Kurang gerak dan menendang dari bayi</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_visit_yes:label">
            <value>Kunjungan kehamilan lengkap</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_danger_sign5:label">
            <value>Sakit kepala berat atau baru, penglihatan kabur</value>
          </text>
          <text id="/pregnancy_visit/group_review/r_referral_note:label">
            <value>**Merujuk ke fasilitas kesehatan untuk tanda bahaya.**</value>
          </text>
        </translation>
      </itext>
      <instance>
        <pregnancy_visit delimiter="#" id="pregnancy_visit" prefix="J1!pregnancy_visit!" version="2017-10-16_12-05">
          <inputs>
            <meta tag="hidden">
              <location>
                <lat/>
                <long/>
                <error/>
                <message/>
              </location>
            </meta>
            <source>user</source>
            <source_id/>
            <contact>
              <_id/>
              <patient_id/>
              <name/>
              <date_of_birth/>
              <sex/>
              <phone/>
              <parent>
                <contact>
                  <phone/>
                  <name/>
                </contact>
              </parent>
            </contact>
          </inputs>
          <patient_age_in_years tag="hidden"/>
          <patient_phone tag="hidden"/>
          <patient_uuid tag="hidden"/>
          <patient_id/>
          <patient_name/>
          <chw_name/>
          <chw_phone/>
          <danger_signs/>
          <referral_follow_up_needed/>
          <chw_sms/>
          <visit_confirmed/>
          <group_chw_info tag="hidden">
            <chw_information/>
            <call_button/>
            <attended_anc>yes</attended_anc>
          </group_chw_info>
          <group_danger_signs tag="hidden">
            <g_danger_signs/>
          </group_danger_signs>
          <group_note tag="hidden">
            <default_chw_sms/>
            <is_sms_edited/>
            <g_chw_sms/>
          </group_note>
          <group_review tag="hidden">
            <submit/>
            <r_summary/>
            <r_patient_id/>
            <r_pregnancy_details/>
            <r_visit/>
            <r_visit_yes/>
            <r_visit_no/>
            <r_visit_unknown/>
            <r_referral/>
            <r_referral_note/>
            <r_danger_sign1/>
            <r_danger_sign2/>
            <r_danger_sign3/>
            <r_danger_sign4/>
            <r_danger_sign5/>
            <r_danger_sign6/>
            <r_danger_sign7/>
            <r_danger_sign8/>
            <r_danger_sign9/>
            <r_followup/>
            <r_followup_note1/>
            <r_followup_note2/>
          </group_review>
          <meta tag="hidden">
            <instanceID/>
          </meta>
        </pregnancy_visit>
      </instance>
      <instance id="contact-summary"/>
      <bind nodeset="/pregnancy_visit/inputs" relevant="./source = 'user'"/>
      <bind calculate="." nodeset="/pregnancy_visit/inputs/source" type="string"/>
      <bind calculate="." nodeset="/pregnancy_visit/inputs/source_id" type="string"/>
      <bind nodeset="/pregnancy_visit/inputs/contact/_id" required="true()" type="db:person"/>
      <bind calculate="." nodeset="/pregnancy_visit/inputs/contact/patient_id" type="string"/>
      <bind calculate="." nodeset="/pregnancy_visit/inputs/contact/name" type="string"/>
      <bind calculate="." nodeset="/pregnancy_visit/inputs/contact/date_of_birth" type="string"/>
      <bind calculate="." nodeset="/pregnancy_visit/inputs/contact/sex" type="string"/>
      <bind calculate="." nodeset="/pregnancy_visit/inputs/contact/phone" type="string"/>
      <bind calculate="." nodeset="/pregnancy_visit/inputs/contact/parent/contact/phone" type="string"/>
      <bind calculate="." nodeset="/pregnancy_visit/inputs/contact/parent/contact/name" type="string"/>
      <bind calculate="if (  /pregnancy_visit/inputs/contact/date_of_birth ='', '', floor( difference-in-months(  /pregnancy_visit/inputs/contact/date_of_birth , today() ) div 12 ) )" nodeset="/pregnancy_visit/patient_age_in_years" type="string"/>
      <bind calculate="../inputs/contact/phone" nodeset="/pregnancy_visit/patient_phone" type="string"/>
      <bind calculate="../inputs/contact/_id" nodeset="/pregnancy_visit/patient_uuid" type="string"/>
      <bind calculate="../inputs/contact/patient_id" nodeset="/pregnancy_visit/patient_id" type="string"/>
      <bind calculate="../inputs/contact/name" nodeset="/pregnancy_visit/patient_name" type="string"/>
      <bind calculate="../inputs/contact/parent/contact/name" nodeset="/pregnancy_visit/chw_name" type="string"/>
      <bind calculate="../inputs/contact/parent/contact/phone" nodeset="/pregnancy_visit/chw_phone" type="string"/>
      <bind calculate=" /pregnancy_visit/group_danger_signs/g_danger_signs " nodeset="/pregnancy_visit/danger_signs" type="string"/>
      <bind calculate="if (count-selected( /pregnancy_visit/danger_signs ) &gt; 0, 'true', 'false')" nodeset="/pregnancy_visit/referral_follow_up_needed" type="string"/>
      <bind calculate=" /pregnancy_visit/group_note/g_chw_sms " nodeset="/pregnancy_visit/chw_sms" type="string"/>
      <bind calculate=" /pregnancy_visit/group_chw_info/attended_anc " nodeset="/pregnancy_visit/visit_confirmed" type="string"/>
      <bind nodeset="/pregnancy_visit/group_chw_info" relevant=" /pregnancy_visit/inputs/source  = 'task'"/>
      <bind nodeset="/pregnancy_visit/group_chw_info/chw_information" readonly="true()" type="string"/>
      <bind nodeset="/pregnancy_visit/group_chw_info/call_button" readonly="true()" type="string"/>
      <bind nodeset="/pregnancy_visit/group_chw_info/attended_anc" required="true()" type="select1"/>
      <bind nodeset="/pregnancy_visit/group_danger_signs" relevant=" /pregnancy_visit/group_chw_info/attended_anc  = 'yes'"/>
      <bind nodeset="/pregnancy_visit/group_danger_signs/g_danger_signs" type="select"/>
      <bind calculate="if( /pregnancy_visit/group_chw_info/attended_anc  = 'yes',
 if( /pregnancy_visit/group_danger_signs/g_danger_signs  != '',
 'highrisk',
 'default'
 ),
 'did_not_attend'
)" nodeset="/pregnancy_visit/group_note/default_chw_sms" type="select1"/>
      <bind nodeset="/pregnancy_visit/group_note/is_sms_edited" relevant="false()" required="true()" type="select1"/>
      <bind calculate="jr:choice-name( /pregnancy_visit/group_note/default_chw_sms ,' /pregnancy_visit/group_note/default_chw_sms ')" constraint="string-length(.) &lt;= 715" jr:constraintMsg="jr:itext('/pregnancy_visit/group_note/g_chw_sms:jr:constraintMsg')" nodeset="/pregnancy_visit/group_note/g_chw_sms" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/submit" readonly="true()" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_summary" readonly="true()" type="string"/>
      <bind calculate="../../inputs/contact/patient_id" nodeset="/pregnancy_visit/group_review/r_patient_id" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_pregnancy_details" readonly="true()" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_visit" readonly="true()" relevant=" /pregnancy_visit/group_chw_info/attended_anc  != ''" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_visit_yes" readonly="true()" relevant="selected( /pregnancy_visit/group_chw_info/attended_anc , 'yes')" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_visit_no" readonly="true()" relevant="selected( /pregnancy_visit/group_chw_info/attended_anc ,'no')" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_visit_unknown" readonly="true()" relevant="selected( /pregnancy_visit/group_chw_info/attended_anc , 'unknown')" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_referral" readonly="true()" relevant=" /pregnancy_visit/group_danger_signs/g_danger_signs  != ''" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_referral_note" readonly="true()" relevant=" /pregnancy_visit/group_danger_signs/g_danger_signs  != ''" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_danger_sign1" readonly="true()" relevant="selected( /pregnancy_visit/group_danger_signs/g_danger_signs , 'd1')" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_danger_sign2" readonly="true()" relevant="selected( /pregnancy_visit/group_danger_signs/g_danger_signs , 'd2')" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_danger_sign3" readonly="true()" relevant="selected( /pregnancy_visit/group_danger_signs/g_danger_signs , 'd3')" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_danger_sign4" readonly="true()" relevant="selected( /pregnancy_visit/group_danger_signs/g_danger_signs , 'd4')" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_danger_sign5" readonly="true()" relevant="selected( /pregnancy_visit/group_danger_signs/g_danger_signs , 'd5')" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_danger_sign6" readonly="true()" relevant="selected( /pregnancy_visit/group_danger_signs/g_danger_signs , 'd6')" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_danger_sign7" readonly="true()" relevant="selected( /pregnancy_visit/group_danger_signs/g_danger_signs , 'd7')" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_danger_sign8" readonly="true()" relevant="selected( /pregnancy_visit/group_danger_signs/g_danger_signs , 'd8')" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_danger_sign9" readonly="true()" relevant="selected( /pregnancy_visit/group_danger_signs/g_danger_signs , 'd9')" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_followup" readonly="true()" relevant=" /pregnancy_visit/group_note/g_chw_sms  != ''" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_followup_note1" readonly="true()" relevant=" /pregnancy_visit/group_note/g_chw_sms  != ''" type="string"/>
      <bind nodeset="/pregnancy_visit/group_review/r_followup_note2" readonly="true()" relevant=" /pregnancy_visit/group_note/g_chw_sms  != ''" type="string"/>
      <bind calculate="concat('uuid:', uuid())" nodeset="/pregnancy_visit/meta/instanceID" readonly="true()" type="string"/>
    </model>
  </h:head>
  <h:body class="pages">
    <group appearance="field-list" ref="/pregnancy_visit/inputs">
      <label ref="jr:itext('/pregnancy_visit/inputs:label')"/>
      <group ref="/pregnancy_visit/inputs/contact">
        <input appearance="db-object" ref="/pregnancy_visit/inputs/contact/_id">
          <label ref="jr:itext('/pregnancy_visit/inputs/contact/_id:label')"/>
          <hint ref="jr:itext('/pregnancy_visit/inputs/contact/_id:hint')"/>
        </input>
        <group ref="/pregnancy_visit/inputs/contact/parent">
          <group ref="/pregnancy_visit/inputs/contact/parent/contact"/>
        </group>
      </group>
    </group>
    <group appearance="field-list" ref="/pregnancy_visit/group_chw_info">
      <label ref="jr:itext('/pregnancy_visit/group_chw_info:label')"/>
      <input ref="/pregnancy_visit/group_chw_info/chw_information">
        <label ref="jr:itext('/pregnancy_visit/group_chw_info/chw_information:label')"/>
      </input>
      <input ref="/pregnancy_visit/group_chw_info/call_button">
        <label ref="jr:itext('/pregnancy_visit/group_chw_info/call_button:label')"/>
      </input>
      <select1 ref="/pregnancy_visit/group_chw_info/attended_anc">
        <label ref="jr:itext('/pregnancy_visit/group_chw_info/attended_anc:label')"/>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_chw_info/attended_anc/yes:label')"/>
          <value>yes</value>
        </item>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_chw_info/attended_anc/no:label')"/>
          <value>no</value>
        </item>
      </select1>
    </group>
    <group appearance="field-list" ref="/pregnancy_visit/group_danger_signs">
      <label ref="jr:itext('/pregnancy_visit/group_danger_signs:label')"/>
      <select ref="/pregnancy_visit/group_danger_signs/g_danger_signs">
        <label ref="jr:itext('/pregnancy_visit/group_danger_signs/g_danger_signs:label')"/>
        <hint ref="jr:itext('/pregnancy_visit/group_danger_signs/g_danger_signs:hint')"/>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_danger_signs/g_danger_signs/d1:label')"/>
          <value>d1</value>
        </item>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_danger_signs/g_danger_signs/d2:label')"/>
          <value>d2</value>
        </item>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_danger_signs/g_danger_signs/d3:label')"/>
          <value>d3</value>
        </item>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_danger_signs/g_danger_signs/d4:label')"/>
          <value>d4</value>
        </item>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_danger_signs/g_danger_signs/d5:label')"/>
          <value>d5</value>
        </item>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_danger_signs/g_danger_signs/d6:label')"/>
          <value>d6</value>
        </item>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_danger_signs/g_danger_signs/d7:label')"/>
          <value>d7</value>
        </item>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_danger_signs/g_danger_signs/d8:label')"/>
          <value>d8</value>
        </item>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_danger_signs/g_danger_signs/d9:label')"/>
          <value>d9</value>
        </item>
      </select>
    </group>
    <group appearance="field-list" ref="/pregnancy_visit/group_note">
      <label ref="jr:itext('/pregnancy_visit/group_note:label')"/>
      <select1 appearance="hidden" ref="/pregnancy_visit/group_note/default_chw_sms">
        <label ref="jr:itext('/pregnancy_visit/group_note/default_chw_sms:label')"/>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_note/default_chw_sms/default:label')"/>
          <value>default</value>
        </item>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_note/default_chw_sms/highrisk:label')"/>
          <value>highrisk</value>
        </item>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_note/default_chw_sms/did_not_attend:label')"/>
          <value>did_not_attend</value>
        </item>
      </select1>
      <select1 ref="/pregnancy_visit/group_note/is_sms_edited">
        <label ref="jr:itext('/pregnancy_visit/group_note/is_sms_edited:label')"/>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_note/is_sms_edited/yes:label')"/>
          <value>yes</value>
        </item>
        <item>
          <label ref="jr:itext('/pregnancy_visit/group_note/is_sms_edited/no:label')"/>
          <value>no</value>
        </item>
      </select1>
      <input appearance="multiline" ref="/pregnancy_visit/group_note/g_chw_sms">
        <label ref="jr:itext('/pregnancy_visit/group_note/g_chw_sms:label')"/>
        <hint ref="jr:itext('/pregnancy_visit/group_note/g_chw_sms:hint')"/>
      </input>
    </group>
    <group appearance="field-list summary" ref="/pregnancy_visit/group_review">
      <input appearance="center" ref="/pregnancy_visit/group_review/submit">
        <label ref="jr:itext('/pregnancy_visit/group_review/submit:label')"/>
      </input>
      <input appearance="h1 yellow" ref="/pregnancy_visit/group_review/r_summary">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_summary:label')"/>
      </input>
      <input appearance="h4 center" ref="/pregnancy_visit/group_review/r_pregnancy_details">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_pregnancy_details:label')"/>
      </input>
      <input appearance="h1 blue" ref="/pregnancy_visit/group_review/r_visit">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_visit:label')"/>
      </input>
      <input appearance="h4 center" ref="/pregnancy_visit/group_review/r_visit_yes">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_visit_yes:label')"/>
      </input>
      <input appearance="h4 center" ref="/pregnancy_visit/group_review/r_visit_no">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_visit_no:label')"/>
      </input>
      <input appearance="h4 center" ref="/pregnancy_visit/group_review/r_visit_unknown">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_visit_unknown:label')"/>
      </input>
      <input appearance="h1 red" ref="/pregnancy_visit/group_review/r_referral">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_referral:label')"/>
      </input>
      <input ref="/pregnancy_visit/group_review/r_referral_note">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_referral_note:label')"/>
      </input>
      <input appearance="li" ref="/pregnancy_visit/group_review/r_danger_sign1">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_danger_sign1:label')"/>
      </input>
      <input appearance="li" ref="/pregnancy_visit/group_review/r_danger_sign2">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_danger_sign2:label')"/>
      </input>
      <input appearance="li" ref="/pregnancy_visit/group_review/r_danger_sign3">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_danger_sign3:label')"/>
      </input>
      <input appearance="li" ref="/pregnancy_visit/group_review/r_danger_sign4">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_danger_sign4:label')"/>
      </input>
      <input appearance="li" ref="/pregnancy_visit/group_review/r_danger_sign5">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_danger_sign5:label')"/>
      </input>
      <input appearance="li" ref="/pregnancy_visit/group_review/r_danger_sign6">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_danger_sign6:label')"/>
      </input>
      <input appearance="li" ref="/pregnancy_visit/group_review/r_danger_sign7">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_danger_sign7:label')"/>
      </input>
      <input appearance="li" ref="/pregnancy_visit/group_review/r_danger_sign8">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_danger_sign8:label')"/>
      </input>
      <input appearance="li" ref="/pregnancy_visit/group_review/r_danger_sign9">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_danger_sign9:label')"/>
      </input>
      <input appearance="h1 green" ref="/pregnancy_visit/group_review/r_followup">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_followup:label')"/>
      </input>
      <input ref="/pregnancy_visit/group_review/r_followup_note1">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_followup_note1:label')"/>
      </input>
      <input appearance="li" ref="/pregnancy_visit/group_review/r_followup_note2">
        <label ref="jr:itext('/pregnancy_visit/group_review/r_followup_note2:label')"/>
      </input>
    </group>
  </h:body>
</h:html>
SCdF commented 6 years ago

@garethbowen please take a look when you have a mo.

garethbowen commented 6 years ago

Back to you!

SCdF commented 6 years ago

Additional AT note:

@garethbowen suggested that we test this inside repeating sections. I was unable to get the db-object widget working in a repeating section at all, let alone get to the point where I could test that it mapped fields correctly. @abbyad are you aware of whether this is expected to work? If so could you rustle up a test form, as I guess that means I don't know how to make repeating forms properly.

abbyad commented 6 years ago

Below is a form with repeats. The first repeat group has an associated field of type string and hidden appearance, which currently works as expected. The second repeat group uses the XLSForm type hidden, which does not assign values to associated fields in 2.14... but hoping it works with this fix!

<?xml version="1.0"?>
<h:html xmlns="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:jr="http://openrosa.org/javarosa" xmlns:orx="http://openrosa.org/xforms" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <h:head>
    <h:title>Test Issue 4248 C: db:person in repeat</h:title>
    <model>
      <instance>
        <issue_4248_c delimiter="#" id="issue_4248_c" prefix="J1!issue_4248_c!" version="2018-03-15 9-41">
          <type_string jr:template="">
            <_id/>
            <name/>
            <string_name/>
            <note/>
          </type_string>
          <type_hidden jr:template="">
            <_id/>
            <name/>
            <hidden_name/>
            <note/>
          </type_hidden>
          <meta>
            <instanceID/>
          </meta>
        </issue_4248_c>
      </instance>
      <instance id="contact-summary"/>
      <bind nodeset="/issue_4248_c/type_string/_id" required="true()" type="db:person"/>
      <bind nodeset="/issue_4248_c/type_string/name" type="string"/>
      <bind calculate="../name" nodeset="/issue_4248_c/type_string/string_name" type="string"/>
      <bind nodeset="/issue_4248_c/type_string/note" readonly="true()" type="string"/>
      <bind nodeset="/issue_4248_c/type_hidden/_id" required="true()" type="db:person"/>
      <bind nodeset="/issue_4248_c/type_hidden/name" type="string"/>
      <bind calculate="../name" nodeset="/issue_4248_c/type_hidden/hidden_name" type="string"/>
      <bind nodeset="/issue_4248_c/type_hidden/note" readonly="true()" type="string"/>
      <bind calculate="concat('uuid:', uuid())" nodeset="/issue_4248_c/meta/instanceID" readonly="true()" type="string"/>
    </model>
  </h:head>
  <h:body>
    <group ref="/issue_4248_c/type_string">
      <label>Test 1: hidden string</label>
      <repeat nodeset="/issue_4248_c/type_string">
        <input appearance="db-object" ref="/issue_4248_c/type_string/_id">
          <label>What is the person's name?</label>
          <hint>Select a person from list</hint>
        </input>
        <input appearance="hidden" ref="/issue_4248_c/type_string/name">
          <label></label>
        </input>
        <input ref="/issue_4248_c/type_string/note">
          <label>Person's name is **'<output value=" /issue_4248_c/type_string/string_name "/>'**</label>
        </input>
      </repeat>
    </group>
    <group ref="/issue_4248_c/type_hidden">
      <label>Test 2: hidden type</label>
      <repeat nodeset="/issue_4248_c/type_hidden">
        <input appearance="db-object" ref="/issue_4248_c/type_hidden/_id">
          <label>What is the person's name?</label>
          <hint>Select a person from list</hint>
        </input>
        <input ref="/issue_4248_c/type_hidden/note">
          <label>Person's name is **'<output value=" /issue_4248_c/type_hidden/hidden_name "/>'**</label>
        </input>
      </repeat>
    </group>
  </h:body>
</h:html>
abbyad commented 6 years ago

The associated fields now get values, but only for the first item in a repeat group. The form above also consistently hangs my tab (Chrome 65.0.3325.146 on Windows) when selecting a second person in a repeat group.

SCdF commented 6 years ago

This is tricky to fix because the data we get from XML is an array and I can't find an index into it. You'd think you could use the _id, but it looks like that's not written to the structure until after we write everything else. One strategy could be to work out how to change that ordering.

However, let's leave it for now and see if this is a feature we need to support, or it can be left as a limitation / known issue. (This is used in PROD already, so we need to cater for it)

abbyad commented 6 years ago

Testing it again it crashed with an out-of-memory error when trying to add a repeat item.

Here is a perhaps not so useful screenshot, shortly after I clicked the + button:

image

Edit: added screenshot with pretty print on image

SCdF commented 6 years ago

One way we could do it is to work out our index by looking at the DOM (ie find our place in a collection of repeating children and use that to correctly index into the repeat.

SCdF commented 6 years ago

@abbyad that is very weird, and something I've never seen before testing this code, or testing any code.

Can you give:

abbyad commented 6 years ago

The form does not crash at all in 2.13.5. In 3.0.0-alpha.9637 I see the following:

Chrome 65.0.3325.146 and Firefox 59.0

1) Add a repeat item to first group. 1) Select a person. 1) It sometimes hangs now, if not, continue. 1) Add another repeat item to first group. 1) It sometimes hangs now, if not, continue. 1) Select a person 1) Tab is consistently hung by now. I can see the tab taking upwards of 4GB of RAM.

Firefox 58.0.2

Before upgrading Firefox to latest I saw the following: 1) Add a repeat item to first group. 1) Select a person. 1) Add another repeat item to first group 1) Select a person 1) Tab hangs, and this error in console: nodeset.setVal expected nodeset with one node, but received multiple

All tests on Windows 10.0.16299

SCdF commented 6 years ago

@abbyad there is a 2.15.0-beta.1, can you test on that? Depending on which build of 3.0.0 that is all sorts of stuff might be going on

abbyad commented 6 years ago

Good call, I cannot reproduce the memory crash in 2.15.0-beta.1.

SCdF commented 6 years ago

@abbyad neat-o. Can you double check that this occurs on the whatever our "standard" master is (alpha.dev?) and make sure it happens there? Ideally after a laptop restart incase it is OS-related

abbyad commented 6 years ago

Ya, that's where I did all these tests: 3.0 alpha on alpha.dev, 2.15 beta on beta.dev, and 2.14 on standard.dev.

I'll post another update if any of this changes after a OS restart.

SCdF commented 6 years ago

I've fixed the repeated positioning stuff, it now works in both examples on the latest test doc I have.

@garethbowen please review, and either leave me to merge and backport or do both, whichever works for you.

garethbowen commented 6 years ago

And.... back to you!

SCdF commented 6 years ago

Merged into master and cp'd into 2.15.x

abbyad commented 6 years ago

Test forms b and c work well in 2.15.0-beta.2. Moving to Ready.