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.');
}
}