1
0
Fork 0
wow-raid-bingo/app/Http/Livewire/Datatable.php

115 lines
2.3 KiB
PHP

<?php
namespace App\Http\Livewire;
use Livewire\Component;
use Livewire\WithPagination;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
class Datatable extends Component
{
use WithPagination, Traits\WithSort;
/**
* Query string settings.
*/
protected $queryString = [
'sort' => ['except' => 'id'],
'dir' => ['except' => 'asc'],
'page' => ['except' => 1],
'trashed' => ['except' => false]
];
/**
* Model to get data from.
*/
public $model;
/**
* Array of columns to show
*/
public array $columns;
/**
* What colums are sortable
*/
public array $sort_columns;
/**
* Default sorting column
*/
public string $default_sort;
/**
* If only trashed records should be shown.
*/
public bool $trashed = false;
public $route_create;
/**
* Route for editing a record (if null, link is omitted)
*/
public $route_edit;
/**
* Route for deleting a record (if null, link is omitted)
*/
public $route_delete;
/**
* Route for restoring a record (if null, link is omitted)
*/
public $route_restore;
/**
* How many records should be displayed on one page.
*/
public int $itemsPerPage = 30;
public function mount(string $model, array $columns,
array $sort_columns = [], $default_sort = '',
$route_create = null, $route_edit = null, $route_delete = null, $route_restore = null)
{
$this->model = app()->make($model);
$this->default_sort = $default_sort;
$this->sort = $this->default_sort;
$this->sort_columns = $sort_columns;
$this->route_create = $route_create;
$this->route_edit = $route_edit;
$this->route_delete = $route_delete;
$this->route_restore = $route_restore;
}
/**
* Render the datatable
*/
public function render()
{
$query = $this->model->query();
// Check colums for "dot-notated" strings.
// as we want to eager load those relationships
foreach ($this->columns as $col => $_) {
$p = strrpos($col, '.');
if ($p !== false) {
$rel = substr($col, 0, $p);
$query->with($rel);
}
}
// Apply sorting.
$this->sortApply($query);
$items = $query->paginate($this->itemsPerPage);
return view('livewire.datatable', ['items' => $items]);
}
public function getRouteKeyProperty()
{
return Str::slug(get_class($this->model));
}
}