111 lines
3.3 KiB
PHP
111 lines
3.3 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace App\Http\Livewire\Permission;
|
||
|
|
||
|
use Illuminate\Database\Eloquent\Collection;
|
||
|
use Illuminate\Support\Str;
|
||
|
use Livewire\Component;
|
||
|
use Spatie\Permission\Models\Permission;
|
||
|
use Spatie\Permission\Models\Role;
|
||
|
|
||
|
class RoleModal extends Component
|
||
|
{
|
||
|
public $name;
|
||
|
public $checked_permissions;
|
||
|
public $check_all;
|
||
|
|
||
|
public Role $role;
|
||
|
public Collection $permissions;
|
||
|
|
||
|
protected $rules = [
|
||
|
'name' => 'required|string',
|
||
|
];
|
||
|
|
||
|
// This is the list of listeners that this component listens to.
|
||
|
protected $listeners = ['modal.show.role_name' => 'mountRole'];
|
||
|
|
||
|
// This function is called when the component receives the `modal.show.role_name` event.
|
||
|
public function mountRole($role_name = '')
|
||
|
{
|
||
|
if (empty($role_name)) {
|
||
|
// Create new
|
||
|
$this->role = new Role;
|
||
|
$this->name = '';
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Get the role by name.
|
||
|
$role = Role::where('name', $role_name)->first();
|
||
|
if (is_null($role)) {
|
||
|
$this->emit('error', 'The selected role [' . $role_name . '] is not found');
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$this->role = $role;
|
||
|
|
||
|
// Set the name and checked permissions properties to the role's values.
|
||
|
$this->name = $this->role->name;
|
||
|
$this->checked_permissions = $this->role->permissions->pluck('name');
|
||
|
}
|
||
|
|
||
|
// This function is called when the component is mounted.
|
||
|
public function mount()
|
||
|
{
|
||
|
// Get all permissions.
|
||
|
$this->permissions = Permission::all();
|
||
|
|
||
|
// Set the checked permissions property to an empty array.
|
||
|
$this->checked_permissions = [];
|
||
|
}
|
||
|
|
||
|
// This function renders the component's view.
|
||
|
public function render()
|
||
|
{
|
||
|
// Create an array of permissions grouped by ability.
|
||
|
$permissions_by_group = [];
|
||
|
foreach ($this->permissions ?? [] as $permission) {
|
||
|
$ability = Str::after($permission->name, ' ');
|
||
|
|
||
|
$permissions_by_group[$ability][] = $permission;
|
||
|
}
|
||
|
|
||
|
// Return the view with the permissions_by_group variable passed in.
|
||
|
return view('livewire.permission.role-modal', compact('permissions_by_group'));
|
||
|
}
|
||
|
|
||
|
// This function submits the form and updates the role's permissions.
|
||
|
public function submit()
|
||
|
{
|
||
|
$this->validate();
|
||
|
|
||
|
$this->role->name = $this->name;
|
||
|
if ($this->role->isDirty()) {
|
||
|
$this->role->save();
|
||
|
}
|
||
|
|
||
|
// Sync the role's permissions with the checked permissions property.
|
||
|
$this->role->syncPermissions($this->checked_permissions);
|
||
|
|
||
|
// Emit a success event with a message indicating that the permissions have been updated.
|
||
|
$this->emit('success', 'Permissions for ' . ucwords($this->role->name) . ' role updated');
|
||
|
}
|
||
|
|
||
|
// This function checks all of the permissions.
|
||
|
public function checkAll()
|
||
|
{
|
||
|
// If the check_all property is true, set the checked permissions property to all of the permissions.
|
||
|
if ($this->check_all) {
|
||
|
$this->checked_permissions = $this->permissions->pluck('name');
|
||
|
} else {
|
||
|
// Otherwise, set the checked permissions property to an empty array.
|
||
|
$this->checked_permissions = [];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function hydrate()
|
||
|
{
|
||
|
$this->resetErrorBag();
|
||
|
$this->resetValidation();
|
||
|
}
|
||
|
}
|