Skip to content

Commit

Permalink
(feat) Support for an capturing encounter role. (#279)
Browse files Browse the repository at this point in the history
* add support for encounter role control

* remove console.log

* add role to tests

* revert some changes

* tweak the url rep

* fix patientIdentifier test
  • Loading branch information
hadijahkyampeire authored and vasharma05 committed May 27, 2024
1 parent d0b6036 commit 182146c
Show file tree
Hide file tree
Showing 22 changed files with 109 additions and 10 deletions.
7 changes: 3 additions & 4 deletions src/components/encounter/encounter-form-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,11 @@ export class EncounterFormManager {
static prepareEncounter(
allFields: FormField[],
encounterContext: EncounterContext,
encounterRole: OpenmrsResource,
visit: OpenmrsResource,
encounterType: string,
formUuid: string,
) {
const { patient, encounter, encounterDate, encounterProvider, location } = encounterContext;
const { patient, encounter, encounterDate, encounterRole, encounterProvider, location } = encounterContext;
const obsForSubmission = [];
prepareObs(obsForSubmission, allFields);
const ordersForSubmission = prepareOrders(allFields);
Expand All @@ -39,7 +38,7 @@ export class EncounterFormManager {
...encounterForSubmission.encounterProviders,
{
provider: encounterProvider,
encounterRole: encounterRole?.uuid,
encounterRole,
},
];
encounterForSubmission.form = {
Expand All @@ -60,7 +59,7 @@ export class EncounterFormManager {
encounterProviders: [
{
provider: encounterProvider,
encounterRole: encounterRole?.uuid,
encounterRole,
},
],
obs: obsForSubmission,
Expand Down
13 changes: 7 additions & 6 deletions src/components/encounter/encounter-form.component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,19 @@ import { FieldValidator, isEmpty } from '../../validators/form-validator';
import { scrollIntoView } from '../../utils/scroll-into-view';
import { useEncounter } from '../../hooks/useEncounter';
import { useInitialValues } from '../../hooks/useInitialValues';
import { useEncounterRole } from '../../hooks/useEncounterRole';
import { useConcepts } from '../../hooks/useConcepts';
import { useFormFieldHandlers } from '../../hooks/useFormFieldHandlers';
import { useFormFieldValidators } from '../../hooks/useFormFieldValidators';
import { useTranslation } from 'react-i18next';
import { EncounterFormManager } from './encounter-form-manager';
import { extractErrorMessagesFromResponse } from '../../utils/error-utils';
import { findAndRegisterReferencedFields, linkReferencedFieldValues } from '../../utils/expression-parser';

interface EncounterFormProps {
formJson: FormSchema;
patient: any;
formSessionDate: Date;
provider: string;
role: string;
location: SessionLocation;
visit?: Visit;
values: Record<string, any>;
Expand All @@ -66,6 +65,7 @@ const EncounterForm: React.FC<EncounterFormProps> = ({
patient,
formSessionDate,
provider,
role,
location,
visit,
values,
Expand All @@ -82,13 +82,13 @@ const EncounterForm: React.FC<EncounterFormProps> = ({
allInitialValues,
setAllInitialValues,
isSubmitting,
setIsSubmitting,
}) => {
const { t } = useTranslation();
const [fields, setFields] = useState<Array<FormField>>([]);
const [encounterLocation, setEncounterLocation] = useState(null);
const [encounterDate, setEncounterDate] = useState(formSessionDate);
const [encounterProvider, setEncounterProvider] = useState(provider);
const [encounterRole, setEncounterRole] = useState(role);
const { encounter, isLoading: isLoadingEncounter } = useEncounter(formJson);
const [previousEncounter, setPreviousEncounter] = useState<OpenmrsEncounter>(null);
const [isLoadingPreviousEncounter, setIsLoadingPreviousEncounter] = useState(true);
Expand All @@ -107,16 +107,17 @@ const EncounterForm: React.FC<EncounterFormProps> = ({
sessionMode: sessionMode || (form?.encounter ? 'edit' : 'enter'),
encounterDate: formSessionDate,
encounterProvider: provider,
encounterRole,
form: form,
visit: visit,
setEncounterDate,
setEncounterProvider,
setEncounterLocation,
setEncounterRole,
initValues: initValues,
}),
[encounter, form?.encounter, encounterLocation, patient, previousEncounter, sessionMode, initValues],
);
const { encounterRole } = useEncounterRole();

// given the form, flatten the fields and pull out all concept references
const [flattenedFields, conceptReferences] = useMemo(() => {
Expand Down Expand Up @@ -435,8 +436,7 @@ const EncounterForm: React.FC<EncounterFormProps> = ({
const patientIdentifiers = EncounterFormManager.preparePatientIdentifiers(fields, encounterLocation);
const encounter = EncounterFormManager.prepareEncounter(
fields,
{ ...encounterContext, encounterProvider, location: encounterLocation },
encounterRole,
{ ...encounterContext, encounterProvider, encounterRole, location: encounterLocation },
visit,
formJson.encounterType,
formJson.uuid,
Expand Down Expand Up @@ -728,6 +728,7 @@ const EncounterForm: React.FC<EncounterFormProps> = ({
patient={patient}
formSessionDate={encounterDate}
provider={provider}
role={encounterRole}
location={location}
visit={visit}
values={values}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ const encounterContext: EncounterContext = {
encounterProvider: '2c95f6f5-788e-4e73-9079-5626911231fa',
setEncounterProvider: jest.fn,
setEncounterLocation: jest.fn,

encounterRole: '8cb3a399-d18b-4b62-aefb-5a0f948a3809',
setEncounterRole: jest.fn
};

const renderForm = (initialValues) => {
Expand Down
2 changes: 2 additions & 0 deletions src/components/inputs/select/dropdown.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ const encounterContext: EncounterContext = {
encounterProvider: '2c95f6f5-788e-4e73-9079-5626911231fa',
setEncounterProvider: jest.fn,
setEncounterLocation: jest.fn,
encounterRole: '8cb3a399-d18b-4b62-aefb-5a0f948a3809',
setEncounterRole: jest.fn
};

const renderForm = (initialValues) => {
Expand Down
2 changes: 2 additions & 0 deletions src/components/inputs/text/text.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ const encounterContext: EncounterContext = {
encounterProvider: '2c95f6f5-788e-4e73-9079-5626911231fa',
setEncounterProvider: jest.fn,
setEncounterLocation: jest.fn,
encounterRole: '8cb3a399-d18b-4b62-aefb-5a0f948a3809',
setEncounterRole: jest.fn
};

const renderForm = (intialValues) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ const encounterContext: EncounterContext = {
encounterProvider: '2c95f6f5-788e-4e73-9079-5626911231fa',
setEncounterProvider: jest.fn,
setEncounterLocation: jest.fn,
encounterRole: '8cb3a399-d18b-4b62-aefb-5a0f948a3809',
setEncounterRole: jest.fn
};

const renderForm = (initialValues) => {
Expand Down
2 changes: 2 additions & 0 deletions src/components/inputs/unspecified/unspecified.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ const encounterContext: EncounterContext = {
encounterProvider: '2c95f6f5-788e-4e73-9079-5626911231fa',
setEncounterProvider: jest.fn,
setEncounterLocation: jest.fn,
encounterRole: '8cb3a399-d18b-4b62-aefb-5a0f948a3809',
setEncounterRole: jest.fn
};

const renderForm = (initialValues) => {
Expand Down
15 changes: 15 additions & 0 deletions src/datasources/encounter-role-datasource.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { openmrsFetch, restBaseUrl } from '@openmrs/esm-framework';
import { BaseOpenMRSDataSource } from './data-source';

export class EncounterRoleDataSource extends BaseOpenMRSDataSource {
constructor() {
super(null);
}

async fetchData(searchTerm: string, config?: Record<string, any>): Promise<any[]> {
const rep = 'v=custom:(uuid,display,name)';
const url = `${restBaseUrl}/encounterrole?${rep}`;
const { data } = await openmrsFetch(searchTerm ? `${url}&q=${searchTerm}` : url);
return data?.results;
}
}
2 changes: 2 additions & 0 deletions src/form-context.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ export interface EncounterContext {
encounterProvider: string;
setEncounterProvider(value: string): void;
setEncounterLocation(value: any): void;
encounterRole: string;
setEncounterRole(value: string): void;
initValues?: Record<string, any>;
patientIdentifier?: PatientIdentifier;
}
Expand Down
3 changes: 3 additions & 0 deletions src/form-engine.component.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import { usePatientData } from './hooks/usePatientData';
import { evaluatePostSubmissionExpression } from './utils/post-submission-action-helper';
import { moduleName } from './globals';
import { useFormCollapse } from './hooks/useFormCollapse';
import { useEncounterRole } from './hooks/useEncounterRole';
import EncounterForm from './components/encounter/encounter-form.component';
import Loader from './components/loaders/loader.component';
import MarkdownWrapper from './components/inputs/markdown/markdown-wrapper.component';
Expand Down Expand Up @@ -84,6 +85,7 @@ const FormEngine: React.FC<FormProps> = ({
markFormAsDirty,
}) => {
const session = useSession();
const { encounterRole } = useEncounterRole();
const currentProvider = session?.currentProvider?.uuid ? session.currentProvider.uuid : null;
const location = session && !(encounterUUID || encounterUuid) ? session?.sessionLocation : null;
const { patient, isLoadingPatient: isLoadingPatient, patientError: patientError } = usePatientData(patientUUID);
Expand Down Expand Up @@ -295,6 +297,7 @@ const FormEngine: React.FC<FormProps> = ({
patient={patient}
formSessionDate={formSessionDate}
provider={currentProvider}
role={encounterRole?.uuid}
location={location}
visit={visit}
values={props.values}
Expand Down
8 changes: 8 additions & 0 deletions src/hooks/useInitialValues.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@ describe('useInitialValues', () => {
encounterProvider: '2c95f6f5-788e-4e73-9079-5626911231fa',
setEncounterProvider: jest.fn,
setEncounterLocation: jest.fn,
encounterRole: '',
setEncounterRole: jest.fn
},
formFieldHandlers,
),
Expand Down Expand Up @@ -205,6 +207,8 @@ describe('useInitialValues', () => {
encounterProvider: '2c95f6f5-788e-4e73-9079-5626911231fa',
setEncounterProvider: jest.fn,
setEncounterLocation: jest.fn,
encounterRole: '',
setEncounterRole: jest.fn
},
formFieldHandlers,
),
Expand Down Expand Up @@ -265,6 +269,8 @@ describe('useInitialValues', () => {
encounterProvider: '2c95f6f5-788e-4e73-9079-5626911231fa',
setEncounterProvider: jest.fn,
setEncounterLocation: jest.fn,
encounterRole: '',
setEncounterRole: jest.fn
},
formFieldHandlers,
),
Expand Down Expand Up @@ -303,6 +309,8 @@ describe('useInitialValues', () => {
encounterProvider: '2c95f6f5-788e-4e73-9079-5626911231fa',
setEncounterProvider: jest.fn,
setEncounterLocation: jest.fn,
encounterRole: '8cb3a399-d18b-4b62-aefb-5a0f948a3809',
setEncounterRole: jest.fn
},
formFieldHandlers,
),
Expand Down
1 change: 1 addition & 0 deletions src/hooks/useInitialValues.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export function useInitialValues(
'encounterDatetime',
'encounterLocation',
'patientIdentifier',
'encounterRole'
];

useEffect(() => {
Expand Down
6 changes: 6 additions & 0 deletions src/registry/inbuilt-components/control-templates.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,12 @@ export const controlTemplates: Array<ControlTemplate> = [
name: 'provider_datasource',
},
},
{
name: 'encounter-role',
datasource: {
name: 'encounter_role_datasource',
},
},
{
name: 'encounter-location',
datasource: {
Expand Down
5 changes: 5 additions & 0 deletions src/registry/inbuilt-components/inbuiltDataSources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {ConceptDataSource} from '../../datasources/concept-data-source';
import {LocationDataSource} from '../../datasources/location-data-source';
import {ProviderDataSource} from '../../datasources/provider-datasource';
import {ConceptSetMembersDataSource} from '../../datasources/concept-set-members-data-source';
import { EncounterRoleDataSource } from '../../datasources/encounter-role-datasource';

/**
* @internal
Expand All @@ -29,6 +30,10 @@ export const inbuiltDataSources: Array<RegistryItem<DataSource<any>>> = [
name: 'provider_datasource',
component: new ProviderDataSource(),
},
{
name: 'encounter_role_datasource',
component: new EncounterRoleDataSource(),
},
];

export const validateInbuiltDatasource = (name: string) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { ControlHandler } from '../../submission-handlers/controlHandler';
import { type RegistryItem } from '../registry';
import { TestOrderSubmissionHandler } from '../../submission-handlers/testOrderHandler';
import { ObsSubmissionHandler } from '../../submission-handlers/obsHandler';
import { EncounterRoleHandler } from '../../submission-handlers/encounterRoleHandler';

/**
* @internal
Expand Down Expand Up @@ -52,4 +53,9 @@ export const inbuiltFieldSubmissionHandlers: Array<RegistryItem<SubmissionHandle
component: TestOrderSubmissionHandler,
type: 'testOrder',
},
{
name: 'EncounterRoleHandler',
component: EncounterRoleHandler,
type: 'encounterRole',
},
];
4 changes: 4 additions & 0 deletions src/registry/inbuilt-components/template-component-map.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,8 @@ export const templateToComponentMap = [
name: 'select-concept-answers',
baseControlComponent: UiSelectExtended,
},
{
name: 'encounter-role',
baseControlComponent: UiSelectExtended,
},
];
28 changes: 28 additions & 0 deletions src/submission-handlers/encounterRoleHandler.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { type EncounterContext, type FormField, type OpenmrsEncounter, type SubmissionHandler } from '..';

export const EncounterRoleHandler: SubmissionHandler = {
handleFieldSubmission: (field: FormField, value: any, context: EncounterContext) => {
context.setEncounterRole(value);
return value;
},
getInitialValue: (
encounter: OpenmrsEncounter,
field: FormField,
allFormFields: Array<FormField>,
context: EncounterContext,
) => {
if (encounter) {
return encounter.encounterProviders[0]?.encounterRole?.uuid;
} else {
return context.encounterRole;
}
},

getDisplayValue: (field: FormField, value: any) => {
return value;
},
getPreviousValue: (field: FormField, encounter: OpenmrsEncounter, allFormFields: Array<FormField>) => {
const encounterRole = encounter.encounterProviders[0]?.encounterRole?.uuid;
return encounterRole || null;
},
};
2 changes: 2 additions & 0 deletions src/submission-handlers/obsHandler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ const encounterContext: EncounterContext = {
encounterProvider: '2c95f6f5-788e-4e73-9079-5626911231fa',
setEncounterProvider: jest.fn,
setEncounterLocation: jest.fn,
encounterRole: '',
setEncounterRole: jest.fn
};

describe('ObsSubmissionHandler - handleFieldSubmission', () => {
Expand Down
2 changes: 2 additions & 0 deletions src/submission-handlers/patietnIdentifierHandler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ const encounterContext: EncounterContext = {
encounterProvider: '2c95f6f5-788e-4e73-9079-5626911231fa',
setEncounterProvider: jest.fn,
setEncounterLocation: jest.fn,
encounterRole: '8cb3a399-d18b-4b62-aefb-5a0f948a3809',
setEncounterRole: jest.fn
};

const testPatientIdentifier: FormField = {
Expand Down
2 changes: 2 additions & 0 deletions src/submission-handlers/testOrderHandler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ const encounterContext: EncounterContext = {
encounterProvider: '2c95f6f5-788e-4e73-9079-5626911231fa',
setEncounterProvider: jest.fn,
setEncounterLocation: jest.fn,
encounterRole: '8cb3a399-d18b-4b62-aefb-5a0f948a3809',
setEncounterRole: jest.fn
};

const testOrder: FormField = {
Expand Down
3 changes: 3 additions & 0 deletions src/transformers/angular-fe-schema-transformer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ function transformByType(question: FormField) {
case 'encounterLocation':
question.questionOptions.rendering = 'encounter-location';
break;
case 'encounterRole':
question.questionOptions.rendering = 'encounter-role';
break;
}
}

Expand Down
1 change: 1 addition & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,7 @@ export type RenderType =
| 'datetime'
| 'encounter-location'
| 'encounter-provider'
| 'encounter-role'
| 'fixed-value'
| 'file'
| 'group'
Expand Down

0 comments on commit 182146c

Please sign in to comment.