From c348af2484f4418a64712100da515d7db56b7450 Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Fri, 15 Aug 2025 08:35:06 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(usermanagement):=20tambah=20fitur=20e?= =?UTF-8?q?xport=20users=20dengan=20filter=20pencarian?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Modifikasi `UsersExport` untuk menerima parameter search - Tambah filter whereAny (name, email) di `collection()` - Tambah kolom "Roles" dengan mapping roles (pluck + implode) - Null safety branch pakai optional chaining - Update formatting kolom export - Modifikasi `UsersController@export` untuk terima & teruskan search - Batasi role berdasarkan role user login - Konsistensikan pencarian di `index()` pakai whereAny - Hapus validasi NIK di profile update - Tambah ID pada tombol export di `index.blade.php` - Tambah fungsi JS `updateExportUrl()` untuk sinkronisasi search - Null safety render branch & role di DataTable - Tambah listener untuk update URL export saat search - Perbaiki formatting & indentasi kode --- app/Exports/UsersExport.php | 21 ++++- app/Http/Controllers/UsersController.php | 13 ++- resources/views/users/index.blade.php | 101 ++++++++++++++--------- 3 files changed, 84 insertions(+), 51 deletions(-) diff --git a/app/Exports/UsersExport.php b/app/Exports/UsersExport.php index 4ee9169..ce9831c 100644 --- a/app/Exports/UsersExport.php +++ b/app/Exports/UsersExport.php @@ -9,10 +9,21 @@ use PhpOffice\PhpSpreadsheet\Style\NumberFormat; use Maatwebsite\Excel\Concerns\WithColumnFormatting; use Modules\Usermanagement\Models\User; -class UsersExport implements WithColumnFormatting, WithHeadings, FromCollection, withMapping +class UsersExport implements WithColumnFormatting, WithHeadings, FromCollection, WithMapping { + protected $search; + + public function __construct($search = null) + { + $this->search = $search; + } + public function collection(){ - return User::all(); + return User::query() + ->when($this->search, function ($query) { + $query->whereAny(['name','email'],'like','%'.$this->search.'%'); + }) + ->get(); } public function map($row): array{ @@ -21,7 +32,8 @@ class UsersExport implements WithColumnFormatting, WithHeadings, FromCollection, $row->name, $row->email, $row->nik, - $row->branch->name, + $row->branch?->name, + $row->roles?->pluck('name')->implode(', '), $row->created_at ]; } @@ -32,6 +44,7 @@ class UsersExport implements WithColumnFormatting, WithHeadings, FromCollection, 'Email', 'NIK', 'Branch', + 'Roles', 'Created At' ]; } @@ -39,7 +52,7 @@ class UsersExport implements WithColumnFormatting, WithHeadings, FromCollection, public function columnFormats(): array{ return [ 'A' => \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER, - 'F' => \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_DATETIME + 'G' => \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_DATETIME ]; } } diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index 33f3965..6aa8cc9 100644 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -82,10 +82,7 @@ // Apply search filter if provided if ($request->has('search') && !empty($request->get('search'))) { $search = $request->get('search'); - $query->where(function ($q) use ($search) { - $q->whereRaw('LOWER(name) LIKE ?', ['%' . strtolower($search) . '%']) - ->orWhereRaw('LOWER(email) LIKE ?', ['%' . strtolower($search) . '%']); - }); + $query->whereAny(['name','email'],'like','%'.$search.'%'); } // Apply sorting if provided @@ -241,13 +238,16 @@ return view('usermanagement::users.create', compact('roles', 'branches')); } - public function export() + public function export(Request $request) { if (is_null($this->user) || !$this->user->can('usermanagement.export')) { abort(403, 'Sorry! You are not allowed to export users.'); } - return Excel::download(new UsersExport, 'users.xlsx'); + // Get search parameter from request + $search = $request->get('search'); + + return Excel::download(new UsersExport($search), 'users.xlsx'); } public function profile() @@ -263,7 +263,6 @@ $validatedData = $request->validate([ 'name' => 'required|string|max:255', 'email' => 'required|string|email|max:255|unique:users,email,' . $user->id, - 'nik' => 'required|string|max:255|unique:users,nik,' . $user->id, 'sign' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048', ]); diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php index f28a717..0642830 100644 --- a/resources/views/users/index.blade.php +++ b/resources/views/users/index.blade.php @@ -7,8 +7,9 @@ @section('content')
-
-
+
+

List of Users

@@ -21,50 +22,54 @@
- +
- - - - - - - - - + + + + + + + + +
- - - Name - - - Email - - - NIK - - - Branch - - - Role - - Action
+ + + Name + + + Email + + + NIK + + + Branch + + + Role + + Action
-