parent
ea7c14fdac
commit
1b352a5daa
8 changed files with 189 additions and 0 deletions
@ -0,0 +1,44 @@ |
|||||||
|
<?php |
||||||
|
namespace App\Components\Permission; |
||||||
|
|
||||||
|
use Livewire\Component; |
||||||
|
use Spatie\Permission\Models\Permission; |
||||||
|
|
||||||
|
class Form extends Component |
||||||
|
{ |
||||||
|
public $permissionId; |
||||||
|
public $name; |
||||||
|
|
||||||
|
protected function rules() |
||||||
|
{ |
||||||
|
return [ |
||||||
|
'name' => 'required|string|unique:permissions,name' . |
||||||
|
($this->permissionId ? ",{$this->permissionId}" : ''), |
||||||
|
]; |
||||||
|
} |
||||||
|
|
||||||
|
public function mount($permissionId = null) |
||||||
|
{ |
||||||
|
$this->permissionId = $permissionId; |
||||||
|
if ($permissionId) { |
||||||
|
$perm = Permission::findOrFail($permissionId); |
||||||
|
$this->name = $perm->name; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public function save() |
||||||
|
{ |
||||||
|
$this->validate(); |
||||||
|
Permission::updateOrCreate( |
||||||
|
['id' => $this->permissionId], |
||||||
|
['name' => $this->name] |
||||||
|
); |
||||||
|
session()->flash('message', 'Permission saved.'); |
||||||
|
$this->emitUp('permissionSaved'); |
||||||
|
} |
||||||
|
|
||||||
|
public function render() |
||||||
|
{ |
||||||
|
return view('components.permission.form'); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,31 @@ |
|||||||
|
<?php |
||||||
|
namespace App\Components\Permission; |
||||||
|
|
||||||
|
use Livewire\Component; |
||||||
|
use Livewire\WithPagination; |
||||||
|
use Spatie\Permission\Models\Permission; |
||||||
|
|
||||||
|
class Index extends Component |
||||||
|
{ |
||||||
|
use WithPagination; |
||||||
|
|
||||||
|
public $search = ''; |
||||||
|
protected $listeners = ['permissionSaved' => '$refresh']; |
||||||
|
|
||||||
|
public function updatingSearch() { $this->resetPage(); } |
||||||
|
|
||||||
|
public function delete($id) |
||||||
|
{ |
||||||
|
Permission::findOrFail($id)->delete(); |
||||||
|
session()->flash('message', 'Permission deleted.'); |
||||||
|
} |
||||||
|
|
||||||
|
public function render() |
||||||
|
{ |
||||||
|
$permissions = Permission::where('name', 'like', "%{$this->search}%") |
||||||
|
->orderByDesc('id') |
||||||
|
->paginate(10); |
||||||
|
|
||||||
|
return view('components.permission.index', compact('permissions')); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
<?php |
||||||
|
namespace App\Http\Controllers; |
||||||
|
|
||||||
|
use App\Http\Controllers\Controller; |
||||||
|
use Spatie\Permission\Models\Permission; |
||||||
|
|
||||||
|
class PermissionController extends Controller |
||||||
|
{ |
||||||
|
public function index() |
||||||
|
{ |
||||||
|
return view('admin.permissions.index'); |
||||||
|
} |
||||||
|
|
||||||
|
public function create() |
||||||
|
{ |
||||||
|
return view('admin.permissions.form'); |
||||||
|
} |
||||||
|
|
||||||
|
public function edit(Permission $permission) |
||||||
|
{ |
||||||
|
// truyền permissionId vào wrapper |
||||||
|
return view('admin.permissions.form', [ |
||||||
|
'permissionId' => $permission->id, |
||||||
|
]); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
@extends('layouts.app') |
||||||
|
|
||||||
|
@section('title', isset($permissionId) ? 'Edit Permission' : 'Create Permission') |
||||||
|
|
||||||
|
@section('content') |
||||||
|
{{-- truyền permissionId nếu có --}} |
||||||
|
<livewire:permission.form :permission-id="$permissionId ?? null" /> |
||||||
|
@endsection |
@ -0,0 +1,7 @@ |
|||||||
|
@extends('layouts.app') |
||||||
|
|
||||||
|
@section('title', 'Permissions') |
||||||
|
|
||||||
|
@section('content') |
||||||
|
<livewire:permission.index /> |
||||||
|
@endsection |
@ -0,0 +1,20 @@ |
|||||||
|
<div class="p-4 max-w-md"> |
||||||
|
@if (session()->has('message')) |
||||||
|
<div class="alert alert-success mb-2">{{ session('message') }}</div> |
||||||
|
@endif |
||||||
|
|
||||||
|
<form wire:submit.prevent="save"> |
||||||
|
<div class="mb-4"> |
||||||
|
<label class="block mb-1">Name</label> |
||||||
|
<input |
||||||
|
type="text" |
||||||
|
wire:model.defer="name" |
||||||
|
class="border p-2 w-full" |
||||||
|
> |
||||||
|
@error('name') <span class="text-red-600">{{ $message }}</span> @enderror |
||||||
|
</div> |
||||||
|
<button type="submit" class="btn btn-primary"> |
||||||
|
{{ $permissionId ? 'Update' : 'Create' }} |
||||||
|
</button> |
||||||
|
</form> |
||||||
|
</div> |
@ -0,0 +1,47 @@ |
|||||||
|
<div class="p-4"> |
||||||
|
<div class="flex justify-between mb-4"> |
||||||
|
<input |
||||||
|
type="text" |
||||||
|
wire:model.debounce.300ms="search" |
||||||
|
placeholder="Search permissions..." |
||||||
|
class="border p-2" |
||||||
|
> |
||||||
|
<a href="{{ route('permissions.create') }}" class="btn btn-primary"> |
||||||
|
New Permission |
||||||
|
</a> |
||||||
|
</div> |
||||||
|
|
||||||
|
@if (session()->has('message')) |
||||||
|
<div class="alert alert-success mb-2">{{ session('message') }}</div> |
||||||
|
@endif |
||||||
|
|
||||||
|
<table class="w-full table-auto border-collapse border"> |
||||||
|
<thead> |
||||||
|
<tr> |
||||||
|
<th class="border px-2 py-1">ID</th> |
||||||
|
<th class="border px-2 py-1">Name</th> |
||||||
|
<th class="border px-2 py-1">Actions</th> |
||||||
|
</tr> |
||||||
|
</thead> |
||||||
|
<tbody> |
||||||
|
@foreach($permissions as $p) |
||||||
|
<tr> |
||||||
|
<td class="border px-2 py-1">{{ $p->id }}</td> |
||||||
|
<td class="border px-2 py-1">{{ $p->name }}</td> |
||||||
|
<td class="border px-2 py-1"> |
||||||
|
<a |
||||||
|
href="{{ route('permissions.edit', $p) }}" |
||||||
|
class="text-blue-600" |
||||||
|
>Edit</a> |
||||||
|
<button |
||||||
|
wire:click="delete({{ $p->id }})" |
||||||
|
class="text-red-600 ml-2" |
||||||
|
>Delete</button> |
||||||
|
</td> |
||||||
|
</tr> |
||||||
|
@endforeach |
||||||
|
</tbody> |
||||||
|
</table> |
||||||
|
|
||||||
|
<div class="mt-4">{{ $permissions->links() }}</div> |
||||||
|
</div> |
Loading…
Reference in new issue