@kenyaemr/esm-ward-app 8.1.2-pre.214 → 8.5.1-pre.13

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 (350) 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/1899.js +1 -0
  12. package/dist/1899.js.map +1 -0
  13. package/dist/2146.js +1 -0
  14. package/dist/2372.js +1 -0
  15. package/dist/2372.js.map +1 -0
  16. package/dist/2470.js +1 -0
  17. package/dist/2470.js.map +1 -0
  18. package/dist/2499.js +2 -0
  19. package/dist/{372.js.LICENSE.txt → 2499.js.LICENSE.txt} +2 -2
  20. package/dist/2499.js.map +1 -0
  21. package/dist/2537.js +1 -0
  22. package/dist/2537.js.map +1 -0
  23. package/dist/2557.js +1 -0
  24. package/dist/2557.js.map +1 -0
  25. package/dist/2690.js +1 -0
  26. package/dist/2728.js +2 -0
  27. package/dist/{649.js.LICENSE.txt → 2728.js.LICENSE.txt} +2 -2
  28. package/dist/2728.js.map +1 -0
  29. package/dist/2775.js +2 -0
  30. package/dist/2775.js.LICENSE.txt +59 -0
  31. package/dist/2775.js.map +1 -0
  32. package/dist/2904.js +2 -0
  33. package/dist/2904.js.LICENSE.txt +15 -0
  34. package/dist/2904.js.map +1 -0
  35. package/dist/2913.js +2 -0
  36. package/dist/2913.js.map +1 -0
  37. package/dist/2932.js +1 -0
  38. package/dist/2932.js.map +1 -0
  39. package/dist/2941.js +1 -0
  40. package/dist/2941.js.map +1 -0
  41. package/dist/2948.js +1 -0
  42. package/dist/2948.js.map +1 -0
  43. package/dist/3099.js +1 -0
  44. package/dist/3103.js +1 -0
  45. package/dist/3103.js.map +1 -0
  46. package/dist/3296.js +2 -0
  47. package/dist/3296.js.LICENSE.txt +9 -0
  48. package/dist/3296.js.map +1 -0
  49. package/dist/3365.js +1 -0
  50. package/dist/3365.js.map +1 -0
  51. package/dist/3373.js +2 -0
  52. package/dist/3373.js.LICENSE.txt +5 -0
  53. package/dist/3373.js.map +1 -0
  54. package/dist/3399.js +1 -0
  55. package/dist/3399.js.map +1 -0
  56. package/dist/3413.js +1 -0
  57. package/dist/3413.js.map +1 -0
  58. package/dist/3584.js +1 -0
  59. package/dist/3737.js +1 -0
  60. package/dist/3737.js.map +1 -0
  61. package/dist/3982.js +1 -0
  62. package/dist/3982.js.map +1 -0
  63. package/dist/4041.js +2 -0
  64. package/dist/4041.js.map +1 -0
  65. package/dist/4055.js +1 -0
  66. package/dist/4132.js +1 -0
  67. package/dist/4300.js +1 -0
  68. package/dist/4335.js +1 -0
  69. package/dist/4430.js +2 -0
  70. package/dist/4430.js.LICENSE.txt +29 -0
  71. package/dist/4430.js.map +1 -0
  72. package/dist/4618.js +1 -0
  73. package/dist/4652.js +1 -0
  74. package/dist/4701.js +2 -0
  75. package/dist/4701.js.LICENSE.txt +9 -0
  76. package/dist/4701.js.map +1 -0
  77. package/dist/4944.js +1 -0
  78. package/dist/5173.js +1 -0
  79. package/dist/5241.js +1 -0
  80. package/dist/5442.js +1 -0
  81. package/dist/559.js +1 -1
  82. package/dist/559.js.map +1 -1
  83. package/dist/5661.js +1 -0
  84. package/dist/6012.js +2 -0
  85. package/dist/6012.js.LICENSE.txt +5 -0
  86. package/dist/6012.js.map +1 -0
  87. package/dist/6022.js +1 -0
  88. package/dist/6468.js +1 -0
  89. package/dist/6679.js +1 -0
  90. package/dist/6840.js +1 -0
  91. package/dist/6859.js +1 -0
  92. package/dist/7097.js +1 -0
  93. package/dist/7159.js +1 -0
  94. package/dist/7179.js +2 -0
  95. package/dist/7179.js.LICENSE.txt +9 -0
  96. package/dist/7179.js.map +1 -0
  97. package/dist/723.js +1 -0
  98. package/dist/7232.js +2 -0
  99. package/dist/7232.js.LICENSE.txt +9 -0
  100. package/dist/7232.js.map +1 -0
  101. package/dist/7524.js +1 -0
  102. package/dist/7524.js.map +1 -0
  103. package/dist/7617.js +1 -0
  104. package/dist/7661.js +1 -0
  105. package/dist/7661.js.map +1 -0
  106. package/dist/7886.js +1 -0
  107. package/dist/7886.js.map +1 -0
  108. package/dist/795.js +1 -0
  109. package/dist/8163.js +1 -0
  110. package/dist/8205.js +1 -0
  111. package/dist/8205.js.map +1 -0
  112. package/dist/8349.js +1 -0
  113. package/dist/8501.js +1 -0
  114. package/dist/8501.js.map +1 -0
  115. package/dist/8522.js +1 -0
  116. package/dist/8522.js.map +1 -0
  117. package/dist/8618.js +1 -0
  118. package/dist/8622.js +1 -0
  119. package/dist/8622.js.map +1 -0
  120. package/dist/89.js +1 -0
  121. package/dist/89.js.map +1 -0
  122. package/dist/890.js +1 -0
  123. package/dist/9045.js +1 -0
  124. package/dist/9045.js.map +1 -0
  125. package/dist/9117.js +1 -0
  126. package/dist/9117.js.map +1 -0
  127. package/dist/9214.js +1 -0
  128. package/dist/9538.js +1 -0
  129. package/dist/9569.js +1 -0
  130. package/dist/986.js +1 -0
  131. package/dist/9876.js +2 -0
  132. package/dist/9876.js.LICENSE.txt +9 -0
  133. package/dist/9876.js.map +1 -0
  134. package/dist/9879.js +1 -0
  135. package/dist/9880.js +1 -0
  136. package/dist/9880.js.map +1 -0
  137. package/dist/9895.js +1 -0
  138. package/dist/9900.js +1 -0
  139. package/dist/9913.js +1 -0
  140. package/dist/kenyaemr-esm-ward-app.js +1 -1
  141. package/dist/kenyaemr-esm-ward-app.js.buildmanifest.json +1457 -237
  142. package/dist/kenyaemr-esm-ward-app.js.map +1 -1
  143. package/dist/main.js +1 -1
  144. package/dist/main.js.LICENSE.txt +0 -35
  145. package/dist/main.js.map +1 -1
  146. package/dist/routes.json +1 -1
  147. package/mock.tsx +15 -2
  148. package/package.json +10 -5
  149. package/src/beds/{empty-bed-skeleton.tsx → empty-bed-skeleton.component.tsx} +2 -2
  150. package/src/config-schema.ts +48 -0
  151. package/src/declarations.d.ts +8 -0
  152. package/src/hooks/useAdmissionLocation.ts +22 -1
  153. package/src/hooks/useInpatientAdmission.ts +12 -8
  154. package/src/hooks/useInpatientAdmissionByPatients.ts +29 -0
  155. package/src/hooks/useInpatientRequest.ts +3 -0
  156. package/src/hooks/useInpatientRequestByPatients.ts +34 -0
  157. package/src/hooks/useIpdDischargeEncounter.ts +137 -0
  158. package/src/hooks/usePatientPendingOrders.ts +1 -1
  159. package/src/hooks/useRestPatient.ts +11 -3
  160. package/src/hooks/useWardLocation.test.ts +1 -1
  161. package/src/hooks/useWardLocation.ts +15 -2
  162. package/src/hooks/useWardPatientGrouping.ts +60 -7
  163. package/src/index.ts +24 -4
  164. package/src/location-selector/location-selector.component.tsx +38 -5
  165. package/src/root.component.tsx +2 -2
  166. package/src/routes.json +60 -26
  167. package/src/types/index.ts +17 -6
  168. package/src/ward-patient-card/card-rows/admission-request-note-row.component.tsx +1 -1
  169. package/src/ward-patient-card/card-rows/coded-obs-tags-row.component.tsx +4 -4
  170. package/src/ward-patient-card/card-rows/mother-child-row.component.tsx +6 -6
  171. package/src/ward-patient-card/card-rows/pending-items-row.component.tsx +2 -3
  172. package/src/ward-patient-card/row-elements/{ward-patient-coded-obs-tags.tsx → ward-patient-coded-obs-tags.component.tsx} +5 -5
  173. package/src/ward-patient-card/row-elements/{ward-patient-header-address.tsx → ward-patient-header-address.component.tsx} +2 -2
  174. package/src/ward-patient-card/row-elements/{ward-patient-identifier.tsx → ward-patient-identifier.component.tsx} +7 -1
  175. package/src/ward-patient-card/row-elements/ward-patient-identifier.scss +3 -0
  176. package/src/ward-patient-card/row-elements/{ward-patient-obs.tsx → ward-patient-obs.component.tsx} +5 -5
  177. package/src/ward-patient-card/row-elements/{ward-patient-pending-transfer.tsx → ward-patient-pending-transfer.component.tsx} +3 -5
  178. package/src/ward-patient-card/row-elements/ward-patient-time-on-ward.component.tsx +73 -0
  179. package/src/ward-patient-card/row-elements/ward-patient-time-since-admission.component.tsx +29 -0
  180. package/src/ward-patient-card/ward-patient-card.component.tsx +5 -5
  181. package/src/ward-patient-card/ward-patient-card.scss +2 -6
  182. package/src/ward-patients/admitted-patients.tsx +218 -0
  183. package/src/ward-patients/awaiting-admission-patients.tsx +158 -0
  184. package/src/ward-patients/discharge-in-patients.tsx +183 -0
  185. package/src/ward-patients/discharge-patients.tsx +129 -0
  186. package/src/ward-patients/patient-cells.tsx +75 -0
  187. package/src/ward-patients/table-state-components.tsx +40 -0
  188. package/src/ward-patients/ward-patient.scss +24 -0
  189. package/src/ward-patients/ward-patients-table.tsx +38 -0
  190. package/src/ward-view/default-ward/default-ward-patient-card-header.component.tsx +8 -8
  191. package/src/ward-view/default-ward/default-ward-pending-patients.component.tsx +3 -3
  192. package/src/ward-view/default-ward/default-ward-view.component.tsx +31 -6
  193. package/src/ward-view/linelist-wards/Filters.tsx +25 -0
  194. package/src/ward-view/linelist-wards/Header.tsx +27 -0
  195. package/src/ward-view/linelist-wards/LineListTable.tsx +147 -0
  196. package/src/ward-view/linelist-wards/Metrics.tsx +21 -0
  197. package/src/ward-view/linelist-wards/WardsLineList.tsx +29 -0
  198. package/src/ward-view/linelist-wards/linelist-wards.scss +100 -0
  199. package/src/ward-view/materal-ward/maternal-ward-patient-card-header.component.tsx +8 -8
  200. package/src/ward-view/materal-ward/maternal-ward-patient-card.component.tsx +2 -2
  201. package/src/ward-view/materal-ward/maternal-ward-patient-card.test.tsx +1 -1
  202. package/src/ward-view/materal-ward/maternal-ward-pending-patients.component.tsx +1 -1
  203. package/src/ward-view/materal-ward/maternal-ward-view.component.tsx +4 -4
  204. package/src/ward-view/ward-view-content-wrapper.tsx +36 -0
  205. package/src/ward-view/ward-view.resource.ts +26 -8
  206. package/src/ward-view/ward-view.scss +15 -8
  207. package/src/ward-view/ward-view.test.tsx +8 -8
  208. package/src/ward-view/ward.component.tsx +2 -2
  209. package/src/ward-view-header/admission-requests-bar.component.tsx +18 -8
  210. package/src/ward-view-header/admission-requests-bar.test.tsx +3 -3
  211. package/src/ward-view-header/ward-metric.component.tsx +2 -3
  212. package/src/ward-workspace/admission-request-card/admission-request-card-actions.component.tsx +12 -14
  213. package/src/ward-workspace/admission-request-card/admission-request-card-header.component.tsx +5 -5
  214. package/src/ward-workspace/admission-request-card/admission-request-card.component.tsx +1 -1
  215. package/src/ward-workspace/admission-request-workspace/admission-requests-action-button.extension.tsx +18 -0
  216. package/src/ward-workspace/admission-request-workspace/admission-requests-context.ts +20 -0
  217. package/src/ward-workspace/admission-request-workspace/admission-requests-workspace.test.tsx +7 -6
  218. package/src/ward-workspace/admission-request-workspace/admission-requests.workspace.tsx +15 -25
  219. package/src/ward-workspace/admit-patient-button.component.tsx +41 -18
  220. package/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.test.tsx +14 -16
  221. package/src/ward-workspace/admit-patient-form-workspace/admit-patient-form.workspace.tsx +2 -2
  222. package/src/ward-workspace/bed-selector.component.tsx +1 -1
  223. package/src/ward-workspace/cancel-admission-request-workspace/cancel-admission-request.test.tsx +1 -1
  224. package/src/ward-workspace/cancel-admission-request-workspace/cancel-admission-request.workspace.tsx +4 -6
  225. package/src/ward-workspace/create-admission-encounter/create-admission-encounter-action-button.extension.tsx +46 -0
  226. package/src/ward-workspace/create-admission-encounter/create-admission-encounter.test.tsx +241 -0
  227. package/src/ward-workspace/create-admission-encounter/create-admission-encounter.workspace.tsx +152 -0
  228. package/src/ward-workspace/kenya-emr-patient-discharge/discharge-workspace-siderail.component.tsx +23 -0
  229. package/src/ward-workspace/kenya-emr-patient-discharge/patient-discharge.resource.tsx +123 -0
  230. package/src/ward-workspace/kenya-emr-patient-discharge/patient-discharge.workspace.tsx +101 -0
  231. package/src/ward-workspace/patient-discharge/patient-discharge.workspace.tsx +6 -15
  232. package/src/ward-workspace/patient-transfer-bed-swap/{patient-transfer-request-form.component.tsx → patient-admit-or-transfer-request-form.component.tsx} +56 -37
  233. package/src/ward-workspace/patient-transfer-bed-swap/patient-bed-swap-form.component.tsx +13 -3
  234. package/src/ward-workspace/patient-transfer-bed-swap/patient-transfer-swap.workspace.tsx +11 -5
  235. package/src/ward-workspace/patient-transfer-request-workspace/patient-transfer-request.scss +5 -0
  236. package/src/ward-workspace/patient-transfer-request-workspace/patient-transfer-request.workspace.tsx +20 -6
  237. package/src/ward-workspace/ward-patient-notes/form/notes-form.component.tsx +2 -1
  238. package/src/ward-workspace/ward-patient-notes/history/note.component.tsx +3 -3
  239. package/src/ward.resource.ts +9 -3
  240. package/translations/am.json +123 -0
  241. package/translations/ar.json +123 -0
  242. package/translations/ar_SY.json +123 -0
  243. package/translations/bn.json +123 -0
  244. package/translations/de.json +123 -0
  245. package/translations/en.json +31 -3
  246. package/translations/en_US.json +123 -0
  247. package/translations/es.json +123 -0
  248. package/translations/es_MX.json +123 -0
  249. package/translations/fr.json +123 -0
  250. package/translations/he.json +123 -0
  251. package/translations/hi.json +123 -0
  252. package/translations/hi_IN.json +123 -0
  253. package/translations/id.json +123 -0
  254. package/translations/it.json +123 -0
  255. package/translations/ka.json +123 -0
  256. package/translations/km.json +123 -0
  257. package/translations/ku.json +123 -0
  258. package/translations/ky.json +123 -0
  259. package/translations/lg.json +123 -0
  260. package/translations/ne.json +123 -0
  261. package/translations/pl.json +123 -0
  262. package/translations/pt.json +123 -0
  263. package/translations/pt_BR.json +123 -0
  264. package/translations/qu.json +123 -0
  265. package/translations/ro_RO.json +123 -0
  266. package/translations/ru_RU.json +123 -0
  267. package/translations/si.json +123 -0
  268. package/translations/sw.json +123 -0
  269. package/translations/sw_KE.json +123 -0
  270. package/translations/tr.json +123 -0
  271. package/translations/tr_TR.json +123 -0
  272. package/translations/uk.json +123 -0
  273. package/translations/uz.json +123 -0
  274. package/translations/uz@Latn.json +123 -0
  275. package/translations/uz_UZ.json +123 -0
  276. package/translations/vi.json +123 -0
  277. package/translations/zh.json +123 -0
  278. package/translations/zh_CN.json +123 -0
  279. package/dist/109.js +0 -1
  280. package/dist/109.js.map +0 -1
  281. package/dist/124.js +0 -1
  282. package/dist/124.js.map +0 -1
  283. package/dist/125.js +0 -1
  284. package/dist/125.js.map +0 -1
  285. package/dist/126.js +0 -1
  286. package/dist/126.js.map +0 -1
  287. package/dist/130.js +0 -2
  288. package/dist/130.js.LICENSE.txt +0 -5
  289. package/dist/130.js.map +0 -1
  290. package/dist/146.js +0 -1
  291. package/dist/146.js.map +0 -1
  292. package/dist/15.js +0 -1
  293. package/dist/15.js.map +0 -1
  294. package/dist/325.js +0 -1
  295. package/dist/325.js.map +0 -1
  296. package/dist/348.js +0 -1
  297. package/dist/348.js.map +0 -1
  298. package/dist/362.js +0 -1
  299. package/dist/362.js.map +0 -1
  300. package/dist/372.js +0 -2
  301. package/dist/372.js.map +0 -1
  302. package/dist/443.js +0 -1
  303. package/dist/443.js.map +0 -1
  304. package/dist/471.js +0 -1
  305. package/dist/471.js.map +0 -1
  306. package/dist/481.js +0 -1
  307. package/dist/481.js.map +0 -1
  308. package/dist/53.js +0 -1
  309. package/dist/53.js.map +0 -1
  310. package/dist/574.js +0 -1
  311. package/dist/576.js +0 -1
  312. package/dist/576.js.map +0 -1
  313. package/dist/577.js +0 -1
  314. package/dist/577.js.map +0 -1
  315. package/dist/591.js +0 -2
  316. package/dist/591.js.map +0 -1
  317. package/dist/598.js +0 -1
  318. package/dist/598.js.map +0 -1
  319. package/dist/649.js +0 -2
  320. package/dist/649.js.map +0 -1
  321. package/dist/662.js +0 -1
  322. package/dist/662.js.map +0 -1
  323. package/dist/767.js +0 -1
  324. package/dist/767.js.map +0 -1
  325. package/dist/784.js +0 -2
  326. package/dist/784.js.map +0 -1
  327. package/dist/921.js +0 -1
  328. package/dist/921.js.map +0 -1
  329. package/dist/922.js +0 -1
  330. package/dist/922.js.map +0 -1
  331. package/dist/925.js +0 -2
  332. package/dist/925.js.LICENSE.txt +0 -40
  333. package/dist/925.js.map +0 -1
  334. package/dist/940.js +0 -1
  335. package/dist/940.js.map +0 -1
  336. package/dist/969.js +0 -1
  337. package/dist/969.js.map +0 -1
  338. package/dist/983.js +0 -1
  339. package/dist/983.js.map +0 -1
  340. package/package-lock.json +0 -5001
  341. package/src/ward-patient-card/row-elements/ward-patient-time-on-ward.tsx +0 -22
  342. package/src/ward-patient-card/row-elements/ward-patient-time-since-admission.tsx +0 -22
  343. /package/dist/{591.js.LICENSE.txt → 2913.js.LICENSE.txt} +0 -0
  344. /package/dist/{784.js.LICENSE.txt → 4041.js.LICENSE.txt} +0 -0
  345. /package/src/ward-patient-card/row-elements/{ward-patient-age.tsx → ward-patient-age.component.tsx} +0 -0
  346. /package/src/ward-patient-card/row-elements/{ward-patient-bed-number.tsx → ward-patient-bed-number.component.tsx} +0 -0
  347. /package/src/ward-patient-card/row-elements/{ward-patient-location.tsx → ward-patient-location.component.tsx} +0 -0
  348. /package/src/ward-patient-card/row-elements/{ward-patient-name.tsx → ward-patient-name.component.tsx} +0 -0
  349. /package/src/ward-patient-card/row-elements/{ward-patient-responsive-tooltip.tsx → ward-patient-responsive-tooltip.component.tsx} +0 -0
  350. /package/src/ward-patient-card/row-elements/{ward-patient-skeleton-text.tsx → ward-patient-skeleton-text.component.tsx} +0 -0
