@kenyaemr/esm-service-queues-app 8.1.1-pre.129 → 8.1.2-pre.154

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 (256) hide show
  1. package/.turbo/turbo-build.log +26 -26
  2. package/dist/1006.js +1 -0
  3. package/dist/1006.js.map +1 -0
  4. package/dist/1060.js +1 -0
  5. package/dist/1060.js.map +1 -0
  6. package/dist/130.js +1 -1
  7. package/dist/130.js.map +1 -1
  8. package/dist/1325.js +1 -0
  9. package/dist/1325.js.map +1 -0
  10. package/dist/1644.js +1 -0
  11. package/dist/1727.js +1 -0
  12. package/dist/1727.js.map +1 -0
  13. package/dist/1800.js +1 -0
  14. package/dist/1800.js.map +1 -0
  15. package/dist/236.js +1 -1
  16. package/dist/2757.js +1 -0
  17. package/dist/{282.js → 2760.js} +1 -1
  18. package/dist/2760.js.map +1 -0
  19. package/dist/2784.js +2 -0
  20. package/dist/2784.js.map +1 -0
  21. package/dist/3199.js +1 -0
  22. package/dist/3199.js.map +1 -0
  23. package/dist/3372.js +2 -0
  24. package/dist/3372.js.map +1 -0
  25. package/dist/3574.js +1 -0
  26. package/dist/3604.js +1 -0
  27. package/dist/3604.js.map +1 -0
  28. package/dist/3652.js +1 -0
  29. package/dist/3760.js +1 -0
  30. package/dist/3760.js.map +1 -0
  31. package/dist/3818.js +1 -0
  32. package/dist/3818.js.map +1 -0
  33. package/dist/3828.js +1 -0
  34. package/dist/3828.js.map +1 -0
  35. package/dist/4272.js +1 -0
  36. package/dist/4378.js +1 -0
  37. package/dist/443.js +1 -0
  38. package/dist/443.js.map +1 -0
  39. package/dist/4460.js +1 -0
  40. package/dist/4705.js +1 -0
  41. package/dist/4911.js +1 -0
  42. package/dist/4911.js.map +1 -0
  43. package/dist/5236.js +1 -0
  44. package/dist/5236.js.map +1 -0
  45. package/dist/5240.js +1 -0
  46. package/dist/5282.js +1 -0
  47. package/dist/5282.js.map +1 -0
  48. package/dist/5336.js +1 -0
  49. package/dist/539.js +1 -0
  50. package/dist/5673.js +1 -0
  51. package/dist/5711.js +1 -0
  52. package/dist/5737.js +1 -0
  53. package/dist/5833.js +1 -0
  54. package/dist/6566.js +1 -0
  55. package/dist/6578.js +2 -0
  56. package/dist/{660.js.LICENSE.txt → 6578.js.LICENSE.txt} +5 -0
  57. package/dist/6578.js.map +1 -0
  58. package/dist/6591.js +2 -0
  59. package/dist/6591.js.map +1 -0
  60. package/dist/6670.js +1 -0
  61. package/dist/6670.js.map +1 -0
  62. package/dist/6727.js +1 -0
  63. package/dist/744.js +1 -0
  64. package/dist/752.js +1 -1
  65. package/dist/752.js.map +1 -1
  66. package/dist/7807.js +1 -0
  67. package/dist/8271.js +1 -0
  68. package/dist/8319.js +1 -0
  69. package/dist/8788.js +1 -0
  70. package/dist/899.js +1 -0
  71. package/dist/9261.js +1 -0
  72. package/dist/9392.js +1 -0
  73. package/dist/9392.js.map +1 -0
  74. package/dist/9993.js +1 -0
  75. package/dist/9993.js.map +1 -0
  76. package/dist/kenyaemr-esm-service-queues-app.js +1 -1
  77. package/dist/kenyaemr-esm-service-queues-app.js.buildmanifest.json +541 -234
  78. package/dist/kenyaemr-esm-service-queues-app.js.map +1 -1
  79. package/dist/main.js +1 -1
  80. package/dist/main.js.LICENSE.txt +5 -0
  81. package/dist/main.js.map +1 -1
  82. package/dist/routes.json +1 -1
  83. package/package-lock.json +2 -2
  84. package/package.json +8 -5
  85. package/src/active-visits/active-visits-table.resource.ts +0 -62
  86. package/src/active-visits/change-status-dialog.component.tsx +10 -3
  87. package/src/active-visits/change-status-dialog.scss +29 -1
  88. package/src/active-visits/change-status-dialog.test.tsx +11 -3
  89. package/src/add-provider-queue-room/add-provider-queue-room.component.tsx +53 -54
  90. package/src/add-provider-queue-room/add-provider-queue-room.scss +28 -0
  91. package/src/add-provider-queue-room/add-provider-queue-room.test.tsx +1 -1
  92. package/src/clear-queue-entries-dialog/clear-queue-entries-dialog.component.tsx +1 -0
  93. package/src/clear-queue-entries-dialog/clear-queue-entries-dialog.scss +29 -0
  94. package/src/clear-queue-entries-dialog/clear-queue-entries-dialog.test.tsx +4 -1
  95. package/src/config-schema.ts +28 -8
  96. package/src/create-queue-entry/create-queue-entry.workspace.tsx +99 -0
  97. package/src/create-queue-entry/existing-visit-form/existing-visit-form.component.tsx +73 -0
  98. package/src/{patient-search/visit-form-queue-fields/visit-form-queue-fields.component.tsx → create-queue-entry/queue-fields/queue-fields.component.tsx} +76 -50
  99. package/src/create-queue-entry/queue-fields/queue-fields.resource.ts +63 -0
  100. package/src/{patient-search/visit-form-queue-fields/visit-form-queue-fields.scss → create-queue-entry/queue-fields/queue-fields.scss} +0 -4
  101. package/src/{patient-search/visit-form-queue-fields/visit-form-queue-fields.test.tsx → create-queue-entry/queue-fields/queue-fields.test.tsx} +37 -17
  102. package/src/create-queue-entry/queue-fields/visit-form-queue-fields.extension.tsx +31 -0
  103. package/src/hooks/useQueueEntries.ts +13 -12
  104. package/src/index.ts +8 -14
  105. package/src/patient-info/patient-info.component.tsx +10 -8
  106. package/src/patient-queue-header/patient-queue-header.component.tsx +18 -13
  107. package/src/patient-queue-metrics/metrics-header.component.tsx +4 -4
  108. package/src/queue-entry-table-components/queue-priority.component.tsx +16 -11
  109. package/src/queue-entry-table-components/queue-priority.scss +5 -0
  110. package/src/queue-entry-table-components/transition-entry.component.tsx +1 -1
  111. package/src/queue-patient-linelists/queue-linelist-base-table.component.tsx +1 -1
  112. package/src/queue-patient-linelists/queue-linelist-filter.workspace.tsx +13 -12
  113. package/src/queue-patient-linelists/scheduled-appointments-table.component.tsx +1 -1
  114. package/src/queue-rooms/queue-room-form.test.tsx +2 -2
  115. package/src/queue-rooms/queue-room-form.workspace.tsx +1 -1
  116. package/src/queue-screen/queue-screen.test.tsx +11 -4
  117. package/src/queue-services/queue-service-form.test.tsx +76 -16
  118. package/src/queue-services/queue-service-form.workspace.tsx +131 -131
  119. package/src/queue-services/queue-service.resource.ts +7 -2
  120. package/src/queue-table/cells/columns.resource.ts +10 -7
  121. package/src/queue-table/cells/queue-table-visit-attribute-queue-number-cell.component.tsx +1 -0
  122. package/src/queue-table/default-queue-table.component.tsx +12 -13
  123. package/src/queue-table/default-queue-table.test.tsx +3 -3
  124. package/src/queue-table/queue-entry-actions/queue-entry-actions-modal.scss +28 -0
  125. package/src/queue-table/queue-entry-actions/queue-entry-actions.modal.tsx +8 -2
  126. package/src/queue-table/queue-entry-actions/queue-entry-confirm-action.modal.tsx +2 -1
  127. package/src/queue-table/queue-entry-actions/queue-entry-confirm-action.scss +29 -0
  128. package/src/queue-table/queue-table.component.tsx +1 -1
  129. package/src/queue-table/queue-table.scss +12 -2
  130. package/src/queue-table/queue-table.test.tsx +10 -1
  131. package/src/remove-queue-entry-dialog/remove-queue-entry.component.tsx +16 -4
  132. package/src/remove-queue-entry-dialog/remove-queue-entry.scss +29 -0
  133. package/src/routes.json +4 -8
  134. package/src/transition-latest-queue-entry/transition-latest-queue-entry.resource.ts +2 -10
  135. package/src/transition-queue-entry/transition-queue-entry-dialog.component.tsx +41 -32
  136. package/src/transition-queue-entry/transition-queue-entry-dialog.scss +28 -0
  137. package/src/types/index.ts +0 -8
  138. package/src/views/queue-tables-for-all-statuses.component.tsx +12 -15
  139. package/translations/am.json +5 -78
  140. package/translations/ar.json +5 -78
  141. package/translations/de.json +235 -0
  142. package/translations/en.json +9 -86
  143. package/translations/es.json +3 -76
  144. package/translations/fr.json +5 -78
  145. package/translations/he.json +5 -78
  146. package/translations/hi.json +235 -0
  147. package/translations/hi_IN.json +235 -0
  148. package/translations/id.json +235 -0
  149. package/translations/it.json +235 -0
  150. package/translations/km.json +5 -78
  151. package/translations/ne.json +235 -0
  152. package/translations/pt.json +235 -0
  153. package/translations/pt_BR.json +235 -0
  154. package/translations/qu.json +235 -0
  155. package/translations/si.json +235 -0
  156. package/translations/sw.json +235 -0
  157. package/translations/sw_KE.json +235 -0
  158. package/translations/tr.json +235 -0
  159. package/translations/tr_TR.json +235 -0
  160. package/translations/uk.json +235 -0
  161. package/translations/vi.json +235 -0
  162. package/translations/zh.json +6 -79
  163. package/translations/zh_CN.json +5 -78
  164. package/dist/169.js +0 -1
  165. package/dist/169.js.map +0 -1
  166. package/dist/199.js +0 -1
  167. package/dist/199.js.map +0 -1
  168. package/dist/236.js.map +0 -1
  169. package/dist/271.js +0 -1
  170. package/dist/282.js.map +0 -1
  171. package/dist/319.js +0 -1
  172. package/dist/325.js +0 -1
  173. package/dist/325.js.map +0 -1
  174. package/dist/366.js +0 -1
  175. package/dist/366.js.map +0 -1
  176. package/dist/372.js +0 -2
  177. package/dist/372.js.map +0 -1
  178. package/dist/392.js +0 -1
  179. package/dist/392.js.map +0 -1
  180. package/dist/460.js +0 -1
  181. package/dist/501.js +0 -1
  182. package/dist/501.js.map +0 -1
  183. package/dist/574.js +0 -1
  184. package/dist/591.js +0 -2
  185. package/dist/591.js.map +0 -1
  186. package/dist/6.js +0 -1
  187. package/dist/6.js.map +0 -1
  188. package/dist/60.js +0 -1
  189. package/dist/60.js.map +0 -1
  190. package/dist/604.js +0 -1
  191. package/dist/604.js.map +0 -1
  192. package/dist/644.js +0 -1
  193. package/dist/660.js +0 -2
  194. package/dist/660.js.map +0 -1
  195. package/dist/670.js +0 -1
  196. package/dist/670.js.map +0 -1
  197. package/dist/727.js +0 -1
  198. package/dist/727.js.map +0 -1
  199. package/dist/748.js +0 -1
  200. package/dist/748.js.map +0 -1
  201. package/dist/757.js +0 -1
  202. package/dist/760.js +0 -1
  203. package/dist/760.js.map +0 -1
  204. package/dist/784.js +0 -2
  205. package/dist/784.js.map +0 -1
  206. package/dist/788.js +0 -1
  207. package/dist/800.js +0 -1
  208. package/dist/800.js.map +0 -1
  209. package/dist/807.js +0 -1
  210. package/dist/818.js +0 -1
  211. package/dist/818.js.map +0 -1
  212. package/dist/828.js +0 -1
  213. package/dist/828.js.map +0 -1
  214. package/dist/833.js +0 -1
  215. package/dist/911.js +0 -1
  216. package/dist/911.js.map +0 -1
  217. package/dist/940.js +0 -1
  218. package/dist/940.js.map +0 -1
  219. package/src/add-patient-toqueue/add-patient-toqueue-dialog.component.tsx +0 -228
  220. package/src/add-patient-toqueue/add-patient-toqueue-dialog.scss +0 -32
  221. package/src/patient-search/advanced-search.component.tsx +0 -191
  222. package/src/patient-search/advanced-search.scss +0 -154
  223. package/src/patient-search/advanced-search.test.tsx +0 -26
  224. package/src/patient-search/basic-search.component.tsx +0 -112
  225. package/src/patient-search/basic-search.scss +0 -139
  226. package/src/patient-search/basic-search.test.tsx +0 -18
  227. package/src/patient-search/empty-data-illustration.component.tsx +0 -41
  228. package/src/patient-search/hooks/useActivePatientEnrollment.tsx +0 -29
  229. package/src/patient-search/hooks/useDefaultLocation.ts +0 -14
  230. package/src/patient-search/hooks/usePatients.tsx +0 -25
  231. package/src/patient-search/hooks/useRecommendedVisitTypes.tsx +0 -35
  232. package/src/patient-search/hooks/useScheduledVisits.ts +0 -52
  233. package/src/patient-search/patient-scheduled-visits.component.tsx +0 -315
  234. package/src/patient-search/patient-scheduled-visits.scss +0 -131
  235. package/src/patient-search/patient-scheduled-visits.test.tsx +0 -39
  236. package/src/patient-search/patient-search.workspace.tsx +0 -135
  237. package/src/patient-search/search-illustration.component.tsx +0 -27
  238. package/src/patient-search/search-results.component.tsx +0 -75
  239. package/src/patient-search/search-results.scss +0 -80
  240. package/src/patient-search/search-results.test.tsx +0 -69
  241. package/src/patient-search/search.resource.ts +0 -10
  242. package/src/patient-search/visit-form/existing-visit-form.component.tsx +0 -112
  243. package/src/patient-search/visit-form/queue.resource.ts +0 -64
  244. package/src/patient-search/visit-form/visit-form.component.tsx +0 -337
  245. package/src/patient-search/visit-form/visit-type-selector.component.tsx +0 -153
  246. package/src/patient-search/visit-form/visit-type-selector.scss +0 -100
  247. package/src/patient-search/visit-form/visit-type-selector.test.tsx +0 -84
  248. package/src/visits-missing-inqueue/visits-missing-inqueue.component.tsx +0 -277
  249. package/src/visits-missing-inqueue/visits-missing-inqueue.resource.ts +0 -93
  250. package/src/visits-missing-inqueue/visits-missing-inqueue.scss +0 -111
  251. /package/dist/{784.js.LICENSE.txt → 2784.js.LICENSE.txt} +0 -0
  252. /package/dist/{372.js.LICENSE.txt → 3372.js.LICENSE.txt} +0 -0
  253. /package/dist/{591.js.LICENSE.txt → 6591.js.LICENSE.txt} +0 -0
  254. /package/src/{patient-search/patient-search.scss → create-queue-entry/create-queue-entry.scss} +0 -0
  255. /package/src/{patient-search/visit-form/visit-form.scss → create-queue-entry/existing-visit-form/existing-visit-form.scss} +0 -0
  256. /package/src/{patient-search → create-queue-entry}/hooks/useQueueLocations.tsx +0 -0
