From ba857bea052950d26e3e99cb2ae749ee9bd73b59 Mon Sep 17 00:00:00 2001 From: Jokoprasetio Date: Fri, 6 Mar 2026 03:58:39 +0700 Subject: [PATCH] progress --- app/Http/Controllers/DashboardController.php | 133 ++++++++++++++++-- resources/views/dataUmum/index.blade.php | 48 +++++-- resources/views/dataUnit/index.blade.php | 52 +++++-- .../views/layout/partials/sidenav.blade.php | 3 +- 4 files changed, 196 insertions(+), 40 deletions(-) diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index a8e2b9b..ed1fc64 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -155,21 +155,65 @@ class DashboardController extends Controller ->all(); $keyword = request('keyword'); $kategori = request('kategori'); + $kategoriHeader = request('kategori_header'); + $unitFilter = request('unit'); - $kategoriIds = is_array($kategori) + $kategoriValues = is_array($kategori) ? array_values(array_filter($kategori)) : array_values(array_filter(explode(',', (string) $kategori))); + $kategoriHeaderValues = is_array($kategoriHeader) + ? array_values(array_filter($kategoriHeader)) + : array_values(array_filter(explode(',', (string) $kategoriHeader))); + $allKategoriValues = array_values(array_filter(array_merge($kategoriValues, $kategoriHeaderValues))); + $kategoriTypes = []; + $kategoriIds = []; + foreach ($allKategoriValues as $val) { + $lower = strtolower(trim((string) $val)); + if (in_array($lower, ['akreditasi', 'akre'], true)) { + $kategoriTypes[] = 'akreditasi'; + continue; + } + if ($lower === 'hukum') { + $kategoriTypes[] = 'hukum'; + continue; + } + if ($lower === 'lainnya') { + $kategoriTypes[] = 'lainnya'; + continue; + } + $kategoriIds[] = $val; + } $unitFilterIds = is_array($unitFilter) ? array_values(array_filter($unitFilter)) : array_values(array_filter(explode(',', (string) $unitFilter))); if (!empty($unitFilterIds)) { $unitIds = array_values(array_intersect($unitIds, $unitFilterIds)); } - $query = FileDirectory::with('kategori')->where('statusenabled', true) + $baseQuery = FileDirectory::with('kategori') + ->where('statusenabled', true) ->where('status_action', 'approved') - ->whereIn('id_unit_kerja', $unitIds) - ->when(!empty($kategoriIds), function ($q) use ($kategoriIds) { - $q->whereIn('master_kategori_directory_id', $kategoriIds); + ->whereIn('id_unit_kerja', $unitIds); + + $query = (clone $baseQuery) + ->when(!empty($kategoriIds) || !empty($kategoriTypes), function ($q) use ($kategoriIds, $kategoriTypes) { + $q->where(function ($sub) use ($kategoriIds, $kategoriTypes) { + $hasClause = false; + if (!empty($kategoriIds)) { + $sub->whereIn('master_kategori_directory_id', $kategoriIds); + $hasClause = true; + } + if (in_array('akreditasi', $kategoriTypes, true)) { + $sub->where('is_akre', true); + $hasClause = true; + } + if (in_array('hukum', $kategoriTypes, true)) { + $hasClause ? $sub->orWhereNotNull('kategori_hukum') : $sub->whereNotNull('kategori_hukum'); + $hasClause = true; + } + if (in_array('lainnya', $kategoriTypes, true)) { + $hasClause ? $sub->orWhereNotNull('master_kategori_directory_id') : $sub->whereNotNull('master_kategori_directory_id'); + } + }); }) ->when($keyword, function ($q) use ($keyword) { $q->where(function ($sub) use ($keyword) { @@ -185,10 +229,23 @@ class DashboardController extends Controller $item->nama_kategori = $item->kategori->nama_kategori_directory ?? $item->kategori_hukum ?? null; return $item; }); + $kategoriList = (clone $baseQuery)->get()->map(function($item){ + if ($item->is_akre) { + return ['id' => 'akreditasi', 'label' => 'Kategori Akreditasi']; + } + if (!empty($item->kategori_hukum)) { + return ['id' => 'hukum', 'label' => 'Kategori Hukum']; + } + $label = $item->kategori->nama_kategori_directory ?? $item->nama_kategori_directory ?? 'Kategori'; + $id = $item->master_kategori_directory_id ?? $label; + return ['id' => (string) $id, 'label' => $label]; + })->unique('id')->values(); + $payload = [ 'status' => true, 'message' => 'Berhasil mendapatkan data', 'data' => $items, + 'kategori_list' => $kategoriList, 'pagination' => [ 'current_page' => $data->currentPage(), 'next_page' => $data->hasMorePages() ? $data->currentPage() + 1 : null, @@ -928,18 +985,61 @@ class DashboardController extends Controller $keyword = request('keyword'); $unitId = request('unit'); $kategori = request('kategori'); + $kategoriHeader = request('kategori_header'); $unitIds = is_array($unitId) ? array_values(array_filter($unitId)) : array_values(array_filter(explode(',', (string) $unitId))); - $kategoriIds = is_array($kategori) + $kategoriValues = is_array($kategori) ? array_values(array_filter($kategori)) : array_values(array_filter(explode(',', (string) $kategori))); - $query = FileDirectory::with('kategori')->where('statusenabled', true)->where('status_action', 'approved') + $kategoriHeaderValues = is_array($kategoriHeader) + ? array_values(array_filter($kategoriHeader)) + : array_values(array_filter(explode(',', (string) $kategoriHeader))); + $allKategoriValues = array_values(array_filter(array_merge($kategoriValues, $kategoriHeaderValues))); + $kategoriTypes = []; + $kategoriIds = []; + foreach ($allKategoriValues as $val) { + $lower = strtolower(trim((string) $val)); + if (in_array($lower, ['akreditasi', 'akre'], true)) { + $kategoriTypes[] = 'akreditasi'; + continue; + } + if ($lower === 'hukum') { + $kategoriTypes[] = 'hukum'; + continue; + } + if ($lower === 'lainnya') { + $kategoriTypes[] = 'lainnya'; + continue; + } + $kategoriIds[] = $val; + } + $baseQuery = FileDirectory::with('kategori') + ->where('statusenabled', true)->where('status_action', 'approved') ->when(!empty($unitIds), function ($q) use ($unitIds) { $q->whereIn('id_unit_kerja', $unitIds); - }) - ->when(!empty($kategoriIds), function ($q) use ($kategoriIds) { - $q->whereIn('master_kategori_directory_id', $kategoriIds); + }); + + $query = (clone $baseQuery) + ->when(!empty($kategoriIds) || !empty($kategoriTypes), function ($q) use ($kategoriIds, $kategoriTypes) { + $q->where(function ($sub) use ($kategoriIds, $kategoriTypes) { + $hasClause = false; + if (!empty($kategoriIds)) { + $sub->whereIn('master_kategori_directory_id', $kategoriIds); + $hasClause = true; + } + if (in_array('akreditasi', $kategoriTypes, true)) { + $hasClause ? $sub->orWhere('is_akre', true) : $sub->where('is_akre', true); + $hasClause = true; + } + if (in_array('hukum', $kategoriTypes, true)) { + $hasClause ? $sub->orWhereNotNull('kategori_hukum') : $sub->whereNotNull('kategori_hukum'); + $hasClause = true; + } + if (in_array('lainnya', $kategoriTypes, true)) { + $hasClause ? $sub->orWhereNotNull('master_kategori_directory_id') : $sub->whereNotNull('master_kategori_directory_id'); + } + }); }) ->when($keyword, function ($q) use ($keyword) { $q->where(function ($sub) use ($keyword) { @@ -962,10 +1062,23 @@ class DashboardController extends Controller return $item; }); + $kategoriList = (clone $baseQuery)->get()->map(function($item){ + if ($item->is_akre) { + return ['id' => 'akreditasi', 'label' => 'Kategori Akreditasi']; + } + if (!empty($item->kategori_hukum)) { + return ['id' => 'hukum', 'label' => 'Kategori Hukum']; + } + $label = $item->kategori->nama_kategori_directory ?? $item->nama_kategori_directory ?? 'Kategori'; + $id = $item->master_kategori_directory_id ?? $label; + return ['id' => (string) $id, 'label' => $label]; + })->unique('id')->values(); + $payload = [ 'status' => true, 'message' => 'Berhasil mendapatkan data', 'data' => $items, + 'kategori_list' => $kategoriList, 'pagination' => [ 'current_page' => $data->currentPage(), 'next_page' => $data->hasMorePages() ? $data->currentPage() + 1 : null, diff --git a/resources/views/dataUmum/index.blade.php b/resources/views/dataUmum/index.blade.php index 35fd4eb..7ba2d87 100644 --- a/resources/views/dataUmum/index.blade.php +++ b/resources/views/dataUmum/index.blade.php @@ -141,11 +141,11 @@
Kategori -
+
Tampilkan @@ -198,7 +198,8 @@ const authPegawai = @json(auth()->user()->objectpegawaifk); const formCreate = $("#formFile") const modalCreate = document.getElementById('modalCreateFile') - const tableState = { data: [], page: 1, pageSize: 8, search: '', unit: [], kategori: [], kategoriType: [], lastPage: 1, total: 0 }; + const tableState = { data: [], page: 1, pageSize: 8, search: '', unit: [], kategori: [], kategoriType: [], kategoriHeader: [], lastPage: 1, total: 0 }; + let kategoriOptionCache = []; const tbody = document.getElementById('tableDataUmum'); const paginationEl = document.getElementById('paginationControls'); const summaryEl = document.getElementById('tableSummary'); @@ -294,7 +295,7 @@ if (!checkbox) return; const selected = Array.from(kategoriHeaderMenu.querySelectorAll('input[type="checkbox"]:checked')) .map(el => el.value); - tableState.kategoriType = selected; + tableState.kategoriHeader = selected; if (kategoriSelect && window.$ && $.fn.select2) { const single = selected.length === 1 ? selected[0] : ''; $('#tableKategori').val(single).trigger('change'); @@ -396,10 +397,14 @@ const kategoriFlag = resolveKategoriFlag(item); const rowColor = pickColor(kategoriFlag.key, kategoriFlag.label); - const rowClass = expiryStatus === 'expired' ? 'table-danger' : (expiryStatus === 'soon' ? 'table-warning' : 'row-shade'); + const isAkre = kategoriFlag.key === 'akre'; + const rowClass = isAkre ? 'table-info' : (expiryStatus === 'expired' ? 'table-danger' : (expiryStatus === 'soon' ? 'table-warning' : 'row-shade')); const expiryBadge = expiryStatus === 'expired' ? `Expired` : (expiryStatus === 'soon' ? `Akan Expired` : ''); + const akreBadge = isAkre + ? `Akreditasi` + : ''; return ` @@ -460,7 +465,7 @@ word-break:break-word; " > - ${item.nama_dokumen || '-'} + ${item.nama_dokumen || '-'} ${akreBadge} ${expiryBadge} @@ -582,22 +587,33 @@ return Array.from(seen.values()).sort((a,b) => a.label.localeCompare(b.label)); } + function isKategoriMatch(item, types){ + if (!types.length) return true; + const lowerTypes = types.map(t => String(t).toLowerCase()); + const isAkre = (item.is_akre === true) || String(item.is_akre).toLowerCase() === 'true' || Number(item.is_akre) === 1; + const isHukum = !!item.kategori_hukum; + const hasKategoriId = !!item.master_kategori_directory_id; + if (isAkre && lowerTypes.includes('akreditasi')) return true; + if (isHukum && lowerTypes.includes('hukum')) return true; + if (!isAkre && !isHukum && hasKategoriId && lowerTypes.includes('lainnya')) return true; + + const catId = String(getKategoriId(item)).toLowerCase(); + const catLabel = String(getKategoriLabel(item)).toLowerCase(); + return lowerTypes.includes(catId) || lowerTypes.includes(catLabel); + } + function filterByKategoriType(items){ const types = (tableState.kategoriType || []).map(v => String(v)); if (!types.length) return items; - return items.filter(item => { - const catId = getKategoriId(item); - const catLabel = getKategoriLabel(item); - return types.includes(catId) || types.includes(catLabel); - }); + return items.filter(item => isKategoriMatch(item, types)); } function renderKategoriHeaderOptions(){ if (!kategoriHeaderMenu) return; const list = kategoriHeaderMenu.querySelector('.kategori-header-list'); if (!list) return; - const options = getKategoriOptionsFromData(); - const selected = (tableState.kategoriType || []).map(v => String(v)); + const options = kategoriOptionCache.length ? kategoriOptionCache : getKategoriOptionsFromData(); + const selected = (tableState.kategoriHeader || []).map(v => String(v)); if(options.length === 0){ list.innerHTML = '
Tidak ada kategori
'; return; @@ -627,10 +643,14 @@ if (tableState.kategoriType && tableState.kategoriType.length > 0) { tableState.kategoriType.forEach(id => params.append('kategori[]', id)); } + if (tableState.kategoriHeader && tableState.kategoriHeader.length > 0) { + tableState.kategoriHeader.forEach(id => params.append('kategori_header[]', id)); + } fetch(`/datatable-umum?${params.toString()}`) .then(response => response.json()) .then(data => { tableState.data = data?.data || []; + kategoriOptionCache = data?.kategori_list || kategoriOptionCache; tableState.lastPage = data?.pagination?.last_page || 1; tableState.total = data?.pagination?.total || 0; renderKategoriHeaderOptions(); diff --git a/resources/views/dataUnit/index.blade.php b/resources/views/dataUnit/index.blade.php index bf7c8ee..4db6f14 100644 --- a/resources/views/dataUnit/index.blade.php +++ b/resources/views/dataUnit/index.blade.php @@ -135,11 +135,11 @@
Kategori -
+
Tampilkan @@ -199,7 +199,8 @@ const authPegawai = @json(auth()->user()->objectpegawaifk); const formCreate = $("#formFile"); const modalCreate = document.getElementById('modalCreateFile'); - const tableState = { data: [], page: 1, pageSize: 8, search: '', unit: [], kategori: [], kategoriType: [], lastPage: 1, total: 0 }; + const tableState = { data: [], page: 1, pageSize: 8, search: '', unit: [], kategori: [], kategoriType: [], kategoriHeader: [], lastPage: 1, total: 0 }; + let kategoriOptionCache = []; const tbody = document.getElementById('tableDataUnit'); const paginationEl = document.getElementById('paginationControls'); const summaryEl = document.getElementById('tableSummary'); @@ -291,7 +292,7 @@ if (!checkbox) return; const selected = Array.from(kategoriHeaderMenu.querySelectorAll('input[type="checkbox"]:checked')) .map(el => el.value); - tableState.kategoriType = selected; + tableState.kategoriHeader = selected; if (kategoriSelect && window.$ && $.fn.select2) { const single = selected.length === 1 ? selected[0] : ''; $('#tableKategori').val(single).trigger('change'); @@ -525,10 +526,14 @@ const checked = selectedIds.has(String(item.file_directory_id)) ? 'checked' : ''; const kategoriFlag = resolveKategoriFlag(item); const rowColor = pickColor(kategoriFlag.key, kategoriFlag.label); - const rowClass = expiryStatus === 'expired' ? 'table-danger' : (expiryStatus === 'soon' ? 'table-warning' : 'row-shade'); + const isAkre = kategoriFlag.key === 'akre'; + const rowClass = isAkre ? 'table-info' : (expiryStatus === 'expired' ? 'table-danger' : (expiryStatus === 'soon' ? 'table-warning' : 'row-shade')); const expiryBadge = expiryStatus === 'expired' ? `Expired` : (expiryStatus === 'soon' ? `Akan Expired` : ''); + const akreBadge = isAkre + ? `Akreditasi` + : ''; return ` @@ -579,7 +584,7 @@ > ${item.nama_dokumen || '-'} - ${expiryBadge} + ${akreBadge}${expiryBadge}
@@ -697,22 +702,35 @@ return Array.from(seen.values()).sort((a,b) => a.label.localeCompare(b.label)); } + function isKategoriMatch(item, types){ + if (!types.length) return true; + const lowerTypes = types.map(t => String(t).toLowerCase()); + const isAkre = (item.is_akre === true) || String(item.is_akre).toLowerCase() === 'true' || Number(item.is_akre) === 1; + const isHukum = !!item.kategori_hukum; + const hasKategoriId = !!item.master_kategori_directory_id; + // special buckets + if (isAkre && lowerTypes.includes('akreditasi')) return true; + if (isHukum && lowerTypes.includes('hukum')) return true; + if (!isAkre && !isHukum && hasKategoriId && lowerTypes.includes('lainnya')) return true; + + // fallback to id/label comparison + const catId = String(getKategoriId(item)).toLowerCase(); + const catLabel = String(getKategoriLabel(item)).toLowerCase(); + return lowerTypes.includes(catId) || lowerTypes.includes(catLabel); + } + function filterByKategoriType(items){ const types = (tableState.kategoriType || []).map(v => String(v)); if (!types.length) return items; - return items.filter(item => { - const catId = getKategoriId(item); - const catLabel = getKategoriLabel(item); - return types.includes(catId) || types.includes(catLabel); - }); + return items.filter(item => isKategoriMatch(item, types)); } function renderKategoriHeaderOptions(){ if (!kategoriHeaderMenu) return; const list = kategoriHeaderMenu.querySelector('.kategori-header-list'); if (!list) return; - const options = getKategoriOptionsFromData(); - const selected = (tableState.kategoriType || []).map(v => String(v)); + const options = kategoriOptionCache.length ? kategoriOptionCache : getKategoriOptionsFromData(); + const selected = (tableState.kategoriHeader || []).map(v => String(v)); if(options.length === 0){ list.innerHTML = '
Tidak ada kategori
'; return; @@ -739,7 +757,7 @@ const event = new Event('change', { bubbles: true }); checkbox.dispatchEvent(event); }else{ - tableState.kategoriType = [id]; + tableState.kategoriHeader = [id]; if (kategoriSelect && window.$ && $.fn.select2) { $('#tableKategori').val(id).trigger('change'); } @@ -763,10 +781,14 @@ if (tableState.kategoriType && tableState.kategoriType.length > 0) { tableState.kategoriType.forEach(id => params.append('kategori[]', id)); } + if (tableState.kategoriHeader && tableState.kategoriHeader.length > 0) { + tableState.kategoriHeader.forEach(id => params.append('kategori_header[]', id)); + } fetch(`/data-internal?${params.toString()}`) .then(response => response.json()) .then(data => { tableState.data = data?.data || []; + kategoriOptionCache = data?.kategori_list || kategoriOptionCache; tableState.lastPage = data?.pagination?.last_page || 1; tableState.total = data?.pagination?.total || 0; renderKategoriHeaderOptions(); diff --git a/resources/views/layout/partials/sidenav.blade.php b/resources/views/layout/partials/sidenav.blade.php index d7e6375..930a2c3 100644 --- a/resources/views/layout/partials/sidenav.blade.php +++ b/resources/views/layout/partials/sidenav.blade.php @@ -41,13 +41,14 @@ Dokumen Umum + @if(auth()->user()->dataUser->mappingUnitKerjaPegawai()->where('objectunitkerjapegawaifk', 51)->exists()) - + @endif {{-- AKTIVITAS --}}