Skip to content

Commit

Permalink
#1137 - changing web app model mapping to support question groups. f…
Browse files Browse the repository at this point in the history
…ixed warnings due to missing key fields.
  • Loading branch information
petmongrels committed Mar 28, 2024
1 parent e648b81 commit b67151d
Show file tree
Hide file tree
Showing 19 changed files with 281 additions and 91 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
"material-table": "1.43.0",
"moment": "^2.22.2",
"openchs-idi": "git+https://github.com/avniproject/openchs-idi#b6c57e051b91ed4bc2634f4f087dba51cc3a01c8",
"openchs-models": "1.31.55",
"openchs-models": "1.31.58",
"popper.js": "^1.14.3",
"prismjs": "^1.17.1",
"prop-types": "^15.7.2",
Expand Down
40 changes: 27 additions & 13 deletions src/common/adapters.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ import {
Concept,
ConceptAnswer,
EncounterType,
Form,
Format,
FormElement,
FormElementGroup,
Gender,
KeyValue,
ModelGeneral as General,
Expand All @@ -15,6 +12,9 @@ import {
} from "avni-models";
import { get, isEmpty, isNil, map } from "lodash";
import { conceptService } from "dataEntryApp/services/ConceptService";
import WebFormElement from "./model/WebFormElement";
import WebFormElementGroup from "./model/WebFormElementGroup";
import WebForm from "./model/WebForm";

export const mapConceptAnswer = json => {
const conceptAnswer = new ConceptAnswer();
Expand All @@ -34,39 +34,53 @@ export const mapConcept = json => {
return concept;
};

export const mapFormElement = (json, formElementGroup) => {
export const mapFormElement = (
formElementResource,
formElementGroup,
questionGroupFormElements = new Map()
) => {
const formElement = General.assignFields(
json,
new FormElement(),
formElementResource,
new WebFormElement(),
["uuid", "name", "displayOrder", "mandatory", "type", "voided", "rule"],
[]
);
formElement.formElementGroup = formElementGroup;
formElement.keyValues = map(json.keyValues, KeyValue.fromResource);
formElement.validFormat = Format.fromResource(json.validFormat);
formElement.concept = mapConcept(json.concept);
if (json.group) formElement.groupUuid = json.group.uuid;
formElement.keyValues = map(formElementResource.keyValues, KeyValue.fromResource);
formElement.validFormat = Format.fromResource(formElementResource.validFormat);
formElement.concept = mapConcept(formElementResource.concept);
if (formElementResource.group) {
formElement.groupUuid = formElementResource.group.uuid;
if (!questionGroupFormElements.has(formElement.groupUuid))
questionGroupFormElements.set(
formElement.groupUuid,
mapFormElement(formElementResource.group, formElementGroup)
);

formElement.group = questionGroupFormElements.get(formElement.groupUuid);
}
return formElement;
};

export const mapFormElementGroup = (json, form) => {
const formElementGroup = General.assignFields(json, new FormElementGroup(), [
const formElementGroup = General.assignFields(json, new WebFormElementGroup(), [
"uuid",
"name",
"displayOrder",
"display",
"voided",
"rule"
]);
const questionGroupFormElements = new Map();
formElementGroup.formElements = map(json.applicableFormElements, feJson =>
mapFormElement(feJson, formElementGroup)
mapFormElement(feJson, formElementGroup, questionGroupFormElements)
);
formElementGroup.form = form;
return formElementGroup;
};

export const mapForm = json => {
let form = General.assignFields(json, new Form(), ["uuid", "name", "formType"]);
let form = General.assignFields(json, new WebForm(), ["uuid", "name", "formType"]);
form.formElementGroups = map(json.formElementGroups, fegJson =>
mapFormElementGroup(fegJson, form)
);
Expand Down
18 changes: 16 additions & 2 deletions src/common/adapters.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
Program,
SubjectType
} from "avni-models";
import WebFormElementGroup from "./model/WebFormElementGroup";

describe("adapters", () => {
it("can map concept", () => {
Expand Down Expand Up @@ -54,8 +55,21 @@ describe("adapters", () => {
assert.equal(feg.formElements.length, 3);
});

it("should map form element group with question groups", function() {
const form = {};
const feg = { name: "a", form: form, applicableFormElements: [] };
const questionGroup = { name: "qg", uuid: "uuid-1", concept: {} };
feg.applicableFormElements.push({ name: "1", group: questionGroup, concept: {} });
feg.applicableFormElements.push({ name: "2", group: questionGroup, concept: {} });
const mapped = mapFormElementGroup(feg);
assert.equal(mapped.formElements.length, 2);
assert.equal(mapped.formElements[0].name, "1");
assert.equal(mapped.formElements[0].group.uuid, "uuid-1");
assert.equal(mapped.formElements[1].group.uuid, "uuid-1");
});

it("can map form element", () => {
const feg = new FormElementGroup();
const feg = new WebFormElementGroup();
feg.uuid = "uuid";
const fe = mapFormElement(sampleFormElement, feg);

Expand All @@ -79,7 +93,7 @@ describe("adapters", () => {
assert.equal(form.uuid, "36ba19a3-c289-44b7-bf56-eed36e9d7519");
assert.equal(form.formType, "IndividualProfile");
assert.equal(form.formElementGroups.length, 2);
assert.equal(form.formElementGroups[0].constructor, FormElementGroup);
assert.equal(form.formElementGroups[0].constructor, WebFormElementGroup);
assert.equal(form.formElementGroups[0].name, "Individual details");
assert.equal(form.formElementGroups[1].uuid, "0ef62f9b-e52e-4fd9-be85-4c3f08c9a973");
});
Expand Down
14 changes: 14 additions & 0 deletions src/common/model/WebForm.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { Form } from "openchs-models";
import WebFormElementGroup from "./WebFormElementGroup";

class WebForm extends Form {
get formElementGroups() {
return this.toEntityList("formElementGroups", WebFormElementGroup);
}

set formElementGroups(x) {
this.that.formElementGroups = this.fromEntityList(x);
}
}

export default WebForm;
32 changes: 32 additions & 0 deletions src/common/model/WebFormElement.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { FormElement } from "openchs-models";
import WebFormElementGroup from "./WebFormElementGroup";

class WebFormElement extends FormElement {
get group() {
return this.toEntity("group", WebFormElement);
}

set group(x) {
this.that.group = this.fromObject(x);
}

newFormElement() {
return new WebFormElement();
}

clone() {
const clone = super.clone();
clone.group = this.group;
return clone;
}

get formElementGroup() {
return this.toEntity("formElementGroup", WebFormElementGroup);
}

set formElementGroup(x) {
this.that.formElementGroup = this.fromObject(x);
}
}

export default WebFormElement;
23 changes: 23 additions & 0 deletions src/common/model/WebFormElementGroup.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { FormElementGroup } from "openchs-models";
import WebFormElement from "./WebFormElement";
import WebForm from "./WebForm";

class WebFormElementGroup extends FormElementGroup {
get formElements() {
return this.toEntityList("formElements", WebFormElement);
}

set formElements(x) {
this.that.formElements = this.fromEntityList(x);
}

get form() {
return this.toEntity("form", WebForm);
}

set form(x) {
this.that.form = this.fromObject(x);
}
}

export default WebFormElementGroup;
4 changes: 2 additions & 2 deletions src/common/subjectModelMapper.js
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ export const mapProfile = subjectProfile => {
}
};

export const mapProgramEnrolment = (json, subject) => {
export function mapProgramEnrolment(json, subject) {
const programEnrolment = new ProgramEnrolment();
programEnrolment.uuid = json.uuid;
if (json.enrolmentDateTime) programEnrolment.enrolmentDateTime = new Date(json.enrolmentDateTime);
Expand All @@ -149,7 +149,7 @@ export const mapProgramEnrolment = (json, subject) => {
);
}
return programEnrolment;
};
}

export const mapRelationships = relationshipList => {
if (relationshipList) {
Expand Down
3 changes: 1 addition & 2 deletions src/dataEntryApp/components/CodedFormElement.js
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,8 @@ export const CodedFormElement = ({
<FormGroup>
<Box display="flex" flexWrap="wrap" alignContent="flex-start">
{items.map(item => (
<Box>
<Box key={item.uuid}>
<FormControlLabel
key={item.uuid}
control={
multiSelect ? (
<Checkbox
Expand Down
12 changes: 6 additions & 6 deletions src/dataEntryApp/components/FormElement.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@ import MediaFormElement from "./MediaFormElement";
import PhoneNumberFormElement from "./PhoneNumberFormElement";
import LocationFormElement from "./LocationFormElement";
import LandingSubjectFormElement from "./LandingSubjectFormElement";
// import QuestionGroupFormElement from "./QuestionGroupFormElement";
import { isNil } from "lodash";
import QuestionGroupFormElement from "./QuestionGroupFormElement";
import { RepeatableQuestionGroupElement } from "./RepeatableQuestionGroupElement";

const div = () => <div />;

Expand All @@ -37,8 +37,9 @@ const elements = {
Id: TextFormElement,
PhoneNumber: PhoneNumberFormElement,
Subject: LandingSubjectFormElement,
Location: LocationFormElement
// QuestionGroup: QuestionGroupFormElement
Location: LocationFormElement,
QuestionGroup: QuestionGroupFormElement,
RepeatableQuestionGroup: RepeatableQuestionGroupElement
};

export const FormElement = ({
Expand All @@ -50,12 +51,10 @@ export const FormElement = ({
uuid,
feIndex,
filteredFormElements,
isChildFormElement,
ignoreLineBreak,
isGrid,
updateObs
}) => {
if (!isChildFormElement && !isNil(formElement.groupUuid)) return null;
const type = formElement.getType();
if (type === Concept.dataType.Id) {
formElement.keyValues = [
Expand All @@ -64,6 +63,7 @@ export const FormElement = ({
];
formElement.mandatory = false;
}

const props = {
formElement,
value,
Expand Down
23 changes: 15 additions & 8 deletions src/dataEntryApp/components/FormElementGroup.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { get } from "lodash";
import React from "react";
import { LineBreak } from "../../common/components/utils";
import { FormElement } from "./FormElement";
import { nestedFormElements } from "../services/FormElementService";

export const FormElementGroup = ({
obsHolder,
Expand All @@ -12,20 +13,26 @@ export const FormElementGroup = ({
entity,
renderChildren
}) => {
const nestedElements = nestedFormElements(filteredFormElements);
return (
<div>
<LineBreak num={1} />
{children && renderChildren ? children : ""}

{filteredFormElements.map((fe, index) => {
{nestedElements.map((fe, index) => {
const observation = obsHolder.findObservation(fe.concept);
const observationValue = observation
? observation.concept.isDurationConcept()
? get(observation, "valueJSON")
: observation.concept.isIdConcept()
? get(observation, "valueJSON.value")
: get(observation, "valueJSON.answer")
: null;
let observationValue;
if (observation) {
if (observation.concept.isDurationConcept()) {
observationValue = get(observation, "valueJSON");
} else if (observation.concept.isIdConcept()) {
observationValue = get(observation, "valueJSON.value");
} else {
observationValue = get(observation, "valueJSON.answer");
}
} else {
observationValue = null;
}
return (
<FormElement
key={fe.uuid}
Expand Down
Loading

0 comments on commit b67151d

Please sign in to comment.