@@ -5,8 +5,8 @@ import { parseDate, showSnackbar, useVisit } from '@openmrs/esm-framework';
5
5
  import { type MappedQueueEntry } from '../types';
6
6
  import { startOfDay } from '../constants';
7
7
  import { useCheckedInAppointments, endQueueEntry } from './remove-queue-entry.resource';
8
- import styles from './remove-queue-entry.scss';
9
8
  import { useMutateQueueEntries } from '../hooks/useQueueEntries';
9
+ import styles from './remove-queue-entry.scss';
10
10
 
11
11
  interface RemoveQueueEntryDialogProps {
12
12
  queueEntry: MappedQueueEntry;
@@ -56,11 +56,23 @@ const RemoveQueueEntryDialog: React.FC<RemoveQueueEntryDialogProps> = ({ queueEn
56
56
  subtitle: error?.message,
57
57
  });
58
58
  });
59
- }, [appointments, currentVisit, queueEntry]);
59
+ }, [
60
+ appointments,
61
+ closeModal,
62
+ currentVisit?.location?.uuid,
63
+ currentVisit?.startDatetime,
64
+ currentVisit?.visitType?.uuid,
65
+ mutateQueueEntries,
66
+ queueEntry?.queue?.uuid,
67
+ queueEntry?.queueEntryUuid,
68
+ queueEntry?.visitUuid,
69
+ t,
70
+ ]);
60
71
 
