Skip to content

Commit

Permalink
(feat): moved in patient functionality from esm-ugandaemr-bed-managem…
Browse files Browse the repository at this point in the history
…ent-app to kenyaemr-esm-3.x (#318)

* initial work on moving in patient functionality to kenyaemr

* fix: added form configurations to useConfig
  • Loading branch information
amosmachora authored Aug 17, 2024
1 parent b6e4e58 commit ff99bb3
Show file tree
Hide file tree
Showing 18 changed files with 1,256 additions and 0 deletions.
83 changes: 83 additions & 0 deletions packages/esm-patient-clinical-view-app/src/config-schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,39 @@ export const configSchema = {
},
],
},
admissionLocationTagUuid: {
_type: Type.UUID,
_description:
'UUID for the location tag of the `Admission Location`. Patients may only be admitted to inpatient care in a location with this tag',
_default: '233de33e-2778-4f9a-a398-fa09da9daa14',
},
inpatientVisitUuid: {
_type: Type.UUID,
_description: 'UUID for the inpatient visit',
_default: 'a73e2ac6-263b-47fc-99fc-e0f2c09fc914',
},
inPatientForms: {
_type: Type.Array,
_description: 'List of forms that can be filled out for in-patients',
_default: [
{
label: 'Cardex Nursing Plan',
uuid: '89891ea0-444f-48bf-98e6-f97e87607f7e',
},
{
label: 'IPD Procedure Form',
uuid: '3853ed6d-dddd-4459-b441-25cd6a459ed4',
},
{
label: 'Newborn Unit Admission ',
uuid: 'e8110437-e3cc-4238-bfc1-414bdd4de6a4',
},
{
label: 'Partograph Form',
uuid: '3791e5b7-2cdc-44fc-982b-a81135367c96',
},
],
},
};

export interface ConfigObject {
Expand Down Expand Up @@ -236,6 +269,48 @@ export interface ConfigObject {
};
familyRelationshipsTypeList: Array<{ uuid: string; display: string }>;
pnsRelationships: Array<{ uuid: string; display: string; sexual: boolean }>;
admissionLocationTagUuid: {
_type: Type.UUID;
_description: 'UUID for the location tag of the `Admission Location`. Patients may only be admitted to inpatient care in a location with this tag';
_default: '233de33e-2778-4f9a-a398-fa09da9daa14';
};
inpatientVisitUuid: {
_type: Type.UUID;
_description: 'UUID for the inpatient visit';
_default: 'a73e2ac6-263b-47fc-99fc-e0f2c09fc914';
};
restrictWardAdministrationToLoginLocation: {
_type: Type.Boolean;
_description: 'UUID for the inpatient visit';
_default: false;
};
patientListForAdmissionUrl: {
_type: Type.String;
_description: 'Endpoint for fetching list of patients eligible for ward admission';
_default: '';
};
inPatientForms: {
_type: Type.Array;
_description: 'List of forms that can be filled out for in-patients';
_default: [
{
label: 'Cardex Nursing Plan';
uuid: '89891ea0-444f-48bf-98e6-f97e87607f7e';
},
{
label: 'IPD Procedure Form';
uuid: '3853ed6d-dddd-4459-b441-25cd6a459ed4';
},
{
label: 'Newborn Unit Admission ';
uuid: 'e8110437-e3cc-4238-bfc1-414bdd4de6a4';
},
{
label: 'Partograph Form';
uuid: '3791e5b7-2cdc-44fc-982b-a81135367c96';
},
];
};
}

export interface PartograpyComponents {
Expand All @@ -254,3 +329,11 @@ export interface ConfigPartographyObject {
descentOfHead: string;
};
}

