Files
Nexora/app/Livewire/PermissionManager.php
Javi 883daf32ed
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
añadir funicionalidades de permisos y grupos
2025-04-27 23:43:22 +02:00

102 lines
2.6 KiB
PHP

<?php
namespace App\Livewire;
use Livewire\Component;
use App\Models\Project;
use App\Models\Folder;
use App\Models\User;
class PermissionManager extends Component
{
public $selectedProject;
public $selectedFolder;
public $assignTo = 'user';
public $selectedPermissions = [];
public $selectedUser;
public $selectedGroup;
protected $listeners = ['userSelected', 'groupSelected'];
public function rules()
{
return [
'selectedProject' => 'required|exists:projects,id',
'selectedFolder' => 'nullable|exists:folders,id',
'selectedPermissions' => 'required|array|min:1',
'selectedUser' => 'required_if:assignTo,user',
'selectedGroup' => 'required_if:assignTo,group',
];
}
public function getSelectedResourceIdProperty()
{
return $this->selectedFolder ?: $this->selectedProject;
}
public function getCanSaveProperty()
{
return $this->selectedProject &&
($this->assignTo === 'group' ? $this->selectedGroup : $this->selectedUser) &&
count($this->selectedPermissions) > 0;
}
public function getProjectsProperty()
{
return Project::accessibleBy(auth()->user())->get();
}
public function getFoldersProperty()
{
if (!$this->selectedProject) return collect();
return Folder::where('project_id', $this->selectedProject)
->withDepth()
->get()
->toTree();
}
public function getPermissionsProperty()
{
$type = $this->selectedFolder ? 'folder' : 'project';
return config("permissions.types.$type", []);
}
public function userSelected($userId)
{
$this->selectedUser = $userId;
}
public function groupSelected($groupId)
{
$this->selectedGroup = $groupId;
}
public function savePermissions()
{
$this->validate();
$model = $this->assignTo === 'user'
? User::find($this->selectedUser)
: Group::find($this->selectedGroup);
$resource = $this->selectedFolder
? Folder::find($this->selectedFolder)
: Project::find($this->selectedProject);
// Asignar permisos usando Spatie
$model->givePermissionTo(
$resource->permissions()->whereIn('name', $this->selectedPermissions)->get()
);
$this->reset(['selectedPermissions']);
$this->dispatch('permissionsUpdated');
session()->flash('message', 'Permisos actualizados correctamente.');
}
public function render()
{
return view('livewire.permission-manager');
}
}