@kenyaemr/esm-service-queues-app 7.0.2-pre.66 → 7.0.2-pre.68
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.
- package/.turbo/turbo-build.log +14 -13
- package/dist/130.js +1 -1
- package/dist/130.js.map +1 -1
- package/dist/199.js +1 -0
- package/dist/{738.js.map → 199.js.map} +1 -1
- package/dist/271.js +1 -1
- package/dist/276.js +1 -1
- package/dist/319.js +1 -1
- package/dist/401.js +1 -1
- package/dist/430.js +1 -2
- package/dist/430.js.map +1 -1
- package/dist/460.js +1 -1
- package/dist/490.js +2 -0
- package/dist/490.js.map +1 -0
- package/dist/574.js +1 -1
- package/dist/6.js +1 -0
- package/dist/6.js.map +1 -0
- package/dist/60.js +1 -0
- package/dist/60.js.map +1 -0
- package/dist/600.js +1 -0
- package/dist/600.js.map +1 -0
- package/dist/644.js +1 -1
- package/dist/647.js +1 -1
- package/dist/647.js.map +1 -1
- package/dist/650.js +1 -1
- package/dist/650.js.map +1 -1
- package/dist/669.js +1 -1
- package/dist/669.js.map +1 -1
- package/dist/{806.js → 752.js} +1 -1
- package/dist/{806.js.map → 752.js.map} +1 -1
- package/dist/757.js +1 -1
- package/dist/764.js +1 -1
- package/dist/764.js.map +1 -1
- package/dist/788.js +1 -1
- package/dist/{981.js → 800.js} +1 -1
- package/dist/{981.js.map → 800.js.map} +1 -1
- package/dist/807.js +1 -1
- package/dist/{696.js → 828.js} +1 -1
- package/dist/{696.js.map → 828.js.map} +1 -1
- package/dist/833.js +1 -1
- package/dist/877.js +1 -1
- package/dist/877.js.map +1 -1
- package/dist/917.js +1 -1
- package/dist/917.js.map +1 -1
- package/dist/kenyaemr-esm-service-queues-app.js +1 -1
- package/dist/kenyaemr-esm-service-queues-app.js.buildmanifest.json +193 -193
- package/dist/kenyaemr-esm-service-queues-app.js.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/routes.json +1 -1
- package/package.json +2 -2
- package/src/add-patient-toqueue/add-patient-toqueue-dialog.component.tsx +4 -4
- package/src/add-provider-queue-room/add-provider-queue-room.component.tsx +12 -15
- package/src/config-schema.ts +20 -0
- package/src/helpers/helpers.ts +42 -32
- package/src/home.component.tsx +1 -1
- package/src/hooks/useQueueEntries.ts +1 -1
- package/src/hooks/useQueueService.ts +21 -0
- package/src/hooks/useQueueStatuses.ts +40 -0
- package/src/index.ts +5 -5
- package/src/patient-info/patient-info.component.tsx +9 -9
- package/src/patient-queue-header/patient-queue-header.component.tsx +30 -24
- package/src/patient-queue-header/patient-queue-header.scss +1 -2
- package/src/patient-queue-metrics/clinic-metrics.component.tsx +16 -27
- package/src/patient-queue-metrics/queue-metrics.resource.ts +1 -2
- package/src/patient-search/patient-scheduled-visits.scss +1 -1
- package/src/patient-search/patient-search.scss +6 -0
- package/src/patient-search/patient-search.workspace.tsx +30 -30
- package/src/patient-search/visit-form/visit-form.component.tsx +8 -8
- package/src/patient-search/visit-form/visit-form.scss +5 -3
- package/src/patient-search/visit-form-queue-fields/visit-form-queue-fields.component.tsx +14 -7
- package/src/queue-patient-linelists/queue-linelist-filter.scss +2 -12
- package/src/queue-rooms/queue-room-form.scss +1 -1
- package/src/queue-screen/queue-screen.component.tsx +1 -1
- package/src/queue-services/queue-service-form.scss +2 -2
- package/src/queue-table/cells/queue-table-action-cell.component.tsx +6 -4
- package/src/queue-table/cells/queue-table-action-cell.scss +7 -0
- package/src/queue-table/default-queue-table.component.tsx +69 -38
- package/src/queue-table/queue-entry-actions/{edit-queue-entry-modal.component.tsx → edit-queue-entry.modal.tsx} +1 -1
- package/src/queue-table/queue-entry-actions/{end-queue-entry-modal.component.tsx → end-queue-entry.modal.tsx} +1 -1
- package/src/queue-table/queue-entry-actions/{queue-entry-actions-modal.test.tsx → queue-entry-actions.test.tsx} +2 -2
- package/src/queue-table/queue-entry-actions/{queue-entry-confirm-action-modal.test.tsx → queue-entry-confirm-action.test.tsx} +3 -3
- package/src/queue-table/queue-entry-actions/{queue-entry-undo-actions-modal.test.tsx → queue-entry-undo-actions.test.tsx} +2 -2
- package/src/queue-table/queue-entry-actions/{transition-queue-entry-modal.component.tsx → transition-queue-entry.modal.tsx} +1 -1
- package/src/queue-table/queue-entry-actions/{undo-transition-queue-entry-modal.component.tsx → undo-transition-queue-entry.modal.tsx} +1 -1
- package/src/queue-table/queue-entry-actions/{void-queue-entry-modal.component.tsx → void-queue-entry.modal.tsx} +1 -1
- package/src/queue-table/queue-table-by-status-skeleton.component.tsx +18 -18
- package/src/queue-table/queue-table-metrics-card.scss +1 -1
- package/src/queue-table/queue-table-metrics.scss +1 -1
- package/src/queue-table/queue-table.component.tsx +35 -18
- package/src/queue-table/queue-table.scss +12 -4
- package/src/types/index.ts +3 -1
- package/src/views/queue-table-by-status-view.component.tsx +2 -14
- package/src/views/queue-tables-for-all-statuses.component.tsx +81 -43
- package/translations/am.json +29 -19
- package/translations/ar.json +33 -23
- package/translations/en.json +3 -2
- package/translations/es.json +29 -19
- package/translations/fr.json +29 -19
- package/translations/he.json +33 -23
- package/translations/km.json +31 -21
- package/translations/zh.json +39 -29
- package/translations/zh_CN.json +38 -28
- package/dist/185.js +0 -1
- package/dist/185.js.map +0 -1
- package/dist/233.js +0 -1
- package/dist/233.js.map +0 -1
- package/dist/237.js +0 -1
- package/dist/237.js.map +0 -1
- package/dist/703.js +0 -1
- package/dist/703.js.map +0 -1
- package/dist/738.js +0 -1
- /package/dist/{430.js.LICENSE.txt → 490.js.LICENSE.txt} +0 -0
- /package/src/queue-table/queue-entry-actions/{queue-entry-actions-modal.component.tsx → queue-entry-actions.modal.tsx} +0 -0
- /package/src/queue-table/queue-entry-actions/{queue-entry-confirm-action-modal.component.tsx → queue-entry-confirm-action.modal.tsx} +0 -0
|
@@ -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
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
+
}
|
package/src/types/index.ts
CHANGED
|
@@ -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
|
-
|
|
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> = ({
|
|
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
|
|
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
|
|
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
|
-
}:
|
|
145
|
+
}: QueueTableForQueueAndStatusProps) {
|
|
108
146
|
const statusUuid = status.uuid;
|
|
109
147
|
const columns = useColumns(queue.uuid, statusUuid);
|
|
110
148
|
const { t } = useTranslation();
|
package/translations/am.json
CHANGED
|
@@ -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
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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"
|