diff --git a/app/Livewire/Admin/Roles.php b/app/Livewire/Admin/Roles.php new file mode 100644 index 0000000..2fb948b --- /dev/null +++ b/app/Livewire/Admin/Roles.php @@ -0,0 +1,104 @@ + 'required|string|max:255', + ]; + + protected $paginationTheme = 'tailwind'; + + public function getRolesProperty() + { + return Role::where('name', 'like', "%{$this->search}%") + ->orderBy($this->sortField, $this->sortDirection) + ->paginate(10); + } + + public function sortBy($field) + { + if ($this->sortField === $field) { + $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; + } else { + $this->sortField = $field; + $this->sortDirection = 'asc'; + } + } + public function mount() + { + $this->permissions = Permission::all(); + } + + public function openCreateModal() + { + $this->resetFields(); + $this->showCreateModal = true; + } + + public function openEditModal($id) + { + $role = Role::findOrFail($id); + $this->editingRoleId = $role->id; + $this->name = $role->name; + $this->selectedPermissions = $role->permissions()->pluck('id')->toArray(); + $this->showCreateModal = true; + } + + public function save() + { + $this->validate(); + + if ($this->editingRoleId) { + $role = Role::findOrFail($this->editingRoleId); + $role->update(['name' => $this->name]); + $role->syncPermissions($this->selectedPermissions); + session()->flash('message', '角色已更新'); + } else { + $role = Role::create(['name' => $this->name]); + $role->syncPermissions($this->selectedPermissions); + session()->flash('message', '角色已新增'); + } + + $this->resetFields(); + $this->showCreateModal = false; + } + + public function delete($id) + { + Role::findOrFail($id)->delete(); + session()->flash('message', '角色已刪除'); + } + + public function resetFields() + { + $this->name = ''; + $this->selectedPermissions = []; + $this->editingRoleId = null; + } + + public function render() + { + return view('livewire.admin.roles', [ + 'roles' => $this->roles, + ])->layout('layouts.admin'); + } +} diff --git a/app/Livewire/Admin/Users.php b/app/Livewire/Admin/Users.php new file mode 100644 index 0000000..52fd57f --- /dev/null +++ b/app/Livewire/Admin/Users.php @@ -0,0 +1,104 @@ + 'required|string|max:255', + ]; + + protected $paginationTheme = 'tailwind'; + + public function getUsersProperty() + { + return User::where('name', 'like', "%{$this->search}%") + ->orderBy($this->sortField, $this->sortDirection) + ->paginate(10); + } + + public function sortBy($field) + { + if ($this->sortField === $field) { + $this->sortDirection = $this->sortDirection === 'asc' ? 'desc' : 'asc'; + } else { + $this->sortField = $field; + $this->sortDirection = 'asc'; + } + } + public function mount() + { + $this->roles = Role::all(); + } + + public function openCreateModal() + { + $this->resetFields(); + $this->showCreateModal = true; + } + + public function openEditModal($id) + { + $user = User::findOrFail($id); + $this->editingUserId = $user->id; + $this->name = $user->name; + $this->selectedRoles = $user->roles()->pluck('id')->toArray(); + $this->showCreateModal = true; + } + + public function save() + { + $this->validate(); + + if ($this->editingRoleId) { + $role = User::findOrFail($this->editingRoleId); + $role->update(['name' => $this->name]); + $role->syncRolses($this->selectedRoles); + session()->flash('message', '使用者已更新'); + } else { + $role = User::create(['name' => $this->name]); + $role->syncRolses($this->selectedRoles); + session()->flash('message', '使用者已新增'); + } + + $this->resetFields(); + $this->showCreateModal = false; + } + + public function delete($id) + { + User::findOrFail($id)->delete(); + session()->flash('message', '使用者已刪除'); + } + + public function resetFields() + { + $this->name = ''; + $this->selectedRoles = []; + $this->editingUserId = null; + } + + public function render() + { + return view('livewire.admin.users', [ + 'users' => $this->users, + ])->layout('layouts.admin'); + } +} diff --git a/app/View/Components/Table.php b/app/View/Components/Table.php new file mode 100644 index 0000000..58a9e9a --- /dev/null +++ b/app/View/Components/Table.php @@ -0,0 +1,26 @@ + '角色列表', + 'CreateNewRole' => '新增角色', + 'edit' => '編輯', + 'delete' => '刪除', + + 'no' => '編號', + 'name' => '名稱', + + 'create' => '新增', + 'action' => '操作', + 'view' => '查看', + 'submit' => '提交', + 'cancel' => '取消', +]; \ No newline at end of file diff --git a/resources/lang/zh-TW/users.php b/resources/lang/zh-TW/users.php new file mode 100644 index 0000000..29a442f --- /dev/null +++ b/resources/lang/zh-TW/users.php @@ -0,0 +1,17 @@ + '使用者列表', + 'CreateNewRole' => '新增使用者', + 'edit' => '編輯', + 'delete' => '刪除', + + 'no' => '編號', + 'name' => '名稱', + + 'create' => '新增', + 'action' => '操作', + 'view' => '查看', + 'submit' => '提交', + 'cancel' => '取消', +]; \ No newline at end of file diff --git a/resources/views/components/table.blade.php b/resources/views/components/table.blade.php new file mode 100644 index 0000000..39a9278 --- /dev/null +++ b/resources/views/components/table.blade.php @@ -0,0 +1,27 @@ +@php + $classes = [ + 'table-auto w-full text-left', + $attributes->get('bordered', true) ? 'border border-gray-200' : '', + $attributes->get('striped') ? 'divide-y divide-gray-100' : '', + $attributes->get('size') === 'sm' ? 'text-sm' : 'text-base', + ]; +@endphp + +
+ except(['bordered', 'striped', 'size'])->merge(['class' => implode(' ', $classes)]) }}> + @isset($header) + + {{ $header }} + + @endisset + + {{ $slot }} + +
+ + @isset($footer) +
+ {{ $footer }} +
+ @endisset +
\ No newline at end of file diff --git a/resources/views/layouts/admin.blade.php b/resources/views/layouts/admin.blade.php index c852bec..ef74e1d 100644 --- a/resources/views/layouts/admin.blade.php +++ b/resources/views/layouts/admin.blade.php @@ -14,7 +14,7 @@ @vite(['resources/css/app.css', 'resources/js/app.js']) @livewireStyles - + @wireUiScripts @auth diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 5d7a0f7..90184d9 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -14,6 +14,7 @@ @vite(['resources/css/app.css', 'resources/js/app.js']) @livewireStyles + @wireUiScripts
diff --git a/resources/views/livewire/admin/roles.blade.php b/resources/views/livewire/admin/roles.blade.php new file mode 100644 index 0000000..a871f22 --- /dev/null +++ b/resources/views/livewire/admin/roles.blade.php @@ -0,0 +1,66 @@ +
+
+