export type BedManagementConfig = {
admissionLocationTagUuid: string;
inpatientVisitUuid: string;
restrictWardAdministrationToLoginLocation: boolean;
patientListForAdmissionUrl: string;
inPatientForms: Array<{ label: string; uuid: string }>;
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import React from 'react';
import { useTranslation } from 'react-i18next';
import { SkeletonText } from '@carbon/react';
import { useConfig } from '@openmrs/esm-framework';
import { type Observation } from './visit.resource';
import styles from './styles.scss';

interface EncounterObservationsProps {
observations: Array<Observation>;
}

const EncounterObservations: React.FC<EncounterObservationsProps> = ({ observations }) => {
const { t } = useTranslation();
const { obsConceptUuidsToHide = [] } = useConfig();

function getAnswerFromDisplay(display: string): string {
const colonIndex = display.indexOf(':');
if (colonIndex === -1) {
return '';
} else {
return display.substring(colonIndex + 1).trim();
}
}

if (!observations) {
return <SkeletonText />;
}

if (observations) {
const filteredObservations = !!obsConceptUuidsToHide.length
? observations?.filter((obs) => {
return !obsConceptUuidsToHide.includes(obs?.concept?.uuid);
})
: observations;
return (
<div className={styles.observation}>
{filteredObservations?.map((obs, index) => {
if (obs.groupMembers) {
return (
<React.Fragment key={index}>
<span className={styles.parentConcept}>{obs.concept.display}</span>
<span />
{obs.groupMembers.map((member) => (
<React.Fragment key={index}>
<span className={styles.childConcept}>{member.concept.display}</span>
<span>{getAnswerFromDisplay(member.display)}</span>
</React.Fragment>
))}
</React.Fragment>
);
} else {
return (
<React.Fragment key={index}>
<span>{obs.concept.display}</span>
<span>{getAnswerFromDisplay(obs.display)}</span>
</React.Fragment>
);
}
})}
</div>
);
}

return (
<div className={styles.observation}>
<p>{t('noObservationsFound', 'No observations found')}</p>
</div>
);
};

export default EncounterObservations;
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import EncounterObservations from './encounter-observations.component';

export default EncounterObservations;
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
@use '@carbon/styles/scss/spacing';

.observation {
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap: spacing.$spacing-03;
margin-block: spacing.$spacing-05;
margin-inline: 0 spacing.$spacing-05;
}

.observation > span {
align-self: center;
justify-self: start;
}

.parentConcept {
font-weight: bold;
}

.childConcept {
padding-inline-start: 0.8rem;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
import { OpenmrsResource, Privilege } from '@openmrs/esm-framework';

export interface MappedEncounter {
id: string;
datetime: string;
encounterType: string;
editPrivilege: string;
form: OpenmrsResource;
obs: Array<Observation>;
provider: string;
visitUuid: string;
visitType: string;
visitTypeUuid?: string;
visitStartDatetime?: string;
visitStopDatetime?: string;
}

export interface Encounter {
uuid: string;
diagnoses: Array<Diagnosis>;
encounterDatetime: string;
encounterProviders: Array<EncounterProvider>;
encounterType: {
uuid: string;
display: string;
viewPrivilege: Privilege;
editPrivilege: Privilege;
};
obs: Array<Observation>;
orders: Array<Order>;
form: OpenmrsResource;
patient: OpenmrsResource;
}

export interface EncounterProvider {
uuid: string;
display: string;
encounterRole: {
uuid: string;
display: string;
};
provider: {
uuid: string;
person: {
uuid: string;
display: string;
};
};
}

export interface Observation {
uuid: string;
concept: {
uuid: string;
display: string;
conceptClass: {
uuid: string;
display: string;
};
};
display: string;
groupMembers: null | Array<{
uuid: string;
concept: {
uuid: string;
display: string;
};
value: {
uuid: string;
display: string;
};
display: string;
}>;
value: any;
obsDatetime?: string;
}

export interface Order {
uuid: string;
dateActivated: string;
dateStopped?: Date | null;
dose: number;
dosingInstructions: string | null;
dosingType?: 'org.openmrs.FreeTextDosingInstructions' | 'org.openmrs.SimpleDosingInstructions';
doseUnits: {
uuid: string;
display: string;
};
drug: {
uuid: string;
name: string;
strength: string;
display: string;
};
duration: number;
durationUnits: {
uuid: string;
display: string;
};
frequency: {
uuid: string;
display: string;
};
numRefills: number;
orderNumber: string;
orderReason: string | null;
orderReasonNonCoded: string | null;
orderer: {
uuid: string;
person: {
uuid: string;
display: string;
};
};
orderType: {
uuid: string;
display: string;
};
route: {
uuid: string;
display: string;
};
quantity: number;
quantityUnits: OpenmrsResource;
}

export interface Note {
concept: OpenmrsResource;
note: string;
provider: {
name: string;
role: string;
};
time: string;
}

export interface OrderItem {
order: Order;
provider: {
name: string;
role: string;
};
}

export interface Diagnosis {
certainty: string;
display: string;
encounter: OpenmrsResource;
links: Array<any>;
patient: OpenmrsResource;
rank: number;
resourceVersion: string;
uuid: string;
voided: boolean;
diagnosis: {
coded: {
display: string;
links: Array<any>;
};
};
}
Loading

0 comments on commit ff99bb3

Please sign in to comment.