diff --git a/cypress/e2e/patient_spec/patient_prescription.cy.ts b/cypress/e2e/patient_spec/patient_prescription.cy.ts index d9a7bf7a080..6bb3fc82f37 100644 --- a/cypress/e2e/patient_spec/patient_prescription.cy.ts +++ b/cypress/e2e/patient_spec/patient_prescription.cy.ts @@ -1,3 +1,4 @@ +import { afterEach, before, beforeEach, cy, describe, it } from "local-cypress"; import PatientPrescription from "../../pageobject/Patient/PatientPrescription"; import LoginPage from "../../pageobject/Login/LoginPage"; import { PatientPage } from "../../pageobject/Patient/PatientCreation"; @@ -5,11 +6,13 @@ import { PatientPage } from "../../pageobject/Patient/PatientCreation"; const patientPrescription = new PatientPrescription(); const loginPage = new LoginPage(); const patientPage = new PatientPage(); -const medicineName = "DOLO"; +const medicineNameOne = "DOLO"; +const medicineNameTwo = "FDEP PLUS"; const medicineBaseDosage = "4"; const medicineTargetDosage = "9"; const medicineFrequency = "Twice daily"; const medicineAdministerNote = "Medicine Administration Note"; +const medicineIndicator = "Test Indicator"; describe("Patient Medicine Administration", () => { before(() => { @@ -23,6 +26,40 @@ describe("Patient Medicine Administration", () => { cy.awaitUrl("/patients"); }); + it("Add a PRN Prescription medicine | Group Administrate it |", () => { + patientPage.visitPatient("Dummy Patient 6"); + patientPrescription.visitMedicineTab(); + patientPrescription.visitEditPrescription(); + // Add First Medicine + patientPrescription.clickAddPrnPrescriptionButton(); + patientPrescription.interceptMedibase(); + patientPrescription.selectMedicinebox(); + patientPrescription.selectMedicine(medicineNameOne); + patientPrescription.enterDosage(medicineBaseDosage); + patientPrescription.enterIndicator(medicineIndicator); + cy.submitButton("Submit"); + cy.verifyNotification("Medicine prescribed"); + cy.closeNotification(); + // Add Second Medicine + patientPrescription.clickAddPrnPrescriptionButton(); + patientPrescription.interceptMedibase(); + patientPrescription.selectMedicinebox(); + patientPrescription.selectMedicine(medicineNameTwo); + patientPrescription.enterDosage(medicineBaseDosage); + patientPrescription.enterIndicator(medicineIndicator); + cy.submitButton("Submit"); + cy.verifyNotification("Medicine prescribed"); + cy.closeNotification(); + patientPrescription.clickReturnToDashboard(); + // Group Administer the PRN Medicine + patientPrescription.visitMedicineTab(); + patientPrescription.clickAdministerBulkMedicine(); + patientPrescription.clickAllVisibleAdministration(); + patientPrescription.clickAdministerSelectedMedicine(); + cy.verifyNotification("Medicine(s) administered"); + cy.closeNotification(); + }); + it("Add a new titrated medicine for a patient | Individual Administeration |", () => { patientPage.visitPatient("Dummy Patient 5"); patientPrescription.visitMedicineTab(); @@ -30,7 +67,7 @@ describe("Patient Medicine Administration", () => { patientPrescription.clickAddPrescription(); patientPrescription.interceptMedibase(); patientPrescription.selectMedicinebox(); - patientPrescription.selectMedicine(medicineName); + patientPrescription.selectMedicine(medicineNameOne); patientPrescription.clickTitratedDosage(); patientPrescription.enterDosage(medicineBaseDosage); patientPrescription.enterTargetDosage(medicineTargetDosage); @@ -47,14 +84,14 @@ describe("Patient Medicine Administration", () => { cy.closeNotification(); // Verify the Reflection on the Medicine cy.verifyContentPresence("#medicine-preview", [ - medicineName, + medicineNameOne, medicineBaseDosage, medicineTargetDosage, ]); patientPrescription.clickReturnToDashboard(); // Go to medicine tab and administer it again patientPrescription.visitMedicineTab(); - cy.verifyAndClickElement("#0", medicineName); + cy.verifyAndClickElement("#0", medicineNameOne); cy.submitButton("Administer"); patientPrescription.enterAdministerDosage(medicineBaseDosage); cy.submitButton("Administer Medicine"); @@ -68,7 +105,7 @@ describe("Patient Medicine Administration", () => { patientPrescription.clickAddPrescription(); patientPrescription.interceptMedibase(); patientPrescription.selectMedicinebox(); - patientPrescription.selectMedicine(medicineName); + patientPrescription.selectMedicine(medicineNameOne); patientPrescription.enterDosage(medicineBaseDosage); patientPrescription.selectDosageFrequency(medicineFrequency); cy.submitButton("Submit"); @@ -78,7 +115,7 @@ describe("Patient Medicine Administration", () => { patientPrescription.clickAddPrescription(); patientPrescription.interceptMedibase(); patientPrescription.selectMedicinebox(); - patientPrescription.selectMedicine(medicineName); + patientPrescription.selectMedicine(medicineNameOne); patientPrescription.enterDosage(medicineBaseDosage); patientPrescription.selectDosageFrequency(medicineFrequency); cy.submitButton("Submit"); diff --git a/cypress/pageobject/Patient/PatientPrescription.ts b/cypress/pageobject/Patient/PatientPrescription.ts index a4b92b0a5fa..50f072f1d9b 100644 --- a/cypress/pageobject/Patient/PatientPrescription.ts +++ b/cypress/pageobject/Patient/PatientPrescription.ts @@ -1,3 +1,4 @@ +import { cy } from "local-cypress"; export class PatientPrescription { clickAddPrescription() { cy.get("#add-prescription").scrollIntoView(); @@ -7,6 +8,10 @@ export class PatientPrescription { ); } + clickAddPrnPrescriptionButton() { + cy.contains("button", "Add PRN Prescription").click(); + } + interceptMedibase() { cy.intercept("GET", "**/api/v1/medibase/**").as("getMedibase"); } @@ -27,6 +32,15 @@ export class PatientPrescription { cy.verifyAndClickElement("#administer-medicine", "Administer"); } + clickAdministerBulkMedicine() { + cy.get("#bulk-administer").should("be.visible"); + cy.get("#bulk-administer").click(); + } + + clickAllVisibleAdministration() { + cy.get("#should_administer").should("be.visible").click(); + } + selectMedicinebox() { cy.get( "div#medicine_object input[placeholder='Select'][role='combobox']", @@ -41,6 +55,10 @@ export class PatientPrescription { cy.get("#base_dosage").type(doseAmount, { force: true }); } + enterIndicator(indicator: string) { + cy.get("#indicator").type(indicator); + } + enterAdministerDosage(dosage: string) { cy.get("#dosage").type(dosage); } @@ -64,14 +82,9 @@ export class PatientPrescription { ); } - discontinuePreviousPrescription() { - cy.intercept( - "POST", - "**/api/v1/consultation/*/prescriptions/*/discontinue/", - ).as("deletePrescription"); - cy.get("button").contains("Discontinue").click(); - cy.get("#submit").contains("Discontinue").click(); - cy.wait("@deletePrescription").its("response.statusCode").should("eq", 200); + clickAdministerSelectedMedicine() { + cy.get("#administer-selected-medicine").should("be.visible"); + cy.get("#administer-selected-medicine").click(); } visitMedicineTab() { diff --git a/src/Components/Facility/Consultations/DailyRounds/LogUpdateCardAttribute.tsx b/src/Components/Facility/Consultations/DailyRounds/LogUpdateCardAttribute.tsx index 4e5b7408266..5d407a09fea 100644 --- a/src/Components/Facility/Consultations/DailyRounds/LogUpdateCardAttribute.tsx +++ b/src/Components/Facility/Consultations/DailyRounds/LogUpdateCardAttribute.tsx @@ -69,7 +69,9 @@ const LogUpdateCardAttribute = ({ {(attributeValue as string) === "VENTILATOR" ? "CRITICAL CARE" - : (attributeValue as string)} + : (attributeValue as string) === "DOCTORS_LOG" + ? "PROGRESS NOTE" + : (attributeValue as string)} ); diff --git a/src/Components/Medicine/MedicineAdministration.tsx b/src/Components/Medicine/MedicineAdministration.tsx index d495ed162bc..650f720caa0 100644 --- a/src/Components/Medicine/MedicineAdministration.tsx +++ b/src/Components/Medicine/MedicineAdministration.tsx @@ -223,7 +223,11 @@ export default function MedicineAdministration(props: Props) { ))}
- + {t("administer_selected_medicines")}{" "} {selectedCount > 0 && `(${selectedCount})`} diff --git a/src/Components/Medicine/MedicineAdministrationSheet/BulkAdminister.tsx b/src/Components/Medicine/MedicineAdministrationSheet/BulkAdminister.tsx index abd609871c8..f4111f24eb0 100644 --- a/src/Components/Medicine/MedicineAdministrationSheet/BulkAdminister.tsx +++ b/src/Components/Medicine/MedicineAdministrationSheet/BulkAdminister.tsx @@ -18,6 +18,7 @@ export default function BulkAdminister({ prescriptions, onDone }: Props) { return ( <> setShowBulkAdminister(true)} diff --git a/src/Components/Shifting/ShiftingBoard.tsx b/src/Components/Shifting/ShiftingBoard.tsx index 3203b5027f5..84a4ac419d3 100644 --- a/src/Components/Shifting/ShiftingBoard.tsx +++ b/src/Components/Shifting/ShiftingBoard.tsx @@ -39,17 +39,6 @@ interface boardProps { containerHeight: number; } -const reduceLoading = (action: string, current: any) => { - switch (action) { - case "MORE": - return { ...current, more: true }; - case "BOARD": - return { ...current, board: true }; - case "COMPLETE": - return { board: false, more: false }; - } -}; - const ShiftCard = ({ shift, filter }: any) => { const { wartime_shifting } = useConfig(); const [modalFor, setModalFor] = useState({ @@ -268,7 +257,8 @@ export default function ShiftingBoard({ }: boardProps) { const containerRef = useRef(null); const [offset, setOffSet] = useState(0); - const [isLoading, setIsLoading] = useState({ board: "BOARD", more: false }); + const [pages, setPages] = useState[]>([]); + const [isLoading, setIsLoading] = useState(true); const [{ isOver }, drop] = useDrop(() => ({ accept: "shift-card", drop: (item: any) => { @@ -278,23 +268,24 @@ export default function ShiftingBoard({ }, collect: (monitor) => ({ isOver: !!monitor.isOver() }), })); - const [data, setData] = useState>(); - useQuery(routes.listShiftRequests, { + const query = useQuery(routes.listShiftRequests, { query: formatFilter({ ...filterProp, status: board, }), onResponse: ({ res, data: listShiftData }) => { + setIsLoading(false); if (res?.ok && listShiftData) { - setData(listShiftData); + setPages((prev) => [...prev, listShiftData]); } - setIsLoading((loading) => reduceLoading("COMPLETE", loading)); }, }); useEffect(() => { - setIsLoading((loading) => reduceLoading("BOARD", loading)); + setPages([]); + setIsLoading(true); + query.refetch(); }, [ filterProp.facility, filterProp.origin_facility, @@ -316,7 +307,7 @@ export default function ShiftingBoard({ ]); const handlePagination = async () => { - setIsLoading((loading) => reduceLoading("MORE", loading)); + setIsLoading(true); setOffSet(offset + 14); const { res, data: newPageData } = await request(routes.listShiftRequests, { query: formatFilter({ @@ -326,18 +317,15 @@ export default function ShiftingBoard({ }), }); if (res?.ok && newPageData) { - setData((prev) => - prev - ? { ...prev, results: [...prev.results, ...newPageData.results] } - : newPageData, - ); + setPages((prev) => [...prev, newPageData]); } - setIsLoading((loading) => reduceLoading("COMPLETE", loading)); + setIsLoading(false); }; const { t } = useTranslation(); const patientFilter = (filter: string) => { - return data?.results + return pages + .flatMap((p) => p.results) .filter(({ status }) => status === filter) .map((shift: any) => ( @@ -350,7 +338,7 @@ export default function ShiftingBoard({ const { height } = container.getBoundingClientRect(); containerHeight < height && setContainerHeight(height); } - }, [containerRef.current, data?.results.length]); + }, [containerRef.current, pages.flatMap((p) => p.results).length]); return (
- {data?.count || "0"} + {pages[0] ? pages[0].count : "..."}
- {isLoading.board ? ( + {pages[0]?.count > 0 + ? patientFilter(board) + : !isLoading && ( +

{t("no_patients_to_show")}

+ )} + {isLoading ? (
@@ -395,25 +388,13 @@ export default function ShiftingBoard({
- ) : data?.count ?? 0 > 0 ? ( - patientFilter(board) ) : ( -

{t("no_patients_to_show")}

+ pages.at(-1)?.next && ( + handlePagination()} className="m-2 block"> + Load More + + ) )} - {!isLoading.board && - (data?.count ?? 0) < (data?.results.length || 0) && - (isLoading.more ? ( -
- {t("loading")} -
- ) : ( - - ))}
);