@kenyaemr/esm-service-queues-app 7.0.3-pre.80 → 7.0.3-pre.88
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 +8 -8
- package/dist/{490.js → 384.js} +2 -2
- package/dist/{490.js.map → 384.js.map} +1 -1
- package/dist/600.js +1 -1
- package/dist/600.js.map +1 -1
- package/dist/kenyaemr-esm-service-queues-app.js +1 -1
- package/dist/kenyaemr-esm-service-queues-app.js.buildmanifest.json +33 -33
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/routes.json +1 -1
- package/package.json +1 -1
- package/src/hooks/useQueueEntries.ts +33 -8
- package/src/hooks/useQueueService.ts +2 -2
- package/src/patient-queue-metrics/clinic-metrics.component.tsx +2 -1
- package/src/queue-table/default-queue-table.component.tsx +11 -6
- /package/dist/{490.js.LICENSE.txt → 384.js.LICENSE.txt} +0 -0
package/dist/routes.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"$schema":"https://json.openmrs.org/routes.schema.json","backendDependencies":{"webservices.rest":"^2.2.0","queue":"^2.4.0-0"},"extensions":[{"name":"outpatient-side-nav-ext","component":"outpatientSideNav","slot":"outpatient-sidebar-slot","online":true,"offline":true},{"name":"service-queues-dashboard-link","component":"serviceQueuesDashboardLink","slot":"homepage-dashboard-slot","meta":{"name":"service-queues","slot":"service-queues-dashboard-slot","title":"Service queues"},"online":true,"offline":true},{"name":"queue-table-by-status-menu-dashboard-link","component":"queueTableByStatusMenu","meta":{"name":"service-queues","slot":"service-queues-dashboard-slot","title":"Service queues"},"online":true,"offline":true},{"component":"root","name":"service-queues-dashboard","slot":"service-queues-dashboard-slot"},{"name":"edit-queue-entry-status-modal","component":"editQueueEntryStatusModal"},{"name":"patient-info-banner-slot","component":"patientInfoBannerSlot"},{"name":"remove-queue-entry","component":"removeQueueEntry"},{"name":"clear-all-queue-entries","component":"clearAllQueueEntries"},{"name":"add-visit-to-queue-modal","component":"addVisitToQueueModal"},{"name":"transition-queue-entry-status-modal","component":"transitionQueueEntryStatusModal"},{"name":"previous-visit-summary-widget","component":"pastVisitSummary","slot":"previous-visit-summary-slot"},{"name":"add-provider-to-room-modal","component":"addProviderToRoomModal"},{"name":"transition-queue-entry-modal","component":"transitionQueueEntryModal"},{"name":"edit-queue-entry-modal","component":"editQueueEntryModal"},{"name":"undo-transition-queue-entry-modal","component":"undoTransitionQueueEntryModal"},{"name":"void-queue-entry-modal","component":"voidQueueEntryModal"},{"name":"end-queue-entry-modal","component":"endQueueEntryModal"},{"name":"active-visits-row-actions","component":"activeVisitsRowActions","slot":"queue-table-serve-patient-slot"},{"name":"visit-form-queue-fields","component":"visitFormQueueFields","slot":"visit-form-queue-slot"}],"workspaces":[{"name":"service-queues-service-form","title":"addNewQueueService","component":"addNewQueueServiceWorkspace","type":"service-queues"},{"name":"service-queues-room-form","title":"addNewQueueServiceRoom","component":"addNewQueueServiceRoomWorkspace","type":"service-queues"},{"name":"service-queues-linelist-filter","title":"filter","component":"queueLinelistFilterWorkspace","type":"service-queues"},{"name":"service-queues-patient-search","title":"searchPatient","component":"patientSearchWorkspace","type":"service-queues"}],"version":"7.0.3-pre.
|
|
1
|
+
{"$schema":"https://json.openmrs.org/routes.schema.json","backendDependencies":{"webservices.rest":"^2.2.0","queue":"^2.4.0-0"},"extensions":[{"name":"outpatient-side-nav-ext","component":"outpatientSideNav","slot":"outpatient-sidebar-slot","online":true,"offline":true},{"name":"service-queues-dashboard-link","component":"serviceQueuesDashboardLink","slot":"homepage-dashboard-slot","meta":{"name":"service-queues","slot":"service-queues-dashboard-slot","title":"Service queues"},"online":true,"offline":true},{"name":"queue-table-by-status-menu-dashboard-link","component":"queueTableByStatusMenu","meta":{"name":"service-queues","slot":"service-queues-dashboard-slot","title":"Service queues"},"online":true,"offline":true},{"component":"root","name":"service-queues-dashboard","slot":"service-queues-dashboard-slot"},{"name":"edit-queue-entry-status-modal","component":"editQueueEntryStatusModal"},{"name":"patient-info-banner-slot","component":"patientInfoBannerSlot"},{"name":"remove-queue-entry","component":"removeQueueEntry"},{"name":"clear-all-queue-entries","component":"clearAllQueueEntries"},{"name":"add-visit-to-queue-modal","component":"addVisitToQueueModal"},{"name":"transition-queue-entry-status-modal","component":"transitionQueueEntryStatusModal"},{"name":"previous-visit-summary-widget","component":"pastVisitSummary","slot":"previous-visit-summary-slot"},{"name":"add-provider-to-room-modal","component":"addProviderToRoomModal"},{"name":"transition-queue-entry-modal","component":"transitionQueueEntryModal"},{"name":"edit-queue-entry-modal","component":"editQueueEntryModal"},{"name":"undo-transition-queue-entry-modal","component":"undoTransitionQueueEntryModal"},{"name":"void-queue-entry-modal","component":"voidQueueEntryModal"},{"name":"end-queue-entry-modal","component":"endQueueEntryModal"},{"name":"active-visits-row-actions","component":"activeVisitsRowActions","slot":"queue-table-serve-patient-slot"},{"name":"visit-form-queue-fields","component":"visitFormQueueFields","slot":"visit-form-queue-slot"}],"workspaces":[{"name":"service-queues-service-form","title":"addNewQueueService","component":"addNewQueueServiceWorkspace","type":"service-queues"},{"name":"service-queues-room-form","title":"addNewQueueServiceRoom","component":"addNewQueueServiceRoomWorkspace","type":"service-queues"},{"name":"service-queues-linelist-filter","title":"filter","component":"queueLinelistFilterWorkspace","type":"service-queues"},{"name":"service-queues-patient-search","title":"searchPatient","component":"patientSearchWorkspace","type":"service-queues"}],"version":"7.0.3-pre.88"}
|
package/package.json
CHANGED
|
@@ -3,6 +3,7 @@ import { type QueueEntry, type QueueEntrySearchCriteria } from '../types';
|
|
|
3
3
|
import useSWR from 'swr';
|
|
4
4
|
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
5
5
|
import { useSWRConfig } from 'swr/_internal';
|
|
6
|
+
import isEqual from 'lodash-es/isEqual';
|
|
6
7
|
|
|
7
8
|
type QueueEntryResponse = FetchResponse<{
|
|
8
9
|
results: Array<QueueEntry>;
|
|
@@ -84,11 +85,37 @@ export function useQueueEntries(searchCriteria?: QueueEntrySearchCriteria, rep:
|
|
|
84
85
|
const [data, setData] = useState<Array<Array<QueueEntry>>>([]);
|
|
85
86
|
const [totalCount, setTotalCount] = useState<number>();
|
|
86
87
|
const [currentPage, setCurrentPage] = useState<number>(0);
|
|
87
|
-
const [
|
|
88
|
+
const [currentSearchCriteria, setCurrentSearchCriteria] = useState(searchCriteria);
|
|
89
|
+
const [currentRep, setCurrentRep] = useState(rep);
|
|
90
|
+
const [pageUrl, setPageUrl] = useState<string>(getInitialUrl(currentRep, currentSearchCriteria));
|
|
88
91
|
const [error, setError] = useState<Error>();
|
|
89
92
|
const { mutateQueueEntries } = useMutateQueueEntries();
|
|
90
93
|
const [waitingForMutate, setWaitingForMutate] = useState(false);
|
|
91
94
|
|
|
95
|
+
const refetchAllData = useCallback(
|
|
96
|
+
(newRep: string = currentRep, newSearchCriteria: QueueEntrySearchCriteria = currentSearchCriteria) => {
|
|
97
|
+
setWaitingForMutate(true);
|
|
98
|
+
setCurrentPage(0);
|
|
99
|
+
setPageUrl(getInitialUrl(newRep, newSearchCriteria));
|
|
100
|
+
},
|
|
101
|
+
[currentRep, currentSearchCriteria],
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
// This hook listens to the searchCriteria and rep values and refetches the data when they change.
|
|
105
|
+
useEffect(() => {
|
|
106
|
+
const isSearchCriteriaUpdated = !isEqual(currentSearchCriteria, searchCriteria);
|
|
107
|
+
const isRepUpdated = currentRep !== rep;
|
|
108
|
+
if (isSearchCriteriaUpdated || isRepUpdated) {
|
|
109
|
+
if (isSearchCriteriaUpdated) {
|
|
110
|
+
setCurrentSearchCriteria(searchCriteria);
|
|
111
|
+
}
|
|
112
|
+
if (isRepUpdated) {
|
|
113
|
+
setCurrentRep(rep);
|
|
114
|
+
}
|
|
115
|
+
refetchAllData(rep, searchCriteria);
|
|
116
|
+
}
|
|
117
|
+
}, [searchCriteria, currentSearchCriteria, setCurrentSearchCriteria, currentRep, rep]);
|
|
118
|
+
|
|
92
119
|
const { data: pageData, isValidating, error: pageError } = useSWR<QueueEntryResponse, Error>(pageUrl, openmrsFetch);
|
|
93
120
|
|
|
94
121
|
useEffect(() => {
|
|
@@ -99,10 +126,10 @@ export function useQueueEntries(searchCriteria?: QueueEntrySearchCriteria, rep:
|
|
|
99
126
|
}
|
|
100
127
|
if (pageData && !isValidating && !stillWaitingForMutate) {
|
|
101
128
|
// We've got results! Time to update the data array and move on to the next page.
|
|
102
|
-
if (pageData?.data?.totalCount && pageData?.data?.totalCount !== totalCount) {
|
|
129
|
+
if (pageData?.data?.totalCount > -1 && pageData?.data?.totalCount !== totalCount) {
|
|
103
130
|
setTotalCount(pageData?.data?.totalCount);
|
|
104
131
|
}
|
|
105
|
-
if (pageData?.data?.results
|
|
132
|
+
if (pageData?.data?.results) {
|
|
106
133
|
const newData = [...data];
|
|
107
134
|
newData[currentPage] = pageData?.data?.results;
|
|
108
135
|
setData(newData);
|
|
@@ -140,10 +167,8 @@ export function useQueueEntries(searchCriteria?: QueueEntrySearchCriteria, rep:
|
|
|
140
167
|
}, [pageError]);
|
|
141
168
|
|
|
142
169
|
const queueUpdateListener = useCallback(() => {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
setPageUrl(getInitialUrl(rep, searchCriteria));
|
|
146
|
-
}, [rep, searchCriteria]);
|
|
170
|
+
refetchAllData();
|
|
171
|
+
}, [refetchAllData]);
|
|
147
172
|
|
|
148
173
|
useEffect(() => {
|
|
149
174
|
window.addEventListener('queue-entry-updated', queueUpdateListener);
|
|
@@ -157,7 +182,7 @@ export function useQueueEntries(searchCriteria?: QueueEntrySearchCriteria, rep:
|
|
|
157
182
|
return {
|
|
158
183
|
queueEntries,
|
|
159
184
|
totalCount,
|
|
160
|
-
isLoading:
|
|
185
|
+
isLoading: totalCount === undefined || (totalCount && queueEntries.length < totalCount),
|
|
161
186
|
isValidating: isValidating || currentPage < data.length,
|
|
162
187
|
error,
|
|
163
188
|
mutate: mutateQueueEntries,
|
|
@@ -2,8 +2,8 @@ import { getLocale } from '@openmrs/esm-framework';
|
|
|
2
2
|
import { useMemo } from 'react';
|
|
3
3
|
import { useQueues } from './useQueues';
|
|
4
4
|
|
|
5
|
-
function useQueueServices() {
|
|
6
|
-
const { queues, isLoading } = useQueues();
|
|
5
|
+
function useQueueServices(locationUuid?: string) {
|
|
6
|
+
const { queues, isLoading } = useQueues(locationUuid);
|
|
7
7
|
|
|
8
8
|
const results = useMemo(
|
|
9
9
|
() => ({
|
|
@@ -21,7 +21,7 @@ function ClinicMetrics() {
|
|
|
21
21
|
const layout = useLayoutType();
|
|
22
22
|
const mutate = useMutateQueueEntries();
|
|
23
23
|
const currentQueueLocation = useSelectedQueueLocationUuid();
|
|
24
|
-
const { services } = useQueueServices();
|
|
24
|
+
const { services } = useQueueServices(currentQueueLocation);
|
|
25
25
|
const currentService = useSelectedService();
|
|
26
26
|
const { serviceCount } = useServiceMetricsCount(currentService?.serviceUuid, currentQueueLocation);
|
|
27
27
|
const [initialSelectedItem, setInitialSelectItem] = useState(() => {
|
|
@@ -66,6 +66,7 @@ function ClinicMetrics() {
|
|
|
66
66
|
<Dropdown
|
|
67
67
|
id="inline"
|
|
68
68
|
type="inline"
|
|
69
|
+
label={currentService?.serviceDisplay ?? t('all', 'All')}
|
|
69
70
|
items={[{ display: `${t('all', 'All')}` }, ...(services ?? [])]}
|
|
70
71
|
itemToString={(item) =>
|
|
71
72
|
item ? `${item.display} ${item.location?.display ? `- ${item.location.display}` : ''}` : ''
|
|
@@ -37,12 +37,17 @@ function DefaultQueueTable() {
|
|
|
37
37
|
const selectedService = useSelectedService();
|
|
38
38
|
const currentLocationUuid = useSelectedQueueLocationUuid();
|
|
39
39
|
const selectedQueueStatus = useSelectedQueueStatus();
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
const searchCriteria = useMemo(
|
|
41
|
+
() => ({
|
|
42
|
+
service: selectedService?.serviceUuid,
|
|
43
|
+
location: currentLocationUuid,
|
|
44
|
+
isEnded: false,
|
|
45
|
+
status: selectedQueueStatus?.statusUuid,
|
|
46
|
+
}),
|
|
47
|
+
[selectedService?.serviceUuid, currentLocationUuid, selectedQueueStatus?.statusUuid],
|
|
48
|
+
);
|
|
49
|
+
const { queueEntries, isLoading, error, isValidating } = useQueueEntries(searchCriteria);
|
|
50
|
+
|
|
46
51
|
const { t } = useTranslation();
|
|
47
52
|
|
|
48
53
|
useEffect(() => {
|
|
File without changes
|