Skip to content

Instantly share code, notes, and snippets.

@Maxlab
Last active April 25, 2017 08:00
Show Gist options
  • Select an option

  • Save Maxlab/05307cfbfc99a7544e8717fb5015187d to your computer and use it in GitHub Desktop.

Select an option

Save Maxlab/05307cfbfc99a7544e8717fb5015187d to your computer and use it in GitHub Desktop.

Revisions

  1. Maxlab revised this gist Apr 25, 2017. 2 changed files with 157 additions and 2 deletions.
    154 changes: 154 additions & 0 deletions App\Ext\UrlWindow
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,154 @@
    <?php namespace App\Ext;

    use Illuminate\Contracts\Pagination\LengthAwarePaginator as PaginatorContract;

    class UrlWindow extends \Illuminate\Pagination\UrlWindow
    {
    /**
    * Create a new URL window instance.
    *
    * @param \Illuminate\Contracts\Pagination\LengthAwarePaginator $paginator
    * @param int $onEachSide
    * @return array
    */
    public static function make(PaginatorContract $paginator, $onEachSide = 1)
    {
    return (new static($paginator))->get($onEachSide);
    }

    /**
    * Get the window of URLs to be shown.
    *
    * @param int $onEachSide
    * @return array
    */
    public function get($onEachSide = 3)
    {
    if ($this->paginator->lastPage() < ($onEachSide * 2) + 6) {
    return $this->getSmallSlider();
    }

    return $this->getUrlSlider($onEachSide);
    }

    /**
    * Create a URL slider links.
    *
    * @param int $onEachSide
    * @return array
    */
    protected function getUrlSlider($onEachSide)
    {
    $window = $onEachSide * 2;

    if (!$this->hasPages()) {
    return ['first' => null, 'slider' => null, 'last' => null];
    }

    // If the current page is very close to the beginning of the page range, we will
    // 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);
    }

    // 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);
    }

    // If we have enough room on both sides of the current page to build a slider we
    // will surround it with both the beginning and ending caps, with this window
    // of pages in the middle providing a Google style sliding paginator setup.
    return $this->getFullSlider($onEachSide);
    }

    /**
    * Get the slider of URLs when too close to beginning of window.
    *
    * @param int $window
    * @return array
    */
    protected function getSliderTooCloseToBeginning($window)
    {
    return [
    'first' => $this->paginator->getUrlRange(1, $window + 1),
    'slider' => null,
    'last' => $this->getFinish(),
    ];
    }

    /**
    * Get the slider of URLs when too close to ending of window.
    *
    * @param int $window
    * @return array
    */
    protected function getSliderTooCloseToEnding($window)
    {
    $last = $this->paginator->getUrlRange(
    $this->lastPage() - ($window + 1),
    $this->lastPage()
    );

    return [
    'first' => $this->getStart(),
    'slider' => null,
    'last' => $last,
    ];
    }

    /**
    * Get the slider of URLs when a full slider can be made.
    *
    * @param int $onEachSide
    * @return array
    */
    protected function getFullSlider($onEachSide)
    {
    return [
    'first' => $this->getStart(),
    'slider' => $this->getAdjacentUrlRange($onEachSide),
    'last' => $this->getFinish(),
    ];
    }

    /**
    * Get the page range for the current page window.
    *
    * @param int $onEachSide
    * @return array
    */
    public function getAdjacentUrlRange($onEachSide)
    {
    return $this->paginator->getUrlRange(
    $this->currentPage() - $onEachSide,
    $this->currentPage() + $onEachSide
    );
    }

    /**
    * Get the starting URLs of a pagination slider.
    *
    * @return array
    */
    public function getStart()
    {
    return $this->paginator->getUrlRange(1, 1);
    }

    /**
    * Get the ending URLs of a pagination slider.
    *
    * @return array
    */
    public function getFinish()
    {
    return $this->paginator->getUrlRange(
    $this->lastPage(),
    $this->lastPage()
    );
    }
    }
    5 changes: 3 additions & 2 deletions semantic-ui.blade.php
    Original file line number Diff line number Diff line change
    @@ -3,9 +3,10 @@
    --}}
    <?php
    use Illuminate\Pagination\UrlWindow;
    use App\Ext\UrlWindow;
    $window = UrlWindow::make($paginator, 1);
    $window = UrlWindow::make($paginator, 2);
    //dd($window);
    $elements = array_filter([
    $window['first'],
    is_array($window['slider']) ? '...' : null,
  2. Maxlab created this gist Apr 25, 2017.
    42 changes: 42 additions & 0 deletions semantic-ui.blade.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,42 @@
    {{--
    Semantic-UI pagination
    --}}
    <?php
    use Illuminate\Pagination\UrlWindow;
    $window = UrlWindow::make($paginator, 1);
    $elements = array_filter([
    $window['first'],
    is_array($window['slider']) ? '...' : null,
    $window['slider'],
    is_array($window['last']) ? '...' : null,
    $window['last'],
    ]);
    ?>

    @if ($paginator->hasPages())
    <div class="ui pagination menu">

    {{-- Pagination Elements --}}
    @foreach ($elements as $element)
    {{-- "Three Dots" Separator --}}
    @if (is_string($element))
    <a class="icon item disabled">{{ $element }}</a>
    @endif

    {{-- Array Of Links --}}
    @if (is_array($element))
    @foreach ($element as $page => $url)
    @if ($page == $paginator->currentPage())
    <a class="item active" href="{{ $url }}">{{ $page }}</a>
    @else
    <a class="item" href="{{ $url }}">{{ $page }}</a>
    @endif
    @endforeach
    @endif
    @endforeach

    </div>
    @endif