61
72
  return (
62
- <div>
73
+ <>
63
74
  <ModalHeader
75
+ className={styles.modalHeader}
64
76
  closeModal={closeModal}
65
77
  label={t('serviceQueue', 'Service queue')}
66
78
  title={t('removeFromQueueAndEndVisit', 'Remove patient from queue and end active visit?')}
@@ -81,7 +93,7 @@ const RemoveQueueEntryDialog: React.FC<RemoveQueueEntryDialogProps> = ({ queueEn
81
93
  {t('endVisit', 'End visit')}
82
94
  </Button>
83
95
  </ModalFooter>
84
- </div>
96
+ </>
85
97
  );
86
98
  };
87
99
 
@@ -1,6 +1,35 @@
1
+ @use '@carbon/layout';
1
2
  @use '@carbon/type';
2
3
  @use '@openmrs/esm-styleguide/src/vars' as *;
3
4
 
5
+ .modalHeader {
6
+ :global {
7
+ .cds--modal-close-button {
8
+ position: absolute;
9
+ inset-block-start: 0;
10
+ inset-inline-end: 0;
11
+ margin: 0;
12
+ margin-top: calc(-1 * #{layout.$spacing-05});
13
+ }
14
+
15
+ .cds--modal-close {
16
+ background-color: rgba(0, 0, 0, 0);
17
+
18
+ &:hover {
19
+ background-color: var(--cds-layer-hover);
20
+ }
21
+ }
22
+
23
+ .cds--popover--left > .cds--popover > .cds--popover-content {
24
+ transform: translate(-4rem, 0.85rem);
25
+ }
26
+
27
+ .cds--popover--left > .cds--popover > .cds--popover-caret {
28
+ transform: translate(-3.75rem, 1.25rem);
29
+ }
30
+ }
31
+ }
32
+
4
33
  #subHeading {
5
34
  @include type.type-style('heading-compact-01');
6
35
  color: $ui-05;
package/src/routes.json CHANGED
@@ -66,14 +66,10 @@
66
66
  {
67
67
  "name": "visit-form-queue-fields",
68
68
  "component": "visitFormQueueFields",
69
- "slot":"visit-form-queue-slot"
69
+ "slot":"visit-form-bottom-slot"
70
70
  }
71
71
  ],
72
72
  "modals": [
73
- {
74
- "name": "add-visit-to-queue-modal",
75
- "component": "addVisitToQueueModal"
76
- },
77
73
  {
78
74
  "name": "add-provider-to-room-modal",
79
75
  "component": "addProviderToRoomModal"
@@ -131,9 +127,9 @@
131
127
  "type": "service-queues"
132
128
  },
133
129
  {
134
- "name": "service-queues-patient-search",
135
- "title": "searchPatient",
136
- "component": "patientSearchWorkspace",
130
+ "name": "create-queue-entry-workspace",
131
+ "title": "addPatientToQueue",
132
+ "component": "createQueueEntryWorkspace",
137
133
  "type": "service-queues"
138
134
  }
139
135
  ]
@@ -1,21 +1,13 @@
1
- import {
2
- type FetchResponse,
3
- openmrsFetch,
4
- type OpenmrsResource,
5
- type Patient,
6
- type Visit,
7
- } from '@openmrs/esm-framework';
1
+ import { type FetchResponse, openmrsFetch, restBaseUrl } from '@openmrs/esm-framework';
8
2
  import useSWR from 'swr';
9
- import useSWRImmutable from 'swr/immutable';
10
3
  import { type QueueEntry } from '../types';
11
- import { FetcherResponse } from 'swr/_internal';
12
4
 
13
5
  export function useLatestQueueEntry(patientUuid: string) {
14
6
  const customRepresentation =
15
7
  'custom:(uuid,display,queue:(uuid,display,name,location:(uuid,display),service:(uuid,display),allowedPriorities:(uuid,display),allowedStatuses:(uuid,display)),status,patient:(uuid,display),visit:(uuid,display,startDatetime),priority,priorityComment,sortWeight,startedAt,endedAt,locationWaitingFor,queueComingFrom,providerWaitingFor,previousQueueEntry)';
16
8
 
17
9
  const encodedRepresentation = encodeURIComponent(customRepresentation);
18
- const url = `/ws/rest/v1/queue-entry?v=${encodedRepresentation}&patient=${patientUuid}&isEnded=false`;
10
+ const url = `${restBaseUrl}/queue-entry?v=${encodedRepresentation}&patient=${patientUuid}&isEnded=false`;
19
11
  const { data, error, isLoading, mutate } = useSWR<FetchResponse<{ results: QueueEntry[] }>>(url, openmrsFetch);
20
12
 
21
13
  const queueEntry =
@@ -2,6 +2,7 @@ import React, { useCallback } from 'react';
2
2
  import { useTranslation } from 'react-i18next';
3
3
  import { Button, ModalBody, ModalFooter, ModalHeader, Tag } from '@carbon/react';
4
4
  import { navigate, showSnackbar, useConfig } from '@openmrs/esm-framework';
5
+ import { type ConfigObject } from '../config-schema';
5
6
  import {
6
7
  type MappedVisitQueueEntry,
7
8
  serveQueueEntry,
@@ -9,19 +10,18 @@ import {
9
10
  } from '../active-visits/active-visits-table.resource';
10
11
  import { requeueQueueEntry } from './transition-queue-entry.resource';
11
12
  import { useMutateQueueEntries } from '../hooks/useQueueEntries';
12
- import { type ConfigObject } from '../config-schema';
13
13
  import styles from './transition-queue-entry-dialog.scss';
14
14
 
15
15
  interface TransitionQueueEntryModalProps {
16
- queueEntry: MappedVisitQueueEntry;
17
16
  closeModal: () => void;
17
+ queueEntry: MappedVisitQueueEntry;
18
18
  }
19
19
 
20
20
  enum priorityComment {
21
21
  REQUEUED = 'Requeued',
22
22
  }
23
23
 
24
- const TransitionQueueEntryModal: React.FC<TransitionQueueEntryModalProps> = ({ queueEntry, closeModal }) => {
24
+ const TransitionQueueEntryModal: React.FC<TransitionQueueEntryModalProps> = ({ closeModal, queueEntry }) => {
25
25
  const { t } = useTranslation();
26
26
  const config = useConfig<ConfigObject>();
27
27
  const defaultTransitionStatus = config.concepts.defaultTransitionStatus;
@@ -46,21 +46,17 @@ const TransitionQueueEntryModal: React.FC<TransitionQueueEntryModalProps> = ({ q
46
46
  queueEntry?.sortWeight,
47
47
  ).then(
48
48
  ({ status }) => {
49
- if (status === 201) {
50
- serveQueueEntry(queueEntry?.queue.name, queueEntry?.visitQueueNumber, 'serving').then(({ status }) => {
51
- if (status === 200) {
52
- showSnackbar({
53
- isLowContrast: true,
54
- title: t('success', 'Success'),
55
- kind: 'success',
56
- subtitle: t('patientAttendingService', 'Patient attending service'),
57
- });
58
- closeModal();
59
- mutateQueueEntries();
60
- navigate({ to: `\${openmrsSpaBase}/patient/${queueEntry?.patientUuid}/chart` });
61
- }
49
+ serveQueueEntry(queueEntry?.queue.name, queueEntry?.visitQueueNumber, 'serving').then(({ status }) => {
50
+ showSnackbar({
51
+ isLowContrast: true,
52
+ title: t('success', 'Success'),
53
+ kind: 'success',
54
+ subtitle: t('patientAttendingService', 'Patient attending service'),
62
55
  });
63
- }
56
+ closeModal();
57
+ mutateQueueEntries();
58
+ navigate({ to: `\${openmrsSpaBase}/patient/${queueEntry?.patientUuid}/chart` });
59
+ });
64
60
  },
65
61
  (error) => {
66
62
  showSnackbar({
@@ -71,21 +67,32 @@ const TransitionQueueEntryModal: React.FC<TransitionQueueEntryModalProps> = ({ q
71
67
  });
72
68
  },
73
69
  );
74
- }, [queueEntry]);
70
+ }, [
71
+ closeModal,
72
+ defaultTransitionStatus,
73
+ mutateQueueEntries,
74
+ queueEntry?.patientUuid,
75
+ queueEntry?.priority?.uuid,
76
+ queueEntry?.queue.name,
77
+ queueEntry?.queueEntryUuid,
78
+ queueEntry?.queueUuid,
79
+ queueEntry?.sortWeight,
80
+ queueEntry?.visitQueueNumber,
81
+ queueEntry?.visitUuid,
82
+ t,
83
+ ]);
75
84
 
76
85
  const handleRequeuePatient = useCallback(() => {
77
86
  requeueQueueEntry(priorityComment.REQUEUED, queueEntry?.queueUuid, queueEntry?.queueEntryUuid).then(
78
- ({ status }) => {
79
- if (status === 200) {
80
- showSnackbar({
81
- isLowContrast: true,
82
- title: t('success', 'Success'),
83
- kind: 'success',
84
- subtitle: t('patientRequeued', 'Patient has been requeued'),
85
- });
86
- closeModal();
87
- mutateQueueEntries();
88
- }
87
+ () => {
88
+ showSnackbar({
89
+ isLowContrast: true,
90
+ title: t('success', 'Success'),
91
+ kind: 'success',
92
+ subtitle: t('patientRequeued', 'Patient has been requeued'),
93
+ });
94
+ closeModal();
95
+ mutateQueueEntries();
89
96
  },
90
97
  (error) => {
91
98
  showSnackbar({
@@ -96,11 +103,11 @@ const TransitionQueueEntryModal: React.FC<TransitionQueueEntryModalProps> = ({ q
96
103
  });
97
104
  },
98
105
  );
99
- }, []);
106
+ }, [closeModal, mutateQueueEntries, queueEntry?.queueEntryUuid, queueEntry?.queueUuid, t]);
100
107
 
101
108
  return (
102
109
  <div>
103
- <ModalHeader closeModal={closeModal} title={t('servePatient', 'Serve patient')} />
110
+ <ModalHeader className={styles.modalHeader} closeModal={closeModal} title={t('servePatient', 'Serve patient')} />
104
111
  <ModalBody className={styles.modalBody}>
105
112
  <div>
106
113
  <section className={styles.modalBody}>
@@ -117,7 +124,9 @@ const TransitionQueueEntryModal: React.FC<TransitionQueueEntryModalProps> = ({ q
117
124
  <p className={styles.p}>
118
125
  {t('patientAge', 'Age')} : &nbsp; {queueEntry?.patientAge}
119
126
  </p>
120
- <p>{queueEntry.identifiers?.map((identifier) => <Tag key={identifier.uuid}>{identifier.display}</Tag>)}</p>
127
+ <div>
128
+ {queueEntry.identifiers?.map((identifier) => <Tag key={identifier.uuid}>{identifier.display}</Tag>)}
129
+ </div>
121
130
  </section>
122
131
  </div>
123
132
  </ModalBody>
@@ -6,6 +6,34 @@
6
6
  margin-bottom: 0;
7
7
  }
8
8
 
9
+ .modalHeader {
10
+ :global {
11
+ .cds--modal-close-button {
12
+ position: absolute;
13
+ inset-block-start: 0;
14
+ inset-inline-end: 0;
15
+ margin: 0;
16
+ margin-top: calc(-1 * #{layout.$spacing-05});
17
+ }
18
+
19
+ .cds--modal-close {
20
+ background-color: rgba(0, 0, 0, 0);
21
+
22
+ &:hover {
23
+ background-color: var(--cds-layer-hover);
24
+ }
25
+ }
26
+
27
+ .cds--popover--left > .cds--popover > .cds--popover-content {
28
+ transform: translate(-4rem, 0.85rem);
29
+ }
30
+
31
+ .cds--popover--left > .cds--popover > .cds--popover-caret {
32
+ transform: translate(-3.75rem, 1.25rem);
33
+ }
34
+ }
35
+ }
36
+
9
37
  .p {
10
38
  margin-bottom: layout.$spacing-02;
11
39
  @include type.type-style('body-01');
@@ -2,14 +2,6 @@ import { type Visit, type OpenmrsResource, type Location, type Patient } from '@
2
2
  import type React from 'react';
3
3
  import { type ColumnConfig } from '../config-schema';
4
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
5
  export interface Attribute {
14
6
  attributeType: OpenmrsResource;
15
7
  display: string;
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useState } from 'react';
1
+ import React, { useState } from 'react';
2
2
  import { InlineNotification, Search, SkeletonText } from '@carbon/react';
3
3
  import { Add } from '@carbon/react/icons';
4
4
  import { useTranslation } from 'react-i18next';
@@ -7,9 +7,9 @@ import type { Concept, Queue, QueueEntry } from '../types';
7
7
  import { useQueueEntries } from '../hooks/useQueueEntries';
8
8
  import { useColumns } from '../queue-table/cells/columns.resource';
9
9
  import { QueueTableByStatusSkeleton } from '../queue-table/queue-table-by-status-skeleton.component';
10
+ import PatientQueueHeader from '../patient-queue-header/patient-queue-header.component';
10
11
  import QueueTable from '../queue-table/queue-table.component';
11
12
  import QueueTableMetrics from '../queue-table/queue-table-metrics.component';
12
- import PatientQueueHeader from '../patient-queue-header/patient-queue-header.component';
13
13
  import styles from '../queue-table/queue-table.scss';
14
14
 
15
15
  interface QueueTablesForAllStatusesProps {
@@ -58,7 +58,7 @@ const QueueTablesForAllStatuses: React.FC<QueueTablesForAllStatusesProps> = ({
58
58
  size: isDesktop(layout) ? 'sm' : 'lg',
59
59
  },
60
60
  selectPatientAction: (selectedPatientUuid) => {
61
- launchWorkspace('service-queues-patient-search', {
61
+ launchWorkspace('create-queue-entry-workspace', {
62
62
  selectedPatientUuid,
63
63
  currentServiceQueueUuid: selectedQueue.uuid,
64
64
  });
@@ -154,19 +154,16 @@ function QueueTableForQueueAndStatus({
154
154
  }
155
155
 
156
156
  // filters queue entries based on which status table we want to show and search term inputted by user
157
- const filterQueueEntries = useCallback(
158
- (queueEntries: QueueEntry[], searchTerm: string, statucUuid: string) => {
159
- const searchTermLowercase = searchTerm.toLowerCase();
160
- return queueEntries.filter((queueEntry) => {
161
- const match = columns.some((column) => {
162
- const columnSearchTerm = column.getFilterableValue?.(queueEntry)?.toLocaleLowerCase();
163
- return columnSearchTerm?.includes(searchTermLowercase);
164
- });
165
- return queueEntry.status.uuid == statucUuid && match;
157
+ const filterQueueEntries = (queueEntries: QueueEntry[], searchTerm: string, statusUuid: string) => {
158
+ const searchTermLowercase = searchTerm.toLowerCase();
159
+ return queueEntries.filter((queueEntry) => {
160
+ const match = columns?.some((column) => {
161
+ const columnSearchTerm = column.getFilterableValue?.(queueEntry)?.toLocaleLowerCase();
162
+ return columnSearchTerm?.includes(searchTermLowercase);
166
163
  });
167
- },
168
- [queueEntries, searchTerm, columns],
169
- );
164
+ return queueEntry.status.uuid == statusUuid && match;
165
+ });
166
+ };
170
167
 
171
168
  const filteredQueueEntries = filterQueueEntries(queueEntries, searchTerm, statusUuid);
172
169
  return (
@@ -1,10 +1,7 @@
1
1
  {
2
2
  "actions": "Actions",
3
- "activeVisits": "Active Visits",
4
- "activeVisitsNotInQueue": "Active visits not in queue",
5
3
  "addAProviderQueueRoom": "Add a provider queue room?",
6
- "addEntry": "Add entry",
7
- "addisitToQueueTooltip": "Add to queue",
4
+ "addedPatientToQueue": "Added patient to queue",
8
5
  "addNewQueueService": "Add New Queue Service",
9
6
  "addNewQueueServiceRoom": "Add new queue service room",
10
7
  "addNewService": "Add new service",
@@ -17,20 +14,13 @@
17
14
  "addQueueRoomName": "Please add a queue room name",
18
15
  "addQueueRoomService": "Please add a queue room service",
19
16
  "addRoom": "Add room",
20
- "addToQueue": "Add to queue",
21
- "addVisitToQueue": "Add Visit To Queue?",
22
- "advancedSearch": "Advanced search",
23
17
  "age": "Age",
24
18
  "alistOfClients": "A list of clients waiting for ",
25
19
  "all": "All",
26
20
  "and": "And",
27
- "anotherVisitType": "Start another visit type",
28
- "any": "Any",
29
21
  "applyFilters": "Apply filters",
30
22
  "averageWaitTime": "Average wait time today",
31
- "backToScheduledVisits": "Back to scheduled visits",
32
23
  "backToSearchResults": "Back to search results",
33
- "backToSimpleSearch": "Back to simple search",
34
24
  "between": "Between",
35
25
  "bmi": "Bmi",
36
26
  "bp": "Bp",
@@ -39,7 +29,6 @@
39
29
  "checkedInPatients": "Checked in patients",
40
30
  "checkFilters": "Check the filters above",
41
31
  "chooseRoom": "Select a room",
42
- "chooseService": "Select a service",
43
32
  "clearAllQueueEntries": "Clear all queue entries?",
44
33
  "clearAllQueueEntriesWarningMessage": "Clearing all queue entries will remove all the patients from the queues",
45
34
  "clearQueue": "Clear queue",
@@ -55,8 +44,6 @@
55
44
  "currentVisit": "Current visit",
56
45
  "date": "Date",
57
46
  "date&Time": "Date & time",
58
- "dateAndTimeOfVisit": "Date and time of visit",
59
- "dateOfBirth": "Date of birth",
60
47
  "delete": "Delete",
61
48
  "deleteQueueEntry": "Delete queue entry",
62
49
  "discard": "Discard",
@@ -74,93 +61,63 @@
74
61
  "errorAddingQueue": "Error adding queue",
75
62
  "errorAddingQueueRoom": "Error adding queue room",
76
63
  "errorClearingQueues": "Error clearing queues",
77
- "errorFetchingAppointments": "Error fetching appointments",
64
+ "errorFetchingVisit": "Error fetching patient visit",
78
65
  "errorLoadingQueueEntries": "Error loading queue entries",
79
66
  "errorPostingToScreen": "Error posting to screen",
80
- "facility": "Facility",
81
- "failedToLoadRecommendedVisitTypes": "Failed to load recommended visit types",
82
- "female": "Female",
83
67
  "femaleLabelText": "Female",
84
- "fields": "of the following fields",
85
68
  "filter": "Filter (1)",
86
- "filterByService": "Filter by service :",
87
- "filterByStatus": "Filter by status :",
69
+ "filterByService": "Filter by service:",
70
+ "filterByStatus": "Filter by status:",
88
71
  "filterTable": "Filter table",
89
- "firstName": "First name",
90
- "firstNameSort": "First name (a-z)",
91
- "futureScheduledVisits_one": "{{count}} visit scheduled for dates in the future",
92
- "futureScheduledVisits_other": "{{count}} visits scheduled for dates in the future",
93
72
  "gender": "Gender",
94
73
  "heartRate": "Heart rate",
95
74
  "height": "Height",
96
75
  "hourAndMinuteFormatted": "{{hours}} hour(s) and {{minutes}} minute(s)",
97
- "idNumber": "ID Number",
98
76
  "indication": "Indication",
99
77
  "invalidQueue": "Invalid Queue",
100
78
  "invalidtableConfig": "Invalid table configuration",
101
79
  "lastEncounter": "Last encounter",
102
- "lastName": "Last name",
103
- "lastNameSort": "Last name (a-z)",
104
- "lastVisit": "Last visit",
105
- "lastVisitDate": "Date",
106
80
  "loading": "Loading...",
107
81
  "location": "Location",
108
- "male": "Male",
109
82
  "maleLabelText": "Male",
110
- "match": "Match",
111
83
  "medications": "Medications",
112
- "middleName": "Middle name",
113
84
  "minuteFormatted": "{{minutes}} minute(s)",
114
85
  "minutes": "Minutes",
115
86
  "missingLocation": "Missing location",
116
- "missingPriority": "Please select a priority",
117
87
  "missingQueueName": "Missing queue name",
118
88
  "missingQueueRoom": "Please select a queue room",
119
89
  "missingQueueRoomName": "Missing queue room name",
120
90
  "missingQueueRoomService": "Missing queue room service",
121
91
  "missingService": "Missing service",
122
- "missingVisitType": "Missing visit type",
123
92
  "modifyDefaultValue": "Modify default value",
124
93
  "movePatientToNextService": "Move patient to the next service?",
125
94
  "moveToNextService": "Move to next service",
126
95
  "name": "Name",
127
96
  "nextPage": "Next page",
128
- "noActiveVisitsForLocation": "There are no active visits to display for this location.",
129
- "noAppointmentsFound": "No appointments found",
130
97
  "noColumnsDefined": "No table columns defined. Check Configuration",
131
98
  "noEncountersFound": "No encounters found",
132
99
  "noLastEncounter": "There is no last encounter to display for this patient",
133
100
  "noLocationsAvailable": "No locations available",
134
101
  "noMedicationsFound": "No medications found",
135
102
  "noNotesFound": "No notes found",
136
- "noPatientFoundMessage": "Sorry, no patient has been found",
137
103
  "noPatientsToDisplay": "No patients to display",
138
104
  "noPreviousVisitFound": "No previous visit found",
139
105
  "noPrioritiesConfigured": "No priorities configured",
140
106
  "noPrioritiesForService": "The selected service does not have any allowed priorities. This is an error in configuration. Please contact your system administrator.",
141
107
  "noPrioritiesForServiceTitle": "No priorities available",
142
108
  "noPriorityFound": "No priority found",
143
- "noResultsFound": "No results found",
144
109
  "noReturnDate": "There is no return date to display for this patient",
145
110
  "noServicesAvailable": "No services available",
146
111
  "noServicesConfigured": "No services configured",
147
112
  "noStatusConfigured": "No status configured",
148
113
  "notableConfig": "No table configuration",
149
114
  "notes": "Notes",
150
- "noVisitsNotInQueueFound": "No visits currently not in queue found",
151
- "noVisitTypesMatchingSearch": "There are no visit types matching this search text",
152
115
  "noVitalsFound": "No vitals found",
153
- "oldest": "Oldest first",
154
116
  "onTime": "On time",
155
- "or": "Or",
156
117
  "orderDurationAndUnit": "for {{duration}} {{durationUnit}}",
157
118
  "orderIndefiniteDuration": "Indefinite duration",
158
- "orInProperFormat": "Or",
159
- "orPatientName": "OR the patient's name(s)",
160
119
  "patientAge": "Age",
161
- "patientAlreadyInQueue": "Patient is already in the queue",
162
120
  "patientAttendingService": "Patient attending service",
163
- "patientHasActiveVisit": "The patient already has an active visit",
164
121
  "patientInfo": "{{name}}{{sexInfo}}{{ageInfo}}",
165
122
  "patientList": "Patient list",
166
123
  "patientName": "Patient name",
@@ -171,23 +128,17 @@
171
128
  "patientRequeued": "Patient has been requeued",
172
129
  "patients": "Patients",
173
130
  "patientsCurrentlyInQueue": "Patients currently in queue",
174
- "personalDetails": "Personal details",
175
131
  "phoneNumber": "Phone Number",
176
132
  "pleaseSelectLocation": "Please select a location",
177
- "pleaseSelectService": "Please select a service",
178
- "postCode": "Post code",
179
133
  "previousPage": "Previous page",
180
134
  "previousVisit": "Previous visit",
181
- "primaryHelperText": "Search for a patient",
182
135
  "priority": "Priority",
183
136
  "priorityComment": "Priority comment",
184
137
  "priorityIsRequired": "Priority is required",
185
- "program": "Program",
186
138
  "provider": "Provider",
187
139
  "quantity": "Quantity",
188
140
  "queueAddedSuccessfully": "Queue added successfully",
189
141
  "queueEntryAddedSuccessfully": "Queue entry added successfully",
190
- "queueEntryAddFailed": "Error adding queue entry status",
191
142
  "queueEntryDeleteFailed": "Error deleting queue entry",
192
143
  "queueEntryDeleteSuccessful": "Queue entry deleted successfully",
193
144
  "queueEntryEdited": "Queue entry edited",
@@ -217,9 +168,6 @@
217
168
  "queueScreen": "Queue screen",
218
169
  "queueService": "Queue service",
219
170
  "queueStatus": "Queue status",
220
- "recentScheduledVisits_one": "{{count}} visit scheduled for +/- 7 days",
221
- "recentScheduledVisits_other": "{{count}} visits scheduled for +/- 7 days",
222
- "recommended": "Recommended",
223
171
  "refills": "Refills",
224
172
  "removeFromQueueAndEndVisit": "Remove patient from queue and end active visit?",
225
173
  "removePatient": "Remove patient",
@@ -233,40 +181,23 @@
233
181
  "save": "Save",
234
182
  "scheduledAppointmentsList": "Scheduled appointments patient list",
235
183
  "scheduledToday": "Scheduled for today",
236
- "search": "Search",
237
- "searchboxPlaceholder": "Search for a patient name or ID number",
238
- "searchForAVisitType": "Search for a visit type",
239
- "searchForPatient": "Search for a patient",
240
- "searchPatient": "Search Patient",
241
184
  "searchThisList": "Search this list",
242
- "secondaryHelperText": "Type the patient's name or unique ID number",
243
185
  "selectALocation": "Select a location",
244
186
  "selectAVisitType": "Select visit type",
245
- "selectFacility": "Select a facility",
246
- "selectOption": "Select an option",
247
- "selectProgramType": "Select program type",
248
187
  "selectQueue": "Select a queue",
249
188
  "selectQueueLocation": "Select a queue location",
250
189
  "selectQueueService": "Select a queue service",
251
190
  "selectRoom": "Select a room",
252
191
  "selectService": "Select a service",
253
192
  "selectServiceType": "Select a service type",
254
- "selectVisitType": "Please select a Visit Type",
255
193
  "serve": "Serve",
256
194
  "servePatient": "Serve patient",
257
195
  "service": "Service",
258
196
  "serviceIsRequired": "Service is required",
259
197
  "serviceQueue": "Service queue",
260
198
  "serviceQueues": "Service queues",
261
- "sex": "Sex",
262
- "sortBy": "Sort by",
263
- "sortWeight": "Sort weight",
264
199
  "sp02": "Sp02",
265
200
  "startAgeRangeInvalid": "Start age range is not valid",
266
- "startAVisit": "Start a visit",
267
- "startVisit": "Start visit",
268
- "startVisitError": "Error starting visit",
269
- "startVisitQueueSuccessfully": "Patient has been added to active visits list and queue.",
270
201
  "status": "Status",
271
202
  "statusIsRequired": "Status is required",
272
203
  "submitting": "Submitting...",
@@ -286,7 +217,6 @@
286
217
  "transitionPatientStatusOrQueue": "Select a new status or queue for patient to transition to.",
287
218
  "triageForm": "Triage form",
288
219
  "triageNote": "Triage note",
289
- "trySearchWithPatientUniqueID": "Try searching with the patient's unique ID number",
290
220
  "undoQueueEntryTransitionSuccess": "Undo transition success",
291
221
  "undoTransition": "Undo transition",
292
222
  "unexpectedServerResponse": "Unexpected Server Response",
@@ -295,14 +225,11 @@
295
225
  "updateRoom": "Update room",
296
226
  "useTodaysDate": "Use today's date",
297
227
  "visitQueueNumberAttributeUuid not configured": "visitQueueNumberAttributeUuid not configured",
298
- "visitStartTime": "Visit Time",
299
228
  "visitTabs": "Visit tabs",
300
229
  "visitType": "Visit Type",
301
230
  "vitals": "Vitals",
302
231
  "vitalsForm": "Vitals form",
303
232
  "vitalsNotRecordedForVisit": "Vitals has not been recorded for this patient for this visit",
304
233
  "waitingFor": "Waiting for",
305
- "weight": "Weight",
306
- "years": "Years",
307
- "youngest": "Youngest first"
234
+ "weight": "Weight"
308
235
  }