@kenyaemr/esm-ward-app 8.0.1-pre.95 → 8.0.2

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.
Files changed (196) hide show
  1. package/.turbo/turbo-build.log +20 -24
  2. package/dist/109.js +1 -0
  3. package/dist/109.js.map +1 -0
  4. package/dist/124.js +1 -0
  5. package/dist/124.js.map +1 -0
  6. package/dist/125.js +1 -0
  7. package/dist/125.js.map +1 -0
  8. package/dist/130.js +1 -1
  9. package/dist/130.js.LICENSE.txt +2 -0
  10. package/dist/130.js.map +1 -1
  11. package/dist/146.js +1 -0
  12. package/dist/146.js.map +1 -0
  13. package/dist/15.js +1 -0
  14. package/dist/15.js.map +1 -0
  15. package/dist/153.js +1 -0
  16. package/dist/153.js.map +1 -0
  17. package/dist/303.js +2 -1
  18. package/dist/303.js.map +1 -1
  19. package/dist/325.js +1 -0
  20. package/dist/325.js.map +1 -0
  21. package/dist/372.js +2 -0
  22. package/dist/372.js.map +1 -0
  23. package/dist/471.js +1 -0
  24. package/dist/471.js.map +1 -0
  25. package/dist/481.js +1 -0
  26. package/dist/481.js.map +1 -0
  27. package/dist/53.js +1 -0
  28. package/dist/53.js.map +1 -0
  29. package/dist/{960.js → 559.js} +1 -1
  30. package/dist/559.js.map +1 -0
  31. package/dist/574.js +1 -1
  32. package/dist/576.js +1 -0
  33. package/dist/576.js.map +1 -0
  34. package/dist/577.js +1 -1
  35. package/dist/577.js.map +1 -1
  36. package/dist/{255.js → 649.js} +2 -2
  37. package/dist/649.js.LICENSE.txt +9 -0
  38. package/dist/649.js.map +1 -0
  39. package/dist/{659.js → 662.js} +1 -1
  40. package/dist/662.js.map +1 -0
  41. package/dist/920.js +1 -0
  42. package/dist/920.js.map +1 -0
  43. package/dist/921.js +1 -0
  44. package/dist/921.js.map +1 -0
  45. package/dist/922.js +1 -0
  46. package/dist/922.js.map +1 -0
  47. package/dist/969.js +1 -0
  48. package/dist/969.js.map +1 -0
  49. package/dist/kenyaemr-esm-ward-app.js +1 -1
  50. package/dist/kenyaemr-esm-ward-app.js.buildmanifest.json +304 -128
  51. package/dist/kenyaemr-esm-ward-app.js.map +1 -1
  52. package/dist/main.js +1 -1
  53. package/dist/main.js.LICENSE.txt +0 -10
  54. package/dist/main.js.map +1 -1
  55. package/dist/routes.json +1 -1
  56. package/mock.tsx +62 -0
  57. package/package-lock.json +5001 -0
  58. package/package.json +2 -3
  59. package/src/action-menu-buttons/clinical-forms-workspace-siderail.component.tsx +37 -0
  60. package/src/action-menu-buttons/discharge-workspace-siderail.component.tsx +20 -0
  61. package/src/beds/empty-bed-skeleton.tsx +4 -3
  62. package/src/beds/empty-bed.component.tsx +3 -3
  63. package/src/beds/ward-bed.component.tsx +41 -0
  64. package/src/beds/ward-bed.scss +45 -0
  65. package/src/beds/{occupied-bed.test.tsx → ward-bed.test.tsx} +42 -20
  66. package/src/config-schema.ts +203 -84
  67. package/src/constant.ts +1 -1
  68. package/src/hooks/useAdmissionLocation.ts +22 -4
  69. package/src/hooks/useAssignedBedByPatient.ts +9 -0
  70. package/src/hooks/useBeds.ts +3 -4
  71. package/src/hooks/useConcept.ts +3 -4
  72. package/src/hooks/useEmrConfiguration.ts +5 -0
  73. package/src/hooks/useInpatientAdmission.ts +9 -14
  74. package/src/hooks/useInpatientRequest.ts +4 -15
  75. package/src/hooks/useLocations.ts +8 -51
  76. package/src/hooks/useMotherAndChildren.ts +46 -0
  77. package/src/hooks/useObs.ts +3 -7
  78. package/src/hooks/usePatientPendingOrders.ts +16 -0
  79. package/src/hooks/useWardPatientGrouping.ts +32 -0
  80. package/src/index.ts +45 -17
  81. package/src/location-selector/location-selector.component.tsx +18 -21
  82. package/src/root.component.tsx +3 -0
  83. package/src/routes.json +41 -3
  84. package/src/types/index.ts +50 -1
  85. package/src/ward-patient-card/card-rows/admission-request-note-row.component.tsx +38 -0
  86. package/src/ward-patient-card/card-rows/coded-obs-tags-row.component.tsx +108 -0
  87. package/src/ward-patient-card/card-rows/mother-child-row.component.tsx +84 -0
  88. package/src/ward-patient-card/card-rows/mother-child-row.scss +22 -0
  89. package/src/ward-patient-card/card-rows/pending-items-row.component.tsx +54 -0
  90. package/src/ward-patient-card/row-elements/ward-patient-age.tsx +1 -1
  91. package/src/ward-patient-card/row-elements/ward-patient-coded-obs-tags.tsx +62 -39
  92. package/src/ward-patient-card/row-elements/ward-patient-header-address.tsx +5 -5
  93. package/src/ward-patient-card/row-elements/ward-patient-identifier.tsx +18 -41
  94. package/src/ward-patient-card/row-elements/ward-patient-location.tsx +19 -0
  95. package/src/ward-patient-card/row-elements/ward-patient-obs.resource.ts +38 -34
  96. package/src/ward-patient-card/row-elements/ward-patient-obs.tsx +26 -13
  97. package/src/ward-patient-card/row-elements/ward-patient-pending-order.component.tsx +45 -0
  98. package/src/ward-patient-card/row-elements/ward-patient-pending-transfer.tsx +38 -0
  99. package/src/ward-patient-card/row-elements/ward-patient-responsive-tooltip.tsx +32 -0
  100. package/src/ward-patient-card/row-elements/ward-patient-skeleton-text.tsx +9 -0
  101. package/src/ward-patient-card/ward-patient-card.component.tsx +14 -45
  102. package/src/ward-patient-card/ward-patient-card.scss +68 -9
  103. package/src/ward-view/default-ward/default-ward-beds.component.tsx +42 -0
  104. package/src/ward-view/default-ward/default-ward-patient-card-header.component.tsx +32 -0
  105. package/src/ward-view/default-ward/default-ward-patient-card.component.tsx +31 -0
  106. package/src/ward-view/default-ward/default-ward-pending-patients.component.tsx +52 -0
  107. package/src/ward-view/default-ward/default-ward-unassigned-patients.component.tsx +32 -0
  108. package/src/ward-view/default-ward/default-ward-view.component.tsx +31 -0
  109. package/src/ward-view/materal-ward/maternal-ward-beds.component.tsx +65 -0
  110. package/src/ward-view/materal-ward/maternal-ward-patient-card-header.component.tsx +30 -0
  111. package/src/ward-view/materal-ward/maternal-ward-patient-card.component.tsx +93 -0
  112. package/src/{beds/occupied-bed.scss → ward-view/materal-ward/maternal-ward-patient-card.scss} +4 -9
  113. package/src/ward-view/materal-ward/maternal-ward-patient-card.test.tsx +58 -0
  114. package/src/ward-view/materal-ward/maternal-ward-pending-patients.component.tsx +48 -0
  115. package/src/ward-view/materal-ward/maternal-ward-unassigned-patients.component.tsx +33 -0
  116. package/src/ward-view/materal-ward/maternal-ward-view.component.tsx +38 -0
  117. package/src/ward-view/materal-ward/maternal-ward-view.resource.ts +89 -0
  118. package/src/ward-view/ward-view.component.tsx +15 -163
  119. package/src/ward-view/ward-view.resource.ts +193 -1
  120. package/src/ward-view/ward-view.scss +17 -6
  121. package/src/ward-view/ward-view.test.tsx +43 -48
  122. package/src/ward-view/ward.component.tsx +106 -0
  123. package/src/ward-view-header/admission-requests-bar.component.tsx +14 -9
  124. package/src/ward-view-header/admission-requests-bar.test.tsx +11 -23
  125. package/src/ward-view-header/admission-requests.scss +1 -1
  126. package/src/ward-view-header/ward-metric.component.tsx +24 -0
  127. package/src/ward-view-header/ward-metric.scss +25 -0
  128. package/src/ward-view-header/ward-metrics.component.tsx +78 -0
  129. package/src/ward-view-header/ward-metrics.scss +7 -0
  130. package/src/ward-view-header/ward-metrics.test.tsx +37 -0
  131. package/src/ward-view-header/ward-view-header.component.tsx +9 -4
  132. package/src/ward-view-header/ward-view-header.scss +0 -1
  133. package/src/ward-workspace/admission-request-card/admission-request-card-actions.component.tsx +70 -6
  134. package/src/ward-workspace/admission-request-card/admission-request-card-header.component.tsx +10 -23
  135. package/src/ward-workspace/admission-request-card/admission-request-card.component.tsx +9 -3
  136. package/src/ward-workspace/admission-request-card/admission-request-card.scss +13 -4
  137. package/src/ward-workspace/admission-request-workspace/admission-requests-workspace.test.tsx +55 -33
  138. package/src/ward-workspace/admission-request-workspace/admission-requests.workspace.tsx +30 -37
  139. package/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.test.tsx +98 -203
  140. package/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.workspace.tsx +116 -180
  141. package/src/ward-workspace/bed-selector.component.tsx +119 -0
  142. package/src/ward-workspace/bed-selector.scss +15 -0
  143. package/src/ward-workspace/patient-banner/patient-banner.component.tsx +7 -14
  144. package/src/ward-workspace/patient-clinical-forms-workspace/patient-clinical-forms.workspace.tsx +23 -0
  145. package/src/{ward-patient-workspace → ward-workspace/patient-details}/ward-patient-action-button.extension.tsx +2 -1
  146. package/src/{ward-patient-workspace → ward-workspace/patient-details}/ward-patient.workspace.tsx +18 -9
  147. package/src/ward-workspace/patient-discharge/patient-discharge.scss +41 -0
  148. package/src/ward-workspace/patient-discharge/patient-discharge.workspace.tsx +113 -0
  149. package/src/ward-workspace/patient-transfer-bed-swap/patient-bed-swap-form.component.tsx +68 -79
  150. package/src/ward-workspace/patient-transfer-bed-swap/patient-transfer-request-form.component.tsx +24 -24
  151. package/src/ward-workspace/patient-transfer-bed-swap/patient-transfer-swap.scss +12 -2
  152. package/src/ward-workspace/patient-transfer-bed-swap/patient-transfer-swap.workspace.tsx +12 -8
  153. package/src/ward-workspace/patient-transfer-request-workspace/patient-transfer-request.workspace.tsx +11 -0
  154. package/src/ward-workspace/ward-patient-notes/form/notes-form.component.tsx +1 -1
  155. package/src/ward-workspace/ward-patient-notes/form/notes-form.test.tsx +1 -1
  156. package/src/ward-workspace/ward-patient-notes/history/notes-container.component.tsx +2 -2
  157. package/src/ward-workspace/ward-patient-notes/notes.resource.ts +5 -7
  158. package/src/ward-workspace/ward-patient-notes/notes.workspace.tsx +1 -1
  159. package/src/ward-workspace/ward-patient-notes/types.ts +0 -4
  160. package/src/ward.resource.ts +38 -2
  161. package/translations/en.json +31 -7
  162. package/dist/152.js +0 -1
  163. package/dist/152.js.map +0 -1
  164. package/dist/255.js.map +0 -1
  165. package/dist/269.js +0 -1
  166. package/dist/269.js.map +0 -1
  167. package/dist/346.js +0 -1
  168. package/dist/346.js.map +0 -1
  169. package/dist/466.js +0 -1
  170. package/dist/466.js.map +0 -1
  171. package/dist/659.js.map +0 -1
  172. package/dist/729.js +0 -1
  173. package/dist/729.js.map +0 -1
  174. package/dist/749.js +0 -1
  175. package/dist/749.js.map +0 -1
  176. package/dist/76.js +0 -1
  177. package/dist/76.js.map +0 -1
  178. package/dist/793.js +0 -2
  179. package/dist/793.js.map +0 -1
  180. package/dist/803.js +0 -1
  181. package/dist/803.js.map +0 -1
  182. package/dist/960.js.map +0 -1
  183. package/src/beds/empty-bed.scss +0 -28
  184. package/src/beds/occupied-bed.component.tsx +0 -35
  185. package/src/beds/unassigned-patient.component.tsx +0 -20
  186. package/src/beds/unassigned-patient.scss +0 -6
  187. package/src/config-schema-admission-request-note.ts +0 -9
  188. package/src/config-schema-extension-colored-obs-tags.ts +0 -91
  189. package/src/hooks/useCurrentWardCardConfig.ts +0 -32
  190. package/src/ward-patient-card/card-rows/admission-request-note.extension.tsx +0 -27
  191. package/src/ward-patient-card/card-rows/colored-obs-tags-card-row.extension.tsx +0 -13
  192. package/src/ward-patient-card/ward-patient-card-element.component.tsx +0 -65
  193. package/src/ward-view/ward-bed.component.tsx +0 -14
  194. /package/dist/{793.js.LICENSE.txt → 303.js.LICENSE.txt} +0 -0
  195. /package/dist/{255.js.LICENSE.txt → 372.js.LICENSE.txt} +0 -0
  196. /package/src/{ward-patient-workspace → ward-workspace/patient-details}/ward-patient.style.scss +0 -0
