@ampath/esm-dha-workflow-app 4.0.0-next.13 → 4.0.0-next.130

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 (364) hide show
  1. package/dist/1197.js +1 -0
  2. package/dist/1277.js +1 -0
  3. package/dist/1277.js.map +1 -0
  4. package/dist/1558.js +2 -0
  5. package/dist/{198.js.LICENSE.txt → 1558.js.LICENSE.txt} +0 -10
  6. package/dist/1558.js.map +1 -0
  7. package/dist/1729.js +1 -0
  8. package/dist/1729.js.map +1 -0
  9. package/dist/182.js +1 -0
  10. package/dist/182.js.map +1 -0
  11. package/dist/1826.js +1 -0
  12. package/dist/1826.js.map +1 -0
  13. package/dist/1833.js +1 -0
  14. package/dist/1833.js.map +1 -0
  15. package/dist/1856.js +1 -0
  16. package/dist/1856.js.map +1 -0
  17. package/dist/1925.js +1 -0
  18. package/dist/1925.js.map +1 -0
  19. package/dist/2021.js +1 -0
  20. package/dist/2021.js.map +1 -0
  21. package/dist/2054.js +1 -0
  22. package/dist/2054.js.map +1 -0
  23. package/dist/2177.js +2 -0
  24. package/dist/2177.js.LICENSE.txt +9 -0
  25. package/dist/2177.js.map +1 -0
  26. package/dist/2364.js +2 -0
  27. package/dist/{200.js.LICENSE.txt → 2364.js.LICENSE.txt} +15 -0
  28. package/dist/2364.js.map +1 -0
  29. package/dist/2566.js +1 -0
  30. package/dist/2566.js.map +1 -0
  31. package/dist/2801.js +1 -0
  32. package/dist/2801.js.map +1 -0
  33. package/dist/2975.js +1 -0
  34. package/dist/2975.js.map +1 -0
  35. package/dist/3041.js +1 -0
  36. package/dist/3041.js.map +1 -0
  37. package/dist/3099.js +1 -0
  38. package/dist/3184.js +2 -0
  39. package/dist/3184.js.map +1 -0
  40. package/dist/3654.js +1 -0
  41. package/dist/3654.js.map +1 -0
  42. package/dist/4055.js +1 -0
  43. package/dist/4205.js +1 -0
  44. package/dist/4205.js.map +1 -0
  45. package/dist/4225.js +1 -0
  46. package/dist/4225.js.map +1 -0
  47. package/dist/4300.js +1 -0
  48. package/dist/4335.js +1 -0
  49. package/dist/4353.js +1 -0
  50. package/dist/4353.js.map +1 -0
  51. package/dist/4517.js +1 -0
  52. package/dist/4517.js.map +1 -0
  53. package/dist/4652.js +1 -0
  54. package/dist/4674.js +1 -0
  55. package/dist/4674.js.map +1 -0
  56. package/dist/4947.js +1 -0
  57. package/dist/4947.js.map +1 -0
  58. package/dist/5015.js +1 -0
  59. package/dist/5015.js.map +1 -0
  60. package/dist/5422.js +1 -0
  61. package/dist/5422.js.map +1 -0
  62. package/dist/5428.js +1 -0
  63. package/dist/5428.js.map +1 -0
  64. package/dist/5752.js +1 -0
  65. package/dist/5752.js.map +1 -0
  66. package/dist/5851.js +1 -0
  67. package/dist/5851.js.map +1 -0
  68. package/dist/6264.js +1 -0
  69. package/dist/6264.js.map +1 -0
  70. package/dist/6540.js +2 -0
  71. package/dist/6540.js.map +1 -0
  72. package/dist/6606.js +1 -0
  73. package/dist/6606.js.map +1 -0
  74. package/dist/693.js +1 -0
  75. package/dist/693.js.map +1 -0
  76. package/dist/6991.js +1 -0
  77. package/dist/6991.js.map +1 -0
  78. package/dist/7076.js +1 -0
  79. package/dist/7076.js.map +1 -0
  80. package/dist/7199.js +1 -0
  81. package/dist/7199.js.map +1 -0
  82. package/dist/7255.js +1 -0
  83. package/dist/7255.js.map +1 -0
  84. package/dist/7258.js +1 -0
  85. package/dist/7258.js.map +1 -0
  86. package/dist/7420.js +1 -0
  87. package/dist/7420.js.map +1 -0
  88. package/dist/7523.js +1 -0
  89. package/dist/7523.js.map +1 -0
  90. package/dist/8114.js +1 -0
  91. package/dist/8114.js.map +1 -0
  92. package/dist/8339.js +1 -0
  93. package/dist/8339.js.map +1 -0
  94. package/dist/8865.js +1 -0
  95. package/dist/8865.js.map +1 -0
  96. package/dist/8895.js +1 -0
  97. package/dist/8895.js.map +1 -0
  98. package/dist/9037.js +1 -0
  99. package/dist/9037.js.map +1 -0
  100. package/dist/9091.js +1 -0
  101. package/dist/9091.js.map +1 -0
  102. package/dist/9093.js +1 -0
  103. package/dist/9093.js.map +1 -0
  104. package/dist/9117.js +1 -0
  105. package/dist/9117.js.map +1 -0
  106. package/dist/9721.js +1 -0
  107. package/dist/9721.js.map +1 -0
  108. package/dist/esm-dha-workflow-app.js +1 -0
  109. package/dist/esm-dha-workflow-app.js.buildmanifest.json +1570 -0
  110. package/dist/esm-dha-workflow-app.js.map +1 -0
  111. package/dist/main.js +1 -1
  112. package/dist/main.js.map +1 -1
  113. package/dist/routes.json +1 -1
  114. package/package.json +11 -4
  115. package/src/accounting/accounting.component.tsx +13 -0
  116. package/src/admissions/admission-request-list/admission-request-list.scss +0 -0
  117. package/src/admissions/admission-request-list/admission-request-list.tsx +134 -0
  118. package/src/admissions/admissions-dashboard.component.scss +15 -0
  119. package/src/admissions/admissions-dashboard.component.tsx +160 -0
  120. package/src/admissions/admissions.resource.ts +101 -0
  121. package/src/admissions/admitted-list/admitted-patients-list.tsx +141 -0
  122. package/src/admissions/constants/index.ts +33 -0
  123. package/src/admissions/discharged-list/discharged-list.scss +0 -0
  124. package/src/admissions/discharged-list/discharged-list.tsx +58 -0
  125. package/src/admissions/inpatient/admission-history/patient-admission-history.tsx +76 -0
  126. package/src/admissions/inpatient/admission-requests/patient-admission-requests.scss +19 -0
  127. package/src/admissions/inpatient/admission-requests/patient-admission-requests.tsx +72 -0
  128. package/src/admissions/inpatient/inpatient-admissions.component.scss +7 -0
  129. package/src/admissions/inpatient/inpatient-admissions.component.tsx +46 -0
  130. package/src/admissions/modal/admit-elsewhere/admit-elsewhere.modal.scss +23 -0
  131. package/src/admissions/modal/admit-elsewhere/admit-elsewhere.modal.tsx +156 -0
  132. package/src/admissions/modal/admit-patient/admit-patient.modal.scss +0 -0
  133. package/src/admissions/modal/admit-patient/admit-patient.modal.tsx +109 -0
  134. package/src/admissions/modal/bed-swap/bed-swap.modal.scss +0 -0
  135. package/src/admissions/modal/bed-swap/bed-swap.modal.tsx +102 -0
  136. package/src/admissions/modal/cancel-admission-request/cancel-admission-request.scss +11 -0
  137. package/src/admissions/modal/cancel-admission-request/cancel-admission-request.tsx +105 -0
  138. package/src/admissions/modal/discharge/discharge-patient.modal.scss +13 -0
  139. package/src/admissions/modal/discharge/discharge-patient.modal.tsx +84 -0
  140. package/src/admissions/types/index.ts +192 -0
  141. package/src/appointments/appointments.component.tsx +13 -0
  142. package/src/billing/api/billing.api.ts +95 -0
  143. package/src/billing/billing-root.tsx +20 -0
  144. package/src/billing/dashboard/billingDashboard.component.scss +0 -0
  145. package/src/billing/dashboard/billingDashboard.component.tsx +25 -0
  146. package/src/billing/extensions/visit-billing/visit-billing.extension.scss +0 -0
  147. package/src/billing/extensions/visit-billing/visit-billing.extension.tsx +409 -0
  148. package/src/billing/invoice/bill.resource.ts +47 -0
  149. package/src/billing/invoice/invoice-header/header-card/header-card.scss +17 -0
  150. package/src/billing/invoice/invoice-header/header-card/header-card.tsx +21 -0
  151. package/src/billing/invoice/invoice.scss +113 -0
  152. package/src/billing/invoice/invoice.tsx +1371 -0
  153. package/src/billing/invoice/line-items/line-items.scss +0 -0
  154. package/src/billing/invoice/line-items/line-items.tsx +120 -0
  155. package/src/billing/invoice/modal/delete-bill-item/delete-bill-item.modal.scss +23 -0
  156. package/src/billing/invoice/modal/delete-bill-item/delete-bill-item.modal.tsx +114 -0
  157. package/src/billing/invoice/modal/edit-bill-item/edit-bill-item.modal.scss +0 -0
  158. package/src/billing/invoice/modal/edit-bill-item/edit-bill-item.modal.tsx +122 -0
  159. package/src/billing/invoice/payment-details/payment-details.scss +0 -0
  160. package/src/billing/invoice/payment-details/payment-details.tsx +43 -0
  161. package/src/billing/invoice/print-invoice/print-receipt.component.tsx +44 -0
  162. package/src/billing/invoice/print-invoice/print-receipt.scss +14 -0
  163. package/src/billing/types/index.ts +84 -0
  164. package/src/billing/utils/index.ts +17 -0
  165. package/src/billing/widgets/billingTotalsRow.component.scss +0 -0
  166. package/src/billing/widgets/billingTotalsRow.component.tsx +712 -0
  167. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.resource.ts +85 -0
  168. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.scss +58 -0
  169. package/src/billing/workspaces/create-order-bill-form-workspace/create-order-bill-form.workspace.tsx +330 -0
  170. package/src/billing/workspaces/create-order-bill-form-workspace/schema.ts +11 -0
  171. package/src/bookings/bookings.component.scss +7 -0
  172. package/src/bookings/bookings.component.tsx +31 -0
  173. package/src/bookings/daily/daily-bookings.component.scss +38 -0
  174. package/src/bookings/daily/daily-bookings.component.tsx +138 -0
  175. package/src/bookings/daily/daily-bookings.resource.ts +28 -0
  176. package/src/bookings/daily/filters/daily-bookings-filter.component.scss +15 -0
  177. package/src/bookings/daily/filters/daily-bookings-filter.component.tsx +80 -0
  178. package/src/bookings/daily/patient-list/daily-bookings-patient-list.component.tsx +97 -0
  179. package/src/bookings/types/index.ts +68 -0
  180. package/src/config-schema.ts +186 -32
  181. package/src/createDashboardLink.tsx +9 -0
  182. package/src/dashboard/charts/chart.component.scss +13 -0
  183. package/src/dashboard/charts/chart.component.tsx +54 -0
  184. package/src/dashboard/dashboard.component.scss +7 -0
  185. package/src/dashboard/dashboard.component.tsx +51 -0
  186. package/src/dashboard/overview/overview.component.scss +147 -0
  187. package/src/dashboard/overview/overview.component.tsx +115 -0
  188. package/src/dashboard/patient-list/patient-list.component.tsx +41 -0
  189. package/src/dashboard-meta/accounting-dashboard.meta.ts +6 -0
  190. package/src/dashboard-meta/admissions-dashboard.meta.ts +6 -0
  191. package/src/dashboard-meta/billing-dashboard.meta.ts +6 -0
  192. package/src/dashboard-meta/bookings-dashboard.meta.ts +6 -0
  193. package/src/dashboard-meta/consultation-dashboard.meta.ts +6 -0
  194. package/src/dashboard-meta/dha-workflow-dashboard.meta.ts +6 -0
  195. package/src/dashboard-meta/inpatient-admissions.meta.ts +6 -0
  196. package/src/dashboard-meta/mch-dashboard.meta.ts +6 -0
  197. package/src/dashboard-meta/pharmacy-dashboard.meta.ts +6 -0
  198. package/src/dashboard-meta/queue-dashboard.meta.ts +6 -0
  199. package/src/dashboard-meta/registers-dashboard.meta.ts +6 -0
  200. package/src/dashboard-meta/registry-dashboard.meta.ts +6 -0
  201. package/src/dashboard-meta/service-queue-admin.meta.ts +6 -0
  202. package/src/dashboard-meta/triage-dashboard.meta.ts +6 -0
  203. package/src/hooks/useActions.ts +165 -0
  204. package/src/index.ts +118 -1
  205. package/src/laboratory/laboratory.component.tsx +13 -0
  206. package/src/left-panel/left-panel.component.tsx +0 -2
  207. package/src/mch/mch-queues.component.scss +7 -0
  208. package/src/mch/mch-queues.component.tsx +32 -0
  209. package/src/mch/queues/consultation/mch-consultation.tsx +18 -0
  210. package/src/mch/queues/triage/mch-triage.tsx +15 -0
  211. package/src/modals/sign-off-modal.scss +7 -0
  212. package/src/modals/sign-off-modal.tsx +52 -0
  213. package/src/mortuary/mortuary.component.tsx +13 -0
  214. package/src/pharmacy/pharmacy.component.tsx +13 -0
  215. package/src/registers/registers.component.tsx +8 -0
  216. package/src/registry/eligibility/eliigibility-tags/eligibility-tags.scss +6 -0
  217. package/src/registry/eligibility/eliigibility-tags/eligibility-tags.tsx +137 -0
  218. package/src/registry/eligibility/modal/eligibility-details.modal.scss +38 -0
  219. package/src/registry/eligibility/modal/eligibility-details.modal.tsx +131 -0
  220. package/src/registry/modal/client-details-modal/client-details-modal.tsx +9 -26
  221. package/src/registry/modal/otp-verification-modal/otp-verification-modal.scss +31 -1
  222. package/src/registry/modal/otp-verification-modal/otp-verification-modal.tsx +145 -58
  223. package/src/registry/modal/send-to-triage/send-to-triage.modal.scss +16 -1
  224. package/src/registry/modal/send-to-triage/send-to-triage.modal.tsx +681 -97
  225. package/src/registry/payment-details/payment-options/payment-options.scss +13 -0
  226. package/src/registry/payment-details/payment-options/payment-options.tsx +61 -14
  227. package/src/registry/registry.component.scss +18 -1
  228. package/src/registry/registry.component.tsx +242 -111
  229. package/src/registry/registry.resource.ts +8 -5
  230. package/src/registry/types/index.ts +179 -1
  231. package/src/registry/utils/error-handler.ts +33 -0
  232. package/src/registry/utils/format-dependant-display-data.ts +8 -0
  233. package/src/registry/utils/hie-client-adapter.ts +312 -0
  234. package/src/registry/utils/mask-data.ts +11 -0
  235. package/src/resources/dashboard.resource.ts +20 -0
  236. package/src/resources/hie-amrs-automatic-registration.service.ts +16 -0
  237. package/src/resources/identifier-types.ts +29 -0
  238. package/src/resources/patient-resource.ts +62 -0
  239. package/src/resources/queue.resource.ts +23 -0
  240. package/src/resources/superset.resource.ts +20 -0
  241. package/src/resources/visit.resource.ts +19 -1
  242. package/src/root.component.tsx +32 -6
  243. package/src/routes.json +232 -7
  244. package/src/service-queues/action-button.component.tsx +34 -0
  245. package/src/service-queues/action-overflow-menu-item.component.tsx +34 -0
  246. package/src/service-queues/admin/queue/modal/create-queue/create-queue.modal.scss +31 -0
  247. package/src/service-queues/admin/queue/modal/create-queue/create-queue.modal.tsx +142 -0
  248. package/src/service-queues/admin/queue/modal/edit-queue/edit-queue.modal.scss +0 -0
  249. package/src/service-queues/admin/queue/modal/edit-queue/edit-queue.modal.tsx +150 -0
  250. package/src/service-queues/admin/queue/queue-list/queue-list.scss +33 -0
  251. package/src/service-queues/admin/queue/queue-list/queue-list.tsx +113 -0
  252. package/src/service-queues/admin/queue-entry/queue-entry-list.component.scss +6 -0
  253. package/src/service-queues/admin/queue-entry/queue-entry-list.component.tsx +137 -0
  254. package/src/service-queues/admin/queue-room/modal/create-queue-room/create-queue-room.modal.scss +31 -0
  255. package/src/service-queues/admin/queue-room/modal/create-queue-room/create-queue-room.modal.tsx +137 -0
  256. package/src/service-queues/admin/queue-room/modal/edit-queue-room/edit-queue-room.modal.scss +0 -0
  257. package/src/service-queues/admin/queue-room/modal/edit-queue-room/edit-queue-room.modal.tsx +146 -0
  258. package/src/service-queues/admin/queue-room/queue-room-list/queue-room-list.scss +22 -0
  259. package/src/service-queues/admin/queue-room/queue-room-list/queue-room-list.tsx +120 -0
  260. package/src/service-queues/admin/service-queue-admin-dashboard.component.scss +6 -0
  261. package/src/service-queues/admin/service-queue-admin-dashboard.component.tsx +34 -0
  262. package/src/service-queues/consultation/consultation.component.scss +7 -0
  263. package/src/service-queues/consultation/consultation.component.tsx +15 -0
  264. package/src/service-queues/extensions/service-queue-patient-banner/service-queue-patient-banner.scss +30 -0
  265. package/src/service-queues/extensions/service-queue-patient-banner/service-queue-patient-banner.tsx +108 -0
  266. package/src/service-queues/metrics/metrics-cards/attended-patients.extension.tsx +38 -0
  267. package/src/service-queues/metrics/metrics-cards/metrics-card.component.tsx +86 -0
  268. package/src/service-queues/metrics/metrics-cards/metrics-card.scss +106 -0
  269. package/src/service-queues/metrics/metrics-cards/waiting-patients.extension.tsx +34 -0
  270. package/src/service-queues/metrics/metrics-container.component.tsx +23 -0
  271. package/src/service-queues/metrics/metrics-container.scss +36 -0
  272. package/src/service-queues/metrics/metrics.resource.ts +65 -0
  273. package/src/service-queues/modals/daily-report-patient-list/daily-report-patient-list.scss +26 -0
  274. package/src/service-queues/modals/daily-report-patient-list/daily-report-patient-list.tsx +108 -0
  275. package/src/service-queues/modals/move/move-patient.component.scss +35 -0
  276. package/src/service-queues/modals/move/move-patient.component.tsx +152 -0
  277. package/src/service-queues/modals/serve/serve-patient.comppnent.scss +0 -0
  278. package/src/service-queues/modals/serve/serve-patient.comppnent.tsx +80 -0
  279. package/src/service-queues/modals/sign-off/sign-off.modal.scss +0 -0
  280. package/src/service-queues/modals/sign-off/sign-off.modal.tsx +79 -0
  281. package/src/service-queues/modals/transition/transition-patient.component.scss +0 -0
  282. package/src/service-queues/modals/transition/transition-patient.component.tsx +122 -0
  283. package/src/service-queues/queue-list/check-in.service.ts +26 -0
  284. package/src/service-queues/queue-list/queue-list.component.scss +36 -0
  285. package/src/service-queues/queue-list/queue-list.component.tsx +249 -0
  286. package/src/service-queues/queue-room.component.tsx +39 -0
  287. package/src/service-queues/room/room.component.tsx +58 -0
  288. package/src/service-queues/service-queue/service-queue.component.scss +14 -0
  289. package/src/service-queues/service-queue/service-queue.component.tsx +399 -0
  290. package/src/service-queues/service-queue/stats/stat-details/stat-details.component.scss +12 -0
  291. package/src/service-queues/service-queue/stats/stat-details/stat-details.component.tsx +63 -0
  292. package/src/service-queues/service-queue.scss +27 -0
  293. package/src/service-queues/service-queue.tsx +37 -0
  294. package/src/service-queues/service-queues.resource.ts +361 -0
  295. package/src/service-queues/service.resource.ts +28 -0
  296. package/src/shared/constants/civil-status.ts +29 -0
  297. package/src/shared/constants/concepts.ts +15 -0
  298. package/src/shared/constants/index.ts +1 -2
  299. package/src/shared/constants/patient-category.ts +6 -0
  300. package/src/shared/constants/person-attributes.ts +33 -0
  301. package/src/shared/constants/visit-types.ts +7 -0
  302. package/src/shared/services/billing.resource.ts +38 -0
  303. package/src/shared/services/client-payment-mode.resource.ts +27 -0
  304. package/src/shared/services/client-payment.resource.ts +17 -0
  305. package/src/shared/services/eligibility.resource.ts +19 -0
  306. package/src/shared/services/encounters.resource.ts +27 -0
  307. package/src/shared/services/location.resource.ts +9 -0
  308. package/src/shared/types/index.ts +152 -0
  309. package/src/shared/ui/aggregate-stat-card/aggregate-stat-card.scss +42 -0
  310. package/src/shared/ui/aggregate-stat-card/aggregate-stat-card.tsx +42 -0
  311. package/src/shared/ui/confirm-modal/confirm.modal.scss +18 -0
  312. package/src/shared/ui/confirm-modal/confirm.modal.tsx +38 -0
  313. package/src/shared/ui/otp-input/otp-input.component.scss +14 -0
  314. package/src/shared/ui/otp-input/otp-input.component.tsx +90 -0
  315. package/src/shared/ui/stat-card/stat-card.component.scss +10 -0
  316. package/src/shared/ui/stat-card/stat-card.component.tsx +26 -0
  317. package/src/shared/ui/timer/timer.component.scss +5 -0
  318. package/src/shared/ui/timer/timer.component.tsx +40 -0
  319. package/src/shared/utils/get-base-url.ts +27 -0
  320. package/src/shared/utils/get-tag-type.ts +66 -0
  321. package/src/side-nav-menu/nav-link-config.ts +6 -0
  322. package/src/triage/metrics/attended-patients.extension.tsx +42 -0
  323. package/src/triage/metrics/metrics.scss +36 -0
  324. package/src/triage/metrics/triage-metrics.component.tsx +21 -0
  325. package/src/triage/metrics/waiting-patients.extension.tsx +39 -0
  326. package/src/triage/room/room.scss +29 -0
  327. package/src/triage/triage.component.tsx +15 -0
  328. package/src/triage/triage.resource.ts +19 -0
  329. package/src/triage/types.ts +16 -0
  330. package/src/types/types.ts +180 -0
  331. package/dist/16.js +0 -1
  332. package/dist/16.js.map +0 -1
  333. package/dist/184.js +0 -2
  334. package/dist/184.js.map +0 -1
  335. package/dist/197.js +0 -1
  336. package/dist/198.js +0 -2
  337. package/dist/198.js.map +0 -1
  338. package/dist/200.js +0 -2
  339. package/dist/200.js.map +0 -1
  340. package/dist/255.js +0 -1
  341. package/dist/255.js.map +0 -1
  342. package/dist/300.js +0 -1
  343. package/dist/335.js +0 -1
  344. package/dist/353.js +0 -1
  345. package/dist/353.js.map +0 -1
  346. package/dist/420.js +0 -1
  347. package/dist/420.js.map +0 -1
  348. package/dist/540.js +0 -2
  349. package/dist/540.js.map +0 -1
  350. package/dist/55.js +0 -1
  351. package/dist/652.js +0 -1
  352. package/dist/860.js +0 -1
  353. package/dist/860.js.map +0 -1
  354. package/dist/91.js +0 -1
  355. package/dist/91.js.map +0 -1
  356. package/dist/93.js +0 -1
  357. package/dist/93.js.map +0 -1
  358. package/dist/99.js +0 -1
  359. package/dist/openmrs-esm-home-app.js +0 -1
  360. package/dist/openmrs-esm-home-app.js.buildmanifest.json +0 -626
  361. package/dist/openmrs-esm-home-app.js.map +0 -1
  362. package/src/consultation/consultation.tsx +0 -7
  363. /package/dist/{184.js.LICENSE.txt → 3184.js.LICENSE.txt} +0 -0
  364. /package/dist/{540.js.LICENSE.txt → 6540.js.LICENSE.txt} +0 -0
