From f43f3a5cb6aca0bf41865c7bd1ade5b953dfad25 Mon Sep 17 00:00:00 2001
From: Jonathan Lamim <dev@jlamim.com.br>
Date: Tue, 28 Apr 2020 08:49:34 -0300
Subject: [PATCH 1/3] New features for paging in order to give the user the
 possibility to use pagination in the traditional way

---
 system/Pager/PagerRenderer.php | 74 ++++++++++++++++++++++++++++++++++
 1 file changed, 74 insertions(+)

diff --git a/system/Pager/PagerRenderer.php b/system/Pager/PagerRenderer.php
index 1712ddfd13dd..ed95c1b1f41b 100644
--- a/system/Pager/PagerRenderer.php
+++ b/system/Pager/PagerRenderer.php
@@ -343,4 +343,78 @@ protected function updatePages(int $count = null)
 	}
 
 	//--------------------------------------------------------------------
+
+	/**
+	 * Checks to see if there is a "previous" page before our "first" page.
+	 *
+	 * @return boolean
+	 */
+	public function hasPreviousPage(): bool
+	{
+		return $this->current > 1;
+	}
+
+	//--------------------------------------------------------------------
+
+	/**
+	 * Returns a URL to the "previous" page.
+	 *
+	 * You MUST call hasPreviousPage() first, or this value may be invalid.
+	 *
+	 * @return string|null
+	 */
+	public function getPreviousPage()
+	{
+		if (!$this->hasPreviousPage()) {
+			return null;
+		}
+
+		$uri = clone $this->uri;
+
+		if ($this->segment === 0) {
+			$uri->addQuery($this->pageSelector, $this->current - 1);
+		} else {
+			$uri->setSegment($this->segment, $this->current - 1);
+		}
+
+		return (string) $uri;
+	}
+
+	//--------------------------------------------------------------------
+
+	/**
+	 * Checks to see if there is a "next" page after our "last" page.
+	 *
+	 * @return boolean
+	 */
+	public function hasNextPage(): bool
+	{
+		return $this->current < $this->last;
+	}
+
+	//--------------------------------------------------------------------
+
+	/**
+	 * Returns a URL to the "next" page.
+	 *
+	 * You MUST call hasNextPage() first, or this value may be invalid.
+	 *
+	 * @return string|null
+	 */
+	public function getNextPage()
+	{
+		if (!$this->hasNextPage()) {
+			return null;
+		}
+
+		$uri = clone $this->uri;
+
+		if ($this->segment === 0) {
+			$uri->addQuery($this->pageSelector, $this->current + 1);
+		} else {
+			$uri->setSegment($this->segment, $this->current + 1);
+		}
+
+		return (string) $uri;
+	}
 }

From 423a95022f7d0b78ecea216fe29299b9ec43707d Mon Sep 17 00:00:00 2001
From: Jonathan Lamim <dev@jlamim.com.br>
Date: Tue, 28 Apr 2020 15:58:20 -0300
Subject: [PATCH 2/3] Unit Tests for the new features added to the pagination

---
 tests/system/Pager/PagerRendererTest.php | 75 +++++++++++++++++++++++-
 1 file changed, 73 insertions(+), 2 deletions(-)

diff --git a/tests/system/Pager/PagerRendererTest.php b/tests/system/Pager/PagerRendererTest.php
index ea22274b7dd3..676bfaa4bed8 100644
--- a/tests/system/Pager/PagerRendererTest.php
+++ b/tests/system/Pager/PagerRendererTest.php
@@ -1,4 +1,6 @@
-<?php namespace CodeIgniter\Pager;
+<?php
+
+namespace CodeIgniter\Pager;
 
 use CodeIgniter\HTTP\URI;
 
@@ -243,7 +245,7 @@ public function testSurroundCount()
 			'uri'         => $uri,
 			'pageCount'   => 10, // 10 pages
 			'currentPage' => 4,
-			'total'       => 100,// 100 records, so 10 per page
+			'total'       => 100, // 100 records, so 10 per page
 		];
 
 		$pager = new PagerRenderer($details);
@@ -451,4 +453,73 @@ public function testGetFirstAndGetLastSegment()
 		$this->assertEquals('http://example.com/foo/50?foo=bar', $pager->getLast());
 	}
 
