All Downloads are FREE. Search and download functionalities are using the official Maven repository.

tech.ailef.snapadmin.external.dto.PaginationInfo Maven / Gradle / Ivy

/* 
 * SnapAdmin - An automatically generated CRUD admin UI for Spring Boot apps
 * Copyright (C) 2023 Ailef (http://ailef.tech)
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see .
 */


package tech.ailef.snapadmin.external.dto;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import org.springframework.util.MultiValueMap;

import tech.ailef.snapadmin.external.misc.Utils;

/**
 * Attached as output to requests that have a paginated response,
 * holds information about the current pagination.
 */
public class PaginationInfo {
	/**
	 * How many previous and next pages to generate, used in the front-end navigation
	 */
	private static final int PAGE_RANGE = 3;
	
	/**
	 * The current requested page
	 */
	private int currentPage;
	
	/**
	 * The last page for which there are results available
	 */
	private int maxPage;
	
	/**
	 * The current number of elements per page
	 */
	private int pageSize;
	
	private long maxElement;
	
	private FilterRequest filterRequest;
	
	private String query;
	
	public PaginationInfo(int currentPage, int maxPage, int pageSize, long maxElement, String query, FilterRequest request) {
		this.currentPage = currentPage;
		this.maxPage = maxPage;
		this.pageSize = pageSize;
		this.query = query;
		this.maxElement = maxElement;
		this.filterRequest = request;
	}

	/**
	 * Returns the current requested page
	 */
	public int getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	
	/**
	 * Returns the last page for which there are results available
	 * @return
	 */
	public int getMaxPage() {
		return maxPage;
	}
	
	public void setMaxPage(int maxPage) {
		this.maxPage = maxPage;
	}

	/**
	 * Returns the current number of elements per page
	 * @return
	 */
	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	
	/**
	 * Returns the total count of elements for all pages
	 * @return
	 */
	public long getMaxElement() {
		return maxElement;
	}
	
	/**
	 * Returns a link to the current page by preserving all the other
	 * filtering parameters but changing the sort order.
	 * 
	 * @param sortKey the field to use for sorting
	 * @param sortOrder the order, DESC or ASC
	 * @return a link to change the sort order for the current page
	 */
	public String getSortedPageLink(String sortKey, String sortOrder) {
		MultiValueMap params = FilterRequest.empty();
		
		if (filterRequest != null)
			params = filterRequest.computeParams();
		
		if (query != null) {
			params.put("query", new ArrayList<>());
			params.get("query").add(query);
		}
		
		params.add("pageSize", "" + pageSize);
		params.add("page", "" + currentPage);
		params.add("sortKey", sortKey);
		params.add("sortOrder", sortOrder);
		
		return Utils.getQueryString(params);
	}
	
	/**
	 * Returns a link to the specified page by preserving all the other
	 * filtering parameters 
	 * 
	 * @param page the page to generate the link for
	 * @return	
	 */
	public String getLink(int page) {
		MultiValueMap params = FilterRequest.empty();
		
		if (filterRequest != null)
			params = filterRequest.computeParams();
		
		if (query != null) {
			params.put("query", new ArrayList<>());
			params.get("query").add(query);
		}
		
		params.add("pageSize", "" + pageSize);
		params.add("page", "" + page);
		
		return Utils.getQueryString(params);
	}

	/**
	 * Returns the pages before the current one
	 * @return
	 */
	public List getBeforePages() {
		return IntStream.range(Math.max(currentPage - PAGE_RANGE,  1), currentPage).boxed().collect(Collectors.toList());
	}
	
	/**
	 * Returns the pages after the current one
	 * @return
	 */
	public List getAfterPages() {
		return IntStream.range(currentPage + 1, Math.min(currentPage + PAGE_RANGE,  maxPage + 1)).boxed().collect(Collectors.toList());
	}
	
	/**
	 * Returns whether the current page is the last one
	 * @return
	 */
	public boolean isLastPage() {
		return currentPage == maxPage;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy