From de1216c5f5ce0f355af9f091597e3fa35bdc62a5 Mon Sep 17 00:00:00 2001 From: JokoPrasetio Date: Mon, 26 Jan 2026 11:09:39 +0700 Subject: [PATCH] progress --- app/Http/Controllers/AksesFileController.php | 2 + app/Http/Controllers/DashboardController.php | 41 +-- .../Controllers/LogActivityController.php | 7 +- app/Http/Middleware/EnsureMasterAkses.php | 22 ++ .../Middleware/EnsureMasterPersetujuan.php | 22 ++ app/Models/User.php | 10 +- bootstrap/app.php | 5 +- public/assets/css/styles.min.css | 5 +- public/js/akses/action.js | 2 +- public/js/akses/dt.js | 6 +- public/js/akses/functions.js | 8 +- public/js/dashboard/index.js | 11 +- public/js/masterPersetujuan/functions.js | 4 +- resources/views/akses/modal/add.blade.php | 12 +- resources/views/akses/modal/edit.blade.php | 11 +- resources/views/dashboard/index.blade.php | 2 +- .../views/layout/partials/sidenav.blade.php | 318 ++++++++++-------- routes/web.php | 31 +- 18 files changed, 318 insertions(+), 201 deletions(-) create mode 100644 app/Http/Middleware/EnsureMasterAkses.php create mode 100644 app/Http/Middleware/EnsureMasterPersetujuan.php diff --git a/app/Http/Controllers/AksesFileController.php b/app/Http/Controllers/AksesFileController.php index 5f3dcd1..444fa7f 100644 --- a/app/Http/Controllers/AksesFileController.php +++ b/app/Http/Controllers/AksesFileController.php @@ -47,6 +47,7 @@ class AksesFileController extends Controller 'pegawai_nama_entry' => auth()->user()?->dataUser?->namalengkap, 'entry_at' => Carbon::now()->format('Y-m-d H:i:s.u'), 'all_akses' => $data['akses'] === "all" ? true : false, + 'master_akses' => $data['master_akses'] === "yes" ? true : false, ]; $af = AksesFile::create($payload); if($data['akses'] === "unit"){ @@ -160,6 +161,7 @@ class AksesFileController extends Controller 'pegawai_nama_modified' => auth()->user()?->dataUser?->namalengkap, 'modified_at' => Carbon::now()->format('Y-m-d H:i:s.u'), 'all_akses' => request('akses') === "all" ? true : false, + 'master_akses' => request('master_akses') === "yes" ? true : false, ]; $data->update($payload); diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 3635379..5655544 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -70,7 +70,6 @@ class DashboardController extends Controller $subArray = $subUnit ? explode(',', $subUnit) : []; $katArray = $kategori ? explode(',', $kategori) : []; $katDok = MasterKategori::when($katArray, fn($q) => $q->whereIn('master_kategori_directory_id', $katArray))->where('statusenabled', true)->select('master_kategori_directory_id', 'nama_kategori_directory')->get(); - if ($katArray && $filterUnit && $subArray) { /* mode pencarian lengkap */ if ($allowedUnitIds && !$allowedUnitIds->contains((int) $filterUnit)) { @@ -80,13 +79,12 @@ class DashboardController extends Controller ->where('id', $filterUnit) ->with(['subUnitKerja' => fn($q) => $q->whereIn('id', $subArray) ->with(['fileDirectory' => fn($q) => $q - ->where('id_unit_kerja', $filterUnit) + ->where('id_unit_kerja', $filterUnit)->whereNotNull('status_action') ->when($subArray, fn($q) => $q->whereIn('id_sub_unit_kerja', $subArray)) ->when($katArray, fn($q) => $q->whereIn('master_kategori_directory_id', $katArray)) ->when($keyword, fn($q) => $q->where(function($query) use ($keyword) { - $query->where('file', 'ilike', "%{$keyword}%") - ->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%"); + $query->where('file', 'ilike', "%{$keyword}%"); }) ) ]) @@ -99,9 +97,8 @@ class DashboardController extends Controller /* all akses */ $unitKerja = UnitKerja::where('statusenabled', true)->with([ // muat relasi 'subUnitKerja' => fn($q) => $q->with([ // sub-unit - 'fileDirectory' => fn($f) => $f->when($keyword, fn($q) => + 'fileDirectory' => fn($f) => $f->whereNotNull('status_action')->when($keyword, fn($q) => $q->where('file', 'ilike', "%{$keyword}%") - ->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%") ) ]) ]) @@ -109,15 +106,13 @@ class DashboardController extends Controller ->get(); } elseif ($allowedUnitIds) { - /* akses per unit (single/multiple) */ $unitKerja = UnitKerja::where('statusenabled', true) ->whereIn('id', $allowedUnitIds) - ->with([ // muat relasi - 'subUnitKerja' => fn($q) => $q->with([ // sub-unit - 'fileDirectory' => fn($f) => $f->when($keyword, fn($q) => + ->with([ + 'subUnitKerja' => fn($q) => $q->with([ + 'fileDirectory' => fn($f) => $f->whereNotNull('status_action')->when($keyword, fn($q) => $q->where(function($query) use ($keyword) { - $query->where('file', 'ilike', "%{$keyword}%") - ->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%"); + $query->where('file', 'ilike', "%{$keyword}%"); }) ) ]) @@ -126,7 +121,6 @@ class DashboardController extends Controller ->get(); } else { - /* default : unit & sub milik sendiri */ $authUnit = $user?->mappingUnitKerjaPegawai[0]?->objectunitkerjapegawaifk; $authSub = $user?->mappingUnitKerjaPegawai[0]?->objectsubunitkerjapegawaifk; @@ -135,10 +129,9 @@ class DashboardController extends Controller ->with([ // 1. sub-unit milik user 'subUnitKerja' => fn($q) => $q->where('id', $authSub) ->with([ // 2. file-directory + filter keyword - 'fileDirectory' => fn($f) => $f->when($keyword, fn($q) => + 'fileDirectory' => fn($f) => $f->whereNotNull('status_action')->when($keyword, fn($q) => $q->where(function($query) use ($keyword) { - $query->where('file', 'ilike', "%{$keyword}%") - ->orWhere('pegawai_nama_entry', 'ilike', "%{$keyword}%"); + $query->where('file', 'ilike', "%{$keyword}%"); }) ) ]) @@ -403,7 +396,7 @@ class DashboardController extends Controller $akses = AksesFile::where(['pegawai_id' => $user->id, 'statusenabled' => true])->first(); $keyword = request('keyword'); - $query = FileDirectory::where('statusenabled', true) + $query = FileDirectory::where('statusenabled', true)->whereNotNull('status_action') ->when($keyword, function ($q) use ($keyword) { $q->where(function ($sub) use ($keyword) { $sub->where('file', 'ILIKE', "%{$keyword}%") @@ -674,8 +667,8 @@ class DashboardController extends Controller $perPage = (int) request('per_page', 10); $page = max(1, (int) request('page', 1)); $keyword = strtolower(request('keyword', '')); - - $rows = FileDirectory::where('statusenabled', true)->pluck('file'); + $authUnit = auth()->user()->masterPersetujuan->details->pluck('unit_pegawai_id')->unique()->toArray(); + $rows = FileDirectory::where('statusenabled', true)->whereNotNull('status_action')->whereIn('id_unit_kerja', $authUnit)->pluck('file'); $grouped = []; foreach ($rows as $path) { @@ -754,8 +747,9 @@ class DashboardController extends Controller $keyword = request('keyword'); $start = request('start_date'); $end = request('end_date'); + $authUnit = auth()->user()->masterPersetujuan->details->pluck('unit_pegawai_id')->unique()->toArray(); - $query = FileDirectory::where('statusenabled', true)->whereNull('status_action')->orderBy('entry_at','desc'); + $query = FileDirectory::where('statusenabled', true)->whereNull('status_action')->whereIn('id_unit_kerja', $authUnit)->orderBy('entry_at','desc'); if($keyword){ $query->where(function($q) use ($keyword){ $q->where('file', 'ILIKE', "%{$keyword}%") @@ -886,9 +880,10 @@ class DashboardController extends Controller public function countDataPending(){ try { - $count = FileDirectory::where('statusenabled', true) - ->whereNull('status_action') - ->count(); + $query = FileDirectory::where('statusenabled', true) + ->whereNull('status_action'); + $authUnit = auth()->user()->masterPersetujuan->details->pluck('unit_pegawai_id')->unique()->toArray(); + $count= $query->whereIn('id_unit_kerja', $authUnit)->count(); return response()->json([ 'status' => true, 'count' => $count, diff --git a/app/Http/Controllers/LogActivityController.php b/app/Http/Controllers/LogActivityController.php index a969c0a..fe3703f 100644 --- a/app/Http/Controllers/LogActivityController.php +++ b/app/Http/Controllers/LogActivityController.php @@ -22,7 +22,12 @@ class LogActivityController extends Controller $query = LogActivity::query() ->orderBy('entry_at','desc'); - + if(auth()->user()->masterPersetujuan){ + $authUnit = auth()->user()->masterPersetujuan->details->pluck('unit_pegawai_id')->unique()->toArray(); + $query = $query->whereIn('id_unit_kerja', $authUnit); + }else{ + $query = $query->where('pegawai_id_entry', auth()->user()->objectpegawaifk); + } if($keyword){ $query->where(function($q) use ($keyword){ $q->where('pegawai_nama_entry', 'ILIKE', "%{$keyword}%") diff --git a/app/Http/Middleware/EnsureMasterAkses.php b/app/Http/Middleware/EnsureMasterAkses.php new file mode 100644 index 0000000..809c0d9 --- /dev/null +++ b/app/Http/Middleware/EnsureMasterAkses.php @@ -0,0 +1,22 @@ +user(); + $hasAccess = $user && $user->akses && $user->akses->master_akses; + + if (!$hasAccess) { + abort(403, 'Tidak memiliki akses.'); + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/EnsureMasterPersetujuan.php b/app/Http/Middleware/EnsureMasterPersetujuan.php new file mode 100644 index 0000000..0bc99f1 --- /dev/null +++ b/app/Http/Middleware/EnsureMasterPersetujuan.php @@ -0,0 +1,22 @@ +user(); + $hasAccess = $user && $user->masterPersetujuan; + + if (!$hasAccess) { + abort(403, 'Tidak memiliki akses.'); + } + + return $next($request); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 61d6e40..9a0e454 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -45,8 +45,16 @@ class User extends Authenticatable 'katasandi' => 'hashed', ]; } - protected $with = ['dataUser']; + protected $with = ['dataUser', 'masterPersetujuan', 'akses']; public function dataUser(){ return $this->belongsTo(DataUser::class, 'objectpegawaifk', 'id')->select('id', 'namalengkap'); } + + public function masterPersetujuan(){ + return $this->belongsTo(masterPersetujuan::class, 'objectpegawaifk', 'pegawai_id')->where('statusenabled', true)->with('details'); + } + + public function akses(){ + return $this->belongsTo(AksesFile::class, 'objectpegawaifk', 'pegawai_id')->where('statusenabled', true); + } } diff --git a/bootstrap/app.php b/bootstrap/app.php index c183276..815987d 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -11,7 +11,10 @@ return Application::configure(basePath: dirname(__DIR__)) health: '/up', ) ->withMiddleware(function (Middleware $middleware): void { - // + $middleware->alias([ + 'akses.master' => \App\Http\Middleware\EnsureMasterAkses::class, + 'master.persetujuan' => \App\Http\Middleware\EnsureMasterPersetujuan::class, + ]); }) ->withExceptions(function (Exceptions $exceptions): void { // diff --git a/public/assets/css/styles.min.css b/public/assets/css/styles.min.css index c0a9b81..da87999 100644 --- a/public/assets/css/styles.min.css +++ b/public/assets/css/styles.min.css @@ -15647,7 +15647,7 @@ textarea.form-control-lg { .left-sidebar .scroll-sidebar { overflow-y: auto; padding: 0 24px; - height: calc(100vh - 310px); + height: calc(100vh - 120px); border-radius: 7px; } .left-sidebar .scroll-sidebar .simplebar-track.simplebar-horizontal { @@ -15818,11 +15818,10 @@ textarea.form-control-lg { width: 100%; background: var(--bs-body-bg); padding: 0 10px; - /* top: 65px; */ } @media (max-width: 991.98px) { .app-header { - top: 131px; + top: 0px; } } .app-header .container-fluid, .app-header .container-sm, .app-header .container-md, .app-header .container-lg, .app-header .container-xl, .app-header .container-xxl { diff --git a/public/js/akses/action.js b/public/js/akses/action.js index 9c674a3..3d44956 100644 --- a/public/js/akses/action.js +++ b/public/js/akses/action.js @@ -105,7 +105,7 @@ function editAkses(e){ formEditAkses.attr('action', `/akses/${data.akses_file_id}`) $("#unit_akses_edit").empty().trigger('change'); $("#unit_akses_wrapper_edit").addClass('d-none'); - + $("#master_akses_edit").prop("checked", data.master_akses == 1) selectOptionPegawaiEdit() selectOptionUnitKerjaEdit() if (data.pegawai_id) { diff --git a/public/js/akses/dt.js b/public/js/akses/dt.js index 5dc8206..e7ca9a0 100644 --- a/public/js/akses/dt.js +++ b/public/js/akses/dt.js @@ -18,6 +18,8 @@ { title:"Action", formatter: function(value, row){ + console.log(row); + let buttons = ''; buttons += ` ` return ` diff --git a/public/js/akses/functions.js b/public/js/akses/functions.js index 7471874..66a01e9 100644 --- a/public/js/akses/functions.js +++ b/public/js/akses/functions.js @@ -107,8 +107,14 @@ function addForm(){ By Unit Akses +
+ + +
- Pilih salah satu.
diff --git a/public/js/dashboard/index.js b/public/js/dashboard/index.js index ccb9305..50ade92 100644 --- a/public/js/dashboard/index.js +++ b/public/js/dashboard/index.js @@ -143,14 +143,16 @@ function searchData(){ return } - index(kategori_dok, unitKerja, subUnitKerja, [], keyword); + index(kategori_dok, unitKerja, subUnitKerja, keyword); } let debounceTimer; -function debounceSearch(input) { +function debounceSearch(value) { + console.log(value); + clearTimeout(debounceTimer); debounceTimer = setTimeout(() => { - searchFile(input.value.trim()); + searchFile(value.trim()); }, 300); } @@ -159,7 +161,8 @@ function searchFile(keyword){ let kategori_dok = $("#kategori_dok").val() let unitKerja = $("#unit_kerja").val() let subUnitKerja = $("#sub_unit_kerja").val() - index(kategori_dok, unitKerja, subUnitKerja, [], keyword); + + index(kategori_dok, unitKerja, subUnitKerja, keyword); } diff --git a/public/js/masterPersetujuan/functions.js b/public/js/masterPersetujuan/functions.js index b6143c2..e3121c7 100644 --- a/public/js/masterPersetujuan/functions.js +++ b/public/js/masterPersetujuan/functions.js @@ -77,13 +77,13 @@ function addForm(){ Cari nama pegawai.
-
+
Bisa pilih lebih dari satu.
-
+
diff --git a/resources/views/akses/modal/add.blade.php b/resources/views/akses/modal/add.blade.php index a6dfff7..9fbf19f 100644 --- a/resources/views/akses/modal/add.blade.php +++ b/resources/views/akses/modal/add.blade.php @@ -24,7 +24,7 @@
-
+
-
- Pilih salah satu. +
+ + +
+
diff --git a/resources/views/akses/modal/edit.blade.php b/resources/views/akses/modal/edit.blade.php index e55c927..74735da 100644 --- a/resources/views/akses/modal/edit.blade.php +++ b/resources/views/akses/modal/edit.blade.php @@ -24,7 +24,7 @@
-
+
+
+ + +
- Pilih salah satu. +
diff --git a/resources/views/dashboard/index.blade.php b/resources/views/dashboard/index.blade.php index 2eb9f2a..2e2614c 100644 --- a/resources/views/dashboard/index.blade.php +++ b/resources/views/dashboard/index.blade.php @@ -122,7 +122,7 @@
- +
Umum diff --git a/resources/views/layout/partials/sidenav.blade.php b/resources/views/layout/partials/sidenav.blade.php index d1e7e42..4e850fe 100644 --- a/resources/views/layout/partials/sidenav.blade.php +++ b/resources/views/layout/partials/sidenav.blade.php @@ -1,147 +1,177 @@ - +
+ + {{-- Sidebar nav --}} + @php + $openMaster = request()->is('akses*') || request()->is('master-kategori*') || request()->is('master-persetujuan*'); + @endphp + + +
+ + +{{-- Styling kecil biar submenu rapi + arrow muter --}} + + + + diff --git a/routes/web.php b/routes/web.php index 94fd3ef..9e69974 100644 --- a/routes/web.php +++ b/routes/web.php @@ -19,14 +19,18 @@ Route::middleware(['auth'])->group(function(){ Route::post('/upload', [DashboardController::class, 'store']); Route::get('/data-unit-kerja', [DashboardController::class, 'dataUnitKerja']); - Route::resource('/master-kategori', MasterKategoriController::class); - Route::get('datatable/master-kategori', [MasterKategoriController::class, 'datatable']); - Route::resource('/master-klasifikasi', MasterKlasifikasiController::class); - Route::get('datatable/master-klasifikasi', [MasterKlasifikasiController::class, 'datatable']); - Route::resource('/akses', AksesFileController::class); - Route::get('datatable/akses', [AksesFileController::class, 'datatable']); Route::get('/select-pegawai', [AksesFileController::class, 'optionPegawai']); Route::get('/select-unit-kerja-option', [AksesFileController::class, 'optionUnitKerja']); + Route::middleware(['akses.master'])->group(function () { + Route::resource('/akses', AksesFileController::class); + Route::get('datatable/akses', [AksesFileController::class, 'datatable']); + Route::resource('/master-persetujuan', masterPersetujuanController::class)->only(['index','store','show','update','destroy']); + Route::get('datatable/master-persetujuan', [masterPersetujuanController::class, 'datatable']); + Route::resource('/master-kategori', MasterKategoriController::class); + Route::get('datatable/master-kategori', [MasterKategoriController::class, 'datatable']); + Route::resource('/master-klasifikasi', MasterKlasifikasiController::class); + Route::get('datatable/master-klasifikasi', [MasterKlasifikasiController::class, 'datatable']); + }); Route::get('/select-unit-kerja', [DashboardController::class, 'OptionUnitKerja']); Route::get('/select-sub-unit-kerja/{id}', [DashboardController::class, 'optionSubUnitKerja']); @@ -42,14 +46,15 @@ Route::middleware(['auth'])->group(function(){ Route::get('/recap', [DashboardController::class, 'recapView']); Route::get('/data/recap', [DashboardController::class, 'recapData']); - Route::get('/pending-file', [DashboardController::class, 'pendingFile']); - Route::get('/datatable/pending-file', [DashboardController::class, 'dataPendingFile']); - Route::post('/pending-file/{id}/approve', [DashboardController::class, 'approvePendingFile']); - Route::post('/pending-file/{id}/reject', [DashboardController::class, 'rejectPendingFile']); - Route::get('/data/count-pending', [DashboardController::class, 'countDataPending']); - Route::resource('/master-persetujuan', masterPersetujuanController::class)->only(['index','store','show','update','destroy']); - Route::get('datatable/master-persetujuan', [masterPersetujuanController::class, 'datatable']); + + Route::middleware(['master.persetujuan'])->group(function () { + Route::get('/pending-file', [DashboardController::class, 'pendingFile']); + Route::get('/datatable/pending-file', [DashboardController::class, 'dataPendingFile']); + Route::post('/pending-file/{id}/approve', [DashboardController::class, 'approvePendingFile']); + Route::post('/pending-file/{id}/reject', [DashboardController::class, 'rejectPendingFile']); + Route::get('/data/count-pending', [DashboardController::class, 'countDataPending']); + }); }); Route::get('/login', [AuthController::class, 'index'])->name('login');