shell bypass 403
<?php
namespace Rappasoft\LaravelLivewireTables;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Relation;
use Livewire\Component;
use Rappasoft\LaravelLivewireTables\Traits\WithBulkActions;
use Rappasoft\LaravelLivewireTables\Traits\WithColumnSelect;
use Rappasoft\LaravelLivewireTables\Traits\WithCustomPagination;
use Rappasoft\LaravelLivewireTables\Traits\WithFilters;
use Rappasoft\LaravelLivewireTables\Traits\WithFooter;
use Rappasoft\LaravelLivewireTables\Traits\WithHeader;
use Rappasoft\LaravelLivewireTables\Traits\WithPerPagePagination;
use Rappasoft\LaravelLivewireTables\Traits\WithReordering;
use Rappasoft\LaravelLivewireTables\Traits\WithSearch;
use Rappasoft\LaravelLivewireTables\Traits\WithSorting;
/**
* Class DataTableComponent
*
* @package Rappasoft\LaravelLivewireTables
*/
abstract class DataTableComponent extends Component
{
use WithBulkActions;
use WithColumnSelect;
use WithCustomPagination;
use WithFilters;
use WithFooter;
use WithHeader;
use WithPerPagePagination;
use WithReordering;
use WithSearch;
use WithSorting;
/**
* Dump the filters array for debugging at the top of the datatable
*
* @var bool
*/
public bool $dumpFilters = false;
/**
* The default pagination theme.
*
* @var string
*/
public $paginationTheme = 'tailwind';
/**
* Whether or not to refresh the table at a certain interval
* false is off
* If it's an integer it will be treated as milliseconds (2000 = refresh every 2 seconds)
* If it's a string it will call that function every 5 seconds unless it is 'keep-alive' or 'visible'.
*
* @var bool|string
*/
public $refresh = false;
/**
* Whether or not to display an offline message when there is no connection.
*
* @var bool
*/
public bool $offlineIndicator = true;
/**
* The message to show when there are no results from a search or query
*
* @var string
*/
public string $emptyMessage = 'No items found. Try to broaden your search.';
/**
* Whether or not to display a responsive table
*
* @var bool
*/
public bool $responsive = true;
/**
* Unique name to use for this table if you want the 'per page' options to be remembered on a per table basis.
* If not, all 'per page' stored in the session will default to the same option for every table with this default name.
*
* I.e. If the users changes it to 25 on the users table, the roles table will also default to 25, unless they have unique tableName's
*
* @var string
*/
protected string $tableName = 'table';
/**
* Name of the page parameter for pagination
* Good to change the default if you have more than one datatable on a page.
*
* @var string
*/
protected string $pageName = 'page';
/**
* @var \null[][]
*/
protected $queryString = [
'filters' => ['except' => null],
'sorts' => ['except' => null],
];
/**
* @var string[]
*/
protected $listeners = ['refreshDatatable' => '$refresh'];
/**
* The array defining the columns of the table.
*
* @return array
*/
abstract public function columns(): array;
/**
* The base query with search and filters for the table.
*
* @return Builder|Relation
*/
abstract public function query();
/**
* TableComponent constructor.
*
* @param null $id
*/
public function __construct($id = null)
{
parent::__construct($id);
$theme = config('livewire-tables.theme');
if ($theme === 'bootstrap-4' || $theme === 'bootstrap-5') {
$this->paginationTheme = 'bootstrap';
}
$this->filters = array_merge($this->filters, $this->baseFilters);
}
/**
* Get the rows query builder with sorting applied.
*
* @return Builder|Relation
*/
public function rowsQuery()
{
$this->cleanFilters();
$query = $this->query();
if (method_exists($this, 'applySorting')) {
$query = $this->applySorting($query);
}
if (method_exists($this, 'applySearchFilter')) {
$query = $this->applySearchFilter($query);
}
return $query;
}
/**
* Get the rows paginated collection that will be returned to the view.
*
* @return Builder[]|\Illuminate\Database\Eloquent\Collection|mixed
*/
public function getRowsProperty()
{
if ($this->paginationEnabled) {
return $this->applyPagination($this->rowsQuery());
}
return $this->rowsQuery()->get();
}
/**
* Reset all the criteria
*/
public function resetAll(): void
{
$this->resetFilters();
$this->resetSearch();
$this->resetSorts();
$this->resetBulk();
$this->resetPage();
}
/**
* The view to render each row of the table.
*
* @return string
*/
public function rowView(): string
{
return 'livewire-tables::'.config('livewire-tables.theme').'.components.table.row-columns';
}
/**
* The view to add any modals for the table, could also be used for any non-visible html
*
* @return string
*/
public function modalsView(): string
{
return 'livewire-tables::stubs.modals';
}
/**
* @return mixed
*/
public function render()
{
return view('livewire-tables::'.config('livewire-tables.theme').'.datatable')
->with([
'columns' => $this->columns(),
'rowView' => $this->rowView(),
'filtersView' => $this->filtersView(),
'customFilters' => $this->filters(),
'rows' => $this->rows,
'modalsView' => $this->modalsView(),
'bulkActions' => $this->bulkActions,
]);
}
/**
* Get a column object by its field
*
* @param string $column
*
* @return mixed
*/
protected function getColumn(string $column)
{
return collect($this->columns())
->where('column', $column)
->first();
}
}