@@ -69,43 +71,56 @@ const Location = ({
name,
description,
middleware_address,
+ location_type,
+ created_date,
+ modified_date,
id,
}: LocationModel) => (
-
-
-
-
- {name}
-
- {description || "-"}
-
-
-
- {middleware_address}
-
+
+
+
+
+ {description || "-"}
+
+
+ Middleware Address:
+
+
+ {middleware_address || "-"}
+
-
-
-
- Edit
-
-
-
- Manage Beds
-
+
+
+ Manage Beds
+
+
+
+
+
);
diff --git a/src/Components/Facility/models.tsx b/src/Components/Facility/models.tsx
index 92daaf4ca5b..bfb5750504a 100644
--- a/src/Components/Facility/models.tsx
+++ b/src/Components/Facility/models.tsx
@@ -1,7 +1,7 @@
import { AssignedToObjectModel, DailyRoundsModel } from "../Patient/models";
import { ProcedureType } from "../Common/prescription-builder/ProcedureBuilder";
import { NormalPrescription, PRNPrescription } from "../Medicine/models";
-import { AssetData } from "../Assets/AssetTypes";
+import { AssetData, AssetLocationType } from "../Assets/AssetTypes";
import { UserBareMinimum } from "../Users/models";
import { RouteToFacility } from "../Common/RouteToFacilitySelect";
import { ConsultationDiagnosis, CreateDiagnosis } from "../Diagnosis/types";
@@ -205,9 +205,12 @@ export interface LocationModel {
name?: string;
description?: string;
middleware_address?: string;
+ location_type?: AssetLocationType;
facility?: {
name: string;
};
+ created_date?: string;
+ modified_date?: string;
}
export interface BedModel {
From 23af9e05f50490412f630443c42aa6c3c7148d6f Mon Sep 17 00:00:00 2001
From: Pranshu Aggarwal <70687348+Pranshu1902@users.noreply.github.com>
Date: Wed, 20 Dec 2023 20:34:28 +0530
Subject: [PATCH 06/14] Add Consultation Specific route for Doctor Notes
(#6851)
* add new route
* refactor
* show consultation specific notes by passing consultation param in api
* use useQuery
* refactor
* fix offset calls
* refactor props
* use common component
* separate files for notes
* auto fetch on adding new note
* refactor
* remove dispatch
* remove dispatch on patient notes
* use request instead of usequery on consultation notes page
* replace useQuery with request on patient notes
* remove dispatch
* useQuery and change model name
---
.../Facility/ConsultationDetails/index.tsx | 1 +
.../ConsultationDoctorNotes/index.tsx | 135 ++++++++++++++++++
src/Components/Facility/DoctorNote.tsx | 45 ++++++
.../Facility/PatientConsultationNotesList.tsx | 87 +++++++++++
src/Components/Facility/PatientNotesList.tsx | 125 +++++-----------
.../Facility/PatientNotesSlideover.tsx | 48 +++++--
src/Components/Facility/models.tsx | 6 +
src/Components/Patient/PatientNotes.tsx | 40 ++++--
src/Redux/api.tsx | 5 +
src/Routers/routes/ConsultationRoutes.tsx | 9 ++
10 files changed, 388 insertions(+), 113 deletions(-)
create mode 100644 src/Components/Facility/ConsultationDoctorNotes/index.tsx
create mode 100644 src/Components/Facility/DoctorNote.tsx
create mode 100644 src/Components/Facility/PatientConsultationNotesList.tsx
diff --git a/src/Components/Facility/ConsultationDetails/index.tsx b/src/Components/Facility/ConsultationDetails/index.tsx
index 54eee52878e..c1086a67221 100644
--- a/src/Components/Facility/ConsultationDetails/index.tsx
+++ b/src/Components/Facility/ConsultationDetails/index.tsx
@@ -475,6 +475,7 @@ export const ConsultationDetails = (props: any) => {
)}
diff --git a/src/Components/Facility/ConsultationDoctorNotes/index.tsx b/src/Components/Facility/ConsultationDoctorNotes/index.tsx
new file mode 100644
index 00000000000..dd96ef9af1e
--- /dev/null
+++ b/src/Components/Facility/ConsultationDoctorNotes/index.tsx
@@ -0,0 +1,135 @@
+import { useState } from "react";
+import * as Notification from "../../../Utils/Notifications.js";
+import Page from "../../Common/components/Page";
+import TextFormField from "../../Form/FormFields/TextFormField";
+import ButtonV2 from "../../Common/components/ButtonV2";
+import CareIcon from "../../../CAREUI/icons/CareIcon";
+import { NonReadOnlyUsers } from "../../../Utils/AuthorizeFor";
+import { useMessageListener } from "../../../Common/hooks/useMessageListener";
+import PatientConsultationNotesList from "../PatientConsultationNotesList.js";
+import { PatientNoteStateType } from "../models.js";
+import routes from "../../../Redux/api.js";
+import request from "../../../Utils/request/request.js";
+import useQuery from "../../../Utils/request/useQuery.js";
+
+interface ConsultationDoctorNotesProps {
+ patientId: string;
+ facilityId: string;
+ consultationId: string;
+}
+
+const ConsultationDoctorNotes = (props: ConsultationDoctorNotesProps) => {
+ const { patientId, facilityId, consultationId } = props;
+
+ const [patientActive, setPatientActive] = useState(true);
+ const [noteField, setNoteField] = useState("");
+ const [reload, setReload] = useState(false);
+ const [facilityName, setFacilityName] = useState("");
+ const [patientName, setPatientName] = useState("");
+
+ const initialData: PatientNoteStateType = {
+ notes: [],
+ cPage: 1,
+ totalPages: 1,
+ };
+ const [state, setState] = useState(initialData);
+
+ const onAddNote = async () => {
+ const payload = {
+ note: noteField,
+ consultation: consultationId,
+ };
+ if (!/\S+/.test(noteField)) {
+ Notification.Error({
+ msg: "Note Should Contain At Least 1 Character",
+ });
+ return;
+ }
+
+ const { res } = await request(routes.addPatientNote, {
+ pathParams: {
+ patientId: patientId,
+ },
+ body: payload,
+ });
+
+ if (res?.status === 201) {
+ Notification.Success({ msg: "Note added successfully" });
+ setState({ ...state, cPage: 1 });
+ setNoteField("");
+ setReload(true);
+ }
+ };
+
+ useQuery(routes.getPatient, {
+ pathParams: { id: patientId },
+ onResponse: ({ data }) => {
+ if (data) {
+ setPatientActive(data.is_active ?? true);
+ setPatientName(data.name ?? "");
+ setFacilityName(data.facility_object?.name ?? "");
+ }
+ },
+ });
+
+ useMessageListener((data) => {
+ const message = data?.message;
+ if (
+ (message?.from == "patient/doctor_notes/create" ||
+ message?.from == "patient/doctor_notes/edit") &&
+ message?.facility_id == facilityId &&
+ message?.patient_id == patientId
+ ) {
+ setReload(true);
+ }
+ });
+
+ return (
+
+
+
+
+
+ setNoteField(e.value)}
+ className="grow"
+ type="text"
+ errorClassName="hidden"
+ placeholder="Type your Note"
+ disabled={!patientActive}
+ />
+
+
+
+
+
+
+ );
+};
+
+export default ConsultationDoctorNotes;
diff --git a/src/Components/Facility/DoctorNote.tsx b/src/Components/Facility/DoctorNote.tsx
new file mode 100644
index 00000000000..85703a1e3d8
--- /dev/null
+++ b/src/Components/Facility/DoctorNote.tsx
@@ -0,0 +1,45 @@
+import InfiniteScroll from "react-infinite-scroll-component";
+import CircularProgress from "../Common/components/CircularProgress";
+import PatientNoteCard from "./PatientNoteCard";
+import { PatientNoteStateType } from "./models";
+
+interface DoctorNoteProps {
+ state: PatientNoteStateType;
+ handleNext: () => void;
+}
+
+const DoctorNote = (props: DoctorNoteProps) => {
+ const { state, handleNext } = props;
+ return (
+
+ {state.notes.length ? (
+
+
+
+ }
+ className="flex h-full flex-col-reverse p-2"
+ inverse={true}
+ dataLength={state.notes.length}
+ scrollableTarget="patient-notes-list"
+ >
+ {state.notes.map((note: any) => (
+
+ ))}
+
+ ) : (
+
+ No Notes Found
+
+ )}
+
+ );
+};
+
+export default DoctorNote;
diff --git a/src/Components/Facility/PatientConsultationNotesList.tsx b/src/Components/Facility/PatientConsultationNotesList.tsx
new file mode 100644
index 00000000000..f38de51110b
--- /dev/null
+++ b/src/Components/Facility/PatientConsultationNotesList.tsx
@@ -0,0 +1,87 @@
+import { useEffect, useState } from "react";
+import { RESULTS_PER_PAGE_LIMIT } from "../../Common/constants";
+import CircularProgress from "../Common/components/CircularProgress";
+import routes from "../../Redux/api";
+import { PatientNoteStateType } from "./models";
+import useSlug from "../../Common/hooks/useSlug";
+import DoctorNote from "./DoctorNote";
+import request from "../../Utils/request/request";
+
+interface PatientNotesProps {
+ state: PatientNoteStateType;
+ setState: any;
+ patientId: string;
+ facilityId: string;
+ reload?: boolean;
+ setReload?: any;
+}
+
+const pageSize = RESULTS_PER_PAGE_LIMIT;
+
+const PatientConsultationNotesList = (props: PatientNotesProps) => {
+ const { state, setState, reload, setReload } = props;
+ const consultationId = useSlug("consultation") ?? "";
+
+ const [isLoading, setIsLoading] = useState(true);
+
+ const fetchNotes = async () => {
+ setIsLoading(true);
+ const { data }: any = await request(routes.getPatientNotes, {
+ pathParams: {
+ patientId: props.patientId,
+ },
+ query: {
+ consultation: consultationId,
+ offset: (state.cPage - 1) * RESULTS_PER_PAGE_LIMIT,
+ },
+ });
+
+ if (state.cPage === 1) {
+ setState((prevState: any) => ({
+ ...prevState,
+ notes: data.results,
+ totalPages: Math.ceil(data.count / pageSize),
+ }));
+ } else {
+ setState((prevState: any) => ({
+ ...prevState,
+ notes: [...prevState.notes, ...data.results],
+ totalPages: Math.ceil(data.count / pageSize),
+ }));
+ }
+ setIsLoading(false);
+ setReload(false);
+ };
+
+ useEffect(() => {
+ if (reload) {
+ fetchNotes();
+ }
+ }, [reload]);
+
+ useEffect(() => {
+ setReload(true);
+ }, []);
+
+ const handleNext = () => {
+ if (state.cPage < state.totalPages) {
+ setState((prevState: any) => ({
+ ...prevState,
+ cPage: prevState.cPage + 1,
+ }));
+ setReload(true);
+ }
+ };
+
+ if (isLoading && !state.notes.length) {
+ return (
+
+
+
+ );
+ }
+
+ return
;
+};
+
+export default PatientConsultationNotesList;
diff --git a/src/Components/Facility/PatientNotesList.tsx b/src/Components/Facility/PatientNotesList.tsx
index 330bca4b06d..96f9dcad871 100644
--- a/src/Components/Facility/PatientNotesList.tsx
+++ b/src/Components/Facility/PatientNotesList.tsx
@@ -1,86 +1,68 @@
-import { useCallback, useState, useEffect } from "react";
-import { useDispatch } from "react-redux";
-import { statusType, useAbortableEffect } from "../../Common/utils";
-import { getPatientNotes } from "../../Redux/actions";
+import { useState, useEffect } from "react";
import { RESULTS_PER_PAGE_LIMIT } from "../../Common/constants";
import CircularProgress from "../Common/components/CircularProgress";
-import PatientNoteCard from "./PatientNoteCard";
-import InfiniteScroll from "react-infinite-scroll-component";
-import { NoteType } from "./PatientNoteCard";
+import DoctorNote from "./DoctorNote";
+import { PatientNoteStateType } from "./models";
+import routes from "../../Redux/api";
+import request from "../../Utils/request/request";
interface PatientNotesProps {
- patientId: any;
- facilityId: any;
+ state: PatientNoteStateType;
+ setState: any;
+ patientId: string;
+ facilityId: string;
reload?: boolean;
setReload?: any;
}
-interface StateType {
- notes: NoteType[];
- cPage: number;
- totalPages: number;
-}
-
const pageSize = RESULTS_PER_PAGE_LIMIT;
const PatientNotesList = (props: PatientNotesProps) => {
- const { reload, setReload } = props;
+ const { state, setState, reload, setReload } = props;
- const dispatch: any = useDispatch();
- const initialData: StateType = { notes: [], cPage: 1, totalPages: 1 };
- const [state, setState] = useState(initialData);
const [isLoading, setIsLoading] = useState(true);
- const fetchData = useCallback(
- async (page = 1, status: statusType = { aborted: false }) => {
- setIsLoading(true);
- const res = await dispatch(
- getPatientNotes(props.patientId, pageSize, (page - 1) * pageSize)
- );
- if (!status.aborted) {
- if (res && res.data) {
- if (page === 1) {
- setState({
- notes: res.data?.results,
- cPage: page,
- totalPages: Math.ceil(res.data.count / pageSize),
- });
- } else {
- setState((prevState: any) => ({
- ...prevState,
- notes: [...prevState.notes, ...res.data.results],
- cPage: page,
- totalPages: Math.ceil(res.data.count / pageSize),
- }));
- }
- }
- setIsLoading(false);
- }
- },
- [props.patientId, dispatch]
- );
+ const fetchNotes = async () => {
+ setIsLoading(true);
+ const { data }: any = await request(routes.getPatientNotes, {
+ pathParams: { patientId: props.patientId },
+ query: { offset: (state.cPage - 1) * RESULTS_PER_PAGE_LIMIT },
+ });
+
+ if (state.cPage === 1) {
+ setState((prevState: any) => ({
+ ...prevState,
+ notes: data.results,
+ totalPages: Math.ceil(data.count / pageSize),
+ }));
+ } else {
+ setState((prevState: any) => ({
+ ...prevState,
+ notes: [...prevState.notes, ...data.results],
+ totalPages: Math.ceil(data.count / pageSize),
+ }));
+ }
+ setIsLoading(false);
+ setReload(false);
+ };
useEffect(() => {
if (reload) {
- fetchData(1);
- setReload(false);
+ fetchNotes();
}
}, [reload]);
- useAbortableEffect(
- (status: statusType) => {
- fetchData(1, status);
- },
- [fetchData]
- );
+ useEffect(() => {
+ setReload(true);
+ }, []);
const handleNext = () => {
if (state.cPage < state.totalPages) {
- fetchData(state.cPage + 1);
setState((prevState: any) => ({
...prevState,
cPage: prevState.cPage + 1,
}));
+ setReload(true);
}
};
@@ -92,36 +74,7 @@ const PatientNotesList = (props: PatientNotesProps) => {
);
}
- return (
-
- {state.notes.length ? (
-
-
-
- }
- className="flex h-full flex-col-reverse p-2"
- inverse={true}
- dataLength={state.notes.length}
- scrollableTarget="patient-notes-list"
- >
- {state.notes.map((note: any) => (
-
- ))}
-
- ) : (
-
- No Notes Found
-
- )}
-
- );
+ return
;
};
export default PatientNotesList;
diff --git a/src/Components/Facility/PatientNotesSlideover.tsx b/src/Components/Facility/PatientNotesSlideover.tsx
index b268500f6cf..8b08d9767db 100644
--- a/src/Components/Facility/PatientNotesSlideover.tsx
+++ b/src/Components/Facility/PatientNotesSlideover.tsx
@@ -1,8 +1,5 @@
import { useState, useEffect, Dispatch, SetStateAction } from "react";
-import { getPatient, addPatientNote } from "../../Redux/actions";
import * as Notification from "../../Utils/Notifications.js";
-import { useDispatch } from "react-redux";
-import PatientNotesList from "./PatientNotesList";
import { NonReadOnlyUsers } from "../../Utils/AuthorizeFor";
import CareIcon from "../../CAREUI/icons/CareIcon";
import { classNames } from "../../Utils/utils";
@@ -10,10 +7,15 @@ import TextFormField from "../Form/FormFields/TextFormField";
import ButtonV2 from "../Common/components/ButtonV2";
import { make as Link } from "../Common/components/Link.bs";
import { useMessageListener } from "../../Common/hooks/useMessageListener";
+import PatientConsultationNotesList from "./PatientConsultationNotesList";
+import request from "../../Utils/request/request";
+import routes from "../../Redux/api";
+import { PatientNoteStateType } from "./models";
interface PatientNotesProps {
patientId: string;
facilityId: string;
+ consultationId: string;
setShowPatientNotesPopup: Dispatch
>;
}
@@ -23,13 +25,20 @@ export default function PatientNotesSlideover(props: PatientNotesProps) {
const [noteField, setNoteField] = useState("");
const [reload, setReload] = useState(false);
- const dispatch = useDispatch();
+ const initialData: PatientNoteStateType = {
+ notes: [],
+ cPage: 1,
+ totalPages: 1,
+ };
+ const [state, setState] = useState(initialData);
- const { facilityId, patientId, setShowPatientNotesPopup } = props;
+ const { facilityId, patientId, consultationId, setShowPatientNotesPopup } =
+ props;
- const onAddNote = () => {
+ const onAddNote = async () => {
const payload = {
note: noteField,
+ consultation: consultationId,
};
if (!/\S+/.test(noteField)) {
Notification.Error({
@@ -37,11 +46,16 @@ export default function PatientNotesSlideover(props: PatientNotesProps) {
});
return;
}
- dispatch(addPatientNote(patientId, payload)).then(() => {
+ const { res } = await request(routes.addPatientNote, {
+ pathParams: { patientId: patientId },
+ body: payload,
+ });
+ if (res?.status === 201) {
Notification.Success({ msg: "Note added successfully" });
setNoteField("");
- setReload(!reload);
- });
+ setState({ ...state, cPage: 1 });
+ setReload(true);
+ }
};
useMessageListener((data) => {
@@ -59,21 +73,23 @@ export default function PatientNotesSlideover(props: PatientNotesProps) {
useEffect(() => {
async function fetchPatientName() {
if (patientId) {
- const res = await dispatch(getPatient({ id: patientId }));
- if (res.data) {
- setPatientActive(res.data.is_active);
+ const { data } = await request(routes.getPatient, {
+ pathParams: { id: patientId },
+ });
+ if (data) {
+ setPatientActive(data.is_active ?? true);
}
}
}
fetchPatientName();
- }, [dispatch, patientId]);
+ }, [patientId]);
const notesActionIcons = (
{show && (
@@ -122,7 +138,9 @@ export default function PatientNotesSlideover(props: PatientNotesProps) {
{notesActionIcons}
{/* Doctor Notes Body */}
- {
const [facilityName, setFacilityName] = useState("");
const [patientName, setPatientName] = useState("");
- const dispatch = useDispatch();
+ const initialData: PatientNoteStateType = {
+ notes: [],
+ cPage: 1,
+ totalPages: 1,
+ };
+ const [state, setState] = useState(initialData);
- const onAddNote = () => {
+ const onAddNote = async () => {
const payload = {
note: noteField,
};
@@ -36,26 +42,34 @@ const PatientNotes = (props: PatientNotesProps) => {
});
return;
}
- dispatch(addPatientNote(patientId, payload)).then(() => {
+
+ const { res } = await request(routes.addPatientNote, {
+ pathParams: { patientId: patientId },
+ body: payload,
+ });
+ if (res?.status === 201) {
Notification.Success({ msg: "Note added successfully" });
setNoteField("");
setReload(!reload);
- });
+ setState({ ...state, cPage: 1 });
+ }
};
useEffect(() => {
async function fetchPatientName() {
if (patientId) {
- const res = await dispatch(getPatient({ id: patientId }));
- if (res.data) {
- setPatientActive(res.data.is_active);
- setPatientName(res.data.name);
- setFacilityName(res.data.facility_object.name);
+ const { data } = await request(routes.getPatient, {
+ pathParams: { id: patientId },
+ });
+ if (data) {
+ setPatientActive(data.is_active ?? true);
+ setPatientName(data.name ?? "");
+ setFacilityName(data.facility_object?.name ?? "");
}
}
}
fetchPatientName();
- }, [dispatch, patientId]);
+ }, [patientId]);
useMessageListener((data) => {
const message = data?.message;
@@ -81,6 +95,8 @@ const PatientNotes = (props: PatientNotesProps) => {
>
(),
TRes: Type(),
},
updatePatient: {
@@ -614,10 +616,13 @@ const routes = {
getPatientNotes: {
path: "/api/v1/patient/{patientId}/notes/",
method: "GET",
+ TBody: Type(),
+ TRes: Type>(),
},
addPatientNote: {
path: "/api/v1/patient/{patientId}/notes/",
method: "POST",
+ TRes: Type(),
},
sampleTestList: {
path: "/api/v1/patient/{patientId}/test_sample/",
diff --git a/src/Routers/routes/ConsultationRoutes.tsx b/src/Routers/routes/ConsultationRoutes.tsx
index 4f1d6e7d75d..401358717eb 100644
--- a/src/Routers/routes/ConsultationRoutes.tsx
+++ b/src/Routers/routes/ConsultationRoutes.tsx
@@ -8,6 +8,7 @@ import { FileUpload } from "../../Components/Patient/FileUpload";
import { make as CriticalCareRecording } from "../../Components/CriticalCareRecording/CriticalCareRecording.bs";
import { ConsultationDetails } from "../../Components/Facility/ConsultationDetails";
import TreatmentSummary from "../../Components/Facility/TreatmentSummary";
+import ConsultationDoctorNotes from "../../Components/Facility/ConsultationDoctorNotes";
export default {
"/facility/:facilityId/patient/:patientId/consultation": ({
@@ -129,6 +130,14 @@ export default {
dailyRoundsListData={[]}
/>
),
+ "/facility/:facilityId/patient/:patientId/consultation/:consultationId/notes":
+ ({ facilityId, patientId, consultationId }: any) => (
+
+ ),
"/facility/:facilityId/patient/:patientId/consultation/:consultationId/:tab":
({ facilityId, patientId, consultationId, tab }: any) => (
Date: Thu, 21 Dec 2023 11:02:23 +0530
Subject: [PATCH 07/14] Rename "Admission Date" to encounter specific labels
(#6719)
* Rename `admission_date` to `encounter_date`
* Whitelabel fields
* fix colaescing issue
* fix minor bug
* minor fix
---
src/Common/constants.tsx | 5 +-
src/Components/DeathReport/DeathReport.tsx | 4 +-
src/Components/Facility/ConsultationCard.tsx | 4 +-
.../Facility/ConsultationDetails/index.tsx | 12 +--
src/Components/Facility/ConsultationForm.tsx | 75 ++++++++++---------
src/Components/Facility/DischargeModal.tsx | 6 +-
src/Components/Facility/TreatmentSummary.tsx | 2 +-
src/Components/Facility/models.tsx | 5 +-
src/Components/Patient/ManagePatients.tsx | 18 ++---
src/Components/Patient/PatientFilter.tsx | 30 ++++----
src/Components/Patient/PatientInfoCard.tsx | 8 +-
src/Components/Shifting/ShiftDetails.tsx | 5 +-
12 files changed, 87 insertions(+), 87 deletions(-)
diff --git a/src/Common/constants.tsx b/src/Common/constants.tsx
index 069a39e1539..23c02e389f3 100644
--- a/src/Common/constants.tsx
+++ b/src/Common/constants.tsx
@@ -330,7 +330,10 @@ export const CONSULTATION_SUGGESTION = [
{ id: "OP", text: "OP Consultation" },
{ id: "DC", text: "Domiciliary Care" },
{ id: "DD", text: "Declare Death" },
-];
+] as const;
+
+export type ConsultationSuggestionValue =
+ (typeof CONSULTATION_SUGGESTION)[number]["id"];
export const ADMITTED_TO = [
{ id: "1", text: "Isolation" },
diff --git a/src/Components/DeathReport/DeathReport.tsx b/src/Components/DeathReport/DeathReport.tsx
index 9908b4fa852..3901996e119 100644
--- a/src/Components/DeathReport/DeathReport.tsx
+++ b/src/Components/DeathReport/DeathReport.tsx
@@ -115,8 +115,8 @@ export default function PrintDeathReport(props: { id: string }) {
date_declared_positive: res.data?.date_declared_positive
? dayjs(res.data?.date_declared_positive).toDate()
: "",
- date_of_admission: res.data?.last_consultation?.admission_date
- ? dayjs(res.data?.last_consultation?.admission_date).toDate()
+ date_of_admission: res.data?.last_consultation?.encounter_date
+ ? dayjs(res.data?.last_consultation?.encounter_date).toDate()
: "",
date_of_test: res.data?.date_of_test
? dayjs(res.data?.date_of_test).toDate()
diff --git a/src/Components/Facility/ConsultationCard.tsx b/src/Components/Facility/ConsultationCard.tsx
index 2c0fa54db21..c402853f366 100644
--- a/src/Components/Facility/ConsultationCard.tsx
+++ b/src/Components/Facility/ConsultationCard.tsx
@@ -63,14 +63,14 @@ export const ConsultationCard = (props: ConsultationProps) => {
)}
- {itemData.admitted && itemData.admission_date && (
+ {itemData.admitted && itemData.encounter_date && (
Admitted on
- {formatDateTime(itemData.admission_date)}
+ {formatDateTime(itemData.encounter_date)}
{itemData.is_readmission && (
{
name:
consultationData.suggestion === "A"
? `Admitted on ${formatDateTime(
- consultationData.admission_date!
+ consultationData.encounter_date!
)}`
: consultationData.suggestion_text,
},
@@ -345,19 +345,19 @@ export const ConsultationDetails = (props: any) => {
{consultationData.admitted_to}
- {(consultationData.admission_date ??
- consultationData.discharge_date) && (
+ {(consultationData.discharge_date ??
+ consultationData.encounter_date) && (
{relativeTime(
consultationData.discharge_date
? consultationData.discharge_date
- : consultationData.admission_date
+ : consultationData.encounter_date
)}
)}
- {consultationData.admission_date &&
- formatDateTime(consultationData.admission_date)}
+ {consultationData.encounter_date &&
+ formatDateTime(consultationData.encounter_date)}
{consultationData.discharge_date &&
` - ${formatDateTime(consultationData.discharge_date)}`}
diff --git a/src/Components/Facility/ConsultationForm.tsx b/src/Components/Facility/ConsultationForm.tsx
index 3207787a27d..72944389235 100644
--- a/src/Components/Facility/ConsultationForm.tsx
+++ b/src/Components/Facility/ConsultationForm.tsx
@@ -3,6 +3,7 @@ import * as Notification from "../../Utils/Notifications.js";
import { BedModel, FacilityModel } from "./models";
import {
CONSULTATION_SUGGESTION,
+ ConsultationSuggestionValue,
PATIENT_CATEGORIES,
REVIEW_AT_CHOICES,
TELEMEDICINE_ACTIONS,
@@ -82,14 +83,14 @@ type FormDetails = {
symptoms: number[];
other_symptoms: string;
symptoms_onset_date?: Date;
- suggestion: string;
+ suggestion: ConsultationSuggestionValue;
route_to_facility?: RouteToFacility;
patient: string;
facility: string;
admitted: BooleanStrings;
admitted_to: string;
category: string;
- admission_date?: Date;
+ encounter_date?: Date;
icu_admission_date?: Date;
discharge_date: null;
referred_to?: string;
@@ -139,7 +140,7 @@ const initForm: FormDetails = {
admitted: "false",
admitted_to: "",
category: "",
- admission_date: new Date(),
+ encounter_date: new Date(),
icu_admission_date: undefined,
discharge_date: null,
referred_to: "",
@@ -375,7 +376,7 @@ export const ConsultationForm = (props: any) => {
const formData = {
...res.data,
symptoms_onset_date: isoStringToDate(res.data.symptoms_onset_date),
- admission_date: isoStringToDate(res.data.admission_date),
+ encounter_date: isoStringToDate(res.data.encounter_date),
icu_admission_date: isoStringToDate(res.data.icu_admission_date),
admitted: res.data.admitted ? String(res.data.admitted) : "false",
admitted_to: res.data.admitted_to ? res.data.admitted_to : "",
@@ -485,15 +486,12 @@ export const ConsultationForm = (props: any) => {
invalidForm = true;
}
return;
- case "admission_date":
- if (
- ["A", "DC"].includes(state.form.suggestion) &&
- !state.form[field]
- ) {
+ case "encounter_date":
+ if (!state.form[field]) {
errors[field] = "Field is required";
invalidForm = true;
}
- if (dayjs(state.form.admission_date).isBefore(dayjs("2000-01-01"))) {
+ if (dayjs(state.form.encounter_date).isBefore(dayjs("2000-01-01"))) {
errors[field] = "Admission date cannot be before 01/01/2000";
invalidForm = true;
}
@@ -685,9 +683,7 @@ export const ConsultationForm = (props: any) => {
suggestion: state.form.suggestion,
route_to_facility: state.form.route_to_facility,
admitted: state.form.suggestion === "A",
- admission_date: ["A", "DC"].includes(state.form.suggestion)
- ? state.form.admission_date
- : undefined,
+ encounter_date: state.form.encounter_date,
category: state.form.category,
is_kasp: state.form.is_kasp,
kasp_enabled_date: JSON.parse(state.form.is_kasp) ? new Date() : null,
@@ -1134,7 +1130,7 @@ export const ConsultationForm = (props: any) => {
label="Decision after consultation"
{...selectField("suggestion")}
options={CONSULTATION_SUGGESTION.filter(
- ({ deprecated }) => !deprecated
+ (option) => !("deprecated" in option)
)}
/>
@@ -1200,30 +1196,35 @@ export const ConsultationForm = (props: any) => {
>
)}
- {["A", "DC"].includes(state.form.suggestion) && (
-
+
-
-
- )}
+ label={
+ {
+ A: "Date & Time of Admission to the Facility",
+ DC: "Date & Time of Domiciliary Care commencement",
+ OP: "Date & Time of Out-patient visit",
+ DD: "Date & Time of Encounter",
+ HI: "Date & Time of Encounter",
+ R: "Date & Time of Encounter",
+ }[state.form.suggestion]
+ }
+ type="datetime-local"
+ value={dayjs(state.form.encounter_date).format(
+ "YYYY-MM-DDTHH:mm"
+ )}
+ max={dayjs().format("YYYY-MM-DDTHH:mm")}
+ />
+
{state.form.route_to_facility === 30 && (
({ ...form, ...updates }));
}}
required
- min={dayjs(
- consultationData?.admission_date ?? consultationData?.created_date
- ).format("YYYY-MM-DDTHH:mm")}
+ min={dayjs(consultationData?.encounter_date).format(
+ "YYYY-MM-DDTHH:mm"
+ )}
max={dayjs().format("YYYY-MM-DDTHH:mm")}
error={
preDischargeForm.discharge_reason === "EXP"
diff --git a/src/Components/Facility/TreatmentSummary.tsx b/src/Components/Facility/TreatmentSummary.tsx
index 7adb4dcfbe2..8291e0e8ba4 100644
--- a/src/Components/Facility/TreatmentSummary.tsx
+++ b/src/Components/Facility/TreatmentSummary.tsx
@@ -140,7 +140,7 @@ const TreatmentSummary = (props: any) => {
Date of admission :
{consultationData.admitted
- ? formatDateTime(consultationData.admission_date)
+ ? formatDateTime(consultationData.encounter_date)
: " --/--/----"}
diff --git a/src/Components/Facility/models.tsx b/src/Components/Facility/models.tsx
index 0cf0a4da986..c4a5196511d 100644
--- a/src/Components/Facility/models.tsx
+++ b/src/Components/Facility/models.tsx
@@ -5,6 +5,7 @@ import { AssetData, AssetLocationType } from "../Assets/AssetTypes";
import { UserBareMinimum } from "../Users/models";
import { RouteToFacility } from "../Common/RouteToFacilitySelect";
import { ConsultationDiagnosis, CreateDiagnosis } from "../Diagnosis/types";
+import { ConsultationSuggestionValue } from "../../Common/constants";
export interface LocalBodyModel {
id: number;
@@ -93,7 +94,7 @@ export type PatientCategory =
| "Critical";
export interface ConsultationModel {
- admission_date?: string;
+ encounter_date: string;
icu_admission_date?: string;
admitted?: boolean;
test_id?: string;
@@ -123,7 +124,7 @@ export interface ConsultationModel {
referred_by_external?: string;
transferred_from_location?: LocationModel["id"];
transferred_from_location_object?: LocationModel;
- suggestion?: string;
+ suggestion?: ConsultationSuggestionValue;
patient_no?: string;
route_to_facility?: RouteToFacility;
is_kasp?: boolean;
diff --git a/src/Components/Patient/ManagePatients.tsx b/src/Components/Patient/ManagePatients.tsx
index 9113e8654bf..e1d982148f1 100644
--- a/src/Components/Patient/ManagePatients.tsx
+++ b/src/Components/Patient/ManagePatients.tsx
@@ -194,10 +194,10 @@ export const PatientManager = () => {
date_of_result_after: qParams.date_of_result_after || undefined,
last_consultation_medico_legal_case:
qParams.last_consultation_medico_legal_case || undefined,
- last_consultation_admission_date_before:
- qParams.last_consultation_admission_date_before || undefined,
- last_consultation_admission_date_after:
- qParams.last_consultation_admission_date_after || undefined,
+ last_consultation_encounter_date_before:
+ qParams.last_consultation_encounter_date_before || undefined,
+ last_consultation_encounter_date_after:
+ qParams.last_consultation_encounter_date_after || undefined,
last_consultation_discharge_date_before:
qParams.last_consultation_discharge_date_before || undefined,
last_consultation_discharge_date_after:
@@ -239,8 +239,8 @@ export const PatientManager = () => {
[params.date_of_result_before, params.date_of_result_after],
[params.last_vaccinated_date_before, params.last_vaccinated_date_after],
[
- params.last_consultation_admission_date_before,
- params.last_consultation_admission_date_after,
+ params.last_consultation_encounter_date_before,
+ params.last_consultation_encounter_date_after,
],
[
params.last_consultation_discharge_date_before,
@@ -345,8 +345,8 @@ export const PatientManager = () => {
}, [
dispatch,
qParams.last_consultation_medico_legal_case,
- qParams.last_consultation_admission_date_before,
- qParams.last_consultation_admission_date_after,
+ qParams.last_consultation_encounter_date_before,
+ qParams.last_consultation_encounter_date_after,
qParams.last_consultation_discharge_date_before,
qParams.last_consultation_discharge_date_after,
qParams.age_max,
@@ -967,7 +967,7 @@ export const PatientManager = () => {
badge("IP/OP number", "patient_no"),
...dateRange("Modified", "modified_date"),
...dateRange("Created", "created_date"),
- ...dateRange("Admitted", "last_consultation_admission_date"),
+ ...dateRange("Admitted", "last_consultation_encounter_date"),
...dateRange("Discharged", "last_consultation_discharge_date"),
// Admitted to type badges
badge("No. of vaccination doses", "number_of_doses"),
diff --git a/src/Components/Patient/PatientFilter.tsx b/src/Components/Patient/PatientFilter.tsx
index 0599cb2625b..481d2dcc67b 100644
--- a/src/Components/Patient/PatientFilter.tsx
+++ b/src/Components/Patient/PatientFilter.tsx
@@ -67,10 +67,10 @@ export default function PatientFilter(props: any) {
date_declared_positive: filter.date_declared_positive || null,
last_consultation_medico_legal_case:
filter.last_consultation_medico_legal_case || null,
- last_consultation_admission_date_before:
- filter.last_consultation_admission_date_before || null,
- last_consultation_admission_date_after:
- filter.last_consultation_admission_date_after || null,
+ last_consultation_encounter_date_before:
+ filter.last_consultation_encounter_date_before || null,
+ last_consultation_encounter_date_after:
+ filter.last_consultation_encounter_date_after || null,
last_consultation_discharge_date_before:
filter.last_consultation_discharge_date_before || null,
last_consultation_discharge_date_after:
@@ -125,8 +125,8 @@ export default function PatientFilter(props: any) {
date_of_result: null,
date_declared_positive: null,
last_consultation_medico_legal_case: null,
- last_consultation_admission_date_before: "",
- last_consultation_admission_date_after: "",
+ last_consultation_encounter_date_before: "",
+ last_consultation_encounter_date_after: "",
last_consultation_discharge_date_before: "",
last_consultation_discharge_date_after: "",
last_consultation_admitted_to_list: [],
@@ -236,8 +236,8 @@ export default function PatientFilter(props: any) {
age_max,
date_of_result,
last_consultation_medico_legal_case,
- last_consultation_admission_date_before,
- last_consultation_admission_date_after,
+ last_consultation_encounter_date_before,
+ last_consultation_encounter_date_after,
last_consultation_discharge_date_before,
last_consultation_discharge_date_after,
last_consultation_admitted_bed_type_list,
@@ -278,11 +278,11 @@ export default function PatientFilter(props: any) {
date_of_result: dateQueryString(date_of_result),
last_consultation_medico_legal_case:
last_consultation_medico_legal_case || "",
- last_consultation_admission_date_before: dateQueryString(
- last_consultation_admission_date_before
+ last_consultation_encounter_date_before: dateQueryString(
+ last_consultation_encounter_date_before
),
- last_consultation_admission_date_after: dateQueryString(
- last_consultation_admission_date_after
+ last_consultation_encounter_date_after: dateQueryString(
+ last_consultation_encounter_date_after
),
last_consultation_discharge_date_before: dateQueryString(
last_consultation_discharge_date_before
@@ -537,13 +537,13 @@ export default function PatientFilter(props: any) {
/>
{" "}
diff --git a/src/Components/Shifting/ShiftDetails.tsx b/src/Components/Shifting/ShiftDetails.tsx
index a898b0cde15..493c56e71c0 100644
--- a/src/Components/Shifting/ShiftDetails.tsx
+++ b/src/Components/Shifting/ShiftDetails.tsx
@@ -22,6 +22,7 @@ import { useTranslation } from "react-i18next";
import useQuery from "../../Utils/request/useQuery.js";
import routes from "../../Redux/api.js";
import request from "../../Utils/request/request.js";
+import { ConsultationModel } from "../Facility/models.js";
const Loading = lazy(() => import("../Common/Loading"));
@@ -316,7 +317,7 @@ export default function ShiftDetails(props: { id: string }) {
const printData = (data: any) => {
const patientData = data.patient_object;
- const consultation = data.patient.last_consultation;
+ const consultation = data.patient.last_consultation as ConsultationModel;
const patientGender = GENDER_TYPES.find(
(i) => i.id === patientData?.gender
)?.text;
@@ -409,7 +410,7 @@ export default function ShiftDetails(props: { id: string }) {
{t("date_of_admission")}:{" "}
{formatDateTime(
- consultation.admission_date || consultation.created_date
+ consultation.encounter_date || consultation.created_date
) || "-"}
@@ -86,9 +90,10 @@ export default function CreatePrescriptionForm(props: {
{...field("indicator", RequiredFieldValidator())}
required
/>
-
diff --git a/src/Components/Medicine/EditPrescriptionForm.tsx b/src/Components/Medicine/EditPrescriptionForm.tsx
index 42a9b39f7ea..2bd3805af73 100644
--- a/src/Components/Medicine/EditPrescriptionForm.tsx
+++ b/src/Components/Medicine/EditPrescriptionForm.tsx
@@ -1,6 +1,6 @@
import { useState } from "react";
import Form from "../Form/Form";
-import { Prescription } from "./models";
+import { DOSAGE_UNITS, Prescription } from "./models";
import request from "../../Utils/request/request";
import * as Notification from "../../Utils/Notifications";
import useSlug from "../../Common/hooks/useSlug";
@@ -102,7 +102,7 @@ export default function EditPrescriptionForm(props: Props) {
label={t("dosage")}
{...field("dosage", RequiredFieldValidator())}
required
- units={["mg", "g", "ml", "drop(s)", "ampule(s)", "tsp"]}
+ units={DOSAGE_UNITS}
min={0}
/>