@kenyaemr/esm-ward-app 8.1.2-pre.214 → 8.5.1-pre.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +25 -35
- package/README.md +38 -0
- package/dist/1119.js +1 -0
- package/dist/1197.js +1 -0
- package/dist/1663.js +1 -0
- package/dist/1663.js.map +1 -0
- package/dist/1741.js +1 -0
- package/dist/1741.js.map +1 -0
- package/dist/1776.js +1 -0
- package/dist/1776.js.map +1 -0
- package/dist/1879.js +1 -0
- package/dist/1879.js.map +1 -0
- package/dist/1899.js +1 -0
- package/dist/1899.js.map +1 -0
- package/dist/1917.js +1 -0
- package/dist/1917.js.map +1 -0
- package/dist/2146.js +1 -0
- package/dist/2372.js +1 -0
- package/dist/2372.js.map +1 -0
- package/dist/2470.js +1 -0
- package/dist/2470.js.map +1 -0
- package/dist/2537.js +1 -0
- package/dist/2537.js.map +1 -0
- package/dist/2557.js +1 -0
- package/dist/2557.js.map +1 -0
- package/dist/2690.js +1 -0
- package/dist/2728.js +2 -0
- package/dist/{372.js.LICENSE.txt → 2728.js.LICENSE.txt} +2 -2
- package/dist/2728.js.map +1 -0
- package/dist/2775.js +2 -0
- package/dist/2775.js.LICENSE.txt +59 -0
- package/dist/2775.js.map +1 -0
- package/dist/2913.js +2 -0
- package/dist/2913.js.map +1 -0
- package/dist/2932.js +1 -0
- package/dist/2932.js.map +1 -0
- package/dist/2948.js +1 -0
- package/dist/2948.js.map +1 -0
- package/dist/3099.js +1 -0
- package/dist/3161.js +2 -0
- package/dist/{649.js.LICENSE.txt → 3161.js.LICENSE.txt} +2 -2
- package/dist/3161.js.map +1 -0
- package/dist/3365.js +1 -0
- package/dist/3365.js.map +1 -0
- package/dist/3373.js +2 -0
- package/dist/3373.js.LICENSE.txt +5 -0
- package/dist/3373.js.map +1 -0
- package/dist/3399.js +1 -0
- package/dist/3399.js.map +1 -0
- package/dist/3413.js +1 -0
- package/dist/3413.js.map +1 -0
- package/dist/3423.js +1 -0
- package/dist/3423.js.map +1 -0
- package/dist/3584.js +1 -0
- package/dist/3737.js +1 -0
- package/dist/3737.js.map +1 -0
- package/dist/3982.js +1 -0
- package/dist/3982.js.map +1 -0
- package/dist/4041.js +2 -0
- package/dist/4041.js.map +1 -0
- package/dist/4055.js +1 -0
- package/dist/4132.js +1 -0
- package/dist/4300.js +1 -0
- package/dist/4335.js +1 -0
- package/dist/4430.js +2 -0
- package/dist/4430.js.LICENSE.txt +29 -0
- package/dist/4430.js.map +1 -0
- package/dist/4618.js +1 -0
- package/dist/465.js +1 -0
- package/dist/465.js.map +1 -0
- package/dist/4652.js +1 -0
- package/dist/4701.js +2 -0
- package/dist/4701.js.LICENSE.txt +9 -0
- package/dist/4701.js.map +1 -0
- package/dist/4743.js +2 -0
- package/dist/4743.js.LICENSE.txt +9 -0
- package/dist/4743.js.map +1 -0
- package/dist/4944.js +1 -0
- package/dist/5173.js +1 -0
- package/dist/5241.js +1 -0
- package/dist/5442.js +1 -0
- package/dist/5661.js +1 -0
- package/dist/6012.js +2 -0
- package/dist/6012.js.LICENSE.txt +5 -0
- package/dist/6012.js.map +1 -0
- package/dist/6022.js +1 -0
- package/dist/6468.js +1 -0
- package/dist/6679.js +1 -0
- package/dist/6840.js +1 -0
- package/dist/6859.js +1 -0
- package/dist/7097.js +1 -0
- package/dist/7159.js +1 -0
- package/dist/7179.js +2 -0
- package/dist/7179.js.LICENSE.txt +9 -0
- package/dist/7179.js.map +1 -0
- package/dist/723.js +1 -0
- package/dist/7232.js +2 -0
- package/dist/7232.js.LICENSE.txt +9 -0
- package/dist/7232.js.map +1 -0
- package/dist/7524.js +1 -0
- package/dist/7524.js.map +1 -0
- package/dist/7617.js +1 -0
- package/dist/7661.js +1 -0
- package/dist/7661.js.map +1 -0
- package/dist/7886.js +1 -0
- package/dist/7886.js.map +1 -0
- package/dist/795.js +1 -0
- package/dist/8163.js +1 -0
- package/dist/8205.js +1 -0
- package/dist/8205.js.map +1 -0
- package/dist/8317.js +2 -0
- package/dist/8317.js.LICENSE.txt +15 -0
- package/dist/8317.js.map +1 -0
- package/dist/8349.js +1 -0
- package/dist/8501.js +1 -0
- package/dist/8501.js.map +1 -0
- package/dist/8522.js +1 -0
- package/dist/8522.js.map +1 -0
- package/dist/8618.js +1 -0
- package/dist/8622.js +1 -0
- package/dist/8622.js.map +1 -0
- package/dist/89.js +1 -0
- package/dist/89.js.map +1 -0
- package/dist/890.js +1 -0
- package/dist/9045.js +1 -0
- package/dist/9045.js.map +1 -0
- package/dist/9117.js +1 -0
- package/dist/9117.js.map +1 -0
- package/dist/9214.js +1 -0
- package/dist/9538.js +1 -0
- package/dist/9569.js +1 -0
- package/dist/986.js +1 -0
- package/dist/9876.js +2 -0
- package/dist/9876.js.LICENSE.txt +9 -0
- package/dist/9876.js.map +1 -0
- package/dist/9879.js +1 -0
- package/dist/9880.js +1 -0
- package/dist/9880.js.map +1 -0
- package/dist/9895.js +1 -0
- package/dist/9900.js +1 -0
- package/dist/9913.js +1 -0
- package/dist/kenyaemr-esm-ward-app.js +1 -1
- package/dist/kenyaemr-esm-ward-app.js.buildmanifest.json +1479 -235
- package/dist/kenyaemr-esm-ward-app.js.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.LICENSE.txt +0 -35
- package/dist/main.js.map +1 -1
- package/dist/routes.json +1 -1
- package/mock.tsx +15 -2
- package/package.json +10 -5
- package/src/beds/{empty-bed-skeleton.tsx → empty-bed-skeleton.component.tsx} +2 -2
- package/src/config-schema.ts +48 -0
- package/src/declarations.d.ts +8 -0
- package/src/hooks/useAdmissionLocation.ts +24 -4
- package/src/hooks/useInpatientAdmission.ts +14 -10
- package/src/hooks/useInpatientAdmissionByPatients.ts +29 -0
- package/src/hooks/useInpatientRequest.ts +5 -1
- package/src/hooks/useInpatientRequestByPatients.ts +34 -0
- package/src/hooks/useIpdDischargeEncounter.ts +137 -0
- package/src/hooks/usePatientPendingOrders.ts +1 -1
- package/src/hooks/useRestPatient.ts +11 -3
- package/src/hooks/useSummaryMetrics.ts +103 -0
- package/src/hooks/useWardLocation.test.ts +1 -1
- package/src/hooks/useWardLocation.ts +18 -5
- package/src/hooks/useWardPatientGrouping.ts +63 -10
- package/src/index.ts +24 -4
- package/src/location-selector/location-selector.component.tsx +38 -5
- package/src/root.component.tsx +2 -2
- package/src/routes.json +60 -26
- package/src/types/index.ts +17 -6
- package/src/ward-patient-card/card-rows/admission-request-note-row.component.tsx +1 -1
- package/src/ward-patient-card/card-rows/coded-obs-tags-row.component.tsx +4 -4
- package/src/ward-patient-card/card-rows/mother-child-row.component.tsx +6 -6
- package/src/ward-patient-card/card-rows/pending-items-row.component.tsx +2 -3
- package/src/ward-patient-card/row-elements/{ward-patient-coded-obs-tags.tsx → ward-patient-coded-obs-tags.component.tsx} +5 -5
- package/src/ward-patient-card/row-elements/{ward-patient-header-address.tsx → ward-patient-header-address.component.tsx} +2 -2
- package/src/ward-patient-card/row-elements/{ward-patient-identifier.tsx → ward-patient-identifier.component.tsx} +7 -1
- package/src/ward-patient-card/row-elements/ward-patient-identifier.scss +3 -0
- package/src/ward-patient-card/row-elements/{ward-patient-obs.tsx → ward-patient-obs.component.tsx} +5 -5
- package/src/ward-patient-card/row-elements/{ward-patient-pending-transfer.tsx → ward-patient-pending-transfer.component.tsx} +3 -5
- package/src/ward-patient-card/row-elements/ward-patient-time-on-ward.component.tsx +73 -0
- package/src/ward-patient-card/row-elements/ward-patient-time-since-admission.component.tsx +29 -0
- package/src/ward-patient-card/ward-patient-card.component.tsx +5 -5
- package/src/ward-patient-card/ward-patient-card.scss +2 -6
- package/src/ward-patients/admitted-patients.tsx +218 -0
- package/src/ward-patients/awaiting-admission-patients.tsx +158 -0
- package/src/ward-patients/discharge-in-patients.tsx +183 -0
- package/src/ward-patients/discharge-patients.tsx +129 -0
- package/src/ward-patients/patient-cells.tsx +75 -0
- package/src/ward-patients/table-state-components.tsx +40 -0
- package/src/ward-patients/ward-patient.scss +24 -0
- package/src/ward-patients/ward-patients-table.tsx +38 -0
- package/src/ward-view/default-ward/default-ward-patient-card-header.component.tsx +8 -8
- package/src/ward-view/default-ward/default-ward-pending-patients.component.tsx +3 -3
- package/src/ward-view/default-ward/default-ward-view.component.tsx +33 -6
- package/src/ward-view/linelist-wards/Filters.tsx +25 -0
- package/src/ward-view/linelist-wards/Header.tsx +27 -0
- package/src/ward-view/linelist-wards/LineListTable.tsx +145 -0
- package/src/ward-view/linelist-wards/Metrics.tsx +21 -0
- package/src/ward-view/linelist-wards/WardPendingOutCell.tsx +15 -0
- package/src/ward-view/linelist-wards/WardsLineList.tsx +30 -0
- package/src/ward-view/linelist-wards/linelist-wards.scss +100 -0
- package/src/ward-view/materal-ward/maternal-ward-patient-card-header.component.tsx +8 -8
- package/src/ward-view/materal-ward/maternal-ward-patient-card.component.tsx +2 -2
- package/src/ward-view/materal-ward/maternal-ward-patient-card.test.tsx +1 -1
- package/src/ward-view/materal-ward/maternal-ward-pending-patients.component.tsx +1 -1
- package/src/ward-view/materal-ward/maternal-ward-view.component.tsx +4 -4
- package/src/ward-view/ward-view-content-wrapper.tsx +36 -0
- package/src/ward-view/ward-view.resource.ts +26 -8
- package/src/ward-view/ward-view.scss +15 -8
- package/src/ward-view/ward-view.test.tsx +8 -8
- package/src/ward-view/ward.component.tsx +2 -2
- package/src/ward-view-header/admission-requests-bar.component.tsx +18 -8
- package/src/ward-view-header/admission-requests-bar.test.tsx +3 -3
- package/src/ward-view-header/ward-metric.component.tsx +2 -3
- package/src/ward-workspace/admission-request-card/admission-request-card-actions.component.tsx +12 -14
- package/src/ward-workspace/admission-request-card/admission-request-card-header.component.tsx +5 -5
- package/src/ward-workspace/admission-request-card/admission-request-card.component.tsx +1 -1
- package/src/ward-workspace/admission-request-workspace/admission-requests-action-button.extension.tsx +18 -0
- package/src/ward-workspace/admission-request-workspace/admission-requests-context.ts +20 -0
- package/src/ward-workspace/admission-request-workspace/admission-requests-workspace.test.tsx +7 -6
- package/src/ward-workspace/admission-request-workspace/admission-requests.workspace.tsx +15 -25
- package/src/ward-workspace/admit-patient-button.component.tsx +41 -18
- package/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.test.tsx +14 -16
- package/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.workspace.tsx +2 -2
- package/src/ward-workspace/bed-selector.component.tsx +1 -1
- package/src/ward-workspace/cancel-admission-request-workspace/cancel-admission-request.test.tsx +1 -1
- package/src/ward-workspace/cancel-admission-request-workspace/cancel-admission-request.workspace.tsx +4 -6
- package/src/ward-workspace/create-admission-encounter/create-admission-encounter-action-button.extension.tsx +46 -0
- package/src/ward-workspace/create-admission-encounter/create-admission-encounter.test.tsx +241 -0
- package/src/ward-workspace/create-admission-encounter/create-admission-encounter.workspace.tsx +152 -0
- package/src/ward-workspace/kenya-emr-patient-discharge/discharge-workspace-siderail.component.tsx +23 -0
- package/src/ward-workspace/kenya-emr-patient-discharge/patient-discharge.resource.tsx +123 -0
- package/src/ward-workspace/kenya-emr-patient-discharge/patient-discharge.workspace.tsx +101 -0
- package/src/ward-workspace/patient-discharge/patient-discharge.workspace.tsx +6 -15
- package/src/ward-workspace/patient-transfer-bed-swap/{patient-transfer-request-form.component.tsx → patient-admit-or-transfer-request-form.component.tsx} +56 -37
- package/src/ward-workspace/patient-transfer-bed-swap/patient-bed-swap-form.component.tsx +13 -3
- package/src/ward-workspace/patient-transfer-bed-swap/patient-transfer-swap.workspace.tsx +11 -5
- package/src/ward-workspace/patient-transfer-request-workspace/patient-transfer-request.scss +5 -0
- package/src/ward-workspace/patient-transfer-request-workspace/patient-transfer-request.workspace.tsx +20 -6
- package/src/ward-workspace/ward-patient-notes/form/notes-form.component.tsx +2 -1
- package/src/ward-workspace/ward-patient-notes/history/note.component.tsx +3 -3
- package/src/ward.resource.ts +9 -3
- package/translations/am.json +123 -0
- package/translations/ar.json +123 -0
- package/translations/ar_SY.json +123 -0
- package/translations/bn.json +123 -0
- package/translations/de.json +123 -0
- package/translations/en.json +31 -3
- package/translations/en_US.json +123 -0
- package/translations/es.json +123 -0
- package/translations/es_MX.json +123 -0
- package/translations/fr.json +123 -0
- package/translations/he.json +123 -0
- package/translations/hi.json +123 -0
- package/translations/hi_IN.json +123 -0
- package/translations/id.json +123 -0
- package/translations/it.json +123 -0
- package/translations/ka.json +123 -0
- package/translations/km.json +123 -0
- package/translations/ku.json +123 -0
- package/translations/ky.json +123 -0
- package/translations/lg.json +123 -0
- package/translations/ne.json +123 -0
- package/translations/pl.json +123 -0
- package/translations/pt.json +123 -0
- package/translations/pt_BR.json +123 -0
- package/translations/qu.json +123 -0
- package/translations/ro_RO.json +123 -0
- package/translations/ru_RU.json +123 -0
- package/translations/si.json +123 -0
- package/translations/sw.json +123 -0
- package/translations/sw_KE.json +123 -0
- package/translations/tr.json +123 -0
- package/translations/tr_TR.json +123 -0
- package/translations/uk.json +123 -0
- package/translations/uz.json +123 -0
- package/translations/uz@Latn.json +123 -0
- package/translations/uz_UZ.json +123 -0
- package/translations/vi.json +123 -0
- package/translations/zh.json +123 -0
- package/translations/zh_CN.json +123 -0
- package/dist/109.js +0 -1
- package/dist/109.js.map +0 -1
- package/dist/124.js +0 -1
- package/dist/124.js.map +0 -1
- package/dist/125.js +0 -1
- package/dist/125.js.map +0 -1
- package/dist/126.js +0 -1
- package/dist/126.js.map +0 -1
- package/dist/130.js +0 -2
- package/dist/130.js.LICENSE.txt +0 -5
- package/dist/130.js.map +0 -1
- package/dist/146.js +0 -1
- package/dist/146.js.map +0 -1
- package/dist/15.js +0 -1
- package/dist/15.js.map +0 -1
- package/dist/325.js +0 -1
- package/dist/325.js.map +0 -1
- package/dist/348.js +0 -1
- package/dist/348.js.map +0 -1
- package/dist/362.js +0 -1
- package/dist/362.js.map +0 -1
- package/dist/372.js +0 -2
- package/dist/372.js.map +0 -1
- package/dist/443.js +0 -1
- package/dist/443.js.map +0 -1
- package/dist/471.js +0 -1
- package/dist/471.js.map +0 -1
- package/dist/481.js +0 -1
- package/dist/481.js.map +0 -1
- package/dist/53.js +0 -1
- package/dist/53.js.map +0 -1
- package/dist/559.js +0 -1
- package/dist/559.js.map +0 -1
- package/dist/574.js +0 -1
- package/dist/576.js +0 -1
- package/dist/576.js.map +0 -1
- package/dist/577.js +0 -1
- package/dist/577.js.map +0 -1
- package/dist/591.js +0 -2
- package/dist/591.js.map +0 -1
- package/dist/598.js +0 -1
- package/dist/598.js.map +0 -1
- package/dist/649.js +0 -2
- package/dist/649.js.map +0 -1
- package/dist/662.js +0 -1
- package/dist/662.js.map +0 -1
- package/dist/767.js +0 -1
- package/dist/767.js.map +0 -1
- package/dist/784.js +0 -2
- package/dist/784.js.map +0 -1
- package/dist/921.js +0 -1
- package/dist/921.js.map +0 -1
- package/dist/922.js +0 -1
- package/dist/922.js.map +0 -1
- package/dist/925.js +0 -2
- package/dist/925.js.LICENSE.txt +0 -40
- package/dist/925.js.map +0 -1
- package/dist/940.js +0 -1
- package/dist/940.js.map +0 -1
- package/dist/969.js +0 -1
- package/dist/969.js.map +0 -1
- package/dist/983.js +0 -1
- package/dist/983.js.map +0 -1
- package/package-lock.json +0 -5001
- package/src/ward-patient-card/row-elements/ward-patient-time-on-ward.tsx +0 -22
- package/src/ward-patient-card/row-elements/ward-patient-time-since-admission.tsx +0 -22
- /package/dist/{591.js.LICENSE.txt → 2913.js.LICENSE.txt} +0 -0
- /package/dist/{784.js.LICENSE.txt → 4041.js.LICENSE.txt} +0 -0
- /package/src/ward-patient-card/row-elements/{ward-patient-age.tsx → ward-patient-age.component.tsx} +0 -0
- /package/src/ward-patient-card/row-elements/{ward-patient-bed-number.tsx → ward-patient-bed-number.component.tsx} +0 -0
- /package/src/ward-patient-card/row-elements/{ward-patient-location.tsx → ward-patient-location.component.tsx} +0 -0
- /package/src/ward-patient-card/row-elements/{ward-patient-name.tsx → ward-patient-name.component.tsx} +0 -0
- /package/src/ward-patient-card/row-elements/{ward-patient-responsive-tooltip.tsx → ward-patient-responsive-tooltip.component.tsx} +0 -0
- /package/src/ward-patient-card/row-elements/{ward-patient-skeleton-text.tsx → ward-patient-skeleton-text.component.tsx} +0 -0
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { Button, InlineNotification } from '@carbon/react';
|
|
2
|
-
import { Movement } from '@carbon/react/icons';
|
|
3
|
-
import { ArrowRightIcon, isDesktop, launchWorkspace, useAppContext, useLayoutType } from '@openmrs/esm-framework';
|
|
4
1
|
import React, { type ReactNode } from 'react';
|
|
2
|
+
import classNames from 'classnames';
|
|
5
3
|
import { useTranslation } from 'react-i18next';
|
|
4
|
+
import { Button, InlineNotification } from '@carbon/react';
|
|
5
|
+
import { Movement } from '@carbon/react/icons';
|
|
6
|
+
import { ArrowRightIcon, isDesktop, launchWorkspaceGroup, useAppContext, useLayoutType } from '@openmrs/esm-framework';
|
|
6
7
|
import { type WardViewContext } from '../types';
|
|
7
8
|
import styles from './admission-requests.scss';
|
|
8
9
|
|
|
@@ -11,7 +12,7 @@ interface AdmissionRequestsBarProps {
|
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
const AdmissionRequestsBar: React.FC<AdmissionRequestsBarProps> = ({ wardPendingPatients }) => {
|
|
14
|
-
const {wardPatientGroupDetails} = useAppContext<WardViewContext>('ward-view-context') ?? {};
|
|
15
|
+
const { wardPatientGroupDetails } = useAppContext<WardViewContext>('ward-view-context') ?? {};
|
|
15
16
|
const { inpatientRequests, isLoading, error } = wardPatientGroupDetails?.inpatientRequestResponse ?? {};
|
|
16
17
|
const { t } = useTranslation();
|
|
17
18
|
const layout = useLayoutType();
|
|
@@ -31,9 +32,11 @@ const AdmissionRequestsBar: React.FC<AdmissionRequestsBarProps> = ({ wardPending
|
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
return (
|
|
34
|
-
<div
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
<div
|
|
36
|
+
className={classNames(styles.admissionRequestsContainer, {
|
|
37
|
+
[styles.blackBackground]: inpatientRequests?.length,
|
|
38
|
+
[styles.lightBlueBackground]: !inpatientRequests?.length,
|
|
39
|
+
})}>
|
|
37
40
|
<Movement className={styles.movementIcon} size="24" />
|
|
38
41
|
<span className={styles.content}>
|
|
39
42
|
{t('admissionRequestsCount', '{{count}} admission request', {
|
|
@@ -41,7 +44,14 @@ const AdmissionRequestsBar: React.FC<AdmissionRequestsBarProps> = ({ wardPending
|
|
|
41
44
|
})}
|
|
42
45
|
</span>
|
|
43
46
|
<Button
|
|
44
|
-
onClick={() =>
|
|
47
|
+
onClick={() => {
|
|
48
|
+
launchWorkspaceGroup('ward-patient-admission-requests', {
|
|
49
|
+
state: { wardPendingPatients },
|
|
50
|
+
workspaceToLaunch: {
|
|
51
|
+
name: 'admission-requests-workspace',
|
|
52
|
+
},
|
|
53
|
+
});
|
|
54
|
+
}}
|
|
45
55
|
renderIcon={ArrowRightIcon}
|
|
46
56
|
kind="ghost"
|
|
47
57
|
size={isDesktop(layout) ? 'sm' : 'lg'}>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { launchWorkspaceGroup, useAppContext } from '@openmrs/esm-framework';
|
|
2
2
|
import { screen } from '@testing-library/react';
|
|
3
3
|
import userEvent from '@testing-library/user-event';
|
|
4
4
|
import React from 'react';
|
|
@@ -8,14 +8,14 @@ import { type WardViewContext } from '../types';
|
|
|
8
8
|
import AdmissionRequestsBar from './admission-requests-bar.component';
|
|
9
9
|
|
|
10
10
|
jest.mocked(useAppContext<WardViewContext>).mockReturnValue(mockWardViewContext);
|
|
11
|
-
|
|
11
|
+
const mockUseConfig = jest.mocked(launchWorkspaceGroup);
|
|
12
12
|
describe('Admission Requests Button', () => {
|
|
13
13
|
it('should launch workspace when clicked on manage button', async () => {
|
|
14
14
|
const user = userEvent.setup();
|
|
15
15
|
renderWithSwr(<AdmissionRequestsBar wardPendingPatients={[]} />);
|
|
16
16
|
|
|
17
17
|
await user.click(screen.getByRole('button', { name: /manage/i }));
|
|
18
|
-
expect(
|
|
18
|
+
expect(mockUseConfig).toHaveBeenCalled();
|
|
19
19
|
});
|
|
20
20
|
|
|
21
21
|
it('should have one admission request', () => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import styles from './ward-metric.scss';
|
|
3
2
|
import { SkeletonPlaceholder } from '@carbon/react';
|
|
3
|
+
import styles from './ward-metric.scss';
|
|
4
4
|
|
|
5
5
|
interface WardMetricProps {
|
|
6
6
|
metricName: string;
|
|
@@ -8,10 +8,9 @@ interface WardMetricProps {
|
|
|
8
8
|
isLoading: boolean;
|
|
9
9
|
}
|
|
10
10
|
const WardMetric: React.FC<WardMetricProps> = ({ metricName, metricValue, isLoading }) => {
|
|
11
|
-
|
|
12
11
|
return (
|
|
13
12
|
<div className={styles.metric}>
|
|
14
|
-
|
|
13
|
+
<span className={styles.metricName}>{metricName}</span>
|
|
15
14
|
{isLoading ? (
|
|
16
15
|
<SkeletonPlaceholder className={styles.skeleton} />
|
|
17
16
|
) : (
|
package/src/ward-workspace/admission-request-card/admission-request-card-actions.component.tsx
CHANGED
|
@@ -1,44 +1,42 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
import { Button } from '@carbon/react';
|
|
2
|
-
import { launchWorkspace, useAppContext, useLayoutType } from '@openmrs/esm-framework';
|
|
3
|
-
import React, { useCallback, useContext } from 'react';
|
|
4
3
|
import { useTranslation } from 'react-i18next';
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
4
|
+
import { launchWorkspace, useLayoutType } from '@openmrs/esm-framework';
|
|
5
|
+
import { useAdmissionRequestsWorkspaceContext } from '../admission-request-workspace/admission-requests-context';
|
|
6
|
+
import type { WardPatientCardType, WardPatientWorkspaceProps } from '../../types';
|
|
7
|
+
import AdmitPatientButton from '../admit-patient-button.component';
|
|
9
8
|
import styles from './admission-request-card.scss';
|
|
10
9
|
|
|
11
10
|
const AdmissionRequestCardActions: WardPatientCardType = ({ wardPatient }) => {
|
|
12
11
|
const { t } = useTranslation();
|
|
12
|
+
const { closeWorkspaceWithSavedChanges } = useAdmissionRequestsWorkspaceContext();
|
|
13
13
|
const responsiveSize = useLayoutType() === 'tablet' ? 'lg' : 'md';
|
|
14
|
-
const { WardPatientHeader } = useAppContext<WardViewContext>('ward-view-context') ?? {};
|
|
15
14
|
|
|
16
|
-
const launchPatientTransferForm =
|
|
15
|
+
const launchPatientTransferForm = () => {
|
|
17
16
|
launchWorkspace<WardPatientWorkspaceProps>('patient-transfer-request-workspace', {
|
|
18
17
|
wardPatient,
|
|
19
|
-
WardPatientHeader,
|
|
20
18
|
});
|
|
21
|
-
}
|
|
19
|
+
};
|
|
22
20
|
|
|
23
21
|
const launchCancelAdmissionForm = () => {
|
|
24
22
|
launchWorkspace<WardPatientWorkspaceProps>('cancel-admission-request-workspace', {
|
|
25
23
|
wardPatient,
|
|
26
|
-
WardPatientHeader,
|
|
27
24
|
});
|
|
28
25
|
};
|
|
29
26
|
|
|
30
|
-
const
|
|
27
|
+
const isTransfer = wardPatient.inpatientRequest.dispositionType == 'TRANSFER';
|
|
31
28
|
|
|
32
29
|
return (
|
|
33
30
|
<div className={styles.admissionRequestActionBar}>
|
|
34
31
|
<Button kind="ghost" size={responsiveSize} onClick={launchPatientTransferForm}>
|
|
35
|
-
{t('transferElsewhere', 'Transfer elsewhere')}
|
|
32
|
+
{isTransfer ? t('transferElsewhere', 'Transfer elsewhere') : t('admitElsewhere', 'Admit elsewhere')}
|
|
36
33
|
</Button>
|
|
37
34
|
<Button kind="ghost" size={responsiveSize} onClick={launchCancelAdmissionForm}>
|
|
38
35
|
{t('cancel', 'Cancel')}
|
|
39
36
|
</Button>
|
|
40
|
-
<
|
|
37
|
+
<AdmitPatientButton
|
|
41
38
|
wardPatient={wardPatient}
|
|
39
|
+
dispositionType={wardPatient.inpatientRequest.dispositionType}
|
|
42
40
|
onAdmitPatientSuccess={() => closeWorkspaceWithSavedChanges()}
|
|
43
41
|
/>
|
|
44
42
|
</div>
|
package/src/ward-workspace/admission-request-card/admission-request-card-header.component.tsx
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { formatDatetime, getLocale } from '@openmrs/esm-framework';
|
|
2
|
-
import classNames from 'classnames';
|
|
3
1
|
import React from 'react';
|
|
2
|
+
import { formatDatetime, getLocale } from '@openmrs/esm-framework';
|
|
4
3
|
import { type WardPatientCardType } from '../../types';
|
|
5
|
-
import
|
|
4
|
+
import classNames from 'classnames';
|
|
5
|
+
import WardPatientAge from '../../ward-patient-card/row-elements/ward-patient-age.component';
|
|
6
6
|
import WardPatientGender from '../../ward-patient-card/row-elements/ward-patient-gender.component';
|
|
7
|
-
import WardPatientIdentifier from '../../ward-patient-card/row-elements/ward-patient-identifier';
|
|
8
|
-
import WardPatientName from '../../ward-patient-card/row-elements/ward-patient-name';
|
|
7
|
+
import WardPatientIdentifier from '../../ward-patient-card/row-elements/ward-patient-identifier.component';
|
|
8
|
+
import WardPatientName from '../../ward-patient-card/row-elements/ward-patient-name.component';
|
|
9
9
|
import styles from './admission-request-card.scss';
|
|
10
10
|
|
|
11
11
|
const AdmissionRequestCardHeader: WardPatientCardType = ({ wardPatient }) => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { type ReactNode } from 'react';
|
|
2
|
-
import type { WardPatient
|
|
2
|
+
import type { WardPatient } from '../../types';
|
|
3
3
|
import AdmissionRequestCardActions from './admission-request-card-actions.component';
|
|
4
4
|
import AdmissionRequestCardHeader from './admission-request-card-header.component';
|
|
5
5
|
import styles from './admission-request-card.scss';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
import { ActionMenuButton, launchWorkspace, UserAvatarIcon } from '@openmrs/esm-framework';
|
|
4
|
+
import { type AdmissionRequestsWorkspaceContextProps } from './admission-requests-context';
|
|
5
|
+
|
|
6
|
+
export default function AdmissionRequestsActionButton() {
|
|
7
|
+
const { t } = useTranslation();
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<ActionMenuButton
|
|
11
|
+
getIcon={(props) => <UserAvatarIcon {...props} />}
|
|
12
|
+
handler={() => launchWorkspace<AdmissionRequestsWorkspaceContextProps>('admission-requests-workspace')}
|
|
13
|
+
iconDescription={t('pendingAdmissions', 'Pending admissions')}
|
|
14
|
+
label={t('pendingAdmissions', 'Pending admissions')}
|
|
15
|
+
type={'pending-admission-requests'}
|
|
16
|
+
/>
|
|
17
|
+
);
|
|
18
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import { type DefaultWorkspaceProps } from '@openmrs/esm-framework';
|
|
3
|
+
|
|
4
|
+
export interface AdmissionRequestsWorkspaceContextProps extends DefaultWorkspaceProps {
|
|
5
|
+
wardPendingPatients: React.ReactNode;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export const AdmissionRequestsWorkspaceContext = createContext<AdmissionRequestsWorkspaceContextProps>(null);
|
|
9
|
+
|
|
10
|
+
export const AdmissionRequestsWorkspaceContextProvider = AdmissionRequestsWorkspaceContext.Provider;
|
|
11
|
+
|
|
12
|
+
export const useAdmissionRequestsWorkspaceContext = () => {
|
|
13
|
+
const context = useContext(AdmissionRequestsWorkspaceContext);
|
|
14
|
+
if (!context) {
|
|
15
|
+
throw new Error(
|
|
16
|
+
'useAdmissionRequestsWorkspaceContext must be used within a AdmissionRequestsWorkspaceContextProvider',
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
return context;
|
|
20
|
+
};
|
package/src/ward-workspace/admission-request-workspace/admission-requests-workspace.test.tsx
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import { useAppContext } from '@openmrs/esm-framework';
|
|
2
|
-
import { screen } from '@testing-library/react';
|
|
3
1
|
import React from 'react';
|
|
4
|
-
import {
|
|
2
|
+
import { screen } from '@testing-library/react';
|
|
3
|
+
import { useAppContext } from '@openmrs/esm-framework';
|
|
4
|
+
import { renderWithSwr } from 'tools';
|
|
5
5
|
import { mockWardViewContext } from '../../../mock';
|
|
6
|
-
import
|
|
6
|
+
import { type AdmissionRequestsWorkspaceContextProps } from './admission-requests-context';
|
|
7
7
|
import { type WardViewContext } from '../../types';
|
|
8
|
+
import useEmrConfiguration from '../../hooks/useEmrConfiguration';
|
|
8
9
|
import DefaultWardPendingPatients from '../../ward-view/default-ward/default-ward-pending-patients.component';
|
|
9
|
-
import AdmissionRequestsWorkspace
|
|
10
|
+
import AdmissionRequestsWorkspace from './admission-requests.workspace';
|
|
10
11
|
|
|
11
12
|
jest.mocked(useAppContext<WardViewContext>).mockReturnValue(mockWardViewContext);
|
|
12
13
|
|
|
13
14
|
jest.mock('../../hooks/useEmrConfiguration', () => jest.fn());
|
|
14
15
|
const mockedUseEmrConfiguration = jest.mocked(useEmrConfiguration);
|
|
15
16
|
|
|
16
|
-
const workspaceProps:
|
|
17
|
+
const workspaceProps: AdmissionRequestsWorkspaceContextProps = {
|
|
17
18
|
closeWorkspace: jest.fn(),
|
|
18
19
|
promptBeforeClosing: jest.fn(),
|
|
19
20
|
closeWorkspaceWithSavedChanges: jest.fn(),
|
|
@@ -1,35 +1,23 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { type DefaultWorkspaceProps } from '@openmrs/esm-framework';
|
|
3
|
-
import React, { createContext, type ReactNode } from 'react';
|
|
1
|
+
import React from 'react';
|
|
4
2
|
import { useTranslation } from 'react-i18next';
|
|
3
|
+
import { InlineNotification } from '@carbon/react';
|
|
4
|
+
import { useAppContext } from '@openmrs/esm-framework';
|
|
5
|
+
import { type WardViewContext } from '../../types';
|
|
6
|
+
import {
|
|
7
|
+
AdmissionRequestsWorkspaceContextProvider,
|
|
8
|
+
type AdmissionRequestsWorkspaceContextProps,
|
|
9
|
+
} from './admission-requests-context';
|
|
5
10
|
import useEmrConfiguration from '../../hooks/useEmrConfiguration';
|
|
6
11
|
import styles from './admission-requests-workspace.scss';
|
|
7
12
|
|
|
8
|
-
|
|
9
|
-
wardPendingPatients: ReactNode;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export const AdmissionRequestsWorkspaceContext = createContext<AdmissionRequestsWorkspaceProps>(null);
|
|
13
|
-
|
|
14
|
-
const AdmissionRequestsWorkspace: React.FC<AdmissionRequestsWorkspaceProps> = (props) => {
|
|
15
|
-
const { wardPendingPatients } = props;
|
|
13
|
+
const AdmissionRequestsWorkspace: React.FC<AdmissionRequestsWorkspaceContextProps> = ({ wardPendingPatients }) => {
|
|
16
14
|
const { t } = useTranslation();
|
|
17
|
-
const [searchTerm, setSearchTerm] = React.useState('');
|
|
18
|
-
const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {
|
|
19
|
-
setSearchTerm(event.target.value);
|
|
20
|
-
};
|
|
21
15
|
const { errorFetchingEmrConfiguration } = useEmrConfiguration();
|
|
16
|
+
const { wardPatientGroupDetails } = useAppContext<WardViewContext>('ward-view-context') ?? {};
|
|
17
|
+
const { inpatientRequests, isLoading, error } = wardPatientGroupDetails?.inpatientRequestResponse ?? {};
|
|
22
18
|
|
|
23
19
|
return (
|
|
24
20
|
<div className={styles.admissionRequestsWorkspaceContainer}>
|
|
25
|
-
<Search
|
|
26
|
-
labelText=""
|
|
27
|
-
value={searchTerm}
|
|
28
|
-
onChange={handleSearch}
|
|
29
|
-
size="lg"
|
|
30
|
-
placeholder={t('searchForPatient', 'Search for a patient')}
|
|
31
|
-
disabled
|
|
32
|
-
/>
|
|
33
21
|
{errorFetchingEmrConfiguration && (
|
|
34
22
|
<div className={styles.formError}>
|
|
35
23
|
<InlineNotification
|
|
@@ -44,9 +32,11 @@ const AdmissionRequestsWorkspace: React.FC<AdmissionRequestsWorkspaceProps> = (p
|
|
|
44
32
|
/>
|
|
45
33
|
</div>
|
|
46
34
|
)}
|
|
47
|
-
<
|
|
35
|
+
{inpatientRequests?.length == 0 && <div>{t('noPendingPatientRequests', 'No pending patient requests')}</div>}
|
|
36
|
+
<AdmissionRequestsWorkspaceContextProvider
|
|
37
|
+
value={{ wardPendingPatients } as unknown as AdmissionRequestsWorkspaceContextProps}>
|
|
48
38
|
<div className={styles.content}>{wardPendingPatients}</div>
|
|
49
|
-
</
|
|
39
|
+
</AdmissionRequestsWorkspaceContextProvider>
|
|
50
40
|
</div>
|
|
51
41
|
);
|
|
52
42
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Button } from '@carbon/react';
|
|
1
|
+
import { Button, OverflowMenuItem } from '@carbon/react';
|
|
2
2
|
import {
|
|
3
3
|
ArrowRightIcon,
|
|
4
4
|
launchWorkspace,
|
|
@@ -10,36 +10,48 @@ import {
|
|
|
10
10
|
import React from 'react';
|
|
11
11
|
import { useTranslation } from 'react-i18next';
|
|
12
12
|
import useWardLocation from '../hooks/useWardLocation';
|
|
13
|
-
import type { WardPatient, WardPatientWorkspaceProps, WardViewContext } from '../types';
|
|
13
|
+
import type { DispositionType, WardPatient, WardPatientWorkspaceProps, WardViewContext } from '../types';
|
|
14
14
|
import { useAdmitPatient } from '../ward.resource';
|
|
15
15
|
|
|
16
|
-
interface
|
|
16
|
+
interface AdmitPatientButtonProps {
|
|
17
17
|
wardPatient: WardPatient;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* whether to create an admit or transfer encounter for the given patient
|
|
21
|
+
*/
|
|
22
|
+
dispositionType: DispositionType;
|
|
18
23
|
onAdmitPatientSuccess();
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
component?: 'btn' | 'menu';
|
|
19
26
|
}
|
|
20
27
|
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
const AdmitPatientButton: React.FC<AdmitPatientButtonProps> = ({
|
|
29
|
+
wardPatient,
|
|
30
|
+
onAdmitPatientSuccess,
|
|
31
|
+
disabled,
|
|
32
|
+
dispositionType,
|
|
33
|
+
component = 'btn',
|
|
34
|
+
}) => {
|
|
35
|
+
const { patient, visit, bed } = wardPatient ?? {};
|
|
24
36
|
const { t } = useTranslation();
|
|
25
37
|
const { location } = useWardLocation();
|
|
26
38
|
const responsiveSize = useLayoutType() === 'tablet' ? 'lg' : 'md';
|
|
27
|
-
const {
|
|
39
|
+
const { wardPatientGroupDetails } = useAppContext<WardViewContext>('ward-view-context') ?? {};
|
|
28
40
|
const { admitPatient, isLoadingEmrConfiguration, errorFetchingEmrConfiguration } = useAdmitPatient();
|
|
29
41
|
|
|
30
42
|
const launchPatientAdmissionForm = () =>
|
|
31
|
-
launchWorkspace<WardPatientWorkspaceProps>('admit-patient-form-workspace', { wardPatient
|
|
43
|
+
launchWorkspace<WardPatientWorkspaceProps>('admit-patient-form-workspace', { wardPatient });
|
|
32
44
|
|
|
33
45
|
const isBedManagementModuleInstalled = useFeatureFlag('bedmanagement-module');
|
|
34
46
|
|
|
35
|
-
// If bed management module is installed and the patient
|
|
47
|
+
// If bed management module is installed and the patient is not currently assigned a bed,
|
|
36
48
|
// open the next form for bed selection. If not, admit patient directly
|
|
37
49
|
// (Note that it is possible, albeit an edge case, for a patient to have a bed assigned while not admitted)
|
|
38
50
|
const onAdmit = () => {
|
|
39
51
|
if (isBedManagementModuleInstalled && !bed) {
|
|
40
52
|
launchPatientAdmissionForm();
|
|
41
53
|
} else {
|
|
42
|
-
admitPatient(patient, dispositionType)
|
|
54
|
+
admitPatient(patient, dispositionType, visit.uuid)
|
|
43
55
|
.then(
|
|
44
56
|
(response) => {
|
|
45
57
|
if (response && response?.ok) {
|
|
@@ -67,16 +79,27 @@ const AdmissionPatientButton: React.FC<AdmissionPatientButtonProps> = ({ wardPat
|
|
|
67
79
|
}
|
|
68
80
|
};
|
|
69
81
|
|
|
82
|
+
const disabledButton = isLoadingEmrConfiguration || errorFetchingEmrConfiguration || disabled;
|
|
83
|
+
|
|
84
|
+
if (component === 'menu')
|
|
85
|
+
return (
|
|
86
|
+
<OverflowMenuItem
|
|
87
|
+
itemText={
|
|
88
|
+
dispositionType == 'ADMIT' || disabledButton
|
|
89
|
+
? t('admitPatient', 'Admit patient')
|
|
90
|
+
: t('transferPatient', 'Transfer patient')
|
|
91
|
+
}
|
|
92
|
+
onClick={onAdmit}
|
|
93
|
+
/>
|
|
94
|
+
);
|
|
95
|
+
|
|
70
96
|
return (
|
|
71
|
-
<Button
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
disabled={isLoadingEmrConfiguration || errorFetchingEmrConfiguration}
|
|
76
|
-
onClick={onAdmit}>
|
|
77
|
-
{t('admitPatient', 'Admit patient')}
|
|
97
|
+
<Button kind="ghost" renderIcon={ArrowRightIcon} size={responsiveSize} disabled={disabledButton} onClick={onAdmit}>
|
|
98
|
+
{dispositionType == 'ADMIT' || disabledButton
|
|
99
|
+
? t('admitPatient', 'Admit patient')
|
|
100
|
+
: t('transferPatient', 'Transfer patient')}
|
|
78
101
|
</Button>
|
|
79
102
|
);
|
|
80
103
|
};
|
|
81
104
|
|
|
82
|
-
export default
|
|
105
|
+
export default AdmitPatientButton;
|
|
@@ -1,22 +1,21 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import userEvent from '@testing-library/user-event';
|
|
3
|
+
import { screen } from '@testing-library/react';
|
|
1
4
|
import {
|
|
2
|
-
CloseWorkspaceOptions,
|
|
3
5
|
type DefaultWorkspaceProps,
|
|
4
6
|
showSnackbar,
|
|
5
7
|
useAppContext,
|
|
6
8
|
useFeatureFlag,
|
|
7
9
|
useSession,
|
|
8
10
|
} from '@openmrs/esm-framework';
|
|
9
|
-
import {
|
|
10
|
-
import
|
|
11
|
-
import React from 'react';
|
|
12
|
-
import { mockInpatientRequestAlice, mockLocationInpatientWard, mockPatientAlice } from '../../../../../__mocks__';
|
|
13
|
-
import { renderWithSwr } from '../../../../../tools';
|
|
11
|
+
import { mockInpatientRequestAlice, mockLocationInpatientWard, mockPatientAlice } from '__mocks__';
|
|
12
|
+
import { renderWithSwr } from 'tools';
|
|
14
13
|
import { mockWardPatientGroupDetails, mockWardViewContext } from '../../../mock';
|
|
15
14
|
import { useAssignedBedByPatient } from '../../hooks/useAssignedBedByPatient';
|
|
16
|
-
import
|
|
17
|
-
import type { DispositionType, WardPatient, WardViewContext } from '../../types';
|
|
15
|
+
import type { WardPatient, WardViewContext } from '../../types';
|
|
18
16
|
import { assignPatientToBed, removePatientFromBed, useAdmitPatient } from '../../ward.resource';
|
|
19
17
|
import AdmitPatientFormWorkspace from './admit-patient-form.workspace';
|
|
18
|
+
import useWardLocation from '../../hooks/useWardLocation';
|
|
20
19
|
|
|
21
20
|
jest.mock('../../hooks/useAdmissionLocation', () => ({
|
|
22
21
|
useAdmissionLocation: jest.fn(),
|
|
@@ -88,10 +87,8 @@ function renderAdmissionForm() {
|
|
|
88
87
|
);
|
|
89
88
|
}
|
|
90
89
|
|
|
91
|
-
describe('Testing AdmitPatientForm', () => {
|
|
90
|
+
describe.skip('Testing AdmitPatientForm', () => {
|
|
92
91
|
beforeEach(() => {
|
|
93
|
-
jest.clearAllMocks();
|
|
94
|
-
|
|
95
92
|
mockedUseSession.mockReturnValue({
|
|
96
93
|
currentProvider: {
|
|
97
94
|
uuid: 'current-provider-uuid',
|
|
@@ -100,6 +97,7 @@ describe('Testing AdmitPatientForm', () => {
|
|
|
100
97
|
authenticated: true,
|
|
101
98
|
sessionId: 'session-id',
|
|
102
99
|
});
|
|
100
|
+
|
|
103
101
|
mockedUseFeatureFlag.mockReturnValue(true);
|
|
104
102
|
|
|
105
103
|
mockedUseWardLocation.mockReturnValue({
|
|
@@ -116,7 +114,7 @@ describe('Testing AdmitPatientForm', () => {
|
|
|
116
114
|
results: [
|
|
117
115
|
{
|
|
118
116
|
bedId: 1,
|
|
119
|
-
bedNumber: 1,
|
|
117
|
+
bedNumber: '1',
|
|
120
118
|
bedType: null,
|
|
121
119
|
patients: [mockPatientAlice],
|
|
122
120
|
physicalLocation: mockLocationInpatientWard,
|
|
@@ -162,7 +160,7 @@ describe('Testing AdmitPatientForm', () => {
|
|
|
162
160
|
expect(screen.getByRole('radio', { name: 'bed4 · Empty' })).toBeInTheDocument();
|
|
163
161
|
});
|
|
164
162
|
|
|
165
|
-
it('should block the form if emr configuration is not fetched properly', () => {
|
|
163
|
+
it.skip('should block the form if emr configuration is not fetched properly', () => {
|
|
166
164
|
mockedUseAdmitPatient.mockReturnValueOnce({
|
|
167
165
|
admitPatient: mockedAdmitPatient,
|
|
168
166
|
isLoadingEmrConfiguration: false,
|
|
@@ -192,11 +190,11 @@ describe('Testing AdmitPatientForm', () => {
|
|
|
192
190
|
const admitButton = screen.getByRole('button', { name: 'Admit' });
|
|
193
191
|
expect(admitButton).toBeEnabled();
|
|
194
192
|
await user.click(admitButton);
|
|
195
|
-
expect(mockedAdmitPatient).toHaveBeenCalledWith(mockPatientAlice, 'ADMIT');
|
|
193
|
+
expect(mockedAdmitPatient).toHaveBeenCalledWith(mockPatientAlice, 'ADMIT', mockInpatientRequestAlice.visit.uuid);
|
|
196
194
|
expect(mockedAssignPatientToBed).toHaveBeenCalledWith(3, mockPatientAlice.uuid, 'encounter-uuid');
|
|
197
195
|
expect(mockedShowSnackbar).toHaveBeenCalledWith({
|
|
198
196
|
kind: 'success',
|
|
199
|
-
subtitle: '
|
|
197
|
+
subtitle: 'Alice Johnson has been successfully admitted and assigned to bed bed3',
|
|
200
198
|
title: 'Patient admitted successfully',
|
|
201
199
|
});
|
|
202
200
|
});
|
|
@@ -240,7 +238,7 @@ describe('Testing AdmitPatientForm', () => {
|
|
|
240
238
|
const admitButton = screen.getByRole('button', { name: 'Admit' });
|
|
241
239
|
expect(admitButton).toBeEnabled();
|
|
242
240
|
await user.click(admitButton);
|
|
243
|
-
expect(mockedAdmitPatient).toHaveBeenCalledWith(mockPatientAlice, 'ADMIT');
|
|
241
|
+
expect(mockedAdmitPatient).toHaveBeenCalledWith(mockPatientAlice, 'ADMIT', mockInpatientRequestAlice.visit.uuid);
|
|
244
242
|
expect(mockedRemovePatientFromBed).toHaveBeenCalledWith(1, mockPatientAlice.uuid);
|
|
245
243
|
expect(mockedShowSnackbar).toHaveBeenCalledWith({
|
|
246
244
|
kind: 'success',
|
|
@@ -25,7 +25,7 @@ const AdmitPatientFormWorkspace: React.FC<WardPatientWorkspaceProps> = ({
|
|
|
25
25
|
closeWorkspaceWithSavedChanges,
|
|
26
26
|
promptBeforeClosing,
|
|
27
27
|
}) => {
|
|
28
|
-
const { patient, inpatientRequest } = wardPatient ?? {};
|
|
28
|
+
const { patient, inpatientRequest, visit } = wardPatient ?? {};
|
|
29
29
|
const dispositionType = inpatientRequest?.dispositionType ?? 'ADMIT';
|
|
30
30
|
|
|
31
31
|
const { t } = useTranslation();
|
|
@@ -67,7 +67,7 @@ const AdmitPatientFormWorkspace: React.FC<WardPatientWorkspaceProps> = ({
|
|
|
67
67
|
setShowErrorNotifications(false);
|
|
68
68
|
setIsSubmitting(true);
|
|
69
69
|
const bedSelected = beds.find((bed) => bed.bedId === values.bedId);
|
|
70
|
-
admitPatient(patient, dispositionType)
|
|
70
|
+
admitPatient(patient, dispositionType, visit.uuid)
|
|
71
71
|
.then(
|
|
72
72
|
async (response) => {
|
|
73
73
|
if (response.ok) {
|
package/src/ward-workspace/cancel-admission-request-workspace/cancel-admission-request.test.tsx
CHANGED
|
@@ -75,7 +75,7 @@ function renderCancelAdmissionRequestWorkspace() {
|
|
|
75
75
|
);
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
describe('CancelAdmissionRequestWorkspace', () => {
|
|
78
|
+
describe.skip('CancelAdmissionRequestWorkspace', () => {
|
|
79
79
|
it('should cancel admission request form creates encounter when form is filled out and submitted ', async () => {
|
|
80
80
|
const user = userEvent.setup();
|
|
81
81
|
renderCancelAdmissionRequestWorkspace();
|
package/src/ward-workspace/cancel-admission-request-workspace/cancel-admission-request.workspace.tsx
CHANGED
|
@@ -5,10 +5,9 @@ import { zodResolver } from '@hookform/resolvers/zod';
|
|
|
5
5
|
import { Controller, useForm } from 'react-hook-form';
|
|
6
6
|
import { useTranslation } from 'react-i18next';
|
|
7
7
|
import { z } from 'zod';
|
|
8
|
-
import { ResponsiveWrapper, showSnackbar, useAppContext
|
|
8
|
+
import { ResponsiveWrapper, showSnackbar, useAppContext } from '@openmrs/esm-framework';
|
|
9
9
|
import type { ObsPayload, WardPatientWorkspaceProps, WardViewContext } from '../../types';
|
|
10
10
|
import { useCreateEncounter } from '../../ward.resource';
|
|
11
|
-
import useWardLocation from '../../hooks/useWardLocation';
|
|
12
11
|
import WardPatientWorkspaceBanner from '../patient-banner/patient-banner.component';
|
|
13
12
|
import styles from './cancel-admission-request.scss';
|
|
14
13
|
|
|
@@ -17,14 +16,12 @@ export default function CancelAdmissionRequestWorkspace({
|
|
|
17
16
|
wardPatient,
|
|
18
17
|
promptBeforeClosing,
|
|
19
18
|
}: WardPatientWorkspaceProps) {
|
|
20
|
-
const { patient } = wardPatient ?? {};
|
|
19
|
+
const { patient, visit } = wardPatient ?? {};
|
|
21
20
|
const { t } = useTranslation();
|
|
22
21
|
const [showErrorNotifications, setShowErrorNotifications] = useState(false);
|
|
23
22
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
24
23
|
const { createEncounter, emrConfiguration, isLoadingEmrConfiguration, errorFetchingEmrConfiguration } =
|
|
25
24
|
useCreateEncounter();
|
|
26
|
-
const { currentProvider } = useSession();
|
|
27
|
-
const { location } = useWardLocation();
|
|
28
25
|
const { wardPatientGroupDetails } = useAppContext<WardViewContext>('ward-view-context') ?? {};
|
|
29
26
|
|
|
30
27
|
const zodSchema = useMemo(
|
|
@@ -77,7 +74,7 @@ export default function CancelAdmissionRequestWorkspace({
|
|
|
77
74
|
},
|
|
78
75
|
];
|
|
79
76
|
|
|
80
|
-
createEncounter(patient, emrConfiguration?.cancelADTRequestEncounterType, obs)
|
|
77
|
+
createEncounter(patient, emrConfiguration?.cancelADTRequestEncounterType, visit?.uuid, obs)
|
|
81
78
|
.then(() => {
|
|
82
79
|
showSnackbar({
|
|
83
80
|
title: t('admissionRequestCancelled', 'Admission request cancelled.'),
|
|
@@ -107,6 +104,7 @@ export default function CancelAdmissionRequestWorkspace({
|
|
|
107
104
|
t,
|
|
108
105
|
closeWorkspaceWithSavedChanges,
|
|
109
106
|
wardPatientGroupDetails,
|
|
107
|
+
visit?.uuid,
|
|
110
108
|
],
|
|
111
109
|
);
|
|
112
110
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
3
|
+
import { ActionMenuButton, AddIcon, launchWorkspace } from '@openmrs/esm-framework';
|
|
4
|
+
import { type CreateAdmissionEncounterWorkspaceProps } from './create-admission-encounter.workspace';
|
|
5
|
+
|
|
6
|
+
function CreateAdmissionRequestActionButton() {
|
|
7
|
+
const { t } = useTranslation();
|
|
8
|
+
|
|
9
|
+
// TODO: this is an attempt to save the previous search term for the
|
|
10
|
+
// "Back to patient search" button, but it doesn't work. See:
|
|
11
|
+
// https://openmrs.atlassian.net/browse/O3-4300
|
|
12
|
+
const [searchTerm, setSearchTerm] = useState<string>('');
|
|
13
|
+
|
|
14
|
+
// See PatientSearchWorkspaceProps in patient-search-app
|
|
15
|
+
const workspaceProps = {
|
|
16
|
+
initialQuery: searchTerm,
|
|
17
|
+
nonNavigationSelectPatientAction: async (patientUuid) => {
|
|
18
|
+
launchWorkspace<CreateAdmissionEncounterWorkspaceProps>('create-admission-encounter-workspace', {
|
|
19
|
+
patientUuid,
|
|
20
|
+
handleReturnToSearchList: launchSearchWorkspace,
|
|
21
|
+
});
|
|
22
|
+
},
|
|
23
|
+
handleSearchTermUpdated: (value: string) => {
|
|
24
|
+
setSearchTerm(value);
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const launchSearchWorkspace = () => {
|
|
29
|
+
launchWorkspace('patient-search-workspace', {
|
|
30
|
+
...workspaceProps,
|
|
31
|
+
workspaceTitle: t('addPatientToWard', 'Add patient to ward'),
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<ActionMenuButton
|
|
37
|
+
getIcon={(props) => <AddIcon {...props} />}
|
|
38
|
+
label={t('addPatientToWard', 'Add patient to ward')}
|
|
39
|
+
iconDescription={t('addPatientToWard', 'Add patient to ward')}
|
|
40
|
+
handler={launchSearchWorkspace}
|
|
41
|
+
type={'patient-search-workspace'}
|
|
42
|
+
/>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export default CreateAdmissionRequestActionButton;
|