@@ -0,0 +1,129 @@
1
+ import {
2
+ DataTable,
3
+ DataTableSkeleton,
4
+ OverflowMenu,
5
+ OverflowMenuItem,
6
+ Table,
7
+ TableBody,
8
+ TableCell,
9
+ TableContainer,
10
+ TableHead,
11
+ TableHeader,
12
+ TableRow,
13
+ Pagination,
14
+ } from '@carbon/react';
15
+ import React, { useMemo } from 'react';
16
+ import { useTranslation } from 'react-i18next';
17
+ import { EmptyState, ErrorState } from './table-state-components';
18
+ import { useIpdDischargeEncounter } from '../hooks/useIpdDischargeEncounter';
19
+ import { formatDatetime, parseDate } from '@openmrs/esm-framework';
20
+ import { PatientAdmissionDateCell, PatientAgeCell, PatientDayInWardCell, PatientGenderCell } from './patient-cells';
21
+
22
+ const DischargePatients = () => {
23
+ const { t } = useTranslation();
24
+ const {
25
+ encounters,
26
+ error,
27
+ isLoading,
28
+ paginated,
29
+ currentPage,
30
+ pageSizes,
31
+ goTo,
32
+ currPageSize,
33
+ setCurrPageSize,
34
+ totalCount,
35
+ } = useIpdDischargeEncounter();
36
+ const headers = [
37
+ { key: 'admissionDate', header: t('admissionDate', 'Admission Date') },
38
+ { key: 'dischargeDate', header: t('dischargeDate', 'Discharge Date') },
39
+ { key: 'idNumber', header: t('idNumber', 'ID Number') },
40
+ { key: 'name', header: t('name', 'Name') },
41
+ { key: 'gender', header: t('gender', 'Gender') },
42
+ { key: 'age', header: t('age', 'Age') },
43
+ { key: 'bedNumber', header: t('bedNumber', 'Bed Number') },
44
+ { key: 'daysAdmitted', header: t('durationOnWard', 'Duration on Ward') },
45
+ { key: 'action', header: t('action', 'Action') },
46
+ ];
47
+ const tableRows = useMemo(() => {
48
+ return encounters.map((encounter, index) => {
49
+ return {
50
+ id: encounter.uuid,
51
+ dischargeDate: encounter.encounterDateTime ? formatDatetime(parseDate(encounter.encounterDateTime)) : '--',
52
+ admissionDate: <PatientAdmissionDateCell patientUuid={encounter.patient.uuid} encounterUuid={encounter.uuid} />,
53
+ idNumber: encounter.patient.openmrsId,
54
+ name: encounter.patient.name,
55
+ gender: <PatientGenderCell patientUuid={encounter.patient.uuid} />,
56
+ age: <PatientAgeCell patientUuid={encounter.patient.uuid} />,
57
+ bedNumber: '--',
58
+ daysAdmitted: <PatientDayInWardCell patientUuid={encounter.patient.uuid} encounterUuid={encounter.uuid} />,
59
+ action: (
60
+ <OverflowMenu size={'sm'} flipped>
61
+ <OverflowMenuItem itemText={t('dischargeSummary', 'Discharge Summary')} onClick={() => {}} />
62
+ <OverflowMenuItem itemText={t('gatePass', 'Gate Pass')} onClick={() => {}} />
63
+ </OverflowMenu>
64
+ ),
65
+ };
66
+ });
67
+ }, [encounters, t]);
68
+
69
+ if (isLoading) return <DataTableSkeleton />;
70
+ if (error) return <ErrorState error={error} />;
71
+
72
+ if (!encounters?.length) return <EmptyState message={t('noDischargepatients', 'No Discharge patients')} />;
73
+
74
+ return (
75
+ <DataTable rows={tableRows} headers={headers} isSortable useZebraStyles>
76
+ {({ rows, headers, getHeaderProps, getRowProps, getTableProps, getCellProps }) => (
77
+ <TableContainer>
78
+ <Table {...getTableProps()} aria-label="sample table">
79
+ <TableHead>
80
+ <TableRow>
81
+ {headers.map((header) => (
82
+ <TableHeader
83
+ key={header.key}
84
+ {...getHeaderProps({
85
+ header,
86
+ })}>
87
+ {header.header}
88
+ </TableHeader>
89
+ ))}
90
+ </TableRow>
91
+ </TableHead>
92
+ <TableBody>
93
+ {rows.map((row) => {
94
+ return (
95
+ <TableRow key={row.id} {...getRowProps({ row })}>
96
+ {row.cells.map((cell) => (
97
+ <TableCell key={cell.id} {...getCellProps({ cell })}>
98
+ {cell.value}
99
+ </TableCell>
100
+ ))}
101
+ </TableRow>
102
+ );
103
+ })}
104
+ </TableBody>
105
+ </Table>
106
+ {paginated && !isLoading && (
107
+ <Pagination
108
+ forwardText=""
109
+ backwardText=""
110
+ page={currentPage}
111
+ pageSize={currPageSize}
112
+ pageSizes={pageSizes}
113
+ totalItems={totalCount}
114
+ size={'sm'}
115
+ onChange={({ page: newPage, pageSize }) => {
116
+ if (newPage !== currentPage) {
117
+ goTo(newPage);
118
+ }
119
+ setCurrPageSize(pageSize);
120
+ }}
121
+ />
122
+ )}
123
+ </TableContainer>
124
+ )}
125
+ </DataTable>
126
+ );
127
+ };
128
+
129
+ export default DischargePatients;
@@ -0,0 +1,75 @@
1
+ import { InlineLoading } from '@carbon/react';
2
+ import { formatDatetime, parseDate, useConfig, usePatient } from '@openmrs/esm-framework';
3
+ import dayjs from 'dayjs';
4
+ import React, { type FC, useMemo } from 'react';
5
+ import { useEncounterDetails } from '../hooks/useIpdDischargeEncounter';
6
+ import { type WardConfigObject } from '../config-schema';
7
+
8
+ type CellProps = {
9
+ patientUuid: string;
10
+ };
11
+
12
+ export const PatientAgeCell: FC<CellProps> = ({ patientUuid }) => {
13
+ const { isLoading, patient, error } = usePatient(patientUuid);
14
+ const age = useMemo(() => {
15
+ if (!patient?.birthDate) return '--';
16
+ return dayjs().diff(dayjs(patient.birthDate), 'years');
17
+ }, [patient?.birthDate]);
18
+ if (isLoading) return <InlineLoading />;
19
+ if (error) return <p>--</p>;
20
+ return <div>{age}</div>;
21
+ };
22
+
23
+ export const PatientGenderCell: FC<CellProps> = ({ patientUuid }) => {
24
+ const { isLoading, patient, error } = usePatient(patientUuid);
25
+
26
+ if (isLoading) return <InlineLoading />;
27
+ if (error) return <p>--</p>;
28
+ return <div>{patient.gender}</div>;
29
+ };
30
+
31
+ type PatientAdmissionCellProps = CellProps & {
32
+ encounterUuid: string;
33
+ };
34
+
35
+ export const PatientAdmissionDateCell: FC<PatientAdmissionCellProps> = ({ encounterUuid }) => {
36
+ const { encounter, error, isLoading } = useEncounterDetails(encounterUuid);
37
+ const { admissionEncounterTypeUuid } = useConfig<WardConfigObject>();
38
+
39
+ const admissionDate = useMemo(() => {
40
+ const admisionEncounter = encounter?.visit?.encounters?.find(
41
+ (e) => e.encounterType.uuid === admissionEncounterTypeUuid,
42
+ );
43
+ if (!admisionEncounter || !admisionEncounter.encounterDatetime) return '--';
44
+ return formatDatetime(parseDate(admisionEncounter.encounterDatetime));
45
+ }, [encounter, admissionEncounterTypeUuid]);
46
+ if (isLoading) return <InlineLoading />;
47
+ if (error) return <p>--</p>;
48
+
49
+ return <p>{admissionDate}</p>;
50
+ };
51
+
52
+ export const PatientDayInWardCell: FC<PatientAdmissionCellProps> = ({ encounterUuid }) => {
53
+ const { encounter, error, isLoading } = useEncounterDetails(encounterUuid);
54
+ const { admissionEncounterTypeUuid } = useConfig<WardConfigObject>();
55
+ const daysInWard = useMemo(() => {
56
+ const admisionEncounter = encounter?.visit?.encounters?.find(
57
+ (e) => e.encounterType.uuid === admissionEncounterTypeUuid,
58
+ );
59
+ if (!admisionEncounter || !admisionEncounter.encounterDatetime) return '--';
60
+ const dischargeEncounter = encounter?.visit?.encounters?.find((e) => e.uuid === encounterUuid);
61
+ if (!dischargeEncounter || !dischargeEncounter.encounterDatetime) return '--';
62
+
63
+ const admissionDate = dayjs(admisionEncounter.encounterDatetime).startOf('day');
64
+ const dischargeDate = dischargeEncounter.encounterDatetime
65
+ ? dayjs(dischargeEncounter.encounterDatetime).startOf('day')
66
+ : dayjs().startOf('day');
67
+ const daysAdmitted =
68
+ admissionDate.isValid() && dischargeDate.isValid() ? Math.abs(dischargeDate.diff(admissionDate, 'days')) : '--';
69
+ return daysAdmitted;
70
+ }, [encounter, encounterUuid, admissionEncounterTypeUuid]);
71
+ if (isLoading) return <InlineLoading />;
72
+ if (error) return <p>--</p>;
73
+
74
+ return <p>{daysInWard}</p>;
75
+ };
@@ -0,0 +1,40 @@
1
+ // Desclaimer: not using openmrs provided (EmptyState,ErrorState) to avoid repeated header titles and customize the message since provided ones are contexted to patient chart
2
+
3
+ import { Tile } from '@carbon/react';
4
+ import { EmptyDataIllustration } from '@openmrs/esm-patient-common-lib';
5
+ import React, { type FC } from 'react';
6
+ import styles from './ward-patient.scss';
7
+ import { useTranslation } from 'react-i18next';
8
+ type EmptyStateProps = {
9
+ message?: string;
10
+ };
11
+
12
+ export const EmptyState: FC<EmptyStateProps> = ({ message }) => {
13
+ return (
14
+ <Tile className={styles.empty}>
15
+ <EmptyDataIllustration />
16
+ <p>{message}</p>
17
+ </Tile>
18
+ );
19
+ };
20
+ type ErrorStateProps = {
21
+ error?: Error;
22
+ };
23
+
24
+ export const ErrorState: FC<ErrorStateProps> = ({ error }) => {
25
+ const { t } = useTranslation();
26
+ return (
27
+ <Tile className={styles.error}>
28
+ <strong>
29
+ {t('error', 'Error')} {`${(error as any)?.response?.status}: `}
30
+ {(error as any)?.response?.statusText}
31
+ </strong>
32
+ <p>
33
+ {t(
34
+ 'errorCopy',
35
+ 'Sorry, there was a problem displaying this information. You can try to reload this page, or contact the site administrator and quote the error code above.',
36
+ )}
37
+ </p>{' '}
38
+ </Tile>
39
+ );
40
+ };
@@ -0,0 +1,24 @@
1
+ @use '@carbon/layout';
2
+ @use '@openmrs/esm-styleguide/src/vars' as *;
3
+ @use '@carbon/colors';
4
+
5
+ .empty {
6
+ justify-content: center;
7
+ align-items: center;
8
+ gap: layout.$spacing-03;
9
+ display: flex;
10
+ flex: 1;
11
+ flex-direction: column;
12
+ color: $text-02;
13
+ height: 200px;
14
+ }
15
+
16
+ .error {
17
+ justify-content: center;
18
+ align-items: center;
19
+ gap: layout.$spacing-03;
20
+ display: flex;
21
+ flex: 1;
22
+ flex-direction: column;
23
+ height: 200px;
24
+ }
@@ -0,0 +1,38 @@
1
+ import { Tab, TabList, TabPanel, TabPanels, Tabs } from '@carbon/react';
2
+ import React from 'react';
3
+ import { useTranslation } from 'react-i18next';
4
+ import AdmittedPatients from './admitted-patients';
5
+ import AwaitingAdmissionPatients from './awaiting-admission-patients';
6
+ import DischargeInPatients from './discharge-in-patients';
7
+ import DischargePatients from './discharge-patients';
8
+
9
+ const WardPatientsTable = () => {
10
+ const { t } = useTranslation();
11
+
12
+ return (
13
+ <Tabs onTabCloseRequest={() => {}}>
14
+ <TabList scrollDebounceWait={200}>
15
+ <Tab>{t('awaitingAdmision', 'Awaiting Admission')}</Tab>
16
+ <Tab>{t('admitted', 'Admitted')}</Tab>
17
+ <Tab>{t('dischargeIn', 'Discharge In')}</Tab>
18
+ <Tab>{t('discharge', 'Discharge')}</Tab>
19
+ </TabList>
20
+ <TabPanels>
21
+ <TabPanel>
22
+ <AwaitingAdmissionPatients />
23
+ </TabPanel>
24
+ <TabPanel>
25
+ <AdmittedPatients />
26
+ </TabPanel>
27
+ <TabPanel>
28
+ <DischargeInPatients />
29
+ </TabPanel>
30
+ <TabPanel>
31
+ <DischargePatients />
32
+ </TabPanel>
33
+ </TabPanels>
34
+ </Tabs>
35
+ );
36
+ };
37
+
38
+ export default WardPatientsTable;
@@ -1,14 +1,14 @@
1
- import classNames from 'classnames';
2
1
  import React from 'react';
