diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php index 2f074b0..a8e2b9b 100644 --- a/app/Http/Controllers/DashboardController.php +++ b/app/Http/Controllers/DashboardController.php @@ -165,11 +165,8 @@ class DashboardController extends Controller if (!empty($unitFilterIds)) { $unitIds = array_values(array_intersect($unitIds, $unitFilterIds)); } - $query = FileDirectory::where('statusenabled', true) + $query = FileDirectory::with('kategori')->where('statusenabled', true) ->where('status_action', 'approved') - ->where(function($q){ - $q->where('is_akre', false)->orWhereNull('is_akre'); - }) ->whereIn('id_unit_kerja', $unitIds) ->when(!empty($kategoriIds), function ($q) use ($kategoriIds) { $q->whereIn('master_kategori_directory_id', $kategoriIds); @@ -184,10 +181,14 @@ class DashboardController extends Controller $data = $query->orderBy('entry_at', 'desc') ->paginate($perPage); + $items = collect($data->items())->map(function($item){ + $item->nama_kategori = $item->kategori->nama_kategori_directory ?? $item->kategori_hukum ?? null; + return $item; + }); $payload = [ 'status' => true, 'message' => 'Berhasil mendapatkan data', - 'data' => $data->items(), + 'data' => $items, 'pagination' => [ 'current_page' => $data->currentPage(), 'next_page' => $data->hasMorePages() ? $data->currentPage() + 1 : null, @@ -933,10 +934,7 @@ class DashboardController extends Controller $kategoriIds = is_array($kategori) ? array_values(array_filter($kategori)) : array_values(array_filter(explode(',', (string) $kategori))); - $query = FileDirectory::where('statusenabled', true)->where('status_action', 'approved') - ->where(function($q){ - $q->where('is_akre', false)->orWhereNull('is_akre'); - }) + $query = FileDirectory::with('kategori')->where('statusenabled', true)->where('status_action', 'approved') ->when(!empty($unitIds), function ($q) use ($unitIds) { $q->whereIn('id_unit_kerja', $unitIds); }) @@ -956,14 +954,18 @@ class DashboardController extends Controller } - $data = $query->orderBy('entry_at', 'desc') ->paginate($perPage); + $items = collect($data->items())->map(function($item){ + $item->nama_kategori = $item->kategori->nama_kategori_directory ?? $item->kategori_hukum ?? null; + return $item; + }); + $payload = [ 'status' => true, 'message' => 'Berhasil mendapatkan data', - 'data' => $data->items(), + 'data' => $items, 'pagination' => [ 'current_page' => $data->currentPage(), 'next_page' => $data->hasMorePages() ? $data->currentPage() + 1 : null, @@ -1147,7 +1149,7 @@ class DashboardController extends Controller 'status_action' => $isAtasan ? 'approved' : null ], 200); } catch (\Throwable $th) { - dd($th); + // dd($th); DB::connection('dbDirectory')->rollback(); return response()->json([ 'status' => false, @@ -2275,7 +2277,7 @@ class DashboardController extends Controller { $keyword = $request->query('keyword'); $perPage = (int) $request->query('per_page', 10); - $query = FileDirectory::query() + $query = FileDirectory::withOut('unit') ->where('statusenabled', true) ->where('status_action', 'approved') ->where('is_akre', true); diff --git a/app/Models/FileDirectory.php b/app/Models/FileDirectory.php index e27e13b..acec37c 100644 --- a/app/Models/FileDirectory.php +++ b/app/Models/FileDirectory.php @@ -4,6 +4,8 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; use App\Models\LogActivity; +use App\Models\UnitKerja; +use App\Models\MasterKategori; class FileDirectory extends Model { @@ -12,6 +14,7 @@ class FileDirectory extends Model public $timestamps = false; protected $primaryKey = 'file_directory_id'; protected $guarded = ['file_directory_id']; + protected $with = ['unit']; public function viewLogs() { @@ -26,4 +29,16 @@ class FileDirectory extends Model ->where('action_type', 'Download Dokumen'); } + public function kategori(){ + return $this->belongsTo(MasterKategori::class, 'master_kategori_directory_id', 'master_kategori_directory_id'); + } + + public function unit(){ + // Each file belongs to exactly one unit; skip the subUnitKerja eager load from UnitKerja. + return $this->belongsTo(UnitKerja::class, 'id_unit_kerja', 'id')->select('id', 'name') + ->without('subUnitKerja'); + } + + + } diff --git a/public/js/pengajuanFile/index.js b/public/js/pengajuanFile/index.js index de47c20..acabf70 100644 --- a/public/js/pengajuanFile/index.js +++ b/public/js/pengajuanFile/index.js @@ -933,19 +933,18 @@ document.addEventListener('DOMContentLoaded', () => {
Isi form ini bila dokumen yang diunggah merupakan dokumen akreditasi.
diff --git a/resources/views/dataAkreditasi/index.blade.php b/resources/views/dataAkreditasi/index.blade.php index 2ce228d..7474ec3 100644 --- a/resources/views/dataAkreditasi/index.blade.php +++ b/resources/views/dataAkreditasi/index.blade.php @@ -781,18 +781,18 @@
Isi form ini bila dokumen yang diunggah merupakan dokumen akreditasi.
diff --git a/resources/views/dataUmum/index.blade.php b/resources/views/dataUmum/index.blade.php index 9ec2c3a..35fd4eb 100644 --- a/resources/views/dataUmum/index.blade.php +++ b/resources/views/dataUmum/index.blade.php @@ -42,6 +42,21 @@ .table-fixed-height { min-height: 70vh; } + +/* --- Warna kategori baris --- */ +.row-shade { + background-color: var(--row-bg, transparent) !important; + transition: background-color 0.2s ease; +} +.legend-dot { + width: 14px; + height: 14px; + border-radius: 4px; + display: inline-block; + border: 1px solid rgba(0,0,0,0.08); + vertical-align: middle; + margin-right: 6px; +} @section('body_main') @@ -146,6 +161,7 @@ +
Tampilkan @@ -186,21 +202,19 @@ const tbody = document.getElementById('tableDataUmum'); const paginationEl = document.getElementById('paginationControls'); const summaryEl = document.getElementById('tableSummary'); + const legendEl = document.getElementById('tableLegend'); const pageSizeSelect = document.getElementById('tablePageSize'); const unitSelect = document.getElementById('tableUnit'); const kategoriSelect = document.getElementById('tableKategori'); const kategoriHeaderMenu = document.getElementById('tableKategoriHeaderMenu'); - const kategoriTypeOptions = [ - { id: 'akreditasi', label: 'Kategori Akreditasi' }, - { id: 'hukum', label: 'Kategori Hukum' }, - { id: 'lainnya', label: 'Kategori Lainnya' } - ]; const searchInput = document.getElementById('tableSearch'); const searchBtn = document.getElementById('btnTableSearch'); const downloadBtn = document.getElementById('btnDownloadMultiple'); const selectedCountEl = document.getElementById('selectedCount'); const checkAllEl = document.getElementById('checkAllRows'); const selectedIds = new Set(); + const colorCache = {}; + const colorPalette = ['#e8f4ff', '#fff6e5', '#e9f7ef', '#f3e8ff', '#ffe6ea', '#e6f5f3']; document.addEventListener('change', function(e){ if(!e.target.classList.contains('toggle-expired')) return; @@ -266,9 +280,11 @@ }); $('#tableKategori').on('change', function () { const val = $(this).val() || ''; + console.log(val); + tableState.kategoriType = val ? [val] : []; tableState.page = 1; - renderTable(); + fetchData(); }); } } @@ -283,7 +299,8 @@ const single = selected.length === 1 ? selected[0] : ''; $('#tableKategori').val(single).trigger('change'); } - renderTable(); + tableState.page = 1; + fetchData(); }); } @@ -302,6 +319,47 @@ return val === '1' || val === 'true' || val === 'iya' || val === 'yes'; } + function resolveKategoriFlag(item){ + if(Number(item.is_akre) === 1 || item.is_akre === true || String(item.is_akre).toLowerCase() === 'true'){ + return { key: 'akre', label: 'Kategori Akreditasi' }; + } + if(item.kategori_hukum){ + return { key: 'hukum', label: 'Kategori Hukum' }; + } + const label = (item.nama_kategori || item.nama_kategori_directory || item.kategori || '').trim() || 'Kategori Lainnya'; + const key = String(item.master_kategori_directory_id || label || 'lainnya'); + return { key, label }; + } + + function pickColor(key, label){ + if(colorCache[key]) return colorCache[key]; + const index = Object.keys(colorCache).length % colorPalette.length; + colorCache[key] = colorPalette[index]; + return colorCache[key]; + } + + function renderLegend(items){ + if(!legendEl) return; + const map = new Map(); + (items || []).forEach(item => { + const flag = resolveKategoriFlag(item); + const color = pickColor(flag.key, flag.label); + if(!map.has(flag.key)){ + map.set(flag.key, { label: flag.label, color }); + } + }); + if(map.size === 0){ + legendEl.textContent = ''; + return; + } + legendEl.innerHTML = Array.from(map.values()).map(entry => ` + + + ${entry.label} + + `).join(''); + } + function getExpiryStatus(dateStr){ if (!dateStr) return false; const d = new Date(dateStr); @@ -335,12 +393,15 @@ statusClass = 'bg-secondary'; } const checked = selectedIds.has(String(item.file_directory_id)) ? 'checked' : ''; - const rowClass = expiryStatus === 'expired' ? 'table-danger' : (expiryStatus === 'soon' ? 'table-warning' : ''); + const kategoriFlag = resolveKategoriFlag(item); + + const rowColor = pickColor(kategoriFlag.key, kategoriFlag.label); + const rowClass = expiryStatus === 'expired' ? 'table-danger' : (expiryStatus === 'soon' ? 'table-warning' : 'row-shade'); const expiryBadge = expiryStatus === 'expired' ? `Expired` : (expiryStatus === 'soon' ? `Akan Expired` : ''); return ` - + - ${kategoriName} + ${item.nama_kategori || '-'} - ${unitName} + ${item.unit?.name || '-'} ${formatTanggal(item.entry_at)} @@ -485,6 +546,7 @@ renderPagination(tableState.lastPage || 1); syncCheckAllState(); updateSelectedCount(); + renderLegend(pageData); } function applyTableSearch(){ @@ -497,22 +559,36 @@ fetchData(); } + function getKategoriLabel(item){ + const parts = String(item?.file || '').split('/'); + return (parts[2] || item?.nama_kategori_directory || item?.kategori || '').trim(); + } + + function getKategoriId(item){ + const label = getKategoriLabel(item); + return String(item?.master_kategori_directory_id || label); + } + + function getKategoriOptionsFromData(){ + const seen = new Map(); + (tableState.data || []).forEach(item => { + const label = getKategoriLabel(item); + if(!label) return; + const id = getKategoriId(item); + if(!seen.has(id)){ + seen.set(id, { id, label }); + } + }); + return Array.from(seen.values()).sort((a,b) => a.label.localeCompare(b.label)); + } + function filterByKategoriType(items){ - const types = tableState.kategoriType || []; + const types = (tableState.kategoriType || []).map(v => String(v)); if (!types.length) return items; return items.filter(item => { - return types.some(type => { - if (type === 'akreditasi') { - return item.is_akre === true || item.is_akre === 1 || item.is_akre === '1'; - } - if (type === 'hukum') { - return !!item.kategori_hukum; - } - if (type === 'lainnya') { - return !!item.master_kategori_directory_id; - } - return false; - }); + const catId = getKategoriId(item); + const catLabel = getKategoriLabel(item); + return types.includes(catId) || types.includes(catLabel); }); } @@ -520,8 +596,13 @@ if (!kategoriHeaderMenu) return; const list = kategoriHeaderMenu.querySelector('.kategori-header-list'); if (!list) return; + const options = getKategoriOptionsFromData(); const selected = (tableState.kategoriType || []).map(v => String(v)); - list.innerHTML = kategoriTypeOptions.map(opt => { + if(options.length === 0){ + list.innerHTML = '
Tidak ada kategori
'; + return; + } + list.innerHTML = options.map(opt => { const checked = selected.includes(opt.id) ? 'checked' : ''; return `