diff --git a/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx b/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx
index f4150617f1f..2b44e873d1e 100644
--- a/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx
+++ b/src/Components/Facility/ConsultationDetails/ConsultationUpdatesTab.tsx
@@ -19,6 +19,8 @@ import {
formatDate,
formatDateTime,
formatPatientAge,
+ isAntenatal,
+ isPostPartum,
} from "../../../Utils/utils";
import ReadMore from "../../Common/components/Readmore";
import DailyRoundsList from "../Consultations/DailyRoundsList";
@@ -26,6 +28,7 @@ import EventsList from "./Events/EventsList";
import SwitchTabs from "../../Common/components/SwitchTabs";
import { getVitalsMonitorSocketUrl } from "../../VitalsMonitor/utils";
import { FileUpload } from "../../Patient/FileUpload";
+import CareIcon from "../../../CAREUI/icons/CareIcon";
const PageTitle = lazy(() => import("../../Common/PageTitle"));
@@ -321,6 +324,59 @@ export const ConsultationUpdatesTab = (props: ConsultationTabProps) => {
)}
+ {((props.patientData.is_antenatal &&
+ isAntenatal(props.patientData.last_menstruation_start_date)) ||
+ isPostPartum(props.patientData.date_of_delivery)) && (
+
+
+ Perinatal Status
+
+
+
+ {props.patientData.is_antenatal &&
+ isAntenatal(
+ props.patientData.last_menstruation_start_date,
+ ) && (
+
+ )}
+ {isPostPartum(props.patientData.date_of_delivery) && (
+
+ )}
+
+
+ {props.patientData.last_menstruation_start_date && (
+
+
+ Last Menstruation:
+
+ {formatDate(
+ props.patientData.last_menstruation_start_date,
+ )}
+
+
+ )}
+
+ {props.patientData.date_of_delivery && (
+
+
+ Date of Delivery:
+
+ {formatDate(props.patientData.date_of_delivery)}
+
+
+ )}
+
+ )}
{props.consultationData.symptoms_text && (
diff --git a/src/Components/Facility/ConsultationDoctorNotes/index.tsx b/src/Components/Facility/ConsultationDoctorNotes/index.tsx
index 1bb0457908c..8485c1ea8de 100644
--- a/src/Components/Facility/ConsultationDoctorNotes/index.tsx
+++ b/src/Components/Facility/ConsultationDoctorNotes/index.tsx
@@ -127,7 +127,8 @@ const ConsultationDoctorNotes = (props: ConsultationDoctorNotesProps) => {
name="note"
value={noteField}
onChange={(e) => setNoteField(e.value)}
- className="grow"
+ className="w-full grow"
+ innerClassName="pr-10"
errorClassName="hidden"
placeholder="Type your Note"
disabled={!patientActive}
diff --git a/src/Components/Facility/ConsultationForm.tsx b/src/Components/Facility/ConsultationForm.tsx
index 6a33d1d1bdf..ba248b8db6f 100644
--- a/src/Components/Facility/ConsultationForm.tsx
+++ b/src/Components/Facility/ConsultationForm.tsx
@@ -64,6 +64,7 @@ import ConfirmDialog from "../Common/ConfirmDialog.js";
import request from "../../Utils/request/request.js";
import routes from "../../Redux/api.js";
import useQuery from "../../Utils/request/useQuery.js";
+import { t } from "i18next";
const Loading = lazy(() => import("../Common/Loading"));
const PageTitle = lazy(() => import("../Common/PageTitle"));
@@ -641,6 +642,18 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => {
}
return;
}
+ case "weight":
+ case "height": {
+ if (state.form[field] && state.form.suggestion !== "DD") {
+ const value = state.form[field];
+ if (!value || parseFloat(value) <= 0) {
+ errors[field] = `Please enter a valid ${field}`;
+ invalidForm = true;
+ break;
+ }
+ }
+ return;
+ }
default:
return;
@@ -1477,7 +1490,7 @@ export const ConsultationForm = ({ facilityId, patientId, id }: Props) => {
>
{
i.text == "Expired")?.id &&
- !preDischargeForm.discharge_notes.trim()
+ DISCHARGE_REASONS.find((i) => i.text == "Expired")?.id
) {
- setErrors({
- ...errors,
- discharge_notes: "Please enter the cause of death",
- });
- setIsSendingDischargeApi(false);
- return;
+ const newErrors: Record = {};
+
+ if (!preDischargeForm.discharge_notes.trim()) {
+ newErrors["discharge_notes"] = "Please enter the cause of death";
+ }
+ if (!preDischargeForm.death_confirmed_doctor?.trim()) {
+ newErrors["death_confirmed_doctor"] = "Field is required";
+ }
+
+ if (Object.entries(newErrors).length) {
+ setErrors({ ...errors, ...newErrors });
+ setIsSendingDischargeApi(false);
+ return;
+ }
}
const dischargeDetails = {
@@ -310,6 +318,7 @@ const DischargeModal = ({
{
setPreDischargeForm((form) => {
diff --git a/src/Components/Facility/DischargedPatientsList.tsx b/src/Components/Facility/DischargedPatientsList.tsx
index eddd4a7b088..9cc90aa656b 100644
--- a/src/Components/Facility/DischargedPatientsList.tsx
+++ b/src/Components/Facility/DischargedPatientsList.tsx
@@ -256,7 +256,7 @@ const DischargedPatientsList = ({
);
diff --git a/src/Components/Facility/DoctorVideoSlideover.tsx b/src/Components/Facility/DoctorVideoSlideover.tsx
index d2591bf3600..a77a1017b6b 100644
--- a/src/Components/Facility/DoctorVideoSlideover.tsx
+++ b/src/Components/Facility/DoctorVideoSlideover.tsx
@@ -19,6 +19,18 @@ const UserGroups = {
TELEICU: "TeleICU Doctor",
};
+const courtesyTitle = (user: UserAssignedModel) => {
+ if (user.user_type === "Doctor") {
+ return "Dr." as const;
+ }
+
+ return {
+ 1: "Mr.",
+ 2: "Ms.",
+ 3: "Hey",
+ }[user.gender!];
+};
+
type UserGroup = keyof typeof UserGroups;
type UserAnnotatedWithGroup = UserAssignedModel & { group?: UserGroup };
@@ -161,7 +173,7 @@ function UserListItem({ user }: { user: UserAnnotatedWithGroup }) {
e.stopPropagation();
if (!user.alt_phone_number) return;
const phoneNumber = user.alt_phone_number;
- const message = `Hey ${user.first_name} ${user.last_name}, I have a query regarding a patient.\n\nPatient Link: ${window.location.href}`;
+ const message = `${courtesyTitle(user)} ${user.first_name} ${user.last_name}, I have a query regarding a patient.\n\nPatient Link: ${window.location.href}`;
const encodedMessage = encodeURIComponent(message);
const whatsappAppURL = `whatsapp://send?phone=${phoneNumber}&text=${encodedMessage}`;
const whatsappWebURL = `https://web.whatsapp.com/send?phone=${phoneNumber}&text=${encodedMessage}`;
diff --git a/src/Components/Facility/InventoryLog.tsx b/src/Components/Facility/InventoryLog.tsx
index 0d8673e6d01..3e2bbe11c97 100644
--- a/src/Components/Facility/InventoryLog.tsx
+++ b/src/Components/Facility/InventoryLog.tsx
@@ -9,6 +9,7 @@ import ButtonV2 from "../Common/components/ButtonV2.js";
import useQuery from "../../Utils/request/useQuery.js";
import routes from "../../Redux/api.js";
import request from "../../Utils/request/request.js";
+
const Loading = lazy(() => import("../Common/Loading"));
export default function InventoryLog(props: any) {
@@ -151,6 +152,7 @@ export default function InventoryLog(props: any) {
onClick={(_) => flagFacility(inventoryItem.external_id)}
disabled={saving}
variant="danger"
+ className="mr-2"
>
-
+
-
+
@@ -236,10 +238,12 @@ export default function InventoryLog(props: any) {
Item: {data?.results[0].item_object.name}
{data?.results && data.results[0].current_stock > 0 && (
-
- Deletes the last transaction by creating an
- equivalent undo transaction and marks both the transactions
- as accident.
+
+ Deletes the last transaction
+
+ It does by creating an equivalent undo transaction
+
+ and marks both the transactions as accident.
{
export const InvestigationTable = ({
title,
data,
+ isDischargedPatient,
handleValueChange,
changedFields,
handleUpdateCancel,
@@ -94,6 +95,7 @@ export const InvestigationTable = ({
Print Report
{
diff --git a/src/Components/Facility/Investigations/ShowInvestigation.tsx b/src/Components/Facility/Investigations/ShowInvestigation.tsx
index 2adf97f8a5c..a7f74b98fde 100644
--- a/src/Components/Facility/Investigations/ShowInvestigation.tsx
+++ b/src/Components/Facility/Investigations/ShowInvestigation.tsx
@@ -80,6 +80,11 @@ export default function ShowInvestigation(props: any) {
},
);
+ const { data: consultation } = useQuery(routes.getConsultation, {
+ pathParams: { id: consultationId },
+ prefetch: !!consultationId,
+ });
+
const handleValueChange = (value: any, name: string) => {
const changedFields = { ...state.changedFields };
set(changedFields, name, value);
@@ -151,6 +156,7 @@ export default function ShowInvestigation(props: any) {
setNoteField(e.value)}
- className="grow"
+ className="w-full grow"
errorClassName="hidden"
+ innerClassName="pr-10"
placeholder="Type your Note"
disabled={!patientActive}
onFocus={() => setFocused(true)}
diff --git a/src/Components/Facility/TriageForm.tsx b/src/Components/Facility/TriageForm.tsx
index 5cf76fbda49..6ad9fdd0e08 100644
--- a/src/Components/Facility/TriageForm.tsx
+++ b/src/Components/Facility/TriageForm.tsx
@@ -102,6 +102,17 @@ export const TriageForm = ({ facilityId, id }: Props) => {
invalidForm = true;
}
return;
+ case "num_patients_visited":
+ case "num_patients_home_quarantine":
+ case "num_patients_isolation":
+ case "num_patient_referred":
+ case "num_patient_confirmed_positive":
+ if (state.form[field] != null && state.form[field] < 0) {
+ errors[field] = "Value must be greater than or equal to 0";
+ invalidForm = true;
+ }
+ return;
+
default:
return;
}
diff --git a/src/Components/Form/FormFields/AutoExpandingTextInputFormField.tsx b/src/Components/Form/FormFields/AutoExpandingTextInputFormField.tsx
index 23f9f9011e4..43e05c47016 100644
--- a/src/Components/Form/FormFields/AutoExpandingTextInputFormField.tsx
+++ b/src/Components/Form/FormFields/AutoExpandingTextInputFormField.tsx
@@ -1,4 +1,4 @@
-import React, { useEffect, useRef } from "react";
+import { useEffect, useRef } from "react";
import TextAreaFormField, { TextAreaFormFieldProps } from "./TextAreaFormField";
type AutoExpandingTextInputFormFieldProps = TextAreaFormFieldProps & {
@@ -9,6 +9,7 @@ const AutoExpandingTextInputFormField = (
props: AutoExpandingTextInputFormFieldProps,
) => {
const myref = useRef(null);
+
useEffect(() => {
if (myref.current == null) return;
const text = myref.current.textContent?.split("\n");
@@ -24,7 +25,7 @@ const AutoExpandingTextInputFormField = (
myref.current.style.cssText = "height:" + height + "px";
});
- return ;
+ return ;
};
export default AutoExpandingTextInputFormField;
diff --git a/src/Components/Form/FormFields/TextAreaFormField.tsx b/src/Components/Form/FormFields/TextAreaFormField.tsx
index 7ce93013d4e..20373900cd2 100644
--- a/src/Components/Form/FormFields/TextAreaFormField.tsx
+++ b/src/Components/Form/FormFields/TextAreaFormField.tsx
@@ -1,6 +1,7 @@
import { forwardRef } from "react";
import FormField from "./FormField";
import { FormFieldBaseProps, useFormFieldPropsResolver } from "./Utils";
+import { classNames } from "../../../Utils/utils";
export type TextAreaFormFieldProps = FormFieldBaseProps & {
placeholder?: string;
@@ -8,6 +9,7 @@ export type TextAreaFormFieldProps = FormFieldBaseProps & {
rows?: number;
// prefixIcon?: React.ReactNode;
// suffixIcon?: React.ReactNode;
+ innerClassName?: string;
onFocus?: (event: React.FocusEvent) => void;
onBlur?: (event: React.FocusEvent) => void;
};
@@ -30,9 +32,11 @@ const TextAreaFormField = forwardRef(
onChange={(e) => field.handleChange(e.target.value)}
placeholder={props.placeholder}
rows={rows}
- className={`cui-input-base resize-none ${
- field.error && "border-danger-500"
- }`}
+ className={classNames(
+ "cui-input-base resize-none",
+ field.error && "border-danger-500",
+ props.innerClassName,
+ )}
onFocus={props.onFocus}
onBlur={props.onBlur}
/>
diff --git a/src/Components/Medicine/CreatePrescriptionForm.tsx b/src/Components/Medicine/CreatePrescriptionForm.tsx
index fcc9443eaa3..b918d5781fe 100644
--- a/src/Components/Medicine/CreatePrescriptionForm.tsx
+++ b/src/Components/Medicine/CreatePrescriptionForm.tsx
@@ -92,7 +92,7 @@ export default function CreatePrescriptionForm(props: {
optionValue={(key) => key}
/>
{field("dosage_type").value === "TITRATED" ? (
-
+
key}
/>
{field("dosage_type").value === "TITRATED" ? (
-
+
{t("edit_caution_note")}
}
- className="w-full max-w-3xl lg:min-w-[600px]"
+ className="w-full max-w-4xl lg:min-w-[768px]"
>
{t("modification_caution_note")}
}
- className="w-full max-w-3xl lg:min-w-[600px]"
+ className="w-full max-w-4xl lg:min-w-[768px]"
>
targetDosage)
- )
- return "Dosage should be between start and target dosage";
+ if (baseDosage && targetDosage) {
+ const [min, max] = [baseDosage, targetDosage].sort((a, b) => a - b);
+
+ if (!(min <= valueDosage && valueDosage <= max)) {
+ return "Dosage should be between start and target dosage";
+ }
+ }
};
};
diff --git a/src/Components/Patient/DailyRounds.tsx b/src/Components/Patient/DailyRounds.tsx
index 8f17e2dee03..713dfe097b8 100644
--- a/src/Components/Patient/DailyRounds.tsx
+++ b/src/Components/Patient/DailyRounds.tsx
@@ -13,6 +13,7 @@ import useAppHistory from "../../Common/hooks/useAppHistory";
import { DraftSection, useAutoSaveReducer } from "../../Utils/AutoSave";
import * as Notification from "../../Utils/Notifications";
import { formatDateTime } from "../../Utils/utils";
+import { capitalize } from "lodash-es";
import BloodPressureFormField, {
BloodPressureValidator,
} from "../Common/BloodPressureFormField";
@@ -296,7 +297,7 @@ export const DailyRounds = (props: any) => {
if (obj) {
dispatch({ type: "set_form", form: initForm });
Notification.Success({
- msg: "Consultation Updates details updated successfully",
+ msg: `${obj.rounds_type === "VENTILATOR" ? "Critical Care" : capitalize(obj.rounds_type)} Log Updates details updated successfully`,
});
if (["NORMAL", "TELEMEDICINE"].includes(state.form.rounds_type)) {
navigate(
@@ -316,9 +317,8 @@ export const DailyRounds = (props: any) => {
setIsLoading(false);
if (obj) {
dispatch({ type: "set_form", form: initForm });
-
Notification.Success({
- msg: "Consultation Updates details created successfully",
+ msg: `${obj.rounds_type === "VENTILATOR" ? "Critical Care" : capitalize(obj.rounds_type)} Log Updates details created successfully`,
});
if (["NORMAL", "TELEMEDICINE"].includes(state.form.rounds_type)) {
if (data.clone_last) {
diff --git a/src/Components/Patient/FileUpload.tsx b/src/Components/Patient/FileUpload.tsx
index 34be3dddd54..81e92efdf8b 100644
--- a/src/Components/Patient/FileUpload.tsx
+++ b/src/Components/Patient/FileUpload.tsx
@@ -13,7 +13,7 @@ import { VoiceRecorder } from "../../Utils/VoiceRecorder";
import Pagination from "../Common/Pagination";
import { RESULTS_PER_PAGE_LIMIT } from "../../Common/constants";
import imageCompression from "browser-image-compression";
-import { formatDateTime } from "../../Utils/utils";
+import { classNames, formatDateTime } from "../../Utils/utils";
import { useTranslation } from "react-i18next";
import HeadedTabs from "../Common/HeadedTabs";
import ButtonV2, { Cancel, Submit } from "../Common/components/ButtonV2";
@@ -258,6 +258,11 @@ export const FileUpload = (props: FileUploadProps) => {
prefetch: !!patientId,
});
+ const { data: consultation } = useQuery(routes.getConsultation, {
+ pathParams: { id: consultationId },
+ prefetch: !!consultationId,
+ });
+
const captureImage = () => {
setPreviewImage(webRef.current.getScreenshot());
const canvas = webRef.current.getCanvas();
@@ -1526,6 +1531,7 @@ export const FileUpload = (props: FileUploadProps) => {
)}
{
{({ isAuthorized }) =>
isAuthorized ? (
-
setModalOpenForCamera(true)}
className="w-full"
>
diff --git a/src/Components/Patient/ManagePatients.tsx b/src/Components/Patient/ManagePatients.tsx
index 35a5bbfea02..ff4838c5822 100644
--- a/src/Components/Patient/ManagePatients.tsx
+++ b/src/Components/Patient/ManagePatients.tsx
@@ -31,7 +31,11 @@ import RecordMeta from "../../CAREUI/display/RecordMeta";
import SearchInput from "../Form/SearchInput";
import SortDropdownMenu from "../Common/SortDropdown";
import SwitchTabs from "../Common/components/SwitchTabs";
-import { formatPatientAge, parsePhoneNumber } from "../../Utils/utils.js";
+import {
+ formatPatientAge,
+ isAntenatal,
+ parsePhoneNumber,
+} from "../../Utils/utils.js";
import useFilters from "../../Common/hooks/useFilters";
import { useTranslation } from "react-i18next";
import Page from "../Common/components/Page.js";
@@ -577,6 +581,16 @@ export const PatientManager = () => {
text="Readmission"
/>
)}
+ {patient.last_consultation?.suggestion === "A" &&
+ patient.last_consultation.facility === patient.facility &&
+ !patient.last_consultation.discharge_date && (
+
+ )}
{patient.disease_status === "POSITIVE" && (
{
)}
{patient.gender === 2 &&
patient.is_antenatal &&
+ isAntenatal(patient.last_menstruation_start_date) &&
patient.is_active && (
value && dayjs(value).isValid() && dayjs(value).toDate();
export default function PatientFilter(props: any) {
+ const authUser = useAuthUser();
const { kasp_enabled, kasp_string } = useConfig();
const { filter, onChange, closeFilter, removeFilters } = props;
@@ -318,23 +320,17 @@ export default function PatientFilter(props: any) {
onChange={(v) => setFilterState({ ...filterState, gender: v })}
/>
- {!props.discharged && (
- <>
-
- Category
- o.text}
- optionValue={(o) => o.id}
- value={filterState.category}
- onChange={(v) =>
- setFilterState({ ...filterState, category: v })
- }
- />
-
- >
- )}
+
+ Category
+ o.text}
+ optionValue={(o) => o.id}
+ value={filterState.category}
+ onChange={(v) => setFilterState({ ...filterState, category: v })}
+ />
+
Age
@@ -366,84 +362,78 @@ export default function PatientFilter(props: any) {
/>
- {!props.discharged && (
- <>
-
-
- Admitted to (Bed Types)
-
- o.id}
- optionLabel={(o) => o.text}
- onChange={(o) =>
- setFilterState({
- ...filterState,
- last_consultation_admitted_bed_type_list: o,
- })
- }
- />
-
- >
- )}
-
- Discharge Reason
-
+ Admitted to (Bed Types)
+ o.id}
optionLabel={(o) => o.text}
onChange={(o) =>
setFilterState({
...filterState,
- last_consultation__new_discharge_reason: o,
+ last_consultation_admitted_bed_type_list: o,
})
}
/>
- {!props.discharged && (
- <>
-
- Telemedicine
- o.text}
- optionValue={(o) => o.id}
- value={filterState.last_consultation_is_telemedicine}
- onChange={(v) =>
- setFilterState({
- ...filterState,
- last_consultation_is_telemedicine: v,
- })
- }
- />
-
-
-
- Respiratory Support
- o.text}
- optionValue={(o) => o.id}
- value={filterState.ventilator_interface}
- onChange={(v) =>
- setFilterState({
- ...filterState,
- ventilator_interface: v,
- })
- }
- />
-
- >
+ {(props.dischargePage ||
+ ["StateAdmin", "StateReadOnlyAdmin"].includes(
+ authUser.user_type,
+ )) && (
+
+ Discharge Reason
+ o.id}
+ optionLabel={(o) => o.text}
+ onChange={(o) =>
+ setFilterState({
+ ...filterState,
+ last_consultation__new_discharge_reason: o,
+ })
+ }
+ />
+
)}
+ Telemedicine
+ o.text}
+ optionValue={(o) => o.id}
+ value={filterState.last_consultation_is_telemedicine}
+ onChange={(v) =>
+ setFilterState({
+ ...filterState,
+ last_consultation_is_telemedicine: v,
+ })
+ }
+ />
+
+
+ Respiratory Support
+ o.text}
+ optionValue={(o) => o.id}
+ value={filterState.ventilator_interface}
+ onChange={(v) =>
+ setFilterState({
+ ...filterState,
+ ventilator_interface: v,
+ })
+ }
+ />
+
+ {/*
Is Antenatal
+ */}
+
+ Review Missed
+ (o === "true" ? "Yes" : "No")}
+ value={filterState.review_missed}
+ onChange={(v) =>
+ setFilterState({ ...filterState, review_missed: v })
+ }
+ />
+
+
+ Is Medico-Legal Case
+
+ o === "true" ? "Medico-Legal" : "Non-Medico-Legal"
+ }
+ value={filterState.last_consultation_medico_legal_case}
+ onChange={(v) =>
+ setFilterState({
+ ...filterState,
+ last_consultation_medico_legal_case: v,
+ })
+ }
+ />
- {!props.discharged && (
- <>
-
- Review Missed
- (o === "true" ? "Yes" : "No")}
- value={filterState.review_missed}
- onChange={(v) =>
- setFilterState({ ...filterState, review_missed: v })
- }
- />
-
-
-
- Is Medico-Legal Case
-
-
- o === "true" ? "Medico-Legal" : "Non-Medico-Legal"
- }
- value={filterState.last_consultation_medico_legal_case}
- onChange={(v) =>
- setFilterState({
- ...filterState,
- last_consultation_medico_legal_case: v,
- })
- }
- />
-
- >
- )}
- {!props.discharged && (
- <>
-
- ICD-11 Diagnoses based
-
- }
- expanded
- className="w-full"
- >
- {FILTER_BY_DIAGNOSES_KEYS.map((name) => (
-
- ))}
-
- >
- )}
+
+ ICD-11 Diagnoses based
+
+ }
+ expanded
+ className="w-full"
+ >
+ {FILTER_BY_DIAGNOSES_KEYS.map((name) => (
+
+ ))}
+
@@ -548,26 +528,19 @@ export default function PatientFilter(props: any) {
onChange={handleDateRangeChange}
errorClassName="hidden"
/>
- {!props.discharged && (
- <>
-
- >
- )}
-
+
- {!props.discharged && (
- <>
-
+
+
+
+ Geography based
+
+ }
+ expanded={true}
+ className="rounded-md"
+ >
+
+
+ Facility
+ setFilterWithRef("facility", obj)}
+ />
+
+ {filterState.facility && (
+
+ Location
+
+ setFilterState({
+ ...filterState,
+ last_consultation_current_bed__location: selected,
+ })
+ }
/>
- >
+
)}
-
-
- {!props.discharged && (
- <>
-
- Geography based
-
- }
- expanded={true}
- className="rounded-md"
- >
-
-
- Facility
- setFilterWithRef("facility", obj)}
- />
-
- {filterState.facility && (
-
- Location
-
- setFilterState({
- ...filterState,
- last_consultation_current_bed__location: selected,
- })
- }
- />
-
+
+ Facility type
+ o.text}
+ optionValue={(o) => o.text}
+ value={filterState.facility_type}
+ onChange={(v) =>
+ setFilterState({ ...filterState, facility_type: v })
+ }
+ optionIcon={() => (
+
)}
-
- Facility type
- o.text}
- optionValue={(o) => o.text}
- value={filterState.facility_type}
- onChange={(v) =>
- setFilterState({ ...filterState, facility_type: v })
- }
- optionIcon={() => (
-
- )}
- />
-
-
- LSG Body
-
- setFilterWithRef("lsgBody", obj)}
- optionLabel={(option) => option.name}
- compareBy="id"
- />
-
-
+ />
+
+
+ LSG Body
+
+ setFilterWithRef("lsgBody", obj)}
+ optionLabel={(option) => option.name}
+ compareBy="id"
+ />
+
+
-
- District
- setFilterWithRef("district", obj)}
- errors={""}
- />
-
+
+ District
+ setFilterWithRef("district", obj)}
+ errors={""}
+ />
+
+
+
+
+ COVID Details based
+
+ }
+ expanded={false}
+ className="w-full rounded-md"
+ >
+
+ {kasp_enabled && (
+
+ {kasp_string}
+
+ o ? `Show ${kasp_string}` : `Show Non ${kasp_string}`
+ }
+ value={filterState.is_kasp}
+ onChange={(v) => setFilterState({ ...filterState, is_kasp: v })}
+ />
-
-
- COVID Details based
-
- }
- expanded={false}
- className="w-full rounded-md"
- >
-
- {kasp_enabled && (
-
- {kasp_string}
-
- o ? `Show ${kasp_string}` : `Show Non ${kasp_string}`
- }
- value={filterState.is_kasp}
- onChange={(v) =>
- setFilterState({ ...filterState, is_kasp: v })
- }
- />
-
- )}
+ )}
-
-
- COVID Disease status
-
- o}
- value={filterState.disease_status}
- onChange={(v) =>
- setFilterState({ ...filterState, disease_status: v })
- }
- />
-
-
- COVID Vaccinated
- text}
- optionValue={({ id }) => id}
- optionIcon={({ id }) => (
- <>
-
- {id}
- >
- )}
- value={filterState.number_of_doses}
- onChange={(v) =>
- setFilterState({ ...filterState, number_of_doses: v })
- }
- />
-
-
-
- Declared as COVID Positive
-
- o.text}
- optionValue={(o) => o.id}
- value={filterState.is_declared_positive}
- onChange={(v) =>
- setFilterState({ ...filterState, is_declared_positive: v })
- }
- />
-
+
+ COVID Disease status
+ o}
+ value={filterState.disease_status}
+ onChange={(v) =>
+ setFilterState({ ...filterState, disease_status: v })
+ }
+ />
+
+
+ COVID Vaccinated
+ text}
+ optionValue={({ id }) => id}
+ optionIcon={({ id }) => (
+ <>
+
+ {id}
+ >
+ )}
+ value={filterState.number_of_doses}
+ onChange={(v) =>
+ setFilterState({ ...filterState, number_of_doses: v })
+ }
+ />
+
+
+
+ Declared as COVID Positive
+
+ o.text}
+ optionValue={(o) => o.id}
+ value={filterState.is_declared_positive}
+ onChange={(v) =>
+ setFilterState({ ...filterState, is_declared_positive: v })
+ }
+ />
+
-
- SRF ID}
- value={filterState.srf_id}
- onChange={handleFormFieldChange}
- errorClassName="hidden"
- />
-
-
- CoWIN ID}
- value={filterState.covin_id}
- onChange={handleFormFieldChange}
- errorClassName="hidden"
- />
-
+
+ SRF ID}
+ value={filterState.srf_id}
+ onChange={handleFormFieldChange}
+ errorClassName="hidden"
+ />
+
+
+ CoWIN ID}
+ value={filterState.covin_id}
+ onChange={handleFormFieldChange}
+ errorClassName="hidden"
+ />
+
-
-
+
+
-
-
-
- >
- )}
+
+
+
);
}
diff --git a/src/Components/Patient/PatientHome.tsx b/src/Components/Patient/PatientHome.tsx
index 3e1e9b0a09a..7492f29c5c7 100644
--- a/src/Components/Patient/PatientHome.tsx
+++ b/src/Components/Patient/PatientHome.tsx
@@ -19,6 +19,8 @@ import {
formatDate,
formatDateTime,
formatPatientAge,
+ isAntenatal,
+ isPostPartum,
} from "../../Utils/utils";
import ButtonV2 from "../Common/components/ButtonV2";
import { NonReadOnlyUsers } from "../../Utils/AuthorizeFor";
@@ -368,16 +370,29 @@ export const PatientHome = (props: any) => {
) : (
)}
- {patientData.gender === 2 &&
- patientData.is_antenatal &&
- patientData.is_active && (
-
- )}
+ {patientData.gender === 2 && (
+ <>
+ {patientData.is_antenatal &&
+ isAntenatal(
+ patientData.last_menstruation_start_date,
+ ) && (
+
+ )}
+ {isPostPartum(patientData.date_of_delivery) && (
+
+ )}
+ >
+ )}
{patientData.contact_with_confirmed_carrier && (
{
+
+
+
+ No Consultation History Available
+
+
+
>
{(item) => (
{
+
+
+
+ No Sample Test History Available
+
+
+
>
{(item) => (
- Treating Physician:{" "}
+ {t("treating_doctor")}:{" "}
{consultation?.treating_physician_object
? `${consultation?.treating_physician_object.first_name} ${consultation?.treating_physician_object.last_name}`
@@ -470,6 +470,27 @@ export default function PatientInfoCard(props: {
className="col-span-2 flex w-full flex-col items-center justify-center gap-2 px-4 py-1 lg:col-span-1 2xl:flex-row"
id="consultation-buttons"
>
+ {consultation?.suggestion === "A" && (
+
+
+
+
+ {dayjs(consultation.discharge_date || undefined).diff(
+ consultation.encounter_date,
+ "day",
+ )}
+
+
+
+
+ IP Days
+
+
+ )}
{consultation?.last_daily_round && (
diff --git a/src/Components/Patient/PatientRegister.tsx b/src/Components/Patient/PatientRegister.tsx
index dea0484a67c..cfc497a2893 100644
--- a/src/Components/Patient/PatientRegister.tsx
+++ b/src/Components/Patient/PatientRegister.tsx
@@ -63,6 +63,7 @@ import useQuery from "../../Utils/request/useQuery.js";
import routes from "../../Redux/api.js";
import request from "../../Utils/request/request.js";
import SelectMenuV2 from "../Form/SelectMenuV2.js";
+import Checkbox from "../Common/components/CheckBox.js";
const Loading = lazy(() => import("../Common/Loading"));
const PageTitle = lazy(() => import("../Common/PageTitle"));
@@ -222,6 +223,8 @@ export const PatientRegister = (props: PatientRegisterProps) => {
const [insuranceDetails, setInsuranceDetails] = useState (
[],
);
+ const [isEmergencyNumberEnabled, setIsEmergencyNumberEnabled] =
+ useState(false);
const [insuranceDetailsError, setInsuranceDetailsError] =
useState();
@@ -423,6 +426,9 @@ export const PatientRegister = (props: PatientRegisterProps) => {
village: data.village ? data.village : "",
medical_history: [] as number[],
is_antenatal: String(!!data.is_antenatal),
+ last_menstruation_start_date: data.last_menstruation_start_date,
+ date_of_delivery: data.date_of_delivery,
+ is_postpartum: String(!!data.date_of_delivery),
allergies: data.allergies ? data.allergies : "",
pincode: data.pincode ? data.pincode : "",
ongoing_medication: data.ongoing_medication
@@ -467,6 +473,9 @@ export const PatientRegister = (props: PatientRegisterProps) => {
: null,
};
formData.sameAddress = data.address === data.permanent_address;
+ setIsEmergencyNumberEnabled(
+ data.phone_number === data.emergency_phone_number,
+ );
(data.medical_history ? data.medical_history : []).forEach(
(i: any) => {
const medicalHistory = MEDICAL_HISTORY_CHOICES.find(
@@ -547,6 +556,16 @@ export const PatientRegister = (props: PatientRegisterProps) => {
case "gender":
errors[field] = RequiredFieldValidator()(form[field]);
return;
+ case "last_menstruation_start_date":
+ if (form.is_antenatal === "true") {
+ errors[field] = RequiredFieldValidator()(form[field]);
+ }
+ return;
+ case "date_of_delivery":
+ if (form.is_postpartum === "true") {
+ errors[field] = RequiredFieldValidator()(form[field]);
+ }
+ return;
case "age":
case "date_of_birth": {
const field = ageInputType === "age" ? "age" : "date_of_birth";
@@ -649,6 +668,12 @@ export const PatientRegister = (props: PatientRegisterProps) => {
errors[field] = "Please select a blood group";
}
return;
+ case "number_of_primary_contacts":
+ case "number_of_secondary_contacts":
+ if (form[field] && form[field] < 0) {
+ errors[field] = "Value cannot be negative";
+ }
+ return;
case "is_vaccinated":
if (form.is_vaccinated === "true") {
@@ -789,6 +814,14 @@ export const PatientRegister = (props: PatientRegisterProps) => {
gender: Number(formData.gender),
nationality: formData.nationality,
is_antenatal: formData.is_antenatal,
+ last_menstruation_start_date:
+ formData.is_antenatal === "true"
+ ? dateQueryString(formData.last_menstruation_start_date)
+ : null,
+ date_of_delivery:
+ formData.is_postpartum === "true"
+ ? dateQueryString(formData.date_of_delivery)
+ : null,
passport_no:
formData.nationality !== "India" ? formData.passport_no : undefined,
state: formData.nationality === "India" ? formData.state : undefined,
@@ -1178,7 +1211,7 @@ export const PatientRegister = (props: PatientRegisterProps) => {
)}
<>
-
{
label="Emergency contact number"
required
types={["mobile", "landline"]}
+ disabled={isEmergencyNumberEnabled}
/>
@@ -1446,6 +1506,20 @@ export const PatientRegister = (props: PatientRegisterProps) => {
required
label="Gender"
options={genderTypes}
+ onChange={(e) => {
+ field("gender").onChange(e);
+ if (e.value !== "2") {
+ field("is_antenatal").onChange({
+ name: "is_antenatal",
+ value: "false",
+ });
+
+ field("is_postpartum").onChange({
+ name: "is_postpartum",
+ value: "false",
+ });
+ }
+ }}
optionLabel={(o: any) => o.text}
optionValue={(o: any) => o.id}
/>
@@ -1457,7 +1531,7 @@ export const PatientRegister = (props: PatientRegisterProps) => {
{
}
+
+ {
+
+
+
+ }
+
+
+ option.label}
+ optionValue={(option) => option.value}
+ />
+
+
+
+
+
{
setExpandWorkingHours(true);
setSelectedUser(user.username);
@@ -423,7 +423,9 @@ export default function ManageUsers() {
}}
>
- Set Average weekly working hours
+
+ Set Average weekly working hours
+
)}
@@ -465,7 +467,7 @@ export default function ManageUsers() {
open={expandFacilityList}
setOpen={setExpandFacilityList}
slideFrom="right"
- title={t("facilities")}
+ title={t("linked_facilities")}
dialogClass="md:w-[400px]"
>
@@ -728,6 +730,7 @@ export function UserFacilities(props: { user: any }) {
handleOk={handleUnlinkFacilitySubmit}
/>
)}
+
+
+
{isLoading || userFacilitiesLoading ? (
@@ -757,13 +762,23 @@ export function UserFacilities(props: { user: any }) {
{/* Home Facility section */}
{user?.home_facility_object && (
-
-
- {t("home_facility")}
-
+
-
- {user?.home_facility_object?.name}
+
+
+ {user?.home_facility_object?.name}{" "}
+
+
+ Home Facility
+
+
-
)}
{/* Linked Facilities section */}
{!!userFacilities?.results.length && (
-
-
- {t("linked_facilities")}
-
+
{userFacilities.results.map(
(facility: FacilityModel, i: number) => {
diff --git a/src/Components/Users/models.tsx b/src/Components/Users/models.tsx
index b0ef2b909cd..4aa315ea6f9 100644
--- a/src/Components/Users/models.tsx
+++ b/src/Components/Users/models.tsx
@@ -1,4 +1,4 @@
-import { UserRole } from "../../Common/constants";
+import { GENDER_TYPES, UserRole } from "../../Common/constants";
import { DistrictModel, LocalBodyModel, StateModel } from "../Facility/models";
interface HomeFacilityObjectModel {
@@ -64,7 +64,7 @@ export interface UserAssignedModel extends UserBareMinimum {
phone_number?: string;
alt_phone_number?: string;
video_connect_link: string;
- gender?: number;
+ gender?: (typeof GENDER_TYPES)[number]["id"];
date_of_birth: Date | null;
is_superuser?: boolean;
verified?: boolean;
diff --git a/src/Locale/en/Common.json b/src/Locale/en/Common.json
index 84466c99a72..e2556587e96 100644
--- a/src/Locale/en/Common.json
+++ b/src/Locale/en/Common.json
@@ -162,5 +162,6 @@
"DD/MM/YYYY": "DD/MM/YYYY",
"clear_all_filters": "Clear All Filters",
"summary": "Summary",
- "report": "Report"
+ "report": "Report",
+ "treating_doctor":"Treating Doctor"
}
\ No newline at end of file
diff --git a/src/Utils/VoiceRecorder.tsx b/src/Utils/VoiceRecorder.tsx
index f087291ad9b..cd38d29773f 100644
--- a/src/Utils/VoiceRecorder.tsx
+++ b/src/Utils/VoiceRecorder.tsx
@@ -8,6 +8,7 @@ import { useTranslation } from "react-i18next";
export const VoiceRecorder = (props: any) => {
const { t } = useTranslation();
const {
+ isDisabled,
createAudioBlob,
confirmAudioBlobExists,
reset,
@@ -75,6 +76,7 @@ export const VoiceRecorder = (props: any) => {
{!audioURL && (
{
}
return value.toFixed(2);
};
+
+export const isPostPartum = (data_of_delivery?: string) => {
+ return dayjs().diff(data_of_delivery, "week") <= 6;
+};
+
+export const isAntenatal = (menstruation_start_date?: string) => {
+ return dayjs().diff(menstruation_start_date, "month") <= 9;
+};
| |