@kenyaemr/esm-service-queues-app 7.0.2-pre.65

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 (289) hide show
  1. package/.turbo/turbo-build.log +40 -0
  2. package/README.md +20 -0
  3. package/dist/130.js +2 -0
  4. package/dist/130.js.LICENSE.txt +3 -0
  5. package/dist/130.js.map +1 -0
  6. package/dist/152.js +1 -0
  7. package/dist/152.js.map +1 -0
  8. package/dist/169.js +1 -0
  9. package/dist/169.js.map +1 -0
  10. package/dist/185.js +1 -0
  11. package/dist/185.js.map +1 -0
  12. package/dist/233.js +1 -0
  13. package/dist/233.js.map +1 -0
  14. package/dist/237.js +1 -0
  15. package/dist/237.js.map +1 -0
  16. package/dist/255.js +2 -0
  17. package/dist/255.js.LICENSE.txt +9 -0
  18. package/dist/255.js.map +1 -0
  19. package/dist/271.js +1 -0
  20. package/dist/276.js +1 -0
  21. package/dist/276.js.map +1 -0
  22. package/dist/303.js +1 -0
  23. package/dist/303.js.map +1 -0
  24. package/dist/319.js +1 -0
  25. package/dist/401.js +1 -0
  26. package/dist/401.js.map +1 -0
  27. package/dist/430.js +2 -0
  28. package/dist/430.js.LICENSE.txt +50 -0
  29. package/dist/430.js.map +1 -0
  30. package/dist/460.js +1 -0
  31. package/dist/501.js +1 -0
  32. package/dist/501.js.map +1 -0
  33. package/dist/574.js +1 -0
  34. package/dist/591.js +2 -0
  35. package/dist/591.js.LICENSE.txt +32 -0
  36. package/dist/591.js.map +1 -0
  37. package/dist/644.js +1 -0
  38. package/dist/647.js +1 -0
  39. package/dist/647.js.map +1 -0
  40. package/dist/650.js +1 -0
  41. package/dist/650.js.map +1 -0
  42. package/dist/669.js +1 -0
  43. package/dist/669.js.map +1 -0
  44. package/dist/696.js +1 -0
  45. package/dist/696.js.map +1 -0
  46. package/dist/703.js +1 -0
  47. package/dist/703.js.map +1 -0
  48. package/dist/729.js +1 -0
  49. package/dist/729.js.map +1 -0
  50. package/dist/738.js +1 -0
  51. package/dist/738.js.map +1 -0
  52. package/dist/757.js +1 -0
  53. package/dist/764.js +1 -0
  54. package/dist/764.js.map +1 -0
  55. package/dist/784.js +2 -0
  56. package/dist/784.js.LICENSE.txt +9 -0
  57. package/dist/784.js.map +1 -0
  58. package/dist/788.js +1 -0
  59. package/dist/806.js +1 -0
  60. package/dist/806.js.map +1 -0
  61. package/dist/807.js +1 -0
  62. package/dist/833.js +1 -0
  63. package/dist/877.js +1 -0
  64. package/dist/877.js.map +1 -0
  65. package/dist/917.js +1 -0
  66. package/dist/917.js.map +1 -0
  67. package/dist/940.js +1 -0
  68. package/dist/940.js.map +1 -0
  69. package/dist/981.js +1 -0
  70. package/dist/981.js.map +1 -0
  71. package/dist/kenyaemr-esm-service-queues-app.js +1 -0
  72. package/dist/kenyaemr-esm-service-queues-app.js.buildmanifest.json +965 -0
  73. package/dist/kenyaemr-esm-service-queues-app.js.map +1 -0
  74. package/dist/main.js +2 -0
  75. package/dist/main.js.LICENSE.txt +60 -0
  76. package/dist/main.js.map +1 -0
  77. package/dist/routes.json +1 -0
  78. package/jest.config.js +3 -0
  79. package/package.json +54 -0
  80. package/src/active-visits/active-visits-row-actions.component.tsx +25 -0
  81. package/src/active-visits/active-visits-row-actions.scss +4 -0
  82. package/src/active-visits/active-visits-table.resource.ts +273 -0
  83. package/src/active-visits/change-status-dialog.component.tsx +272 -0
  84. package/src/active-visits/change-status-dialog.scss +47 -0
  85. package/src/active-visits/change-status-dialog.test.tsx +154 -0
  86. package/src/add-patient-toqueue/add-patient-toqueue-dialog.component.tsx +228 -0
  87. package/src/add-patient-toqueue/add-patient-toqueue-dialog.scss +32 -0
  88. package/src/add-provider-queue-room/add-provider-queue-room.component.tsx +238 -0
  89. package/src/add-provider-queue-room/add-provider-queue-room.resource.ts +76 -0
  90. package/src/add-provider-queue-room/add-provider-queue-room.scss +17 -0
  91. package/src/add-provider-queue-room/add-provider-queue-room.test.tsx +105 -0
  92. package/src/clear-queue-entries-dialog/clear-queue-entries-dialog.component.tsx +76 -0
  93. package/src/clear-queue-entries-dialog/clear-queue-entries-dialog.resource.ts +7 -0
  94. package/src/clear-queue-entries-dialog/clear-queue-entries-dialog.scss +8 -0
  95. package/src/clear-queue-entries-dialog/clear-queue-entries-dialog.test.tsx +43 -0
  96. package/src/clear-queue-entries-dialog/clear-queue-entries.component.tsx +43 -0
  97. package/src/config-schema.ts +465 -0
  98. package/src/constants.ts +10 -0
  99. package/src/createDashboardLink.component.tsx +39 -0
  100. package/src/current-visit/current-visit-summary.component.tsx +38 -0
  101. package/src/current-visit/current-visit-summary.test.tsx +43 -0
  102. package/src/current-visit/current-visit.resource.ts +84 -0
  103. package/src/current-visit/current-visit.scss +34 -0
  104. package/src/current-visit/hooks/useVitalsConceptMetadata.tsx +101 -0
  105. package/src/current-visit/visit-details/biometrics-config-schema.ts +14 -0
  106. package/src/current-visit/visit-details/current-visit-details.component.tsx +96 -0
  107. package/src/current-visit/visit-details/triage-note.component.tsx +53 -0
  108. package/src/current-visit/visit-details/triage-note.scss +89 -0
  109. package/src/current-visit/visit-details/vitals-config-schema.ts +17 -0
  110. package/src/current-visit/visit-details/vitals.component.tsx +165 -0
  111. package/src/dashboard.meta.ts +5 -0
  112. package/src/declarations.d.ts +4 -0
  113. package/src/helpers/functions.ts +28 -0
  114. package/src/helpers/helpers.ts +177 -0
  115. package/src/helpers/time-helpers.ts +15 -0
  116. package/src/home.component.tsx +16 -0
  117. package/src/home.test.tsx +48 -0
  118. package/src/hooks/useConcept.ts +13 -0
  119. package/src/hooks/useQueue.ts +10 -0
  120. package/src/hooks/useQueueEntries.ts +187 -0
  121. package/src/hooks/useQueues.ts +22 -0
  122. package/src/hooks/useSystemSetting.ts +18 -0
  123. package/src/index.ts +172 -0
  124. package/src/past-visit/past-visit-details/encounter-list.component.tsx +54 -0
  125. package/src/past-visit/past-visit-details/medications-list.component.tsx +98 -0
  126. package/src/past-visit/past-visit-details/notes-list.component.tsx +41 -0
  127. package/src/past-visit/past-visit-details/past-visit-summary.component.tsx +181 -0
  128. package/src/past-visit/past-visit-details/past-visit-summary.scss +58 -0
  129. package/src/past-visit/past-visit.component.tsx +37 -0
  130. package/src/past-visit/past-visit.resource.ts +83 -0
  131. package/src/past-visit/past-visit.scss +126 -0
  132. package/src/past-visit/past-visit.test.tsx +41 -0
  133. package/src/patient-info/appointment-details.component.tsx +98 -0
  134. package/src/patient-info/appointment-details.scss +34 -0
  135. package/src/patient-info/appointment-details.test.tsx +36 -0
  136. package/src/patient-info/appointments.resource.ts +43 -0
  137. package/src/patient-info/hooks/usePatientAttributes.tsx +42 -0
  138. package/src/patient-info/patient-info.component.tsx +82 -0
  139. package/src/patient-info/patient-info.scss +60 -0
  140. package/src/patient-info/patient-info.test.tsx +43 -0
  141. package/src/patient-queue-header/patient-queue-header.component.tsx +99 -0
  142. package/src/patient-queue-header/patient-queue-header.scss +90 -0
  143. package/src/patient-queue-header/patient-queue-illustration.component.tsx +22 -0
  144. package/src/patient-queue-metrics/clinic-metrics.component.tsx +98 -0
  145. package/src/patient-queue-metrics/clinic-metrics.resource.ts +58 -0
  146. package/src/patient-queue-metrics/clinic-metrics.scss +11 -0
  147. package/src/patient-queue-metrics/clinic-metrics.test.tsx +76 -0
  148. package/src/patient-queue-metrics/metrics-card.component.tsx +68 -0
  149. package/src/patient-queue-metrics/metrics-card.scss +80 -0
  150. package/src/patient-queue-metrics/metrics-header.component.tsx +61 -0
  151. package/src/patient-queue-metrics/metrics-header.scss +26 -0
  152. package/src/patient-queue-metrics/queue-metrics.resource.ts +42 -0
  153. package/src/patient-search/advanced-search.component.tsx +191 -0
  154. package/src/patient-search/advanced-search.scss +154 -0
  155. package/src/patient-search/advanced-search.test.tsx +29 -0
  156. package/src/patient-search/basic-search.component.tsx +112 -0
  157. package/src/patient-search/basic-search.scss +139 -0
  158. package/src/patient-search/basic-search.test.tsx +23 -0
  159. package/src/patient-search/empty-data-illustration.component.tsx +41 -0
  160. package/src/patient-search/hooks/useActivePatientEnrollment.tsx +29 -0
  161. package/src/patient-search/hooks/useDefaultLocation.ts +14 -0
  162. package/src/patient-search/hooks/usePatients.tsx +25 -0
  163. package/src/patient-search/hooks/useQueueLocations.tsx +23 -0
  164. package/src/patient-search/hooks/useRecommendedVisitTypes.tsx +35 -0
  165. package/src/patient-search/hooks/useScheduledVisits.ts +52 -0
  166. package/src/patient-search/patient-scheduled-visits.component.tsx +324 -0
  167. package/src/patient-search/patient-scheduled-visits.scss +131 -0
  168. package/src/patient-search/patient-scheduled-visits.test.tsx +44 -0
  169. package/src/patient-search/patient-search.scss +43 -0
  170. package/src/patient-search/patient-search.workspace.tsx +135 -0
  171. package/src/patient-search/search-illustration.component.tsx +27 -0
  172. package/src/patient-search/search-results.component.tsx +75 -0
  173. package/src/patient-search/search-results.scss +80 -0
  174. package/src/patient-search/search-results.test.tsx +77 -0
  175. package/src/patient-search/search.resource.ts +10 -0
  176. package/src/patient-search/visit-form/existing-visit-form.component.tsx +112 -0
  177. package/src/patient-search/visit-form/queue.resource.ts +64 -0
  178. package/src/patient-search/visit-form/visit-form.component.tsx +344 -0
  179. package/src/patient-search/visit-form/visit-form.scss +73 -0
  180. package/src/patient-search/visit-form/visit-type-selector.component.tsx +155 -0
  181. package/src/patient-search/visit-form/visit-type-selector.scss +100 -0
  182. package/src/patient-search/visit-form/visit-type-selector.test.tsx +83 -0
  183. package/src/patient-search/visit-form-queue-fields/visit-form-queue-fields.component.tsx +178 -0
  184. package/src/patient-search/visit-form-queue-fields/visit-form-queue-fields.scss +19 -0
  185. package/src/patient-search/visit-form-queue-fields/visit-form-queue-fields.test.tsx +63 -0
  186. package/src/queue-entry-table-components/edit-entry.scss +14 -0
  187. package/src/queue-entry-table-components/queue-duration.component.tsx +41 -0
  188. package/src/queue-entry-table-components/queue-priority.component.tsx +38 -0
  189. package/src/queue-entry-table-components/queue-priority.scss +12 -0
  190. package/src/queue-entry-table-components/queue-status.component.tsx +39 -0
  191. package/src/queue-entry-table-components/transition-entry.component.tsx +55 -0
  192. package/src/queue-entry-table-components/transition-entry.scss +22 -0
  193. package/src/queue-patient-linelists/queue-linelist-base-table.component.tsx +241 -0
  194. package/src/queue-patient-linelists/queue-linelist-base-table.scss +110 -0
  195. package/src/queue-patient-linelists/queue-linelist-base-table.test.tsx +93 -0
  196. package/src/queue-patient-linelists/queue-linelist-filter.scss +63 -0
  197. package/src/queue-patient-linelists/queue-linelist-filter.test.tsx +94 -0
  198. package/src/queue-patient-linelists/queue-linelist-filter.workspace.tsx +185 -0
  199. package/src/queue-patient-linelists/queue-linelist.resource.ts +84 -0
  200. package/src/queue-patient-linelists/queue-services-table.component.tsx +63 -0
  201. package/src/queue-patient-linelists/scheduled-appointments-table.component.tsx +305 -0
  202. package/src/queue-patient-linelists/scheduled-appointments-table.test.tsx +41 -0
  203. package/src/queue-rooms/queue-room-form.scss +56 -0
  204. package/src/queue-rooms/queue-room-form.test.tsx +80 -0
  205. package/src/queue-rooms/queue-room-form.workspace.tsx +169 -0
  206. package/src/queue-rooms/queue-room.resource.ts +20 -0
  207. package/src/queue-screen/queue-screen.component.tsx +47 -0
  208. package/src/queue-screen/queue-screen.scss +39 -0
  209. package/src/queue-screen/queue-screen.test.tsx +51 -0
  210. package/src/queue-screen/useActiveTickets.tsx +13 -0
  211. package/src/queue-services/queue-service-form.scss +61 -0
  212. package/src/queue-services/queue-service-form.test.tsx +60 -0
  213. package/src/queue-services/queue-service-form.workspace.tsx +179 -0
  214. package/src/queue-services/queue-service.resource.ts +33 -0
  215. package/src/queue-table/cells/columns.resource.ts +135 -0
  216. package/src/queue-table/cells/queue-table-action-cell.component.tsx +88 -0
  217. package/src/queue-table/cells/queue-table-action-cell.scss +7 -0
  218. package/src/queue-table/cells/queue-table-coming-from-cell.component.tsx +13 -0
  219. package/src/queue-table/cells/queue-table-extension-cell.component.tsx +16 -0
  220. package/src/queue-table/cells/queue-table-name-cell.component.tsx +20 -0
  221. package/src/queue-table/cells/queue-table-patient-age-cell.component.tsx +18 -0
  222. package/src/queue-table/cells/queue-table-patient-identifier-cell.component.tsx +25 -0
  223. package/src/queue-table/cells/queue-table-priority-cell.component.tsx +23 -0
  224. package/src/queue-table/cells/queue-table-queue-name-cell.component.tsx +14 -0
  225. package/src/queue-table/cells/queue-table-status-cell.component.tsx +18 -0
  226. package/src/queue-table/cells/queue-table-visit-attribute-queue-number-cell.component.tsx +37 -0
  227. package/src/queue-table/cells/queue-table-visit-start-time-cell.component.tsx +20 -0
  228. package/src/queue-table/cells/queue-table-wait-time-cell.component.tsx +17 -0
  229. package/src/queue-table/default-queue-table.component.tsx +174 -0
  230. package/src/queue-table/default-queue-table.test.tsx +131 -0
  231. package/src/queue-table/queue-entry-actions/edit-queue-entry-modal.component.tsx +52 -0
  232. package/src/queue-table/queue-entry-actions/end-queue-entry-modal.component.tsx +39 -0
  233. package/src/queue-table/queue-entry-actions/queue-entry-actions-modal.component.tsx +362 -0
  234. package/src/queue-table/queue-entry-actions/queue-entry-actions-modal.test.tsx +152 -0
  235. package/src/queue-table/queue-entry-actions/queue-entry-actions.resource.ts +83 -0
  236. package/src/queue-table/queue-entry-actions/queue-entry-actons-modal.scss +36 -0
  237. package/src/queue-table/queue-entry-actions/queue-entry-confirm-action-modal.component.tsx +97 -0
  238. package/src/queue-table/queue-entry-actions/queue-entry-confirm-action-modal.test.tsx +106 -0
  239. package/src/queue-table/queue-entry-actions/queue-entry-undo-actions-modal.test.tsx +76 -0
  240. package/src/queue-table/queue-entry-actions/transition-queue-entry-modal.component.tsx +51 -0
  241. package/src/queue-table/queue-entry-actions/undo-transition-queue-entry-modal.component.tsx +58 -0
  242. package/src/queue-table/queue-entry-actions/void-queue-entry-modal.component.tsx +34 -0
  243. package/src/queue-table/queue-table-by-status-menu.component.tsx +42 -0
  244. package/src/queue-table/queue-table-by-status-menu.scss +11 -0
  245. package/src/queue-table/queue-table-by-status-skeleton.component.tsx +32 -0
  246. package/src/queue-table/queue-table-by-status.component.tsx +96 -0
  247. package/src/queue-table/queue-table-expanded-row.component.tsx +29 -0
  248. package/src/queue-table/queue-table-metrics-card.component.tsx +50 -0
  249. package/src/queue-table/queue-table-metrics-card.scss +48 -0
  250. package/src/queue-table/queue-table-metrics.component.tsx +30 -0
  251. package/src/queue-table/queue-table-metrics.scss +11 -0
  252. package/src/queue-table/queue-table.component.tsx +179 -0
  253. package/src/queue-table/queue-table.scss +192 -0
  254. package/src/queue-table/queue-table.test.tsx +210 -0
  255. package/src/remove-queue-entry-dialog/remove-queue-entry.component.tsx +87 -0
  256. package/src/remove-queue-entry-dialog/remove-queue-entry.resource.ts +93 -0
  257. package/src/remove-queue-entry-dialog/remove-queue-entry.scss +7 -0
  258. package/src/remove-queue-entry-dialog/remove-queue-entry.test.tsx +45 -0
  259. package/src/root.component.tsx +28 -0
  260. package/src/root.scss +15 -0
  261. package/src/root.test.tsx +24 -0
  262. package/src/routes.json +133 -0
  263. package/src/side-menu/nav-group/createNavGroup.tsx +17 -0
  264. package/src/side-menu/nav-group/nav-group.component.tsx +24 -0
  265. package/src/side-menu/nav-group/nav-group.test.tsx +32 -0
  266. package/src/side-menu/nav-group/nav-group.ts +10 -0
  267. package/src/side-menu/side-menu.component.tsx +6 -0
  268. package/src/side-menu/side-menu.test.tsx +17 -0
  269. package/src/transition-queue-entry/transition-queue-entry-dialog.component.tsx +134 -0
  270. package/src/transition-queue-entry/transition-queue-entry-dialog.scss +12 -0
  271. package/src/transition-queue-entry/transition-queue-entry-dialog.test.tsx +102 -0
  272. package/src/transition-queue-entry/transition-queue-entry.resource.ts +16 -0
  273. package/src/types/index.ts +494 -0
  274. package/src/views/queue-table-by-status-view.component.tsx +25 -0
  275. package/src/views/queue-tables-for-all-statuses.component.tsx +150 -0
  276. package/src/visits-missing-inqueue/visits-missing-inqueue.component.tsx +277 -0
  277. package/src/visits-missing-inqueue/visits-missing-inqueue.resource.ts +93 -0
  278. package/src/visits-missing-inqueue/visits-missing-inqueue.scss +108 -0
  279. package/translations/am.json +295 -0
  280. package/translations/ar.json +295 -0
  281. package/translations/en.json +305 -0
  282. package/translations/es.json +295 -0
  283. package/translations/fr.json +295 -0
  284. package/translations/he.json +295 -0
  285. package/translations/km.json +295 -0
  286. package/translations/zh.json +295 -0
  287. package/translations/zh_CN.json +295 -0
  288. package/tsconfig.json +5 -0
  289. package/webpack.config.js +1 -0