3
- import WardPatientAge from '../../ward-patient-card/row-elements/ward-patient-age';
4
- import WardPatientBedNumber from '../../ward-patient-card/row-elements/ward-patient-bed-number';
5
- import WardPatientIdentifier from '../../ward-patient-card/row-elements/ward-patient-identifier';
6
- import WardPatientName from '../../ward-patient-card/row-elements/ward-patient-name';
7
- import WardPatientTimeOnWard from '../../ward-patient-card/row-elements/ward-patient-time-on-ward';
8
- import WardPatientTimeSinceAdmission from '../../ward-patient-card/row-elements/ward-patient-time-since-admission';
9
- import styles from '../../ward-patient-card/ward-patient-card.scss';
10
2
  import { type WardPatientCardType } from '../../types';
3
+ import classNames from 'classnames';
4
+ import WardPatientAge from '../../ward-patient-card/row-elements/ward-patient-age.component';
5
+ import WardPatientBedNumber from '../../ward-patient-card/row-elements/ward-patient-bed-number.component';
6
+ import WardPatientIdentifier from '../../ward-patient-card/row-elements/ward-patient-identifier.component';
7
+ import WardPatientName from '../../ward-patient-card/row-elements/ward-patient-name.component';
8
+ import WardPatientTimeOnWard from '../../ward-patient-card/row-elements/ward-patient-time-on-ward.component';
9
+ import WardPatientTimeSinceAdmission from '../../ward-patient-card/row-elements/ward-patient-time-since-admission.component';
11
10
  import WardPatientGender from '../../ward-patient-card/row-elements/ward-patient-gender.component';
