mirror of
https://github.com/LinkStackOrg/LinkStack.git
synced 2025-02-15 03:20:52 +01:00
Enhance UsersTable with advanced filtering and bulk actions functionality
This commit is contained in:
parent
200a6fc83b
commit
64bcc7c307
@ -2,52 +2,58 @@
|
||||
|
||||
namespace App\Http\Livewire;
|
||||
|
||||
use Rappasoft\LaravelLivewireTables\DataTableComponent;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Column;
|
||||
use App\Models\User;
|
||||
use App\Models\Link;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Rappasoft\LaravelLivewireTables\DataTableComponent;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Columns\BooleanColumn;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Column;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Columns\ImageColumn;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Columns\LinkColumn;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Columns\ButtonGroupColumn;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Filters\SelectFilter;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Filters\MultiSelectFilter;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Filters\DateFilter;
|
||||
use Rappasoft\LaravelLivewireTables\Views\Filters\TextFilter;
|
||||
|
||||
class UsersTable extends DataTableComponent
|
||||
{
|
||||
protected $model = User::class;
|
||||
|
||||
protected $listeners = ['refresh' => '$refresh'];
|
||||
|
||||
public $columnSearch = [
|
||||
'name' => null,
|
||||
'email' => null,
|
||||
];
|
||||
|
||||
public function configure(): void
|
||||
{
|
||||
$this->setPrimaryKey('id');
|
||||
$this->setDefaultSort('created_at', 'asc');
|
||||
$this->setPerPageAccepted([50, 100, 250, 500, 1000, -1]);
|
||||
$this->setColumnSelectEnabled();
|
||||
$this->setPrimaryKey('id')
|
||||
->setAdditionalSelects(['users.id as id'])
|
||||
->setDefaultSort('created_at', 'asc')
|
||||
->setPerPageAccepted([50, 100, 250, 500, 1000, -1])
|
||||
->setHideBulkActionsWhenEmptyEnabled();
|
||||
|
||||
$attributes = [
|
||||
'default' => false,
|
||||
'default-colors' => true,
|
||||
'default-styling' => false,
|
||||
];
|
||||
|
||||
|
||||
$this->setTableAttributes(['class' => 'table table-striped']);
|
||||
$this->setTrAttributes(fn($row, $index) => $attributes);
|
||||
$this->setTheadAttributes($attributes);
|
||||
$this->setTbodyAttributes($attributes);
|
||||
$this->setTrAttributes(fn($row, $index) => $attributes);
|
||||
}
|
||||
|
||||
public function rendered()
|
||||
{
|
||||
$this->dispatch('table-loaded');
|
||||
}
|
||||
|
||||
public function columns(): array
|
||||
{
|
||||
return [
|
||||
Column::make(__('messages.ID'), "id")
|
||||
Column::make(__('messages.Name'), 'name')
|
||||
->sortable()
|
||||
->searchable(),
|
||||
Column::make(__('messages.Name'), "name")
|
||||
->sortable()
|
||||
->searchable(),
|
||||
Column::make(__('messages.E-Mail'), "email")
|
||||
Column::make(__('messages.E-Mail'), 'email')
|
||||
->sortable()
|
||||
->searchable(),
|
||||
Column::make(__('messages.Page'), "littlelink_name")
|
||||
@ -64,15 +70,25 @@ class UsersTable extends DataTableComponent
|
||||
Column::make(__('messages.Role'), "role")
|
||||
->sortable()
|
||||
->searchable(),
|
||||
Column::make(__('messages.Links'), "id")
|
||||
->format(function ($value, $row) {
|
||||
$linkCount = Link::where('user_id', $row->id)->count();
|
||||
return $linkCount;
|
||||
Column::make(__('messages.Links'))
|
||||
->label(fn ($row, Column $column) => Link::where('user_id', $row->id)->count())
|
||||
->sortable(function (Builder $query, string $direction) {
|
||||
$direction = ($direction === 'asc') ? 'desc' : 'asc';
|
||||
return $query->orderBy(
|
||||
Link::selectRaw('COUNT(*)')
|
||||
->whereColumn('user_id', 'users.id'),
|
||||
$direction
|
||||
);
|
||||
}),
|
||||
Column::make(__('messages.Clicks'), "id")
|
||||
->format(function ($value, $row) {
|
||||
$clicksSum = Link::where('user_id', $row->id)->sum('click_number');
|
||||
return $clicksSum;
|
||||
Column::make(__('messages.Clicks'))
|
||||
->label(fn ($row, Column $column) => Link::where('user_id', $row->id)->sum('click_number'))
|
||||
->sortable(function (Builder $query, string $direction) {
|
||||
$direction = ($direction === 'asc') ? 'desc' : 'asc';
|
||||
return $query->orderBy(
|
||||
Link::selectRaw('SUM(click_number)')
|
||||
->whereColumn('user_id', 'users.id'),
|
||||
$direction
|
||||
);
|
||||
}),
|
||||
Column::make(__('messages.E-Mail'), "email_verified_at")
|
||||
->hideIf(env('REGISTER_AUTH') === 'auth')
|
||||
@ -144,4 +160,110 @@ class UsersTable extends DataTableComponent
|
||||
}),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
public function filters(): array
|
||||
{
|
||||
return [
|
||||
TextFilter::make(__('messages.Name'), 'name')
|
||||
->config([
|
||||
'maxlength' => 5,
|
||||
'placeholder' => __('messages.Name'),
|
||||
])
|
||||
->filter(function(Builder $builder, string $value) {
|
||||
$builder->where('users.name', 'like', '%'.$value.'%');
|
||||
}),
|
||||
SelectFilter::make(__('messages.E-Mail'), 'email_verified_at')
|
||||
->setFilterPillTitle(__('messages.Status'))
|
||||
->options([
|
||||
'' => 'Any',
|
||||
'yes' => __('messages.Verified'),
|
||||
'no' => __('messages.Pending'),
|
||||
])
|
||||
->filter(function(Builder $builder, string $value) {
|
||||
if ($value === 'yes') {
|
||||
$builder->whereNotNull('email_verified_at');
|
||||
} elseif ($value === 'no') {
|
||||
$builder->whereNull('email_verified_at');
|
||||
}
|
||||
}),
|
||||
SelectFilter::make(__('messages.Status'), 'block')
|
||||
->setFilterPillTitle(__('messages.Status'))
|
||||
->setFilterPillValues([
|
||||
'no' => __('messages.Approved'),
|
||||
'yes' => __('messages.Pending'),
|
||||
])
|
||||
->options([
|
||||
'' => 'All',
|
||||
'no' => __('messages.Approved'),
|
||||
'yes' => __('messages.Pending'),
|
||||
])
|
||||
->filter(function(Builder $builder, string $value) {
|
||||
if ($value === 'yes') {
|
||||
$builder->where('block', 'yes');
|
||||
} elseif ($value === 'no') {
|
||||
$builder->where('block', 'no');
|
||||
}
|
||||
}),
|
||||
DateFilter::make('Created Start')
|
||||
->filter(function(Builder $builder, string $value) {
|
||||
$builder->where('created_at', '>=', $value);
|
||||
}),
|
||||
DateFilter::make('Created End')
|
||||
->filter(function(Builder $builder, string $value) {
|
||||
$builder->where('created_at', '<=', $value);
|
||||
}),
|
||||
];
|
||||
}
|
||||
|
||||
public function builder(): Builder
|
||||
{
|
||||
return User::query()
|
||||
->when($this->columnSearch['name'] ?? null, fn ($query, $name) => $query->where('users.name', 'like', '%' . $name . '%'))
|
||||
->when($this->columnSearch['email'] ?? null, fn ($query, $email) => $query->where('users.email', 'like', '%' . $email . '%'));
|
||||
}
|
||||
|
||||
public function bulkActions(): array
|
||||
{
|
||||
return [
|
||||
'activate' => 'Approve Users',
|
||||
'deactivate' => 'Block Users',
|
||||
'delete' => 'Delete Users',
|
||||
];
|
||||
}
|
||||
|
||||
public function rendered()
|
||||
{
|
||||
$this->dispatch('table-loaded');
|
||||
}
|
||||
|
||||
public function activate()
|
||||
{
|
||||
User::whereIn('id', $this->getSelected())
|
||||
->where('id', '!=', auth()->id())
|
||||
->where('role', '!=', 'admin')
|
||||
->update(['block' => 'no']);
|
||||
|
||||
$this->clearSelected();
|
||||
}
|
||||
|
||||
public function deactivate()
|
||||
{
|
||||
User::whereIn('id', $this->getSelected())
|
||||
->where('id', '!=', auth()->id())
|
||||
->where('role', '!=', 'admin')
|
||||
->update(['block' => 'yes']);
|
||||
|
||||
$this->clearSelected();
|
||||
}
|
||||
|
||||
public function delete()
|
||||
{
|
||||
User::whereIn('id', $this->getSelected())
|
||||
->where('id', '!=', auth()->id())
|
||||
->where('role', '!=', 'admin')
|
||||
->delete();
|
||||
|
||||
$this->clearSelected();
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user