@@ -0,0 +1,494 @@
1
+ import { type Visit, type OpenmrsResource, type Location, type Patient } from '@openmrs/esm-framework';
2
+ import type React from 'react';
3
+ import { type ColumnConfig } from '../config-schema';
4
+
5
+ export enum SearchTypes {
6
+ BASIC = 'basic',
7
+ ADVANCED = 'advanced',
8
+ SEARCH_RESULTS = 'search_results',
9
+ SCHEDULED_VISITS = 'scheduled-visits',
10
+ VISIT_FORM = 'visit_form',
11
+ }
12
+
13
+ export interface Attribute {
14
+ attributeType: OpenmrsResource;
15
+ display: string;
16
+ uuid: string;
17
+ value: string | number;
18
+ }
19
+
20
+ export interface AppointmentsFetchResponse {
21
+ data: Array<Appointment>;
22
+ }
23
+
24
+ export interface Appointment {
25
+ appointmentKind: string;
26
+ appointmentNumber: string;
27
+ comments: string;
28
+ endDateTime: Date | number;
29
+ location: OpenmrsResource;
30
+ patient: {
31
+ uuid: string;
32
+ name: string;
33
+ identifier: string;
34
+ gender: string;
35
+ age: string;
36
+ phoneNumber: string;
37
+ };
38
+ provider: OpenmrsResource;
39
+ providers: Array<OpenmrsResource>;
40
+ // recurring: boolean;
41
+ service: AppointmentService;
42
+ startDateTime: number | any;
43
+ status: string;
44
+ uuid: string;
45
+ }
46
+
47
+ export interface ServiceTypes {
48
+ duration: number;
49
+ name: string;
50
+ uuid: string;
51
+ }
52
+
53
+ export interface AppointmentService {
54
+ appointmentServiceId: number;
55
+ color: string;
56
+ creatorName: string;
57
+ description: string;
58
+ durationMins: string;
59
+ endTime: string;
60
+ initialAppointmentStatus: string;
61
+ location: OpenmrsResource;
62
+ maxAppointmentsLimit: number | null;
63
+ name: string;
64
+ speciality: OpenmrsResource;
65
+ startTime: string;
66
+ uuid: string;
67
+ serviceTypes: Array<ServiceTypes>;
68
+ }
69
+
70
+ export interface Note {
71
+ concept: OpenmrsResource;
72
+ note: string;
73
+ provider: {
74
+ name: string;
75
+ role: string;
76
+ };
77
+ time: string;
78
+ }
79
+
80
+ export interface Order {
81
+ uuid: string;
82
+ dateActivated: string;
83
+ dateStopped?: Date | null;
84
+ dose: number;
85
+ dosingInstructions: string | null;
86
+ dosingType?: 'org.openmrs.FreeTextDosingInstructions' | 'org.openmrs.SimpleDosingInstructions';
87
+ doseUnits: {
88
+ uuid: string;
89
+ display: string;
90
+ };
91
+ drug: {
92
+ uuid: string;
93
+ name: string;
94
+ strength: string;
95
+ };
96
+ duration: number;
97
+ durationUnits: {
98
+ uuid: string;
99
+ display: string;
100
+ };
101
+ frequency: {
102
+ uuid: string;
103
+ display: string;
104
+ };
105
+ numRefills: number;
106
+ orderNumber: string;
107
+ orderReason: string | null;
108
+ orderReasonNonCoded: string | null;
109
+ orderer: {
110
+ uuid: string;
111
+ person: {
112
+ uuid: string;
113
+ display: string;
114
+ };
115
+ };
116
+ orderType: {
117
+ uuid: string;
118
+ display: string;
119
+ };
120
+ route: {
121
+ uuid: string;
122
+ display: string;
123
+ };
124
+ quantity: number;
125
+ quantityUnits: OpenmrsResource;
126
+ }
127
+
128
+ export interface OrderItem {
129
+ order: Order;
130
+ provider: {
131
+ name: string;
132
+ role: string;
133
+ };
134
+ time: string;
135
+ }
136
+
137
+ export interface DiagnosisItem {
138
+ diagnosis: string;
139
+ }
140
+
141
+ export interface Encounter {
142
+ uuid: string;
143
+ encounterDatetime: string;
144
+ encounterProviders: Array<{
145
+ uuid: string;
146
+ display: string;
147
+ encounterRole: {
148
+ uuid: string;
149
+ display: string;
150
+ };
151
+ provider: {
152
+ uuid: string;
153
+ person: {
154
+ uuid: string;
155
+ display: string;
156
+ };
157
+ };
158
+ }>;
159
+ encounterType: {
160
+ uuid: string;
161
+ display: string;
162
+ };
163
+ obs: Array<Observation>;
164
+ form: OpenmrsResource;
165
+ patient: OpenmrsResource;
166
+ orders: Array<Order>;
167
+ }
168
+
169
+ export interface Observation {
170
+ uuid: string;
171
+ concept: {
172
+ uuid: string;
173
+ display: string;
174
+ conceptClass: {
175
+ uuid: string;
176
+ display: string;
177
+ };
178
+ };
179
+ display: string;
180
+ groupMembers: null | Array<{
181
+ uuid: string;
182
+ concept: {
183
+ uuid: string;
184
+ display: string;
185
+ };
186
+ value: {
187
+ uuid: string;
188
+ display: string;
189
+ };
190
+ }>;
191
+ value: any;
192
+ obsDatetime: string;
193
+ }
194
+
195
+ export interface PatientVitals {
196
+ systolic?: number;
197
+ diastolic?: number;
198
+ pulse?: number;
199
+ temperature?: number;
200
+ oxygenSaturation?: number;
201
+ height?: number;
202
+ weight?: number;
203
+ bmi?: number | null;
204
+ respiratoryRate?: number;
205
+ muac?: number;
206
+ provider?: {
207
+ name: string;
208
+ role: string;
209
+ };
210
+ time?: string;
211
+ }
212
+
213
+ export interface MappedEncounter {
214
+ id: string;
215
+ datetime: string;
216
+ encounterType: string;
217
+ form: OpenmrsResource;
218
+ obs: Array<Observation>;
219
+ provider: string;
220
+ visitUuid?: string;
221
+ }
222
+
223
+ export interface FormattedEncounter {
224
+ id: string;
225
+ datetime: string;
226
+ encounterType: string;
227
+ form: OpenmrsResource;
228
+ obs: Array<Observation>;
229
+ provider: string;
230
+ }
231
+
232
+ export interface ObsMetaInfo {
233
+ [_: string]: any;
234
+
235
+ assessValue?: (value: number) => OBSERVATION_INTERPRETATION;
236
+ }
237
+
238
+ export type OBSERVATION_INTERPRETATION =
239
+ | 'NORMAL'
240
+ | 'HIGH'
241
+ | 'CRITICALLY_HIGH'
242
+ | 'OFF_SCALE_HIGH'
243
+ | 'LOW'
244
+ | 'CRITICALLY_LOW'
245
+ | 'OFF_SCALE_LOW'
246
+ | '--';
247
+
248
+ export interface PatientProgram {
249
+ uuid: string;
250
+ display: string;
251
+ patient: OpenmrsResource;
252
+ program: OpenmrsResource;
253
+ dateEnrolled: string;
254
+ dateCompleted: string;
255
+ location: OpenmrsResource;
256
+ }
257
+
258
+ export interface AppointmentCountMap {
259
+ allAppointmentsCount: number;
260
+ missedAppointmentsCount;
261
+ appointmentDate: number;
262
+ appointmentServiceUuid: string;
263
+ }
264
+
265
+ export interface AppointmentSummary {
266
+ appointmentService: { name: string };
267
+ appointmentCountMap: Record<string, AppointmentCountMap>;
268
+ }
269
+
270
+ export interface QueueEntryPayload {
271
+ visit: { uuid: string };
272
+ queueEntry: {
273
+ status: { uuid: string };
274
+ priority: { uuid: string };
275
+ queue: { uuid: string };
276
+ patient: { uuid: string };
277
+ startedAt: Date;
278
+ sortWeight: number;
279
+ };
280
+ }
281
+
282
+ export type AllowedPriority = OpenmrsResource;
283
+ export type AllowedStatus = OpenmrsResource;
284
+
285
+ // TODO: remove this in favor of Queue
286
+ export interface QueueServiceInfo {
287
+ uuid: string;
288
+ display: string;
289
+ name: string;
290
+ description: string;
291
+ allowedPriorities: Array<AllowedPriority>;
292
+ allowedStatuses: Array<AllowedStatus>;
293
+ }
294
+
295
+ export interface MappedServiceQueueEntry {
296
+ id: string;
297
+ name: string;
298
+ age: string;
299
+ gender: string;
300
+ visitType: string;
301
+ returnDate: string;
302
+ patientUuid: string;
303
+ }
304
+
305
+ export enum FilterTypes {
306
+ SHOW,
307
+ HIDE,
308
+ }
309
+
310
+ export interface Provider {
311
+ uuid: string;
312
+ display: string;
313
+ comments: string;
314
+ response?: string;
315
+ person: OpenmrsResource;
316
+ location: string;
317
+ serviceType: string;
318
+ }
319
+
320
+ export interface MappedQueueEntry {
321
+ id: string;
322
+ name: string;
323
+ patientAge: string;
324
+ patientSex: string;
325
+ patientDob: string;
326
+ patientUuid: string;
327
+ queue: Queue;
328
+ priority: Concept;
329
+ priorityComment: string;
330
+ status: Concept;
331
+ visitType: string;
332
+ visitUuid: string;
333
+ waitTime: string;
334
+ queueEntryUuid: string;
335
+ queueLocation: string;
336
+ sortWeight: string;
337
+ }
338
+
339
+ export interface EndVisitPayload {
340
+ location: string;
341
+ startDatetime: Date;
342
+ visitType: string;
343
+ stopDatetime: Date;
344
+ }
345
+
346
+ export interface LocationResponse {
347
+ type: string;
348
+ total: number;
349
+ resourceType: string;
350
+ meta: {
351
+ lastUpdated: string;
352
+ };
353
+ link: Array<{
354
+ relation: string;
355
+ url: string;
356
+ }>;
357
+ id: string;
358
+ entry: Array<LocationEntry>;
359
+ }
360
+
361
+ export interface LocationEntry {
362
+ resource: Resource;
363
+ }
364
+
365
+ export interface Resource {
366
+ id: string;
367
+ name: string;
368
+ resourceType: string;
369
+ status: 'active' | 'inactive';
370
+ meta?: {
371
+ tag?: Array<{
372
+ code: string;
373
+ display: string;
374
+ system: string;
375
+ }>;
376
+ };
377
+ }
378
+
379
+ export interface Identifer {
380
+ identifier: string;
381
+ display: string;
382
+ uuid: string;
383
+ identifierType: {
384
+ uuid: string;
385
+ display: string;
386
+ };
387
+ }
388
+
389
+ export interface NewVisitPayload {
390
+ uuid?: string;
391
+ location: string;
392
+ patient?: string;
393
+ startDatetime: Date;
394
+ visitType: string;
395
+ stopDatetime?: Date;
396
+ attributes?: Array<{
397
+ attributeType: string;
398
+ value: string;
399
+ }>;
400
+ }
401
+
402
+ export interface QueueRoom {
403
+ uuid: string;
404
+ display: string;
405
+ name: string;
406
+ description: string;
407
+ }
408
+
409
+ export interface ProvidersQueueRoom {
410
+ uuid: string;
411
+ provider: {
412
+ uuid: string;
413
+ display: string;
414
+ };
415
+ queueRoom: {
416
+ uuid: string;
417
+ name: string;
418
+ display: string;
419
+ };
420
+ }
421
+
422
+ export interface WaitTime {
423
+ metric: string;
424
+ averageWaitTime: string;
425
+ }
426
+
427
+ export interface QueueTableCellComponentProps {
428
+ queueEntry: QueueEntry;
429
+ }
430
+
431
+ export type QueueTableColumn = {
432
+ key: string; // key used by DataTable, MUST be unique for each column in the queue table
433
+ header: string; // header of the column
434
+ CellComponent: React.FC<QueueTableCellComponentProps>;
435
+
436
+ // function to extract from the queue entry a searchable string representing the its value within this column.
437
+ // May be null to make this column's content unsearchable
438
+ getFilterableValue: (queueEntry: QueueEntry) => string | null;
439
+ };
440
+
441
+ export type QueueTableColumnFunction = (
442
+ key: string, // a unique key for the column
443
+ header?: string,
444
+ config?: ColumnConfig,
445
+ ) => QueueTableColumn;
446
+
447
+ export interface QueueTableTabConfig {
448
+ columns: QueueTableColumn[];
449
+ tabNameI18nKey?: string;
450
+ }
451
+
452
+ export interface Queue {
453
+ uuid: string;
454
+ display: string;
455
+ name: string;
456
+ description: string;
457
+ location: Location;
458
+ service: Concept;
459
+ allowedPriorities: Array<Concept>;
460
+ allowedStatuses: Array<Concept>;
461
+ }
462
+
463
+ export interface QueueEntry {
464
+ uuid: string;
465
+ display: string;
466
+ endedAt: string;
467
+ locationWaitingFor: Location;
468
+ patient: Patient;
469
+ priority: Concept;
470
+ priorityComment: string | null;
471
+ providerWaitingFor: Provider;
472
+ queue: Queue;
473
+ startedAt: string;
474
+ status: Concept;
475
+ visit: Visit;
476
+ sortWeight: number;
477
+ queueComingFrom: Queue;
478
+ previousQueueEntry: QueueEntry;
479
+ }
480
+
481
+ export interface QueueEntrySearchCriteria {
482
+ queue?: Array<string> | string;
483
+ location?: Array<string> | string;
484
+ service?: Array<string> | string;
485
+ status?: Array<string> | string;
486
+ isEnded: boolean;
487
+ }
488
+
489
+ // TODO: The follow types match the types from backend.
490
+ // They should be common enough to move to esm-core
491
+
492
+ export interface Concept extends OpenmrsResource {}
493
+
494
+ export interface Provider extends OpenmrsResource {}
@@ -0,0 +1,25 @@
1
+ import { InlineNotification } from '@carbon/react';
2
+ import React from 'react';
3
+ import { useTranslation } from 'react-i18next';
4
+ import { useParams } from 'react-router-dom';
5
+ import { useQueue } from '../hooks/useQueue';
6
+ import QueueTableByStatus from '../queue-table/queue-table-by-status.component';
7
+ import { QueueTableByStatusSkeleton } from '../queue-table/queue-table-by-status-skeleton.component';
8
+ import QueueTablesForAllStatuses from './queue-tables-for-all-statuses.component';
9
+
10
+ const QueueTableByStatusView: React.FC = () => {
11
+ const { queueUuid, statusUuid } = useParams();
12
+ const { queue, isLoading } = useQueue(queueUuid);
13
+ const status = queue?.allowedStatuses.find((s) => s.uuid == statusUuid);
14
+ const { t } = useTranslation();
15
+
16
+ if (isLoading) {
17
+ return <QueueTableByStatusSkeleton />;
18
+ } else if (!queue) {
19
+ return <InlineNotification kind="error" title={t('invalidQueue', 'Invalid Queue')} />;
20
+ } else {
21
+ return <QueueTablesForAllStatuses selectedQueue={queue} />;
22
+ }
23
+ };
24
+
25
+ export default QueueTableByStatusView;
@@ -0,0 +1,150 @@
1
+ import React, { useCallback, useState } from 'react';
2
+ import { InlineNotification, Search } from '@carbon/react';
3
+ import { Add } from '@carbon/react/icons';
4
+ import { ExtensionSlot, isDesktop, launchWorkspace, showToast, useLayoutType } from '@openmrs/esm-framework';
5
+ import { useTranslation } from 'react-i18next';
6
+ import { useQueueEntries } from '../hooks/useQueueEntries';
7
+ import { useColumns } from '../queue-table/cells/columns.resource';
8
+ import { QueueTableByStatusSkeleton } from '../queue-table/queue-table-by-status-skeleton.component';
9
+ import QueueTable from '../queue-table/queue-table.component';
10
+ import QueueTableMetrics from '../queue-table/queue-table-metrics.component';
11
+ import styles from '../queue-table/queue-table.scss';
12
+ import type { Concept, Queue, QueueEntry } from '../types';
13
+
14
+ interface QueueTablesForAllStatusesProps {
15
+ selectedQueue: Queue; // the selected queue
16
+ }
17
+
18
+ // displays the queue entries of a given queue by
19
+ // showing one table per status
20
+ const QueueTablesForAllStatuses: React.FC<QueueTablesForAllStatusesProps> = ({ selectedQueue }) => {
21
+ const layout = useLayoutType();
22
+ const { t } = useTranslation();
23
+
24
+ const { queueEntries, isLoading, isValidating } = useQueueEntries({ queue: selectedQueue.uuid, isEnded: false });
25
+ const allowedStatuses = selectedQueue.allowedStatuses;
26
+ const [searchTerm, setSearchTerm] = useState('');
27
+
28
+ const noStatuses = !allowedStatuses?.length;
29
+ if (isLoading && !queueEntries.length) {
30
+ return <QueueTableByStatusSkeleton />;
31
+ } else if (noStatuses) {
32
+ return (
33
+ <InlineNotification
34
+ kind={'error'}
35
+ lowContrast
36
+ subtitle={t('configureStatus', 'Please configure status to continue.')}
37
+ title={t('noStatusConfigured', 'No status configured')}
38
+ />
39
+ );
40
+ }
41
+
42
+ return (
43
+ <div className={styles.container}>
44
+ <div className={styles.headerContainer}>
45
+ <div className={isDesktop(layout) ? styles.desktopHeading : styles.tabletHeading}>
46
+ <h3>{selectedQueue.display}</h3>
47
+ </div>
48
+ <div>
49
+ <QueueTableMetrics selectedQueue={selectedQueue} />
50
+ </div>
51
+ <div className={styles.headerButtons}>
52
+ <ExtensionSlot
53
+ name="patient-search-button-slot"
54
+ state={{
55
+ buttonText: t('addPatientToQueue', 'Add patient to queue'),
56
+ overlayHeader: t('addPatientToQueue', 'Add patient to queue'),
57
+ buttonProps: {
58
+ kind: 'secondary',
59
+ renderIcon: (props) => <Add size={16} {...props} />,
60
+ size: 'sm',
61
+ },
62
+ selectPatientAction: (selectedPatientUuid) => {
63
+ launchWorkspace('service-queues-patient-search', {
64
+ selectedPatientUuid,
65
+ currentServiceQueueUuid: selectedQueue.uuid,
66
+ });
67
+ },
68
+ }}
69
+ />
70
+ <Search
71
+ labelText=""
72
+ placeholder={t('filterTable', 'Filter table')}
73
+ onChange={(e) => setSearchTerm(e.target.value)}
74
+ size={isDesktop(layout) ? 'sm' : 'lg'}
75
+ />
76
+ </div>
77
+ </div>
78
+ {allowedStatuses?.map((status) => (
79
+ <QueueTableForQueueAndStatus
80
+ key={status.uuid}
81
+ queueEntries={queueEntries}
82
+ searchTerm={searchTerm}
83
+ queue={selectedQueue}
84
+ status={status}
85
+ isValidating={isValidating}
86
+ />
87
+ ))}
88
+ </div>
89
+ );
90
+ };
91
+
92
+ interface QueueTableForQueueAndStatus {
93
+ queueEntries: QueueEntry[];
94
+ isValidating: boolean;
95
+ searchTerm: string;
96
+ queue: Queue;
97
+ status: Concept;
98
+ }
99
+
100
+ // renders a table for a particular queue and status within the QueueTablesForAllStatuses view
101
+ function QueueTableForQueueAndStatus({
102
+ queueEntries,
103
+ isValidating,
104
+ searchTerm,
105
+ queue,
106
+ status,
107
+ }: QueueTableForQueueAndStatus) {
108
+ const statusUuid = status.uuid;
109
+ const columns = useColumns(queue.uuid, statusUuid);
110
+ const { t } = useTranslation();
111
+
112
+ if (!columns) {
113
+ showToast({
114
+ title: t('invalidtableConfig', 'Invalid table configuration'),
115
+ kind: 'warning',
116
+ description: 'No table columns defined by queue ' + queue.uuid + ' and status ' + statusUuid,
117
+ });
118
+ }
119
+
120
+ // filters queue entries based on which status table we want to show and search term inputted by user
121
+ const filterQueueEntries = useCallback(
122
+ (queueEntries: QueueEntry[], searchTerm: string, statucUuid: string) => {
123
+ const searchTermLowercase = searchTerm.toLowerCase();
124
+ return queueEntries.filter((queueEntry) => {
125
+ const match = columns.some((column) => {
126
+ const columnSearchTerm = column.getFilterableValue?.(queueEntry)?.toLocaleLowerCase();
127
+ return columnSearchTerm?.includes(searchTermLowercase);
128
+ });
129
+ return queueEntry.status.uuid == statucUuid && match;
130
+ });
131
+ },
132
+ [queueEntries, searchTerm, columns],
133
+ );
134
+
135
+ const filteredQueueEntries = filterQueueEntries(queueEntries, searchTerm, statusUuid);
136
+ return (
137
+ <div className={styles.statusTableContainer}>
138
+ <QueueTable
139
+ key={statusUuid}
140
+ queueEntries={filteredQueueEntries}
141
+ header={status.display}
142
+ isValidating={isValidating}
143
+ queueUuid={queue.uuid}
144
+ statusUuid={statusUuid}
145
+ />
146
+ </div>
147
+ );
148
+ }
149
+
150
+ export default QueueTablesForAllStatuses;