@kenyaemr/esm-service-queues-app 7.0.2-pre.67 → 7.0.3-pre.70

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 (115) hide show
  1. package/.turbo/turbo-build.log +14 -13
  2. package/dist/130.js +1 -1
  3. package/dist/130.js.map +1 -1
  4. package/dist/199.js +1 -0
  5. package/dist/{738.js.map → 199.js.map} +1 -1
  6. package/dist/271.js +1 -1
  7. package/dist/276.js +1 -1
  8. package/dist/319.js +1 -1
  9. package/dist/401.js +1 -1
  10. package/dist/430.js +1 -2
  11. package/dist/430.js.map +1 -1
  12. package/dist/460.js +1 -1
  13. package/dist/490.js +2 -0
  14. package/dist/490.js.map +1 -0
  15. package/dist/574.js +1 -1
  16. package/dist/6.js +1 -0
  17. package/dist/6.js.map +1 -0
  18. package/dist/60.js +1 -0
  19. package/dist/60.js.map +1 -0
  20. package/dist/600.js +1 -0
  21. package/dist/600.js.map +1 -0
  22. package/dist/644.js +1 -1
  23. package/dist/647.js +1 -1
  24. package/dist/647.js.map +1 -1
  25. package/dist/650.js +1 -1
  26. package/dist/650.js.map +1 -1
  27. package/dist/669.js +1 -1
  28. package/dist/669.js.map +1 -1
  29. package/dist/{806.js → 752.js} +1 -1
  30. package/dist/{806.js.map → 752.js.map} +1 -1
  31. package/dist/757.js +1 -1
  32. package/dist/764.js +1 -1
  33. package/dist/764.js.map +1 -1
  34. package/dist/788.js +1 -1
  35. package/dist/{981.js → 800.js} +1 -1
  36. package/dist/{981.js.map → 800.js.map} +1 -1
  37. package/dist/807.js +1 -1
  38. package/dist/{696.js → 828.js} +1 -1
  39. package/dist/{696.js.map → 828.js.map} +1 -1
  40. package/dist/833.js +1 -1
  41. package/dist/877.js +1 -1
  42. package/dist/877.js.map +1 -1
  43. package/dist/917.js +1 -1
  44. package/dist/917.js.map +1 -1
  45. package/dist/kenyaemr-esm-service-queues-app.js +1 -1
  46. package/dist/kenyaemr-esm-service-queues-app.js.buildmanifest.json +193 -193
  47. package/dist/kenyaemr-esm-service-queues-app.js.map +1 -1
  48. package/dist/main.js +1 -1
  49. package/dist/main.js.map +1 -1
  50. package/dist/routes.json +1 -1
  51. package/package.json +3 -3
  52. package/src/add-patient-toqueue/add-patient-toqueue-dialog.component.tsx +4 -4
  53. package/src/add-provider-queue-room/add-provider-queue-room.component.tsx +12 -15
  54. package/src/config-schema.ts +20 -0
  55. package/src/helpers/helpers.ts +42 -32
  56. package/src/home.component.tsx +1 -1
  57. package/src/hooks/useQueueEntries.ts +1 -1
  58. package/src/hooks/useQueueService.ts +21 -0
  59. package/src/hooks/useQueueStatuses.ts +40 -0
  60. package/src/index.ts +5 -5
  61. package/src/patient-info/patient-info.component.tsx +9 -9
  62. package/src/patient-queue-header/patient-queue-header.component.tsx +30 -24
  63. package/src/patient-queue-header/patient-queue-header.scss +1 -2
  64. package/src/patient-queue-metrics/clinic-metrics.component.tsx +16 -27
  65. package/src/patient-queue-metrics/queue-metrics.resource.ts +1 -2
  66. package/src/patient-search/patient-scheduled-visits.scss +1 -1
  67. package/src/patient-search/patient-search.scss +6 -0
  68. package/src/patient-search/patient-search.workspace.tsx +30 -30
  69. package/src/patient-search/visit-form/visit-form.component.tsx +8 -8
  70. package/src/patient-search/visit-form/visit-form.scss +5 -3
  71. package/src/patient-search/visit-form-queue-fields/visit-form-queue-fields.component.tsx +14 -7
  72. package/src/queue-patient-linelists/queue-linelist-filter.scss +2 -12
  73. package/src/queue-rooms/queue-room-form.scss +1 -1
  74. package/src/queue-screen/queue-screen.component.tsx +1 -1
  75. package/src/queue-services/queue-service-form.scss +2 -2
  76. package/src/queue-table/cells/queue-table-action-cell.component.tsx +6 -4
  77. package/src/queue-table/cells/queue-table-action-cell.scss +7 -0
  78. package/src/queue-table/default-queue-table.component.tsx +69 -38
  79. package/src/queue-table/queue-entry-actions/{edit-queue-entry-modal.component.tsx → edit-queue-entry.modal.tsx} +1 -1
  80. package/src/queue-table/queue-entry-actions/{end-queue-entry-modal.component.tsx → end-queue-entry.modal.tsx} +1 -1
  81. package/src/queue-table/queue-entry-actions/{queue-entry-actions-modal.test.tsx → queue-entry-actions.test.tsx} +2 -2
  82. package/src/queue-table/queue-entry-actions/{queue-entry-confirm-action-modal.test.tsx → queue-entry-confirm-action.test.tsx} +3 -3
  83. package/src/queue-table/queue-entry-actions/{queue-entry-undo-actions-modal.test.tsx → queue-entry-undo-actions.test.tsx} +2 -2
  84. package/src/queue-table/queue-entry-actions/{transition-queue-entry-modal.component.tsx → transition-queue-entry.modal.tsx} +1 -1
  85. package/src/queue-table/queue-entry-actions/{undo-transition-queue-entry-modal.component.tsx → undo-transition-queue-entry.modal.tsx} +1 -1
  86. package/src/queue-table/queue-entry-actions/{void-queue-entry-modal.component.tsx → void-queue-entry.modal.tsx} +1 -1
  87. package/src/queue-table/queue-table-by-status-skeleton.component.tsx +18 -18
  88. package/src/queue-table/queue-table-metrics-card.scss +1 -1
  89. package/src/queue-table/queue-table-metrics.scss +1 -1
  90. package/src/queue-table/queue-table.component.tsx +35 -18
  91. package/src/queue-table/queue-table.scss +12 -4
  92. package/src/types/index.ts +3 -1
  93. package/src/views/queue-table-by-status-view.component.tsx +2 -14
  94. package/src/views/queue-tables-for-all-statuses.component.tsx +81 -43
  95. package/translations/am.json +29 -19
  96. package/translations/ar.json +33 -23
  97. package/translations/en.json +3 -2
  98. package/translations/es.json +29 -19
  99. package/translations/fr.json +29 -19
  100. package/translations/he.json +33 -23
  101. package/translations/km.json +31 -21
  102. package/translations/zh.json +39 -29
  103. package/translations/zh_CN.json +38 -28
  104. package/dist/185.js +0 -1
  105. package/dist/185.js.map +0 -1
  106. package/dist/233.js +0 -1
  107. package/dist/233.js.map +0 -1
  108. package/dist/237.js +0 -1
  109. package/dist/237.js.map +0 -1
  110. package/dist/703.js +0 -1
  111. package/dist/703.js.map +0 -1
  112. package/dist/738.js +0 -1
  113. /package/dist/{430.js.LICENSE.txt → 490.js.LICENSE.txt} +0 -0
  114. /package/src/queue-table/queue-entry-actions/{queue-entry-actions-modal.component.tsx → queue-entry-actions.modal.tsx} +0 -0
  115. /package/src/queue-table/queue-entry-actions/{queue-entry-confirm-action-modal.component.tsx → queue-entry-confirm-action.modal.tsx} +0 -0
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { useTranslation } from 'react-i18next';
3
3
  import { type QueueEntry } from '../../types';