@@ -0,0 +1,137 @@
1
+ import { Modal, ModalBody, SelectItem, Select, TextInput } from '@carbon/react';
2
+ import React, { useEffect, useState } from 'react';
3
+ import styles from './create-queue-room.modal.scss';
4
+ import { useSession, showSnackbar } from '@openmrs/esm-framework';
5
+ import { type Queue, type CreateQueueRoomDto } from '../../../../../types/types';
6
+ import { createQueueRoom, getQueuesByLocationUuid } from '../../../../service-queues.resource';
7
+ interface CreateQueueRoomModalProps {
8
+ open: boolean;
9
+ onModalClose: () => void;
10
+ }
11
+
12
+ const CreateQueueRoomModal: React.FC<CreateQueueRoomModalProps> = ({ open, onModalClose }) => {
13
+ const session = useSession();
14
+ const location = session.sessionLocation;
15
+ const locationUuid = location.uuid;
16
+ const [queueRoomName, setQueueRoomName] = useState<string>();
17
+ const [description, setDescription] = useState<string>();
18
+ const [queues, setQueues] = useState<Queue[]>([]);
19
+ const [selectedQueueServiceUuid, setSelectedQueueServiceUuid] = useState<string>();
20
+ useEffect(() => {
21
+ fetchQueues();
22
+ }, [locationUuid]);
23
+ const fetchQueues = async () => {
24
+ const queues = await getQueuesByLocationUuid(locationUuid);
25
+ setQueues(queues);
26
+ };
27
+ const handleQueueRoomName = (queueName: string) => {
28
+ setQueueRoomName(queueName);
29
+ };
30
+ const handleQueueRoomDescription = (queueDescription: string) => {
31
+ setDescription(queueDescription);
32
+ };
33
+ const handleQueueService = (queueServiceUuid: string) => {
34
+ setSelectedQueueServiceUuid(queueServiceUuid);
35
+ };
36
+ const handleCreateQueueRoom = async () => {
37
+ const payload = generateCreateQueueRoomPayload();
38
+ if (isValidateCreateQueueRoomDto(payload)) {
39
+ const resp = await createQueueRoom(payload);
40
+ if (resp) {
41
+ showAlert('Queue Room created successfully!', 'success');
42
+ onModalClose();
43
+ }
44
+ }
45
+ };
46
+ const generateCreateQueueRoomPayload = (): CreateQueueRoomDto => {
47
+ return {
48
+ name: queueRoomName,
49
+ description: description,
50
+ queue: {
51
+ uuid: selectedQueueServiceUuid,
52
+ },
53
+ };
54
+ };
55
+ const isValidateCreateQueueRoomDto = (payload: CreateQueueRoomDto): boolean => {
56
+ if (!payload.name) {
57
+ showAlert('Please add the queue room name', 'error');
58
+ return false;
59
+ }
60
+ if (!payload.description) {
61
+ showAlert('Please add the queue room description', 'error');
62
+ return false;
63
+ }
64
+ if (!payload.queue) {
65
+ showAlert('Please add the queue service', 'error');
66
+ return false;
67
+ } else {
68
+ if (!payload.queue.uuid) {
69
+ showAlert('Please select a queue service', 'error');
70
+ return false;
71
+ }
72
+ }
73
+ return true;
74
+ };
75
+ const showAlert = (message: string, alertType: 'success' | 'error') => {
76
+ showSnackbar({
77
+ kind: alertType,
78
+ title: 'Queue Deleted',
79
+ subtitle: message,
80
+ });
81
+ };
82
+ return (
83
+ <>
84
+ <Modal
85
+ open={open}
86
+ size="md"
87
+ onSecondarySubmit={() => onModalClose()}
88
+ onRequestClose={() => onModalClose()}
89
+ onRequestSubmit={handleCreateQueueRoom}
90
+ primaryButtonText="Create Queue Room"
91
+ secondaryButtonText="Cancel"
92
+ >
93
+ <ModalBody>
94
+ <div className={styles.createQueueModalLayout}>
95
+ <div className={styles.sectionHeader}>
96
+ <h4 className={styles.sectionTitle}>Create Queue Room</h4>
97
+ </div>
98
+ <div className={styles.createQueueModalContentSection}>
99
+ <div className={styles.createQueueModalFormRow}>
100
+ <div className={styles.createQueueModalFormControl}>
101
+ <TextInput
102
+ id="queue-room-name"
103
+ labelText="Queue Room Name"
104
+ onChange={(e) => handleQueueRoomName(e.target.value)}
105
+ type="text"
106
+ />
107
+ </div>
108
+ </div>
109
+ <div className={styles.createQueueModalFormRow}>
110
+ <div className={styles.createQueueModalFormControl}>
111
+ <TextInput
112
+ id="description"
113
+ labelText="Description"
114
+ onChange={(e) => handleQueueRoomDescription(e.target.value)}
115
+ type="text"
116
+ />
117
+ </div>
118
+ </div>
119
+ <div className={styles.createQueueModalFormRow}>
120
+ <div className={styles.createQueueModalFormControl}>
121
+ <Select id="service" labelText="Service Queue" onChange={(e) => handleQueueService(e.target.value)}>
122
+ <SelectItem value="" text="Select Queue" />
123
+ {queues.map((queue) => {
124
+ return <SelectItem value={queue.uuid} text={queue.display} />;
125
+ })}
126
+ </Select>
127
+ </div>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ </ModalBody>
132
+ </Modal>
133
+ </>
134
+ );
135
+ };
136
+
137
+ export default CreateQueueRoomModal;
@@ -0,0 +1,146 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { type QueueRoom, type CreateQueueRoomDto, type Queue } from '../../../../../types/types';
3
+ import { Modal, ModalBody, Select, SelectItem, TextInput } from '@carbon/react';
4
+ import styles from './edit-queue-room.modal.scss';
5
+ import { showSnackbar, useSession } from '@openmrs/esm-framework';
6
+ import { editQueueRoom, getQueuesByLocationUuid } from '../../../../service-queues.resource';
7
+
8
+ interface EditQueueRoomModalProps {
9
+ open: boolean;
10
+ queueRoom: QueueRoom;
11
+ onModalClose: () => void;
12
+ }
13
+
14
+ const EditQueueRoomModal: React.FC<EditQueueRoomModalProps> = ({ open, queueRoom, onModalClose }) => {
15
+ const session = useSession();
16
+ const location = session.sessionLocation;
17
+ const locationUuid = location.uuid;
18
+ const [queueRoomName, setQueueRoomName] = useState<string>(queueRoom.name);
19
+ const [description, setDescription] = useState<string>(queueRoom.description);
20
+ const [queueServiceUuid, setQueueServiceUuid] = useState<string>();
21
+ const [queues, setQueues] = useState<Queue[]>([]);
22
+
23
+ useEffect(() => {
24
+ fetchQueues();
25
+ }, [locationUuid]);
26
+ const fetchQueues = async () => {
27
+ const queues = await getQueuesByLocationUuid(locationUuid);
28
+ setQueues(queues);
29
+ };
30
+
31
+ const handleQueueRoomName = (queueRoomName: string) => {
32
+ setQueueRoomName(queueRoomName);
33
+ };
34
+ const handleQueueDescription = (queueDescription: string) => {
35
+ setDescription(queueDescription);
36
+ };
37
+ const handleQueueService = (queueServiceUuid: string) => {
38
+ setQueueServiceUuid(queueServiceUuid);
39
+ };
40
+ if (!queueRoom) {
41
+ return <>No Queue room selected</>;
42
+ }
43
+ const handleUpdateQueueRoom = async () => {
44
+ const payload = generateCreateQueueRoomPayload();
45
+ if (isValidateEditQueueRoomDto(payload)) {
46
+ const resp = await editQueueRoom(queueRoom.uuid, payload);
47
+ if (resp) {
48
+ showAlert('Queue updated successfully!', 'success');
49
+ onModalClose();
50
+ }
51
+ }
52
+ };
53
+ const generateCreateQueueRoomPayload = (): CreateQueueRoomDto => {
54
+ return {
55
+ name: queueRoom.name,
56
+ description: description,
57
+ queue: {
58
+ uuid: queueServiceUuid,
59
+ },
60
+ };
61
+ };
62
+ const isValidateEditQueueRoomDto = (payload: CreateQueueRoomDto): boolean => {
63
+ if (!payload.name) {
64
+ showAlert('Please add the queue room name', 'error');
65
+ return false;
66
+ }
67
+ if (!payload.description) {
68
+ showAlert('Please add the queue room description', 'error');
69
+ return false;
70
+ }
71
+ if (!payload.queue) {
72
+ showAlert('Please add the queue service', 'error');
73
+ return false;
74
+ } else {
75
+ if (!payload.queue.uuid) {
76
+ showAlert('Please select a queue service', 'error');
77
+ return false;
78
+ }
79
+ }
80
+ return true;
81
+ };
82
+ const showAlert = (message: string, alertType: 'success' | 'error') => {
83
+ showSnackbar({
84
+ kind: alertType,
85
+ title: 'Queue Room Updated',
86
+ subtitle: message,
87
+ });
88
+ };
89
+ return (
90
+ <>
91
+ <Modal
92
+ open={open}
93
+ size="md"
94
+ onSecondarySubmit={() => onModalClose()}
95
+ onRequestClose={() => onModalClose()}
96
+ onRequestSubmit={handleUpdateQueueRoom}
97
+ primaryButtonText="Update Queue Room"
98
+ secondaryButtonText="Cancel"
99
+ >
100
+ <ModalBody>
101
+ <div className={styles.createQueueModalLayout}>
102
+ <div className={styles.sectionHeader}>
103
+ <h4 className={styles.sectionTitle}>Update Queue Room</h4>
104
+ </div>
105
+ <div className={styles.createQueueModalContentSection}>
106
+ <div className={styles.createQueueModalFormRow}>
107
+ <div className={styles.createQueueModalFormControl}>
108
+ <TextInput
109
+ id="queue-room-name"
110
+ labelText="Queue Room Name"
111
+ value={queueRoomName}
112
+ onChange={(e) => handleQueueRoomName(e.target.value)}
113
+ type="text"
114
+ />
115
+ </div>
116
+ </div>
117
+ <div className={styles.createQueueModalFormRow}>
118
+ <div className={styles.createQueueModalFormControl}>
119
+ <TextInput
120
+ id="description"
121
+ value={description}
122
+ labelText="Description"
123
+ onChange={(e) => handleQueueDescription(e.target.value)}
124
+ type="text"
125
+ />
126
+ </div>
127
+ </div>
128
+ <div className={styles.createQueueModalFormRow}>
129
+ <div className={styles.createQueueModalFormControl}>
130
+ <Select id="service" labelText="Service Queue" onChange={(e) => handleQueueService(e.target.value)}>
131
+ <SelectItem value="" text="Select Queue" />
132
+ {queues.map((queue) => {
133
+ return <SelectItem value={queue.uuid} text={queue.display} />;
134
+ })}
135
+ </Select>
136
+ </div>
137
+ </div>
138
+ </div>
139
+ </div>
140
+ </ModalBody>
141
+ </Modal>
142
+ </>
143
+ );
144
+ };
145
+
146
+ export default EditQueueRoomModal;
@@ -0,0 +1,22 @@
1
+ .queueRoomListLayout{
2
+ display: flex;
3
+ flex-direction: column;
4
+ width: 100%;
5
+ row-gap: 10px;
6
+ .layoutAction{
7
+ display: flex;
8
+ flex-direction: row;
9
+ justify-content: flex-end;
10
+ width: 100%;
11
+ column-gap: 5px;
12
+ }
13
+ }
14
+
15
+ .actionBtns{
16
+ display: flex;
17
+ flex-direction: row;
18
+ column-gap: 10px;
19
+ }
20
+ .iconBtn:hover {
21
+ cursor: pointer;
22
+ }
@@ -0,0 +1,120 @@
1
+ import { showSnackbar, useSession } from '@openmrs/esm-framework';
2
+ import React, { useEffect, useState } from 'react';
3
+ import { deleteQueueRoom, getQueueRoomsByLocationUuid } from '../../../service-queues.resource';
4
+ import { type QueueRoom } from '../../../../types/types';
5
+ import styles from './queue-room-list.scss';
6
+ import { Button, IconButton, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@carbon/react';
7
+ import { Add, Delete, Edit } from '@carbon/react/icons';
8
+ import EditQueueModal from '../../queue/modal/edit-queue/edit-queue.modal';
9
+ import CreateQueueRoomModal from '../modal/create-queue-room/create-queue-room.modal';
10
+ import EditQueueRoomModal from '../modal/edit-queue-room/edit-queue-room.modal';
11
+ interface QueueRoomListProps {}
12
+ const QueueRoomList: React.FC<QueueRoomListProps> = () => {
13
+ const session = useSession();
14
+ const locationUuid = session.sessionLocation.uuid;
15
+ const [queueRooms, setQueueRooms] = useState<QueueRoom[]>([]);
16
+ const [selectedQueueRoom, setSelectedQueueRoom] = useState<QueueRoom>();
17
+ const [displayCreateRoomQueueModal, setDisplayCreateQueueRoomModal] = useState<boolean>(false);
18
+ const [displayEditQueueRoomModal, setDisplayEditQueueRoomModal] = useState<boolean>(false);
19
+ useEffect(() => {
20
+ fetchQueueRooms();
21
+ }, [locationUuid]);
22
+
23
+ const fetchQueueRooms = async () => {
24
+ const queueRooms = await getQueueRoomsByLocationUuid(locationUuid);
25
+ setQueueRooms(queueRooms);
26
+ };
27
+ const handleDeleteQueueRoom = async (queueUuid: string) => {
28
+ await deleteQueueRoom(queueUuid);
29
+ fetchQueueRooms();
30
+ showAlert('Queue Room deleted successfully', 'success');
31
+ };
32
+ const handleCloseCreateQueueRoomModal = () => {
33
+ setDisplayCreateQueueRoomModal(false);
34
+ };
35
+ const handleCloseEditQueueRoomModal = () => {
36
+ setDisplayEditQueueRoomModal(false);
37
+ fetchQueueRooms();
38
+ };
39
+ const handleEditQueueRoom = async (queue: QueueRoom) => {
40
+ setSelectedQueueRoom(queue);
41
+ setDisplayEditQueueRoomModal(true);
42
+ };
43
+ const handleAddQueue = async () => {
44
+ setDisplayCreateQueueRoomModal(true);
45
+ fetchQueueRooms();
46
+ };
47
+ const handleRefresh = () => {
48
+ fetchQueueRooms();
49
+ };
50
+ const showAlert = (message: string, alertType: 'success' | 'error') => {
51
+ showSnackbar({
52
+ kind: alertType,
53
+ title: 'Queue Deleted',
54
+ subtitle: message,
55
+ });
56
+ };
57
+ return (
58
+ <>
59
+ <div className={styles.queueRoomListLayout}>
60
+ <div className={styles.layoutHeader}>
61
+ <h4>Queue Room Management</h4>
62
+ </div>
63
+ <div className={styles.layoutAction}>
64
+ <IconButton label="Add" onClick={() => handleAddQueue()}>
65
+ <Add />
66
+ </IconButton>
67
+ <Button kind="ghost" onClick={handleRefresh}>
68
+ Refresh
69
+ </Button>
70
+ </div>
71
+ <div>
72
+ <Table>
73
+ <TableHead>
74
+ <TableRow>
75
+ <TableHeader>No</TableHeader>
76
+ <TableHeader>Name</TableHeader>
77
+ <TableHeader>Description</TableHeader>
78
+ <TableHeader>Location</TableHeader>
79
+ <TableHeader>Queue</TableHeader>
80
+ <TableHeader>Service</TableHeader>
81
+ <TableHeader>Action</TableHeader>
82
+ </TableRow>
83
+ </TableHead>
84
+ <TableBody>
85
+ {queueRooms.map((queueRoom, index) => (
86
+ <TableRow key={queueRoom.uuid}>
87
+ <TableCell>{index + 1}</TableCell>
88
+ <TableCell>{queueRoom.display}</TableCell>
89
+ <TableCell>{queueRoom.description}</TableCell>
90
+ <TableCell>{(queueRoom.queue.location.display as any).name}</TableCell>
91
+ <TableCell>{queueRoom.queue.display}</TableCell>
92
+ <TableCell>{queueRoom.queue.service.display}</TableCell>
93
+ <TableCell>
94
+ <div className={styles.actionBtns}>
95
+ <Delete onClick={() => handleDeleteQueueRoom(queueRoom.uuid)} className={styles.iconBtn} />
96
+ <Edit onClick={() => handleEditQueueRoom(queueRoom)} className={styles.iconBtn} />
97
+ </div>
98
+ </TableCell>
99
+ </TableRow>
100
+ ))}
101
+ </TableBody>
102
+ </Table>
103
+ </div>
104
+ <CreateQueueRoomModal open={displayCreateRoomQueueModal} onModalClose={handleCloseCreateQueueRoomModal} />
105
+ {selectedQueueRoom && displayEditQueueRoomModal ? (
106
+ <>
107
+ <EditQueueRoomModal
108
+ open={displayEditQueueRoomModal}
109
+ queueRoom={selectedQueueRoom}
110
+ onModalClose={handleCloseEditQueueRoomModal}
111
+ />
112
+ </>
113
+ ) : (
114
+ <></>
115
+ )}
116
+ </div>
117
+ </>
118
+ );
119
+ };
120
+ export default QueueRoomList;
@@ -0,0 +1,6 @@
1
+ .queueDashboardLayout{
2
+ display: flex;
3
+ flex-direction: column;
4
+ row-gap: 5px;
5
+ padding: 15px 15px;
6
+ }
@@ -0,0 +1,34 @@
1
+ import { Tab, TabList, TabPanel, TabPanels, Tabs } from '@carbon/react';
2
+ import React from 'react';
3
+ import AdminQueueList from './queue/queue-list/queue-list';
4
+ import styles from './service-queue-admin-dashboard.component.scss';
5
+ import QueueRoomList from './queue-room/queue-room-list/queue-room-list';
6
+ import QueueEntryList from './queue-entry/queue-entry-list.component';
7
+ interface ServiceQueueAdminDashboardProps {}
8
+ const ServiceQueueAdminDashboard: React.FC<ServiceQueueAdminDashboardProps> = () => {
9
+ return (
10
+ <>
11
+ <div className={styles.queueDashboardLayout}>
12
+ <Tabs>
13
+ <TabList contained>
14
+ <Tab>Service Queues</Tab>
15
+ <Tab>Queue Rooms</Tab>
16
+ <Tab>Queue Entries</Tab>
17
+ </TabList>
18
+ <TabPanels>
19
+ <TabPanel>
20
+ <AdminQueueList />
21
+ </TabPanel>
22
+ <TabPanel>
23
+ <QueueRoomList />
24
+ </TabPanel>
25
+ <TabPanel>
26
+ <QueueEntryList />
27
+ </TabPanel>
28
+ </TabPanels>
29
+ </Tabs>
30
+ </div>
31
+ </>
32
+ );
33
+ };
34
+ export default ServiceQueueAdminDashboard;
@@ -0,0 +1,7 @@
1
+ .consultationLayout{
2
+ display: flex;
3
+ flex-direction: column;
4
+ width: 100%;
5
+ padding: 15px 15px;
6
+ row-gap: 15px;
7
+ }
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import { QUEUE_SERVICE_UUIDS } from '../../shared/constants/concepts';
3
+ import ServiceQueueComponent from '../service-queue/service-queue.component';
4
+ const Consultation: React.FC = () => {
5
+ return (
6
+ <>
7
+ <ServiceQueueComponent
8
+ serviceTypeUuid={QUEUE_SERVICE_UUIDS.CLINICAL_CONSULTATION_SERVICE_UUID}
9
+ title="Clinical Consultation"
10
+ />
11
+ </>
12
+ );
13
+ };
14
+
15
+ export default Consultation;
@@ -0,0 +1,30 @@
1
+ .bannerLayout{
2
+ display: flex;
3
+ flex-direction: column;
4
+ width: 100%;
5
+ row-gap: 10px;
6
+ padding: 5px;
7
+ }
8
+ .sectionContent{
9
+ display: flex;
10
+ flex-direction: row;
11
+ column-gap: 15px;
12
+ justify-content: center;
13
+ align-items: center;
14
+ }
15
+ .transferBtn{
16
+ background-color: #FF5F1F;
17
+ color: #FFF;
18
+ }
19
+ .nonUrgentTag{
20
+ background-color:rgb(167, 240, 186);
21
+ color:rgb(14, 96, 39);
22
+ }
23
+ .emergencyTag{
24
+ background-color:rgb(255, 215, 217);
25
+ color:rgb(162, 25, 31);
26
+ }
27
+ .priorityTag{
28
+ background-color:rgb(248,237,98);
29
+ color:brown;
30
+ }
@@ -0,0 +1,108 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
2
+ import styles from './service-queue-patient-banner.scss';
3
+ import { Button, Tag } from '@carbon/react';
4
+ import { getTagClassByPriority } from '../../../shared/utils/get-tag-type';
5
+ import { useSession } from '@openmrs/esm-framework';
6
+ import { getActiveQueueEntryByPatientUuid } from '../../service-queues.resource';
7
+ import { type QueueEntry } from '../../../types/types';
8
+ import MovePatientModal from '../../modals/move/move-patient.component';
9
+
10
+ interface ServiceQueuePatientBannerProps {
11
+ renderedFrom: string;
12
+ patientUuid: string;
13
+ }
14
+ const ServiceQueuePatientBanner: React.FC<ServiceQueuePatientBannerProps> = ({ renderedFrom, patientUuid }) => {
15
+ const session = useSession();
16
+ const location = session.sessionLocation;
17
+ const [currentQueueEntry, setCurrentQueueEntry] = useState<QueueEntry>();
18
+ const [showTransferModal, setShowTransferModal] = useState<boolean>(false);
19
+ const isPatientChart = renderedFrom === 'patient-chart';
20
+ const getPatientCurrentServiceQueue = useCallback(async () => {
21
+ if (!patientUuid || !isPatientChart) return null;
22
+
23
+ try {
24
+ const resp = await getActiveQueueEntryByPatientUuid(patientUuid);
25
+ if (resp.length > 0) {
26
+ setCurrentQueueEntry(resp[0]);
27
+ } else {
28
+ setCurrentQueueEntry(null);
29
+ }
30
+ } catch (error) {
31
+ console.error(error);
32
+ }
33
+ }, [patientUuid]);
34
+ useEffect(() => {
35
+ getPatientCurrentServiceQueue();
36
+ }, [patientUuid]);
37
+
38
+ const redirectToRegistryPage = () => {
39
+ window.location.href = `${window.spaBase}/home/registry`;
40
+ };
41
+
42
+ const handleTransferModalClose = () => {
43
+ setShowTransferModal(false);
44
+ };
45
+ const displayTransferModal = () => {
46
+ setShowTransferModal(true);
47
+ };
48
+
49
+ const handleTransferSuccess = () => {
50
+ handleTransferModalClose();
51
+ redirectToRegistryPage();
52
+ };
53
+
54
+ function getPriorityDisplayName(name: string) {
55
+ if (name === 'NORMAL PRIORITY') {
56
+ return 'PRIORITY';
57
+ } else if (name === 'NOT URGENT') {
58
+ return 'NON URGENT PRIORITY';
59
+ } else {
60
+ return name;
61
+ }
62
+ }
63
+
64
+ if (!isPatientChart) {
65
+ return null;
66
+ }
67
+ return (
68
+ <>
69
+ {currentQueueEntry ? (
70
+ <>
71
+ <div className={styles.bannerLayout}>
72
+ <div className={styles.sectionContent}>
73
+ <div>
74
+ <span>{currentQueueEntry.queue.display}</span>
75
+ </div>
76
+ <div>
77
+ <Tag size="md" className={styles[getTagClassByPriority(currentQueueEntry.priority.display)]}>
78
+ {getPriorityDisplayName(currentQueueEntry.priority.display)}
79
+ </Tag>
80
+ </div>
81
+ <div>
82
+ <Button className={styles.transferBtn} size="xs" onClick={displayTransferModal}>
83
+ Transfer
84
+ </Button>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ {showTransferModal && location ? (
89
+ <>
90
+ <MovePatientModal
91
+ open={showTransferModal}
92
+ currentQueueEntryUuid={currentQueueEntry.uuid}
93
+ locationUuid={location.uuid}
94
+ onModalClose={handleTransferModalClose}
95
+ onTransferSuccess={handleTransferSuccess}
96
+ />
97
+ </>
98
+ ) : (
99
+ <></>
100
+ )}
101
+ </>
102
+ ) : (
103
+ <></>
104
+ )}
105
+ </>
106
+ );
107
+ };
108
+ export default ServiceQueuePatientBanner;
@@ -0,0 +1,38 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { useTranslation } from 'react-i18next';
3
+ import { MetricsCard, MetricsCardHeader, MetricsCardBody, MetricsCardItem } from './metrics-card.component';
4
+ import { useSession } from '@openmrs/esm-framework';
5
+ import { QUEUE_SERVICE_UUIDS } from '../../../shared/constants/concepts';
6
+ import { getServiceQueueByLocationUuid } from '../../service-queues.resource';
7
+ import { type QueueEntryResult } from '../../../registry/types';
8
+
9
+ export default function AttendedToPatientsExtension() {
10
+ const { t } = useTranslation();
11
+
12
+ const [consultationQueueEntries, setConsultationQueueEntries] = useState<QueueEntryResult[]>([]);
13
+ const session = useSession();
14
+ const locationUuid = session.sessionLocation.uuid;
15
+ const consultationServiceUuid = QUEUE_SERVICE_UUIDS.CLINICAL_CONSULTATION_SERVICE_UUID;
16
+ useEffect(() => {
17
+ getConsultationEntryQueues();
18
+ }, []);
19
+
20
+ const getConsultationEntryQueues = async () => {
21
+ const res = await getServiceQueueByLocationUuid(consultationServiceUuid, locationUuid);
22
+ setConsultationQueueEntries(res);
23
+ };
24
+
25
+ const attendedToPatientsCount = consultationQueueEntries?.filter((p) => p.status === 'COMPLETED').length ?? 0;
26
+
27
+ return (
28
+ <MetricsCard>
29
+ <MetricsCardHeader title={t('patientsAttendedTo', 'Patients attended to')} />
30
+ <MetricsCardBody>
31
+ <MetricsCardItem
32
+ label={t('patients', 'Patients')}
33
+ value={attendedToPatientsCount ? attendedToPatientsCount : '--'}
34
+ />
35
+ </MetricsCardBody>
36
+ </MetricsCard>
37
+ );
38
+ }