diff --git a/src/clients/db/PageRequest.ts b/src/clients/db/PageRequest.ts index 447205bc39..065f80f66b 100644 --- a/src/clients/db/PageRequest.ts +++ b/src/clients/db/PageRequest.ts @@ -1,8 +1,12 @@ export default interface PageRequest { number: number | undefined size: number | undefined + nextPageInfo: { [key: string]: string | null } | undefined + direction: 'previous' | 'next' | null } export const UnpagedRequest: PageRequest = { number: undefined, size: undefined, + nextPageInfo: undefined, + direction: null, } diff --git a/src/clients/db/PatientRepository.ts b/src/clients/db/PatientRepository.ts index 6e7bbc753e..5f6cb1e552 100644 --- a/src/clients/db/PatientRepository.ts +++ b/src/clients/db/PatientRepository.ts @@ -15,7 +15,7 @@ export class PatientRepository extends Repository { constructor() { super(patients) patients.createIndex({ - index: { fields: ['fullName', 'code'] }, + index: { fields: ['index'] }, }) } @@ -86,6 +86,7 @@ export class PatientRepository extends Repository { async save(entity: Patient): Promise { const patientCode = getPatientCode() entity.code = patientCode + entity.index = (entity.fullName ? entity.fullName : '') + patientCode return super.save(entity) } } diff --git a/src/clients/db/Repository.ts b/src/clients/db/Repository.ts index cde7100407..3cdcf75191 100644 --- a/src/clients/db/Repository.ts +++ b/src/clients/db/Repository.ts @@ -47,27 +47,59 @@ export default class Repository { const selector: any = { _id: { $gt: null }, } - - sort.sorts.forEach((s) => { - selector[s.field] = { $gt: null } - }) + if (pageRequest.direction === 'next') { + sort.sorts.forEach((s) => { + selector[s.field] = { + $gte: + pageRequest.nextPageInfo && pageRequest.nextPageInfo[s.field] + ? pageRequest.nextPageInfo[s.field] + : null, + } + }) + } else if (pageRequest.direction === 'previous') { + sort.sorts.forEach((s) => { + s.direction = s.direction === 'asc' ? 'desc' : 'asc' + selector[s.field] = { + $lte: + pageRequest.nextPageInfo && pageRequest.nextPageInfo[s.field] + ? pageRequest.nextPageInfo[s.field] + : null, + } + }) + } const result = await this.db.find({ selector, sort: sort.sorts.length > 0 ? sort.sorts.map((s) => ({ [s.field]: s.direction })) : undefined, - limit: pageRequest.size, - skip: - pageRequest.number && pageRequest.size ? (pageRequest.number - 1) * pageRequest.size : 0, + limit: pageRequest.size ? pageRequest.size + 1 : undefined, + skip: pageRequest.direction === 'previous' ? pageRequest.size : undefined, }) const mappedResult = result.docs.map(mapDocument) + if (pageRequest.direction === 'previous') { + mappedResult.reverse() + } + const nextPageInfo: { [key: string]: string } = {} + + if (mappedResult.length > 0) { + sort.sorts.forEach((s) => { + nextPageInfo[s.field] = mappedResult[mappedResult.length - 1][s.field] + }) + } + const pagedResult: Page = { - content: mappedResult, - hasNext: pageRequest.size !== undefined && mappedResult.length === pageRequest.size, - hasPrevious: pageRequest.number !== undefined && pageRequest.number > 1, + content: + pageRequest.size !== undefined && mappedResult.length === pageRequest.size + 1 + ? mappedResult.slice(0, mappedResult.length - 1) + : mappedResult, + hasNext: pageRequest.size !== undefined && mappedResult.length === pageRequest.size + 1, + // hasPrevious: pageRequest.number !== undefined && pageRequest.number > 1, + hasPrevious: false, pageRequest: { size: pageRequest.size, number: pageRequest.number, + nextPageInfo, + direction: null, }, } return pagedResult diff --git a/src/model/Patient.ts b/src/model/Patient.ts index 27fde51a46..972492c24d 100644 --- a/src/model/Patient.ts +++ b/src/model/Patient.ts @@ -18,4 +18,5 @@ export default interface Patient extends AbstractDBModel, Name, ContactInformati allergies?: Allergy[] diagnoses?: Diagnosis[] notes?: Note[] + index: string } diff --git a/src/patients/edit/EditPatient.tsx b/src/patients/edit/EditPatient.tsx index 350a3f2bdd..1e642ded64 100644 --- a/src/patients/edit/EditPatient.tsx +++ b/src/patients/edit/EditPatient.tsx @@ -73,6 +73,8 @@ const EditPatient = () => { { ...patient, fullName: getPatientName(patient.givenName, patient.familyName, patient.suffix), + index: + getPatientName(patient.givenName, patient.familyName, patient.suffix) + patient.code, }, onSuccessfulSave, ), diff --git a/src/patients/list/ViewPatients.tsx b/src/patients/list/ViewPatients.tsx index 9e34fb79f9..fdced50eb7 100644 --- a/src/patients/list/ViewPatients.tsx +++ b/src/patients/list/ViewPatients.tsx @@ -28,6 +28,8 @@ const ViewPatients = () => { const [userPageRequest, setUserPageRequest] = useState({ size: 1, number: 1, + nextPageInfo: { index: null }, + direction: 'next', }) const setNextPageRequest = () => { @@ -36,6 +38,8 @@ const ViewPatients = () => { const newPageRequest: PageRequest = { number: p.number + 1, size: p.size, + nextPageInfo: patients.pageRequest?.nextPageInfo, + direction: 'next', } return newPageRequest } @@ -49,6 +53,8 @@ const ViewPatients = () => { return { number: p.number - 1, size: p.size, + nextPageInfo: patients.pageRequest?.nextPageInfo, + direction: 'previous', } } return p @@ -60,20 +66,14 @@ const ViewPatients = () => { useEffect(() => { const sortRequest: SortRequest = { - sorts: [ - { field: 'fullName', direction: 'asc' }, - { field: 'code', direction: 'asc' }, - ], + sorts: [{ field: 'index', direction: 'asc' }], } dispatch(searchPatients(debouncedSearchText, sortRequest, userPageRequest)) }, [dispatch, debouncedSearchText, userPageRequest]) useEffect(() => { const sortRequest: SortRequest = { - sorts: [ - { field: 'fullName', direction: 'asc' }, - { field: 'code', direction: 'asc' }, - ], + sorts: [{ field: 'index', direction: 'asc' }], } dispatch(fetchPatients(sortRequest, userPageRequest))