|
|
|
@ -10,17 +10,43 @@ use Spatie\Permission\Models\Permission; |
|
|
|
|
class Manager extends Component |
|
|
|
|
{ |
|
|
|
|
use WithPagination; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Number of items per page for pagination. |
|
|
|
|
*/ |
|
|
|
|
public int $perPage = 10; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Pagination theme (bootstrap or tailwind). |
|
|
|
|
*/ |
|
|
|
|
protected string $paginationTheme = 'bootstrap'; |
|
|
|
|
|
|
|
|
|
public string $mode = 'index'; // 'index' hoặc 'form' |
|
|
|
|
public ?int $editingId = null; // id đang edit |
|
|
|
|
public string $search = ''; // search query |
|
|
|
|
public string $name = ''; // dùng cho form |
|
|
|
|
/** |
|
|
|
|
* Current UI mode: 'index' (list view) or 'form' (create/edit view). |
|
|
|
|
*/ |
|
|
|
|
public string $mode = 'index'; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* ID of the permission currently being edited. |
|
|
|
|
* Null when creating a new permission. |
|
|
|
|
*/ |
|
|
|
|
public ?int $editingId = null; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Current search query string. |
|
|
|
|
*/ |
|
|
|
|
public string $search = ''; |
|
|
|
|
|
|
|
|
|
// Khi sự kiện 'permissionSaved' được dispatch, gọi showIndex() |
|
|
|
|
/** |
|
|
|
|
* Permission name used in the create/edit form. |
|
|
|
|
*/ |
|
|
|
|
public string $name = ''; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Handle internal Livewire event to switch back to the index (list) view. |
|
|
|
|
*/ |
|
|
|
|
#[On('permissionSaved')] |
|
|
|
|
public function showIndex() |
|
|
|
|
public function showIndex(): void |
|
|
|
|
{ |
|
|
|
|
$this->mode = 'index'; |
|
|
|
|
$this->resetPage(); |
|
|
|
@ -28,14 +54,24 @@ class Manager extends Component |
|
|
|
|
$this->editingId = null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Khi $search đã được cập nhật, reset pagination về trang 1 |
|
|
|
|
public function updatedSearch($value) |
|
|
|
|
/** |
|
|
|
|
* Reset pagination whenever the search term changes. |
|
|
|
|
* |
|
|
|
|
* @param string $value |
|
|
|
|
* @return void |
|
|
|
|
*/ |
|
|
|
|
public function updatedSearch(string $value): void |
|
|
|
|
{ |
|
|
|
|
$this->resetPage(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Chuyển sang form (create/edit) |
|
|
|
|
public function showForm(int $id = null) |
|
|
|
|
/** |
|
|
|
|
* Switch to the form view for creating or editing a permission. |
|
|
|
|
* |
|
|
|
|
* @param int|null $id Permission ID to edit, or null to create new. |
|
|
|
|
* @return void |
|
|
|
|
*/ |
|
|
|
|
public function showForm(?int $id = null): void |
|
|
|
|
{ |
|
|
|
|
$this->mode = 'form'; |
|
|
|
|
$this->editingId = $id; |
|
|
|
@ -44,42 +80,88 @@ class Manager extends Component |
|
|
|
|
: ''; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Xóa |
|
|
|
|
public function delete(int $id) |
|
|
|
|
/** |
|
|
|
|
* Delete a permission by its ID. |
|
|
|
|
* |
|
|
|
|
* @param int $id |
|
|
|
|
* @return void |
|
|
|
|
*/ |
|
|
|
|
public function delete(int $id): void |
|
|
|
|
{ |
|
|
|
|
Permission::findOrFail($id)->delete(); |
|
|
|
|
session()->flash('message', 'Permission deleted.'); |
|
|
|
|
$this->resetPage(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Lưu form |
|
|
|
|
public function save() |
|
|
|
|
/** |
|
|
|
|
* Validate and save the permission (create or update). |
|
|
|
|
* |
|
|
|
|
* @return void |
|
|
|
|
*/ |
|
|
|
|
public function save(): void |
|
|
|
|
{ |
|
|
|
|
$rules = [ |
|
|
|
|
'name' => 'required|string|unique:permissions,name' |
|
|
|
|
. ($this->editingId ? ",{$this->editingId}" : '') |
|
|
|
|
]; |
|
|
|
|
$uniqueRule = 'unique:permissions,name' |
|
|
|
|
. ($this->editingId ? ',' . $this->editingId : ''); |
|
|
|
|
|
|
|
|
|
$this->validate($rules); |
|
|
|
|
$this->validate([ |
|
|
|
|
'name' => "required|string|{$uniqueRule}", |
|
|
|
|
]); |
|
|
|
|
|
|
|
|
|
Permission::updateOrCreate( |
|
|
|
|
['id' => $this->editingId], |
|
|
|
|
['id' => $this->editingId], |
|
|
|
|
['name' => $this->name] |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
session()->flash('message', 'Permission saved.'); |
|
|
|
|
|
|
|
|
|
// Gọi sự kiện nội bộ Livewire 3 |
|
|
|
|
// Trigger internal Livewire event to return to the list view |
|
|
|
|
$this->dispatch('permissionSaved'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Render view |
|
|
|
|
/** |
|
|
|
|
* Compute dynamic browser title based on current mode and editing state. |
|
|
|
|
* |
|
|
|
|
* @return string |
|
|
|
|
*/ |
|
|
|
|
protected function computeTitle(): string |
|
|
|
|
{ |
|
|
|
|
if ($this->mode === 'index') { |
|
|
|
|
return 'Permissions'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($this->mode === 'form' && $this->editingId) { |
|
|
|
|
return "Edit Permission: {$this->name}"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return 'Create Permission'; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Expose computed title as a Livewire property. |
|
|
|
|
* |
|
|
|
|
* @return string |
|
|
|
|
*/ |
|
|
|
|
public function getTitleProperty(): string |
|
|
|
|
{ |
|
|
|
|
return $this->computeTitle(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Render the component view with paginated permissions and dynamic title. |
|
|
|
|
* |
|
|
|
|
* @return \Illuminate\View\View |
|
|
|
|
*/ |
|
|
|
|
public function render() |
|
|
|
|
{ |
|
|
|
|
$permissions = Permission::where('name', 'like', "%{$this->search}%") |
|
|
|
|
$permissions = Permission::query() |
|
|
|
|
->when($this->search, fn($q) => $q->where('name', 'like', "%{$this->search}%")) |
|
|
|
|
->orderByDesc('id') |
|
|
|
|
->paginate($this->perPage); |
|
|
|
|
|
|
|
|
|
return view('components.permission.manager', compact('permissions')); |
|
|
|
|
return view('components.permission.manager', [ |
|
|
|
|
'permissions' => $permissions, |
|
|
|
|
// Blade can now access {{ $title }} via the computed property |
|
|
|
|
'title' => $this->title, |
|
|
|
|
]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|