From 5786369973f020232d9c678a34b7371a3d39f603 Mon Sep 17 00:00:00 2001 From: JokoPrasetio Date: Tue, 5 May 2026 10:12:25 +0700 Subject: [PATCH] fixing download admin --- app/Http/Controllers/AuthController.php | 1 - app/Http/Controllers/DashboardController.php | 56 +- .../views/dataAkreditasi/index.blade.php | 78 ++- .../views/layout/partials/topnav.blade.php | 601 +++++++++++++----- routes/web.php | 2 +- 5 files changed, 568 insertions(+), 170 deletions(-) diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 2f085ac..f4c90db 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -39,7 +39,6 @@ class AuthController extends Controller $request->session()->regenerate(); return redirect()->intended('/'); } - // ===================== // Login Admin // ===================== diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 625af0b..938eb08 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -147,7 +147,7 @@ class DashboardController extends Controller $user = auth()->user(); $isAdmin = auth('admin')->check(); $pegawaiId = $user?->dataUser?->id; - + $unitIds = []; if (!$isAdmin) { if (!$pegawaiId) { @@ -226,7 +226,6 @@ class DashboardController extends Controller ->where('statusenabled', true) ->where('status_action', 'approved'); - if (!$isAdmin) { if (in_array(22, $unitIds, true)) { // akses semua unit } elseif (($user?->username === 'admin.turt')) { @@ -234,7 +233,6 @@ class DashboardController extends Controller } else { $baseQuery = $baseQuery->whereIn('id_unit_kerja', $unitIds); } - } $query = (clone $baseQuery) ->when(!empty($kategoriIds) || !empty($kategoriTypes) || !empty($kategoriHukumValues), function ($q) use ($kategoriIds, $kategoriTypes, $kategoriHukumValues) { @@ -963,22 +961,25 @@ class DashboardController extends Controller } $user = auth()->user()->dataUser; + if($user){ $mapping = MappingUnitKerjaPegawai::where('statusenabled', true) ->where('objectpegawaifk', $user->id)->where('isprimary', true) ->first(); - LogActivity::create([ - 'file_directory_id' => $id, - 'pegawai_id_entry' => $user->id, - 'pegawai_nama_entry' => $user->namalengkap, - 'entry_at' => now(), - 'action_type' => 'Download Dokumen', - 'no_dokumen' => $data->no_dokumen, - 'file' => $data->file, - 'statusenabled' => true, - 'mod_change' => null, - 'id_unit_kerja' => $mapping ? $mapping->objectunitkerjapegawaifk : null, - 'id_sub_unit_kerja' => $mapping ? $mapping->objectsubunitkerjapegawaifk : null, - ]); + LogActivity::create([ + 'file_directory_id' => $id, + 'pegawai_id_entry' => $user->id, + 'pegawai_nama_entry' => $user->namalengkap, + 'entry_at' => now(), + 'action_type' => 'Download Dokumen', + 'no_dokumen' => $data->no_dokumen, + 'file' => $data->file, + 'statusenabled' => true, + 'mod_change' => null, + 'id_unit_kerja' => $mapping ? $mapping->objectunitkerjapegawaifk : null, + 'id_sub_unit_kerja' => $mapping ? $mapping->objectsubunitkerjapegawaifk : null, + ]); + } + $tempDir = storage_path('app/temp'); if (!is_dir($tempDir)) { @@ -2711,7 +2712,20 @@ class DashboardController extends Controller { $keyword = $request->query('keyword'); $perPage = (int) $request->query('per_page', 10); - $query = FileDirectory::where('statusenabled', true) + $perPage = max(1, min(100, $perPage)); + + $query = FileDirectory::query() + ->select([ + 'file_directory_id', + 'nama_dokumen', + 'no_dokumen', + 'file', + 'entry_at', + 'id_unit_kerja', + 'is_akre', + ]) + ->with(['unit:id,name']) + ->where('statusenabled', true) ->where('status_action', 'approved') ->where('is_akre', true); @@ -2723,7 +2737,9 @@ class DashboardController extends Controller ->orWhere('file', 'ILIKE', "%{$keyword}%"); // Cari juga berdasarkan nama file di path }); }); - $data = $query->orderBy('entry_at', 'desc')->paginate($perPage); + $data = $query + ->orderBy('entry_at', 'desc') + ->paginate($perPage); return response()->json([ 'status' => true, @@ -2731,10 +2747,14 @@ class DashboardController extends Controller 'data' => $data->items(), 'pagination' => [ 'current_page' => $data->currentPage(), + 'next_page' => $data->hasMorePages() ? $data->currentPage() + 1 : null, + 'prev_page' => $data->currentPage() > 1 ? $data->currentPage() - 1 : null, 'total' => $data->total(), 'per_page' => $data->perPage(), 'last_page' => $data->lastPage(), 'has_more' => $data->hasMorePages(), + 'from' => $data->firstItem(), + 'to' => $data->lastItem(), ] ]); } diff --git a/resources/views/dataAkreditasi/index.blade.php b/resources/views/dataAkreditasi/index.blade.php index ecda413..e322e78 100644 --- a/resources/views/dataAkreditasi/index.blade.php +++ b/resources/views/dataAkreditasi/index.blade.php @@ -144,6 +144,8 @@ let expandedFolders = new Set(); let searchTimer; const btn = document.getElementById('btnDownloadMultiple'); + const tableState = { page: 1, pageSize: 10, lastPage: 1, total: 0, from: 0, to: 0, search: '' }; + const paginationEl = document.getElementById('paginationControls'); // === INITIALIZATION === document.addEventListener('DOMContentLoaded', () => { fetchData(); @@ -156,6 +158,7 @@ document.getElementById('tableSearch').addEventListener('input', (e) => { clearTimeout(searchTimer); searchTimer = setTimeout(() => { + tableState.page = 1; fetchData(e.target.value, 1); }, 500); }); @@ -163,7 +166,8 @@ // Per Page Change document.getElementById('tablePageSize').addEventListener('change', (e) => { const keyword = document.getElementById('tableSearch').value; - fetchData(keyword,1); + tableState.page = 1; + fetchData(keyword, 1); }); // Check All Rows @@ -185,7 +189,11 @@ */ function fetchData(keyword = '', page = 1) { const tbody = document.getElementById('tableDataAkreditasi'); - const perPage = document.getElementById('tablePageSize').value; + const perPage = parseInt(document.getElementById('tablePageSize').value, 10) || 10; + + tableState.search = keyword; + tableState.pageSize = perPage; + tableState.page = page; tbody.innerHTML = 'Memuat data...'; @@ -195,7 +203,13 @@ if (response.status) { currentData = response.data || []; renderTable(keyword); - updateSummary(response.pagination.total); + const pag = response.pagination || {}; + tableState.total = pag.total || 0; + tableState.lastPage = pag.last_page || 1; + tableState.from = pag.from || 0; + tableState.to = pag.to || 0; + renderPagination(tableState.lastPage); + updateSummary(); } else { tbody.innerHTML = `${response.message}`; } @@ -427,9 +441,63 @@ countLabel.innerText = `${selectedIds.length} dipilih`; } - function updateSummary(total) { + function updateSummary() { const summary = document.getElementById('tableSummary'); - if (summary) summary.innerText = `Total: ${total} data`; + if (!summary) return; + + if (!tableState.total) { + summary.innerText = 'Tidak ada data'; + return; + } + + const from = tableState.from || 0; + const to = tableState.to || 0; + summary.innerText = `Menampilkan ${from} - ${to} dari ${tableState.total} data`; + } + + function renderPagination(totalPages){ + if(!paginationEl) return; + if(totalPages <= 1){ + paginationEl.innerHTML = ''; + return; + } + + const maxButtons = 5; + let start = Math.max(1, tableState.page - Math.floor(maxButtons/2)); + let end = Math.min(totalPages, start + maxButtons - 1); + start = Math.max(1, end - maxButtons + 1); + + let buttons = ''; + buttons += ``; + + for(let i=start; i<=end; i++){ + buttons += ``; + } + + buttons += ``; + + paginationEl.innerHTML = ` +
+
${buttons}
+ Halaman ${tableState.page} dari ${totalPages} +
+ `; + } + + if(paginationEl){ + paginationEl.addEventListener('click', (e) => { + const page = e.target.getAttribute('data-page'); + if(!page) return; + + if(page === 'prev' && tableState.page > 1) tableState.page--; + else if(page === 'next'){ + if(tableState.page < tableState.lastPage) tableState.page++; + }else{ + tableState.page = parseInt(page, 10) || 1; + } + + fetchData(tableState.search || '', tableState.page); + }); } const downloadBtn = document.getElementById('btnDownloadMultiple'); diff --git a/resources/views/layout/partials/topnav.blade.php b/resources/views/layout/partials/topnav.blade.php index 15a40ec..75d6800 100644 --- a/resources/views/layout/partials/topnav.blade.php +++ b/resources/views/layout/partials/topnav.blade.php @@ -177,132 +177,358 @@ - + if (!item) return; + + e.preventDefault(); + + const docId = item.dataset.docId || null; + + openExpiredDetail(docId); + }); + } + + if (expiredApplyFilterBtn) { + expiredApplyFilterBtn.addEventListener('click', function() { + expiredState.docId = null; + expiredState.page = 1; + loadExpiredDetail(); + }); + } + + if (expiredResetFilterBtn) { + expiredResetFilterBtn.addEventListener('click', function() { + expiredState.docId = null; + expiredState.page = 1; + + if (expiredFilterDaysMax) { + expiredFilterDaysMax.value = '30'; + } + + loadExpiredDetail(); + }); + } + + if (expiredDetailPrevBtn) { + expiredDetailPrevBtn.addEventListener('click', function() { + if (expiredState.page <= 1) return; + + expiredState.page -= 1; + loadExpiredDetail(); + }); + } + + if (expiredDetailNextBtn) { + expiredDetailNextBtn.addEventListener('click', function() { + expiredState.page += 1; + loadExpiredDetail(); + }); + } + + /* + |-------------------------------------------------------------------------- + | LOAD PERTAMA + |-------------------------------------------------------------------------- + */ + + loadNotifications(); + loadExpiredNotifications(); + + /* + |-------------------------------------------------------------------------- + | REFRESH OTOMATIS + |-------------------------------------------------------------------------- + */ + + setInterval(function() { + loadNotifications(); + loadExpiredNotifications(); + }, 60000); +}); + diff --git a/routes/web.php b/routes/web.php index 4e3e842..44f37c6 100644 --- a/routes/web.php +++ b/routes/web.php @@ -55,7 +55,7 @@ Route::middleware(['auth:admin,web'])->group(function(){ Route::get('/log-activity', [LogActivityController::class, 'index']); Route::get('/datatable/log-activity', [LogActivityController::class, 'datatable']); Route::get('/datatable/log-activity/{fileDirectoryId}', [LogActivityController::class, 'detailByFile']); - Route::get('/datatable/log-activity-pengajuan', [LogActivityController::class, 'datatableHistoryPengajuan']); + Route::get('/datatable/log-activity-pengajuapn', [LogActivityController::class, 'datatableHistoryPengajuan']); Route::get('/recap', [DashboardController::class, 'recapView']); Route::get('/data/recap', [DashboardController::class, 'recapData']);