@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.
Files changed (356) hide show
  1. package/.turbo/turbo-build.log +25 -35
  2. package/README.md +38 -0
  3. package/dist/1119.js +1 -0
  4. package/dist/1197.js +1 -0
  5. package/dist/1663.js +1 -0
  6. package/dist/1663.js.map +1 -0
  7. package/dist/1741.js +1 -0
  8. package/dist/1741.js.map +1 -0
  9. package/dist/1776.js +1 -0
  10. package/dist/1776.js.map +1 -0
  11. package/dist/1879.js +1 -0
  12. package/dist/1879.js.map +1 -0
  13. package/dist/1899.js +1 -0
  14. package/dist/1899.js.map +1 -0
  15. package/dist/1917.js +1 -0
  16. package/dist/1917.js.map +1 -0
  17. package/dist/2146.js +1 -0
  18. package/dist/2372.js +1 -0
  19. package/dist/2372.js.map +1 -0
  20. package/dist/2470.js +1 -0
  21. package/dist/2470.js.map +1 -0
  22. package/dist/2537.js +1 -0
  23. package/dist/2537.js.map +1 -0
  24. package/dist/2557.js +1 -0
  25. package/dist/2557.js.map +1 -0
  26. package/dist/2690.js +1 -0
  27. package/dist/2728.js +2 -0
  28. package/dist/{372.js.LICENSE.txt → 2728.js.LICENSE.txt} +2 -2
  29. package/dist/2728.js.map +1 -0
  30. package/dist/2775.js +2 -0
  31. package/dist/2775.js.LICENSE.txt +59 -0
  32. package/dist/2775.js.map +1 -0
  33. package/dist/2913.js +2 -0
  34. package/dist/2913.js.map +1 -0
  35. package/dist/2932.js +1 -0
  36. package/dist/2932.js.map +1 -0
  37. package/dist/2948.js +1 -0
  38. package/dist/2948.js.map +1 -0
  39. package/dist/3099.js +1 -0
  40. package/dist/3161.js +2 -0
  41. package/dist/{649.js.LICENSE.txt → 3161.js.LICENSE.txt} +2 -2
  42. package/dist/3161.js.map +1 -0
  43. package/dist/3365.js +1 -0
  44. package/dist/3365.js.map +1 -0
  45. package/dist/3373.js +2 -0
  46. package/dist/3373.js.LICENSE.txt +5 -0
  47. package/dist/3373.js.map +1 -0
  48. package/dist/3399.js +1 -0
  49. package/dist/3399.js.map +1 -0
  50. package/dist/3413.js +1 -0
  51. package/dist/3413.js.map +1 -0
  52. package/dist/3423.js +1 -0
  53. package/dist/3423.js.map +1 -0
  54. package/dist/3584.js +1 -0
  55. package/dist/3737.js +1 -0
  56. package/dist/3737.js.map +1 -0
  57. package/dist/3982.js +1 -0
  58. package/dist/3982.js.map +1 -0
  59. package/dist/4041.js +2 -0
  60. package/dist/4041.js.map +1 -0
  61. package/dist/4055.js +1 -0
  62. package/dist/4132.js +1 -0
  63. package/dist/4300.js +1 -0
  64. package/dist/4335.js +1 -0
  65. package/dist/4430.js +2 -0
  66. package/dist/4430.js.LICENSE.txt +29 -0
  67. package/dist/4430.js.map +1 -0
  68. package/dist/4618.js +1 -0
  69. package/dist/465.js +1 -0
  70. package/dist/465.js.map +1 -0
  71. package/dist/4652.js +1 -0
  72. package/dist/4701.js +2 -0
  73. package/dist/4701.js.LICENSE.txt +9 -0
  74. package/dist/4701.js.map +1 -0
  75. package/dist/4743.js +2 -0
  76. package/dist/4743.js.LICENSE.txt +9 -0
  77. package/dist/4743.js.map +1 -0
  78. package/dist/4944.js +1 -0
  79. package/dist/5173.js +1 -0
  80. package/dist/5241.js +1 -0
  81. package/dist/5442.js +1 -0
  82. package/dist/5661.js +1 -0
  83. package/dist/6012.js +2 -0
  84. package/dist/6012.js.LICENSE.txt +5 -0
  85. package/dist/6012.js.map +1 -0
  86. package/dist/6022.js +1 -0
  87. package/dist/6468.js +1 -0
  88. package/dist/6679.js +1 -0
  89. package/dist/6840.js +1 -0
  90. package/dist/6859.js +1 -0
  91. package/dist/7097.js +1 -0
  92. package/dist/7159.js +1 -0
  93. package/dist/7179.js +2 -0
  94. package/dist/7179.js.LICENSE.txt +9 -0
  95. package/dist/7179.js.map +1 -0
  96. package/dist/723.js +1 -0
  97. package/dist/7232.js +2 -0
  98. package/dist/7232.js.LICENSE.txt +9 -0
  99. package/dist/7232.js.map +1 -0
  100. package/dist/7524.js +1 -0
  101. package/dist/7524.js.map +1 -0
  102. package/dist/7617.js +1 -0
  103. package/dist/7661.js +1 -0
  104. package/dist/7661.js.map +1 -0
  105. package/dist/7886.js +1 -0
  106. package/dist/7886.js.map +1 -0
  107. package/dist/795.js +1 -0
  108. package/dist/8163.js +1 -0
  109. package/dist/8205.js +1 -0
  110. package/dist/8205.js.map +1 -0
  111. package/dist/8317.js +2 -0
  112. package/dist/8317.js.LICENSE.txt +15 -0
  113. package/dist/8317.js.map +1 -0
  114. package/dist/8349.js +1 -0
  115. package/dist/8501.js +1 -0
  116. package/dist/8501.js.map +1 -0
  117. package/dist/8522.js +1 -0
  118. package/dist/8522.js.map +1 -0
  119. package/dist/8618.js +1 -0
  120. package/dist/8622.js +1 -0
  121. package/dist/8622.js.map +1 -0
  122. package/dist/89.js +1 -0
  123. package/dist/89.js.map +1 -0
  124. package/dist/890.js +1 -0
  125. package/dist/9045.js +1 -0
  126. package/dist/9045.js.map +1 -0
  127. package/dist/9117.js +1 -0
  128. package/dist/9117.js.map +1 -0
  129. package/dist/9214.js +1 -0
  130. package/dist/9538.js +1 -0
  131. package/dist/9569.js +1 -0
  132. package/dist/986.js +1 -0
  133. package/dist/9876.js +2 -0
  134. package/dist/9876.js.LICENSE.txt +9 -0
  135. package/dist/9876.js.map +1 -0
  136. package/dist/9879.js +1 -0
  137. package/dist/9880.js +1 -0
  138. package/dist/9880.js.map +1 -0
  139. package/dist/9895.js +1 -0
  140. package/dist/9900.js +1 -0
  141. package/dist/9913.js +1 -0
  142. package/dist/kenyaemr-esm-ward-app.js +1 -1
  143. package/dist/kenyaemr-esm-ward-app.js.buildmanifest.json +1479 -235
  144. package/dist/kenyaemr-esm-ward-app.js.map +1 -1
  145. package/dist/main.js +1 -1
  146. package/dist/main.js.LICENSE.txt +0 -35
  147. package/dist/main.js.map +1 -1
  148. package/dist/routes.json +1 -1
  149. package/mock.tsx +15 -2
  150. package/package.json +10 -5
  151. package/src/beds/{empty-bed-skeleton.tsx → empty-bed-skeleton.component.tsx} +2 -2
  152. package/src/config-schema.ts +48 -0
  153. package/src/declarations.d.ts +8 -0
  154. package/src/hooks/useAdmissionLocation.ts +24 -4
  155. package/src/hooks/useInpatientAdmission.ts +14 -10
  156. package/src/hooks/useInpatientAdmissionByPatients.ts +29 -0
  157. package/src/hooks/useInpatientRequest.ts +5 -1
  158. package/src/hooks/useInpatientRequestByPatients.ts +34 -0
  159. package/src/hooks/useIpdDischargeEncounter.ts +137 -0
  160. package/src/hooks/usePatientPendingOrders.ts +1 -1
  161. package/src/hooks/useRestPatient.ts +11 -3
  162. package/src/hooks/useSummaryMetrics.ts +103 -0
  163. package/src/hooks/useWardLocation.test.ts +1 -1
  164. package/src/hooks/useWardLocation.ts +18 -5
  165. package/src/hooks/useWardPatientGrouping.ts +63 -10
  166. package/src/index.ts +24 -4
  167. package/src/location-selector/location-selector.component.tsx +38 -5
  168. package/src/root.component.tsx +2 -2
  169. package/src/routes.json +60 -26
  170. package/src/types/index.ts +17 -6
  171. package/src/ward-patient-card/card-rows/admission-request-note-row.component.tsx +1 -1
  172. package/src/ward-patient-card/card-rows/coded-obs-tags-row.component.tsx +4 -4
  173. package/src/ward-patient-card/card-rows/mother-child-row.component.tsx +6 -6
  174. package/src/ward-patient-card/card-rows/pending-items-row.component.tsx +2 -3
  175. package/src/ward-patient-card/row-elements/{ward-patient-coded-obs-tags.tsx → ward-patient-coded-obs-tags.component.tsx} +5 -5
  176. package/src/ward-patient-card/row-elements/{ward-patient-header-address.tsx → ward-patient-header-address.component.tsx} +2 -2
  177. package/src/ward-patient-card/row-elements/{ward-patient-identifier.tsx → ward-patient-identifier.component.tsx} +7 -1
  178. package/src/ward-patient-card/row-elements/ward-patient-identifier.scss +3 -0
  179. package/src/ward-patient-card/row-elements/{ward-patient-obs.tsx → ward-patient-obs.component.tsx} +5 -5
  180. package/src/ward-patient-card/row-elements/{ward-patient-pending-transfer.tsx → ward-patient-pending-transfer.component.tsx} +3 -5
  181. package/src/ward-patient-card/row-elements/ward-patient-time-on-ward.component.tsx +73 -0
  182. package/src/ward-patient-card/row-elements/ward-patient-time-since-admission.component.tsx +29 -0
  183. package/src/ward-patient-card/ward-patient-card.component.tsx +5 -5
  184. package/src/ward-patient-card/ward-patient-card.scss +2 -6
  185. package/src/ward-patients/admitted-patients.tsx +218 -0
  186. package/src/ward-patients/awaiting-admission-patients.tsx +158 -0
  187. package/src/ward-patients/discharge-in-patients.tsx +183 -0
  188. package/src/ward-patients/discharge-patients.tsx +129 -0
  189. package/src/ward-patients/patient-cells.tsx +75 -0
  190. package/src/ward-patients/table-state-components.tsx +40 -0
  191. package/src/ward-patients/ward-patient.scss +24 -0
  192. package/src/ward-patients/ward-patients-table.tsx +38 -0
  193. package/src/ward-view/default-ward/default-ward-patient-card-header.component.tsx +8 -8
  194. package/src/ward-view/default-ward/default-ward-pending-patients.component.tsx +3 -3
  195. package/src/ward-view/default-ward/default-ward-view.component.tsx +33 -6
  196. package/src/ward-view/linelist-wards/Filters.tsx +25 -0
  197. package/src/ward-view/linelist-wards/Header.tsx +27 -0
  198. package/src/ward-view/linelist-wards/LineListTable.tsx +145 -0
  199. package/src/ward-view/linelist-wards/Metrics.tsx +21 -0
  200. package/src/ward-view/linelist-wards/WardPendingOutCell.tsx +15 -0
  201. package/src/ward-view/linelist-wards/WardsLineList.tsx +30 -0
  202. package/src/ward-view/linelist-wards/linelist-wards.scss +100 -0
  203. package/src/ward-view/materal-ward/maternal-ward-patient-card-header.component.tsx +8 -8
  204. package/src/ward-view/materal-ward/maternal-ward-patient-card.component.tsx +2 -2
  205. package/src/ward-view/materal-ward/maternal-ward-patient-card.test.tsx +1 -1
  206. package/src/ward-view/materal-ward/maternal-ward-pending-patients.component.tsx +1 -1
  207. package/src/ward-view/materal-ward/maternal-ward-view.component.tsx +4 -4
  208. package/src/ward-view/ward-view-content-wrapper.tsx +36 -0
  209. package/src/ward-view/ward-view.resource.ts +26 -8
  210. package/src/ward-view/ward-view.scss +15 -8
  211. package/src/ward-view/ward-view.test.tsx +8 -8
  212. package/src/ward-view/ward.component.tsx +2 -2
  213. package/src/ward-view-header/admission-requests-bar.component.tsx +18 -8
  214. package/src/ward-view-header/admission-requests-bar.test.tsx +3 -3
  215. package/src/ward-view-header/ward-metric.component.tsx +2 -3
  216. package/src/ward-workspace/admission-request-card/admission-request-card-actions.component.tsx +12 -14
  217. package/src/ward-workspace/admission-request-card/admission-request-card-header.component.tsx +5 -5
  218. package/src/ward-workspace/admission-request-card/admission-request-card.component.tsx +1 -1
  219. package/src/ward-workspace/admission-request-workspace/admission-requests-action-button.extension.tsx +18 -0
  220. package/src/ward-workspace/admission-request-workspace/admission-requests-context.ts +20 -0
  221. package/src/ward-workspace/admission-request-workspace/admission-requests-workspace.test.tsx +7 -6
  222. package/src/ward-workspace/admission-request-workspace/admission-requests.workspace.tsx +15 -25
  223. package/src/ward-workspace/admit-patient-button.component.tsx +41 -18
  224. package/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.test.tsx +14 -16
  225. package/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.workspace.tsx +2 -2
  226. package/src/ward-workspace/bed-selector.component.tsx +1 -1
  227. package/src/ward-workspace/cancel-admission-request-workspace/cancel-admission-request.test.tsx +1 -1
  228. package/src/ward-workspace/cancel-admission-request-workspace/cancel-admission-request.workspace.tsx +4 -6
  229. package/src/ward-workspace/create-admission-encounter/create-admission-encounter-action-button.extension.tsx +46 -0
  230. package/src/ward-workspace/create-admission-encounter/create-admission-encounter.test.tsx +241 -0
  231. package/src/ward-workspace/create-admission-encounter/create-admission-encounter.workspace.tsx +152 -0
  232. package/src/ward-workspace/kenya-emr-patient-discharge/discharge-workspace-siderail.component.tsx +23 -0
  233. package/src/ward-workspace/kenya-emr-patient-discharge/patient-discharge.resource.tsx +123 -0
  234. package/src/ward-workspace/kenya-emr-patient-discharge/patient-discharge.workspace.tsx +101 -0
  235. package/src/ward-workspace/patient-discharge/patient-discharge.workspace.tsx +6 -15
  236. package/src/ward-workspace/patient-transfer-bed-swap/{patient-transfer-request-form.component.tsx → patient-admit-or-transfer-request-form.component.tsx} +56 -37
  237. package/src/ward-workspace/patient-transfer-bed-swap/patient-bed-swap-form.component.tsx +13 -3
  238. package/src/ward-workspace/patient-transfer-bed-swap/patient-transfer-swap.workspace.tsx +11 -5
  239. package/src/ward-workspace/patient-transfer-request-workspace/patient-transfer-request.scss +5 -0
  240. package/src/ward-workspace/patient-transfer-request-workspace/patient-transfer-request.workspace.tsx +20 -6
  241. package/src/ward-workspace/ward-patient-notes/form/notes-form.component.tsx +2 -1
  242. package/src/ward-workspace/ward-patient-notes/history/note.component.tsx +3 -3
  243. package/src/ward.resource.ts +9 -3
  244. package/translations/am.json +123 -0
  245. package/translations/ar.json +123 -0
  246. package/translations/ar_SY.json +123 -0
  247. package/translations/bn.json +123 -0
  248. package/translations/de.json +123 -0
  249. package/translations/en.json +31 -3
  250. package/translations/en_US.json +123 -0
  251. package/translations/es.json +123 -0
  252. package/translations/es_MX.json +123 -0
  253. package/translations/fr.json +123 -0
  254. package/translations/he.json +123 -0
  255. package/translations/hi.json +123 -0
  256. package/translations/hi_IN.json +123 -0
  257. package/translations/id.json +123 -0
  258. package/translations/it.json +123 -0
  259. package/translations/ka.json +123 -0
  260. package/translations/km.json +123 -0
  261. package/translations/ku.json +123 -0
  262. package/translations/ky.json +123 -0
  263. package/translations/lg.json +123 -0
  264. package/translations/ne.json +123 -0
  265. package/translations/pl.json +123 -0
  266. package/translations/pt.json +123 -0
  267. package/translations/pt_BR.json +123 -0
  268. package/translations/qu.json +123 -0
  269. package/translations/ro_RO.json +123 -0
  270. package/translations/ru_RU.json +123 -0
  271. package/translations/si.json +123 -0
  272. package/translations/sw.json +123 -0
  273. package/translations/sw_KE.json +123 -0
  274. package/translations/tr.json +123 -0
  275. package/translations/tr_TR.json +123 -0
  276. package/translations/uk.json +123 -0
  277. package/translations/uz.json +123 -0
  278. package/translations/uz@Latn.json +123 -0
  279. package/translations/uz_UZ.json +123 -0
  280. package/translations/vi.json +123 -0
  281. package/translations/zh.json +123 -0
  282. package/translations/zh_CN.json +123 -0
  283. package/dist/109.js +0 -1
  284. package/dist/109.js.map +0 -1
  285. package/dist/124.js +0 -1
  286. package/dist/124.js.map +0 -1
  287. package/dist/125.js +0 -1
  288. package/dist/125.js.map +0 -1
  289. package/dist/126.js +0 -1
  290. package/dist/126.js.map +0 -1
  291. package/dist/130.js +0 -2
  292. package/dist/130.js.LICENSE.txt +0 -5
  293. package/dist/130.js.map +0 -1
  294. package/dist/146.js +0 -1
  295. package/dist/146.js.map +0 -1
  296. package/dist/15.js +0 -1
  297. package/dist/15.js.map +0 -1
  298. package/dist/325.js +0 -1
  299. package/dist/325.js.map +0 -1
  300. package/dist/348.js +0 -1
  301. package/dist/348.js.map +0 -1
  302. package/dist/362.js +0 -1
  303. package/dist/362.js.map +0 -1
  304. package/dist/372.js +0 -2
  305. package/dist/372.js.map +0 -1
  306. package/dist/443.js +0 -1
  307. package/dist/443.js.map +0 -1
  308. package/dist/471.js +0 -1
  309. package/dist/471.js.map +0 -1
  310. package/dist/481.js +0 -1
  311. package/dist/481.js.map +0 -1
  312. package/dist/53.js +0 -1
  313. package/dist/53.js.map +0 -1
  314. package/dist/559.js +0 -1
  315. package/dist/559.js.map +0 -1
  316. package/dist/574.js +0 -1
  317. package/dist/576.js +0 -1
  318. package/dist/576.js.map +0 -1
  319. package/dist/577.js +0 -1
  320. package/dist/577.js.map +0 -1
  321. package/dist/591.js +0 -2
  322. package/dist/591.js.map +0 -1
  323. package/dist/598.js +0 -1
  324. package/dist/598.js.map +0 -1
  325. package/dist/649.js +0 -2
  326. package/dist/649.js.map +0 -1
  327. package/dist/662.js +0 -1
  328. package/dist/662.js.map +0 -1
  329. package/dist/767.js +0 -1
  330. package/dist/767.js.map +0 -1
  331. package/dist/784.js +0 -2
  332. package/dist/784.js.map +0 -1
  333. package/dist/921.js +0 -1
  334. package/dist/921.js.map +0 -1
  335. package/dist/922.js +0 -1
  336. package/dist/922.js.map +0 -1
  337. package/dist/925.js +0 -2
  338. package/dist/925.js.LICENSE.txt +0 -40
  339. package/dist/925.js.map +0 -1
  340. package/dist/940.js +0 -1
  341. package/dist/940.js.map +0 -1
  342. package/dist/969.js +0 -1
  343. package/dist/969.js.map +0 -1
  344. package/dist/983.js +0 -1
  345. package/dist/983.js.map +0 -1
  346. package/package-lock.json +0 -5001
  347. package/src/ward-patient-card/row-elements/ward-patient-time-on-ward.tsx +0 -22
  348. package/src/ward-patient-card/row-elements/ward-patient-time-since-admission.tsx +0 -22
  349. /package/dist/{591.js.LICENSE.txt → 2913.js.LICENSE.txt} +0 -0
  350. /package/dist/{784.js.LICENSE.txt → 4041.js.LICENSE.txt} +0 -0
  351. /package/src/ward-patient-card/row-elements/{ward-patient-age.tsx → ward-patient-age.component.tsx} +0 -0
  352. /package/src/ward-patient-card/row-elements/{ward-patient-bed-number.tsx → ward-patient-bed-number.component.tsx} +0 -0
  353. /package/src/ward-patient-card/row-elements/{ward-patient-location.tsx → ward-patient-location.component.tsx} +0 -0
  354. /package/src/ward-patient-card/row-elements/{ward-patient-name.tsx → ward-patient-name.component.tsx} +0 -0
  355. /package/src/ward-patient-card/row-elements/{ward-patient-responsive-tooltip.tsx → ward-patient-responsive-tooltip.component.tsx} +0 -0
  356. /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 className={`${styles.admissionRequestsContainer} ${
35
- inpatientRequests?.length ? styles.blackBackground : styles.lightBlueBackground
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={() => launchWorkspace('admission-requests-workspace', { wardPendingPatients })}
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 { launchWorkspace, useAppContext } from '@openmrs/esm-framework';
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(launchWorkspace).toHaveBeenCalled();
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
- <span className={styles.metricName}>{metricName}</span>
13
+ <span className={styles.metricName}>{metricName}</span>
15
14
  {isLoading ? (
16
15
  <SkeletonPlaceholder className={styles.skeleton} />
17
16
  ) : (
@@ -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 type { WardPatientCardType, WardPatientWorkspaceProps, WardViewContext } from '../../types';
6
- import { useAdmitPatient } from '../../ward.resource';
7
- import { AdmissionRequestsWorkspaceContext } from '../admission-request-workspace/admission-requests.workspace';
8
- import AdmissionPatientButton from '../admit-patient-button.component';
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 = useCallback(() => {
15
+ const launchPatientTransferForm = () => {
17
16
  launchWorkspace<WardPatientWorkspaceProps>('patient-transfer-request-workspace', {
18
17
  wardPatient,
19
- WardPatientHeader,
20
18
  });
21
- }, [wardPatient, WardPatientHeader]);
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 { closeWorkspaceWithSavedChanges } = useContext(AdmissionRequestsWorkspaceContext);
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
- <AdmissionPatientButton
37
+ <AdmitPatientButton
41
38
  wardPatient={wardPatient}
39
+ dispositionType={wardPatient.inpatientRequest.dispositionType}
42
40
  onAdmitPatientSuccess={() => closeWorkspaceWithSavedChanges()}
43
41
  />
44
42
  </div>
@@ -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 WardPatientAge from '../../ward-patient-card/row-elements/ward-patient-age';
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, WardPatientCardType } from '../../types';
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
+ };
@@ -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 { renderWithSwr } from '../../../../../tools';
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 useEmrConfiguration from '../../hooks/useEmrConfiguration';
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, { type AdmissionRequestsWorkspaceProps } from './admission-requests.workspace';
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: AdmissionRequestsWorkspaceProps = {
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 { InlineNotification, Search } from '@carbon/react';
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
- export interface AdmissionRequestsWorkspaceProps extends DefaultWorkspaceProps {
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
- <AdmissionRequestsWorkspaceContext.Provider value={props}>
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
- </AdmissionRequestsWorkspaceContext.Provider>
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 AdmissionPatientButtonProps {
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 AdmissionPatientButton: React.FC<AdmissionPatientButtonProps> = ({ wardPatient, onAdmitPatientSuccess }) => {
22
- const { patient, inpatientRequest, bed } = wardPatient ?? {};
23
- const dispositionType = inpatientRequest?.dispositionType ?? 'ADMIT';
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 { WardPatientHeader, wardPatientGroupDetails } = useAppContext<WardViewContext>('ward-view-context') ?? {};
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, WardPatientHeader });
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 does not currently assigned a bed,
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
- kind="ghost"
73
- renderIcon={ArrowRightIcon}
74
- size={responsiveSize}
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 AdmissionPatientButton;
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 { screen } from '@testing-library/react';
10
- import userEvent from '@testing-library/user-event';
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 useWardLocation from '../../hooks/useWardLocation';
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: '{{patientName}} has been successfully admitted and assigned to bed bed3',
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) {
@@ -13,7 +13,7 @@ interface BedSelectorProps {
13
13
  currentPatient: Patient;
14
14
  selectedBedId: number;
15
15
  error: FieldError;
16
- onChange(bedId: number);
16
+ onChange(bedId: number): void;
17
17
  control: Control<{ bedId?: number }>;
18
18
  minBedCountToUseDropdown?: number;
19
19
  }
@@ -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();
@@ -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, useSession } from '@openmrs/esm-framework';
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;