From b96680fbe1329384ed6eefa9e414803c781897dd Mon Sep 17 00:00:00 2001 From: Akshay Patel Date: Wed, 6 May 2020 00:50:41 +0530 Subject: [PATCH] feat(viewpatients): add paging for search patients Add paging for search patients feat #1969 --- .gitignore | 2 + src/clients/db/PageRequest.ts | 1 - src/clients/db/PatientRepository.ts | 14 +++++-- src/hooks/useUpdateEffect.ts | 13 ++++++ src/patients/list/ViewPatients.tsx | 65 ++++++++++++++++------------- 5 files changed, 63 insertions(+), 32 deletions(-) create mode 100644 src/hooks/useUpdateEffect.ts diff --git a/.gitignore b/.gitignore index 769faaf7e5..89e1437280 100644 --- a/.gitignore +++ b/.gitignore @@ -67,3 +67,5 @@ typings/ package-lock.json .DS_Store yarn.lock + +.vscode/ \ No newline at end of file diff --git a/src/clients/db/PageRequest.ts b/src/clients/db/PageRequest.ts index 2ad698b0a0..3f2a0c9cd8 100644 --- a/src/clients/db/PageRequest.ts +++ b/src/clients/db/PageRequest.ts @@ -3,7 +3,6 @@ export default interface PageRequest { size: number | undefined nextPageInfo: { [key: string]: string | null } | undefined previousPageInfo: { [key: string]: string | null } | undefined - direction: 'previous' | 'next' | null } export const UnpagedRequest: PageRequest = { diff --git a/src/clients/db/PatientRepository.ts b/src/clients/db/PatientRepository.ts index 570cb509b8..7c5009dac0 100644 --- a/src/clients/db/PatientRepository.ts +++ b/src/clients/db/PatientRepository.ts @@ -57,7 +57,7 @@ export class PatientRepository extends Repository { const result = await super .search({ selector, - limit: pageRequest.size, + limit: pageRequest.size ? pageRequest.size + 1 : undefined, skip: pageRequest.number && pageRequest.size ? (pageRequest.number - 1) * pageRequest.size : 0, sort: @@ -71,11 +71,19 @@ export class PatientRepository extends Repository { }) const pagedResult: Page = { - content: result, + content: result.slice( + 0, + pageRequest.size + ? result.length < pageRequest.size + ? result.length + : pageRequest.size + : result.length, + ), pageRequest, - hasNext: pageRequest.size !== undefined && result.length === pageRequest.size, + hasNext: pageRequest.size !== undefined && result.length === pageRequest.size + 1, hasPrevious: pageRequest.number !== undefined && pageRequest.number > 1, } + return pagedResult } diff --git a/src/hooks/useUpdateEffect.ts b/src/hooks/useUpdateEffect.ts new file mode 100644 index 0000000000..e1952e5429 --- /dev/null +++ b/src/hooks/useUpdateEffect.ts @@ -0,0 +1,13 @@ +import { useRef, useEffect } from 'react' + +export default function (effect: Function, dependencies: any[]) { + const isInitialMount = useRef(true) + + useEffect(() => { + if (isInitialMount.current) { + isInitialMount.current = false + } else { + effect() + } + }, dependencies) +} diff --git a/src/patients/list/ViewPatients.tsx b/src/patients/list/ViewPatients.tsx index cfefbc0b84..d25226841d 100644 --- a/src/patients/list/ViewPatients.tsx +++ b/src/patients/list/ViewPatients.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react' +import React, { useEffect, useState, useRef } from 'react' import { useSelector, useDispatch } from 'react-redux' import { useHistory } from 'react-router' import { useTranslation } from 'react-i18next' @@ -8,6 +8,7 @@ import format from 'date-fns/format' import SortRequest from 'clients/db/SortRequest' import PageRequest from 'clients/db/PageRequest' import PageComponent from 'components/PageComponent' +import useUpdateEffect from 'hooks/useUpdateEffect' import { RootState } from '../../store' import { searchPatients } from '../patients-slice' import useTitle from '../../page-header/useTitle' @@ -25,7 +26,8 @@ const ViewPatients = () => { const { patients, isLoading } = useSelector((state: RootState) => state.patients) const setButtonToolBar = useButtonToolbarSetter() - const [userPageRequest, setUserPageRequest] = useState({ + + const defaultPageRequest = useRef({ size: 1, number: 1, nextPageInfo: { index: null }, @@ -33,46 +35,53 @@ const ViewPatients = () => { direction: 'next', }) + const [userPageRequest, setUserPageRequest] = useState(defaultPageRequest.current) + const setNextPageRequest = () => { - setUserPageRequest((p) => { - if (p && p.number && p.number >= 0 && p.size) { - const newPageRequest: PageRequest = { - number: p.number + 1, - size: p.size, - nextPageInfo: patients.pageRequest?.nextPageInfo, - previousPageInfo: undefined, - direction: 'next', - } - return newPageRequest + setUserPageRequest(() => { + const newPageRequest: PageRequest = { + number: + patients.pageRequest && patients.pageRequest.number ? patients.pageRequest.number + 1 : 1, + size: patients.pageRequest ? patients.pageRequest.size : undefined, + nextPageInfo: patients.pageRequest?.nextPageInfo, + previousPageInfo: undefined, + direction: 'next', } - return p + return newPageRequest }) } const setPreviousPageRequest = () => { - setUserPageRequest((p) => { - if (p.number && p.size) { - return { - number: p.number - 1, - size: p.size, - nextPageInfo: undefined, - previousPageInfo: patients.pageRequest?.previousPageInfo, - direction: 'previous', - } - } - return p - }) + setUserPageRequest(() => ({ + number: + patients.pageRequest && patients.pageRequest.number ? patients.pageRequest.number - 1 : 1, + size: patients.pageRequest ? patients.pageRequest.size : undefined, + nextPageInfo: undefined, + previousPageInfo: patients.pageRequest?.previousPageInfo, + direction: 'previous', + })) } + const [searchText, setSearchText] = useState('') const debouncedSearchText = useDebounce(searchText, 500) + const debouncedSearchTextRef = useRef('') + + useUpdateEffect(() => { + const sortRequest: SortRequest = { + sorts: [{ field: 'index', direction: 'asc' }], + } + dispatch(searchPatients(debouncedSearchTextRef.current, sortRequest, userPageRequest)) + }, [dispatch, userPageRequest]) useEffect(() => { const sortRequest: SortRequest = { sorts: [{ field: 'index', direction: 'asc' }], } - dispatch(searchPatients(debouncedSearchText, sortRequest, userPageRequest)) - }, [dispatch, debouncedSearchText, userPageRequest]) + + debouncedSearchTextRef.current = debouncedSearchText + dispatch(searchPatients(debouncedSearchText, sortRequest, defaultPageRequest.current)) + }, [dispatch, debouncedSearchText]) useEffect(() => { setButtonToolBar([ @@ -140,7 +149,7 @@ const ViewPatients = () => {