@@ -1,25 +1,89 @@
1
1
  import { Button } from '@carbon/react';
2
- import { ArrowRightIcon, launchWorkspace, useLayoutType } from '@openmrs/esm-framework';
3
- import React, { useCallback } from 'react';
2
+ import {
3
+ ArrowRightIcon,
4
+ launchWorkspace,
5
+ showSnackbar,
6
+ useAppContext,
7
+ useFeatureFlag,
8
+ useLayoutType,
9
+ } from '@openmrs/esm-framework';
10
+ import React, { useCallback, useContext } from 'react';
4
11
  import { useTranslation } from 'react-i18next';
5
- import type { WardPatientCard } from '../../types';
12
+ import useWardLocation from '../../hooks/useWardLocation';
13
+ import type { WardPatientCardType, WardPatientWorkspaceProps, WardViewContext } from '../../types';
14
+ import { useAdmitPatient } from '../../ward.resource';
15
+ import { AdmissionRequestsWorkspaceContext } from '../admission-request-workspace/admission-requests.workspace';
6
16
  import type { AdmitPatientFormWorkspaceProps } from '../admit-patient-form-workspace/types';
7
17
  import styles from './admission-request-card.scss';
8
18
 
9
- const AdmissionRequestCardActions: WardPatientCard = ({ patient, inpatientRequest }) => {
19
+ const AdmissionRequestCardActions: WardPatientCardType = (wardPatient) => {
20
+ const { patient, inpatientRequest } = wardPatient;
10
21
  const { dispositionType } = inpatientRequest;
11
22
  const { t } = useTranslation();
23
+ const { location } = useWardLocation();
12
24
  const responsiveSize = useLayoutType() === 'tablet' ? 'lg' : 'md';
25
+ const { WardPatientHeader, wardPatientGroupDetails } = useAppContext<WardViewContext>('ward-view-context') ?? {};
26
+ const { admitPatient, isLoadingEmrConfiguration, errorFetchingEmrConfiguration } = useAdmitPatient();
27
+
13
28
  const launchPatientAdmissionForm = useCallback(
14
29
  () => launchWorkspace<AdmitPatientFormWorkspaceProps>('admit-patient-form-workspace', { patient, dispositionType }),
15
30
  [],
16
31
  );
32
+
33
+ const launchPatientTransferForm = useCallback(() => {
34
+ launchWorkspace<WardPatientWorkspaceProps>('patient-transfer-request-workspace', {
35
+ wardPatient,
36
+ WardPatientHeader,
37
+ });
38
+ }, [wardPatient, WardPatientHeader]);
39
+ const isBedManagementModuleInstalled = useFeatureFlag('bedmanagement-module');
40
+ const { closeWorkspaceWithSavedChanges } = useContext(AdmissionRequestsWorkspaceContext);
41
+
42
+ // If bed management module is installed, open the next form
43
+ // for bed selection. If not, admit patient directly
44
+ const onAdmit = () => {
45
+ if (isBedManagementModuleInstalled) {
46
+ launchPatientAdmissionForm();
47
+ } else {
48
+ admitPatient(patient, dispositionType)
49
+ .then(
50
+ (response) => {
51
+ if (response && response?.ok) {
52
+ showSnackbar({
53
+ kind: 'success',
54
+ title: t('patientAdmittedSuccessfully', 'Patient admitted successfully'),
55
+ subtitle: t('patientAdmittedWoBed', 'Patient admitted successfully to {{location}}', {
56
+ location: location?.display,
57
+ }),
58
+ });
59
+ }
60
+ },
61
+ (err: Error) => {
62
+ showSnackbar({
63
+ kind: 'error',
64
+ title: t('errorCreatingEncounter', 'Failed to admit patient'),
65
+ subtitle: err.message,
66
+ });
67
+ },
68
+ )
69
+ .finally(() => {
70
+ wardPatientGroupDetails?.mutate?.();
71
+ closeWorkspaceWithSavedChanges();
72
+ });
73
+ }
74
+ };
75
+
17
76
  return (
18
77
  <div className={styles.admissionRequestActionBar}>
19
- <Button kind="ghost" size={responsiveSize}>
78
+ <Button kind="ghost" size={responsiveSize} onClick={launchPatientTransferForm}>
20
79
  {t('transferElsewhere', 'Transfer elsewhere')}
21
80
  </Button>
22
- <Button kind="ghost" renderIcon={ArrowRightIcon} size={responsiveSize} onClick={launchPatientAdmissionForm}>
81
+ <Button
82
+ kind="ghost"
83
+ renderIcon={ArrowRightIcon}
84
+ size={responsiveSize}
85
+ disabled={isLoadingEmrConfiguration || errorFetchingEmrConfiguration}
86
+ onClick={onAdmit}>
23
87
  {t('admitPatient', 'Admit patient')}
24
88
  </Button>
25
89
  </div>
@@ -1,33 +1,25 @@
1
- import { ExtensionSlot, formatDatetime, getLocale } from '@openmrs/esm-framework';
1
+ import { formatDatetime, getLocale } from '@openmrs/esm-framework';
2
2
  import classNames from 'classnames';
3
3
  import React from 'react';
4
- import WardPatientWorkspaceBanner from '../patient-banner/patient-banner.component';
5
- import styles from './admission-request-card.scss';
6
- import type WardPatientCard from '../../ward-patient-card/ward-patient-card.component';
7
- import { useCurrentWardCardConfig } from '../../hooks/useCurrentWardCardConfig';
8
- import { WardPatientCardElement } from '../../ward-patient-card/ward-patient-card-element.component';
4
+ import { type WardPatientCardType } from '../../types';
5
+ import WardPatientAge from '../../ward-patient-card/row-elements/ward-patient-age';
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';
9
8
  import WardPatientName from '../../ward-patient-card/row-elements/ward-patient-name';
9
+ import styles from './admission-request-card.scss';
10
10
 
11
- const AdmissionRequestCardHeader: WardPatientCard = (wardPatient) => {
11
+ const AdmissionRequestCardHeader: WardPatientCardType = (wardPatient) => {
12
12
  const { inpatientRequest } = wardPatient;
13
13
  const { dispositionEncounter } = inpatientRequest;
14
- const { id, headerRowElements } = useCurrentWardCardConfig();
15
14
  const { patient } = wardPatient;
16
- const extensionSlotState = wardPatient;
17
-
18
- const rowsExtensionSlotName = id == 'default' ? 'ward-patient-card-slot' : `ward-patient-card-${id}-slot`;
19
15
 
20
16
  return (
21
17
  <div className={styles.admissionRequestCardHeaderContainer}>
22
18
  <div className={styles.admissionRequestCardHeader}>
23
19
  <WardPatientName patient={patient} />
24
- {headerRowElements.map((elementId, i) => (
25
- <WardPatientCardElement
26
- key={`ward-card-${patient.uuid}-header-${i}`}
27
- elementId={elementId}
28
- {...wardPatient}
29
- />
30
- ))}
20
+ <WardPatientIdentifier id="patient-identifier" patient={patient} />
21
+ <WardPatientGender patient={patient} />
22
+ <WardPatientAge patient={patient} />
31
23
  </div>
32
24
  <div className={classNames(styles.admissionRequestCardHeader, styles.admissionEncounterDetails)}>
33
25
  <div>
@@ -39,11 +31,6 @@ const AdmissionRequestCardHeader: WardPatientCard = (wardPatient) => {
39
31
  <div>{dispositionEncounter?.encounterProviders?.map((provider) => provider?.provider?.display).join(',')}</div>
40
32
  <div>{dispositionEncounter?.location?.display}</div>
41
33
  </div>
42
- <ExtensionSlot
43
- name={rowsExtensionSlotName}
44
- state={extensionSlotState}
45
- className={styles.admissionRequestCardRow}
46
- />
47
34
  </div>
48
35
  );
49
36
  };
@@ -1,13 +1,19 @@
1
- import React from 'react';
2
- import type { WardPatientCard } from '../../types';
1
+ import React, { type ReactNode } from 'react';
2
+ import type { WardPatient, WardPatientCardType } 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';
6
6
 
7
- const AdmissionRequestCard: WardPatientCard = (wardPatient) => {
7
+ interface AdmissionRequestCardProps {
8
+ wardPatient: WardPatient;
9
+ children?: ReactNode;
10
+ }
11
+
12
+ const AdmissionRequestCard: React.FC<AdmissionRequestCardProps> = ({ wardPatient, children }) => {
8
13
  return (
9
14
  <div className={styles.admissionRequestCard}>
10
15
  <AdmissionRequestCardHeader {...wardPatient} />
16
+ {children}
11
17
  <AdmissionRequestCardActions {...wardPatient} />
12
18
  </div>
13
19
  );
@@ -8,6 +8,11 @@
8
8
  height: fit-content;
9
9
  color: $color-gray-70;
10
10
  margin-bottom: layout.$spacing-05;
11
+
12
+ > div {
13
+ margin: layout.$spacing-04;
14
+ width: unset;
15
+ }
11
16
  }
12
17
 
13
18
  .admissionRequestCardHeaderContainer {
@@ -25,10 +30,14 @@
25
30
  }
26
31
  }
27
32
 
28
- .admissionRequestCardRow {
29
- padding: layout.$spacing-05;
30
- margin: layout.$spacing-03;
31
- background-color: white;
33
+ .admissionRequestCardExtensionSlot {
34
+ display: none;
35
+
36
+ &:has(div:not(:empty)) {
37
+ display: block;
38
+ margin: layout.$spacing-03 0;
39
+ background-color: white;
40
+ }
32
41
  }
33
42
 
34
43
  .admissionEncounterDetails {
@@ -1,48 +1,70 @@
1
- import React from 'react';
1
+ import { useAppContext } from '@openmrs/esm-framework';
2
2
  import { screen } from '@testing-library/react';
3
- import { defineConfigSchema } from '@openmrs/esm-framework';
4
- import { useInpatientRequest } from '../../hooks/useInpatientRequest';
5
- import { configSchema } from '../../config-schema';
6
- import useWardLocation from '../../hooks/useWardLocation';
7
- import AdmissionRequestsWorkspace from './admission-requests.workspace';
8
- import { mockInpatientRequest, mockLocationInpatientWard } from '../../../../../__mocks__';
3
+ import React from 'react';
9
4
  import { renderWithSwr } from '../../../../../tools';
5
+ import { mockWardViewContext } from '../../../mock';
6
+ import useEmrConfiguration from '../../hooks/useEmrConfiguration';
7
+ import { type WardViewContext } from '../../types';
8
+ import DefaultWardPendingPatients from '../../ward-view/default-ward/default-ward-pending-patients.component';
9
+ import AdmissionRequestsWorkspace, { type AdmissionRequestsWorkspaceProps } from './admission-requests.workspace';
10
10
 
11
- defineConfigSchema('@openmrs/esm-ward-app', configSchema);
12
-
13
- jest.mock('../../hooks/useInpatientRequest', () => ({
14
- useInpatientRequest: jest.fn(),
15
- }));
16
- jest.mock('../../hooks/useWardLocation', () => jest.fn());
17
-
18
- const mockUseWardLocation = useWardLocation as jest.Mock;
19
- mockUseWardLocation.mockReturnValue({
20
- location: mockLocationInpatientWard,
21
- isLoadingLocation: false,
22
- errorFetchingLocation: null,
23
- invalidLocation: false,
24
- });
25
-
26
- const mockInpatientRequestResponse = {
27
- error: undefined,
28
- mutate: jest.fn(),
29
- isValidating: false,
30
- isLoading: false,
31
- inpatientRequests: [mockInpatientRequest],
32
- };
11
+ jest.mocked(useAppContext<WardViewContext>).mockReturnValue(mockWardViewContext);
33
12
 
34
- jest.mocked(useInpatientRequest).mockReturnValue(mockInpatientRequestResponse);
13
+ jest.mock('../../hooks/useEmrConfiguration', () => jest.fn());
14
+ const mockedUseEmrConfiguration = jest.mocked(useEmrConfiguration);
35
15
 
36
- const workspaceProps = {
16
+ const workspaceProps: AdmissionRequestsWorkspaceProps = {
37
17
  closeWorkspace: jest.fn(),
38
18
  promptBeforeClosing: jest.fn(),
39
19
  closeWorkspaceWithSavedChanges: jest.fn(),
40
20
  setTitle: jest.fn(),
21
+ wardPendingPatients: <DefaultWardPendingPatients />,
41
22
  };
42
23
 
43
24
  describe('Admission Requests Workspace', () => {
44
- it('should render a admission request card', () => {
25
+ beforeEach(() => {
26
+ mockedUseEmrConfiguration.mockReturnValue({
27
+ isLoadingEmrConfiguration: false,
28
+ errorFetchingEmrConfiguration: null,
29
+ // @ts-ignore - we only need these keys for now
30
+ emrConfiguration: {
31
+ admissionEncounterType: {
32
+ uuid: 'admission-encounter-type-uuid',
33
+ display: 'Admission Encounter',
34
+ },
35
+ transferWithinHospitalEncounterType: {
36
+ uuid: 'transfer-within-hospital-encounter-type-uuid',
37
+ display: 'Transfer Within Hospital Encounter Type',
38
+ },
39
+ clinicianEncounterRole: {
40
+ uuid: 'clinician-encounter-role-uuid',
41
+ },
42
+ },
43
+ mutateEmrConfiguration: jest.fn(),
44
+ });
45
+ });
46
+
47
+ it('should render an admission request card', () => {
48
+ renderWithSwr(<AdmissionRequestsWorkspace {...workspaceProps} />);
49
+ const alice = mockWardViewContext.wardPatientGroupDetails.inpatientRequestResponse.inpatientRequests[0].patient;
50
+ expect(screen.getByText(alice.person?.preferredName?.display as string)).toBeInTheDocument();
51
+ });
52
+
53
+ it('should render an admission request card with disabled "admit patient" button when emr config fails to load', () => {
54
+ mockedUseEmrConfiguration.mockReturnValue({
55
+ isLoadingEmrConfiguration: false,
56
+ errorFetchingEmrConfiguration: true,
57
+ emrConfiguration: null,
58
+ mutateEmrConfiguration: jest.fn(),
59
+ });
60
+
45
61
  renderWithSwr(<AdmissionRequestsWorkspace {...workspaceProps} />);
46
- expect(screen.getByText(mockInpatientRequest.patient.person?.preferredName?.display as string)).toBeInTheDocument();
62
+ expect(screen.getByText("Some parts of the form didn't load")).toBeInTheDocument();
63
+ expect(
64
+ screen.getByText(
65
+ 'Fetching EMR configuration failed. Try refreshing the page or contact your system administrator.',
66
+ ),
67
+ ).toBeInTheDocument();
68
+ expect(screen.getByRole('button', { name: /Admit patient/i })).toBeDisabled();
47
69
  });
48
70
  });
@@ -1,24 +1,24 @@
1
- import React from 'react';
2
- import styles from './admission-requests-workspace.scss';
3
- import AdmissionRequestCard from '../admission-request-card/admission-request-card.component';
4
- import { Search } from '@carbon/react';
5
- import { ErrorState } from '@openmrs/esm-framework';
1
+ import { InlineNotification, Search } from '@carbon/react';
2
+ import { type DefaultWorkspaceProps } from '@openmrs/esm-framework';
3
+ import React, { createContext, type ReactNode } from 'react';
6
4
  import { useTranslation } from 'react-i18next';
7
- import { useInpatientRequest } from '../../hooks/useInpatientRequest';
8
- import { type InpatientRequest } from '../../types';
5
+ import useEmrConfiguration from '../../hooks/useEmrConfiguration';
6
+ import styles from './admission-requests-workspace.scss';
7
+
8
+ export interface AdmissionRequestsWorkspaceProps extends DefaultWorkspaceProps {
9
+ wardPendingPatients: ReactNode;
10
+ }
9
11
 
10
- interface AdmissionRequestsWorkspaceProps {}
11
- const AdmissionRequestsWorkspace: React.FC<AdmissionRequestsWorkspaceProps> = () => {
12
- const {
13
- inpatientRequests,
14
- isLoading: isLoadingInpatientRequests,
15
- error: errorFetchingInpatientRequests,
16
- } = useInpatientRequest(['ADMIT', 'TRANSFER']);
12
+ export const AdmissionRequestsWorkspaceContext = createContext<AdmissionRequestsWorkspaceProps>(null);
13
+
14
+ const AdmissionRequestsWorkspace: React.FC<AdmissionRequestsWorkspaceProps> = (props) => {
15
+ const { wardPendingPatients } = props;
17
16
  const { t } = useTranslation();
18
17
  const [searchTerm, setSearchTerm] = React.useState('');
19
18
  const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {
20
19
  setSearchTerm(event.target.value);
21
20
  };
21
+ const { errorFetchingEmrConfiguration } = useEmrConfiguration();
22
22
 
23
23
  return (
24
24
  <div className={styles.admissionRequestsWorkspaceContainer}>
@@ -30,30 +30,23 @@ const AdmissionRequestsWorkspace: React.FC<AdmissionRequestsWorkspaceProps> = ()
30
30
  placeholder={t('searchForPatient', 'Search for a patient')}
31
31
  disabled
32
32
  />
33
-
34
- <div className={styles.content}>
35
- {isLoadingInpatientRequests ? (
36
- <>Loading</>
37
- ) : errorFetchingInpatientRequests ? (
38
- <ErrorState
39
- headerTitle={t('admissionRequests', 'Admission requests')}
40
- error={errorFetchingInpatientRequests}
33
+ {errorFetchingEmrConfiguration && (
34
+ <div className={styles.formError}>
35
+ <InlineNotification
36
+ kind="error"
37
+ title={t('somePartsOfTheFormDidntLoad', "Some parts of the form didn't load")}
38
+ subtitle={t(
39
+ 'fetchingEmrConfigurationFailed',
40
+ 'Fetching EMR configuration failed. Try refreshing the page or contact your system administrator.',
41
+ )}
42
+ lowContrast
43
+ hideCloseButton
41
44
  />
42
- ) : (
43
- <>
44
- {inpatientRequests.map((request: InpatientRequest, i) => (
45
- <AdmissionRequestCard
46
- key={`admission-request-card-${i}`}
47
- patient={request.patient}
48
- visit={request.visit}
49
- bed={null}
50
- inpatientRequest={request}
51
- inpatientAdmission={null}
52
- />
53
- ))}
54
- </>
55
- )}
56
- </div>
45
+ </div>
46
+ )}
47
+ <AdmissionRequestsWorkspaceContext.Provider value={props}>
48
+ <div className={styles.content}>{wardPendingPatients}</div>
49
+ </AdmissionRequestsWorkspaceContext.Provider>
57
50
  </div>
58
51
  );
59
52
  };