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 `