Skip to content

Commit 15c5e1a

Browse files
authoredJul 16, 2024
Merge pull request openmrs#31 from makombe/queue-fixes-latest
Fix queues to filter services correctly by locations
2 parents 21f1580 + fc0d317 commit 15c5e1a

File tree

4 files changed

+48
-17
lines changed

4 files changed

+48
-17
lines changed
 

‎packages/esm-service-queues-app/src/hooks/useQueueEntries.ts

+33-8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { type QueueEntry, type QueueEntrySearchCriteria } from '../types';
33
import useSWR from 'swr';
44
import { useCallback, useEffect, useMemo, useState } from 'react';
55
import { useSWRConfig } from 'swr/_internal';
6+
import isEqual from 'lodash-es/isEqual';
67

78
type QueueEntryResponse = FetchResponse<{
89
results: Array<QueueEntry>;
@@ -84,11 +85,37 @@ export function useQueueEntries(searchCriteria?: QueueEntrySearchCriteria, rep:
8485
const [data, setData] = useState<Array<Array<QueueEntry>>>([]);
8586
const [totalCount, setTotalCount] = useState<number>();
8687
const [currentPage, setCurrentPage] = useState<number>(0);
87-
const [pageUrl, setPageUrl] = useState<string>(getInitialUrl(rep, searchCriteria));
88+
const [currentSearchCriteria, setCurrentSearchCriteria] = useState(searchCriteria);
89+
const [currentRep, setCurrentRep] = useState(rep);
90+
const [pageUrl, setPageUrl] = useState<string>(getInitialUrl(currentRep, currentSearchCriteria));
8891
const [error, setError] = useState<Error>();
8992
const { mutateQueueEntries } = useMutateQueueEntries();
9093
const [waitingForMutate, setWaitingForMutate] = useState(false);
9194

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+
92119
const { data: pageData, isValidating, error: pageError } = useSWR<QueueEntryResponse, Error>(pageUrl, openmrsFetch);
93120

94121
useEffect(() => {
@@ -99,10 +126,10 @@ export function useQueueEntries(searchCriteria?: QueueEntrySearchCriteria, rep:
99126
}
100127
if (pageData && !isValidating && !stillWaitingForMutate) {
101128
// 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) {
103130
setTotalCount(pageData?.data?.totalCount);
104131
}
105-
if (pageData?.data?.results?.length) {
132+
if (pageData?.data?.results) {
106133
const newData = [...data];
107134
newData[currentPage] = pageData?.data?.results;
108135
setData(newData);
@@ -140,10 +167,8 @@ export function useQueueEntries(searchCriteria?: QueueEntrySearchCriteria, rep:
140167
}, [pageError]);
141168

142169
const queueUpdateListener = useCallback(() => {
143-
setWaitingForMutate(true);
144-
setCurrentPage(0);
145-
setPageUrl(getInitialUrl(rep, searchCriteria));
146-
}, [rep, searchCriteria]);
170+
refetchAllData();
171+
}, [refetchAllData]);
147172

148173
useEffect(() => {
149174
window.addEventListener('queue-entry-updated', queueUpdateListener);
@@ -157,7 +182,7 @@ export function useQueueEntries(searchCriteria?: QueueEntrySearchCriteria, rep:
157182
return {
158183
queueEntries,
159184
totalCount,
160-
isLoading: !totalCount || (totalCount && queueEntries.length < totalCount),
185+
isLoading: totalCount === undefined || (totalCount && queueEntries.length < totalCount),
161186
isValidating: isValidating || currentPage < data.length,
162187
error,
163188
mutate: mutateQueueEntries,

‎packages/esm-service-queues-app/src/hooks/useQueueService.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import { getLocale } from '@openmrs/esm-framework';
22
import { useMemo } from 'react';
33
import { useQueues } from './useQueues';
44

5-
function useQueueServices() {
6-
const { queues, isLoading } = useQueues();
5+
function useQueueServices(locationUuid?: string) {
6+
const { queues, isLoading } = useQueues(locationUuid);
77

88
const results = useMemo(
99
() => ({

‎packages/esm-service-queues-app/src/patient-queue-metrics/clinic-metrics.component.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ function ClinicMetrics() {
2121
const layout = useLayoutType();
2222
const mutate = useMutateQueueEntries();
2323
const currentQueueLocation = useSelectedQueueLocationUuid();
24-
const { services } = useQueueServices();
24+
const { services } = useQueueServices(currentQueueLocation);
2525
const currentService = useSelectedService();
2626
const { serviceCount } = useServiceMetricsCount(currentService?.serviceUuid, currentQueueLocation);
2727
const [initialSelectedItem, setInitialSelectItem] = useState(() => {
@@ -66,6 +66,7 @@ function ClinicMetrics() {
6666
<Dropdown
6767
id="inline"
6868
type="inline"
69+
label={currentService?.serviceDisplay ?? t('all', 'All')}
6970
items={[{ display: `${t('all', 'All')}` }, ...(services ?? [])]}
7071
itemToString={(item) =>
7172
item ? `${item.display} ${item.location?.display ? `- ${item.location.display}` : ''}` : ''

‎packages/esm-service-queues-app/src/queue-table/default-queue-table.component.tsx

+11-6
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,17 @@ function DefaultQueueTable() {
3737
const selectedService = useSelectedService();
3838
const currentLocationUuid = useSelectedQueueLocationUuid();
3939
const selectedQueueStatus = useSelectedQueueStatus();
40-
const { queueEntries, isLoading, error, isValidating } = useQueueEntries({
41-
service: selectedService?.serviceUuid,
42-
location: currentLocationUuid,
43-
isEnded: false,
44-
status: selectedQueueStatus?.statusUuid,
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+
4651
const { t } = useTranslation();
4752

4853
useEffect(() => {

0 commit comments

Comments
 (0)
Failed to load comments.