From 61b5596eb739ccc534c4d54c253fcde1935ebe2d Mon Sep 17 00:00:00 2001 From: sundayenglish Date: Tue, 24 Jun 2025 13:53:09 +0700 Subject: [PATCH] Add Title Permission --- app/Components/Permission/Manager.php | 130 ++++++++++++++---- .../components/permission/manager.blade.php | 15 +- resources/views/layouts/app.blade.php | 10 +- 3 files changed, 125 insertions(+), 30 deletions(-) diff --git a/app/Components/Permission/Manager.php b/app/Components/Permission/Manager.php index e21c3bf..158ef23 100644 --- a/app/Components/Permission/Manager.php +++ b/app/Components/Permission/Manager.php @@ -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, + ]); } } diff --git a/resources/views/components/permission/manager.blade.php b/resources/views/components/permission/manager.blade.php index 714a7f4..7b0510a 100644 --- a/resources/views/components/permission/manager.blade.php +++ b/resources/views/components/permission/manager.blade.php @@ -3,7 +3,8 @@
{{-- Header --}}
-
Permissions
+ {{-- Tiêu đề động --}} +
{{ $title }}
@if ($mode === 'index')
@@ -66,14 +67,14 @@
- {{-- Phân trang chỉ khi >1 trang --}} + {{-- Phân trang --}}
@if ($permissions->lastPage() > 1) {{ $permissions->links() }} @endif
@else - {{-- Form (không lồng thêm card) --}} + {{-- Form --}}
{{ $editingId ? 'Edit Permission' : 'Create Permission' }}
@@ -94,8 +95,14 @@
@endif -
+ + {{-- Livewire sẽ chèn và chạy block này sau mỗi lần component render xong --}} + @script + + @endscript diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 390c3fd..d853716 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -1,11 +1,12 @@ + - {{ $title ?? 'Admin Page' }} + {{ $title ?? 'Laravel' }} {{-- Favicons --}} @@ -64,8 +65,13 @@ {{-- Livewire Scripts --}} @livewireScripts - + {{-- Page-specific JS --}} @stack('scripts') +