diff --git a/frontend/src/components/home/Dashboard.tsx b/frontend/src/components/home/Dashboard.tsx index b63580c63..142f9d52d 100644 --- a/frontend/src/components/home/Dashboard.tsx +++ b/frontend/src/components/home/Dashboard.tsx @@ -22,7 +22,7 @@ import { Tag, } from "@carbon/react"; import "./Dashboard.css"; -import { Minimize, Maximize } from "@carbon/react/icons"; +import { Minimize, Maximize, ArrowLeft, ArrowRight } from "@carbon/react/icons"; import { Copy } from "@carbon/icons-react"; import { useState, useEffect, useRef, useContext } from "react"; import { @@ -555,35 +555,38 @@ const HomeDashBoard: React.FC = () => { {pagination && ( - - - - - - - - - + + + + {currentApiPage} / {totalApiPages} + +
+ + +
)} diff --git a/frontend/src/components/immunohistochemistry/ImmunohistochemistryCaseView.js b/frontend/src/components/immunohistochemistry/ImmunohistochemistryCaseView.js index 3aface80e..2a878f7c6 100644 --- a/frontend/src/components/immunohistochemistry/ImmunohistochemistryCaseView.js +++ b/frontend/src/components/immunohistochemistry/ImmunohistochemistryCaseView.js @@ -20,8 +20,9 @@ import { Toggle, TextArea, FilterableMultiSelect, + Link, } from "@carbon/react"; -import { Launch, Subtract } from "@carbon/react/icons"; +import { Launch, Subtract, ArrowLeft, ArrowRight } from "@carbon/react/icons"; import { getFromOpenElisServer, postToOpenElisServerFullResponse, @@ -72,6 +73,11 @@ function ImmunohistochemistryCaseView() { const [intensityList, setIntensityList] = useState([]); const [cerbB2PatternList, setCerbB2PatternList] = useState([]); const [molecularSubTypeList, setMolecularSubTypeList] = useState([]); + const [nextPage, setNextPage] = useState(null); + const [previousPage, setPreviousPage] = useState(null); + const [pagination, setPagination] = useState(false); + const [currentApiPage, setCurrentApiPage] = useState(null); + const [totalApiPages, setTotalApiPages] = useState(null); const [reportParams, setReportParams] = useState({ 0: { erPercent: "", @@ -183,9 +189,12 @@ function ImmunohistochemistryCaseView() { useEffect(() => { componentMounted.current = true; + setNextPage(null); + setPreviousPage(null); + setPagination(false); getFromOpenElisServer( - "/rest/displayList/PATHOLOGIST_CONCLUSIONS", - setConclusions, + "/rest/paginatedDisplayList/PATHOLOGIST_CONCLUSIONS", + loadConclusionData, ); return () => { @@ -193,6 +202,58 @@ function ImmunohistochemistryCaseView() { }; }, []); + const loadNextCOnclusionsPage = () => { + setLoading(true); + getFromOpenElisServer( + "/rest/paginatedDisplayList/PATHOLOGIST_CONCLUSIONS" + + "?page=" + + nextPage, + loadConclusionData, + ); + }; + + const loadPreviousConclusionsPage = () => { + setLoading(true); + getFromOpenElisServer( + "/rest/paginatedDisplayList/PATHOLOGIST_CONCLUSIONS" + + "?page=" + + previousPage, + loadConclusionData, + ); + }; + + const loadConclusionData = (res) => { + // If the response object is not null and has displayItems array with length greater than 0 then set it as data. + if (res && res.displayItems && res.displayItems.length > 0) { + setConclusions(res.displayItems); + } else { + setConclusions([]); + } + + // Sets next and previous page numbers based on the total pages and current page number. + if (res && res.paging) { + const { totalPages, currentPage } = res.paging; + if (totalPages > 1) { + setPagination(true); + setCurrentApiPage(currentPage); + setTotalApiPages(totalPages); + if (parseInt(currentPage) < parseInt(totalPages)) { + setNextPage(parseInt(currentPage) + 1); + } else { + setNextPage(null); + } + + if (parseInt(currentPage) > 1) { + setPreviousPage(parseInt(currentPage) - 1); + } else { + setPreviousPage(null); + } + } + } + + setLoading(false); + }; + const createReportParams = (reportType, index) => { switch (reportType) { case "BREAST_CANCER_HORMONE_RECEPTOR": @@ -671,6 +732,35 @@ function ImmunohistochemistryCaseView() { + {pagination && ( + + + {currentApiPage} / {totalApiPages} + +
+
+
+ )} + +
+
+
diff --git a/frontend/src/components/pathology/PathologyCaseView.js b/frontend/src/components/pathology/PathologyCaseView.js index f8e98b53a..2a573fda2 100644 --- a/frontend/src/components/pathology/PathologyCaseView.js +++ b/frontend/src/components/pathology/PathologyCaseView.js @@ -18,8 +18,9 @@ import { TextArea, Loading, InlineLoading, + Link, } from "@carbon/react"; -import { Launch, Subtract } from "@carbon/react/icons"; +import { Launch, Subtract, ArrowLeft, ArrowRight } from "@carbon/react/icons"; import { getFromOpenElisServer, postToOpenElisServerFullResponse, @@ -64,6 +65,11 @@ function PathologyCaseView() { const [blocksToAdd, setBlocksToAdd] = useState(1); const [slidesToAdd, setSlidesToAdd] = useState(1); const [loadingReport, setLoadingReport] = useState(false); + const [nextPage, setNextPage] = useState(null); + const [previousPage, setPreviousPage] = useState(null); + const [pagination, setPagination] = useState(false); + const [currentApiPage, setCurrentApiPage] = useState(null); + const [totalApiPages, setTotalApiPages] = useState(null); const [reportParams, setReportParams] = useState({ 0: { submited: false, @@ -224,6 +230,9 @@ function PathologyCaseView() { useEffect(() => { componentMounted.current = true; + setNextPage(null); + setPreviousPage(null); + setPagination(false); getFromOpenElisServer("/rest/displayList/PATHOLOGY_STATUS", setStatuses); getFromOpenElisServer( "/rest/displayList/PATHOLOGY_TECHNIQUES", @@ -243,8 +252,8 @@ function PathologyCaseView() { setImmunoHistoChemistryTests, ); getFromOpenElisServer( - "/rest/displayList/PATHOLOGIST_CONCLUSIONS", - setConclusions, + "/rest/paginatedDisplayList/PATHOLOGIST_CONCLUSIONS", + loadConclusionData, ); getFromOpenElisServer("/rest/users", setTechnicianUsers); getFromOpenElisServer("/rest/users/Pathologist", setPathologistUsers); @@ -258,6 +267,58 @@ function PathologyCaseView() { }; }, []); + const loadNextCOnclusionsPage = () => { + setLoading(true); + getFromOpenElisServer( + "/rest/paginatedDisplayList/PATHOLOGIST_CONCLUSIONS" + + "?page=" + + nextPage, + loadConclusionData, + ); + }; + + const loadPreviousConclusionsPage = () => { + setLoading(true); + getFromOpenElisServer( + "/rest/paginatedDisplayList/PATHOLOGIST_CONCLUSIONS" + + "?page=" + + previousPage, + loadConclusionData, + ); + }; + + const loadConclusionData = (res) => { + // If the response object is not null and has displayItems array with length greater than 0 then set it as data. + if (res && res.displayItems && res.displayItems.length > 0) { + setConclusions(res.displayItems); + } else { + setConclusions([]); + } + + // Sets next and previous page numbers based on the total pages and current page number. + if (res && res.paging) { + const { totalPages, currentPage } = res.paging; + if (totalPages > 1) { + setPagination(true); + setCurrentApiPage(currentPage); + setTotalApiPages(totalPages); + if (parseInt(currentPage) < parseInt(totalPages)) { + setNextPage(parseInt(currentPage) + 1); + } else { + setNextPage(null); + } + + if (parseInt(currentPage) > 1) { + setPreviousPage(parseInt(currentPage) - 1); + } else { + setPreviousPage(null); + } + } + } + + setLoading(false); + }; + return ( <> @@ -1040,6 +1101,35 @@ function PathologyCaseView() {
+ {pagination && ( + + + {currentApiPage} / {totalApiPages} + +
+
+
+ )} + +
+
+
{initialMount && ( { + setNextPage(null); + setPreviousPage(null); + setPagination(false); setLoading(true); values.dateOfBirth = dob; let searchEndPoint = @@ -480,32 +484,38 @@ function SearchPatientForm(props) { {" "}
- - - - - - - - + + + + {currentApiPage} / {totalApiPages} + +
+ + +
)} diff --git a/frontend/src/components/resultPage/SearchResultForm.js b/frontend/src/components/resultPage/SearchResultForm.js index f09ab842f..55db921aa 100644 --- a/frontend/src/components/resultPage/SearchResultForm.js +++ b/frontend/src/components/resultPage/SearchResultForm.js @@ -20,8 +20,9 @@ import { Select, SelectItem, Loading, + Link, } from "@carbon/react"; -import { Copy } from "@carbon/icons-react"; +import { Copy, ArrowLeft, ArrowRight } from "@carbon/icons-react"; import CustomLabNumberInput from "../common/CustomLabNumberInput"; import DataTable from "react-data-table-component"; import { Formik, Field } from "formik"; @@ -720,33 +721,38 @@ export function SearchResultForm(props) { {" "}

- - - - - - - - - + + + + {currentApiPage} / {totalApiPages} + +
+ + +
)} diff --git a/frontend/src/components/validation/SearchForm.js b/frontend/src/components/validation/SearchForm.js index c5710a0d4..b5f8b2f74 100644 --- a/frontend/src/components/validation/SearchForm.js +++ b/frontend/src/components/validation/SearchForm.js @@ -13,6 +13,7 @@ import { Select, Loading, Grid, + Link, } from "@carbon/react"; import CustomLabNumberInput from "../common/CustomLabNumberInput"; import { FormattedMessage, useIntl } from "react-intl"; @@ -23,6 +24,7 @@ import { NotificationContext } from "../layout/Layout"; import { NotificationKinds } from "../common/CustomNotification"; import { format } from "date-fns"; import CustomDatePicker from "../common/CustomDatePicker"; +import { ArrowLeft, ArrowRight } from "@carbon/react/icons"; const SearchForm = (props) => { const { setNotificationVisible, addNotification } = @@ -374,33 +376,38 @@ const SearchForm = (props) => { <> {pagination && ( - - - - - - - - - + + + + {currentApiPage} / {totalApiPages} + +
+ + +
)} diff --git a/frontend/src/components/workplan/WorkplanSearchForm.js b/frontend/src/components/workplan/WorkplanSearchForm.js index 17ec4dd3e..1a0a023f5 100644 --- a/frontend/src/components/workplan/WorkplanSearchForm.js +++ b/frontend/src/components/workplan/WorkplanSearchForm.js @@ -1,5 +1,6 @@ import React, { useEffect, useRef, useState } from "react"; -import { Column, Form, Grid, Section, Button } from "@carbon/react"; +import { Column, Form, Grid, Section, Button, Link } from "@carbon/react"; +import { ArrowLeft, ArrowRight } from "@carbon/react/icons"; import { FormattedMessage } from "react-intl"; import "../Style.css"; import TestSectionSelectForm from "./TestSectionSelectForm"; @@ -164,33 +165,38 @@ export default function WorkplanSearchForm(props) { <> {pagination && ( - - - - - - - - - + + + + {currentApiPage} / {totalApiPages} + +
+ + +
)} diff --git a/pom.xml b/pom.xml index 72aa5e06a..f1d12af3e 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,7 @@ 0 3 - 3 + 4 UTF-8 ${project.basedir}/liquibase/liquibase.properties 1.4.1 diff --git a/src/main/java/org/openelisglobal/common/action/IActionConstants.java b/src/main/java/org/openelisglobal/common/action/IActionConstants.java index 81ede34d9..ccc652bfc 100644 --- a/src/main/java/org/openelisglobal/common/action/IActionConstants.java +++ b/src/main/java/org/openelisglobal/common/action/IActionConstants.java @@ -256,6 +256,9 @@ public interface IActionConstants { String RESULTS_SESSION_CACHE = "ResultsSessionCache"; String RESULTS_PAGE_MAPPING_SESSION_CACHE = "ResultsPageMappingSessionCache"; + String DISPLAY_LIST_SESSION_CACHE = "DisplayListSessionCache"; + String DISPLAY_LIST_MAPPING_SESSION_CACHE = "DisplayListPageMappingSessionCache"; + /** * The system_module name used to determine if the current user is allowed to * edit primary patient IDs (subject number & site subject number). diff --git a/src/main/java/org/openelisglobal/common/paging/PagingProperties.java b/src/main/java/org/openelisglobal/common/paging/PagingProperties.java index 94ac4b3fd..f8a8e38cc 100644 --- a/src/main/java/org/openelisglobal/common/paging/PagingProperties.java +++ b/src/main/java/org/openelisglobal/common/paging/PagingProperties.java @@ -14,6 +14,9 @@ public class PagingProperties { @Value("${org.openelisglobal.paging.validation.pageSize:99}") private Integer validationPageSize; + @Value("${org.openelisglobal.paging.displaylist.pageSize:99}") + private Integer displayListPageSize; + public Integer getPatientsPageSize() { return patientsPageSize; } @@ -37,4 +40,12 @@ public Integer getValidationPageSize() { public void setValidationPageSize(Integer validationPageSize) { this.validationPageSize = validationPageSize; } + + public Integer getDisplayListPageSize() { + return displayListPageSize; + } + + public void setDisplayListPageSize(Integer displayListPageSize) { + this.displayListPageSize = displayListPageSize; + } } diff --git a/src/main/java/org/openelisglobal/common/paging/PagingUtility.java b/src/main/java/org/openelisglobal/common/paging/PagingUtility.java index 0acb73b63..1b85939cb 100644 --- a/src/main/java/org/openelisglobal/common/paging/PagingUtility.java +++ b/src/main/java/org/openelisglobal/common/paging/PagingUtility.java @@ -21,6 +21,16 @@ public class PagingUtility { private int totalPages = 0; + private String sessionCache = IActionConstants.RESULTS_SESSION_CACHE; + private String mappingsessionCache = IActionConstants.RESULTS_PAGE_MAPPING_SESSION_CACHE; + + public PagingUtility(String sessionCache, String mappingsessionCache) { + this.sessionCache = sessionCache; + this.mappingsessionCache = mappingsessionCache; + } + + public PagingUtility() { + } /** * @param session the Session for the current HttpRequest @@ -31,9 +41,9 @@ public void setDatabaseResults(HttpSession session, E items, IPageDivider div List pagedResults = new ArrayList<>(); divider.createPages(items, pagedResults); - session.setAttribute(IActionConstants.RESULTS_SESSION_CACHE, pagedResults); + session.setAttribute(getSessionCache(), pagedResults); List searchPageMapping = divider.createSearchToPageMapping(pagedResults); - session.setAttribute(IActionConstants.RESULTS_PAGE_MAPPING_SESSION_CACHE, searchPageMapping); + session.setAttribute(getMappingsessionCache(), searchPageMapping); totalPages = pagedResults.size(); } @@ -45,7 +55,7 @@ public void setDatabaseResults(HttpSession session, E items, IPageDivider div */ public E getPage(int page, HttpSession session) { if (page > 0) { - List pagedResults = (List) session.getAttribute(IActionConstants.RESULTS_SESSION_CACHE); + List pagedResults = (List) session.getAttribute(getSessionCache()); totalPages = pagedResults.size(); if (pagedResults != null && pagedResults.size() >= page) { return pagedResults.get(page - 1); @@ -63,7 +73,7 @@ public E getPage(int page, HttpSession session) { */ @SuppressWarnings("unchecked") public void updatePagedResults(HttpSession session, E clientItems, PagingBean paging, IPageUpdater updater) { - List pagedResults = (List) session.getAttribute(IActionConstants.RESULTS_SESSION_CACHE); + List pagedResults = (List) session.getAttribute(getSessionCache()); if (pagedResults != null) { updateSessionResultCache(pagedResults, clientItems, paging, updater); @@ -124,17 +134,24 @@ public PagingBean getPagingBeanWithSearchMapping(int currentPage, HttpSession se */ @SuppressWarnings("unchecked") public List getAllPages(HttpSession session) { - return (List) session.getAttribute(IActionConstants.RESULTS_SESSION_CACHE); + return (List) session.getAttribute(getSessionCache()); } @SuppressWarnings("unchecked") public List getPageMapping(HttpSession session) { - List pairList = (List) session - .getAttribute(IActionConstants.RESULTS_PAGE_MAPPING_SESSION_CACHE); + List pairList = (List) session.getAttribute(getMappingsessionCache()); if (pairList == null) { pairList = new ArrayList<>(); } return pairList; } + + private String getSessionCache() { + return sessionCache; + } + + private String getMappingsessionCache() { + return mappingsessionCache; + } } diff --git a/src/main/java/org/openelisglobal/common/rest/DisplayListController.java b/src/main/java/org/openelisglobal/common/rest/DisplayListController.java index 367ba026c..645119986 100644 --- a/src/main/java/org/openelisglobal/common/rest/DisplayListController.java +++ b/src/main/java/org/openelisglobal/common/rest/DisplayListController.java @@ -1,5 +1,6 @@ package org.openelisglobal.common.rest; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -13,10 +14,13 @@ import javax.annotation.PostConstruct; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.validator.GenericValidator; import org.apache.logging.log4j.core.util.KeyValuePair; import org.openelisglobal.common.action.IActionConstants; import org.openelisglobal.common.constants.Constants; import org.openelisglobal.common.rest.provider.bean.TestDisplayBean; +import org.openelisglobal.common.rest.provider.form.DisplayListPagingForm; +import org.openelisglobal.common.rest.util.DisplayListPaging; import org.openelisglobal.common.services.DisplayListService; import org.openelisglobal.common.services.DisplayListService.ListType; import org.openelisglobal.common.services.IStatusService; @@ -224,6 +228,26 @@ public List getDisplayList(@PathVariable DisplayListService.ListTyp return DisplayListService.getInstance().getFreshList(listType); } + @GetMapping(value = "paginatedDisplayList/{listType}", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public DisplayListPagingForm getPaginatedDisplayList(HttpServletRequest request, + @PathVariable DisplayListService.ListType listType) + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + DisplayListPagingForm displayListform = new DisplayListPagingForm(); + DisplayListPaging paging = new DisplayListPaging(); + List displayItems = new ArrayList<>(); + String requestedPage = request.getParameter("page"); + if (GenericValidator.isBlankOrNull(requestedPage)) { + displayItems = DisplayListService.getInstance().getFreshList(listType); + + paging.setDatabaseResults(request, displayListform, displayItems); + } else { + int requestedPageNumber = Integer.parseInt(requestedPage); + paging.page(request, displayListform, requestedPageNumber); + } + return displayListform; + } + @GetMapping(value = "tests", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public List getTests() { diff --git a/src/main/java/org/openelisglobal/common/rest/provider/PatientDashBoardProvider.java b/src/main/java/org/openelisglobal/common/rest/provider/PatientDashBoardProvider.java index 662de10c6..086aeab8b 100644 --- a/src/main/java/org/openelisglobal/common/rest/provider/PatientDashBoardProvider.java +++ b/src/main/java/org/openelisglobal/common/rest/provider/PatientDashBoardProvider.java @@ -17,11 +17,11 @@ import org.hl7.fhir.r4.model.ServiceRequest; import org.openelisglobal.analysis.service.AnalysisService; import org.openelisglobal.analysis.valueholder.Analysis; -import org.openelisglobal.common.provider.query.PatientDashBoardForm; import org.openelisglobal.common.rest.provider.bean.homedashboard.AverageTimeDisplayBean; import org.openelisglobal.common.rest.provider.bean.homedashboard.DashBoardMetrics; import org.openelisglobal.common.rest.provider.bean.homedashboard.DashBoardTile; import org.openelisglobal.common.rest.provider.bean.homedashboard.OrderDisplayBean; +import org.openelisglobal.common.rest.provider.form.PatientDashBoardForm; import org.openelisglobal.common.rest.util.PatientDashBoardPaging; import org.openelisglobal.common.services.IStatusService; import org.openelisglobal.common.services.StatusService.AnalysisStatus; @@ -176,7 +176,7 @@ private List unprintedResults() { return unprintedAnalyses; } analyses.forEach(a -> { - if (a.getPrintedDate() == null) { + if (!analysisService.patientReportHasBeenDone(a)) { unprintedAnalyses.add(a); } }); diff --git a/src/main/java/org/openelisglobal/common/rest/provider/form/DisplayListPagingForm.java b/src/main/java/org/openelisglobal/common/rest/provider/form/DisplayListPagingForm.java new file mode 100644 index 000000000..3f88190c2 --- /dev/null +++ b/src/main/java/org/openelisglobal/common/rest/provider/form/DisplayListPagingForm.java @@ -0,0 +1,31 @@ +package org.openelisglobal.common.rest.provider.form; + +import java.util.List; +import org.openelisglobal.common.form.IPagingForm; +import org.openelisglobal.common.paging.PagingBean; +import org.openelisglobal.common.util.IdValuePair; + +public class DisplayListPagingForm implements IPagingForm { + + private PagingBean paging; + + private List displayItems; + + public void setDisplayListItems(List displayItems) { + this.displayItems = displayItems; + } + + public List getDisplayItems() { + return displayItems; + } + + @Override + public void setPaging(PagingBean paging) { + this.paging = paging; + } + + @Override + public PagingBean getPaging() { + return paging; + } +} diff --git a/src/main/java/org/openelisglobal/common/provider/query/PatientDashBoardForm.java b/src/main/java/org/openelisglobal/common/rest/provider/form/PatientDashBoardForm.java similarity index 79% rename from src/main/java/org/openelisglobal/common/provider/query/PatientDashBoardForm.java rename to src/main/java/org/openelisglobal/common/rest/provider/form/PatientDashBoardForm.java index 30b2bb83d..ba362041f 100644 --- a/src/main/java/org/openelisglobal/common/provider/query/PatientDashBoardForm.java +++ b/src/main/java/org/openelisglobal/common/rest/provider/form/PatientDashBoardForm.java @@ -1,14 +1,10 @@ -package org.openelisglobal.common.provider.query; +package org.openelisglobal.common.rest.provider.form; import java.util.List; import org.openelisglobal.common.form.IPagingForm; import org.openelisglobal.common.paging.PagingBean; import org.openelisglobal.common.rest.provider.bean.homedashboard.OrderDisplayBean; -/** - * To be returned as a response to a request for a patient dashboard form. It - * contains display iteams of a page and paging information. - */ public class PatientDashBoardForm implements IPagingForm { private PagingBean paging; diff --git a/src/main/java/org/openelisglobal/common/rest/util/DisplayListPaging.java b/src/main/java/org/openelisglobal/common/rest/util/DisplayListPaging.java new file mode 100644 index 000000000..0ba51570d --- /dev/null +++ b/src/main/java/org/openelisglobal/common/rest/util/DisplayListPaging.java @@ -0,0 +1,128 @@ +package org.openelisglobal.common.rest.util; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.List; +import javax.servlet.http.HttpServletRequest; +import org.openelisglobal.common.action.IActionConstants; +import org.openelisglobal.common.paging.IPageDivider; +import org.openelisglobal.common.paging.IPageFlattener; +import org.openelisglobal.common.paging.IPageUpdater; +import org.openelisglobal.common.paging.PagingProperties; +import org.openelisglobal.common.paging.PagingUtility; +import org.openelisglobal.common.rest.provider.form.DisplayListPagingForm; +import org.openelisglobal.common.util.IdValuePair; +import org.openelisglobal.spring.util.SpringContext; + +public class DisplayListPaging { + private final PagingUtility> paging = new PagingUtility<>( + IActionConstants.DISPLAY_LIST_SESSION_CACHE, IActionConstants.DISPLAY_LIST_MAPPING_SESSION_CACHE); + + private static final DisplayListPageHelper pagingHelper = new DisplayListPageHelper(); + + public void setDatabaseResults(HttpServletRequest request, DisplayListPagingForm form, + List displayList) + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + + paging.setDatabaseResults(request.getSession(), displayList, pagingHelper); + + List resultPage = paging.getPage(1, request.getSession()); + if (resultPage != null) { + form.setDisplayListItems(resultPage); + form.setPaging(paging.getPagingBeanWithSearchMapping(1, request.getSession())); + } + } + + public void page(HttpServletRequest request, DisplayListPagingForm form, int newPage) + throws IllegalAccessException, InvocationTargetException, NoSuchMethodException { + + request.getSession().setAttribute(IActionConstants.SAVE_DISABLED, IActionConstants.FALSE); + + if (newPage < 0) { + newPage = 0; + } + List resultPage = paging.getPage(newPage, request.getSession()); + if (resultPage != null) { + form.setDisplayListItems(resultPage); + form.setPaging(paging.getPagingBeanWithSearchMapping(newPage, request.getSession())); + } + } + + public List getResults(HttpServletRequest request) { + return paging.getAllResults(request.getSession(), pagingHelper); + } + + private static class DisplayListPageHelper implements IPageDivider>, + IPageUpdater>, IPageFlattener> { + + @Override + public void createPages(List displayList, List> pagedResults) { + List page = new ArrayList<>(); + + Boolean createNewPage = false; + int resultCount = 0; + + for (IdValuePair item : displayList) { + if (createNewPage) { + resultCount = 0; + createNewPage = false; + pagedResults.add(page); + page = new ArrayList<>(); + } + if (resultCount >= SpringContext.getBean(PagingProperties.class).getDisplayListPageSize()) { + createNewPage = true; + } + + page.add(item); + resultCount++; + } + + if (!page.isEmpty() || pagedResults.isEmpty()) { + pagedResults.add(page); + } + } + + @Override + public void updateCache(List cacheItems, List clientItems) { + for (int i = 0; i < clientItems.size(); i++) { + cacheItems.set(i, clientItems.get(i)); + } + } + + @Override + public List flattenPages(List> pages) { + + List allResults = new ArrayList<>(); + + for (List page : pages) { + for (IdValuePair item : page) { + allResults.add(item); + } + } + + return allResults; + } + + @Override + public List createSearchToPageMapping(List> allPages) { + List mappingList = new ArrayList<>(); + + int page = 0; + for (List resultList : allPages) { + page++; + String pageString = String.valueOf(page); + + String orderID = null; + + for (IdValuePair resultItem : resultList) { + if (!resultItem.getId().equals(orderID)) { + orderID = resultItem.getId(); + mappingList.add(new IdValuePair(orderID, pageString)); + } + } + } + + return mappingList; + } + } +} diff --git a/src/main/java/org/openelisglobal/common/rest/util/PatientDashBoardPaging.java b/src/main/java/org/openelisglobal/common/rest/util/PatientDashBoardPaging.java index a6712196f..af73d3e38 100644 --- a/src/main/java/org/openelisglobal/common/rest/util/PatientDashBoardPaging.java +++ b/src/main/java/org/openelisglobal/common/rest/util/PatientDashBoardPaging.java @@ -23,8 +23,8 @@ import org.openelisglobal.common.paging.IPageUpdater; import org.openelisglobal.common.paging.PagingProperties; import org.openelisglobal.common.paging.PagingUtility; -import org.openelisglobal.common.provider.query.PatientDashBoardForm; import org.openelisglobal.common.rest.provider.bean.homedashboard.OrderDisplayBean; +import org.openelisglobal.common.rest.provider.form.PatientDashBoardForm; import org.openelisglobal.common.util.IdValuePair; import org.openelisglobal.spring.util.SpringContext; diff --git a/volume/properties/common.properties b/volume/properties/common.properties index 4994c3c5c..da2bed4d4 100644 --- a/volume/properties/common.properties +++ b/volume/properties/common.properties @@ -53,3 +53,4 @@ org.openelisglobal.requester.phone=230 5123 1234 org.openelisglobal.paging.patients.pageSize=99 org.openelisglobal.paging.results.pageSize=99 org.openelisglobal.paging.validation.pageSize=99 +org.openelisglobal.paging.displaylist.pageSize=99