From 97d2fdd3c9307bcfefe76b133b224dce2e80fd00 Mon Sep 17 00:00:00 2001 From: "allen.yan" Date: Thu, 24 Apr 2025 14:13:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=80=85=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=94=B9=E7=89=88=2020250424?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Livewire/Admin/EditUserModal.php | 42 +++++ app/Livewire/Admin/UserTable.php | 148 ++++++++++++++++++ app/Livewire/Admin/Users.php | 104 ------------ .../livewire/admin/edit-user-modal.blade.php | 16 ++ .../views/livewire/admin/users.blade.php | 79 ++-------- routes/web.php | 8 +- 6 files changed, 229 insertions(+), 168 deletions(-) create mode 100644 app/Livewire/Admin/EditUserModal.php create mode 100644 app/Livewire/Admin/UserTable.php delete mode 100644 app/Livewire/Admin/Users.php create mode 100644 resources/views/livewire/admin/edit-user-modal.blade.php diff --git a/app/Livewire/Admin/EditUserModal.php b/app/Livewire/Admin/EditUserModal.php new file mode 100644 index 0000000..baf641e --- /dev/null +++ b/app/Livewire/Admin/EditUserModal.php @@ -0,0 +1,42 @@ +userId = $user->id; + $this->name = $user->name; + $this->email = $user->email; + } + + public function save() + { + $this->validate([ + 'name' => 'required', + 'email' => 'required|email', + ]); + + User::find($this->userId)->update([ + 'name' => $this->name, + 'email' => $this->email, + ]); + + $this->closeModal(); + $this->dispatch('notify', '使用者更新成功'); + } + + public function render() + { + return view('livewire.admin.edit-user-modal'); + } +} diff --git a/app/Livewire/Admin/UserTable.php b/app/Livewire/Admin/UserTable.php new file mode 100644 index 0000000..3ba91db --- /dev/null +++ b/app/Livewire/Admin/UserTable.php @@ -0,0 +1,148 @@ + 'outside']); + } + + /* */ + + + public function setUp(): array + { + $this->showCheckBox(); + + return [ + PowerGrid::exportable(fileName: 'my-export-file') + ->type(Exportable::TYPE_XLS, Exportable::TYPE_CSV), + PowerGrid::header() + //->showSoftDeletes() + ->showToggleColumns() + ->showSearchInput(), + PowerGrid::footer()->showPerPage()->showRecordCount(), + ]; + } + public function header(): array + { + return [ + Button::add('bulk-delete') + ->slot('Bulk delete ()') + ->icon('solid-trash',['id' => 'my-custom-icon-id', 'class' => 'font-bold']) + ->class('inline-flex items-center gap-1 px-3 py-1 rounded ') + ->dispatch('bulkDelete.' . $this->tableName, []), + ]; + } + + public function datasource(): Builder + { + return User::query(); + } + + public function relationSearch(): array + { + return []; + } + + public function fields(): PowerGridFields + { + return PowerGrid::fields() + ->add('id') + ->add('name') + ->add('email') + ->add('created_at_formatted', fn (User $model) => Carbon::parse($model->created_at)->format('d/m/Y H:i:s')); + } + + public function columns(): array + { + return [ + Column::make('ID', 'id'), + Column::make('名稱', 'name')->sortable()->searchable(), + Column::make('Email', 'email')->sortable()->searchable(), + Column::make('建立時間', 'created_at_formatted', 'created_at')->sortable(), + Column::action('操作') + ]; + } + + public function filters(): array + { + return [ + Filter::inputText('name')->placeholder('Dish Name'), + Filter::inputText('email')->placeholder('Dish Email'), + Filter::datetimepicker('created_at'), + ]; + } + + public function actions(User $row): array + { + return [ + Button::add('edit') + ->slot('編輯') + ->icon('solid-pencil-square') + ->class('inline-flex items-center gap-1 px-3 py-1 rounded ') + ->openModal('admin.edit-user-modal', ['userId' => $row->id]), + Button::add('delete') + ->slot('刪除') + ->icon('solid-trash') + ->class('inline-flex items-center gap-1 px-3 py-1 rounded ') + ->confirmPrompt('確定要刪除這位使用者嗎?|DELETE', 'DELETE') // 使用 'DELETE' 作為標識符 + ->dispatch('delete-user', ['userId' => $row->id]), + ]; + } + #[On('bulkDelete.{tableName}')] + public function bulkDelete(): void + { + $this->js('alert(window.pgBulkActions.get(\'' . $this->tableName . '\'))'); + if($this->checkboxValues){ + User::destroy($this->checkboxValues); + $this->js('window.pgBulkActions.clearAll()'); // clear the count on the interface. + } + } + + #[\Livewire\Attributes\On('delete-user')] + public function deleteUser($userId): void + { + User::findOrFail($userId)->delete(); + + $this->dispatch('notify', '刪除成功'); + } + + /* public function actionRules($row): array + { + return [ + // Hide button edit for ID 1 + Rule::button('edit') + ->when(fn($row) => $row->id === 1) + ->hide(), + ]; + } */ + +} diff --git a/app/Livewire/Admin/Users.php b/app/Livewire/Admin/Users.php deleted file mode 100644 index 52fd57f..0000000 --- a/app/Livewire/Admin/Users.php +++ /dev/null @@ -1,104 +0,0 @@ - '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/resources/views/livewire/admin/edit-user-modal.blade.php b/resources/views/livewire/admin/edit-user-modal.blade.php new file mode 100644 index 0000000..2efe871 --- /dev/null +++ b/resources/views/livewire/admin/edit-user-modal.blade.php @@ -0,0 +1,16 @@ +
+

編輯使用者

+ +
+ +
+ +
+ +
+ +
+ + +
+
\ No newline at end of file diff --git a/resources/views/livewire/admin/users.blade.php b/resources/views/livewire/admin/users.blade.php index ff16b18..9087979 100644 --- a/resources/views/livewire/admin/users.blade.php +++ b/resources/views/livewire/admin/users.blade.php @@ -1,65 +1,20 @@ -
-
-

{{ __('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) - -
- - - -
- - -
- - -
-
-
+ @if (session()->has('message')) + + @endif -
\ No newline at end of file + + {{-- 單一 Livewire 元件,內含資料表與 Modal --}} + + \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index add497b..27fbb0d 100644 --- a/routes/web.php +++ b/routes/web.php @@ -4,7 +4,7 @@ use Illuminate\Support\Facades\Route; use App\Livewire\Admin\Dashboard as AdminDashboard; use App\Livewire\Admin\Roles; -use App\Livewire\Admin\Users; +use App\Livewire\Admin\UserTable; Route::view('/', 'welcome'); @@ -19,7 +19,11 @@ Route::view('profile', 'profile') require __DIR__.'/auth.php'; Route::middleware(['auth'])->prefix('admin')->name('admin.')->group(function () { + Route::get('/users', function () { + return view('livewire.admin.users'); + })->name('users'); Route::get('/dashboard', AdminDashboard::class)->name('dashboard'); Route::get('/roles', Roles::class)->name('roles'); - Route::get('/users', Users::class)->name('users'); + //Route::get('/users', Users::class)->name('users'); + Route::get('/users-table', UserTable::class)->name('users-table'); }); \ No newline at end of file