diff --git a/src/Illuminate/Pagination/UrlWindow.php b/src/Illuminate/Pagination/UrlWindow.php index 0fd3aa8230b4..8e08d3f1f26a 100644 --- a/src/Illuminate/Pagination/UrlWindow.php +++ b/src/Illuminate/Pagination/UrlWindow.php @@ -73,7 +73,7 @@ protected function getSmallSlider() */ protected function getUrlSlider($onEachSide) { - $window = $onEachSide * 2; + $window = $onEachSide + 4; if (! $this->hasPages()) { return ['first' => null, 'slider' => null, 'last' => null]; @@ -83,14 +83,14 @@ protected function getUrlSlider($onEachSide) // just render the beginning of the page range, followed by the last 2 of the // links in this list, since we will not have room to create a full slider. if ($this->currentPage() <= $window) { - return $this->getSliderTooCloseToBeginning($window); + return $this->getSliderTooCloseToBeginning($window, $onEachSide); } // If the current page is close to the ending of the page range we will just get // this first couple pages, followed by a larger window of these ending pages // since we're too close to the end of the list to create a full on slider. elseif ($this->currentPage() > ($this->lastPage() - $window)) { - return $this->getSliderTooCloseToEnding($window); + return $this->getSliderTooCloseToEnding($window, $onEachSide); } // If we have enough room on both sides of the current page to build a slider we @@ -103,12 +103,13 @@ protected function getUrlSlider($onEachSide) * Get the slider of URLs when too close to beginning of window. * * @param int $window + * @param int $onEachSide * @return array */ - protected function getSliderTooCloseToBeginning($window) + protected function getSliderTooCloseToBeginning($window, $onEachSide) { return [ - 'first' => $this->paginator->getUrlRange(1, $window + 2), + 'first' => $this->paginator->getUrlRange(1, $window + $onEachSide), 'slider' => null, 'last' => $this->getFinish(), ]; @@ -118,12 +119,13 @@ protected function getSliderTooCloseToBeginning($window) * Get the slider of URLs when too close to ending of window. * * @param int $window + * @param int $onEachSide * @return array */ - protected function getSliderTooCloseToEnding($window) + protected function getSliderTooCloseToEnding($window, $onEachSide) { $last = $this->paginator->getUrlRange( - $this->lastPage() - ($window + 2), + $this->lastPage() - ($window + ($onEachSide - 1)), $this->lastPage() ); diff --git a/tests/Pagination/UrlWindowTest.php b/tests/Pagination/UrlWindowTest.php index 5483f2c0658a..0b63841d2e23 100644 --- a/tests/Pagination/UrlWindowTest.php +++ b/tests/Pagination/UrlWindowTest.php @@ -25,28 +25,31 @@ public function testPresenterCanGetAUrlRangeForASmallNumberOfUrls() public function testPresenterCanGetAUrlRangeForAWindowOfLinks() { $array = []; - for ($i = 1; $i <= 13; $i++) { + for ($i = 1; $i <= 20; $i++) { $array[$i] = 'item'.$i; } - $p = new LengthAwarePaginator($array, count($array), 1, 7); + $p = new LengthAwarePaginator($array, count($array), 1, 12); $window = new UrlWindow($p); $slider = []; - for ($i = 4; $i <= 10; $i++) { + for ($i = 9; $i <= 15; $i++) { $slider[$i] = '/?page='.$i; } - $this->assertEquals(['first' => [1 => '/?page=1', 2 => '/?page=2'], 'slider' => $slider, 'last' => [12 => '/?page=12', 13 => '/?page=13']], $window->get()); + $this->assertEquals(['first' => [1 => '/?page=1', 2 => '/?page=2'], 'slider' => $slider, 'last' => [19 => '/?page=19', 20 => '/?page=20']], $window->get()); /* * Test Being Near The End Of The List */ - $p = new LengthAwarePaginator($array, count($array), 1, 8); + $array = []; + for ($i = 1; $i <= 13; $i++) { + $array[$i] = 'item'.$i; + } + $p = new LengthAwarePaginator($array, count($array), 1, 10); $window = new UrlWindow($p); $last = []; - for ($i = 5; $i <= 13; $i++) { + for ($i = 4; $i <= 13; $i++) { $last[$i] = '/?page='.$i; } - $this->assertEquals(['first' => [1 => '/?page=1', 2 => '/?page=2'], 'slider' => null, 'last' => $last], $window->get()); }