Building > Tutorials > Complex Tasks
Building a more complex task
This guide explains how to pass data from a task into the action application form.
Let’s look deeper at the scenario from the Complex Tasks Tutorial where we have an ANC follow-up task which recurs eight times, and we want to ask the user different questions on the first and last follow-up.
From the Complex Tasks Tutorial, here is the task.
const { DateTime } = require('luxon');
module.exports = {
name: 'pnc-after-pregnancy',
icon: 'icon-follow-up',
title: 'task.pnc_followup',
appliesTo: 'contacts',
appliesToType: ['patient'],
appliesIf: function (contact) {
const userIsChw = user.parent && user.parent.contact_type === 'chw_area';
const isDead = contact.contact.date_of_death;
const isMuted = contact.contact.muted;
if (userIsChw && !isDead && !isMuted) {
const mostRecentPregnancy = Utils.getMostRecentReport(contact.reports, 'pregnancy');
const calculatedLmp = mostRecentPregnancy && Utils.getField(mostRecentPregnancy, 'g_details.estimated_lmp');
this.lmp = calculatedLmp && DateTime.fromFormat(calculatedLmp, 'yyyy-MM-dd');
return this.lmp && this.lmp.isValid;
}
},
events: [12, 20, 26, 30, 34, 36, 38, 40] // follow-up weeks after LMP
.map(weekAfterLmp => ({
id: `pnc-week-${weekAfterLmp}`,
start: weekAfterLmp > 30 ? 6 : 7,
end: weekAfterLmp > 30 ? 7 : 14,
dueDate: function () {
return this.lmp.plus({ weeks: weekAfterLmp }).toJsDate();
}
})),
resolvedIf: function (contact, report, event, dueDate) {
const start = Utils.addDate(dueDate, -event.start).getTime();
const end = Utils.addDate(dueDate, event.end + 1).getTime();
const pncInWindow = Utils.isFormSubmittedInWindow(contact.reports, 'pnc_followup', start, end);
const assessmentInWindow = Utils.isFormSubmittedInWindow(contact.reports, 'assessment_followup', start, end);
return pncInWindow || assessmentInWindow;
},
actions: [{
form: 'pnc_followup',
modifyContent: function (content, contact, report, event) {
const followupCount = this.definition.events.findIndex(e => event.id === e.id) + 1;
content.t_followup_count = followupCount.toString();
}
}]
};
Let’s take a look at the actions
section and specifically the modifyContent attribute. This modifyContent
attribute allows the task to pass data from the task (in JavaScript) into the action app form (xlsx). The content
object is the object which binds to the inputs
section in the app form. You can pass data into the app form by assigning values onto this object.
This function calculates t_followup_count
to be the index of the event which is being completed. So the first task event (which appears after 12 weeks) is followup 1
, and the task event after 34 weeks is followup 5
.
In this sample app form survey
, the value of t_followup_count
is listed in the inputs section and the CHT binds the data passed by the task onto this hidden variable. An example calculation is_first_followup
demonstrates how to use the value in the form’s logic. is_first_followup
will be true 12 weeks after the LMP date, and false on all other followups.
type | name | label | required | relevant | appearance | constraint | constraint_message | calculation |
---|---|---|---|---|---|---|---|---|
begin group | inputs | field-list | ||||||
hidden | t_followup_count | Data from task | ||||||
end group | ||||||||
calculate | is_first_followup | if(${t_follow_up_count}=‘1’,true,false) |
Building a more complex task
Building CHT app forms
Tasks: Definition of tasks shown to app users
Data accessible from within CHT forms
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.