label */ public const ROLES = [ 'supervisor' => 'Supervisor', 'consultant' => 'Consultor', 'client' => 'Cliente', 'viewer' => 'Observador', ]; public function configure(): void { $this->setPrimaryKey('id') ->setDefaultSort('users.name', 'asc') ->setSortingPillsEnabled(false) ->setAdditionalSelects(['users.id as id', 'project_user.role_in_project as role_in_project']); } #[On('project-users-changed')] public function refreshRows(): void { // no-op: triggers re-render so the builder re-runs. } public function builder(): Builder { return User::query() ->join('project_user', 'project_user.user_id', '=', 'users.id') ->where('project_user.project_id', $this->projectId); } public function columns(): array { return [ Column::make('Nombre', 'name') ->sortable() ->searchable() ->format(function ($value, $row) { $initial = strtoupper(mb_substr($value ?? '?', 0, 1)); return '
'.$initial.' '.e($value).'
'; }) ->html(), Column::make('Email', 'email') ->sortable() ->searchable(), Column::make('Rol', 'role_in_project') ->label(function ($row) { $current = $row->role_in_project; if (! Auth::user()->can('assign users')) { return ''.(self::ROLES[$current] ?? ucfirst((string) $current)).''; } $opts = ''; foreach (self::ROLES as $val => $label) { $opts .= ''; } return ''; }) ->html(), Column::make('Acciones') ->label(function ($row) { if (! Auth::user()->can('assign users')) { return ''; } return '
'; }) ->html(), ]; } public function filters(): array { return [ SelectFilter::make('Rol', 'role') ->options(['' => 'Rol: todos'] + self::ROLES) ->filter(fn (Builder $query, string $value) => $query->where('project_user.role_in_project', $value)), ]; } public function changeRole($userId, $role): void { abort_unless(Auth::user()->can('assign users'), 403); if (! array_key_exists($role, self::ROLES)) { return; } \App\Models\Project::findOrFail($this->projectId) ->users()->updateExistingPivot($userId, ['role_in_project' => $role]); $this->dispatch('project-users-changed'); $this->dispatch('notify', 'Rol actualizado.'); } public function removeUser($userId): void { abort_unless(Auth::user()->can('assign users'), 403); \App\Models\Project::findOrFail($this->projectId)->users()->detach($userId); $this->dispatch('project-users-changed'); $this->dispatch('notify', 'Usuario eliminado del proyecto.'); } }