From 308379ecf566eb7c641ac384b5686db54a8b36a1 Mon Sep 17 00:00:00 2001 From: Ashesh <3626859+Ashesh3@users.noreply.github.com> Date: Tue, 26 Sep 2023 15:19:46 +0530 Subject: [PATCH] Display patient age in mm dd when younger than 1y (#6342) --- .../ConsultationUpdatesTab.tsx | 9 +++++-- .../Investigations/Reports/ReportTable.tsx | 12 +++++++-- .../Facility/Investigations/Reports/index.tsx | 5 +++- src/Components/Facility/LegacyMonitorCard.tsx | 3 ++- src/Components/Facility/TreatmentSummary.tsx | 5 ++-- src/Components/Patient/ManagePatients.tsx | 6 +++-- src/Components/Patient/PatientHome.tsx | 9 +++++-- src/Components/Patient/PatientInfoCard.tsx | 4 +-- src/Components/Patient/SampleDetails.tsx | 4 +-- src/Components/Shifting/ListView.tsx | 9 +++++-- src/Components/Shifting/ShiftDetails.tsx | 14 +++++++--- src/Components/Shifting/ShiftingBoard.tsx | 9 +++++-- src/Utils/utils.ts | 27 +++++++++++++++++++ 13 files changed, 92 insertions(+), 24 deletions(-) diff --git a/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx b/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx index 705b3d9479a..1b89f3980e1 100644 --- a/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx +++ b/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx @@ -10,7 +10,7 @@ import useVitalsAspectRatioConfig from "../../VitalsMonitor/useVitalsAspectRatio import { DISCHARGE_REASONS, SYMPTOM_CHOICES } from "../../../Common/constants"; import PrescriptionsTable from "../../Medicine/PrescriptionsTable"; import Chip from "../../../CAREUI/display/Chip"; -import { formatDate, formatDateTime } from "../../../Utils/utils"; +import { formatAge, formatDate, formatDateTime } from "../../../Utils/utils"; import ReadMore from "../../Common/components/Readmore"; import { DailyRoundsList } from "../Consultations/DailyRoundsList"; @@ -621,7 +621,12 @@ export const ConsultationUpdatesTab = (props: ConsultationTabProps) => {
Age {" - "} - {props.patientData.age ?? "-"} + {props.patientData.age !== undefined // 0 is a valid age, so we need to check for undefined + ? formatAge( + props.patientData.age, + props.patientData.date_of_birth + ) + : "-"}
diff --git a/src/Components/Facility/Investigations/Reports/ReportTable.tsx b/src/Components/Facility/Investigations/Reports/ReportTable.tsx index 0826ff904fc..1f20ec94180 100644 --- a/src/Components/Facility/Investigations/Reports/ReportTable.tsx +++ b/src/Components/Facility/Investigations/Reports/ReportTable.tsx @@ -2,7 +2,7 @@ import { getColorIndex, rowColor, transformData } from "./utils"; import ButtonV2 from "../../../Common/components/ButtonV2"; import { InvestigationResponse } from "./types"; -import { formatDateTime } from "../../../../Utils/utils"; +import { formatAge, formatDateTime } from "../../../../Utils/utils"; import { FC } from "react"; const ReportRow = ({ data, name, min, max }: any) => { @@ -53,6 +53,7 @@ interface ReportTableProps { patientDetails?: { name: string; age: number; + date_of_birth: string; hospitalName: string; }; investigationData: InvestigationResponse; @@ -83,7 +84,14 @@ const ReportTable: FC = ({ {patientDetails && (

Name: {patientDetails.name}

-

Age: {patientDetails.age}

+

+ Age:{" "} + {formatAge( + patientDetails.age, + patientDetails.date_of_birth, + true + )} +

Hospital: {patientDetails.hospitalName}

)} diff --git a/src/Components/Facility/Investigations/Reports/index.tsx b/src/Components/Facility/Investigations/Reports/index.tsx index c4c69bc9169..ab5380c62ca 100644 --- a/src/Components/Facility/Investigations/Reports/index.tsx +++ b/src/Components/Facility/Investigations/Reports/index.tsx @@ -100,8 +100,9 @@ const InvestigationReports = ({ id }: any) => { const [patientDetails, setPatientDetails] = useState<{ name: string; age: number; + date_of_birth: string; hospitalName: string; - }>({ name: "", age: -1, hospitalName: "" }); + }>({ name: "", age: -1, date_of_birth: "", hospitalName: "" }); const [state, dispatch] = useReducer( investigationReportsReducer, initialState @@ -220,6 +221,7 @@ const InvestigationReports = ({ id }: any) => { setPatientDetails({ name: res.data.name, age: res.data.age, + date_of_birth: res.data.date_of_birth, hospitalName: res.data.facility_object.name, }); } @@ -227,6 +229,7 @@ const InvestigationReports = ({ id }: any) => { setPatientDetails({ name: "", age: -1, + date_of_birth: "", hospitalName: "", }); } diff --git a/src/Components/Facility/LegacyMonitorCard.tsx b/src/Components/Facility/LegacyMonitorCard.tsx index 9f9fb8f1ea0..61bff3d607b 100644 --- a/src/Components/Facility/LegacyMonitorCard.tsx +++ b/src/Components/Facility/LegacyMonitorCard.tsx @@ -4,6 +4,7 @@ import CareIcon from "../../CAREUI/icons/CareIcon"; import { PatientModel } from "../Patient/models"; import LegacyPatientVitalsCard from "../Patient/LegacyPatientVitalsCard"; import { AssetLocationObject } from "../Assets/AssetTypes"; +import { formatAge } from "../../Utils/utils"; interface MonitorCardProps { facilityId: string; @@ -28,7 +29,7 @@ export const LegacyMonitorCard = ({ {patient.name} - {patient.age}y |{" "} + {formatAge(patient.age, patient.date_of_birth)} |{" "} {GENDER_TYPES.find((g) => g.id === patient.gender)?.icon} diff --git a/src/Components/Facility/TreatmentSummary.tsx b/src/Components/Facility/TreatmentSummary.tsx index dbca307d38b..3fbd80ac8b2 100644 --- a/src/Components/Facility/TreatmentSummary.tsx +++ b/src/Components/Facility/TreatmentSummary.tsx @@ -10,7 +10,7 @@ import { statusType, useAbortableEffect } from "../../Common/utils"; import { PatientModel } from "../Patient/models"; import { GENDER_TYPES } from "../../Common/constants"; -import { formatDate, formatDateTime } from "../../Utils/utils"; +import { formatAge, formatDate, formatDateTime } from "../../Utils/utils"; const Loading = lazy(() => import("../Common/Loading")); const TreatmentSummary = (props: any) => { @@ -132,7 +132,8 @@ const TreatmentSummary = (props: any) => {
- Age : {patientData.age} + Age :{" "} + {formatAge(patientData.age, patientData.date_of_birth, true)}
Date of admission : diff --git a/src/Components/Patient/ManagePatients.tsx b/src/Components/Patient/ManagePatients.tsx index 423edb894c9..6e83eb9bc91 100644 --- a/src/Components/Patient/ManagePatients.tsx +++ b/src/Components/Patient/ManagePatients.tsx @@ -37,7 +37,7 @@ import SearchInput from "../Form/SearchInput"; import SortDropdownMenu from "../Common/SortDropdown"; import SwitchTabs from "../Common/components/SwitchTabs"; import { parseOptionId } from "../../Common/utils"; -import { parsePhoneNumber } from "../../Utils/utils.js"; +import { formatAge, parsePhoneNumber } from "../../Utils/utils.js"; import { useDispatch } from "react-redux"; import useFilters from "../../Common/hooks/useFilters"; import { useTranslation } from "react-i18next"; @@ -558,7 +558,9 @@ export const PatientManager = () => {
{patient.name} - {`${patient.age} yrs.`} + + {formatAge(patient.age, patient.date_of_birth, true)} +
diff --git a/src/Components/Patient/PatientHome.tsx b/src/Components/Patient/PatientHome.tsx index 8fdc0f51280..b6ceaf2e4dc 100644 --- a/src/Components/Patient/PatientHome.tsx +++ b/src/Components/Patient/PatientHome.tsx @@ -19,7 +19,7 @@ import { ConsultationModel } from "../Facility/models"; import { PatientModel, SampleTestModel } from "./models"; import { SampleTestCard } from "./SampleTestCard"; import Chip from "../../CAREUI/display/Chip"; -import { classNames, formatDateTime } from "../../Utils/utils"; +import { classNames, formatAge, formatDateTime } from "../../Utils/utils"; import ButtonV2 from "../Common/components/ButtonV2"; import { NonReadOnlyUsers } from "../../Utils/AuthorizeFor"; import RelativeDateUserMention from "../Common/RelativeDateUserMention"; @@ -476,7 +476,12 @@ export const PatientHome = (props: any) => {

- {patientData.name} - {patientData.age} + {patientData.name} -{" "} + {formatAge( + patientData.age, + patientData.date_of_birth, + true + )}

{patientData.is_vaccinated ? ( diff --git a/src/Components/Patient/PatientInfoCard.tsx b/src/Components/Patient/PatientInfoCard.tsx index dbb4aac34ce..701b76b5e3a 100644 --- a/src/Components/Patient/PatientInfoCard.tsx +++ b/src/Components/Patient/PatientInfoCard.tsx @@ -20,7 +20,7 @@ import { PatientModel } from "./models"; import { getDimensionOrDash } from "../../Common/utils"; import useConfig from "../../Common/hooks/useConfig"; import { useState } from "react"; -import { formatDate, formatDateTime } from "../../Utils/utils.js"; +import { formatAge, formatDate, formatDateTime } from "../../Utils/utils.js"; import dayjs from "../../Utils/dayjs"; export default function PatientInfoCard(props: { @@ -171,7 +171,7 @@ export default function PatientInfoCard(props: {

)}

- {patient.age} years + {formatAge(patient.age, patient.date_of_birth, true)} {patient.gender} {consultation?.suggestion === "DC" && ( diff --git a/src/Components/Patient/SampleDetails.tsx b/src/Components/Patient/SampleDetails.tsx index a5f802115bd..7814109978b 100644 --- a/src/Components/Patient/SampleDetails.tsx +++ b/src/Components/Patient/SampleDetails.tsx @@ -8,7 +8,7 @@ import Card from "../../CAREUI/display/Card"; import { FileUpload } from "./FileUpload"; import Page from "../Common/components/Page"; import _ from "lodash"; -import { formatDateTime } from "../../Utils/utils"; +import { formatAge, formatDateTime } from "../../Utils/utils"; import { getTestSample } from "../../Redux/actions"; import { navigate } from "raviger"; @@ -118,7 +118,7 @@ export const SampleDetails = ({ id }: SampleDetailsProps) => { ) : (

Age: - {patientData?.age} + {formatAge(patientData.age, patientData.date_of_birth)}
)}
diff --git a/src/Components/Shifting/ListView.tsx b/src/Components/Shifting/ListView.tsx index dddfd275f9d..6d55122ea11 100644 --- a/src/Components/Shifting/ListView.tsx +++ b/src/Components/Shifting/ListView.tsx @@ -12,7 +12,7 @@ import { ExportButton } from "../Common/Export"; import ListFilter from "./ListFilter"; import Page from "../Common/components/Page"; import SearchInput from "../Form/SearchInput"; -import { formatDateTime } from "../../Utils/utils"; +import { formatAge, formatDateTime } from "../../Utils/utils"; import { formatFilter } from "./Commons"; import { navigate } from "raviger"; import useConfig from "../../Common/hooks/useConfig"; @@ -127,7 +127,12 @@ export default function ListView() {
- {shift.patient_object.name} - {shift.patient_object.age} + {shift.patient_object.name} -{" "} + {formatAge( + shift.patient_object.age, + shift.patient_object.date_of_birth, + true + )}
{shift.emergency && ( diff --git a/src/Components/Shifting/ShiftDetails.tsx b/src/Components/Shifting/ShiftDetails.tsx index 8215bd21e31..03e09702aac 100644 --- a/src/Components/Shifting/ShiftDetails.tsx +++ b/src/Components/Shifting/ShiftDetails.tsx @@ -18,7 +18,7 @@ import { CopyToClipboard } from "react-copy-to-clipboard"; import Page from "../Common/components/Page"; import QRCode from "qrcode.react"; import RecordMeta from "../../CAREUI/display/RecordMeta"; -import { formatDateTime } from "../../Utils/utils"; +import { formatAge, formatDateTime } from "../../Utils/utils"; import useConfig from "../../Common/hooks/useConfig"; import { useDispatch } from "react-redux"; import { useTranslation } from "react-i18next"; @@ -110,7 +110,13 @@ export default function ShiftDetails(props: { id: string }) { "\n" + t("age") + ":" + - data?.patient_object?.age + + +( + formatAge( + data?.patient_object?.age, + data?.patient_object?.date_of_birth, + true + ) ?? "-" + ) + "\n" + t("origin_facility") + ":" + @@ -195,7 +201,7 @@ export default function ShiftDetails(props: { id: string }) { {t("age")}:{" "} - {patientData?.age} + {formatAge(patientData?.age, patientData?.date_of_birth, true)}
)} {patientData?.gender === 2 && patientData?.is_antenatal && ( @@ -380,7 +386,7 @@ export default function ShiftDetails(props: { id: string }) { {t("age")}:{" "} - {patientData?.age} + {formatAge(patientData.age, patientData.date_of_birth, true)}
diff --git a/src/Components/Shifting/ShiftingBoard.tsx b/src/Components/Shifting/ShiftingBoard.tsx index 71a33afdda8..7c065d0c0a8 100644 --- a/src/Components/Shifting/ShiftingBoard.tsx +++ b/src/Components/Shifting/ShiftingBoard.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from "react"; -import { classNames, formatDateTime } from "../../Utils/utils"; +import { classNames, formatAge, formatDateTime } from "../../Utils/utils"; import { completeTransfer, downloadShiftRequests, @@ -78,7 +78,12 @@ const ShiftCard = ({ shift, filter }: any) => {
- {shift.patient_object.name} - {shift.patient_object.age} + {shift.patient_object.name} -{" "} + {formatAge( + shift.patient_object?.age, + shift.patient_object?.age.date_of_birth, + true + )}
{shift.emergency && ( diff --git a/src/Utils/utils.ts b/src/Utils/utils.ts index 1c702e75e86..3aef5b03d67 100644 --- a/src/Utils/utils.ts +++ b/src/Utils/utils.ts @@ -379,3 +379,30 @@ export const getCountryCode = (phoneNumber: string) => { } return undefined; }; + +export const formatAge = ( + age?: number, + date_of_birth?: string, + abbreviated = false +) => { + if (!age && !date_of_birth) return undefined; + if (!age) age = 0; + + const daySuffix = abbreviated ? "d" : "days"; + const monthSuffix = abbreviated ? "mo" : "months"; + const yearSuffix = abbreviated ? "yr" : "years"; + + if (age < 1 && date_of_birth) { + const dob = new Date(date_of_birth); + const today = new Date(); + const diffTime = Math.abs(today.getTime() - dob.getTime()); + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); + const months = Math.floor(diffDays / 30); + const days = diffDays % 30; + if (months === 0) { + return `${days} ${daySuffix}`; + } + return `${months} ${monthSuffix} ${days} ${daySuffix}`; + } + return `${age} ${yearSuffix}`; +};