in frontend/src/components/taskSelection/taskList.js [383:448]
function PaginatedList({
items,
ItemComponent,
pageSize,
project,
setZoomedTaskId,
setActiveTaskModal,
selectTask,
selected,
}: Object) {
const [page, setPage] = useQueryParam('page', NumberParam);
const lastPage = howManyPages(items.length, pageSize);
// reset page number to 1 if it is not valid any more
useEffect(() => {
if (items && page > 1 && page > lastPage) {
setPage(1);
}
}, [items, page, lastPage, setPage]);
const latestItems = useRef(items);
useEffect(() => {
latestItems.current = items;
});
// the useEffect above avoids the next one to run every time the items change
useEffect(() => {
// switch the taskList page to always show the selected task.
// Only do it if there is only one task selected
if (selected.length === 1) {
const newPage =
(latestItems.current.findIndex((task) => task.properties.taskId === selected[0]) + 1) /
pageSize;
if (newPage) setPage(Math.ceil(newPage));
}
}, [selected, latestItems, setPage, pageSize]);
return (
<>
<div>
{(!items || !items.length) && (
<div className="tc mt5 mb3">
<FormattedMessage {...messages.noTasksFound} />
</div>
)}
{items.slice(pageSize * ((page || 1) - 1), pageSize * (page || 1)).map((item, n) => (
<ItemComponent
key={n}
data={item.properties}
project={project}
selectTask={selectTask}
selected={selected}
setZoomedTaskId={setZoomedTaskId}
setActiveTaskModal={setActiveTaskModal}
/>
))}
</div>
<div className="fr">
<PaginatorLine
activePage={page || 1}
setPageFn={setPage}
lastPage={lastPage}
className="flex items-center pt2"
/>
</div>
</>
);
}