{{ __('roles.list') }}

+ +
+ +
+ +
+ + + + + {{__('roles.no')}} + {{__('roles.name')}} + {{__('roles.action')}} + + @forelse ($roles as $role) + + {{ $role->id }} + {{ $role->name }} + + @can('role-edit') + + @endcan + @can('role-delete') + + @endcan + + + @empty + + {{ __('No roles found.') }} + + @endforelse + + +
+ {!! $roles->links('pagination::tailwind') !!} +
+ + @if ($showCreateModal) + +
+ + + +
+ + +
+ + +
+
+
+ @endif +
\ No newline at end of file diff --git a/resources/views/livewire/admin/users.blade.php b/resources/views/livewire/admin/users.blade.php new file mode 100644 index 0000000..ff16b18 --- /dev/null +++ b/resources/views/livewire/admin/users.blade.php @@ -0,0 +1,65 @@ +
+
+

{{ __('users.list') }}

+ +
+ +
+ +
+ + + + + {{__('users.no')}} + {{__('users.name')}} + {{__('users.action')}} + + @forelse ($users as $user) + + {{ $user->id }} + {{ $user->name }} + + @can('role-edit') + + @endcan + @can('role-delete') + + @endcan + + + @empty + + {{ __('No users found.') }} + + @endforelse + + +
+ {!! $users->links('pagination::tailwind') !!} +
+ + @if ($showCreateModal) + +
+ + + +
+ + +
+ + +
+
+
+ @endif +
\ No newline at end of file diff --git a/resources/views/livewire/layout/admin/sidebar.blade.php b/resources/views/livewire/layout/admin/sidebar.blade.php index 3a52587..ea2bb67 100644 --- a/resources/views/livewire/layout/admin/sidebar.blade.php +++ b/resources/views/livewire/layout/admin/sidebar.blade.php @@ -3,7 +3,8 @@ $menus = [ ['label' => 'Dashboard', 'route' => 'admin.dashboard', 'icon' => 'home', 'permission' => null], - + ['label' => 'Role', 'route' => 'admin.roles', 'icon' => 'user-circle', 'permission' => 'role-list'], + ['label' => 'User', 'route' => 'admin.users', 'icon' => 'user-circle', 'permission' => 'user-list'], ]; @endphp diff --git a/routes/web.php b/routes/web.php index a639119..add497b 100644 --- a/routes/web.php +++ b/routes/web.php @@ -3,6 +3,8 @@ use Illuminate\Support\Facades\Route; use App\Livewire\Admin\Dashboard as AdminDashboard; +use App\Livewire\Admin\Roles; +use App\Livewire\Admin\Users; Route::view('/', 'welcome'); @@ -18,4 +20,6 @@ require __DIR__.'/auth.php'; Route::middleware(['auth'])->prefix('admin')->name('admin.')->group(function () { Route::get('/dashboard', AdminDashboard::class)->name('dashboard'); + Route::get('/roles', Roles::class)->name('roles'); + Route::get('/users', Users::class)->name('users'); }); \ No newline at end of file