4
4
  import { voidQueueEntry } from './queue-entry-actions.resource';
5
- import QueueEntryConfirmActionModal from './queue-entry-confirm-action-modal.component';
5
+ import QueueEntryConfirmActionModal from './queue-entry-confirm-action.modal';
6
6
 
7
7
  interface VoidQueueEntryModalProps {
8
8
  queueEntry: QueueEntry;
@@ -2,31 +2,31 @@ import { DataTableSkeleton, SkeletonText, Tab, TabList, TabPanel, TabPanels, Tab
2
2
  import { isDesktop, useLayoutType } from '@openmrs/esm-framework';
3
3
  import React from 'react';
4
4
  import styles from './queue-table.scss';
5
+ import classNames from 'classnames';
5
6
 
6
7
  export const QueueTableByStatusSkeleton = () => {
7
8
  const layout = useLayoutType();
8
9
 
9
10
  return (
10
11
  <div className={styles.container}>
11
- <div className={styles.headerContainer}>
12
- <div className={!isDesktop(layout) ? styles.tabletHeading : styles.desktopHeading}>
13
- <h3>
14
- <SkeletonText />
15
- </h3>
16
- </div>
12
+ <div className={styles.statusTableContainer}>
13
+ <h5 className={styles.statusTableHeader}>
14
+ <SkeletonText width={'40%'} />
15
+ </h5>
16
+ <DataTableSkeleton showHeader={false} />
17
+ </div>
18
+ <div className={styles.statusTableContainer}>
19
+ <h5 className={styles.statusTableHeader}>
20
+ <SkeletonText width={'40%'} />
21
+ </h5>
22
+ <DataTableSkeleton showHeader={false} />
23
+ </div>
24
+ <div className={styles.statusTableContainer}>
25
+ <h5 className={styles.statusTableHeader}>
26
+ <SkeletonText width={'40%'} />
27
+ </h5>
28
+ <DataTableSkeleton showHeader={false} />
17
29
  </div>
18
- <Tabs selectedIndex={0}>
19
- <TabList>
20
- <Tab>
21
- <SkeletonText />
22
- </Tab>
23
- </TabList>
24
- </Tabs>
25
- <TabPanels>
26
- <TabPanel>
27
- <DataTableSkeleton />
28
- </TabPanel>
29
- </TabPanels>
30
30
  </div>
31
31
  );
32
32
  };
@@ -15,7 +15,7 @@
15
15
  }
16
16
 
17
17
  .tileContainerWithoutBorder {
18
- height: 4.875rem;
18
+ padding: spacing.$spacing-04;
19
19
  }
20
20
 
21
21
  .tileHeader {
@@ -7,5 +7,5 @@
7
7
  display: flex;
8
8
  justify-content: space-between;
9
9
  flex-flow: row wrap;
10
- margin-top: -(spacing.$spacing-03);
10
+ margin: spacing.$spacing-05;
11
11
  }
@@ -22,6 +22,8 @@ import { useTranslation } from 'react-i18next';
22
22
  import { type QueueEntry, type QueueTableColumn } from '../types';
23
23
  import styles from './queue-table.scss';
24
24
  import { useColumns } from './cells/columns.resource';
25
+ import classNames from 'classnames';
26
+ import { DataTableSkeleton } from '@carbon/react';
25
27
 
26
28
  interface QueueTableProps {
27
29
  queueEntries: QueueEntry[];
@@ -48,6 +50,8 @@ interface QueueTableProps {
48
50
 
49
51
  // if provided, adds title to the top-left
50
52
  header?: string;
53
+
54
+ isLoading?: boolean;
51
55
  }
52
56
 
53
57
  function QueueTable({
@@ -59,12 +63,13 @@ function QueueTable({
59
63
  ExpandedRow,
60
64
  tableFilter,
61
65
  header,
66
+ isLoading,
62
67
  }: QueueTableProps) {
63
68
  const { t } = useTranslation();
64
69
  const [currentPageSize, setPageSize] = useState(10);
65
70
  const pageSizes = [10, 20, 30, 40, 50];
66
71
 
67
- const { goTo, results: paginatedQueueEntries, currentPage } = usePagination(queueEntries, currentPageSize);
72
+ const { goTo, results: paginatedQueueEntries, currentPage, paginated } = usePagination(queueEntries, currentPageSize);
68
73
  const layout = useLayoutType();
69
74
  const responsiveSize = isDesktop(layout) ? 'sm' : 'lg';
70
75
 
@@ -84,6 +89,10 @@ function QueueTable({
84
89
  return row;
85
90
  }) ?? [];
86
91
 
92
+ if (isLoading) {
93
+ return <DataTableSkeleton role="progressbar" />;
94
+ }
95
+
87
96
  if (columns.length == 0) {
88
97
  return <p>{t('noColumnsDefined', 'No table columns defined. Check Configuration')}</p>;
89
98
  }
@@ -130,7 +139,13 @@ function QueueTable({
130
139
  <React.Fragment key={row.id}>
131
140
  <Row {...getRowProps({ row })}>
132
141
  {row.cells.map((cell) => (
133
- <TableCell key={cell.id}>{cell.value}</TableCell>
142
+ <TableCell
143
+ key={cell.id}
144
+ className={classNames({
145
+ 'cds--table-column-menu': cell?.id?.split(':')?.[1] === 'actions',
146
+ })}>
147
+ {cell.value}
148
+ </TableCell>
134
149
  ))}
135
150
  </Row>
136
151
  {ExpandedRow && row.isExpanded && (
@@ -154,22 +169,24 @@ function QueueTable({
154
169
  </Tile>
155
170
  </div>
156
171
  )}
157
- <Pagination
158
- forwardText={t('nextPage', 'Next page')}
159
- backwardText={t('previousPage', 'Previous page')}
160
- page={currentPage}
161
- pageSize={currentPageSize}
162
- pageSizes={pageSizes}
163
- totalItems={queueEntries?.length}
164
- onChange={({ pageSize, page }) => {
165
- if (pageSize !== currentPageSize) {
166
- setPageSize(pageSize);
167
- }
168
- if (page !== currentPage) {
169
- goTo(page);
170
- }
171
- }}
172
- />
172
+ {paginated && (
173
+ <Pagination
174
+ forwardText={t('nextPage', 'Next page')}
175
+ backwardText={t('previousPage', 'Previous page')}
176
+ page={currentPage}
177
+ pageSize={currentPageSize}
178
+ pageSizes={pageSizes}
179
+ totalItems={queueEntries?.length}
180
+ onChange={({ pageSize, page }) => {
181
+ if (pageSize !== currentPageSize) {
182
+ setPageSize(pageSize);
183
+ }
184
+ if (page !== currentPage) {
185
+ goTo(page);
186
+ }
187
+ }}
188
+ />
189
+ )}
173
190
  </>
174
191
  )}
175
192
  </DataTable>
@@ -16,7 +16,10 @@
16
16
 
17
17
  .headerButtons {
18
18
  display: flex;
19
- flex-flow: column;
19
+ justify-content: space-between;
20
+ .filterSearch {
21
+ margin-left: spacing.$spacing-05;
22
+ }
20
23
  }
21
24
 
22
25
  .filterContainer {
@@ -61,7 +64,7 @@
61
64
 
62
65
  .tableContainer {
63
66
  background-color: $ui-01;
64
- margin: 0 spacing.$spacing-05;
67
+ // margin: 0 spacing.$spacing-05;
65
68
  padding: 0;
66
69
 
67
70
  a {
@@ -78,6 +81,7 @@
78
81
 
79
82
  .toolbarContainer {
80
83
  display: flex;
84
+ justify-content: space-between;
81
85
  }
82
86
 
83
87
  .toolbarContent {
@@ -175,8 +179,8 @@ html[dir='rtl'] {
175
179
  .tileContainer {
176
180
  background-color: $ui-02;
177
181
  border-top: 1px solid $ui-03;
178
- padding: 5rem 0;
179
- margin: 0 spacing.$spacing-05;
182
+ padding: 2rem 0;
183
+ // margin: 0 spacing.$spacing-05;
180
184
  }
181
185
 
182
186
  .tile {
@@ -190,3 +194,7 @@ html[dir='rtl'] {
190
194
  justify-content: center;
191
195
  align-items: center;
192
196
  }
197
+
198
+ .paddedQueueTable {
199
+ padding: 0 spacing.$spacing-05;
200
+ }
@@ -489,6 +489,8 @@ export interface QueueEntrySearchCriteria {
489
489
  // TODO: The follow types match the types from backend.
490
490
  // They should be common enough to move to esm-core
491
491
 
492
- export interface Concept extends OpenmrsResource {}
492
+ export interface Concept extends OpenmrsResource {
493
+ setMembers?: Array<Concept>;
494
+ }
493
495
 
494
496
  export interface Provider extends OpenmrsResource {}
@@ -1,25 +1,13 @@
1
- import { InlineNotification } from '@carbon/react';
2
1
  import React from 'react';
3
- import { useTranslation } from 'react-i18next';
4
2
  import { useParams } from 'react-router-dom';
5
3
  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
4
  import QueueTablesForAllStatuses from './queue-tables-for-all-statuses.component';
9
5
 
10
6
  const QueueTableByStatusView: React.FC = () => {
11
7
  const { queueUuid, statusUuid } = useParams();
12
- const { queue, isLoading } = useQueue(queueUuid);
13
- const status = queue?.allowedStatuses.find((s) => s.uuid == statusUuid);
14
- const { t } = useTranslation();
8
+ const { queue, isLoading: isLoadingQueue, error } = useQueue(queueUuid);
15
9
 
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
- }
10
+ return <QueueTablesForAllStatuses selectedQueue={queue} isLoadingQueue={isLoadingQueue} errorFetchingQueue={error} />;
23
11
  };
24
12
 
25
13
  export default QueueTableByStatusView;
@@ -10,23 +10,96 @@ import QueueTable from '../queue-table/queue-table.component';
10
10
  import QueueTableMetrics from '../queue-table/queue-table-metrics.component';
11
11
  import styles from '../queue-table/queue-table.scss';
12
12
  import type { Concept, Queue, QueueEntry } from '../types';
13
+ import PatientQueueHeader from '../patient-queue-header/patient-queue-header.component';
14
+ import { SearchSkeleton } from '@carbon/react';
15
+ import { SkeletonText } from '@carbon/react';
13
16
 
14
17
  interface QueueTablesForAllStatusesProps {
15
18
  selectedQueue: Queue; // the selected queue
19
+ isLoadingQueue: boolean; // whether the queue is still loading
20
+ errorFetchingQueue: Error;
16
21
  }
17
22
 
18
23
  // displays the queue entries of a given queue by
19
24
  // showing one table per status
20
- const QueueTablesForAllStatuses: React.FC<QueueTablesForAllStatusesProps> = ({ selectedQueue }) => {
25
+ const QueueTablesForAllStatuses: React.FC<QueueTablesForAllStatusesProps> = ({
26
+ selectedQueue,
27
+ isLoadingQueue,
28
+ errorFetchingQueue,
29
+ }) => {
21
30
  const layout = useLayoutType();
22
31
  const { t } = useTranslation();
23
32
 
24
- const { queueEntries, isLoading, isValidating } = useQueueEntries({ queue: selectedQueue.uuid, isEnded: false });
25
- const allowedStatuses = selectedQueue.allowedStatuses;
26
33
  const [searchTerm, setSearchTerm] = useState('');
27
34
 
35
+ if (errorFetchingQueue) {
36
+ return (
37
+ <InlineNotification
38
+ kind="error"
39
+ title={t('invalidQueue', 'Invalid Queue')}
40
+ subtitle={errorFetchingQueue?.message}
41
+ />
42
+ );
43
+ }
44
+
45
+ return (
46
+ <>
47
+ <PatientQueueHeader
48
+ title={!isLoadingQueue ? selectedQueue?.display : <SkeletonText />}
49
+ showLocationDropdown={false}
50
+ actions={
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: isDesktop(layout) ? 'sm' : 'lg',
61
+ },
62
+ selectPatientAction: (selectedPatientUuid) => {
63
+ launchWorkspace('service-queues-patient-search', {
64
+ selectedPatientUuid,
65
+ currentServiceQueueUuid: selectedQueue.uuid,
66
+ });
67
+ },
68
+ }}
69
+ />
70
+ <div className={styles.filterSearch}>
71
+ <Search
72
+ labelText=""
73
+ placeholder={t('filterTable', 'Filter table')}
74
+ onChange={(e) => setSearchTerm(e.target.value)}
75
+ size={isDesktop(layout) ? 'sm' : 'lg'}
76
+ disabled={isLoadingQueue}
77
+ />
78
+ </div>
79
+ </div>
80
+ }
81
+ />
82
+ {!isLoadingQueue && <QueueTableMetrics selectedQueue={selectedQueue} />}
83
+ {!isLoadingQueue ? (
84
+ <QueueTablesByStatus selectedQueue={selectedQueue} searchTerm={searchTerm} />
85
+ ) : (
86
+ <QueueTableByStatusSkeleton />
87
+ )}
88
+ </>
89
+ );
90
+ };
91
+
92
+ interface QueueTablesByStatusProps {
93
+ selectedQueue: Queue;
94
+ searchTerm: string;
95
+ }
96
+
97
+ function QueueTablesByStatus({ selectedQueue, searchTerm }: QueueTablesByStatusProps) {
98
+ const { t } = useTranslation();
99
+ const { queueEntries, isLoading, isValidating } = useQueueEntries({ queue: selectedQueue.uuid, isEnded: false });
100
+ const allowedStatuses = selectedQueue.allowedStatuses.reverse();
28
101
  const noStatuses = !allowedStatuses?.length;
29
- if (isLoading && !queueEntries.length) {
102
+ if (isLoading) {
30
103
  return <QueueTableByStatusSkeleton />;
31
104
  } else if (noStatuses) {
32
105
  return (
@@ -38,58 +111,23 @@ const QueueTablesForAllStatuses: React.FC<QueueTablesForAllStatusesProps> = ({ s
38
111
  />
39
112
  );
40
113
  }
41
-
42
114
  return (
43
115
  <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
116
  {allowedStatuses?.map((status) => (
79
117
  <QueueTableForQueueAndStatus
118
+ isValidating={isValidating}
80
119
  key={status.uuid}
81
120
  queueEntries={queueEntries}
82
121
  searchTerm={searchTerm}
83
122
  queue={selectedQueue}
84
123
  status={status}
85
- isValidating={isValidating}
86
124
  />
87
125
  ))}
88
126
  </div>
89
127
  );
90
- };
128
+ }
91
129
 
92
- interface QueueTableForQueueAndStatus {
130
+ interface QueueTableForQueueAndStatusProps {
93
131
  queueEntries: QueueEntry[];
94
132
  isValidating: boolean;
95
133
  searchTerm: string;
@@ -104,7 +142,7 @@ function QueueTableForQueueAndStatus({
104
142
  searchTerm,
105
143
  queue,
106
144
  status,
107
- }: QueueTableForQueueAndStatus) {
145
+ }: QueueTableForQueueAndStatusProps) {
108
146
  const statusUuid = status.uuid;
109
147
  const columns = useColumns(queue.uuid, statusUuid);
110
148
  const { t } = useTranslation();
@@ -2,15 +2,15 @@
2
2
  "actions": "Actions",
3
3
  "activeVisits": "Active Visits",
4
4
  "activeVisitsNotInQueue": "Active visits not in queue",
5
+ "addAProviderQueueRoom": "Add a provider queue room?",
5
6
  "addEntry": "Add entry",
6
7
  "addisitToQueueTooltip": "Add to queue",
7
- "addNewQueueService": "Add new queue service",
8
+ "addNewQueueService": "Add New Queue Service",
8
9
  "addNewQueueServiceRoom": "Add new queue service room",
9
10
  "addNewService": "Add new service",
10
11
  "addNewServiceRoom": "Add new service room",
11
- "addPatientToList": "Add patient to list",
12
12
  "addPatientToQueue": "Add patient to queue",
13
- "addProviderQueueRoom": "Add provider queue room?",
13
+ "addProviderQueueRoom": "Add provider queue room",
14
14
  "addQueue": "Add queue",
15
15
  "addQueueName": "Please add a queue name",
16
16
  "addQueueRoom": "Add queue room",
@@ -29,6 +29,7 @@
29
29
  "applyFilters": "Apply filters",
30
30
  "averageWaitTime": "Average wait time today",
31
31
  "backToScheduledVisits": "Back to scheduled visits",
32
+ "backToSearchResults": "Back to search results",
32
33
  "backToSimpleSearch": "Back to simple search",
33
34
  "between": "Between",
34
35
  "bmi": "Bmi",
@@ -39,7 +40,6 @@
39
40
  "checkFilters": "Check the filters above",
40
41
  "chooseRoom": "Select a room",
41
42
  "chooseService": "Select a service",
42
- "chooseStatus": "Select a status",
43
43
  "clearAllQueueEntries": "Clear all queue entries?",
44
44
  "clearAllQueueEntriesWarningMessage": "Clearing all queue entries will remove all the patients from the queues",
45
45
  "clearQueue": "Clear queue",
@@ -50,6 +50,7 @@
50
50
  "confirmDeleteQueueEntry": "Are you sure you want to delete this queue entry?",
51
51
  "confirmMoveBackQueueAndStatus": "Are you sure you want to move patient back to queue \"{{queue}}\" with status \"{{status}}\"?",
52
52
  "confirmMoveBackStatus": "Are you sure you want to move patient back to status \"{{status}}\"?",
53
+ "confirmRemovePatientFromQueue": "Are you sure you want to remove this patient from this queue?",
53
54
  "currentValueFormatted": "{{value}} (Current)",
54
55
  "currentVisit": "Current visit",
55
56
  "date": "Date",
@@ -77,11 +78,11 @@
77
78
  "errorLoadingQueueEntries": "Error loading queue entries",
78
79
  "errorPostingToScreen": "Error posting to screen",
79
80
  "facility": "Facility",
81
+ "failedToLoadRecommendedVisitTypes": "Failed to load recommended visit types",
80
82
  "female": "Female",
81
83
  "femaleLabelText": "Female",
82
84
  "fields": "of the following fields",
83
85
  "filter": "Filter (1)",
84
- "filters": "Filters",
85
86
  "filterTable": "Filter table",
86
87
  "firstName": "First name",
87
88
  "firstNameSort": "First name (a-z)",
@@ -94,15 +95,15 @@
94
95
  "hourAndMinuteFormatted": "{{hours}} hour(s) and {{minutes}} minute(s)",
95
96
  "idNumber": "ID Number",
96
97
  "indication": "Indication",
97
- "InQueue": "In Queue",
98
98
  "invalidQueue": "Invalid Queue",
99
- "lastClinicalVisit": "Last clinical visit",
99
+ "invalidtableConfig": "Invalid table configuration",
100
100
  "lastEncounter": "Last encounter",
101
101
  "lastName": "Last name",
102
102
  "lastNameSort": "Last name (a-z)",
103
103
  "lastVisit": "Last visit",
104
104
  "lastVisitDate": "Date",
105
105
  "loading": "Loading...",
106
+ "location": "Location",
106
107
  "male": "Male",
107
108
  "maleLabelText": "Male",
108
109
  "match": "Match",
@@ -118,32 +119,35 @@
118
119
  "missingQueueRoomService": "Missing queue room service",
119
120
  "missingService": "Missing service",
120
121
  "missingVisitType": "Missing visit type",
122
+ "modifyDefaultValue": "Modify default value",
121
123
  "movePatientToNextService": "Move patient to the next service?",
122
124
  "moveToNextService": "Move to next service",
123
125
  "name": "Name",
124
126
  "nextPage": "Next page",
125
127
  "noActiveVisitsForLocation": "There are no active visits to display for this location.",
126
128
  "noAppointmentsFound": "No appointments found",
129
+ "noColumnsDefined": "No table columns defined. Check Configuration",
127
130
  "noEncountersFound": "No encounters found",
128
131
  "noLastEncounter": "There is no last encounter to display for this patient",
129
132
  "noLocationsAvailable": "No locations available",
130
133
  "noMedicationsFound": "No medications found",
131
- "none": "None",
132
134
  "noNotesFound": "No notes found",
133
135
  "noPatientFoundMessage": "Sorry, no patient has been found",
134
136
  "noPatientsToDisplay": "No patients to display",
135
137
  "noPreviousVisitFound": "No previous visit found",
136
138
  "noPrioritiesConfigured": "No priorities configured",
139
+ "noPrioritiesForService": "The selected service does not have any allowed priorities. This is an error in configuration. Please contact your system administrator.",
140
+ "noPrioritiesForServiceTitle": "No priorities available",
137
141
  "noPriorityFound": "No priority found",
138
142
  "noResultsFound": "No results found",
139
143
  "noReturnDate": "There is no return date to display for this patient",
140
144
  "noServicesAvailable": "No services available",
141
145
  "noServicesConfigured": "No services configured",
142
146
  "noStatusConfigured": "No status configured",
147
+ "notableConfig": "No table configuration",
143
148
  "notes": "Notes",
144
- "NotInQueue": "Not In Queue",
145
149
  "noVisitsNotInQueueFound": "No visits currently not in queue found",
146
- "noVisitTypes": "There are no visit types to display for this patient",
150
+ "noVisitTypesMatchingSearch": "There are no visit types matching this search text",
147
151
  "noVitalsFound": "No vitals found",
148
152
  "oldest": "Oldest first",
149
153
  "onTime": "On time",
@@ -152,12 +156,16 @@
152
156
  "orderIndefiniteDuration": "Indefinite duration",
153
157
  "orInProperFormat": "Or",
154
158
  "orPatientName": "OR the patient's name(s)",
159
+ "patientAge": "Age",
155
160
  "patientAlreadyInQueue": "Patient is already in the queue",
156
161
  "patientAttendingService": "Patient attending service",
157
162
  "patientHasActiveVisit": "The patient already has an active visit",
158
163
  "patientList": "Patient list",
159
164
  "patientName": "Patient name",
160
165
  "patientNotInQueue": "The patient is not in the queue",
166
+ "patientRemoved": "Patient removed",
167
+ "patientRemovedFailed": "Error removing patient from queue",
168
+ "patientRemovedSuccessfully": "Paient removed from queue successfully",
161
169
  "patientRequeued": "Patient has been requeued",
162
170
  "patients": "Patients",
163
171
  "patientsCurrentlyInQueue": "Patients currently in queue",
@@ -176,7 +184,6 @@
176
184
  "provider": "Provider",
177
185
  "quantity": "Quantity",
178
186
  "queueAddedSuccessfully": "Queue added successfully",
179
- "queueComingFrom": "Coming from",
180
187
  "queueEntryAddedSuccessfully": "Queue entry added successfully",
181
188
  "queueEntryAddFailed": "Error adding queue entry status",
182
189
  "queueEntryDeleteFailed": "Error deleting queue entry",
@@ -198,7 +205,6 @@
198
205
  "queueLocation": "Queue Location",
199
206
  "queueLocationRequired": "Queue location is required",
200
207
  "queueName": "Queue name",
201
- "queueNumber": "Queue Number",
202
208
  "queuePriority": "Queue priority",
203
209
  "queueRoom": "Queue room",
204
210
  "queueRoomAddedSuccessfully": "Queue room added successfully",
@@ -214,6 +220,8 @@
214
220
  "recommended": "Recommended",
215
221
  "refills": "Refills",
216
222
  "removeFromQueueAndEndVisit": "Remove patient from queue and end active visit?",
223
+ "removePatient": "Remove patient",
224
+ "removePatientFromQueue": "Remove patient from queue",
217
225
  "removeQueueEntryError": "Error removing queue entry",
218
226
  "requeue": "Requeue",
219
227
  "retainLocation": "Retain location",
@@ -227,11 +235,12 @@
227
235
  "searchboxPlaceholder": "Search for a patient name or ID number",
228
236
  "searchForAVisitType": "Search for a visit type",
229
237
  "searchForPatient": "Search for a patient",
238
+ "searchPatient": "Search Patient",
230
239
  "searchThisList": "Search this list",
231
240
  "secondaryHelperText": "Type the patient's name or unique ID number",
241
+ "selectALocation": "Select a location",
232
242
  "selectAVisitType": "Select visit type",
233
243
  "selectFacility": "Select a facility",
234
- "selectLocation": "Select a location",
235
244
  "selectOption": "Select an option",
236
245
  "selectProgramType": "Select program type",
237
246
  "selectQueue": "Select a queue",
@@ -240,7 +249,6 @@
240
249
  "selectRoom": "Select a room",
241
250
  "selectService": "Select a service",
242
251
  "selectServiceType": "Select a service type",
243
- "selectStatus": "Select a status",
244
252
  "selectVisitType": "Please select a Visit Type",
245
253
  "serve": "Serve",
246
254
  "servePatient": "Serve patient",
@@ -259,28 +267,31 @@
259
267
  "startVisitError": "Error starting visit",
260
268
  "startVisitQueueSuccessfully": "Patient has been added to active visits list and queue.",
261
269
  "status": "Status",
262
- "submitting": "Submitting...",
270
+ "statusIsRequired": "Status is required",
271
+ "submitting": "Submitting",
263
272
  "success": "Success",
264
- "tcaDate": "Tca date",
265
273
  "temperature": "Temperature",
266
274
  "ticketNumber": "Ticket number",
267
275
  "time": "Time",
276
+ "timeCannotBeInFuture": "Time cannot be in the future",
277
+ "timeOfTransition": "Time of transition",
268
278
  "tirageNotYetCompleted": "Triage has not yet been completed",
269
279
  "today": "Today",
270
- "transfer": "Transfer",
280
+ "totalPatients": "Total Patients",
271
281
  "transition": "Transition",
272
282
  "transitionPatient": "Transition patient",
273
283
  "transitionPatientStatusOrQueue": "Select a new status or queue for patient to transition to.",
274
284
  "triageForm": "Triage form",
275
285
  "triageNote": "Triage note",
276
286
  "trySearchWithPatientUniqueID": "Try searching with the patient's unique ID number",
287
+ "undoQueueEntryTransitionSuccess": "Undo transition success",
277
288
  "undoTransition": "Undo transition",
278
289
  "unexpectedServerResponse": "Unexpected Server Response",
279
290
  "unknown": "Unknown",
280
291
  "updateEntry": "Update entry",
281
292
  "updateRoom": "Update room",
282
293
  "useTodaysDate": "Use today's date",
283
- "view": "View",
294
+ "visitQueueNumberAttributeUuid not configured": "visitQueueNumberAttributeUuid not configured",
284
295
  "visitStartTime": "Visit Time",
285
296
  "visitTabs": "Visit tabs",
286
297
  "visitType": "Visit Type",
@@ -288,7 +299,6 @@
288
299
  "vitalsForm": "Vitals form",
289
300
  "vitalsNotRecordedForVisit": "Vitals has not been recorded for this patient for this visit",
290
301
  "waitingFor": "Waiting for",
291
- "waitTime": "Wait time",
292
302
  "weight": "Weight",
293
303
  "years": "Years",
294
304
  "youngest": "Youngest first"