11
+ import styles from '../../ward-patient-card/ward-patient-card.scss';
12
12
 
13
13
  const DefaultWardPatientCardHeader: WardPatientCardType = ({ wardPatient }) => {
14
14
  const { patient, bed, inpatientAdmission } = wardPatient;
@@ -1,10 +1,10 @@
1
- import { ErrorState, useAppContext } from '@openmrs/esm-framework';
2
1
  import React from 'react';
2
+ import { ErrorState, useAppContext } from '@openmrs/esm-framework';
3
3
  import { useTranslation } from 'react-i18next';
4
- import { type WardViewContext, type InpatientRequest } from '../../types';
4
+ import { type InpatientRequest, type WardViewContext } from '../../types';
5
5
  import AdmissionRequestCard from '../../ward-workspace/admission-request-card/admission-request-card.component';
6
- import WardPatientSkeletonText from '../../ward-patient-card/row-elements/ward-patient-skeleton-text';
7
6
  import AdmissionRequestNoteRow from '../../ward-patient-card/card-rows/admission-request-note-row.component';
7
+ import WardPatientSkeletonText from '../../ward-patient-card/row-elements/ward-patient-skeleton-text.component';
8
8
 
9
9
  function DefaultWardPendingPatients() {
10
10
  const { wardPatientGroupDetails } = useAppContext<WardViewContext>('ward-view-context') ?? {};
@@ -1,19 +1,38 @@
1
1
  import { useDefineAppContext } from '@openmrs/esm-framework';
2
- import React from 'react';
2
+ import React, { useMemo } from 'react';
3
+ import { useTranslation } from 'react-i18next';
4
+ import useWardLocation from '../../hooks/useWardLocation';
3
5
  import { useWardPatientGrouping } from '../../hooks/useWardPatientGrouping';
4
6
  import { type WardViewContext } from '../../types';
5
- import WardViewHeader from '../../ward-view-header/ward-view-header.component';
7
+ import Filters from '../linelist-wards/Filters';
8
+ import Header from '../linelist-wards/Header';
9
+ import Metrics from '../linelist-wards/Metrics';
10
+ import WardViewContentWrapper from '../ward-view-content-wrapper';
6
11
  import Ward from '../ward.component';
7
12
  import DefaultWardBeds from './default-ward-beds.component';
13
+ import DefaultWardPatientCardHeader from './default-ward-patient-card-header.component';
8
14
  import DefaultWardPendingPatients from './default-ward-pending-patients.component';
9
15
  import DefaultWardUnassignedPatients from './default-ward-unassigned-patients.component';
10
- import DefaultWardPatientCardHeader from './default-ward-patient-card-header.component';
16
+ import WardPatientsTable from '../../ward-patients/ward-patients-table';
11
17
 
12
18
  const DefaultWardView = () => {
19
+ const { location } = useWardLocation();
20
+ const { t } = useTranslation();
13
21
  const wardPatientGroupDetails = useWardPatientGrouping();
22
+ const cards = useMemo(() => {
23
+ return [
24
+ {
25
+ label: t('awaitingAdmission', 'Awaiting Admission'),
26
+ value: `${wardPatientGroupDetails.inpatientRequestResponse?.inpatientRequests?.length ?? 0}`,
27
+ },
28
+ { label: t('admitted', 'Admitted'), value: `${wardPatientGroupDetails?.totalPatientsCount}` },
29
+ { label: t('dischargIn', 'Discaharg In'), value: '20' },
30
+ { label: t('discharge', 'Discharge'), value: '50%' },
31
+ ];
32
+ }, [t, wardPatientGroupDetails]);
14
33
  useDefineAppContext<WardViewContext>('ward-view-context', {
15
34
  wardPatientGroupDetails,
16
- WardPatientHeader: DefaultWardPatientCardHeader
35
+ WardPatientHeader: DefaultWardPatientCardHeader,
17
36
  });
18
37
 
19
38
  const wardBeds = <DefaultWardBeds />;
@@ -22,8 +41,14 @@ const DefaultWardView = () => {
22
41
 
23
42
  return (
24
43
  <>
25
- <WardViewHeader {...{ wardPendingPatients }} />
26
- <Ward {...{ wardBeds, wardUnassignedPatients }} />
44
+ <Header title={location.display} />
45
+ <Filters />
46
+ <Metrics metrics={cards} />
47
+ {/* <WardViewHeader {...{ wardPendingPatients }} /> */}
48
+ <WardViewContentWrapper
49
+ cardView={<Ward {...{ wardBeds, wardUnassignedPatients }} />}
50
+ tableView={<WardPatientsTable />}
51
+ />
27
52
  </>
28
53
  );
29
54
  };
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import styles from './linelist-wards.scss';
3
+ import { DatePicker, DatePickerInput } from '@carbon/react';
4
+ import { useTranslation } from 'react-i18next';
5
+ const Filters = () => {
6
+ const { t } = useTranslation();
7
+ return (
8
+ <div className={styles.filtersContainer}>
9
+ <div>
10
+ <DatePicker datePickerType="single" onChange={() => {}} onClose={() => {}} onOpen={() => {}}>
11
+ <DatePickerInput
12
+ id="date-picker-single"
13
+ labelText={t('date', 'Date')}
14
+ onChange={() => {}}
15
+ onClose={() => {}}
16
+ onOpen={() => {}}
17
+ placeholder="mm/dd/yyyy"
18
+ />
19
+ </DatePicker>
20
+ </div>
21
+ </div>
22
+ );
23
+ };
24
+
25
+ export default Filters;
@@ -0,0 +1,27 @@
1
+ import { Calendar, Location, LocationCompany, UserFollow } from '@carbon/react/icons';
2
+ import { formatDate, HomePictogram, useSession } from '@openmrs/esm-framework';
3
+ import React from 'react';
4
+ import { useTranslation } from 'react-i18next';
5
+ import styles from './linelist-wards.scss';
6
+
7
+ interface HeaderProps {
8
+ title: string;
9
+ }
10
+
11
+ const Header: React.FC<HeaderProps> = ({ title }) => {
12
+ const { t } = useTranslation();
13
+
14
+ return (
15
+ <div className={styles.header} id="admin-header">
16
+ <div className={styles.leftJustifiedItems}>
17
+ <HomePictogram className={styles.icon} />
18
+ <div className={styles.pageLabels}>
19
+ <p>{t('locations', 'Locations')}</p>
20
+ <p className={styles.pageName}>{title}</p>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ );
25
+ };
26
+
27
+ export default Header;
@@ -0,0 +1,147 @@
1
+ import React, { useMemo } from 'react';
2
+ import styles from './linelist-wards.scss';
3
+ import { useAdmisiionLocations } from '../../hooks/useAdmissionLocation';
4
+ import {
5
+ DataTableSkeleton,
6
+ DataTable,
7
+ TableContainer,
8
+ Table,
9
+ TableHead,
10
+ TableRow,
11
+ TableHeader,
12
+ TableBody,
13
+ TableCell,
14
+ Tile,
15
+ Pagination,
16
+ Layer,
17
+ Search,
18
+ } from '@carbon/react';
19
+ import { ConfigurableLink, ErrorState } from '@openmrs/esm-framework';
20
+ import { useTranslation } from 'react-i18next';
21
+ import { CardHeader } from '@openmrs/esm-patient-common-lib/src';
22
+
23
+ import { type AdmissionLocationFetchResponse } from '../../types';
24
+ import { EmptyState } from '../../ward-patients/table-state-components';
25
+ const LineListTable = () => {
26
+ const {
27
+ admissionLocations,
28
+ error,
29
+ isLoading,
30
+ paginated,
31
+ currentPage,
32
+ pageSizes,
33
+ goTo,
34
+ currPageSize,
35
+ setCurrPageSize,
36
+ totalCount,
37
+ } = useAdmisiionLocations();
38
+ const { t } = useTranslation();
39
+ const headerTitle = t('wards', 'Wards');
40
+ const headers = [
41
+ { key: 'ward', header: t('wardName', 'Ward Name') },
42
+ { key: 'numberOfBeds', header: t('numberofbeds', 'Number of Beds') },
43
+ { key: 'occupiedBeds', header: t('occupiedBeds', 'Occupied Beds') },
44
+ { key: 'freebeds', header: t('freebeds', 'Free Beds') },
45
+ { key: 'bedOccupancy', header: t('bedOccupancy', 'Bed Occupancy%') },
46
+ { key: 'pendingOut', header: t('pendingOut', 'Pending Out') },
47
+ { key: 'action', header: t('action', 'Action') },
48
+ ];
49
+ const calculateOccupancy = (location: AdmissionLocationFetchResponse) => {
50
+ if (!location.totalBeds || !location.occupiedBeds) return 0;
51
+
52
+ return (((location.totalBeds - location.occupiedBeds) / location.totalBeds) * 100).toFixed(2);
53
+ };
54
+ const tableRows = useMemo(() => {
55
+ return admissionLocations.map((location) => {
56
+ const url = '${openmrsSpaBase}/home/ward/${locationUuid}';
57
+
58
+ return {
59
+ id: location.ward.uuid,
60
+ ward: location.ward.display,
61
+ numberOfBeds: location.totalBeds,
62
+ occupiedBeds: (
63
+ <ConfigurableLink to={url} className={styles.link} templateParams={{ locationUuid: location.ward.uuid }}>
64
+ {location.occupiedBeds}
65
+ </ConfigurableLink>
66
+ ),
67
+ freebeds: location.totalBeds - location.occupiedBeds,
68
+ bedOccupancy: calculateOccupancy(location),
69
+ // pendingOut:
70
+ };
71
+ });
72
+ }, [admissionLocations]);
73
+ if (isLoading)
74
+ return (
75
+ <Layer className={styles.tableContainer}>
76
+ <DataTableSkeleton />
77
+ </Layer>
78
+ );
79
+ if (error)
80
+ return (
81
+ <Layer className={styles.tableContainer}>
82
+ <ErrorState headerTitle={headerTitle} error={error} />
83
+ </Layer>
84
+ );
85
+ return (
86
+ <Tile className={styles.tableContainer}>
87
+ <CardHeader title={headerTitle}>
88
+ <></>
89
+ </CardHeader>
90
+ <Search />
91
+ <DataTable rows={tableRows} headers={headers} isSortable useZebraStyles>
92
+ {({ rows, headers, getHeaderProps, getRowProps, getTableProps, getCellProps }) => (
93
+ <TableContainer className={styles.claimsTable}>
94
+ <Table {...getTableProps()} aria-label="sample table">
95
+ <TableHead>
96
+ <TableRow>
97
+ {headers.map((header) => (
98
+ <TableHeader
99
+ key={header.key}
100
+ {...getHeaderProps({
101
+ header,
102
+ })}>
103
+ {header.header}
104
+ </TableHeader>
105
+ ))}
106
+ </TableRow>
107
+ </TableHead>
108
+ <TableBody>
109
+ {rows.map((row) => {
110
+ return (
111
+ <TableRow key={row.id} {...getRowProps({ row })}>
112
+ {row.cells.map((cell) => (
113
+ <TableCell key={cell.id} {...getCellProps({ cell })}>
114
+ {cell.value}
115
+ </TableCell>
116
+ ))}
117
+ </TableRow>
118
+ );
119
+ })}
120
+ </TableBody>
121
+ </Table>
122
+ {rows.length === 0 && <EmptyState message={t('noWards', 'No wards found')} />}
123
+ {paginated && !isLoading && (
124
+ <Pagination
125
+ forwardText=""
126
+ backwardText=""
127
+ page={currentPage}
128
+ pageSize={currPageSize}
129
+ pageSizes={pageSizes}
130
+ totalItems={totalCount}
131
+ size={'sm'}
132
+ onChange={({ page: newPage, pageSize }) => {
133
+ if (newPage !== currentPage) {
134
+ goTo(newPage);
135
+ }
136
+ setCurrPageSize(pageSize);
137
+ }}
138
+ />
139
+ )}
140
+ </TableContainer>
141
+ )}
142
+ </DataTable>
143
+ </Tile>
144
+ );
145
+ };
146
+
147
+ export default LineListTable;
@@ -0,0 +1,21 @@
1
+ import React, { type FC, useMemo } from 'react';
2
+ import { Layer, Tile } from '@carbon/react';
3
+ import styles from './linelist-wards.scss';
4
+
5
+ type MetricsProps = {
6
+ metrics: Array<{ label: string; value: string }>;
7
+ };
8
+ const Metrics: FC<MetricsProps> = ({ metrics }) => {
9
+ return (
10
+ <Layer className={styles.metricsContainer}>
11
+ {metrics.map(({ label, value }) => (
12
+ <Tile className={styles.metricCard}>
13
+ <strong>{label}</strong>
14
+ <h4 className={styles.metricValue}>{value ?? '--'}</h4>
15
+ </Tile>
16
+ ))}
17
+ </Layer>
18
+ );
19
+ };
20
+
21
+ export default Metrics;
@@ -0,0 +1,29 @@
1
+ import React, { useMemo } from 'react';
2
+ import Header from './Header';
3
+ import Filters from './Filters';
4
+ import Metrics from './Metrics';
5
+ import LineListTable from './LineListTable';
6
+ import { useTranslation } from 'react-i18next';
7
+
8
+ const WardsLineList = () => {
9
+ const { t } = useTranslation();
10
+ // TODO here to replace the mocked values
11
+ const cards = useMemo(() => {
12
+ return [
13
+ { label: t('numberOfBeds', 'Number of Beds'), value: '40' },
14
+ { label: t('admittedPatients', 'Admitted Patients'), value: '150' },
15
+ { label: t('freebeds', 'Free Beds'), value: '20' },
16
+ { label: t('bedOccupancy', 'Bed Occupancy %'), value: '50%' },
17
+ ];
18
+ }, [t]);
19
+ return (
20
+ <div>
21
+ <Header title={t('wards', 'Wards')} />
22
+ <Filters />
23
+ <Metrics metrics={cards} />
24
+ <LineListTable />
25
+ </div>
26
+ );
27
+ };
28
+
29
+ export default WardsLineList;