From a6c79c72b54e0de9a8963e153d31e9d9f2a73d6e Mon Sep 17 00:00:00 2001 From: Daeng Deni Mardaeni Date: Sat, 17 May 2025 15:07:09 +0700 Subject: [PATCH] feat(roles): tambahkan fitur pengelolaan posisi dan tingkat jabatan pada modul role - Modifikasi form pembuatan role: - Tambahkan class `tomselect` pada elemen dropdown posisi. - Update label tingkat jabatan pada tampilan opsi dropdown. - Pembaruan tabel pada halaman list role: - Tambah kolom baru: "Position" dan "Tingkat Jabatan". - Kolom baru dapat diurutkan. - Update logika pencarian dan pengurutan: - Izinkan pencarian berdasarkan nama posisi dan tingkat jabatan. - Tambahkan pengurutan data berdasarkan nama posisi dan tingkat jabatan dengan join table `positions`. - Perbaikan pada paginasi dan penghitungan data: - Revisi query agar menghindari duplikasi data akibat join tabel. - Ekspor data: - Tambahkan informasi kolom baru "Position" dan "Tingkat Jabatan" pada file Excel hasil ekspor. - Perbarui header dan pengaturan format kolom pada file Excel. Perubahan ini memperluas fleksibilitas pada manajemen role dengan menambahkan dimensi posisi dan tingkat jabatan baik dalam tampilan UI maupun data backend. --- app/Exports/RolesExport.php | 9 ++++- app/Http/Controllers/RolesController.php | 33 +++++++++++++---- resources/views/roles/create.blade.php | 4 +- resources/views/roles/index.blade.php | 47 ++++++++++++------------ 4 files changed, 58 insertions(+), 35 deletions(-) diff --git a/app/Exports/RolesExport.php b/app/Exports/RolesExport.php index 7dbc4a3..51b5f79 100644 --- a/app/Exports/RolesExport.php +++ b/app/Exports/RolesExport.php @@ -11,13 +11,15 @@ use Modules\Usermanagement\Models\Role; class RolesExport implements WithColumnFormatting, WithHeadings, FromCollection, withMapping { public function collection(){ - return Role::all(); + return Role::with('position')->get(); } public function map($row): array{ return [ $row->id, $row->name, + $row->position ? $row->position->name : '-', + $row->position ? $row->position->level : '-', $row->created_at ]; } @@ -25,6 +27,8 @@ class RolesExport implements WithColumnFormatting, WithHeadings, FromCollection, return [ 'ID', 'Role', + 'Position', + 'Tingkat Jabatan', 'Created At' ]; } @@ -32,7 +36,8 @@ class RolesExport implements WithColumnFormatting, WithHeadings, FromCollection, public function columnFormats(): array{ return [ 'A' => \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER, - 'C' => \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_DATETIME + 'D' => \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER, + 'E' => \PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_DATETIME ]; } } diff --git a/app/Http/Controllers/RolesController.php b/app/Http/Controllers/RolesController.php index c7964b5..c38c1cf 100644 --- a/app/Http/Controllers/RolesController.php +++ b/app/Http/Controllers/RolesController.php @@ -286,7 +286,11 @@ 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) . '%']); + $q->whereRaw('LOWER(name) LIKE ?', ['%' . strtolower($search) . '%']) + ->orWhereHas('position', function($query) use ($search) { + $query->whereRaw('LOWER(name) LIKE ?', ['%' . strtolower($search) . '%']) + ->orWhereRaw('CAST(level AS TEXT) LIKE ?', ['%' . $search . '%']); + }); }); } @@ -294,11 +298,26 @@ if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { $order = $request->get('sortOrder'); $column = $request->get('sortField'); - $query->orderBy($column, $order); + + // Handle sorting for position-related columns + if ($column === 'position_name') { + $query->leftJoin('positions', 'roles.position_id', '=', 'positions.id') + ->orderBy('positions.name', $order) + ->select('roles.*'); // Select only from roles table to avoid column conflicts + } else if ($column === 'level') { + $query->leftJoin('positions', 'roles.position_id', '=', 'positions.id') + ->orderBy('positions.level', $order) + ->select('roles.*'); // Select only from roles table to avoid column conflicts + } else { + $query->orderBy($column, $order); + } } - // Get the total count of records - $totalRecords = $query->count(); + // Create a copy of the query for counting + $countQuery = clone $query; + + // Get the total count of records (without joins to avoid duplicates) + $totalRecords = Role::count(); // Apply pagination if provided if ($request->has('page') && $request->has('size')) { @@ -309,11 +328,11 @@ $query->skip($offset)->take($size); } - // Get the filtered count of records - $filteredRecords = $query->count(); + // Get the filtered count of records - use distinct to avoid duplicates from joins + $filteredRecords = $countQuery->distinct()->count('roles.id'); // Get the data for the current page - $roles = $query->get(); + $roles = $query->with('position')->get(); // Calculate the page count $pageCount = ceil($totalRecords/$request->get('size')); diff --git a/resources/views/roles/create.blade.php b/resources/views/roles/create.blade.php index d1489de..07dd68c 100644 --- a/resources/views/roles/create.blade.php +++ b/resources/views/roles/create.blade.php @@ -38,11 +38,11 @@ Position
- @foreach($positions as $position) @endforeach diff --git a/resources/views/roles/index.blade.php b/resources/views/roles/index.blade.php index 7a3fb09..e7a0562 100644 --- a/resources/views/roles/index.blade.php +++ b/resources/views/roles/index.blade.php @@ -19,29 +19,7 @@
-
- - - +
Export to Excel Add Role @@ -60,6 +38,14 @@ Role + + Position + + + + Tingkat Jabatan + + Action @@ -138,6 +124,20 @@ name: { title: 'Role', }, + position_name: { + title: 'Position', + render: (item, data) => { + return data.position ? data.position.name : '-'; + }, + sortable: true, + }, + level: { + title: 'Level', + render: (item, data) => { + return data.position ? data.position.level : '-'; + }, + sortable: true, + }, actions: { title: 'Status', render: (item, data) => { @@ -162,4 +162,3 @@ }); @endpush -