inertiajs.com icon indicating copy to clipboard operation
inertiajs.com copied to clipboard

Snippet to add Laravel paginator

Open NWBY opened this issue 5 years ago • 3 comments

Using the Laravel paginator with Inertia is great. However, it is not mentioned in the documentation anywhere. I found the solution in the PingCRM demo app, but it would be nice to have this in the docs for new user to be able to set up the paginator straight away when starting a new project.

I've dropped the code from PingCRM demo so that it is clear what I am talking about.

protected function registerLengthAwarePaginator()
    {
        $this->app->bind(LengthAwarePaginator::class, function ($app, $values) {
            return new class(...array_values($values)) extends LengthAwarePaginator {
                public function only(...$attributes)
                {
                    return $this->transform(function ($item) use ($attributes) {
                        return $item->only($attributes);
                    });
                }

                public function transform($callback)
                {
                    $this->items->transform($callback);

                    return $this;
                }

                public function toArray()
                {
                    return [
                        'data' => $this->items->toArray(),
                        'links' => $this->links(),
                    ];
                }

                public function links($view = null, $data = [])
                {
                    $this->appends(Request::all());

                    $window = UrlWindow::make($this);

                    $elements = array_filter([
                        $window['first'],
                        is_array($window['slider']) ? '...' : null,
                        $window['slider'],
                        is_array($window['last']) ? '...' : null,
                        $window['last'],
                    ]);

                    return Collection::make($elements)->flatMap(function ($item) {
                        if (is_array($item)) {
                            return Collection::make($item)->map(function ($url, $page) {
                                return [
                                    'url' => $url,
                                    'label' => $page,
                                    'active' => $this->currentPage() === $page,
                                ];
                            });
                        } else {
                            return [
                                [
                                    'url' => null,
                                    'label' => '...',
                                    'active' => false,
                                ],
                            ];
                        }
                    })->prepend([
                        'url' => $this->previousPageUrl(),
                        'label' => 'Previous',
                        'active' => false,
                    ])->push([
                        'url' => $this->nextPageUrl(),
                        'label' => 'Next',
                        'active' => false,
                    ]);
                }
            };
        });
    }

NWBY avatar Feb 03 '20 09:02 NWBY

Hey, @NWBY !

This sounds like a great first PR.

Would you be able to submit one?

Juhlinus avatar Feb 03 '20 10:02 Juhlinus

@Juhlinus Sure, that would be great.

NWBY avatar Feb 03 '20 15:02 NWBY

For linking / reference: https://github.com/inertiajs/inertiajs.com/pull/54

claudiodekker avatar Aug 21 '20 07:08 claudiodekker