+	//--------------------------------------------------------------------
+
+	public function testHasPreviousPageReturnsFalseWhenCurrentPageIsFirst()
+	{
+		$details = [
+			'uri'         => $this->uri,
+			'pageCount'   => 5,
+			'currentPage' => 1,
+			'total'       => 100
+		];
+
+		$pager = new PagerRenderer($details);
+
+		$this->assertFalse($pager->hasPreviousPage());
+	}
+
+	//--------------------------------------------------------------------
+
+	public function testHasNextPageReturnsFalseWhenCurrentPageIsLast()
+	{
+		$details = [
+			'uri'         => $this->uri,
+			'pageCount'   => 5,
+			'currentPage' => 5,
+			'total'       => 100
+		];
+
+		$pager = new PagerRenderer($details);
+
+		$this->assertFalse($pager->hasNextPage());
+	}
+
+	//--------------------------------------------------------------------
+
+	public function testHasPreviousPageReturnsTrueWhenFirstIsMoreThanCurrent()
+	{
+		$uri = $this->uri;
+
+		$details = [
+			'uri'         => $uri,
+			'pageCount'   => 10,
+			'currentPage' => 3,
+			'total'       => 100
+		];
+
+		$pager = new PagerRenderer($details);
+
+		$this->assertTrue($pager->hasPreviousPage());
+		$this->assertEquals('http://example.com/foo?page=2', $pager->getPreviousPage());
+	}
+
+	//--------------------------------------------------------------------
+
+	public function testHasNextPageReturnsTrueWhenLastIsMoreThanCurrent()
+	{
+		$uri = $this->uri;
+
+		$details = [
+			'uri'         => $uri,
+			'pageCount'   => 10,
+			'currentPage' => 3,
+			'total'       => 100
+		];
+
+		$pager = new PagerRenderer($details);
+
+		$this->assertTrue($pager->hasNextPage());
+		$this->assertEquals('http://example.com/foo?page=4', $pager->getNextPage());
+	}
 }

From 1e3e02ecf847a70e534564cd0b2a56da3d3b7172 Mon Sep 17 00:00:00 2001
From: Jonathan Lamim <dev@jlamim.com.br>
Date: Wed, 29 Apr 2020 07:01:31 -0300
Subject: [PATCH 3/3] Update -  Unit Tests for new methods in Pagination Class

---
 tests/system/Pager/PagerRendererTest.php | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/tests/system/Pager/PagerRendererTest.php b/tests/system/Pager/PagerRendererTest.php
index 676bfaa4bed8..636700461523 100644
--- a/tests/system/Pager/PagerRendererTest.php
+++ b/tests/system/Pager/PagerRendererTest.php
@@ -466,6 +466,7 @@ public function testHasPreviousPageReturnsFalseWhenCurrentPageIsFirst()
 
 		$pager = new PagerRenderer($details);
 
+		$this->assertNull($pager->getPreviousPage());
 		$this->assertFalse($pager->hasPreviousPage());
 	}
 
@@ -482,6 +483,7 @@ public function testHasNextPageReturnsFalseWhenCurrentPageIsLast()
 
 		$pager = new PagerRenderer($details);
 
+		$this->assertNull($pager->getNextPage());
 		$this->assertFalse($pager->hasNextPage());
 	}
 
@@ -500,6 +502,7 @@ public function testHasPreviousPageReturnsTrueWhenFirstIsMoreThanCurrent()
 
 		$pager = new PagerRenderer($details);
 
+		$this->assertNotNull($pager->getPreviousPage());
 		$this->assertTrue($pager->hasPreviousPage());
 		$this->assertEquals('http://example.com/foo?page=2', $pager->getPreviousPage());
 	}
@@ -519,6 +522,7 @@ public function testHasNextPageReturnsTrueWhenLastIsMoreThanCurrent()
 
 		$pager = new PagerRenderer($details);
 
+		$this->assertNotNull($pager->getNextPage());
 		$this->assertTrue($pager->hasNextPage());
 		$this->assertEquals('http://example.com/foo?page=4', $pager->getNextPage());
 	}