Skip to content

Commit

Permalink
Merge pull request #722 from samuelmale/OHRI-603
Browse files Browse the repository at this point in the history
OHRI-603: Fix lab result form
  • Loading branch information
larslemos authored Feb 15, 2022
2 parents b1572b7 + dee40af commit bc65b95
Show file tree
Hide file tree
Showing 9 changed files with 52 additions and 27 deletions.
20 changes: 14 additions & 6 deletions src/components/encounter-list/encounter-list.component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import DataTableSkeleton from 'carbon-components-react/lib/components/DataTableS
import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import EmptyState from '../empty-state/empty-state.component';
import { launchOHRIWorkSpace } from '../../workspace/ohri-workspace-utils';
import { applyFormIntent, getForm, updateExcludeIntentBehaviour } from '../../utils/forms-loader';
import { OHRIFormLauncherWithIntent } from '../ohri-form-launcher/ohri-form-launcher.component';
import styles from './encounter-list.scss';
Expand Down Expand Up @@ -44,21 +43,30 @@ export function getEncounterValues(encounter, param: string, isDate?: Boolean) {
else return encounter[param] ? encounter[param] : '--';
}

export function getObsFromEncounter(encounter, obsConcept, isDate?: Boolean, isTrueFalseConcept?: Boolean) {
const obs = encounter?.obs.find(observation => observation.concept.uuid === obsConcept);
export function formatDateTime(dateString: string): any {
const format = 'YYYY-MM-DDTHH:mm:ss';
if (dateString.includes('.')) {
dateString = dateString.split('.')[0];
}
return moment(dateString, format, true).toDate();
}

function obsArrayDateComparator(left, right) {
return formatDateTime(right.obsDatetime) - formatDateTime(left.obsDatetime);
}

export function getObsFromEncounter(encounter, obsConcept, isDate?: Boolean, isTrueFalseConcept?: Boolean) {
const allObs = encounter?.obs.filter(observation => observation.concept.uuid === obsConcept);
const obs = allObs.length == 1 ? allObs[0] : allObs.sort(obsArrayDateComparator)[0];
if (isTrueFalseConcept) {
return obs ? 'Yes' : 'No';
}

if (!obs) {
return '--';
}

if (isDate) {
return moment(obs.value).format('DD-MMM-YYYY');
}

if (typeof obs.value === 'object') {
return obs.value.names?.find(conceptName => conceptName.conceptNameType === 'SHORT')?.name || obs.value.name.name;
}
Expand Down
2 changes: 1 addition & 1 deletion src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ export const basePath = '${openmrsSpaBase}/patient/';
export const encounterRepresentation =
'custom:(uuid,encounterDatetime,location:(uuid,name),' +
'encounterProviders:(uuid,provider:(uuid,name)),' +
'obs:(uuid,obsDatetime,groupMembers,concept:(uuid,name:(uuid,name)),value:(uuid,name:(uuid,name),' +
'obs:(uuid,obsDatetime,voided,groupMembers,concept:(uuid,name:(uuid,name)),value:(uuid,name:(uuid,name),' +
'names:(uuid,conceptNameType,name))))';

// Final HIV Test Result Concepts
Expand Down
9 changes: 9 additions & 0 deletions src/forms/components/encounter/ohri-encounter-form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ export const OHRIEncounterForm: React.FC<OHRIEncounterFormProps> = ({
const [form, setForm] = useState<OHRIFormSchema>(formJson);
const [obsGroupsToVoid, setObsGroupsToVoid] = useState([]);
const [formInitialValues, setFormInitialValues] = useState({});
const [isFieldInitializationComplete, setIsFieldInitializationComplete] = useState(false);
const layoutType = useLayoutType();

const addScrollablePages = useCallback(() => {
Expand Down Expand Up @@ -101,6 +102,7 @@ export const OHRIEncounterForm: React.FC<OHRIEncounterFormProps> = ({
useEffect(() => {
const allFormFields: Array<OHRIFormField> = [];
const tempInitVals = {};
let isFieldEncounterBindingComplete = false;
form.pages.forEach(page =>
page.sections.forEach(section => {
section.questions.forEach(question => {
Expand Down Expand Up @@ -136,6 +138,7 @@ export const OHRIEncounterForm: React.FC<OHRIEncounterFormProps> = ({
}
});
setEncounterLocation(encounter.location);
isFieldEncounterBindingComplete = true;
} else {
const emptyValues = {
checkbox: [],
Expand Down Expand Up @@ -194,6 +197,11 @@ export const OHRIEncounterForm: React.FC<OHRIEncounterFormProps> = ({
setForm(form);
setFormInitialValues(tempInitVals);
setAllInitialValues({ ...allInitialValues, ...tempInitVals });
if (sessionMode == 'enter') {
setIsFieldInitializationComplete(true);
} else if (isFieldEncounterBindingComplete) {
setIsFieldInitializationComplete(true);
}
}, [encounter]);

useEffect(() => {
Expand Down Expand Up @@ -434,6 +442,7 @@ export const OHRIEncounterForm: React.FC<OHRIEncounterFormProps> = ({
encounterContext,
layoutType,
workspaceLayout,
isFieldInitializationComplete,
}}>
<InstantEffect effect={addScrollablePages} />
{form.pages.map((page, index) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ const renderForm = intialValues =>
setObsGroupsToVoid: jest.fn(),
encounterContext: encounterContext,
fields: [question],
isFieldInitializationComplete: true,
}}>
<OHRIContentSwitcher question={question} onChange={jest.fn()} handler={ObsSubmissionHandler} />
</OHRIFormContext.Provider>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,28 @@
import React, { useEffect } from 'react';
import { useField } from 'formik';
import React, { useEffect, useMemo } from 'react';
import { OHRIFormContext } from '../../../ohri-form-context';
import { OHRIFormFieldProps } from '../../../types';

const OHRIFixedValue: React.FC<OHRIFormFieldProps> = ({ question, handler }) => {
const { encounterContext } = React.useContext(OHRIFormContext);
const { encounterContext, setFieldValue, isFieldInitializationComplete } = React.useContext(OHRIFormContext);
const [field] = useField(question.id);
const currentFixedValue = useMemo(() => question.value, []);

useEffect(() => {
if (!field.value) {
setFieldValue(question.id, currentFixedValue);
}
}, [field.value]);

useEffect(() => {
if (question.value && typeof question.value == 'string') {
const value = question.value;
if (question.value && typeof question.value == 'string' && isFieldInitializationComplete) {
delete question.value;
question.value = handler.handleFieldSubmission(question, value, encounterContext);
question.value = handler.handleFieldSubmission(question, currentFixedValue, encounterContext);
} else if (typeof question.value == 'object' && question.value.value?.uuid != currentFixedValue) {
// edit obs
question.value = handler.handleFieldSubmission(question, currentFixedValue, encounterContext);
}
}, []);
// return (
// !question.isHidden && (
// <div className={styles.formFields}>
// <OHRILabel value={question.label} />
// {question.value ? <OHRIValueDisplay value={question.value?.value} /> : <OHRIValueEmpty />}
// </div>
// )
// );
}, [question.value, isFieldInitializationComplete]);
return <></>;
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ const renderForm = intialValues =>
setObsGroupsToVoid: jest.fn(),
encounterContext: encounterContext,
fields: [question],
isFieldInitializationComplete: true,
}}>
<OHRIDropdown question={question} onChange={jest.fn()} handler={ObsSubmissionHandler} />
</OHRIFormContext.Provider>
Expand Down
1 change: 1 addition & 0 deletions src/forms/ohri-form-context.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ type OHRIFormContextProps = {
setObsGroupsToVoid: (value: any) => void;
encounterContext: EncounterContext;
fields: any;
isFieldInitializationComplete: boolean;
layoutType?: LayoutType;
workspaceLayout?: 'minimized' | 'maximized';
};
Expand Down
5 changes: 3 additions & 2 deletions src/forms/submission-handlers/base-handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,10 @@ export const ObsSubmissionHandler: SubmissionHandler = {
field.value.value = obs.value.uuid;
return obs.value == ConceptTrue;
}
if (rendering == 'fixed-value') {
return '';
}
return obs.value?.uuid;
} else if (rendering == 'fixed-value') {
return field.value;
}
return '';
},
Expand Down
8 changes: 4 additions & 4 deletions src/packages/covid/forms/lab-result-form/1.0.json
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@
"answers": [
{
"label": "yes",
"concept": "1065AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
"concept": "cf82933b-3f3f-45e7-a5ab-5d31aaee3da3"
},
{
"label": "no",
Expand Down Expand Up @@ -429,7 +429,7 @@
"intent": "*",
"required": "true",
"hide": {
"hideWhenExpression": "wasTheTestPerformed !== '1065AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'"
"hideWhenExpression": "wasTheTestPerformed !== 'cf82933b-3f3f-45e7-a5ab-5d31aaee3da3'"
}
}
]
Expand Down Expand Up @@ -494,7 +494,7 @@
"intent": "*",
"required": "true",
"hide": {
"hideWhenExpression": "testRequested !== '165852AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' || wasTheTestPerformed !== '1065AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'"
"hideWhenExpression": "testRequested !== '165852AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' || wasTheTestPerformed !== 'cf82933b-3f3f-45e7-a5ab-5d31aaee3da3'"
}
}
]
Expand Down Expand Up @@ -559,7 +559,7 @@
"intent": "*",
"required": "true",
"hide": {
"hideWhenExpression": "testRequested !== '165840AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' || wasTheTestPerformed !== '1065AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'"
"hideWhenExpression": "testRequested !== '165840AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' || wasTheTestPerformed !== 'cf82933b-3f3f-45e7-a5ab-5d31aaee3da3'"
}
}
]
Expand Down

0 comments on commit bc65b95

Please sign in to comment.