diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Columns/Column.php | 68 | ||||
-rw-r--r-- | src/Service.php | 8 | ||||
-rw-r--r-- | src/ServiceProvider.php | 27 | ||||
-rw-r--r-- | src/TableComponent.php | 55 |
4 files changed, 158 insertions, 0 deletions
diff --git a/src/Columns/Column.php b/src/Columns/Column.php new file mode 100644 index 0000000..7b9f248 --- /dev/null +++ b/src/Columns/Column.php @@ -0,0 +1,68 @@ +<?php + +namespace Lightscale\LaralightTables\Columns; + +use Illuminate\Database\Eloquent\Model; +use Illuminate\View\ComponentAttributeBag; + +use Closure; + +class Column { + + private TableComponent $table; + + private Closure $displayFn; + private ?Closure $sortFn = null; + private ?Closure $searchFn = null; + private ?Closure $attributesFn = null; + + public function __construct( + public string $name, + public string $title + ) { + $this->displayFn = Closure::fromCallable([$this, 'defaultDisplay']); + } + + public static function make(string $name, $title) : static + { + return new static($name, $title); + } + + private function defaultDisplay(Model $row, Column $column) + { + return $row->{$column->name}; + } + + public function display(callable $fn) : static + { + $this->displayFn = Closure::fromCallable($fn); + return $this; + } + + public function sortable(callable $fn) : static + { + $this->sortFn = Closure::fromCallable($fn); + return $this; + } + + public function searchable(callable $fn) : static + { + $this->searchFn = Closure::fromCallable($fn); + return $this; + } + + public function attributes(callable $fn) : static + { + $this->attributesFn = Closure::fromCallable($fn); + return $this; + } + + public function view(Model $row) + { + $attributes = $this->attributesFn?->call($this, $row) ?? []; + $attributes = new ComponentAttributeBag($attributes); + $content = $this->displayFn->call($this, $row, $this); + return view('laralight-tables::column', compact('attributes', 'content')); + } + +} diff --git a/src/Service.php b/src/Service.php new file mode 100644 index 0000000..01d6180 --- /dev/null +++ b/src/Service.php @@ -0,0 +1,8 @@ +<?php + +namespace Lightscale\LaralightTables; + +class Service +{ + public const NAMESPACE = 'laralight-tables'; +} diff --git a/src/ServiceProvider.php b/src/ServiceProvider.php new file mode 100644 index 0000000..40eb36f --- /dev/null +++ b/src/ServiceProvider.php @@ -0,0 +1,27 @@ +<?php + +namespace Lightscale\LaralightTables; + +use Illuminate\Support\ServiceProvider as ServiceProviderBase; +use Illuminate\Support\Facades\Blade; +use Illuminate\Foundation\Console\AboutCommand; + +class ServiceProvider extends ServiceProviderBase +{ + public function register() : void + { + + } + + public function boot() : void + { + AboutCommand::add('Laralight Tables', fn() => [ + 'Version' => 'dev' + ]); + + //$this->loadTranslationsFrom(__DIR__ . '/../lang', Service::NAMESPACE); + $this->loadViewsFrom(__DIR__ . '/../resources/views', Service::NAMESPACE); + Blade::componentNamespace('Lightscale\\LaralightCms\\View\\Components', Service::NAMESPACE); + } + +} diff --git a/src/TableComponent.php b/src/TableComponent.php new file mode 100644 index 0000000..e530415 --- /dev/null +++ b/src/TableComponent.php @@ -0,0 +1,55 @@ +<?php + +namespace Lightscale\LaralightTables; + +use Livewire\Component; +use Livewire\WithPagination; + +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Model; + +use Exception; + +abstract class TableComponent extends Component +{ + use WithPagination; + + protected $paginationTheme = 'bootstrap'; + protected bool $searchable = true; + + protected Model $model = null; + + protected function query() : Builder + { + if($this->model === null) { + throw new Exception('Requires $model to be set or query() method to be overridden'); + } + + return $this->model::query(); + } + + abstract protected function columns() : array; + + protected function search(Builder $builder, string $search) : void {} + + protected function filters() : array + { + return []; + } + + protected buildQuery() : Builder + { + $query = $this->query(); + } + + public function render() + { + $this->buildQuery()->paginate(); + $data = $query->paginate($this->pageSize); + $columns = $this->columns(); + + return view('laralight-tables::table', compact( + 'data', 'columns' + )); + } +} |