From e31adb963573cc63734b4411385498c5792026a3 Mon Sep 17 00:00:00 2001 From: Jabar Jeremy <24471994+jabahum@users.noreply.github.com> Date: Thu, 7 Mar 2024 09:47:03 +0300 Subject: [PATCH] (fix) : fix the non display of the approved or completed table (#55) * clean up * clean up * remove unneccesary code * remove unnecessary code * clean up * resolve issues * fix undefined * clean * approve table display * extract table from component * remove unnecessary code * filter table entries * fix refetch * clean * fix comments and refactor apiUrl * add search on tests ordered --- .../completed-list.component.tsx | 240 ++++++++------- src/completed-list/completed-list.scss | 10 +- src/config-schema.ts | 2 +- src/header/laboratory-header.component.tsx | 1 - src/header/laboratory-header.scss | 3 + src/index.ts | 108 +++---- src/lab-tabs/approved-tab.component.tsx | 1 - src/lab-tabs/referred-tab.component.tsx | 1 - src/lab-tabs/review-tab.component.tsx | 1 - src/lab-tiles/completed-tile.component.tsx | 2 - src/lab-tiles/referred-tile.component.tsx | 2 - .../tests-ordered-tile.component.tsx | 2 - src/lab-tiles/worklist-tile.component.tsx | 2 - src/laboratory.component.tsx | 4 +- ...ry-active-test-order-results.component.tsx | 9 +- .../view-laboratory-item.component.tsx | 39 --- .../view-laboratory-item.resource.ts | 290 ------------------ .../laboratory-item/view-laboratory-item.scss | 0 .../laboratory-order-referals.component.tsx | 9 +- ...tory-past-test-order-results.component.tsx | 9 +- .../laboratory-order-tabs.component.tsx | 6 +- ...tient-laboratory-order-results.resource.ts | 14 + .../print-results-summary.component.tsx | 6 +- .../edit-results-dialog.component.tsx | 46 --- .../results-summary.component.tsx | 84 ----- .../results/results.component.tsx | 25 -- .../results/results.resource.ts | 55 ---- .../results-summary/results/results.scss | 0 .../send-email-dialog.component.tsx | 55 +--- .../test-children-results.component.tsx | 8 - .../test-print-results-table.component.tsx | 25 +- ...t-results-delete-action-menu.component.tsx | 27 -- ...-results-rescend-action-menu.component.tsx | 26 -- .../test-results-table.component.tsx | 3 +- .../tests-children-detail.component.tsx | 54 ---- .../results-summary/views/email.handlebars | 13 - src/queue-list/laboratory-queue.component.tsx | 120 -------- .../dialog/review-item.component.tsx | 48 ++- src/review-list/review-list.component.tsx | 92 ++---- src/routes.json | 89 +++--- .../laboratory-summary.resource.tsx | 28 +- .../add-to-worklist-dialog.component.tsx | 16 +- .../add-to-worklist-dialog.resource.ts | 0 .../lab-dialogs/add-to-worklist-dialog.scss | 0 .../lab-tests/lab-tests.component.tsx | 12 - .../lab-tests/lab-tests.resource.ts | 4 +- .../lab-tests/lab-tests.scss | 0 .../laboratory-queue.scss | 0 .../laboratory-tabs.component.tsx | 22 +- .../pick-lab-request-menu.component.tsx | 0 .../tests-ordered-list.component.tsx} | 146 ++++----- .../tests-ordered-list.resource.ts} | 0 .../orders-data-table.component.tsx | 139 +++++++++ src/utils/orders-table/orders-data-table.scss | 50 +++ src/work-list/work-list.component.tsx | 105 ++----- src/work-list/work-list.resource.ts | 35 ++- 56 files changed, 654 insertions(+), 1434 deletions(-) delete mode 100644 src/patient-chart/laboratory-item/view-laboratory-item.component.tsx delete mode 100644 src/patient-chart/laboratory-item/view-laboratory-item.resource.ts delete mode 100644 src/patient-chart/laboratory-item/view-laboratory-item.scss delete mode 100644 src/patient-chart/results-summary/results-dialog/edit-results-dialog.component.tsx delete mode 100644 src/patient-chart/results-summary/results-summary.component.tsx delete mode 100644 src/patient-chart/results-summary/results/results.component.tsx delete mode 100644 src/patient-chart/results-summary/results/results.resource.ts delete mode 100644 src/patient-chart/results-summary/results/results.scss delete mode 100644 src/patient-chart/results-summary/test-results-delete-action-menu.component.tsx delete mode 100644 src/patient-chart/results-summary/test-results-rescend-action-menu.component.tsx delete mode 100644 src/patient-chart/results-summary/tests-children-detail.component.tsx delete mode 100644 src/patient-chart/results-summary/views/email.handlebars delete mode 100644 src/queue-list/laboratory-queue.component.tsx rename src/{queue-list => tests-ordered}/lab-dialogs/add-to-worklist-dialog.component.tsx (96%) rename src/{queue-list => tests-ordered}/lab-dialogs/add-to-worklist-dialog.resource.ts (100%) rename src/{queue-list => tests-ordered}/lab-dialogs/add-to-worklist-dialog.scss (100%) rename src/{queue-list => tests-ordered}/lab-tests/lab-tests.component.tsx (93%) rename src/{queue-list => tests-ordered}/lab-tests/lab-tests.resource.ts (68%) rename src/{queue-list => tests-ordered}/lab-tests/lab-tests.scss (100%) rename src/{queue-list => tests-ordered}/laboratory-queue.scss (100%) rename src/{queue-list => tests-ordered}/laboratory-tabs.component.tsx (82%) rename src/{queue-list => tests-ordered}/pick-lab-request-menu.component.tsx (100%) rename src/{queue-list/laboratory-patient-list.component.tsx => tests-ordered/tests-ordered-list.component.tsx} (67%) rename src/{queue-list/laboratory-patient-list.resource.ts => tests-ordered/tests-ordered-list.resource.ts} (100%) create mode 100644 src/utils/orders-table/orders-data-table.component.tsx create mode 100644 src/utils/orders-table/orders-data-table.scss diff --git a/src/completed-list/completed-list.component.tsx b/src/completed-list/completed-list.component.tsx index caa21c1..15f99ee 100644 --- a/src/completed-list/completed-list.component.tsx +++ b/src/completed-list/completed-list.component.tsx @@ -2,15 +2,13 @@ import React, { useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; import { useGetOrdersWorklist } from "../work-list/work-list.resource"; import { - ErrorState, formatDate, parseDate, usePagination, - isDesktop, + ConfigurableLink, } from "@openmrs/esm-framework"; import { DataTable, - DataTableSkeleton, Pagination, Table, TableBody, @@ -19,17 +17,15 @@ import { TableHead, TableHeader, TableRow, + Tile, TableToolbar, TableToolbarContent, - TableToolbarSearch, Layer, - Tile, + TableToolbarSearch, DatePicker, DatePickerInput, - Select, - SelectItem, + DataTableSkeleton, Tag, - Dropdown, } from "@carbon/react"; import styles from "./completed-list.scss"; import { getStatusColor } from "../utils/functions"; @@ -38,97 +34,13 @@ interface CompletedListProps { fulfillerStatus: string; } -interface TableRowProps { - entry: { - uuid: string; - orderNumber: string; - accessionNumber: string; - concept: { display: string }; - action: string; - fulfillerStatus: string; - orderer: { display: string }; - urgency: string; - dateActivated: string; - patient: { display: string }; - }; -} - -const StatusTag: React.FC<{ fulfillerStatus: string }> = ({ - fulfillerStatus, -}) => { - return ( - - - {fulfillerStatus} - - - ); -}; - -const CustomTableRow: React.FC = ({ entry }) => { - const { - uuid, - orderNumber, - accessionNumber, - concept, - action, - fulfillerStatus, - orderer, - urgency, - dateActivated, - patient, - } = entry; - - return ( - - - {formatDate(parseDate(dateActivated))} - - - {orderNumber} - - - {patient.display.split("-")[1]} - - - {accessionNumber} - - - {concept.display} - - - {action} - - - - - - {orderer.display} - - - {urgency} - - - ); -}; - const CompletedList: React.FC = ({ fulfillerStatus }) => { const { t } = useTranslation(); - const [activatedOnOrAfterDate, setActivatedOnOrAfterDate] = useState(""); + const { workListEntries, isLoading } = useGetOrdersWorklist(fulfillerStatus); - const { workListEntries, isLoading } = useGetOrdersWorklist( - activatedOnOrAfterDate, - fulfillerStatus - ); - - const pageSizes = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]; - const [page, setPage] = useState(1); - const [currentPageSize, setPageSize] = useState(5); - const [nextOffSet, setNextOffSet] = useState(0); + const pageSizes = [10, 20, 30, 40, 50]; + const [currentPageSize, setPageSize] = useState(10); const { goTo, @@ -153,28 +65,134 @@ const CompletedList: React.FC = ({ fulfillerStatus }) => { ]; const tableRows = useMemo(() => { - return paginatedWorkListEntries?.map((entry, index) => ( - - )); - }, [paginatedWorkListEntries]); + return paginatedWorkListEntries + ?.filter( + (item) => + (item.action === "DISCONTINUE" || item.action === "REVISE") && + item.fulfillerStatus === fulfillerStatus + ) + .map((entry) => ({ + ...entry, + id: entry?.uuid, + date: formatDate(parseDate(entry?.dateActivated)), + + patient: ( + + {entry?.patient?.display.split("-")[1]} + + ), + orderNumber: entry?.orderNumber, + accessionNumber: entry?.accessionNumber, + test: entry?.concept?.display, + action: entry?.action, + status: ( + + {entry?.fulfillerStatus} + + ), + orderer: entry?.orderer?.display, + orderType: entry?.orderType.display, + urgency: entry?.urgency, + })); + }, [fulfillerStatus, paginatedWorkListEntries]); if (isLoading) { return ; } - if (paginatedWorkListEntries?.length > 0) { - return ; - } else { + if (paginatedWorkListEntries?.length >= 0) { return ( -
- -
-

- {t("noCompletedListToDisplay", "No Completed List to display")} -

-
-
-
+ + {({ + rows, + headers, + getHeaderProps, + getTableProps, + getRowProps, + onInputChange, + }) => ( + + + + + + + + + + + + {headers.map((header) => ( + + {header.header?.content ?? header.header} + + ))} + + + + {rows.map((row, index) => { + return ( + + + {row.cells.map((cell) => ( + + {cell.value?.content ?? cell.value} + + ))} + + + ); + })} + +
+ {rows.length === 0 ? ( +
+ +
+

+ {t( + "noWorklistsToDisplay", + "No worklists orders to display" + )} +

+
+
+
+ ) : null} + { + if (pageSize !== currentPageSize) { + setPageSize(pageSize); + } + if (page !== currentPage) { + goTo(page); + } + }} + /> +
+ )} +
); } }; diff --git a/src/completed-list/completed-list.scss b/src/completed-list/completed-list.scss index 68c5ddf..585be50 100644 --- a/src/completed-list/completed-list.scss +++ b/src/completed-list/completed-list.scss @@ -194,10 +194,10 @@ title { } .toolbar { - display: flex; - align-items: center; - padding: 5px; - margin: 10px; + position: static; + height: 3rem; + overflow: visible; + background-color: color; } .tileContainer { @@ -221,4 +221,4 @@ title { @include type.type-style('heading-compact-02'); color: $text-02; margin-bottom: 0.5rem; -} +} \ No newline at end of file diff --git a/src/config-schema.ts b/src/config-schema.ts index 9e76fb9..2682e98 100644 --- a/src/config-schema.ts +++ b/src/config-schema.ts @@ -23,7 +23,7 @@ export const configSchema = { }, laboratoryOrderTypeUuid: { _type: Type.String, - _default: "52a447d3-a64a-11e3-9aeb-50e549534c5e", + _default: "", _description: "Uuid for orderType", }, laboratoryReferalDestinationUuid: { diff --git a/src/header/laboratory-header.component.tsx b/src/header/laboratory-header.component.tsx index 1107c08..3bbc510 100644 --- a/src/header/laboratory-header.component.tsx +++ b/src/header/laboratory-header.component.tsx @@ -15,7 +15,6 @@ export const LaboratoryHeader: React.FC = () => {
- {/*

{t('laboratory', 'Laboratory')}

*/}

{t("laboratory", "Laboratory")}

diff --git a/src/header/laboratory-header.scss b/src/header/laboratory-header.scss index 1bd8b4e..88aec20 100644 --- a/src/header/laboratory-header.scss +++ b/src/header/laboratory-header.scss @@ -7,8 +7,11 @@ color: $text-02; height: spacing.$spacing-12; background-color: $ui-02; + border: 1px solid $ui-03; + border-left: 0px; display: flex; justify-content: space-between; + margin-bottom: 2rem; } .left-justified-items { diff --git a/src/index.ts b/src/index.ts index bf784d6..37ffe37 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,8 +5,24 @@ import { } from "@openmrs/esm-framework"; import { configSchema } from "./config-schema"; import { createHomeDashboardLink } from "./components/create-dashboard-link.component"; - +import rootComponent from "./root.component"; import laboratoryReferralWorkspaceComponent from "./patient-chart/laboratory-workspaces/laboratory-referral.workspace.component"; +import laboratory from "./laboratory.component"; +import laboratoryOrder from "./patient-chart/patient-laboratory-order-results.component"; +import addToWorklist from "./tests-ordered/lab-dialogs/add-to-worklist-dialog.component"; +import sendEmail from "./patient-chart/results-summary/send-email-dialog.component"; +import reviewItemDialogComponent from "./review-list/dialog/review-item.component"; +import rejectOrderDialogComponent from "./reject-order/reject-order-dialog.component"; +import approvedTabComponent from "./lab-tabs/approved-tab.component"; +import referredTestTabComponent from "./lab-tabs/referred-tab.component"; +import worklistTabComponent from "./lab-tabs/work-list-tab.component"; +import reveiwTabComponent from "./lab-tabs/review-tab.component"; +import pickLabRequestButtonComponent from "./tests-ordered/pick-lab-request-menu.component"; +import rejectOrderButtonComponent from "./order-actions/reject-order.component"; +import worklistTile from "./lab-tiles/worklist-tile.component"; +import referredTile from "./lab-tiles/referred-tile.component"; +import completedTile from "./lab-tiles/completed-tile.component"; +import testsOrdered from "./lab-tiles/tests-ordered-tile.component"; import { createDashboardLink, @@ -27,10 +43,7 @@ export const importTranslation = require.context( "lazy" ); -export const root = getAsyncLifecycle( - () => import("./root.component"), - options -); +export const root = getSyncLifecycle(rootComponent, options); export const laboratoryDashboardLink = getSyncLifecycle( createHomeDashboardLink({ @@ -41,10 +54,7 @@ export const laboratoryDashboardLink = getSyncLifecycle( options ); -export const laboratoryComponent = getAsyncLifecycle( - () => import("./laboratory.component"), - options -); +export const laboratoryComponent = getSyncLifecycle(laboratory, options); // Patient chart export const laboratoryOrderDashboardLink = getSyncLifecycle( @@ -55,93 +65,59 @@ export const laboratoryOrderDashboardLink = getSyncLifecycle( }), options ); -export const laboratoryOrderComponent = getAsyncLifecycle( - () => import("./patient-chart/patient-laboratory-order-results.component"), +export const laboratoryOrderComponent = getSyncLifecycle( + laboratoryOrder, options ); -export const addToWorklistDialog = getAsyncLifecycle( - () => import("./queue-list/lab-dialogs/add-to-worklist-dialog.component"), - options -); +export const addToWorklistDialog = getSyncLifecycle(addToWorklist, options); -export const sendEmailDialog = getAsyncLifecycle( - () => import("./patient-chart/results-summary/send-email-dialog.component"), - options -); +export const sendEmailDialog = getSyncLifecycle(sendEmail, options); -export const resultsSummaryWorkSpace = getAsyncLifecycle( - () => import("./patient-chart/results-summary/results-summary.component"), +export const reviewItemDialog = getSyncLifecycle( + reviewItemDialogComponent, options ); -export const editResultsDialog = getAsyncLifecycle( - () => - import( - "./patient-chart/results-summary/results-dialog/edit-results-dialog.component" - ), +export const rejectOrderDialog = getSyncLifecycle( + rejectOrderDialogComponent, options ); -export const reviewItemDialog = getAsyncLifecycle( - () => import("./review-list/dialog/review-item.component"), - options -); +export const reviewComponent = getSyncLifecycle(reveiwTabComponent, options); -export const rejectOrderDialog = getAsyncLifecycle( - () => import("./reject-order/reject-order-dialog.component"), +export const approvedComponent = getSyncLifecycle( + approvedTabComponent, options ); -export const reviewComponent = getAsyncLifecycle( - () => import("./lab-tabs/review-tab.component"), +export const referredTestComponent = getSyncLifecycle( + referredTestTabComponent, options ); -export const approvedComponent = getAsyncLifecycle( - () => import("./lab-tabs/approved-tab.component"), +export const worklistComponent = getSyncLifecycle( + worklistTabComponent, options ); -export const referredTestComponent = getAsyncLifecycle( - () => import("./lab-tabs/referred-tab.component"), +export const pickLabRequestButton = getSyncLifecycle( + pickLabRequestButtonComponent, options ); -export const worklistComponent = getAsyncLifecycle( - () => import("./lab-tabs/work-list-tab.component"), +export const rejectOrderButton = getSyncLifecycle( + rejectOrderButtonComponent, options ); -export const pickLabRequestButton = getAsyncLifecycle( - () => import("./queue-list/pick-lab-request-menu.component"), - options -); +export const worklistTileComponent = getSyncLifecycle(worklistTile, options); -export const rejectOrderButton = getAsyncLifecycle( - () => import("./order-actions/reject-order.component"), - options -); - -export const worklistTileComponent = getAsyncLifecycle( - () => import("./lab-tiles/worklist-tile.component"), - options -); - -export const referredTileComponent = getAsyncLifecycle( - () => import("./lab-tiles/referred-tile.component"), - options -); +export const referredTileComponent = getSyncLifecycle(referredTile, options); -export const completedTileComponent = getAsyncLifecycle( - () => import("./lab-tiles/completed-tile.component"), - options -); +export const completedTileComponent = getSyncLifecycle(completedTile, options); -export const testOrderedTileComponent = getAsyncLifecycle( - () => import("./lab-tiles/tests-ordered-tile.component"), - options -); +export const testOrderedTileComponent = getSyncLifecycle(testsOrdered, options); export function startupApp() { defineConfigSchema(moduleName, configSchema); diff --git a/src/lab-tabs/approved-tab.component.tsx b/src/lab-tabs/approved-tab.component.tsx index 8d8a709..6d30e60 100644 --- a/src/lab-tabs/approved-tab.component.tsx +++ b/src/lab-tabs/approved-tab.component.tsx @@ -1,6 +1,5 @@ import React from "react"; import CompletedList from "../completed-list/completed-list.component"; -import styles from "../queue-list/laboratory-queue.scss"; const ApprovedComponent = () => { return ( diff --git a/src/lab-tabs/referred-tab.component.tsx b/src/lab-tabs/referred-tab.component.tsx index 6cfb2e1..92c9950 100644 --- a/src/lab-tabs/referred-tab.component.tsx +++ b/src/lab-tabs/referred-tab.component.tsx @@ -1,6 +1,5 @@ import React from "react"; import { EmptyState } from "@openmrs/esm-patient-common-lib"; -import styles from "../queue-list/laboratory-queue.scss"; const ReferredComponent = () => { return ( diff --git a/src/lab-tabs/review-tab.component.tsx b/src/lab-tabs/review-tab.component.tsx index 47f144b..d569d68 100644 --- a/src/lab-tabs/review-tab.component.tsx +++ b/src/lab-tabs/review-tab.component.tsx @@ -1,6 +1,5 @@ import React from "react"; import ReviewList from "../review-list/review-list.component"; -import styles from "../queue-list/laboratory-queue.scss"; const ReviewComponent = () => { return ( diff --git a/src/lab-tiles/completed-tile.component.tsx b/src/lab-tiles/completed-tile.component.tsx index ae943f0..5db4f5c 100644 --- a/src/lab-tiles/completed-tile.component.tsx +++ b/src/lab-tiles/completed-tile.component.tsx @@ -1,6 +1,4 @@ import React from "react"; -import CompletedList from "../completed-list/completed-list.component"; -import styles from "../queue-list/laboratory-queue.scss"; import { useTranslation } from "react-i18next"; import SummaryTile from "../summary-tiles/summary-tile.component"; import { useLabTestsStats } from "../summary-tiles/laboratory-summary.resource"; diff --git a/src/lab-tiles/referred-tile.component.tsx b/src/lab-tiles/referred-tile.component.tsx index c3c25a8..67fa600 100644 --- a/src/lab-tiles/referred-tile.component.tsx +++ b/src/lab-tiles/referred-tile.component.tsx @@ -1,6 +1,4 @@ import React from "react"; -import CompletedList from "../completed-list/completed-list.component"; -import styles from "../queue-list/laboratory-queue.scss"; import { useTranslation } from "react-i18next"; import SummaryTile from "../summary-tiles/summary-tile.component"; diff --git a/src/lab-tiles/tests-ordered-tile.component.tsx b/src/lab-tiles/tests-ordered-tile.component.tsx index 2c65e04..c5fcea4 100644 --- a/src/lab-tiles/tests-ordered-tile.component.tsx +++ b/src/lab-tiles/tests-ordered-tile.component.tsx @@ -1,6 +1,4 @@ import React from "react"; -import CompletedList from "../completed-list/completed-list.component"; -import styles from "../queue-list/laboratory-queue.scss"; import { useTranslation } from "react-i18next"; import SummaryTile from "../summary-tiles/summary-tile.component"; import { useLabTestsStats } from "../summary-tiles/laboratory-summary.resource"; diff --git a/src/lab-tiles/worklist-tile.component.tsx b/src/lab-tiles/worklist-tile.component.tsx index dd65c8c..e0f85d1 100644 --- a/src/lab-tiles/worklist-tile.component.tsx +++ b/src/lab-tiles/worklist-tile.component.tsx @@ -1,6 +1,4 @@ import React from "react"; -import CompletedList from "../completed-list/completed-list.component"; -import styles from "../queue-list/laboratory-queue.scss"; import { useTranslation } from "react-i18next"; import SummaryTile from "../summary-tiles/summary-tile.component"; import { useLabTestsStats } from "../summary-tiles/laboratory-summary.resource"; diff --git a/src/laboratory.component.tsx b/src/laboratory.component.tsx index 7b5969c..6c99364 100644 --- a/src/laboratory.component.tsx +++ b/src/laboratory.component.tsx @@ -1,7 +1,7 @@ import React from "react"; import { LaboratoryHeader } from "./header/laboratory-header.component"; import LaboratorySummaryTiles from "./summary-tiles/laboratory-summary-tiles.component"; -import LaboratoryQueueList from "./queue-list/laboratory-tabs.component"; +import LaboratoryOrdersList from "./tests-ordered/laboratory-tabs.component"; import Overlay from "./components/overlay/overlay.component"; const Laboratory: React.FC = () => { @@ -9,7 +9,7 @@ const Laboratory: React.FC = () => {
- +
); diff --git a/src/patient-chart/laboratory-active-test-order/laboratory-active-test-order-results.component.tsx b/src/patient-chart/laboratory-active-test-order/laboratory-active-test-order-results.component.tsx index f9c7b26..23e85c9 100644 --- a/src/patient-chart/laboratory-active-test-order/laboratory-active-test-order-results.component.tsx +++ b/src/patient-chart/laboratory-active-test-order/laboratory-active-test-order-results.component.tsx @@ -54,10 +54,10 @@ import { import TestsResults from "../results-summary/test-results-table.component"; import { useReactToPrint } from "react-to-print"; import PrintResultsSummary from "../results-summary/print-results-summary.component"; -import { EncounterResponse } from "../laboratory-item/view-laboratory-item.resource"; import { useGetPatientByUuid } from "../../utils/functions"; import { ResourceRepresentation, + Result, getOrderColor, } from "../patient-laboratory-order-results.resource"; import { useLaboratoryOrderResultsPages } from "../patient-laboratory-order-results-table.resource"; @@ -71,7 +71,7 @@ interface LaboratoryActiveTestOrderResultsProps { } interface PrintProps { - encounter: EncounterResponse; + encounter: Result; } const LaboratoryActiveTestOrderResults: React.FC< @@ -450,11 +450,6 @@ const LaboratoryActiveTestOrderResults: React.FC< "No test orders to display" )}

-

- {t("checkFilters", "Check the filters above")} -

-

{t("or", "or")}

- diff --git a/src/patient-chart/laboratory-item/view-laboratory-item.component.tsx b/src/patient-chart/laboratory-item/view-laboratory-item.component.tsx deleted file mode 100644 index 2dc6144..0000000 --- a/src/patient-chart/laboratory-item/view-laboratory-item.component.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import React, { useCallback } from "react"; -import { useTranslation } from "react-i18next"; -import { Button, Tooltip } from "@carbon/react"; -import { View } from "@carbon/react/icons"; -import { launchPatientWorkspace } from "@openmrs/esm-patient-common-lib"; -import { EncounterResponse } from "./view-laboratory-item.resource"; - -interface ViewLaboratoryItemActionMenuProps { - closeModal: () => void; - encounter: EncounterResponse; -} - -const ViewLaboratoryItemActionMenu: React.FC< - ViewLaboratoryItemActionMenuProps -> = ({ encounter }) => { - const { t } = useTranslation(); - - const handleClick = useCallback( - () => - launchPatientWorkspace("results-summary", { - workspaceTitle: `Results Summary Form`, - encounter, - }), - [encounter] - ); - - return ( - - - - ); -}; - -export default ViewLaboratoryItemActionMenu; diff --git a/src/patient-chart/laboratory-item/view-laboratory-item.resource.ts b/src/patient-chart/laboratory-item/view-laboratory-item.resource.ts deleted file mode 100644 index 6a07d96..0000000 --- a/src/patient-chart/laboratory-item/view-laboratory-item.resource.ts +++ /dev/null @@ -1,290 +0,0 @@ -import { openmrsFetch, restBaseUrl } from "@openmrs/esm-framework"; -import useSWR from "swr"; - -export interface EncounterResponse { - uuid: string; - display: string; - encounterDatetime: string; - patient: Patient; - location: Location; - form: Form; - encounterType: EncounterType2; - obs: Ob[]; - orders: Order[]; - voided: boolean; - auditInfo: AuditInfo; - visit: Visit; - encounterProviders: any[]; - diagnoses: any[]; - links: Link[]; - resourceVersion: string; -} - -export interface Patient { - uuid: string; - display: string; - links: Link[]; -} - -export interface Link { - rel: string; - uri: string; - resourceAlias: string; -} - -export interface Location { - uuid: string; - display: string; - name: string; - description: any; - address1: any; - address2: any; - cityVillage: any; - stateProvince: any; - country: string; - postalCode: any; - latitude: any; - longitude: any; - countyDistrict: any; - address3: any; - address4: any; - address5: any; - address6: any; - tags: Tag[]; - parentLocation: ParentLocation; - childLocations: ChildLocation[]; - retired: boolean; - attributes: any[]; - address7: any; - address8: any; - address9: any; - address10: any; - address11: any; - address12: any; - address13: any; - address14: any; - address15: any; - links: Link[]; - resourceVersion: string; -} - -export interface Tag { - uuid: string; - display: string; - links: Link[]; -} - -export interface ParentLocation { - uuid: string; - display: string; - links: Link[]; -} - -export interface ChildLocation { - uuid: string; - display: string; - links: Link[]; -} - -export interface Form { - uuid: string; - display: string; - name: string; - description: string; - encounterType: EncounterType; - version: string; - build: any; - published: boolean; - formFields: any[]; - retired: boolean; - resources: Resource[]; - links: Link[]; - resourceVersion: string; -} - -export interface EncounterType { - uuid: string; - display: string; - links: Link[]; -} - -export interface Resource { - uuid: string; - display: string; - links: Link[]; -} - -export interface EncounterType2 { - uuid: string; - display: string; - name: string; - description: string; - retired: boolean; - links: Link[]; - resourceVersion: string; -} - -export interface Ob { - uuid: string; - display: string; - concept: Concept; - person: Person; - obsDatetime: string; - accessionNumber: any; - obsGroup: any; - valueCodedName: any; - groupMembers: any; - comment: any; - location: Location2; - order: Order; - encounter: Encounter; - voided: boolean; - value: any; - valueModifier: any; - formFieldPath: string; - formFieldNamespace: string; - links: Link[]; - resourceVersion: string; -} - -export interface Concept { - uuid: string; - display: string; - links: Link[]; -} - -export interface Person { - uuid: string; - display: string; - links: Link[]; -} - -export interface Location2 { - uuid: string; - display: string; - links: Link[]; -} - -export interface Encounter { - uuid: string; - display: string; - links: Link[]; -} - -export interface Order { - uuid: string; - orderNumber: string; - accessionNumber: any; - patient: Patient; - concept: Concept; - action: string; - careSetting: CareSetting; - previousOrder: any; - dateActivated: string; - scheduledDate: any; - dateStopped: any; - autoExpireDate: any; - encounter: Encounter; - orderer: Orderer; - orderReason: any; - orderReasonNonCoded: any; - orderType: OrderType; - urgency: string; - instructions: any; - commentToFulfiller: any; - display: string; - specimenSource: any; - laterality: any; - clinicalHistory: any; - frequency: any; - numberOfRepeats: any; - links: Link[]; - type: string; - resourceVersion: string; -} - -export interface CareSetting { - uuid: string; - display: string; - links: Link[]; -} - -export interface Encounter { - uuid: string; - display: string; - links: Link[]; -} - -export interface Orderer { - uuid: string; - display: string; - links: Link[]; -} - -export interface OrderType { - uuid: string; - display: string; - name: string; - javaClassName: string; - retired: boolean; - description: string; - conceptClasses: any[]; - parent: any; - links: Link[]; - resourceVersion: string; -} - -export interface AuditInfo { - creator: Creator; - dateCreated: string; - changedBy: any; - dateChanged: any; -} - -export interface Creator { - uuid: string; - display: string; - links: Link[]; -} - -export interface Visit { - uuid: string; - display: string; - patient: Patient; - visitType: VisitType; - indication: any; - location: Location; - startDatetime: string; - stopDatetime: any; - encounters: Encounter[]; - attributes: any[]; - voided: boolean; - links: Link[]; - resourceVersion: string; -} - -export interface VisitType { - uuid: string; - display: string; - links: Link[]; -} - -export interface Encounter { - uuid: string; - display: string; - links: Link[]; -} - -export function useGetEncounterById(encounterUuid: string) { - const apiUrl = `${restBaseUrl}/encounter/${encounterUuid}?v=full`; - const { data, error, isLoading } = useSWR<{ data: EncounterResponse }, Error>( - apiUrl, - openmrsFetch - ); - - return { - encounter: data?.data, - isLoading, - isError: error, - }; -} diff --git a/src/patient-chart/laboratory-item/view-laboratory-item.scss b/src/patient-chart/laboratory-item/view-laboratory-item.scss deleted file mode 100644 index e69de29..0000000 diff --git a/src/patient-chart/laboratory-order-referals/laboratory-order-referals.component.tsx b/src/patient-chart/laboratory-order-referals/laboratory-order-referals.component.tsx index 5ff7189..9f24809 100644 --- a/src/patient-chart/laboratory-order-referals/laboratory-order-referals.component.tsx +++ b/src/patient-chart/laboratory-order-referals/laboratory-order-referals.component.tsx @@ -52,10 +52,10 @@ import { import TestsResults from "../results-summary/test-results-table.component"; import { useReactToPrint } from "react-to-print"; import PrintResultsSummary from "../results-summary/print-results-summary.component"; -import { EncounterResponse } from "../laboratory-item/view-laboratory-item.resource"; import { useGetPatientByUuid } from "../../utils/functions"; import { ResourceRepresentation, + Result, getOrderColor, } from "../patient-laboratory-order-results.resource"; import { useLaboratoryOrderResultsPages } from "../patient-laboratory-order-results-table.resource"; @@ -75,7 +75,7 @@ interface EditReferralActionProps { } interface PrintProps { - encounter: EncounterResponse; + encounter: Result; } const LaboratoryOrderReferalResults: React.FC< @@ -482,11 +482,6 @@ const LaboratoryOrderReferalResults: React.FC< "No test orders to display" )}

-

- {t("checkFilters", "Check the filters above")} -

-

{t("or", "or")}

- diff --git a/src/patient-chart/laboratory-past-test/laboratory-past-test-order-results.component.tsx b/src/patient-chart/laboratory-past-test/laboratory-past-test-order-results.component.tsx index 1dccfa9..c47d2ba 100644 --- a/src/patient-chart/laboratory-past-test/laboratory-past-test-order-results.component.tsx +++ b/src/patient-chart/laboratory-past-test/laboratory-past-test-order-results.component.tsx @@ -54,10 +54,10 @@ import { import TestsResults from "../results-summary/test-results-table.component"; import { useReactToPrint } from "react-to-print"; import PrintResultsSummary from "../results-summary/print-results-summary.component"; -import { EncounterResponse } from "../laboratory-item/view-laboratory-item.resource"; import { useGetPatientByUuid } from "../../utils/functions"; import { ResourceRepresentation, + Result, getOrderColor, } from "../patient-laboratory-order-results.resource"; import { useLaboratoryOrderResultsPages } from "../patient-laboratory-order-results-table.resource"; @@ -68,7 +68,7 @@ interface LaboratoryPastTestOrderResultsProps { } interface PrintProps { - encounter: EncounterResponse; + encounter: Result; } const LaboratoryPastTestOrderResults: React.FC< @@ -421,11 +421,6 @@ const LaboratoryPastTestOrderResults: React.FC< "No test orders to display" )}

-

- {t("checkFilters", "Check the filters above")} -

-

{t("or", "or")}

- diff --git a/src/patient-chart/laboratory-tabs/laboratory-order-tabs.component.tsx b/src/patient-chart/laboratory-tabs/laboratory-order-tabs.component.tsx index d8e1b9c..f6ad852 100644 --- a/src/patient-chart/laboratory-tabs/laboratory-order-tabs.component.tsx +++ b/src/patient-chart/laboratory-tabs/laboratory-order-tabs.component.tsx @@ -29,8 +29,10 @@ const LaboratoryResultsTabs: React.FC = ({ aria-label="laboratory results tabs" contained > - {t("pending", "Routine Tests")} - {t("referals", "Referrals")} + + {t("pending", "Routine Tests")} + + {t("referals", "Referrals")} diff --git a/src/patient-chart/patient-laboratory-order-results.resource.ts b/src/patient-chart/patient-laboratory-order-results.resource.ts index d76bdf8..77f9c61 100644 --- a/src/patient-chart/patient-laboratory-order-results.resource.ts +++ b/src/patient-chart/patient-laboratory-order-results.resource.ts @@ -478,3 +478,17 @@ export function usePatientLaboratoryOrders(filter: LaboratoryOrderFilter) { isError: error, }; } + +export function useGetEncounterById(encounterUuid: string) { + const apiUrl = `${restBaseUrl}/encounter/${encounterUuid}?v=full`; + const { data, error, isLoading } = useSWR<{ data: Result }, Error>( + apiUrl, + openmrsFetch + ); + + return { + encounter: data?.data, + isLoading, + isError: error, + }; +} diff --git a/src/patient-chart/results-summary/print-results-summary.component.tsx b/src/patient-chart/results-summary/print-results-summary.component.tsx index 6c9f6d4..cc0a39e 100644 --- a/src/patient-chart/results-summary/print-results-summary.component.tsx +++ b/src/patient-chart/results-summary/print-results-summary.component.tsx @@ -1,14 +1,14 @@ import React, { useEffect, useMemo, useRef, useState } from "react"; import styles from "./print-results-summary.scss"; -import { EncounterResponse } from "../laboratory-item/view-laboratory-item.resource"; import { formatDate, parseDate } from "@openmrs/esm-framework"; import logoImg from "../../../assets/logo/moh_logo_without_word.png"; import { Identifier, PatientResource } from "../../utils/functions"; import { useTranslation } from "react-i18next"; import PrintResultsTable from "./print-results-table.component"; +import { Result } from "../patient-laboratory-order-results.resource"; interface PrintResultsSummaryProps { - encounterResponse: EncounterResponse; + encounterResponse: Result; patient: PatientResource; } @@ -16,8 +16,6 @@ const PrintResultsSummary: React.FC = ({ encounterResponse, patient, }) => { - const { t } = useTranslation(); - const filteredItems = encounterResponse.obs.filter( (ob) => ob?.order?.type === "testorder" ); diff --git a/src/patient-chart/results-summary/results-dialog/edit-results-dialog.component.tsx b/src/patient-chart/results-summary/results-dialog/edit-results-dialog.component.tsx deleted file mode 100644 index 54a3ee6..0000000 --- a/src/patient-chart/results-summary/results-dialog/edit-results-dialog.component.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { - Button, - Form, - ModalBody, - ModalFooter, - ModalHeader, -} from "@carbon/react"; -import React from "react"; -import { useTranslation } from "react-i18next"; -import { EncounterResponse } from "../../laboratory-item/view-laboratory-item.resource"; - -interface EditResultsDialogProps { - encounterResponse: EncounterResponse; - closeModal: () => void; -} - -const EditResultsDialog: React.FC = ({ - encounterResponse, - closeModal, -}) => { - const { t } = useTranslation(); - - return ( - <> -
- - - <> - {encounterResponse?.display} - - - - - - - - - ); -}; - -export default EditResultsDialog; diff --git a/src/patient-chart/results-summary/results-summary.component.tsx b/src/patient-chart/results-summary/results-summary.component.tsx deleted file mode 100644 index 9245da1..0000000 --- a/src/patient-chart/results-summary/results-summary.component.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import React, { useCallback, useEffect, useRef, useState } from "react"; -import { - Button, - DataTableSkeleton, - Form, - ModalBody, - ModalFooter, -} from "@carbon/react"; -import { Printer, MailAll, Edit } from "@carbon/react/icons"; -import styles from "./results-summary.scss"; -import TestsResults from "./test-results-table.component"; -import { useReactToPrint } from "react-to-print"; -import { EncounterResponse } from "../laboratory-item/view-laboratory-item.resource"; -import PrintResultsSummary from "./print-results-summary.component"; -import { formatDate, parseDate, showModal } from "@openmrs/esm-framework"; -import { useTranslation } from "react-i18next"; -import { Order } from "../patient-laboratory-order-results.resource"; - -interface ResultsSummaryProps { - encounter: EncounterResponse; -} - -const ResultsSummary: React.FC = ({ encounter }) => { - const { t } = useTranslation(); - const obsData = encounter.obs.filter((ob) => ob?.order?.type === "testorder"); - - if (encounter) { - return ( -
-
- -
-
-
-
- {/* */} - {/* */} -
-
-
-
-
- - Date :{" "} - {formatDate(parseDate(encounter?.encounterDatetime), { - time: true, - })} - - - Ordered By : {encounter?.auditInfo?.creator?.display} - -
-
-
-
-
- Results Ordered -
-
- {/* */} -
-
-
-
- {/* */} -
-
- {/* - - - */} -
-
- ); - } -}; - -export default ResultsSummary; diff --git a/src/patient-chart/results-summary/results/results.component.tsx b/src/patient-chart/results-summary/results/results.component.tsx deleted file mode 100644 index 4197730..0000000 --- a/src/patient-chart/results-summary/results/results.component.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import React from "react"; -import { useGetLabEncounterTests } from "./results.resource"; -import { DataTableSkeleton } from "@carbon/react"; -import { ErrorState } from "@openmrs/esm-framework"; - -interface ResultsProps { - encounterUuid: string; -} - -const Results: React.FC = ({ encounterUuid }) => { - const { labResults, isLoading, isError } = - useGetLabEncounterTests(encounterUuid); - - if (isLoading) { - return ; - } - - if (isError) { - return ; - } - - return {JSON.stringify(labResults)}; -}; - -export default Results; diff --git a/src/patient-chart/results-summary/results/results.resource.ts b/src/patient-chart/results-summary/results/results.resource.ts deleted file mode 100644 index 0766a3f..0000000 --- a/src/patient-chart/results-summary/results/results.resource.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { - FetchResponse, - openmrsFetch, - restBaseUrl, - useConfig, -} from "@openmrs/esm-framework"; -import useSWR from "swr"; - -export interface LabTestResultResponse { - results: Result[]; -} - -export interface Result { - order: string; - result: Result2[]; - links: Link[]; -} - -export interface Result2 { - investigation: string; - set: string; - test: string; - value: string; - hiNormal: any; - lowNormal: any; - lowAbsolute: any; - hiCritical: any; - lowCritical: any; - unit: any; - level: string; - concept: string; - encounterId: any; - testId: any; - hiAbsolute: any; -} - -export interface Link { - rel: string; - uri: string; - resourceAlias: string; -} - -export function useGetLabEncounterTests(encounterUuid: string) { - const apiUrl = `${restBaseUrl}/encountertestresults?encounterUuid=${encounterUuid}`; - - const { data, error, isLoading } = useSWR< - { data: LabTestResultResponse }, - Error - >(apiUrl, openmrsFetch, { refreshInterval: 3000 }); - return { - labResults: data?.data ? data?.data.results : [], - isLoading, - isError: error, - }; -} diff --git a/src/patient-chart/results-summary/results/results.scss b/src/patient-chart/results-summary/results/results.scss deleted file mode 100644 index e69de29..0000000 diff --git a/src/patient-chart/results-summary/send-email-dialog.component.tsx b/src/patient-chart/results-summary/send-email-dialog.component.tsx index 6fc14e6..866440d 100644 --- a/src/patient-chart/results-summary/send-email-dialog.component.tsx +++ b/src/patient-chart/results-summary/send-email-dialog.component.tsx @@ -24,63 +24,10 @@ const SendEmailDialog: React.FC = ({ const { t } = useTranslation(); const [email, setEmail] = useState(); - const [file, setFile] = useState(); const { patient, isLoading } = usePatient(patientUuid); - // setEmail() - - // generate pdf - - const sendEmail = async () => { - // initialize nodemailer - // var transporter = nodemailer.createTransport({ - // service: "gmail", - // secure: true, - // tls: { - // rejectUnauthorized: false, - // }, - // auth: { - // user: "services.ugandaemr@gmail.com", - // pass: "Admin1234_", - // }, - // }); - // // point to the template folder - // const handlebarOptions = { - // viewEngine: { - // extname: ".hbs", - // layoutsDir: "views/", - // defaultLayout: "template", - // partialsDir: "views/partials/", - // }, - // viewPath: "views/", - // extName: ".hbs", - // }; - // transporter.use("compile", hbs(handlebarOptions)); - // const mailOptions = { - // from: "services.ugandaemr@gmail.com", - // to: email, - // subject: `Tests results`, - // attachments: [{ filename: "testResults.pdf", path: file }], - // }; - // transporter.sendMail(mailOptions, (error, info) => { - // if (error) { - // showNotification({ - // title: `Error in sending results`, - // kind: "error", - // critical: true, - // description: error?.message, - // }); - // } else { - // showToast({ - // critical: true, - // title: `Sent Test Results`, - // kind: "success", - // description: `Test results sent Successfully`, - // }); - // } - // }); - }; + const sendEmail = async () => {}; return ( <> diff --git a/src/patient-chart/results-summary/test-children-results.component.tsx b/src/patient-chart/results-summary/test-children-results.component.tsx index 682dde7..b5b7310 100644 --- a/src/patient-chart/results-summary/test-children-results.component.tsx +++ b/src/patient-chart/results-summary/test-children-results.component.tsx @@ -71,10 +71,6 @@ const TestResultsChildren: React.FC = ({ })); }, [members]); - if (members === undefined) { - return No Data; - } - const ReferenceRange: React.FC = ({ conceptUuid }) => { const { concept: concept, @@ -207,11 +203,7 @@ const TestResultsChildren: React.FC = ({ "No test orders to display" )}

-

- {t("checkFilters", "Check the filters above")} -

-

{t("or", "or")}

) : null} diff --git a/src/patient-chart/results-summary/test-print-results-table.component.tsx b/src/patient-chart/results-summary/test-print-results-table.component.tsx index a7dd599..5db5e7b 100644 --- a/src/patient-chart/results-summary/test-print-results-table.component.tsx +++ b/src/patient-chart/results-summary/test-print-results-table.component.tsx @@ -1,8 +1,7 @@ -import React, { useMemo, useState } from "react"; +import React, { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { DataTable, - DataTableSkeleton, Table, TableBody, TableCell, @@ -16,11 +15,8 @@ import { TableExpandedRow, } from "@carbon/react"; import styles from "./results-summary.scss"; -import RescendTestResultActionMenu from "./test-results-rescend-action-menu.component"; -import { Order } from "../patient-laboratory-order-results.resource"; -import DeleteTestResultActionMenu from "./test-results-delete-action-menu.component"; -import { Ob } from "../laboratory-item/view-laboratory-item.resource"; import TestResultsChildren from "./test-children-results.component"; +import { Ob } from "../patient-laboratory-order-results.resource"; interface TestOrdersProps { obs: Ob[]; @@ -126,23 +122,6 @@ const TestsPrintResults: React.FC = ({ obs }) => { ) : null} - {/* { - if (pageSize !== currentPageSize) { - setPageSize(pageSize); - } - if (page !== currentPage) { - goTo(page); - } - }} - /> */} )}
diff --git a/src/patient-chart/results-summary/test-results-delete-action-menu.component.tsx b/src/patient-chart/results-summary/test-results-delete-action-menu.component.tsx deleted file mode 100644 index 0353014..0000000 --- a/src/patient-chart/results-summary/test-results-delete-action-menu.component.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { showModal, useSession } from "@openmrs/esm-framework"; -import React, { useCallback } from "react"; -import { useTranslation } from "react-i18next"; -import { Button, Tooltip } from "@carbon/react"; -import { TrashCan } from "@carbon/react/icons"; - -interface RescendTestResultActionMenuProps { - closeModal: () => void; -} - -const DeleteTestResultActionMenu: React.FC< - RescendTestResultActionMenuProps -> = () => { - const { t } = useTranslation(); - - return ( - - - - ); -}; - -export default DeleteTestResultActionMenu; diff --git a/src/patient-chart/results-summary/test-results-rescend-action-menu.component.tsx b/src/patient-chart/results-summary/test-results-rescend-action-menu.component.tsx deleted file mode 100644 index c04cf3f..0000000 --- a/src/patient-chart/results-summary/test-results-rescend-action-menu.component.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from "react"; -import { useTranslation } from "react-i18next"; -import { Button, Tooltip } from "@carbon/react"; -import { ArrowRight } from "@carbon/react/icons"; - -interface RescendTestResultActionMenuProps { - closeModal: () => void; -} - -const RescendTestResultActionMenu: React.FC< - RescendTestResultActionMenuProps -> = () => { - const { t } = useTranslation(); - - return ( - - - - ); -}; - -export default RescendTestResultActionMenu; diff --git a/src/patient-chart/results-summary/test-results-table.component.tsx b/src/patient-chart/results-summary/test-results-table.component.tsx index b9589f9..33dfb27 100644 --- a/src/patient-chart/results-summary/test-results-table.component.tsx +++ b/src/patient-chart/results-summary/test-results-table.component.tsx @@ -15,10 +15,9 @@ import { TableExpandedRow, } from "@carbon/react"; import styles from "./results-summary.scss"; -import DeleteTestResultActionMenu from "./test-results-delete-action-menu.component"; -import { Ob } from "../laboratory-item/view-laboratory-item.resource"; import TestResultsChildren from "./test-children-results.component"; import { formatDate, parseDate } from "@openmrs/esm-framework"; +import { Ob } from "../patient-laboratory-order-results.resource"; interface TestOrdersProps { obs: Ob[]; diff --git a/src/patient-chart/results-summary/tests-children-detail.component.tsx b/src/patient-chart/results-summary/tests-children-detail.component.tsx deleted file mode 100644 index e3e06a4..0000000 --- a/src/patient-chart/results-summary/tests-children-detail.component.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import React from "react"; -import { useTranslation } from "react-i18next"; -import { useGetConceptById } from "./results-summary.resource"; -import { DataTableSkeleton } from "@carbon/react"; - -interface TestsChildrenDetailProps { - conceptUuid: string; -} - -const TestsChildrenDetail: React.FC = ({ - conceptUuid, -}) => { - const { t } = useTranslation(); - - const { - concept: concept, - isLoading, - isError, - } = useGetConceptById(conceptUuid); - - if (isLoading || isError) { - return ; - } - - return ( - <> -
- {concept?.display} - Unit : {concept?.units} -
- -
-
- Ranges -
-
- High : {concept.hiNormal} -
-
- Low : {concept?.lowNormal} -
-
-
-
- - ); -}; -export default TestsChildrenDetail; diff --git a/src/patient-chart/results-summary/views/email.handlebars b/src/patient-chart/results-summary/views/email.handlebars deleted file mode 100644 index 05fa97a..0000000 --- a/src/patient-chart/results-summary/views/email.handlebars +++ /dev/null @@ -1,13 +0,0 @@ -// email.handlebars - - - - - - Results Email - - -

Hello {{name}}!

-

We're glad to send your results. Find attachement below

- - \ No newline at end of file diff --git a/src/queue-list/laboratory-queue.component.tsx b/src/queue-list/laboratory-queue.component.tsx deleted file mode 100644 index 0d6c59c..0000000 --- a/src/queue-list/laboratory-queue.component.tsx +++ /dev/null @@ -1,120 +0,0 @@ -import React, { useEffect, useState } from "react"; -import { Tab, Tabs, TabList, TabPanels, Search } from "@carbon/react"; -import { useTranslation } from "react-i18next"; -import styles from "./laboratory-queue.scss"; -import LaboratoryPatientList from "./laboratory-patient-list.component"; - -enum TabTypes { - STARRED, - SYSTEM, - USER, - ALL, -} - -const LaboratoryQueueList: React.FC = () => { - const { t } = useTranslation(); - const [selectedTab, setSelectedTab] = useState(TabTypes.STARRED); - const [searchTermUserInput, setSearchTermUserInput] = useState(""); - const [searchTerm, setSearchTerm] = useState(""); - const [location, setLocation] = useState(""); - - const tabs = [ - { - key: "testedOrders", - header: t("testedOrders", "Tests ordered"), - }, - { - key: "worklist", - header: t("worklist", "Worklist"), - }, - { - key: "referredTests", - header: t("referredTests", "Referred tests"), - }, - { - key: "completedTests", - header: t("completedTests", "Completed tests"), - }, - { - key: "reviewList", - header: t("reviewList", "Review List"), - }, - { - key: "approveList", - header: t("approveList", "Approval List"), - }, - ]; - - useEffect(() => { - const debounceFn = setTimeout(() => { - setSearchTerm(searchTermUserInput); - }, 500); - - return () => clearTimeout(debounceFn); - }, [searchTermUserInput]); - - return ( -
-
- - - {tabs.map((tab, index) => { - return ( - - {t(tab.header)} - - ); - })} - -
- { - e.preventDefault(); - setSearchTermUserInput(e.target.value); - }} - size="md" - className={styles.patientSearch} - /> -
- {/* - {tabs.map((tab, index) => { - return ( - - ); - })} - */} -
-
-
- ); -}; - -export default LaboratoryQueueList; diff --git a/src/review-list/dialog/review-item.component.tsx b/src/review-list/dialog/review-item.component.tsx index 3c44261..0ae8f90 100644 --- a/src/review-list/dialog/review-item.component.tsx +++ b/src/review-list/dialog/review-item.component.tsx @@ -9,9 +9,11 @@ import { Checkbox, } from "@carbon/react"; import { useTranslation } from "react-i18next"; -import { useGetEncounterById } from "../../patient-chart/laboratory-item/view-laboratory-item.resource"; -import styles from "../review-list.scss"; -import { GroupMember } from "../../patient-chart/patient-laboratory-order-results.resource"; +import styles from "../dialog/review-item.scss"; +import { + GroupMember, + useGetEncounterById, +} from "../../patient-chart/patient-laboratory-order-results.resource"; import { useGetConceptById } from "../../patient-chart/results-summary/results-summary.resource"; import { ApproverOrder } from "./review-item.resource"; import { showNotification, showSnackbar } from "@openmrs/esm-framework"; @@ -38,16 +40,14 @@ const ReviewItem: React.FC = ({ const { encounter, isLoading } = useGetEncounterById(encounterUuid); const testsOrder = useMemo(() => { - return encounter?.orders.filter( - (item) => item?.orderType.display === "Test Order" - ); - }, [encounter?.orders]); + return encounter?.obs.filter((item) => item?.order?.type === "testorder"); + }, [encounter?.obs]); const filteredGroupedResults = useMemo(() => { let groupedResults = []; testsOrder?.forEach((element) => { - groupedResults[element.display] = element; + groupedResults[element?.concept?.display] = element; }); return groupedResults; @@ -56,19 +56,35 @@ const ReviewItem: React.FC = ({ const [checkedItems, setCheckedItems] = useState({}); const handleCheckboxChange = (test, groupMembers, uuid) => { - setCheckedItems((prevCheckedItems) => ({ - ...prevCheckedItems, - [test]: { - groupMembers, - uuid, - }, - })); + setCheckedItems((previouslyCheckedItems) => { + if (previouslyCheckedItems[test]) { + const newCheckedItems = { ...previouslyCheckedItems }; + delete newCheckedItems[test]; + return newCheckedItems; + } else { + return { + ...previouslyCheckedItems, + [test]: { groupMembers, uuid }, + }; + } + }); }; // handle approve const approveOrder = async (e) => { e.preventDefault(); - + if (Object.keys(checkedItems).length === 0) { + showNotification({ + title: t("noSelection", "No Selection: "), + kind: "error", + critical: true, + description: t( + "pleaseSelectAnOrder", + "Please select at least one order to approve." + ), + }); + return; + } let uuids = []; Object.keys(checkedItems).map((item, index) => { diff --git a/src/review-list/review-list.component.tsx b/src/review-list/review-list.component.tsx index e5fb5d2..5078796 100644 --- a/src/review-list/review-list.component.tsx +++ b/src/review-list/review-list.component.tsx @@ -26,16 +26,12 @@ import { Tile, DatePicker, DatePickerInput, - Select, - SelectItem, Button, Tag, } from "@carbon/react"; import styles from "./review-list.scss"; import { Add } from "@carbon/react/icons"; -import { Ob } from "../patient-chart/patient-laboratory-order-results.resource"; -import { Encounter } from "../types"; import { getStatusColor } from "../utils/functions"; interface ReviewlistProps { @@ -73,15 +69,10 @@ const ReviewList: React.FC = ({ fulfillerStatus }) => { const [activatedOnOrAfterDate, setActivatedOnOrAfterDate] = useState(""); - const { workListEntries, isLoading } = useGetOrdersWorklist( - activatedOnOrAfterDate, - fulfillerStatus - ); + const { workListEntries, isLoading } = useGetOrdersWorklist(fulfillerStatus); const pageSizes = [10, 20, 30, 40, 50]; - const [page, setPage] = useState(1); const [currentPageSize, setPageSize] = useState(10); - const [nextOffSet, setNextOffSet] = useState(0); const { goTo, @@ -109,45 +100,33 @@ const ReviewList: React.FC = ({ fulfillerStatus }) => { ]; const tableRows = useMemo(() => { - return paginatedWorkListEntries?.map((entry, index) => ({ - ...entry, - id: entry.uuid, - date: { - content: ( - <> - {formatDate(parseDate(entry.dateActivated))} - - ), - }, - patient: { - content: ( - <> - {entry.patient.display.split("-")[1]} - + return paginatedWorkListEntries + ?.filter( + (item) => + (item.action === "DISCONTINUE" || item.action === "REVISE") && + item.fulfillerStatus === "IN_PROGRESS" + ) + .map((entry) => ({ + ...entry, + id: entry?.uuid, + date: formatDate(parseDate(entry?.dateActivated)), + patient: entry?.patient?.display.split("-")[1], + orderNumber: entry?.orderNumber, + accessionNumber: entry?.accessionNumber, + test: entry?.concept?.display, + action: entry?.action, + status: ( + + {entry?.fulfillerStatus} + ), - }, - orderNumber: { content: {entry.orderNumber} }, - accessionNumber: { content: {entry.accessionNumber} }, - test: { content: {entry.concept.display} }, - action: { content: {entry.action} }, - status: { - content: ( - <> - - - {entry.fulfillerStatus} - - - - ), - }, - orderer: { content: {entry.orderer.display} }, - orderType: { content: {entry.orderType.display} }, - urgency: { content: {entry.urgency} }, - })); + orderer: entry?.orderer?.display, + orderType: entry?.orderType?.display, + urgency: entry?.urgency, + })); }, [paginatedWorkListEntries]); if (isLoading) { @@ -171,22 +150,9 @@ const ReviewList: React.FC = ({ fulfillerStatus }) => { }} > - - - { - setActivatedOnOrAfterDate(event.target.value); - }} - type="date" - value={activatedOnOrAfterDate} - /> - - = ({ fulfillerStatus }) => { diff --git a/src/routes.json b/src/routes.json index 92e2535..d86f2f9 100644 --- a/src/routes.json +++ b/src/routes.json @@ -4,12 +4,14 @@ "fhir2": ">=1.2", "webservices.rest": "^2.24.0" }, - - "pages": [{ - "component": "root", - "route": "laboratory" - }], - "extensions": [{ + "pages": [ + { + "component": "root", + "route": "laboratory" + } + ], + "extensions": [ + { "name": "laboratory-dashboard", "slot": "laboratory-dashboard-slot", "component": "root" @@ -102,42 +104,42 @@ "title": "Approved" } }, - { - "name": "tests-ordered-tile-component", - "slot": "lab-tiles-slot", - "component": "testOrderedTileComponent", - "meta": { - "name": "testsOrderedTileSlot", - "title": "Ordered tests" - } - }, - { - "name": "completed-tile-component", - "slot": "lab-tiles-slot", - "component": "completedTileComponent", - "meta": { - "name": "completedTileSlot", - "title": "Completed" - } - }, - { - "name": "worklist-tile-component", - "slot": "lab-tiles-slot", - "component": "worklistTileComponent", - "meta": { - "name": "worklisTileSlot", - "title": "Worklist" - } - }, - { - "name": "referred-tile-component", - "slot": "lab-tiles-slot", - "component": "referredTileComponent", - "meta": { - "name": "referredTileSlot", - "title": "Referred tests" - } - }, + { + "name": "tests-ordered-tile-component", + "slot": "lab-tiles-slot", + "component": "testOrderedTileComponent", + "meta": { + "name": "testsOrderedTileSlot", + "title": "Ordered tests" + } + }, + { + "name": "completed-tile-component", + "slot": "lab-tiles-slot", + "component": "completedTileComponent", + "meta": { + "name": "completedTileSlot", + "title": "Completed" + } + }, + { + "name": "worklist-tile-component", + "slot": "lab-tiles-slot", + "component": "worklistTileComponent", + "meta": { + "name": "worklisTileSlot", + "title": "Worklist" + } + }, + { + "name": "referred-tile-component", + "slot": "lab-tiles-slot", + "component": "referredTileComponent", + "meta": { + "name": "referredTileSlot", + "title": "Referred tests" + } + }, { "name": "pick-lab-request-button", "component": "pickLabRequestButton", @@ -149,5 +151,4 @@ "slot": "order-actions-slot" } ] -} - +} \ No newline at end of file diff --git a/src/summary-tiles/laboratory-summary.resource.tsx b/src/summary-tiles/laboratory-summary.resource.tsx index aff7ef5..eb6fa35 100644 --- a/src/summary-tiles/laboratory-summary.resource.tsx +++ b/src/summary-tiles/laboratory-summary.resource.tsx @@ -1,12 +1,14 @@ -import useSWR from "swr"; +import useSWR, { mutate } from "swr"; import useSWRImmutable from "swr/immutable"; import { FetchResponse, openmrsFetch, restBaseUrl, + useConfig, } from "@openmrs/esm-framework"; import { Result } from "../work-list/work-list.resource"; +import { useCallback } from "react"; export function useMetrics() { const metrics = { @@ -41,8 +43,27 @@ export function useServices() { // worklist export function useLabTestsStats(fulfillerStatus: string) { - const apiUrl = `${restBaseUrl}/order?orderTypes=52a447d3-a64a-11e3-9aeb-50e549534c5e&isStopped=false&fulfillerStatus=${fulfillerStatus}&v=full - `; + const { laboratoryOrderTypeUuid } = useConfig(); + + const orderTypeQuery = + laboratoryOrderTypeUuid !== "" + ? `orderType=${laboratoryOrderTypeUuid}&` + : ""; + + const apiUrl = `${restBaseUrl}/order?${orderTypeQuery}fulfillerStatus=${fulfillerStatus}&v=full`; + + const mutateOrders = useCallback( + () => + mutate( + (key) => + typeof key === "string" && + key.startsWith( + `/ws/rest/v1/order?orderType=${laboratoryOrderTypeUuid}` + ) + ), + [laboratoryOrderTypeUuid] + ); + const { data, error, isLoading } = useSWR< { data: { results: Array } }, Error @@ -51,5 +72,6 @@ export function useLabTestsStats(fulfillerStatus: string) { count: data?.data ? data.data.results.length : 0, isLoading, isError: error, + mutate: mutateOrders, }; } diff --git a/src/queue-list/lab-dialogs/add-to-worklist-dialog.component.tsx b/src/tests-ordered/lab-dialogs/add-to-worklist-dialog.component.tsx similarity index 96% rename from src/queue-list/lab-dialogs/add-to-worklist-dialog.component.tsx rename to src/tests-ordered/lab-dialogs/add-to-worklist-dialog.component.tsx index 5c05aac..66b27d1 100644 --- a/src/queue-list/lab-dialogs/add-to-worklist-dialog.component.tsx +++ b/src/tests-ordered/lab-dialogs/add-to-worklist-dialog.component.tsx @@ -1,42 +1,30 @@ -import React, { useCallback, useEffect, useState } from "react"; -import { MappedQueueEntry } from "../../types"; +import React, { useEffect, useState } from "react"; import { Button, - ContentSwitcher, Form, ModalBody, ModalFooter, ModalHeader, Select, SelectItem, - Switch, - TextArea, - Grid, Checkbox, TextInput, - IconButton, } from "@carbon/react"; import { useTranslation } from "react-i18next"; -import { MappedPatientQueueEntry } from "../laboratory-patient-list.resource"; import styles from "./add-to-worklist-dialog.scss"; import { - navigate, showNotification, showSnackbar, useConfig, - useLocations, - useSession, } from "@openmrs/esm-framework"; import { Renew } from "@carbon/react/icons"; import { GenerateSpecimenId, - GetOrderByUuid, UpdateOrder, - useQueueRoomLocations, useReferralLocations, useSpecimenTypes, } from "./add-to-worklist-dialog.resource"; -import { Encounter, Order } from "../../types/patient-queues"; +import { Order } from "../../types/patient-queues"; interface AddToWorklistDialogProps { queueId; diff --git a/src/queue-list/lab-dialogs/add-to-worklist-dialog.resource.ts b/src/tests-ordered/lab-dialogs/add-to-worklist-dialog.resource.ts similarity index 100% rename from src/queue-list/lab-dialogs/add-to-worklist-dialog.resource.ts rename to src/tests-ordered/lab-dialogs/add-to-worklist-dialog.resource.ts diff --git a/src/queue-list/lab-dialogs/add-to-worklist-dialog.scss b/src/tests-ordered/lab-dialogs/add-to-worklist-dialog.scss similarity index 100% rename from src/queue-list/lab-dialogs/add-to-worklist-dialog.scss rename to src/tests-ordered/lab-dialogs/add-to-worklist-dialog.scss diff --git a/src/queue-list/lab-tests/lab-tests.component.tsx b/src/tests-ordered/lab-tests/lab-tests.component.tsx similarity index 93% rename from src/queue-list/lab-tests/lab-tests.component.tsx rename to src/tests-ordered/lab-tests/lab-tests.component.tsx index 073fa6d..24b5020 100644 --- a/src/queue-list/lab-tests/lab-tests.component.tsx +++ b/src/tests-ordered/lab-tests/lab-tests.component.tsx @@ -3,25 +3,13 @@ import { useTranslation } from "react-i18next"; import { DataTable, - DataTableHeader, - DataTableSkeleton, - Pagination, Table, TableBody, TableCell, TableContainer, - TableExpandHeader, - TableExpandRow, TableHead, TableHeader, TableRow, - TabPanel, - TableToolbar, - TableToolbarContent, - TableToolbarSearch, - Layer, - Tag, - TableExpandedRow, } from "@carbon/react"; import { ErrorState } from "@openmrs/esm-framework"; import { Encounter } from "../../types/patient-queues"; diff --git a/src/queue-list/lab-tests/lab-tests.resource.ts b/src/tests-ordered/lab-tests/lab-tests.resource.ts similarity index 68% rename from src/queue-list/lab-tests/lab-tests.resource.ts rename to src/tests-ordered/lab-tests/lab-tests.resource.ts index 4756e1d..e441c30 100644 --- a/src/queue-list/lab-tests/lab-tests.resource.ts +++ b/src/tests-ordered/lab-tests/lab-tests.resource.ts @@ -5,11 +5,11 @@ import { useConfig, } from "@openmrs/esm-framework"; import useSWR from "swr"; -import { EncounterResponse } from "../../patient-chart/laboratory-item/view-laboratory-item.resource"; +import { Result } from "../../patient-chart/patient-laboratory-order-results.resource"; export function useGetLabOrders(encounterUuid: string) { const apiUrl = `${restBaseUrl}/encounter/${encounterUuid}?v=full`; - const { data, error, isLoading } = useSWR<{ data: EncounterResponse }, Error>( + const { data, error, isLoading } = useSWR<{ data: Result }, Error>( apiUrl, openmrsFetch ); diff --git a/src/queue-list/lab-tests/lab-tests.scss b/src/tests-ordered/lab-tests/lab-tests.scss similarity index 100% rename from src/queue-list/lab-tests/lab-tests.scss rename to src/tests-ordered/lab-tests/lab-tests.scss diff --git a/src/queue-list/laboratory-queue.scss b/src/tests-ordered/laboratory-queue.scss similarity index 100% rename from src/queue-list/laboratory-queue.scss rename to src/tests-ordered/laboratory-queue.scss diff --git a/src/queue-list/laboratory-tabs.component.tsx b/src/tests-ordered/laboratory-tabs.component.tsx similarity index 82% rename from src/queue-list/laboratory-tabs.component.tsx rename to src/tests-ordered/laboratory-tabs.component.tsx index d1bd6d2..fe0db93 100644 --- a/src/queue-list/laboratory-tabs.component.tsx +++ b/src/tests-ordered/laboratory-tabs.component.tsx @@ -1,20 +1,13 @@ -import React, { useEffect, useMemo, useState } from "react"; +import React, { useState } from "react"; import { type AssignedExtension, Extension, - ExtensionSlot, useConnectedExtensions, - attach, - detachAll, } from "@openmrs/esm-framework"; import { Tab, Tabs, TabList, TabPanels, TabPanel, Search } from "@carbon/react"; import { useTranslation } from "react-i18next"; import styles from "./laboratory-queue.scss"; -import LaboratoryPatientList from "./laboratory-patient-list.component"; -import { EmptyState } from "@openmrs/esm-patient-common-lib"; -import WorkList from "../work-list/work-list.component"; -import ReviewList from "../review-list/review-list.component"; -import CompletedList from "../completed-list/completed-list.component"; +import TestsOrderedList from "./tests-ordered-list.component"; import { ComponentContext } from "@openmrs/esm-framework/src/internal"; enum TabTypes { @@ -26,7 +19,7 @@ enum TabTypes { const labPanelSlot = "lab-panels-slot"; -const LaboratoryQueueTabs: React.FC = () => { +const LaboratoryOrdersTabs: React.FC = () => { const { t } = useTranslation(); const [selectedTab, setSelectedTab] = useState(0); const tabExtensions = useConnectedExtensions( @@ -46,7 +39,9 @@ const LaboratoryQueueTabs: React.FC = () => { aria-label="Laboratory tabs" contained > - {t("testedOrders", "Tests ordered")} + + {t("testedOrders", "Tests ordered")} + {tabExtensions .filter((extension) => Object.keys(extension.meta).length > 0) .map((extension, index) => { @@ -58,6 +53,7 @@ const LaboratoryQueueTabs: React.FC = () => { key={index} className={styles.tab} id={`${title || index}-tab`} + style={{ width: "150px" }} > {t(title, { ns: extension.moduleName, @@ -72,7 +68,7 @@ const LaboratoryQueueTabs: React.FC = () => { - + {tabExtensions .filter((extension) => Object.keys(extension.meta).length > 0) @@ -102,4 +98,4 @@ const LaboratoryQueueTabs: React.FC = () => { ); }; -export default LaboratoryQueueTabs; +export default LaboratoryOrdersTabs; diff --git a/src/queue-list/pick-lab-request-menu.component.tsx b/src/tests-ordered/pick-lab-request-menu.component.tsx similarity index 100% rename from src/queue-list/pick-lab-request-menu.component.tsx rename to src/tests-ordered/pick-lab-request-menu.component.tsx diff --git a/src/queue-list/laboratory-patient-list.component.tsx b/src/tests-ordered/tests-ordered-list.component.tsx similarity index 67% rename from src/queue-list/laboratory-patient-list.component.tsx rename to src/tests-ordered/tests-ordered-list.component.tsx index a01f0fc..c53d59c 100644 --- a/src/queue-list/laboratory-patient-list.component.tsx +++ b/src/tests-ordered/tests-ordered-list.component.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useMemo, useState } from "react"; +import React, { useMemo, useState } from "react"; import { DataTable, DataTableSkeleton, @@ -11,25 +11,18 @@ import { TableHeader, TableRow, Dropdown, - TabPanel, TableToolbar, TableToolbarContent, - TableToolbarSearch, Layer, - Tag, Tile, - Button, - DatePicker, - DatePickerInput, + TableToolbarSearch, } from "@carbon/react"; import { TrashCan, OverflowMenuVertical } from "@carbon/react/icons"; import { useTranslation } from "react-i18next"; import { ExtensionSlot, - age, formatDate, - formatDatetime, parseDate, usePagination, } from "@openmrs/esm-framework"; @@ -44,7 +37,7 @@ interface RejectOrderProps { order: Result; } -const LaboratoryPatientList: React.FC = () => { +const TestsOrderedList: React.FC = () => { const { t } = useTranslation(); const OrderStatuses = [ @@ -57,8 +50,6 @@ const LaboratoryPatientList: React.FC = () => { "DECLINED", ]; - const [activatedOnOrAfterDate, setActivatedOnOrAfterDate] = useState(""); - const [filter, setFilter] = useState< | "All" | "EXCEPTION" @@ -69,10 +60,7 @@ const LaboratoryPatientList: React.FC = () => { | "DECLINED" >("All"); - const { workListEntries, isLoading } = useGetOrdersWorklist( - activatedOnOrAfterDate, - "" - ); + const { workListEntries, isLoading } = useGetOrdersWorklist(""); const filteredStatus = useMemo(() => { if (!filter || filter == "All") { @@ -120,68 +108,52 @@ const LaboratoryPatientList: React.FC = () => { const tableRows = useMemo(() => { return paginatedWorklistQueueEntries - ?.filter((item) => item.action === "NEW") + ?.filter( + (item) => + (item?.fulfillerStatus === null || item?.fulfillerStatus === "") && + item?.action === "NEW" + ) .map((entry, index) => ({ ...entry, - id: entry.uuid, - date: { - content: ( - <> - - {formatDate(parseDate(entry.dateActivated))} - - - ), - }, - patient: { - content: ( - <> - {entry.patient.display.split("-")[1]} - - ), - }, - orderNumber: { content: {entry.orderNumber} }, - accessionNumber: { content: {entry.accessionNumber} }, - test: { content: {entry.concept.display} }, - action: { content: {entry.action} }, - status: { - content: ( - <> - - - {entry.fulfillerStatus} - - - - ), - }, - orderer: { content: {entry.orderer.display} }, - urgency: { content: {entry.urgency} }, - actions: { - content: ( - <> - - - - } - > - + {formatDate(parseDate(entry?.dateActivated))} + + ), + patient: entry?.patient?.display.split("-")[1], + orderNumber: entry?.orderNumber, + accessionNumber: entry?.accessionNumber, + test: entry?.concept?.display, + action: entry?.action, + status: ( + + {entry?.fulfillerStatus} + + ), + orderer: entry?.orderer?.display, + urgency: entry?.urgency, + actions: ( + + - - - ), - }, + + } + > + + + ), })); }, [paginatedWorklistQueueEntries]); @@ -209,9 +181,6 @@ const LaboratoryPatientList: React.FC = () => { @@ -228,20 +197,13 @@ const LaboratoryPatientList: React.FC = () => { onChange={handleOrderStatusChange} /> - - - { - setActivatedOnOrAfterDate(event.target.value); - }} - type="date" - value={activatedOnOrAfterDate} - /> - + @@ -309,4 +271,4 @@ const LaboratoryPatientList: React.FC = () => { } }; -export default LaboratoryPatientList; +export default TestsOrderedList; diff --git a/src/queue-list/laboratory-patient-list.resource.ts b/src/tests-ordered/tests-ordered-list.resource.ts similarity index 100% rename from src/queue-list/laboratory-patient-list.resource.ts rename to src/tests-ordered/tests-ordered-list.resource.ts diff --git a/src/utils/orders-table/orders-data-table.component.tsx b/src/utils/orders-table/orders-data-table.component.tsx new file mode 100644 index 0000000..2636368 --- /dev/null +++ b/src/utils/orders-table/orders-data-table.component.tsx @@ -0,0 +1,139 @@ +import React, { useState, useMemo } from "react"; +import { + DataTable, + Pagination, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableHeader, + TableRow, + Tile, + TableToolbar, + TableToolbarContent, + Layer, + TableToolbarSearch, + Dropdown, + DatePicker, + DatePickerInput, +} from "@carbon/react"; +import styles from "./orders-data-table.scss"; +import { useTranslation } from "react-i18next"; + +interface OrdersDataTableProps { + tabTitle: string; + currentPage: number; + currentPageSize: number; + pageSizes: number[]; + totalItems: number; + setPageSize: (page: number) => void; + goTo: (page: number) => void; + orders: Array>; + rows: Array>; + columns: Array>; +} + +const OrdersDataTable: React.FC = ({ + tabTitle, + currentPage, + currentPageSize, + pageSizes, + totalItems, + setPageSize, + goTo, + rows, + columns, +}) => { + const { t } = useTranslation(); + + const [activatedOnOrAfterDate, setActivatedOnOrAfterDate] = useState(""); + + return ( + + {({ rows, headers, getHeaderProps, getTableProps, getRowProps }) => ( + + + + + + { + setActivatedOnOrAfterDate(event?.target?.value); + }} + type="date" + value={activatedOnOrAfterDate} + /> + + + + + + + + + + + {headers.map((header) => ( + + {header.header?.content ?? header.header} + + ))} + + + + {rows.map((row) => ( + + + {row.cells.map((cell) => ( + + {cell.value?.content ?? cell.value} + + ))} + + + ))} + +
+ {rows.length === 0 ? ( +
+ +
+

+ {t("noOrdersList", `No ${tabTitle} orders to display`)} +

+
+
+
+ ) : null} + { + if (pageSize !== currentPageSize) { + setPageSize(pageSize); + } + if (page !== currentPage) { + goTo(page); + } + }} + /> +
+ )} +
+ ); +}; + +export default OrdersDataTable; diff --git a/src/utils/orders-table/orders-data-table.scss b/src/utils/orders-table/orders-data-table.scss new file mode 100644 index 0000000..afbcae6 --- /dev/null +++ b/src/utils/orders-table/orders-data-table.scss @@ -0,0 +1,50 @@ +@use '@carbon/styles/scss/spacing'; +@use '@carbon/styles/scss/type'; +@import "~@openmrs/esm-styleguide/src/vars"; +@import '../../root.scss'; + +.tableContainer { + background-color: $ui-01; + margin: 0 spacing.$spacing-05; + padding: 0; + + a { + text-decoration: none; + } + + th { + color: $text-02; + } + + :global(.cds--data-table) { + background-color: $ui-03; + } + + .toolbarContent { + height: spacing.$spacing-07; + margin-bottom: spacing.$spacing-02; + } +} + +.tileContainer { + background-color: $ui-02; + border-top: 1px solid $ui-03; + padding: 5rem 0; +} + +.tile { + margin: auto; + width: fit-content; +} + +.tileContent { + display: flex; + flex-direction: column; + align-items: center; +} + +.content { + @include type.type-style('heading-compact-02'); + color: $text-02; + margin-bottom: 0.5rem; +} \ No newline at end of file diff --git a/src/work-list/work-list.component.tsx b/src/work-list/work-list.component.tsx index d5a7538..0bd7213 100644 --- a/src/work-list/work-list.component.tsx +++ b/src/work-list/work-list.component.tsx @@ -1,24 +1,15 @@ -import React, { - useState, - useMemo, - AnchorHTMLAttributes, - useCallback, -} from "react"; +import React, { useState, useMemo, useCallback } from "react"; import { useTranslation } from "react-i18next"; -import { EmptyState, ErrorState } from "@openmrs/esm-patient-common-lib"; import { Microscope, TrashCan } from "@carbon/react/icons"; import { DataTable, - DataTableHeader, DataTableSkeleton, Pagination, Table, TableBody, TableCell, TableContainer, - TableExpandHeader, - TableExpandRow, TableHead, TableHeader, TableRow, @@ -28,13 +19,10 @@ import { TableToolbarSearch, Layer, Tag, - TableExpandedRow, Button, Tile, DatePicker, DatePickerInput, - Select, - SelectItem, } from "@carbon/react"; import { Result, useGetOrdersWorklist } from "./work-list.resource"; import styles from "./work-list.scss"; @@ -65,14 +53,9 @@ interface RejectOrderProps { const WorkList: React.FC = ({ fulfillerStatus }) => { const { t } = useTranslation(); - const [activatedOnOrAfterDate, setActivatedOnOrAfterDate] = useState(""); + const { workListEntries, isLoading } = useGetOrdersWorklist(fulfillerStatus); - const { workListEntries, isLoading } = useGetOrdersWorklist( - activatedOnOrAfterDate, - fulfillerStatus - ); - - const pageSizes = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50]; + const pageSizes = [10, 20, 30, 40, 50]; const [currentPageSize, setPageSize] = useState(10); const { @@ -140,49 +123,35 @@ const WorkList: React.FC = ({ fulfillerStatus }) => { ?.filter((item) => item.fulfillerStatus === "IN_PROGRESS") .map((entry, index) => ({ ...entry, - id: entry.uuid, - date: { - content: ( - <> - {formatDate(parseDate(entry.dateActivated))} - - ), - }, - patient: { - content: ( - - {entry.patient.display.split("-")[1]} - - ), - }, - orderNumber: { content: {entry.orderNumber} }, - accessionNumber: { content: {entry.accessionNumber} }, - test: { content: {entry.concept.display} }, - action: { content: {entry.action} }, - status: { - content: ( - <> - - - {entry.fulfillerStatus} - - - - ), - }, - orderer: { content: {entry.orderer.display} }, - orderType: { content: {entry.orderType.display} }, - urgency: { content: {entry.urgency} }, + id: entry?.uuid, + date: formatDate(parseDate(entry?.dateActivated)), + patient: ( + + {entry?.patient?.display.split("-")[1]} + + ), + orderNumber: entry?.orderNumber, + accessionNumber: entry?.accessionNumber, + test: entry?.concept?.display, + action: entry?.action, + status: ( + + {entry?.fulfillerStatus} + + ), + orderer: entry?.orderer?.display, + orderType: entry?.orderType?.display, + urgency: entry?.urgency, actions: { content: ( <> @@ -211,28 +180,12 @@ const WorkList: React.FC = ({ fulfillerStatus }) => { - - - { - setActivatedOnOrAfterDate(event.target.value); - }} - type="date" - value={activatedOnOrAfterDate} - /> - - + mutate( + (key) => + typeof key === "string" && + key.startsWith( + `/ws/rest/v1/order?orderType=${laboratoryOrderTypeUuid}` + ) + ), + [laboratoryOrderTypeUuid] + ); const { data, error, isLoading } = useSWR< { data: { results: Array } }, Error - >(apiUrl, openmrsFetch); + >(apiUrl, openmrsFetch, { refreshInterval: 3000 }); return { workListEntries: data?.data ? data.data.results : [], isLoading, isError: error, + mutate: mutateOrders, }; }