fhir-react
Version:
React component library for displaying FHIR Resources
207 lines (194 loc) • 6.03 kB
JavaScript
import React from 'react';
import PropTypes from 'prop-types';
import _get from 'lodash/get';
import Reference from '../../datatypes/Reference';
import Date from '../../datatypes/Date';
import Coding from '../../datatypes/Coding';
import UnhandledResourceDataStructure from '../UnhandledResourceDataStructure';
import fhirVersions from '../fhirResourceVersions';
import {
Root,
Header,
Title,
Badge,
Body,
Value,
MissingValue,
TableHeader,
Table,
TableCell,
TableRow,
} from '../../ui';
const commonDTO = fhirResource => {
const medicationReference = _get(fhirResource, 'medicationReference');
const status = _get(fhirResource, 'status');
const dosageRoute = _get(fhirResource, 'dosage.route.coding.0');
return {
medicationReference,
dosageRoute,
status,
};
};
const dstu2DTO = fhirResource => {
const periodTimeStart = _get(fhirResource, 'effectiveTimePeriod.start');
const periodTimeEnd = _get(fhirResource, 'effectiveTimePeriod.end');
const subject = _get(fhirResource, 'patient');
const practitioner = _get(fhirResource, 'practitioner');
const dosageQuantityVal = _get(fhirResource, 'dosage.quantity.value', '');
const dosageQuantityUnit = _get(fhirResource, 'dosage.quantity.unit', '');
const dosageQuantity = `${dosageQuantityVal} ${dosageQuantityUnit}`.trim();
return {
periodTimeStart,
periodTimeEnd,
subject,
practitioner,
dosageQuantity,
};
};
const stu3DTO = fhirResource => {
const periodTimeStart = _get(fhirResource, 'effectivePeriod.start');
const periodTimeEnd = _get(fhirResource, 'effectivePeriod.end');
const subject = _get(fhirResource, 'subject');
const practitioner = _get(fhirResource, 'performer.0.actor');
const dosageQuantityVal = _get(fhirResource, 'dosage.dose.value', '');
const dosageQuantityUnit = _get(fhirResource, 'dosage.dose.unit', '');
const dosageQuantity = `${dosageQuantityVal} ${dosageQuantityUnit}`.trim();
return {
periodTimeStart,
periodTimeEnd,
subject,
practitioner,
dosageQuantity,
};
};
const r4DTO = fhirResource => {
const subject = _get(fhirResource, 'subject');
const periodTimeStart = _get(fhirResource, 'effectivePeriod.start');
const periodTimeEnd = _get(fhirResource, 'effectivePeriod.end');
const practitioner = _get(fhirResource, 'performer.0.actor');
const dosageQuantityVal = _get(fhirResource, 'dosage.dose.value', '');
const dosageQuantityUnit = _get(fhirResource, 'dosage.dose.unit', '');
const dosageQuantity = `${dosageQuantityVal} ${dosageQuantityUnit}`.trim();
return {
subject,
practitioner,
periodTimeStart,
periodTimeEnd,
dosageQuantity,
};
};
const resourceDTO = (fhirVersion, fhirResource) => {
switch (fhirVersion) {
case fhirVersions.DSTU2: {
return {
...commonDTO(fhirResource),
...dstu2DTO(fhirResource),
};
}
case fhirVersions.STU3: {
return {
...commonDTO(fhirResource),
...stu3DTO(fhirResource),
};
}
case fhirVersions.R4: {
return {
...commonDTO(fhirResource),
...r4DTO(fhirResource),
};
}
default:
throw Error('Unrecognized the fhir version property type.');
}
};
const MedicationAdministration = props => {
const { fhirResource, fhirVersion } = props;
let fhirResourceData = {};
try {
fhirResourceData = resourceDTO(fhirVersion, fhirResource);
} catch (error) {
console.warn(error.message);
return <UnhandledResourceDataStructure resourceName="Goal" />;
}
const {
medicationReference,
subject,
practitioner,
periodTimeStart,
periodTimeEnd,
dosageRoute,
dosageQuantity,
status,
} = fhirResourceData;
return (
<Root name="MedicationAdministration">
<Header>
<Title>
<Reference fhirData={medicationReference} />
</Title>
{status && <Badge data-testid="status">{status}</Badge>}
</Header>
<Body>
{subject && (
<Value label="Patient" data-testid="patient">
<Reference fhirData={subject} />
</Value>
)}
{practitioner && (
<Value label="Practitioner" data-testid="practitioner">
<Reference fhirData={practitioner} />
</Value>
)}
<div className="overflow-auto">
<Table>
<thead>
<TableRow>
<TableHeader>Period start</TableHeader>
<TableHeader>Period end</TableHeader>
<TableHeader>Dosage route</TableHeader>
<TableHeader>Dosage quantity</TableHeader>
</TableRow>
</thead>
<tbody>
<TableRow>
<TableCell data-testid="periodTimeStart">
{periodTimeStart ? (
<Date fhirData={periodTimeStart} />
) : (
<MissingValue />
)}
</TableCell>
<TableCell data-testid="periodTimeEnd">
{periodTimeEnd ? (
<Date fhirData={periodTimeEnd} />
) : (
<MissingValue />
)}
</TableCell>
<TableCell data-testid="dosageRoute">
{dosageRoute ? (
<Coding fhirData={dosageRoute} />
) : (
<MissingValue />
)}
</TableCell>
<TableCell data-testid="dosageQuantity">
{dosageQuantity ? dosageQuantity : <MissingValue />}
</TableCell>
</TableRow>
</tbody>
</Table>
</div>
</Body>
</Root>
);
};
MedicationAdministration.propTypes = {
fhirResource: PropTypes.shape({}).isRequired,
fhirVersion: PropTypes.oneOf([
fhirVersions.DSTU2,
fhirVersions.STU3,
fhirVersions.R4,
]).isRequired,
};
export default MedicationAdministration;