diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php
index 887c577..3ee9d16 100644
--- a/app/Http/Controllers/DashboardController.php
+++ b/app/Http/Controllers/DashboardController.php
@@ -1991,7 +1991,7 @@ class DashboardController extends Controller
}
$paginated = $query->paginate($perPage);
- $data = $paginated->getCollection()->map(function($item) use($objectpegawaifk){
+ $data = $paginated->getCollection()->map(function($item) use($objectpegawaifk, $pegawaiId){
$dataSlice = array_values(array_filter(explode('/', $item->file)));
return [
'file_directory_id' => $item->file_directory_id,
@@ -3369,6 +3369,9 @@ class DashboardController extends Controller
'no_dokumen',
'file',
'entry_at',
+ 'tanggal_terbit',
+ 'permission_file',
+ 'pegawai_id_entry',
'id_unit_kerja',
'is_akre',
])
diff --git a/public/js/pengajuanFile/index.js b/public/js/pengajuanFile/index.js
index aad39a9..99ed885 100644
--- a/public/js/pengajuanFile/index.js
+++ b/public/js/pengajuanFile/index.js
@@ -19,6 +19,9 @@ document.addEventListener('DOMContentLoaded', () => {
const selectedCountEl = document.getElementById('selectedCount');
const bulkActionsEl = document.getElementById('pengajuanBulkActions');
const deleteDataEl = document.getElementById('deleteData');
+ const pendingPersetujuanTabBadge = document.getElementById('pendingPersetujuanTabBadge');
+ const pendingPersetujuanNotice = document.getElementById('pendingPersetujuanNotice');
+ const pendingPersetujuanNoticeCount = document.getElementById('pendingPersetujuanNoticeCount');
const formCreate = document.getElementById('formFile');
const modalCreate = document.getElementById('modalCreateFile');
let colCount = 1;
@@ -29,6 +32,7 @@ document.addEventListener('DOMContentLoaded', () => {
const selectedIds = new Set();
const isKomiteMutu = !!window.isKomiteMutu;
const isTurt = !!window.isTurt;
+ const isAtasan = !!window.isAtasan;
let editFromQueryId = new URLSearchParams(window.location.search).get('edit');
if (pageSizeSelect) {
@@ -493,6 +497,41 @@ document.addEventListener('DOMContentLoaded', () => {
updateSelectionUI();
}
+ function updatePendingPersetujuanIndicators(total){
+ const count = Number(total || 0);
+ if (pendingPersetujuanTabBadge) {
+ pendingPersetujuanTabBadge.textContent = String(count);
+ pendingPersetujuanTabBadge.classList.toggle('d-none', count <= 0);
+ }
+ if (pendingPersetujuanNotice && pendingPersetujuanNoticeCount) {
+ pendingPersetujuanNoticeCount.textContent = String(count);
+ pendingPersetujuanNotice.classList.toggle('d-none', count <= 0);
+ pendingPersetujuanNotice.classList.toggle('d-flex', count > 0);
+ }
+ }
+
+ function fetchPendingPersetujuanCount(){
+ if (!(isKomiteMutu || isTurt || isAtasan)) return;
+
+ const params = new URLSearchParams({
+ page: 1,
+ per_page: 1,
+ keyword: '',
+ start_date: '',
+ end_date: '',
+ mode: 'persetujuan'
+ });
+
+ fetch(`/datatable/pengajuan-file?${params.toString()}`)
+ .then(res => res.json())
+ .then(data => {
+ updatePendingPersetujuanIndicators(data?.pagination?.total || 0);
+ })
+ .catch(() => {
+ updatePendingPersetujuanIndicators(0);
+ });
+ }
+
if (tabsEl) {
tabsEl.addEventListener('click', (e) => {
const btn = e.target.closest('[data-mode]');
@@ -584,6 +623,7 @@ document.addEventListener('DOMContentLoaded', () => {
activeState.lastPage = data?.pagination?.last_page || 1;
activeState.total = data?.pagination?.total || 0;
renderTable();
+ fetchPendingPersetujuanCount();
})
.catch(err => {
console.error(err);
diff --git a/resources/views/dataAkreditasi/index.blade.php b/resources/views/dataAkreditasi/index.blade.php
index cbe0a44..a17468e 100644
--- a/resources/views/dataAkreditasi/index.blade.php
+++ b/resources/views/dataAkreditasi/index.blade.php
@@ -56,6 +56,49 @@
line-height: 1.2;
border-radius: 999px;
}
+
+ #lastUpdatedTable {
+ table-layout: fixed;
+ }
+
+ #lastUpdatedTable td,
+ #lastUpdatedTable th {
+ vertical-align: middle;
+ }
+
+ .file-row-content {
+ display: flex;
+ align-items: flex-start;
+ gap: 8px;
+ min-width: 0;
+ width: 100%;
+ }
+
+ .file-text-wrap {
+ min-width: 0;
+ flex: 1 1 auto;
+ }
+
+ .file-name-trigger {
+ display: block;
+ width: 100%;
+ overflow: hidden;
+ line-height: 1.3;
+ white-space: normal;
+ word-break: break-word;
+ overflow-wrap: anywhere;
+ }
+
+ .file-name-trigger strong {
+ display: block;
+ white-space: normal;
+ word-break: break-word;
+ overflow-wrap: anywhere;
+ }
+
+ .file-meta-path {
+ display: none;
+ }
@section('body_main')
@@ -167,6 +210,7 @@
@include('dataUnit.modal.create')
+ @include('dataUnit.modal.view')
@if(Auth::guard('admin')->check())
@@ -214,6 +258,7 @@
let currentData = [];
let selectedIds = [];
let expandedFolders = new Set();
+ let currentPreviewId = null;
let searchTimer;
const isAdminUser = @json(Auth::guard('admin')->check());
const btn = document.getElementById('btnDownloadMultiple');
@@ -349,6 +394,16 @@
|
-
- ${item.nama_dokumen}
- Path: ${item.file}
+
+
+
+
+ Path: ${item.file}
+
|
${typeDok} |
@@ -495,18 +561,40 @@
value="${item.file_directory_id}" ${isChecked} onchange="handleRowCheck(this)">
-
-
-
+
|
${lines}
-
-
- ${item.nama_dokumen}
- ${fileName}
+
+
+
+
+
+
|
@@ -651,6 +739,18 @@
}
document.addEventListener('click', function(e){
+ const previewTrigger = e.target.closest('.btn-preview-file');
+ if (previewTrigger) {
+ openDocumentPreview({
+ id: previewTrigger.getAttribute('data-id'),
+ name: previewTrigger.getAttribute('data-name'),
+ noDokumen: previewTrigger.getAttribute('data-no'),
+ tanggalTerbit: previewTrigger.getAttribute('data-date'),
+ permissionFile: previewTrigger.getAttribute('data-permission')
+ });
+ return;
+ }
+
const toggle = e.target.closest('.folder-toggle');
if (!toggle) return;
const folderPath = toggle.getAttribute('data-folder');
@@ -671,11 +771,84 @@
return `${d.getFullYear()}-${pad(d.getMonth()+1)}-${pad(d.getDate())} `
+ `${pad(d.getHours())}:${pad(d.getMinutes())}`;
}
+
+ function formatPreviewDate(value) {
+ if (!value) return '-';
+ const d = new Date(value);
+ if (isNaN(d)) return value;
+ const pad = n => String(n).padStart(2, '0');
+ return `${pad(d.getDate())}/${pad(d.getMonth()+1)}/${d.getFullYear()}`;
+ }
+
+ function isPublic(permissionVal){
+ return permissionVal === true || permissionVal === 'true' || permissionVal === 1 || permissionVal === '1';
+ }
+
+ function escapeHtml(value) {
+ return String(value ?? '')
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"')
+ .replace(/'/g, ''');
+ }
+
+ function escapeAttribute(value) {
+ return escapeHtml(value);
+ }
+
+ function openDocumentPreview({ id, name, noDokumen, tanggalTerbit, permissionFile }) {
+ currentPreviewId = id;
+
+ const titleEl = document.getElementById('confirm_preview_file');
+ if (titleEl) titleEl.textContent = name || '-';
+
+ const noEl = document.getElementById('confirm-upload-dokumen');
+ if (noEl) noEl.textContent = noDokumen || '-';
+
+ const tglEl = document.getElementById('confirm-time-dokumen');
+ if (tglEl) tglEl.textContent = tanggalTerbit || '-';
+
+ const permEl = document.getElementById('confirm-permission');
+ if (permEl) {
+ const publicDoc = isPublic(permissionFile);
+ permEl.textContent = publicDoc ? 'Umum' : 'Internal Unit';
+ permEl.className = 'badge ' + (publicDoc ? 'bg-success' : 'bg-secondary');
+ }
+
+ const downloadBtn = document.getElementById('btn-download');
+ if (downloadBtn) {
+ downloadBtn.setAttribute('href', `/file-download/${id}`);
+ }
+
+ const deleteWrapper = document.getElementById('deleteData');
+ if (deleteWrapper) {
+ deleteWrapper.classList.add('d-none');
+ }
+
+ const previewBox = document.getElementById('file-preview');
+ if (previewBox) {
+ previewBox.innerHTML = `
`;
+ }
+
+ openPreview(id);
+ $("#previewModal").modal('show');
+ }
+
const katDok = @json($katDok);
const formCreate = document.getElementById('formFile');
const modalCreate = document.getElementById('modalCreateFile');
let colCount = 1;
+ document.addEventListener('click', function(e){
+ if(e.target.closest('#btn-view-full')){
+ if (!currentPreviewId) return;
+ window.open(`/full-preview/${currentPreviewId}`, '_blank');
+ }
+ });
+
document.addEventListener('change', function(e){
if(!e.target.classList.contains('toggle-expired')) return;
const targetId = e.target.getAttribute('data-target');
diff --git a/resources/views/dataUmum/index.blade.php b/resources/views/dataUmum/index.blade.php
index c19a141..2e2d397 100644
--- a/resources/views/dataUmum/index.blade.php
+++ b/resources/views/dataUmum/index.blade.php
@@ -408,6 +408,30 @@
return null;
}
+ function escapeHtml(value){
+ return String(value ?? '')
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"')
+ .replace(/'/g, ''');
+ }
+
+ function renderDeleteRecommendation(item){
+ const recommendation = item?.delete_recommendation;
+ if (!recommendation?.visible || !recommendation?.note) return '';
+
+ const actorRole = recommendation.actor_role || 'TURT';
+ const actorName = recommendation.actor_name ? ` (${escapeHtml(recommendation.actor_name)})` : '';
+ const note = escapeHtml(recommendation.note);
+
+ return `
+
+ Dokumen ini direkomendasikan dihapus oleh ${escapeHtml(actorRole)}${actorName}. Catatan: ${note}
+
+ `;
+ }
+
function buildRow(item){
const parts = (item.file || '').split('/');
const fileName = parts.pop() || '-';
@@ -520,6 +544,7 @@
${expiryBadge}
+ ${renderDeleteRecommendation(item)}
diff --git a/resources/views/dataUnit/index.blade.php b/resources/views/dataUnit/index.blade.php
index 196cb25..9952c85 100644
--- a/resources/views/dataUnit/index.blade.php
+++ b/resources/views/dataUnit/index.blade.php
@@ -649,6 +649,30 @@
return null;
}
+ function escapeHtml(value){
+ return String(value ?? '')
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/"/g, '"')
+ .replace(/'/g, ''');
+ }
+
+ function renderDeleteRecommendation(item){
+ const recommendation = item?.delete_recommendation;
+ if (!recommendation?.visible || !recommendation?.note) return '';
+
+ const actorRole = recommendation.actor_role || 'TURT';
+ const actorName = recommendation.actor_name ? ` (${escapeHtml(recommendation.actor_name)})` : '';
+ const note = escapeHtml(recommendation.note);
+
+ return `
+
+ Dokumen ini direkomendasikan dihapus oleh ${escapeHtml(actorRole)}${actorName}. Catatan: ${note}
+
+ `;
+ }
+
function buildRow(item){
const parts = (item.file || '').split('/');
const fileName = parts.pop() || '-';
@@ -748,6 +772,7 @@
${akreBadge}${expiryBadge}
+ ${renderDeleteRecommendation(item)}
${item.nama_kategori || '-'}
diff --git a/resources/views/layout/partials/sidenav.blade.php b/resources/views/layout/partials/sidenav.blade.php
index 7f2a4a3..018f4dc 100644
--- a/resources/views/layout/partials/sidenav.blade.php
+++ b/resources/views/layout/partials/sidenav.blade.php
@@ -66,7 +66,7 @@
})->exists();
$isRoleApprover = in_array(51, $userUnitIds, true) || in_array(22, $userUnitIds, true);
@endphp
- @if($isAtasan || $isRoleApprover)
+ @if($isAtasan)
@if(!Auth::guard('admin')->check())
@endif
@@ -204,10 +208,11 @@
|