In all populate items configuration you should use proper item(widget) for populate data
Item | data type |
---|---|
String Input | string |
Textarea | string |
URL | url |
Integer Input | integer |
Decimal Input | decimal |
Quantity Input | quantity |
Date | date |
Time | time |
Datetime | dateTime |
Choice Input | coding |
Open Choice Input | coding/string |
Radio Button | coding |
Boolean input | boolean |
File | attachment |
Author's Signature | attachment |
Reference | reference |
To populate a form we should:
- setup a form to be able to get patient's data and prefill form items with it (design time)
- provide patient's reference to population operation. (usage time)
Assume that we already have:
- form with 5 items(data: patient name, DOB, MRN, address, phone)
- Patient resource in the Aidbox DB
Patient resource example:
resourceType: Patient
id: example
gender: male
name:
- family: Chalmers
given:
- Peter
- James
address:
- city: PleasantVille
district: Rainbow
postalCode: '3999'
text: 534 Erewhon St PeasantVille, Rainbow, Vic 3999
line:
- 534 Erewhon St
state: Vic
identifier:
- use: usual
type:
coding:
- system: http://terminology.hl7.org/CodeSystem/v2-0203
code: MR
system: urn:oid:1.2.36.146.595.217.0.1
value: '12345'
birthDate: '1974-12-25'
telecom:
- system: phone
value: (03) 5555 6473
WARN: You should have items with types - that corresponds populate values types. (see WARN section)
We should setup items with populate
expressions.
How to find population expression:
- select widget in the outline 2 click on
populate
checkbox in the widget settings panel- in opened section select
Expression
tab
For this example we will use:
%subject
parameter, which will containPatient
resourceFHIRPath
expressions to retrieve data.
%subject
parameter will be filled with data in population operation
Patient name
%subject.name.family + ' ' + %subject.name.given.first()
DOB (Date widget)
%subject.birthDate
MRN (Text widget)
%subject.identifier.where(type.coding.system='http://terminology.hl7.org/CodeSystem/v2-0203', type.coding.code='MR').value
address (Text widget)
%subject.address.text
phone (Text widget)
%subject.telecom.value
To make %subject
resource available we should call $populate
operation with specific parameters
subject = <reference>
(reference to patient)local = true
(says that we should search for subject in DB and load resource)
Operation call example:
POST /fhir/Questionnaire/<qid>/$populatelink
resourceType: Parameters
parameter:
- name: subject
valueReference:
reference: Patient/example
- name: local
valueBoolean: true
To populate a form we should:
- setup a form to be able to get patient's observations (design time)
- provide patient's reference to population operation. (usage time)
Assume that we have:
- Form with
body weight
andbody height
items - Patient in DB
- Patient's
body weight
andbody height
Observations
in DB
WARN: You should have items with types - that corresponds populate values types. (see WARN section)
Stored Observations
should be linked to a patient and should be coded with right terminology code (LOINC in our example)
LOINC coding for body measurements:
- Body Height:
{ system: http://loinc.org, code: 8302-2 }
- Body Weight:
{ system: http://loinc.org, code: 29463-7 }
Observation examples
Body Weight
resourceType: Observation
subject:
reference: Patient/example
status: final
code:
coding:
- code: 29463-7
system: http://loinc.org
valueQuantity:
unit: kg
value: 80
Body Height
resourceType: Observation
subject:
reference: Patient/example
status: final
code:
coding:
- code: 8302-2
system: http://loinc.org
valueQuantity:
unit: cm
value: 180
We should configure items with Observation based population
- Select item in outline
- Press
include code?
section and type corresponding code/system (from Observations) - Enable
Populate
section (Observation
population should be opened by default) and choose period to search for Observations. (For example1 Month
)
To pass Patient's reference we use subject
parameter to $populatelink
/$populate
operation.
Operation call example:
POST /fhir/Questionnaire/<qid>/$populatelink
resourceType: Parameters
parameter:
- name: subject
valueReference:
reference: Patient/example
To populate a form with data from allergies we should
- setup a form to be able to find allergies for a patient and populate them in a list (design time)
- Create a
group
/group table
with columns of proper types - Set
named expression
for createdgroup
to search for allergies - Set columns
populate expressions
to extract data from foundAllergyIntolerance
resources
- Create a
- provide
Patient
reference in input parameters of populate operation (usage time)
Assume that we already have:
- Form for Allergies
- Several
AllergyIntolerance
resources in DB
Food allergy
resourceType: AllergyIntolerance
id: example
type: allergy
patient:
reference: Patient/pt-1
category:
- food
criticality: high
recordedDate: '2014-10-09T14:58:00+11:00'
onsetDateTime: '2004'
clinicalStatus:
coding:
- system: http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical
code: active
display: Active
lastOccurrence: 2012-06
reaction:
- substance:
coding:
- system: http://www.nlm.nih.gov/research/umls/rxnorm
code: '1160593'
display: cashew nut allergenic extract Injectable Product
manifestation:
- coding:
- system: http://snomed.info/sct
code: '39579001'
display: Anaphylactic reaction
description: Challenge Protocol. Severe reaction to subcutaneous cashew extract. Epinephrine administered
onset: '2012-06-12'
severity: severe
code:
coding:
- system: http://snomed.info/sct
code: '227493005'
display: Cashew nuts
No Known Drug Allergy
resourceType: AllergyIntolerance
id: nkda
patient:
reference: Patient/pt-1
recordedDate: '2015-08-06T15:37:31-06:00'
clinicalStatus:
coding:
- system: http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical
code: active
display: Active
code:
coding:
- system: http://snomed.info/sct
code: '409137002'
display: No Known Drug Allergy (situation)
text: NKDA
Since there can be several allergies - we should use Group Table (or Group) for them. It will allow us to grow a form with new elements.
Every table row should have next columns:
- category (text input)
- allergy code (text item)
- reaction (Choice input)
- criticality (Choice input)
WARN: You should have items with types - that corresponds populate values types. (see WARN section)
Reaction and allergy code should be taken from Terminology server, in demo purposes we just set answerOptions with predefined values.
- Press
+ Add widget
button in the outline - Select
Group Table
in a opened widget panel.
You will get a group table with 2 items in it.
Now we must setup our inputs
- Remove predefined
Group table's
items- hover items with mouse and click on trash icon. (outline)
- Create
Category
column and set answer options Category item FHIR Spec- Hover
Group Table
item in the outline and click on+
sign - this will open an items list panel for choosing item. - Select
Choice Input
item type in a items list panel - Type it's title =
Category
intext
input of item's settings panel - Find
Options
section inAttributes
segment ofitem's settings
panel - Fill out options with next value Category item FHIR Spec
code
=food
,display
=Food
code
=medication
,display
=Medication
code
=environment
,display
=Environment
code
=biologic
,display
=Biologic
- Hover
- Create
Allergy Code
column- Repeat actions from 2nd step with next values
text
=Allergy code
Options
aresystem
=http://snomed.info/sct
,code
=409137002
,display
=No Known Drug Allergy (situation)
system
=http://snomed.info/sct
,code
=227493005
,display
=Cashew nuts
(in production we should use ValuseSet here, but for demo purposes we just fill our value from existedAllergyIntolerance
resource)
- Create
Reaction
column and set answer options- Repeat actions from 2nd step with next values
text
=Reaction
Options
are:code
=1160593
,display
=cashew nut allergenic extract Injectable Product
(in production we should use ValuseSet here, but for demo purposes we just fill our value from existedAllergyIntolerance
resource)
- Create
Criticality
column and set answer options- Repeat actions from 2nd step with next values
- Find
Options
section inAttributes
segment ofitem's settings
panel - text =
Criticality
Options
are: Criticality item FHIR Speccode
=low
,display
=Low Risk
code
=high
,display
=High Risk
code
=unable-to-assess
,display
=Unable to Assess Risk
At first we should design and debug a FHIR Query to find AllergyIntolerance
resources
For searching AllergyIntolerance
we need only Patient
reference that we get as %subject
Input Parameter see Input Parameters section
Complete FHIR Search Query looks like this:
GET /AllergyIntolerance?patient=pt-1
We should specify form's named expression
with this query, but with small modifications:
- remove http method (
GET
) - replace
patient
parameter value (=pt-1
) with embeddedFHIRPath
expression{{%subject.id}}
/AllergyIntolerance?patient={{%subject.id}}
Embedded FHIRPath expression
{{%subject.id}}
consists of:
{{}}
- FHIRPath expression embedding point%subject
- populate input parameter. (all parameters start with%
sign)%subject.id
-FHIRPath
expression that extractsid
fromPatient
reference
To specify named expression we should:
- Click on
group table
item in the outline panel - Enable
Populate
section in item's settings panel (Observation
population should be opened by default) - Select
Expression
tab inPopulate
section. - enter
expression name
=allergy
(we will use expression by name in next section) - set
expression language
=FHIRQuery
- Copy
FHIRQuery
that we get in last step
For every column we should set populate expression which extracts data from %allergy
named expression.
- Select column item in the outline
- Enable
Populate
section (Observation
population should be opened by default) - Select
Expression
tab - Enter
FHIRPath
expression that extracts needed value.
Category (Choice input)
%qitem.answerOption.valueCoding.where(code = %allergy.category.first())
There can be several catigories but for demo purpores we just use first of them
Allergy code (Choice item)
%allergy.reaction.substance.coding.first()
Reaction (Choice input)
%allergy.reaction.substance.coding.first()
There can be several reactoins but for demo purpores we just use first of them
Criticality (Choice input)
%qitem.answerOption.valueCoding.where(code = %allergy.criticality)
To pass Patient's reference we use subject
parameter to $populatelink
/$populate
operation.
Operation call example:
POST /fhir/Questionnaire/<qid>/$populatelink
resourceType: Parameters
parameter:
- name: subject
valueReference:
reference: Patient/example
To populate a form with data from another form we should:
- setup a form to be able to find another form's response and get information from it (design time)
- Enable input parameter, that is common for both forms. (
Encounter
in our case) - Set form's named expression with
FHIRQuery
to search for response in DB - Set item's populate expression to extract data from found
QuestionnaireResponse
- Enable input parameter, that is common for both forms. (
- provide
Encounter
reference in input parameters of populate operation (usage time)
Assume that we have:
- 1st Form and it's response with captured data in DB, which will be used as data source
- 2nd Form, that should be pre-populated
WARN: You should have items with types - that corresponds populate values types. (see WARN section)
We are working only with 2nd form in this demo
To use %encounter
input parameter - we should enable it.
- Click on form's name in the outline panel (top left corner of the Form Builder)
- In
Populate section
of form's settings panel click onEncounter
checkbox.
Response of 1st form should be stored in DB and looks like this:
resourceType: QuestionnaireResponse
status: completed
questionnaire: http://aidbox.io/forms/patient-name|1.0.0
encounter:
reference: Encounter/enc-1
item:
- linkId: patient-name
text: Patient Name
answer:
- valueString: John Smith
We are interested in following values from it.
encounter reference
- will be common with our formquestionnaire
- uniqueQuestionnaire's
identifier- item's
linkId
- will be used to extract an answer in following section.
We need to build FHIR Search Query
to find this response.
It's better to design and debug query in Aidbox REST Console
Complete FHIR Search Query looks like this:
GET /QuestionnaireResponse?status=completed&questionnaire=http://aidbox.io/forms/patient-name|1.0.0&encounter=enc-1
It uses several filter criteria:
status = completed
- we need only submitted formsquestionnaire
- canonical URL of response's questionnaireencounter
- our common reference, for exampleenc-1
We should specify form's named expression
with this query, but with small modifications:
- remove http method (
GET
) - replace
encounter
parameter value (=enc-1
) with embeddedFHIRPath
expression{{%encounter.id}}
/QuestionnaireResponse?status=completed&questionnaire=http://aidbox.io/forms/patient-name|1.0.0&encounter={{%encounter.id}}
Embedded FHIRPath expression
{{%encounter.id}}
consists of:
{{}}
- FHIRPath expression embedding point%encounter
- populate input parameter. (all parameters start with%
sign)%encounter.id
-FHIRPath
expression that extractsid
fromEncounter
reference
To specify named expression we should:
- Click on form's name in the outline panel (top left corner of the Form Builder)
- In form's settings panel click button
+ Add Expression
(Named Expressions
section). - Select created empty line
- enter
expression name
=response
(we will use expression by name in next section) - set
expression language
=FHIRQuery
- Copy
FHIRQuery
that we get in last step - Click
close
button in thenamed expression
form
We should use created named expression
(%response
) to extract a value and fill out our item.
- Select the item in outline
- Enable
Populate
section (Observation
population should be opened by default) - Select
Expression
tab - Enter
FHIRPath
expression that extracts needed value.
%response.repeat(item).where(linkId='patient-name').answer.value
To pass Encounter's reference we use context
parameter - encounter
to $populatelink
/$populate
operation
Operation call example:
POST /fhir/Questionnaire/<qid>/$populatelink
resourceType: Parameters
parameter:
- name: context
part:
- name: name
valueString: Encounter
- name: value
valueReference:
reference: Encounter/enc-1