List Articles

id title author body
20 Qui ipsum laudantium dolor labore nulla autem non aut. Rodger Sit voluptas ut quia placeat sint. Voluptatem id f...
19 Commodi dignissimos esse repudiandae magnam excepturi debitis. Rodger Laudantium nam quia cupiditate recusandae velit. V...
18 Unde eos neque ullam quod quas nisi et. Marvin Sapiente porro asperiores occaecati eos est id. Ni...
17 Aliquid optio modi et. Marvin Aliquam officiis modi quibusdam non. Aspernatur qu...
16 Ipsa ipsum velit quia. Laurie Sed consequatur nisi exercitationem et ut nobis. V...
15 Laudantium molestiae ea occaecati facilis aliquid provident. Laurie Soluta quo totam accusantium quidem asperiores qui...
14 Labore nulla incidunt beatae sed reiciendis aliquam. Adele Repellendus voluptatum qui voluptatem corporis nos...
13 Veniam reprehenderit nemo sunt itaque fuga eos nulla. Adele Dolorum beatae perspiciatis quisquam est odio null...
12 Similique quos at eum beatae quis illum deserunt. Alan Ut quo sint porro et vero. Molestias dolor laborio...
11 Aut quaerat fuga porro in repudiandae quas. Alan Qui in earum nihil. Deleniti nobis enim eos aliqui...
tot. 20

module structure


laravel/
├─ app/
│  ├─ Modules/
│  │  ├─ Demo/
│  │  │  ├─ Livewire/
│  │  │  │  ├─ Articles/
│  │  │  │  │  ├─ views/
│  │  │  │  │  │  ├─ articles_edit.blade.php
│  │  │  │  │  │  ├─ articles_table.blade.php
│  │  │  │  │  │  ├─ articles_view.blade.php
│  │  │  │  │  ├─ ArticlesEdit.php
│  │  │  │  │  ├─ ArticlesTable.php
│  │  │  │  │  ├─ ArticlesView.php
│  │  │  │  ├─ routes.php

route

Livewire/routes.php


Route::get('demo/articles'ArticlesTable::class)
    ->
middleware(['web'])
    ->
name('demo.articles')
    ->
crumbs(fn ($crumbs) => $crumbs->parent('demo')->push('Articles'route('demo.articles')));

component

Livewire/Articles/ArticlesTable.php


<?php

namespace App\Modules\Demo\Livewire\Articles;

use 
App\Modules\Demo\Models\Author;
use 
App\Modules\Demo\Models\Article;
use 
Zofe\Rapyd\Traits\WithDataTable;
use 
Livewire\Component;

class 
ArticlesTable extends Component
{
    use 
WithDataTable;
    public 
$search;
    public 
$author_id;

    public function 
updatedAuthorId()
    {
        
$this->resetPage();
    }

    public function 
updatedSearch()
    {
        
$this->resetPage();
    }

    public function 
getDataSet()
    {
        
$items Article::ssearch($this->search);

        if (
$this->author_id) {
            
$items $items->where('author_id','=',$this->author_id);
        }

        return 
$items $items
            
->orderBy($this->sortField,$this->sortAsc ?'asc':'desc')
            ->
paginate($this->perPage)
            ;
    }

    public function 
render()
    {
        
$items $this->getDataSet();
        
$authors Author::all()->pluck('firstname','id')->toArray();



        return 
view('demo::Articles.views.articles_table',
                    
compact('items','authors')
        )->
layout('demo::admin');
    }
}

view

Livewire/Articles/views/articles_table.blade.php


<x-rpd::card>
    <
x-rpd::table
        title
="List Articles"
        
:items="$items"
    
>
        <
x-slot name="filters">
            <
x-rpd::input col="col" debounce="350" model="search"  placeholder="search..." />
            <
x-rpd::select col="col" lazy model="author_id" :options="$authorsplaceholder="author..."
                           
addempty />
        </
x-slot>

        <
x-slot name="buttons">
            <
a href="{{ route('demo.articles') }}" class="btn btn-outline-dark">reset</a>
            <
a href="{{ route('demo.articles.edit') }}" class="btn btn-outline-primary">add</a>
        </
x-slot>

        <
table class="table">
            <
thead>
            <
tr>
                <
th>
                    <
x-rpd::sort model="id" label="id" />
                </
th>
                <
th>title</th>
                <
th>author</th>
                <
th>body</th>
            </
tr>
            </
thead>
            <
tbody>
            @foreach (
$items as $article)
            <
tr>
                <
td>
                    <
a href="{{ route('demo.articles.view',$article->id) }}">{{ $article->id }}</a>
                </
td>
                <
td>{{ $article->title }}</td>
                <
td>{{ $article->author->firstname }}</td>
                <
td>{{ Str::limit($article->body,50) }}</td>
            </
tr>
            @endforeach
            </
tbody>
        </
table>

    </
x-rpd::table>
</
x-rpd::card>